@securitychecks/cli 0.1.1 → 0.2.2

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/errors.ts","../src/lib/schema.ts","../src/lib/calibration.ts","../src/patterns/bundled.json","../src/lib/patterns.ts","../src/lib/test-patterns.ts","../src/baseline/schema.ts","../src/findings/finding-id.ts","../src/baseline/storage.ts","../src/baseline/matcher.ts","../src/lib/sarif.ts","../src/lib/correlation.ts","../src/lib/correlation-telemetry.ts","../src/lib/telemetry.ts","../src/lib/cloud-config.ts","../src/lib/license.ts","../src/lib/watcher.ts","../src/lib/ci-detect.ts","../src/lib/cloud-eval.ts","../src/lib/project-slug.ts","../src/lib/staff.ts","../src/commands/run.ts","../src/commands/explain.ts","../src/commands/init.ts","../src/audit.ts","../src/commands/baseline.ts","../src/commands/waiver.ts","../src/lib/cloud-api.ts","../src/commands/login.ts","../src/commands/config.ts","../src/commands/sync.ts","../src/commands/hooks.ts","../src/lib/feedback.ts","../src/commands/feedback.ts","../src/commands/list-invariants.ts","../src/commands/generate-test.ts","../src/lib/logger.ts","../src/index.ts"],"names":["error","version","CLI_VERSION","DEFAULT_CACHE_PATH","join","existsSync","dirname","loadCache","readFile","saveCache","mkdir","writeFile","result","findingId","step","randomUUID","DEFAULT_ENDPOINT","input","getProject","readFileSync","resolve","normalizeFrameworkList","DEFAULT_PATTERN_CONFIG","targetPath","getInvariantById","pc","severityColor","indent","resolveTargetPath","toArtifact","collect","output","apiUrl","client","PRE_COMMIT_HOOK","chmod","success","ALL_INVARIANTS"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Deterministic Error Codes for SecurityChecks CLI\n *\n * Format: SC_<CATEGORY>_<NUMBER>\n *\n * Categories:\n * - CONFIG: Configuration errors\n * - PARSE: Parsing/syntax errors\n * - CHECK: Checker execution errors\n * - IO: File system / network errors\n * - CLI: Command line argument errors\n */\n\nexport const ErrorCodes = {\n // CONFIG errors (001-099)\n CONFIG_NOT_FOUND: 'SC_CONFIG_001',\n CONFIG_INVALID: 'SC_CONFIG_002',\n CONFIG_SCHEMA_ERROR: 'SC_CONFIG_003',\n\n // PARSE errors (100-199)\n PARSE_TYPESCRIPT_ERROR: 'SC_PARSE_101',\n PARSE_FILE_NOT_FOUND: 'SC_PARSE_102',\n PARSE_UNSUPPORTED_SYNTAX: 'SC_PARSE_103',\n\n // CHECK errors (200-299)\n CHECK_EXECUTION_ERROR: 'SC_CHECK_201',\n CHECK_TIMEOUT: 'SC_CHECK_202',\n CHECK_INVARIANT_NOT_FOUND: 'SC_CHECK_203',\n\n // IO errors (300-399)\n IO_READ_ERROR: 'SC_IO_301',\n IO_WRITE_ERROR: 'SC_IO_302',\n IO_PERMISSION_DENIED: 'SC_IO_303',\n IO_PATH_NOT_FOUND: 'SC_IO_304',\n\n // CLI errors (400-499)\n CLI_INVALID_ARGUMENT: 'SC_CLI_401',\n CLI_MISSING_ARGUMENT: 'SC_CLI_402',\n CLI_UNKNOWN_COMMAND: 'SC_CLI_403',\n\n // ARTIFACT errors (500-599)\n ARTIFACT_NOT_FOUND: 'SC_ARTIFACT_501',\n ARTIFACT_INVALID: 'SC_ARTIFACT_502',\n ARTIFACT_VERSION_MISMATCH: 'SC_ARTIFACT_503',\n\n // CLOUD errors (600-699)\n CLOUD_AUTH_FAILED: 'SC_CLOUD_601',\n CLOUD_PERMISSION_DENIED: 'SC_CLOUD_602',\n CLOUD_NOT_FOUND: 'SC_CLOUD_603',\n CLOUD_RATE_LIMITED: 'SC_CLOUD_604',\n CLOUD_API_ERROR: 'SC_CLOUD_605',\n CLOUD_NETWORK_ERROR: 'SC_CLOUD_606',\n CLOUD_INVALID_API_KEY: 'SC_CLOUD_607',\n AUTH_REQUIRED: 'SC_CLOUD_608',\n OFFLINE_NOT_SUPPORTED: 'SC_CLOUD_609',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/**\n * User-friendly error messages for each error code\n */\nexport const ErrorMessages: Record<ErrorCode, string> = {\n [ErrorCodes.CONFIG_NOT_FOUND]: 'Configuration file not found',\n [ErrorCodes.CONFIG_INVALID]: 'Configuration file is invalid',\n [ErrorCodes.CONFIG_SCHEMA_ERROR]: 'Configuration does not match expected schema',\n\n [ErrorCodes.PARSE_TYPESCRIPT_ERROR]: 'Failed to parse TypeScript file',\n [ErrorCodes.PARSE_FILE_NOT_FOUND]: 'Source file not found',\n [ErrorCodes.PARSE_UNSUPPORTED_SYNTAX]: 'Unsupported syntax encountered',\n\n [ErrorCodes.CHECK_EXECUTION_ERROR]: 'Error executing invariant check',\n [ErrorCodes.CHECK_TIMEOUT]: 'Invariant check timed out',\n [ErrorCodes.CHECK_INVARIANT_NOT_FOUND]: 'Invariant not found',\n\n [ErrorCodes.IO_READ_ERROR]: 'Failed to read file',\n [ErrorCodes.IO_WRITE_ERROR]: 'Failed to write file',\n [ErrorCodes.IO_PERMISSION_DENIED]: 'Permission denied',\n [ErrorCodes.IO_PATH_NOT_FOUND]: 'Path not found',\n\n [ErrorCodes.CLI_INVALID_ARGUMENT]: 'Invalid argument provided',\n [ErrorCodes.CLI_MISSING_ARGUMENT]: 'Required argument missing',\n [ErrorCodes.CLI_UNKNOWN_COMMAND]: 'Unknown command',\n\n [ErrorCodes.ARTIFACT_NOT_FOUND]: 'Artifact file not found',\n [ErrorCodes.ARTIFACT_INVALID]: 'Invalid artifact format',\n [ErrorCodes.ARTIFACT_VERSION_MISMATCH]: 'Artifact version not supported',\n\n [ErrorCodes.CLOUD_AUTH_FAILED]: 'Authentication failed',\n [ErrorCodes.CLOUD_PERMISSION_DENIED]: 'Permission denied',\n [ErrorCodes.CLOUD_NOT_FOUND]: 'Resource not found',\n [ErrorCodes.CLOUD_RATE_LIMITED]: 'Rate limit exceeded',\n [ErrorCodes.CLOUD_API_ERROR]: 'Cloud API error',\n [ErrorCodes.CLOUD_NETWORK_ERROR]: 'Network error',\n [ErrorCodes.CLOUD_INVALID_API_KEY]: 'Invalid API key format',\n [ErrorCodes.AUTH_REQUIRED]: 'API key required for evaluation',\n [ErrorCodes.OFFLINE_NOT_SUPPORTED]: 'Offline mode is not supported',\n};\n\n/**\n * Remediation guidance for each error code\n * Helps users understand what to do when they encounter an error.\n */\nexport const ErrorRemediation: Record<ErrorCode, string> = {\n // CONFIG errors\n [ErrorCodes.CONFIG_NOT_FOUND]: `\nCreate a configuration file in your project root:\n\n scheck init\n\nOr create securitychecks.config.ts manually:\n\n export default {\n include: ['src/**/*.ts'],\n exclude: ['node_modules/**'],\n };\n`.trim(),\n\n [ErrorCodes.CONFIG_INVALID]: `\nCheck your securitychecks.config.ts for syntax errors.\n\nCommon issues:\n- Missing export default\n- Invalid JSON in securitychecks.json\n- Typo in configuration keys\n\nRun with --verbose for more details.\n`.trim(),\n\n [ErrorCodes.CONFIG_SCHEMA_ERROR]: `\nYour configuration has invalid options. Check these common issues:\n\n- 'include' and 'exclude' must be arrays of glob patterns\n- 'testPatterns' must be an array of test file patterns\n- 'servicePatterns' must be an array of service file patterns\n\nSee: https://securitychecks.ai/docs/configuration\n`.trim(),\n\n // PARSE errors\n [ErrorCodes.PARSE_TYPESCRIPT_ERROR]: `\nA TypeScript file failed to parse. This usually means:\n\n1. The file has syntax errors - run tsc to check\n2. The file uses unsupported TypeScript features\n3. There are missing dependencies\n\nTry:\n npx tsc --noEmit\n\nIf the error persists, exclude the problematic file:\n exclude: ['path/to/problematic-file.ts']\n`.trim(),\n\n [ErrorCodes.PARSE_FILE_NOT_FOUND]: `\nThe specified source file doesn't exist. Check:\n\n1. The file path is correct\n2. The file hasn't been moved or deleted\n3. Your include/exclude patterns are correct\n\nRun: ls <path> to verify the file exists.\n`.trim(),\n\n [ErrorCodes.PARSE_UNSUPPORTED_SYNTAX]: `\nThe file contains syntax that can't be parsed. This may happen with:\n\n- Very new TypeScript/JavaScript features\n- Non-standard syntax extensions\n- Malformed source code\n\nTry excluding the file or updating the parser.\n`.trim(),\n\n // CHECK errors\n [ErrorCodes.CHECK_EXECUTION_ERROR]: `\nAn invariant check failed to run. This is usually a bug in scheck.\n\nPlease report this issue with:\n1. The full error message (--verbose)\n2. A minimal reproduction\n3. Your Node.js and @securitychecks/cli versions\n\nReport at: https://github.com/securitychecks/securitychecks.ai/issues\n`.trim(),\n\n [ErrorCodes.CHECK_TIMEOUT]: `\nAn invariant check took too long. This can happen with:\n\n1. Very large codebases\n2. Complex file structures\n3. Slow file system access\n\nTry:\n- Narrowing include patterns to scan fewer files\n- Excluding large generated files\n- Running with --only to check specific invariants\n`.trim(),\n\n [ErrorCodes.CHECK_INVARIANT_NOT_FOUND]: `\nThe specified invariant ID doesn't exist.\n\nList available invariants:\n scheck explain --list\n\nCommon invariant IDs:\n- AUTHZ.SERVICE_LAYER.ENFORCED\n- WEBHOOK.IDEMPOTENT\n- TRANSACTION.POST_COMMIT.SIDE_EFFECTS\n`.trim(),\n\n // IO errors\n [ErrorCodes.IO_READ_ERROR]: `\nFailed to read a file. Check:\n\n1. The file exists and is readable\n2. You have permission to read the file\n3. The file is not locked by another process\n\nTry: cat <file> to verify readability.\n`.trim(),\n\n [ErrorCodes.IO_WRITE_ERROR]: `\nFailed to write a file. Check:\n\n1. The directory exists\n2. You have write permission\n3. There's enough disk space\n4. The file is not locked\n\nTry: touch <file> to verify writability.\n`.trim(),\n\n [ErrorCodes.IO_PERMISSION_DENIED]: `\nPermission denied accessing a file or directory.\n\nOn Unix/Mac:\n chmod +r <file> # Make readable\n chmod +w <file> # Make writable\n\nOn Windows: Check file properties > Security tab.\n`.trim(),\n\n [ErrorCodes.IO_PATH_NOT_FOUND]: `\nThe specified path doesn't exist.\n\nCheck:\n1. You're in the correct directory\n2. The path is spelled correctly\n3. The directory structure is correct\n\nRun: pwd && ls to verify your location.\n`.trim(),\n\n // CLI errors\n [ErrorCodes.CLI_INVALID_ARGUMENT]: `\nInvalid command-line argument.\n\nRun: scheck --help\n\nCommon commands:\n scheck run # Run all checks\n scheck run --ci # CI mode (fails on P0/P1)\n scheck explain <id> # Explain an invariant\n scheck init # Initialize configuration\n`.trim(),\n\n [ErrorCodes.CLI_MISSING_ARGUMENT]: `\nA required argument is missing.\n\nCheck the command syntax:\n scheck --help\n scheck <command> --help\n`.trim(),\n\n [ErrorCodes.CLI_UNKNOWN_COMMAND]: `\nUnknown command. Available commands:\n\n run Run invariant checks\n init Initialize configuration\n explain Explain an invariant\n baseline Manage baseline\n waive Waive a finding\n\nRun: scheck --help\n`.trim(),\n\n // ARTIFACT errors\n [ErrorCodes.ARTIFACT_NOT_FOUND]: `\nArtifact file not found.\n\nThe artifact file stores collected code facts. Options:\n\n1. Let scheck collect automatically (default):\n scheck run\n\n2. Collect manually first:\n npx scc collect -o .securitychecks/artifacts.json\n scheck run --artifact .securitychecks/artifacts.json\n\n3. Check if file was deleted:\n ls .securitychecks/\n`.trim(),\n\n [ErrorCodes.ARTIFACT_INVALID]: `\nThe artifact file is malformed or corrupt.\n\nCommon issues:\n- Incomplete JSON (process was killed during write)\n- Modified manually with syntax errors\n- Wrong file format\n\nFix:\n1. Delete the corrupt artifact:\n rm .securitychecks/artifacts.json\n\n2. Re-collect:\n scheck run\n (or: npx scc collect -o .securitychecks/artifacts.json)\n`.trim(),\n\n [ErrorCodes.ARTIFACT_VERSION_MISMATCH]: `\nThe artifact was created by an incompatible version.\n\nThis happens when:\n- Artifact was created by an older/newer scheck version\n- Artifact schema has changed\n\nFix:\n1. Delete the old artifact:\n rm .securitychecks/artifacts.json\n\n2. Re-collect with current version:\n scheck run\n\nYour current version: scheck --version\n`.trim(),\n\n // CLOUD errors\n [ErrorCodes.CLOUD_AUTH_FAILED]: `\nAuthentication failed. Your API key may be invalid or expired.\n\nFix:\n1. Generate a new API key at https://securitychecks.ai/dashboard/settings/api-keys\n2. Log in again:\n scheck login\n\nEnvironment variable:\n export SECURITYCHECKS_API_KEY=sc_live_...\n`.trim(),\n\n [ErrorCodes.CLOUD_PERMISSION_DENIED]: `\nYou don't have permission for this action.\n\nCheck:\n1. You have access to the project/organization\n2. Your API key has the required scopes\n3. Your subscription is active\n\nManage at: https://securitychecks.ai/dashboard\n`.trim(),\n\n [ErrorCodes.CLOUD_NOT_FOUND]: `\nThe requested resource was not found.\n\nCheck:\n1. The project slug is correct\n2. The project exists and you have access\n3. The resource ID is valid\n\nList your projects:\n scheck config --show\n`.trim(),\n\n [ErrorCodes.CLOUD_RATE_LIMITED]: `\nYou've hit the rate limit. Please try again later.\n\nOptions:\n1. Wait a few minutes and retry\n2. Upgrade your plan for higher limits\n\nPlan limits: https://securitychecks.ai/pricing\n`.trim(),\n\n [ErrorCodes.CLOUD_API_ERROR]: `\nThe SecurityChecks API returned an error.\n\nThis could be:\n1. A temporary service issue - try again shortly\n2. An invalid request - check your parameters\n\nStatus: https://status.securitychecks.ai\nHelp: https://securitychecks.ai/docs/troubleshooting\n`.trim(),\n\n [ErrorCodes.CLOUD_NETWORK_ERROR]: `\nCould not connect to SecurityChecks API.\n\nCheck:\n1. Your internet connection\n2. Firewall/proxy settings\n3. API endpoint accessibility\n\nDefault API: https://api.securitychecks.ai\n`.trim(),\n\n [ErrorCodes.CLOUD_INVALID_API_KEY]: `\nThe API key format is invalid.\n\nAPI keys should start with:\n- sc_live_ for production\n- sc_test_ for testing\n\nGet a key at: https://securitychecks.ai/dashboard/settings/api-keys\n`.trim(),\n\n [ErrorCodes.AUTH_REQUIRED]: `\nAn API key is required to run security checks.\n\nSecurityChecks uses cloud evaluation to protect proprietary patterns.\nYour source code never leaves your machine - only structural facts are sent.\n\nSetup:\n1. Get your API key at https://securitychecks.ai/dashboard/settings/api-keys\n2. Set environment variable:\n export SECURITYCHECKS_API_KEY=sc_live_...\n\nOr add to securitychecks.config.yaml:\n calibration:\n apiKey: sc_live_...\n`.trim(),\n\n [ErrorCodes.OFFLINE_NOT_SUPPORTED]: `\nOffline mode is not supported.\n\nSecurityChecks requires cloud evaluation to protect proprietary patterns.\nYour source code never leaves your machine - only structural facts are sent.\n\nOptions:\n1. Remove --offline flag and ensure network connectivity\n2. For air-gapped environments, contact sales for an enterprise on-premise license:\n https://securitychecks.ai/enterprise\n`.trim(),\n};\n\n/**\n * Structured CLI Error with deterministic error code\n */\nexport class CLIError extends Error {\n public readonly code: ErrorCode;\n public readonly details?: unknown;\n public override readonly cause?: Error;\n\n constructor(code: ErrorCode, message?: string, options?: { details?: unknown; cause?: Error }) {\n const baseMessage = message ?? ErrorMessages[code];\n super(baseMessage, { cause: options?.cause });\n\n this.name = 'CLIError';\n this.code = code;\n this.details = options?.details;\n this.cause = options?.cause;\n\n // Maintains proper stack trace for where error was thrown\n Error.captureStackTrace?.(this, CLIError);\n }\n\n /**\n * Get remediation guidance for this error\n */\n getRemediation(): string {\n return ErrorRemediation[this.code];\n }\n\n /**\n * Format error for user display\n */\n toUserString(verbose = false): string {\n const parts: string[] = [`[${this.code}] ${this.message}`];\n\n if (verbose && this.details) {\n parts.push(`\\nDetails: ${JSON.stringify(this.details, null, 2)}`);\n }\n\n if (verbose && this.cause) {\n parts.push(`\\nCaused by: ${this.cause.message}`);\n if (this.cause.stack) {\n parts.push(`\\n${this.cause.stack}`);\n }\n }\n\n return parts.join('');\n }\n\n /**\n * Format error with remediation for user display\n */\n toUserStringWithRemediation(): string {\n const parts: string[] = [this.toUserString()];\n const remediation = this.getRemediation();\n\n if (remediation) {\n parts.push('\\n\\nHow to fix:\\n');\n // Indent each line of remediation\n const indented = remediation\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n parts.push(indented);\n }\n\n return parts.join('');\n }\n\n /**\n * Format error for JSON output\n */\n toJSON(): Record<string, unknown> {\n return {\n code: this.code,\n message: this.message,\n remediation: this.getRemediation(),\n details: this.details,\n cause: this.cause\n ? {\n message: this.cause.message,\n stack: this.cause.stack,\n }\n : undefined,\n };\n }\n}\n\n/**\n * Check if an error is a CLIError\n */\nexport function isCLIError(error: unknown): error is CLIError {\n return error instanceof CLIError;\n}\n\n/**\n * Wrap an unknown error in a CLIError\n */\nexport function wrapError(error: unknown, code: ErrorCode, message?: string): CLIError {\n if (error instanceof CLIError) {\n return error;\n }\n\n const cause = error instanceof Error ? error : new Error(String(error));\n return new CLIError(code, message, { cause });\n}\n","/**\n * Schema Version Compatibility\n *\n * Ensures CLI can consume artifacts from compatible collector versions.\n *\n * The schema version follows semver:\n * - MAJOR: Breaking changes (fields removed, types changed)\n * - MINOR: Additive changes (new optional fields)\n * - PATCH: Bug fixes, clarifications\n *\n * CLI declares a supported range, collector emits current version.\n */\n\nimport { ARTIFACT_SCHEMA_VERSION } from '@securitychecks/collector';\n\n/**\n * The schema version range this CLI version supports.\n *\n * Format: \"^MAJOR.MINOR.x\" - compatible with any version that has:\n * - Same MAJOR version (no breaking changes)\n * - Same or higher MINOR version (may have new optional fields)\n *\n * When updating:\n * - Bump MINOR when CLI starts using new optional fields\n * - Bump MAJOR when CLI requires breaking schema changes\n */\nexport const SUPPORTED_SCHEMA_RANGE = {\n // Minimum version we can consume\n minMajor: 1,\n minMinor: 0,\n // Maximum major version we understand (breaking changes)\n maxMajor: 1,\n};\n\nexport interface SchemaValidationResult {\n valid: boolean;\n artifactVersion: string;\n currentVersion: string;\n error?: string;\n remediation?: string;\n}\n\n/**\n * Parse a semver string into components\n */\nfunction parseSemver(version: string): { major: number; minor: number; patch: number } | null {\n const match = version.match(/^(\\d+)\\.(\\d+)\\.(\\d+)/);\n if (!match || !match[1] || !match[2] || !match[3]) return null;\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n };\n}\n\n/**\n * Validate that an artifact's schema version is compatible with this CLI.\n *\n * Compatibility rules:\n * - Artifact MAJOR must equal CLI's supported MAJOR (breaking changes)\n * - Artifact MINOR must be >= CLI's minMinor (additive features)\n * - Pre-1.0.0 artifacts (missing schemaVersion) are assumed \"1.0.0\"\n */\nexport function validateSchemaVersion(artifactSchemaVersion?: string): SchemaValidationResult {\n const currentVersion = ARTIFACT_SCHEMA_VERSION;\n\n // Handle missing schemaVersion (pre-versioning artifacts)\n const effectiveVersion = artifactSchemaVersion ?? '1.0.0';\n\n const parsed = parseSemver(effectiveVersion);\n if (!parsed) {\n return {\n valid: false,\n artifactVersion: effectiveVersion,\n currentVersion,\n error: `Invalid schema version format: \"${effectiveVersion}\" (expected semver like \"1.0.0\")`,\n remediation: 'Re-collect artifacts with: npx scc collect -o .securitychecks/artifacts.json',\n };\n }\n\n const { major, minor } = parsed;\n\n // Check MAJOR version (breaking changes)\n if (major > SUPPORTED_SCHEMA_RANGE.maxMajor) {\n return {\n valid: false,\n artifactVersion: effectiveVersion,\n currentVersion,\n error: `Artifact schema version ${effectiveVersion} is too new (CLI supports up to ${SUPPORTED_SCHEMA_RANGE.maxMajor}.x.x)`,\n remediation: `Upgrade scheck: npm install -g @securitychecks/cli@latest`,\n };\n }\n\n if (major < SUPPORTED_SCHEMA_RANGE.minMajor) {\n return {\n valid: false,\n artifactVersion: effectiveVersion,\n currentVersion,\n error: `Artifact schema version ${effectiveVersion} is too old (CLI requires ${SUPPORTED_SCHEMA_RANGE.minMajor}.x.x+)`,\n remediation: 'Re-collect artifacts: npx scc collect -o .securitychecks/artifacts.json',\n };\n }\n\n // Check MINOR version (additive features - older artifacts may lack fields we use)\n if (minor < SUPPORTED_SCHEMA_RANGE.minMinor) {\n return {\n valid: false,\n artifactVersion: effectiveVersion,\n currentVersion,\n error: `Artifact schema version ${effectiveVersion} is missing required fields (CLI requires ${SUPPORTED_SCHEMA_RANGE.minMajor}.${SUPPORTED_SCHEMA_RANGE.minMinor}.x+)`,\n remediation: 'Re-collect artifacts: npx scc collect -o .securitychecks/artifacts.json',\n };\n }\n\n return {\n valid: true,\n artifactVersion: effectiveVersion,\n currentVersion,\n };\n}\n\n/**\n * Get the current collector schema version\n */\nexport function getCurrentSchemaVersion(): string {\n return ARTIFACT_SCHEMA_VERSION;\n}\n","/**\n * Calibration API Client\n *\n * \"The SaaS advises. The local tool decides.\"\n *\n * This module handles communication with the SecurityChecks Calibration API.\n * The API provides confidence tuning based on aggregate data from many codebases.\n *\n * Key principles:\n * - No source code is ever sent (only patterns and metadata)\n * - API suggestions are advisory only\n * - Local tool retains veto power via minConfidence threshold\n * - Fails safely to local-only mode on network errors\n */\n\nimport type {\n CalibrationConfig,\n CalibrationRequest,\n CalibrationResponse,\n Finding,\n FindingCalibration,\n Severity,\n Artifact,\n} from '@securitychecks/collector';\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { randomUUID } from 'crypto';\n\n// CLI version for telemetry\nconst CLI_VERSION = '0.1.0';\n\n// Default cache path\nconst DEFAULT_CACHE_PATH = '.securitychecks/calibration-cache.json';\n\ninterface CacheEntry {\n response: CalibrationResponse;\n timestamp: number;\n requestHash: string;\n}\n\ninterface CalibrationCache {\n version: '1.0';\n entries: Record<string, CacheEntry>;\n}\n\n/**\n * Create a hash for a calibration request (for caching)\n */\nfunction hashRequest(request: CalibrationRequest): string {\n // Simple hash based on key fields (not crypto-secure, just for caching)\n const key = JSON.stringify({\n invariantId: request.invariantId,\n localSeverity: request.localSeverity,\n pattern: request.pattern,\n context: request.context,\n });\n // Simple string hash\n let hash = 0;\n for (let i = 0; i < key.length; i++) {\n const char = key.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Load calibration cache from disk\n */\nasync function loadCache(cachePath: string): Promise<CalibrationCache> {\n try {\n if (existsSync(cachePath)) {\n const content = await readFile(cachePath, 'utf-8');\n return JSON.parse(content);\n }\n } catch {\n // Cache corrupted or unreadable, start fresh\n }\n return { version: '1.0', entries: {} };\n}\n\n/**\n * Save calibration cache to disk\n */\nasync function saveCache(cachePath: string, cache: CalibrationCache): Promise<void> {\n try {\n await mkdir(dirname(cachePath), { recursive: true });\n await writeFile(cachePath, JSON.stringify(cache, null, 2));\n } catch {\n // Failed to save cache, not critical\n }\n}\n\n/**\n * Extract calibration-safe pattern from a finding\n * This is what we send to the API - no source code, just metadata\n */\nexport function extractPatternFromFinding(finding: Finding): CalibrationRequest['pattern'] {\n const pattern: CalibrationRequest['pattern'] = {};\n\n // Extract from structured evidence if available\n if (finding.structuredEvidence) {\n const se = finding.structuredEvidence;\n\n if (se.mutationSite) {\n pattern.functionName = se.mutationSite.functionName;\n pattern.mutationType = se.mutationSite.mutationType;\n pattern.entity = se.mutationSite.entity;\n }\n\n pattern.signals = se.signals;\n pattern.confidence = se.confidence;\n\n pattern.indicators = {\n hasCacheInvalidation: (se.invalidationSites?.length ?? 0) > 0,\n hasTests: (se.testsCovering?.length ?? 0) > 0,\n };\n }\n\n // Extract from basic evidence as fallback\n const firstEvidence = finding.evidence[0];\n if (firstEvidence?.symbol && !pattern.functionName) {\n pattern.functionName = firstEvidence.symbol;\n }\n\n return pattern;\n}\n\n/**\n * Detect framework from artifact\n */\nexport function detectFramework(artifact: Artifact): string | undefined {\n // Check routes for framework hints\n if (artifact.routes && artifact.routes.length > 0) {\n const frameworks = artifact.routes.map((r) => r.framework);\n const counts = new Map<string, number>();\n for (const f of frameworks) {\n counts.set(f, (counts.get(f) ?? 0) + 1);\n }\n // Return most common non-unknown framework\n let maxFramework: string | undefined;\n let maxCount = 0;\n for (const [f, c] of counts) {\n if (f !== 'unknown' && c > maxCount) {\n maxFramework = f;\n maxCount = c;\n }\n }\n return maxFramework;\n }\n return undefined;\n}\n\n/**\n * Build context for calibration request\n */\nexport function buildContext(\n artifact: Artifact,\n invariantId: string,\n allFindings: Finding[]\n): CalibrationRequest['context'] {\n const findingsOfType = allFindings.filter((f) => f.invariantId === invariantId);\n\n return {\n framework: detectFramework(artifact),\n serviceCount: artifact.services.length,\n findingCount: findingsOfType.length,\n hasTests: (artifact.tests?.length ?? 0) > 0,\n };\n}\n\n/**\n * Call the Calibration API for a single finding\n */\nasync function callCalibrationAPI(\n request: CalibrationRequest,\n config: CalibrationConfig\n): Promise<CalibrationResponse | null> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeout);\n\n try {\n const response = await fetch(config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.apiKey ? { Authorization: `Bearer ${config.apiKey}` } : {}),\n 'X-Client-Version': CLI_VERSION,\n },\n body: JSON.stringify(request),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n // API error - fail safe to local result\n return null;\n }\n\n const data = await response.json();\n return data as CalibrationResponse;\n } catch {\n // Network error, timeout, etc. - fail safe to local result\n clearTimeout(timeoutId);\n return null;\n }\n}\n\n/**\n * Calibrate a single finding\n */\nexport async function calibrateFinding(\n finding: Finding,\n artifact: Artifact,\n allFindings: Finding[],\n config: CalibrationConfig,\n cache: CalibrationCache\n): Promise<Finding> {\n // Build request\n const request: CalibrationRequest = {\n invariantId: finding.invariantId,\n localSeverity: finding.severity,\n pattern: extractPatternFromFinding(finding),\n context: buildContext(artifact, finding.invariantId, allFindings),\n meta: {\n clientVersion: CLI_VERSION,\n requestId: randomUUID(),\n timestamp: new Date().toISOString(),\n },\n };\n\n const requestHash = hashRequest(request);\n\n // Check cache first\n if (config.cache?.enabled) {\n const cached = cache.entries[requestHash];\n if (cached) {\n const age = Date.now() - cached.timestamp;\n const ttlMs = (config.cache.ttl ?? 86400) * 1000;\n if (age < ttlMs) {\n // Use cached response\n return applyCalibration(finding, cached.response, config);\n }\n }\n }\n\n // Call API\n const response = await callCalibrationAPI(request, config);\n\n if (!response) {\n // API failed - return finding unchanged\n return finding;\n }\n\n // Cache response\n if (config.cache?.enabled) {\n cache.entries[requestHash] = {\n response,\n timestamp: Date.now(),\n requestHash,\n };\n }\n\n return applyCalibration(finding, response, config);\n}\n\n/**\n * Apply calibration response to a finding\n */\nfunction applyCalibration(\n finding: Finding,\n response: CalibrationResponse,\n config: CalibrationConfig\n): Finding {\n const originalSeverity = finding.severity;\n\n // Check if we should apply the recommendation\n const shouldApply = response.confidence >= config.minConfidence && !response.suppress;\n\n const calibration: FindingCalibration = {\n apiRecommendation: response,\n applied: shouldApply,\n originalSeverity,\n reason: shouldApply\n ? `API confidence ${(response.confidence * 100).toFixed(0)}% >= threshold ${(config.minConfidence * 100).toFixed(0)}%`\n : `API confidence ${(response.confidence * 100).toFixed(0)}% < threshold ${(config.minConfidence * 100).toFixed(0)}%`,\n };\n\n // Create new finding with calibration data\n const calibratedFinding: Finding = {\n ...finding,\n calibration,\n };\n\n // Apply severity change if recommended and above threshold\n if (shouldApply && response.recommendedSeverity !== originalSeverity) {\n calibratedFinding.severity = response.recommendedSeverity;\n }\n\n return calibratedFinding;\n}\n\n/**\n * Calibrate all findings in a batch\n * This is the main entry point for calibration\n */\nexport async function calibrateFindings(\n findings: Finding[],\n artifact: Artifact,\n config: CalibrationConfig,\n targetPath: string\n): Promise<Finding[]> {\n if (!config.enabled) {\n return findings;\n }\n\n // Load cache\n const cachePath = config.cache?.path ?? join(targetPath, DEFAULT_CACHE_PATH);\n const cache = await loadCache(cachePath);\n\n // Calibrate each finding\n const calibratedFindings = await Promise.all(\n findings.map((finding) => calibrateFinding(finding, artifact, findings, config, cache))\n );\n\n // Save cache\n if (config.cache?.enabled) {\n await saveCache(cachePath, cache);\n }\n\n return calibratedFindings;\n}\n\n/**\n * Get calibration statistics from findings\n */\nexport function getCalibrationStats(findings: Finding[]): {\n total: number;\n calibrated: number;\n applied: number;\n unchanged: number;\n severityChanges: { from: Severity; to: Severity; count: number }[];\n} {\n const calibrated = findings.filter((f) => f.calibration);\n const applied = calibrated.filter((f) => f.calibration?.applied);\n\n const changes = new Map<string, number>();\n for (const finding of applied) {\n if (finding.calibration && finding.calibration.originalSeverity !== finding.severity) {\n const key = `${finding.calibration.originalSeverity}->${finding.severity}`;\n changes.set(key, (changes.get(key) ?? 0) + 1);\n }\n }\n\n const severityChanges = Array.from(changes.entries()).map(([key, count]) => {\n const [from, to] = key.split('->') as [Severity, Severity];\n return { from, to, count };\n });\n\n return {\n total: findings.length,\n calibrated: calibrated.length,\n applied: applied.length,\n unchanged: findings.length - applied.length,\n severityChanges,\n };\n}\n\n// ============================================================================\n// Aggregate Calibration (from SaaS learning loop)\n// ============================================================================\n\nconst AGGREGATE_CALIBRATION_ENDPOINT = 'https://api.securitychecks.ai/v1/calibration';\n\n// In-memory cache for aggregate data (1 hour TTL)\nconst AGGREGATE_CACHE_TTL_MS = 60 * 60 * 1000;\nlet aggregateCache: AggregateCalibrationData | null = null;\nlet aggregateCacheTimestamp = 0;\n\nexport interface AggregateCalibrationConfig {\n enabled: boolean;\n endpoint?: string;\n apiKey?: string;\n timeout?: number;\n cacheEnabled?: boolean;\n}\n\nexport interface FrameworkBaseline {\n framework: string;\n avgFindings: number;\n avgP0: number;\n avgP1: number;\n avgP2: number;\n scansAnalyzed: number;\n confidence: 'high' | 'medium' | 'low';\n}\n\nexport interface InvariantStats {\n invariantId: string;\n avgPerScan: number;\n hitRate: number;\n p0Rate: number;\n p1Rate: number;\n p2Rate: number;\n}\n\nexport interface PatternStats {\n patternId: string;\n framework: string | null;\n accuracy: number | null;\n matchesPerScan: number;\n confidence: 'high' | 'medium' | 'low';\n}\n\nexport interface CorrelationStats {\n ruleId: string;\n accuracy: number | null;\n escalationRate: number | null;\n isVerified: boolean;\n}\n\nexport interface AggregateCalibrationData {\n version: string;\n generatedAt: string;\n frameworks: FrameworkBaseline[];\n invariants: InvariantStats[];\n patterns: PatternStats[];\n correlations: CorrelationStats[];\n meta: {\n totalScansAnalyzed: number;\n lastUpdated: string | null;\n };\n}\n\nexport interface AggregateCalibrationResult {\n data: AggregateCalibrationData | null;\n fromCache: boolean;\n error?: string;\n}\n\n/**\n * Fetch aggregate calibration data for the specified frameworks\n */\nexport async function fetchAggregateCalibration(\n frameworks: string[],\n config: AggregateCalibrationConfig\n): Promise<AggregateCalibrationResult> {\n if (!config.enabled) {\n return { data: null, fromCache: false, error: 'Aggregate calibration disabled' };\n }\n\n // Check cache first\n if (config.cacheEnabled !== false && aggregateCache && Date.now() - aggregateCacheTimestamp < AGGREGATE_CACHE_TTL_MS) {\n return { data: aggregateCache, fromCache: true };\n }\n\n const endpoint = config.endpoint ?? AGGREGATE_CALIBRATION_ENDPOINT;\n const timeout = config.timeout ?? 5000;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const url = new URL(endpoint);\n url.searchParams.set('frameworks', frameworks.join(','));\n\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n ...(config.apiKey && { Authorization: `Bearer ${config.apiKey}` }),\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return {\n data: null,\n fromCache: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const data = await response.json() as AggregateCalibrationData;\n\n // Update cache\n if (config.cacheEnabled !== false) {\n aggregateCache = data;\n aggregateCacheTimestamp = Date.now();\n }\n\n return { data, fromCache: false };\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (err) {\n // Calibration failures are non-fatal\n return {\n data: null,\n fromCache: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Clear the aggregate calibration cache\n */\nexport function clearAggregateCache(): void {\n aggregateCache = null;\n aggregateCacheTimestamp = 0;\n}\n\n/**\n * Get the framework baseline for comparison\n */\nexport function getFrameworkBaseline(\n calibration: AggregateCalibrationData,\n framework: string\n): FrameworkBaseline | undefined {\n return calibration.frameworks.find((f) => f.framework === framework);\n}\n\n/**\n * Check if a pattern should be skipped due to low accuracy\n */\nexport function shouldSkipPattern(\n calibration: AggregateCalibrationData,\n patternId: string,\n framework?: string,\n accuracyThreshold = 0.3\n): boolean {\n const pattern = calibration.patterns.find(\n (p) => p.patternId === patternId &&\n (p.framework === framework || p.framework === null)\n );\n\n if (!pattern || pattern.accuracy === null) {\n return false; // No data, don't skip\n }\n\n // Only skip if we have high confidence it's a bad pattern\n if (pattern.confidence !== 'high') {\n return false;\n }\n\n return pattern.accuracy < accuracyThreshold;\n}\n\n/**\n * Get patterns that should be skipped for a framework\n */\nexport function getSkippedPatterns(\n calibration: AggregateCalibrationData,\n framework?: string,\n accuracyThreshold = 0.3\n): string[] {\n return calibration.patterns\n .filter((p) => {\n if (p.accuracy === null || p.confidence !== 'high') {\n return false;\n }\n if (framework && p.framework && p.framework !== framework) {\n return false;\n }\n return p.accuracy < accuracyThreshold;\n })\n .map((p) => p.patternId);\n}\n\n/**\n * Get correlation rules with high confidence\n */\nexport function getVerifiedCorrelations(\n calibration: AggregateCalibrationData\n): CorrelationStats[] {\n return calibration.correlations.filter((c) => c.isVerified);\n}\n\n/**\n * Calculate relative finding severity based on framework baseline\n */\nexport function calculateRelativeSeverity(\n findingCount: number,\n baseline: FrameworkBaseline,\n type: 'total' | 'P0' | 'P1' | 'P2' = 'total'\n): 'below_average' | 'average' | 'above_average' | 'critical' {\n let avg: number;\n switch (type) {\n case 'P0':\n avg = baseline.avgP0;\n break;\n case 'P1':\n avg = baseline.avgP1;\n break;\n case 'P2':\n avg = baseline.avgP2;\n break;\n default:\n avg = baseline.avgFindings;\n }\n\n if (avg === 0) {\n return findingCount > 0 ? 'above_average' : 'average';\n }\n\n const ratio = findingCount / avg;\n\n if (ratio < 0.5) return 'below_average';\n if (ratio < 1.5) return 'average';\n if (ratio < 3) return 'above_average';\n return 'critical';\n}\n\n/**\n * Generate calibration summary for output\n */\nexport function formatAggregateCalibrationSummary(\n calibration: AggregateCalibrationData,\n frameworks: string[],\n findings: { P0: number; P1: number; P2: number; total: number }\n): string {\n const lines: string[] = [];\n\n // Framework comparison\n for (const fw of frameworks) {\n const baseline = getFrameworkBaseline(calibration, fw);\n if (baseline && baseline.confidence !== 'low') {\n const severity = calculateRelativeSeverity(findings.total, baseline);\n const avgStr = baseline.avgFindings.toFixed(1);\n\n if (severity === 'below_average') {\n lines.push(`${fw}: ${findings.total} findings (${avgStr} avg) - Below average`);\n } else if (severity === 'above_average') {\n lines.push(`${fw}: ${findings.total} findings (${avgStr} avg) - Above average`);\n } else if (severity === 'critical') {\n lines.push(`${fw}: ${findings.total} findings (${avgStr} avg) - Significantly above average`);\n } else {\n lines.push(`${fw}: ${findings.total} findings (${avgStr} avg) - Typical`);\n }\n }\n }\n\n // Skipped patterns\n const skipped = getSkippedPatterns(calibration, frameworks[0]);\n if (skipped.length > 0) {\n lines.push(`Skipped ${skipped.length} low-accuracy patterns`);\n }\n\n // Data confidence\n if (calibration.meta.totalScansAnalyzed < 100) {\n lines.push(`Calibration based on ${calibration.meta.totalScansAnalyzed} scans (limited data)`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Check if aggregate calibration is disabled via environment\n */\nexport function isAggregateCalibrationDisabled(): boolean {\n return process.env['SECURITYCHECKS_CALIBRATION'] === 'false';\n}\n","[\n {\n \"id\": \"secrets.aws-access-key-id\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"AWS Access Key ID\",\n \"description\": \"AWS access key ID found in code. These start with AKIA and are 20 chars.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/AKIA[0-9A-Z]{16}/\",\n \"not\": [\"process.env\", \"import.meta.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"xxx\", \"placeholder\", \"changeme\"]\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"AWS Access Key ID found in code\",\n \"requiredProof\": \"Move to environment variable or AWS Secrets Manager\",\n \"references\": [\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html\"],\n \"tags\": [\"aws\", \"secrets\", \"credentials\"]\n },\n \"metadata\": {\n \"author\": \"SecurityChecks\",\n \"created\": \"2025-01-01T00:00:00Z\",\n \"references\": [\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html\"]\n }\n },\n {\n \"id\": \"secrets.aws-secret-access-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"AWS Secret Access Key\",\n \"description\": \"AWS secret access key found in code.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/aws_secret_access_key\\\\s*[=:]\\\\s*[\\\"'][A-Za-z0-9/+=]{40}[\\\"']/\",\n \"not\": [\"process.env\", \"import.meta.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"]\n },\n {\n \"pattern\": \"/AWS_SECRET_ACCESS_KEY\\\\s*[=:]\\\\s*[\\\"'][A-Za-z0-9/+=]{40}[\\\"']/\",\n \"not\": [\"process.env\"]\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"AWS Secret Access Key found in code\",\n \"requiredProof\": \"Remove from code, rotate key immediately\",\n \"references\": [\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html\"],\n \"tags\": [\"aws\", \"secrets\", \"credentials\"]\n },\n \"metadata\": {\n \"author\": \"SecurityChecks\",\n \"created\": \"2025-01-01T00:00:00Z\"\n }\n },\n {\n \"id\": \"secrets.github-personal-access-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"GitHub Personal Access Token\",\n \"description\": \"GitHub PAT found in code. Starts with ghp_ (classic) or github_pat_.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/ghp_[A-Za-z0-9]{36}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] },\n { \"pattern\": \"/github_pat_[A-Za-z0-9]{22}_[A-Za-z0-9]{59}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"GitHub Personal Access Token found in code\",\n \"requiredProof\": \"Remove and rotate token immediately\",\n \"references\": [\"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens\"],\n \"tags\": [\"github\", \"secrets\", \"token\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.github-oauth-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"GitHub OAuth Token\",\n \"description\": \"GitHub OAuth access token. Starts with gho_.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/gho_[A-Za-z0-9]{36}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"GitHub OAuth Token found in code\",\n \"requiredProof\": \"Remove and rotate token\",\n \"references\": [\"https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps\"],\n \"tags\": [\"github\", \"secrets\", \"oauth\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.stripe-secret-key-live\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Stripe Live Secret Key\",\n \"description\": \"Stripe live secret key found. This grants full access to the Stripe account.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/sk_live_[a-zA-Z0-9]{24,}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Stripe LIVE secret key found in code - critical exposure\",\n \"requiredProof\": \"Remove from code, rotate in Stripe dashboard immediately\",\n \"references\": [\"https://stripe.com/docs/keys\"],\n \"tags\": [\"stripe\", \"secrets\", \"payment\", \"critical\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.stripe-secret-key-test\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Stripe Test Secret Key\",\n \"description\": \"Stripe test secret key found. Should still be env var.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/sk_test_[a-zA-Z0-9]{24,}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\", \".env\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Stripe test secret key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://stripe.com/docs/keys\"],\n \"tags\": [\"stripe\", \"secrets\", \"payment\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.private-key-rsa\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"RSA Private Key\",\n \"description\": \"RSA private key found in code.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"**/*.java\", \"**/*.rb\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/-----BEGIN RSA PRIVATE KEY-----/\", \"not\": [\"example\", \"sample\", \"test\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"RSA private key found in source code\",\n \"requiredProof\": \"Remove from code, store in secrets manager\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Key_Management_Cheat_Sheet.html\"],\n \"tags\": [\"secrets\", \"cryptography\", \"private-key\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.private-key-generic\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Private Key (Generic)\",\n \"description\": \"Generic private key found in code.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"**/*.java\", \"**/*.rb\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/-----BEGIN PRIVATE KEY-----/\", \"not\": [\"example\", \"sample\", \"test\"] },\n { \"pattern\": \"/-----BEGIN EC PRIVATE KEY-----/\", \"not\": [\"example\", \"sample\", \"test\"] },\n { \"pattern\": \"/-----BEGIN DSA PRIVATE KEY-----/\", \"not\": [\"example\", \"sample\", \"test\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Private key found in source code\",\n \"requiredProof\": \"Remove from code, store in secrets manager\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Key_Management_Cheat_Sheet.html\"],\n \"tags\": [\"secrets\", \"cryptography\", \"private-key\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.google-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Google API Key\",\n \"description\": \"Google API key found (AIza prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/AIza[0-9A-Za-z_-]{35}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Google API key found in code\",\n \"requiredProof\": \"Move to environment variable, restrict key in Google Cloud Console\",\n \"references\": [\"https://cloud.google.com/docs/authentication/api-keys\"],\n \"tags\": [\"google\", \"gcp\", \"secrets\", \"api-key\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.gcp-service-account\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"GCP Service Account Key\",\n \"description\": \"GCP service account private key found in code.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.json\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/\\\"private_key\\\":\\\\s*\\\"-----BEGIN PRIVATE KEY-----/\", \"not\": [\"example\", \"sample\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"GCP service account key found in code\",\n \"requiredProof\": \"Use Workload Identity or store in Secret Manager\",\n \"references\": [\"https://cloud.google.com/iam/docs/best-practices-for-managing-service-account-keys\"],\n \"tags\": [\"gcp\", \"secrets\", \"service-account\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.database-url-with-password\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Database URL with Password\",\n \"description\": \"Database connection string with embedded password.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"**/*.java\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/postgres(ql)?:\\\\/\\\\/[^:]+:[^@]+@[^/]+/\", \"not\": [\"process.env\", \"DATABASE_URL\", \"localhost\", \"127.0.0.1\", \"password\"] },\n { \"pattern\": \"/mysql:\\\\/\\\\/[^:]+:[^@]+@[^/]+/\", \"not\": [\"process.env\", \"DATABASE_URL\", \"localhost\", \"127.0.0.1\", \"password\"] },\n { \"pattern\": \"/mongodb(\\\\+srv)?:\\\\/\\\\/[^:]+:[^@]+@[^/]+/\", \"not\": [\"process.env\", \"MONGODB_URI\", \"localhost\", \"127.0.0.1\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Database connection string with password found in code\",\n \"requiredProof\": \"Move to environment variable or secrets manager\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Database_Security_Cheat_Sheet.html\"],\n \"tags\": [\"database\", \"secrets\", \"connection-string\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.slack-webhook-url\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Slack Webhook URL\",\n \"description\": \"Slack incoming webhook URL found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/https:\\\\/\\\\/hooks\\\\.slack\\\\.com\\\\/services\\\\/T[A-Z0-9]+\\\\/B[A-Z0-9]+\\\\/[a-zA-Z0-9]+/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Slack webhook URL found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://api.slack.com/messaging/webhooks\"],\n \"tags\": [\"slack\", \"secrets\", \"webhook\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.slack-bot-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Slack Bot Token\",\n \"description\": \"Slack bot/user token found (xoxb-/xoxp- prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/xoxb-[0-9]+-[0-9]+-[a-zA-Z0-9]+/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] },\n { \"pattern\": \"/xoxp-[0-9]+-[0-9]+-[0-9]+-[a-f0-9]+/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Slack token found in code\",\n \"requiredProof\": \"Remove and rotate in Slack app settings\",\n \"references\": [\"https://api.slack.com/authentication/token-types\"],\n \"tags\": [\"slack\", \"secrets\", \"token\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.sendgrid-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"SendGrid API Key\",\n \"description\": \"SendGrid API key found (SG. prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/SG\\\\.[a-zA-Z0-9_-]{22}\\\\.[a-zA-Z0-9_-]{43}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"SendGrid API key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://docs.sendgrid.com/ui/account-and-settings/api-keys\"],\n \"tags\": [\"sendgrid\", \"secrets\", \"email\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.twilio-account-sid\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Twilio Account SID\",\n \"description\": \"Twilio account SID found (AC prefix, 32 chars).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/AC[a-f0-9]{32}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Twilio Account SID found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://www.twilio.com/docs/iam/keys/api-key\"],\n \"tags\": [\"twilio\", \"secrets\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.twilio-auth-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Twilio Auth Token\",\n \"description\": \"Twilio auth token found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/TWILIO_AUTH_TOKEN\\\\s*[=:]\\\\s*[\\\"'][a-f0-9]{32}[\\\"']/\", \"not\": [\"process.env\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Twilio Auth Token found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://www.twilio.com/docs/iam/keys/api-key\"],\n \"tags\": [\"twilio\", \"secrets\", \"auth-token\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.npm-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"NPM Access Token\",\n \"description\": \"NPM access token found (npm_ prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/node_modules/**\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/npm_[a-zA-Z0-9]{36}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"NPM access token found in code\",\n \"requiredProof\": \"Remove and rotate token in npm settings\",\n \"references\": [\"https://docs.npmjs.com/creating-and-viewing-access-tokens\"],\n \"tags\": [\"npm\", \"secrets\", \"token\", \"supply-chain\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.pypi-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"PyPI API Token\",\n \"description\": \"PyPI API token found (pypi- prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/pypi-[A-Za-z0-9_-]{32,}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"PyPI API token found in code\",\n \"requiredProof\": \"Remove and rotate token in PyPI settings\",\n \"references\": [\"https://pypi.org/help/#apitoken\"],\n \"tags\": [\"pypi\", \"python\", \"secrets\", \"token\", \"supply-chain\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.firebase-admin-sdk\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Firebase Admin SDK Credentials\",\n \"description\": \"Firebase Admin SDK service account credentials found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.json\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/\\\"type\\\":\\\\s*\\\"service_account\\\"/\", \"not\": [\"example\", \"sample\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Firebase Admin SDK credentials found in code\",\n \"requiredProof\": \"Use environment variables or Secret Manager\",\n \"references\": [\"https://firebase.google.com/docs/admin/setup\"],\n \"tags\": [\"firebase\", \"secrets\", \"google\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.mailchimp-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Mailchimp API Key\",\n \"description\": \"Mailchimp API key found (ends with -us## datacenter).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/[a-f0-9]{32}-us[0-9]{1,2}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Mailchimp API key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://mailchimp.com/developer/marketing/guides/quick-start/\"],\n \"tags\": [\"mailchimp\", \"secrets\", \"email\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.mailgun-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Mailgun API Key\",\n \"description\": \"Mailgun API key found (key- prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/key-[a-f0-9]{32}/\",\n \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"],\n \"requiresNearby\": { \"any\": [\"mailgun\", \"Mailgun\", \"MAILGUN\"], \"within\": 10 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Mailgun API key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://documentation.mailgun.com/en/latest/api-intro.html\"],\n \"tags\": [\"mailgun\", \"secrets\", \"email\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.discord-bot-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Discord Bot Token\",\n \"description\": \"Discord bot token found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/[MN][A-Za-z\\\\d]{23,}\\\\.[\\\\w-]{6}\\\\.[\\\\w-]{27}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Discord bot token found in code\",\n \"requiredProof\": \"Move to environment variable, regenerate token\",\n \"references\": [\"https://discord.com/developers/docs/topics/oauth2\"],\n \"tags\": [\"discord\", \"secrets\", \"bot\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.discord-webhook-url\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Discord Webhook URL\",\n \"description\": \"Discord webhook URL found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/https:\\\\/\\\\/discord(app)?\\\\.com\\\\/api\\\\/webhooks\\\\/[0-9]+\\\\/[A-Za-z0-9_-]+/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Discord webhook URL found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://discord.com/developers/docs/resources/webhook\"],\n \"tags\": [\"discord\", \"secrets\", \"webhook\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.datadog-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Datadog API Key\",\n \"description\": \"Datadog API key found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/DD_API_KEY\\\\s*[=:]\\\\s*[\\\"'][a-f0-9]{32}[\\\"']/\", \"not\": [\"process.env\"] },\n { \"pattern\": \"/DATADOG_API_KEY\\\\s*[=:]\\\\s*[\\\"'][a-f0-9]{32}[\\\"']/\", \"not\": [\"process.env\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Datadog API key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://docs.datadoghq.com/account_management/api-app-keys/\"],\n \"tags\": [\"datadog\", \"secrets\", \"observability\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.openai-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"OpenAI API Key\",\n \"description\": \"OpenAI API key found (sk- prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/sk-[a-zA-Z0-9]{48}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] },\n { \"pattern\": \"/sk-proj-[a-zA-Z0-9_-]{48,}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"OpenAI API key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://platform.openai.com/docs/api-reference/authentication\"],\n \"tags\": [\"openai\", \"ai\", \"secrets\", \"api-key\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.anthropic-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Anthropic API Key\",\n \"description\": \"Anthropic API key found (sk-ant- prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/sk-ant-[a-zA-Z0-9_-]{32,}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Anthropic API key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://docs.anthropic.com/claude/reference/getting-started-with-the-api\"],\n \"tags\": [\"anthropic\", \"ai\", \"secrets\", \"api-key\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.vercel-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Vercel Token\",\n \"description\": \"Vercel authentication token found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/VERCEL_TOKEN\\\\s*[=:]\\\\s*[\\\"'][a-zA-Z0-9]{24}[\\\"']/\", \"not\": [\"process.env\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Vercel token found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://vercel.com/docs/rest-api#authentication\"],\n \"tags\": [\"vercel\", \"secrets\", \"deployment\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.jwt-secret-hardcoded\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"JWT Secret Hardcoded\",\n \"description\": \"JWT secret hardcoded in source code.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/JWT_SECRET\\\\s*[=:]\\\\s*[\\\"'][^\\\"']{16,}[\\\"']/\", \"not\": [\"process.env\", \"example\", \"changeme\", \"secret\"] },\n { \"pattern\": \"/jwtSecret\\\\s*[=:]\\\\s*[\\\"'][^\\\"']{16,}[\\\"']/\", \"not\": [\"process.env\", \"example\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"JWT secret appears to be hardcoded\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://auth0.com/blog/a-look-at-the-latest-draft-for-jwt-bcp/\"],\n \"tags\": [\"jwt\", \"secrets\", \"auth\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.encryption-key-hardcoded\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Encryption Key Hardcoded\",\n \"description\": \"Encryption key hardcoded in source code.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/ENCRYPTION_KEY\\\\s*[=:]\\\\s*[\\\"'][a-fA-F0-9]{32,}[\\\"']/\", \"not\": [\"process.env\", \"example\"] },\n { \"pattern\": \"/encryptionKey\\\\s*[=:]\\\\s*[\\\"'][a-fA-F0-9]{32,}[\\\"']/\", \"not\": [\"process.env\", \"example\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Encryption key appears to be hardcoded\",\n \"requiredProof\": \"Move to environment variable or KMS\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Key_Management_Cheat_Sheet.html\"],\n \"tags\": [\"encryption\", \"secrets\", \"cryptography\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n\n {\n \"id\": \"xss.dangerously-set-inner-html\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"Unsanitized HTML Rendering\",\n \"description\": \"User input rendered without sanitization via dangerouslySetInnerHTML, innerHTML, or v-html.\",\n \"applicability\": {\n \"frameworks\": [\"react\", \"nextjs\", \"vue\"],\n \"filePatterns\": [\"**/*.tsx\", \"**/*.jsx\", \"**/*.vue\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/dangerouslySetInnerHTML|innerHTML|v-html/\", \"not\": [\"sanitize\", \"DOMPurify\", \"escape\", \"trusted\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"User input may be rendered unsanitized (XSS risk)\",\n \"requiredProof\": \"Sanitize HTML with DOMPurify before rendering\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html\"],\n \"tags\": [\"xss\", \"html\", \"input\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"sqli.raw-query\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.SQL_QUERY\",\n \"name\": \"Raw SQL with String Interpolation\",\n \"description\": \"SQL query constructed with string interpolation or concatenation.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"**/*.java\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/\\\\$queryRaw`|\\\\$executeRaw`/\", \"not\": [\"Prisma.sql\", \"Prisma.join\", \"Prisma.raw\"] },\n { \"pattern\": \"/query\\\\(.*\\\\$\\\\{|execute\\\\(.*\\\\$\\\\{/\", \"not\": [\"parameterized\", \"prepared\", \"placeholder\", \"\\\\?\"] },\n { \"pattern\": \"/\\\\.raw\\\\(.*\\\\+|raw\\\\(.*\\\\$\\\\{/\", \"not\": [\"parameterized\", \"prepared\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"SQL query uses string interpolation — potential SQL injection\",\n \"requiredProof\": \"Use parameterized queries or tagged template literals (Prisma.sql)\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html\"],\n \"tags\": [\"sql\", \"injection\", \"database\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"cmdi.exec-user-input\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.COMMAND_EXEC\",\n \"name\": \"Command Execution with User Input\",\n \"description\": \"exec/spawn/execSync called with potentially user-controlled input.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/exec\\\\(.*\\\\$\\\\{|exec\\\\(.*req\\\\.|exec\\\\(.*params/\", \"not\": [\"escape\", \"sanitize\", \"allowlist\", \"whitelist\"] },\n { \"pattern\": \"/execSync\\\\(.*\\\\$\\\\{|execSync\\\\(.*req\\\\.|execSync\\\\(.*params/\", \"not\": [\"escape\", \"sanitize\", \"allowlist\", \"whitelist\"] },\n { \"pattern\": \"/spawn\\\\(.*\\\\$\\\\{|spawn\\\\(.*req\\\\.|spawn\\\\(.*params/\", \"not\": [\"escape\", \"sanitize\", \"allowlist\", \"whitelist\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Command execution with potentially user-controlled input\",\n \"requiredProof\": \"Use parameterized commands (spawn with array args) or strict input validation\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/OS_Command_Injection_Defense_Cheat_Sheet.html\"],\n \"tags\": [\"command-injection\", \"exec\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"cmdi.eval-usage\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.COMMAND_EXEC\",\n \"name\": \"eval() Usage\",\n \"description\": \"eval() executes arbitrary code. Extremely dangerous with any external input.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/\\\\beval\\\\s*\\\\(/\", \"not\": [\"// eslint-disable\", \"JSON.parse\"] },\n { \"pattern\": \"/new Function\\\\s*\\\\(/\", \"not\": [\"// eslint-disable\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"eval() or new Function() used — potential code injection\",\n \"requiredProof\": \"Replace with safer alternatives (JSON.parse, structured data)\",\n \"references\": [\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#never_use_eval!\"],\n \"tags\": [\"eval\", \"code-injection\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"path.traversal.user-input\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.FILE_ACCESS\",\n \"name\": \"Path Traversal with User Input\",\n \"description\": \"File operations with user-controlled paths allow reading arbitrary files.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/readFile.*req\\\\.|readFileSync.*req\\\\.|readFile.*params/\", \"not\": [\"path.resolve\", \"path.normalize\", \"startsWith\", \"sanitize\"] },\n { \"pattern\": \"/createReadStream.*req\\\\.|createReadStream.*params/\", \"not\": [\"path.resolve\", \"sanitize\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"File path from user input may allow path traversal\",\n \"requiredProof\": \"Validate path is within allowed directory using path.resolve\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Path_Traversal_Cheat_Sheet.html\"],\n \"tags\": [\"path\", \"traversal\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"ssrf.fetch-user-input\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"SSRF via User-Controlled URL\",\n \"description\": \"fetch/redirect called with user-provided URL without validation.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/fetch\\\\(.*req|redirect\\\\(.*req|new URL\\\\(.*req/\", \"not\": [\"URL.canParse\", \"isValidUrl\", \"allowlist\", \"validateUrl\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"User-provided URL not validated (SSRF risk)\",\n \"requiredProof\": \"Validate URLs against allowlist\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html\"],\n \"tags\": [\"ssrf\", \"url\", \"input\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"crypto.weak-des\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Weak Encryption Algorithm DES\",\n \"description\": \"DES encryption is cryptographically broken.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/createCipheriv\\\\(['\\\"]des/\" },\n { \"pattern\": \"/createDecipher\\\\(['\\\"]des/\" }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"DES encryption is weak — use AES-256-GCM instead\",\n \"requiredProof\": \"Use AES-256-GCM instead of DES\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html\"],\n \"tags\": [\"crypto\", \"des\", \"weak\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"crypto.weak-rc4\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Weak Encryption Algorithm RC4\",\n \"description\": \"RC4 encryption has known vulnerabilities.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/createCipheriv\\\\(['\\\"]rc4/\" }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"RC4 encryption is weak — use AES-256-GCM instead\",\n \"requiredProof\": \"Use AES-256-GCM instead of RC4\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html\"],\n \"tags\": [\"crypto\", \"rc4\", \"weak\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"crypto.weak-md5\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Weak Hash Algorithm MD5\",\n \"description\": \"MD5 is cryptographically broken for security use.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/createHash\\\\(['\\\"]md5['\\\"]\\\\)/\", \"not\": [\"checksum\", \"etag\", \"cache\", \"fingerprint\"] },\n { \"pattern\": \"/hashlib\\\\.md5/\", \"not\": [\"checksum\", \"etag\", \"cache\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"MD5 hash used — weak for security purposes\",\n \"requiredProof\": \"Use SHA-256 or SHA-3 for security; MD5 is acceptable only for non-security checksums\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html\"],\n \"tags\": [\"crypto\", \"md5\", \"weak\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"crypto.weak-sha1\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Weak Hash Algorithm SHA1\",\n \"description\": \"SHA1 has known collision attacks and should not be used for security.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/createHash\\\\(['\\\"]sha1['\\\"]\\\\)/\", \"not\": [\"checksum\", \"etag\", \"cache\", \"git\"] },\n { \"pattern\": \"/hashlib\\\\.sha1/\", \"not\": [\"checksum\", \"etag\", \"cache\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"SHA1 hash used — weak for security purposes\",\n \"requiredProof\": \"Use SHA-256 or SHA-3 for security\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html\"],\n \"tags\": [\"crypto\", \"sha1\", \"weak\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"crypto.hardcoded-iv\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Hardcoded Initialization Vector\",\n \"description\": \"IVs must be random, not hardcoded.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/iv\\\\s*[=:]\\\\s*[\\\"'][0-9a-fA-F]+[\\\"']|iv:\\\\s*Buffer\\\\.from\\\\s*\\\\([\\\"']/\", \"not\": [\"randomBytes\", \"random\", \"generate\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Hardcoded IV detected — use random IV per encryption\",\n \"requiredProof\": \"Generate random IV with crypto.randomBytes()\",\n \"references\": [\"https://nodejs.org/api/crypto.html\"],\n \"tags\": [\"crypto\", \"iv\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"crypto.math-random-security\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Math.random Used for Security\",\n \"description\": \"Math.random is not cryptographically secure.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/Math\\\\.random\\\\s*\\\\(/\",\n \"requiresNearby\": { \"any\": [\"token\", \"secret\", \"password\", \"key\", \"session\", \"nonce\", \"csrf\"], \"within\": 5 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Math.random is not cryptographically secure for token/key generation\",\n \"requiredProof\": \"Use crypto.randomBytes or crypto.randomUUID for security\",\n \"references\": [\"https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues\"],\n \"tags\": [\"crypto\", \"random\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"cookie.no-httponly\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"Cookie Missing HttpOnly Flag\",\n \"description\": \"Session cookies should have HttpOnly flag to prevent XSS theft.\",\n \"applicability\": {\n \"frameworks\": [\"express\", \"nextjs\", \"node\"],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/setCookie|cookie\\\\s*\\\\(|set-cookie/i\",\n \"not\": [\"httpOnly\", \"HttpOnly\", \"http_only\"],\n \"requiresNearby\": { \"any\": [\"session\", \"token\", \"auth\"], \"within\": 20 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Cookie may be missing HttpOnly flag\",\n \"requiredProof\": \"Set httpOnly: true for session cookies\",\n \"references\": [\"https://owasp.org/www-community/HttpOnly\"],\n \"tags\": [\"cookie\", \"session\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"cors.wildcard-origin\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"CORS Wildcard Origin\",\n \"description\": \"CORS with * origin allows any site to make requests.\",\n \"applicability\": {\n \"frameworks\": [\"express\", \"nextjs\", \"node\"],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/Access-Control-Allow-Origin.*\\\\*|cors.*origin:\\\\s*[\\\"']\\\\*[\\\"']/\" }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"CORS wildcard origin allows any site to make requests\",\n \"requiredProof\": \"Restrict CORS origin to known domains\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Cross-Origin_Resource_Sharing_Cheat_Sheet.html\"],\n \"tags\": [\"cors\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"session.weak-secret\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Session Secret Too Weak\",\n \"description\": \"Session secrets should be long, random strings from environment.\",\n \"applicability\": {\n \"frameworks\": [\"express\", \"node\"],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/session.*secret\\\\s*[=:]\\\\s*[\\\"'][^\\\"']{1,20}[\\\"']/\", \"not\": [\"process.env\", \"import.meta.env\"] },\n { \"pattern\": \"/cookieParser\\\\s*\\\\(['\\\"][^'\\\"]{1,20}['\\\"]\\\\)/\", \"not\": [\"process.env\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Session secret appears to be weak or hardcoded\",\n \"requiredProof\": \"Use long random secret from environment variable\",\n \"references\": [\"https://expressjs.com/en/resources/middleware/session.html\"],\n \"tags\": [\"session\", \"secrets\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"filename.unsanitized\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.FILE_ACCESS\",\n \"name\": \"Filename Not Sanitized\",\n \"description\": \"User-provided filenames should be sanitized before use.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/req\\\\.file\\\\.originalname|body\\\\.filename|params\\\\.filename/\", \"not\": [\"sanitize\", \"path.basename\", \"normalize\", \"slugify\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Filename may not be sanitized — path traversal risk\",\n \"requiredProof\": \"Sanitize user-provided filenames with path.basename or slugify\",\n \"references\": [\"https://owasp.org/www-community/attacks/Path_Traversal\"],\n \"tags\": [\"sanitize\", \"filename\", \"traversal\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"nextjs.server-action.unprotected\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"AUTHZ.SERVICE_LAYER.ENFORCED\",\n \"name\": \"Unprotected Next.js Server Action\",\n \"description\": \"Server actions with 'use server' directive should verify authentication.\",\n \"applicability\": {\n \"frameworks\": [\"nextjs\"],\n \"filePatterns\": [\"**/app/**/actions.ts\", \"**/app/**/actions/*.ts\", \"**/actions/**/*.ts\", \"**/*.ts\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/'use server'/\",\n \"not\": [\"getServerSession\", \"auth()\", \"currentUser\", \"getSession\", \"requireAuth\", \"protect\"],\n \"requiresNearby\": { \"any\": [\"export async function\", \"export const\"], \"within\": 50 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Server action missing authentication check\",\n \"requiredProof\": \"Add getServerSession() or auth() check before any mutations\",\n \"references\": [\"https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations\"],\n \"tags\": [\"nextjs\", \"authz\", \"server-actions\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"nextjs.env.exposed\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Server Environment Variable Exposed to Client\",\n \"description\": \"Non-NEXT_PUBLIC_ environment variables should not be in client components.\",\n \"applicability\": {\n \"frameworks\": [\"nextjs\"],\n \"filePatterns\": [\"**/*.tsx\", \"**/*.ts\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/process\\\\.env\\\\.(DATABASE|SECRET|API_KEY|STRIPE_SECRET)/\",\n \"requiresNearby\": { \"any\": [\"use client\"], \"within\": 5 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Server-only environment variable may be exposed to client\",\n \"requiredProof\": \"Only access server env vars in server components/actions/API routes\",\n \"references\": [\"https://nextjs.org/docs/app/building-your-application/configuring/environment-variables\"],\n \"tags\": [\"nextjs\", \"security\", \"env\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"nosqli.mongo-injection\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.SQL_QUERY\",\n \"name\": \"NoSQL Injection via Object Input\",\n \"description\": \"MongoDB queries with unsanitized user input allow operator injection.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/\\\\.find\\\\(.*req\\\\.body|\\\\.findOne\\\\(.*req\\\\.body|\\\\.updateOne\\\\(.*req\\\\.body/\", \"not\": [\"sanitize\", \"validate\", \"schema\", \"zod\", \"joi\"] },\n { \"pattern\": \"/\\\\$where.*req\\\\.|\\\\$regex.*req\\\\./\", \"not\": [\"sanitize\", \"escape\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"MongoDB query with unsanitized user input — NoSQL injection risk\",\n \"requiredProof\": \"Validate and sanitize input before MongoDB queries\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Injection_Prevention_Cheat_Sheet.html\"],\n \"tags\": [\"nosql\", \"injection\", \"mongodb\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"debug.console-log-sensitive\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"Sensitive Data in Console Log\",\n \"description\": \"Logging sensitive data (passwords, tokens, keys) to console.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/console\\\\.log.*password|console\\\\.log.*secret|console\\\\.log.*token|console\\\\.log.*apiKey/i\", \"not\": [\"debug\", \"// \", \"redact\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Sensitive data may be logged to console\",\n \"requiredProof\": \"Remove sensitive data from logs or use structured logging with redaction\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html\"],\n \"tags\": [\"logging\", \"debug\", \"sensitive-data\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"upload.no-type-validation\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.FILE_ACCESS\",\n \"name\": \"File Upload Type Not Validated\",\n \"description\": \"Uploaded file types should be validated.\",\n \"applicability\": {\n \"frameworks\": [\"express\", \"node\"],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/multer|formidable/\", \"not\": [\"fileFilter\", \"mimetype\", \"file-type\", \"allowedTypes\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"File upload type not validated\",\n \"requiredProof\": \"Validate file MIME type and extension\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html\"],\n \"tags\": [\"upload\", \"file-type\", \"input\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"header.missing-csp\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"Missing Content-Security-Policy\",\n \"description\": \"Content-Security-Policy header should be set to prevent XSS and data injection.\",\n \"applicability\": {\n \"frameworks\": [\"express\", \"nextjs\", \"node\"],\n \"filePatterns\": [\"**/middleware.ts\", \"**/middleware.js\", \"**/server.ts\", \"**/server.js\", \"**/app.ts\", \"**/app.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/helmet|setHeader|headers/\",\n \"not\": [\"Content-Security-Policy\", \"content-security-policy\", \"csp\"],\n \"requiresNearby\": { \"any\": [\"express\", \"app.\", \"server.\"], \"within\": 20 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P2\",\n \"message\": \"Content-Security-Policy header may not be set\",\n \"requiredProof\": \"Set Content-Security-Policy header via helmet or manually\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html\"],\n \"tags\": [\"headers\", \"csp\", \"xss\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"prototype.pollution\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.COMMAND_EXEC\",\n \"name\": \"Prototype Pollution Risk\",\n \"description\": \"Object merge/assign with user input may allow prototype pollution.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/Object\\\\.assign\\\\(.*req\\\\.body|\\\\.\\\\.\\\\.(req\\\\.body|req\\\\.query)/\", \"not\": [\"sanitize\", \"pick\", \"omit\", \"allowlist\", \"zod\", \"schema\"] },\n { \"pattern\": \"/lodash\\\\.merge\\\\(.*req|deepMerge\\\\(.*req|_.merge\\\\(.*req/\", \"not\": [\"sanitize\", \"validate\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Object merge with user input may allow prototype pollution\",\n \"requiredProof\": \"Use allowlist (pick/omit) instead of spreading user input directly\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.html\"],\n \"tags\": [\"prototype-pollution\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"redirect.open-redirect\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"Open Redirect\",\n \"description\": \"Redirect with user-controlled URL allows phishing attacks.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/redirect\\\\(.*req\\\\.query|redirect\\\\(.*searchParams|res\\\\.redirect\\\\(.*req/\", \"not\": [\"allowlist\", \"startsWith\", \"hostname\", \"validateUrl\", \"URL\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Redirect URL from user input — open redirect risk\",\n \"requiredProof\": \"Validate redirect URL is same-origin or on allowlist\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html\"],\n \"tags\": [\"redirect\", \"phishing\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"timing.non-constant-compare\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Non-Constant-Time String Comparison\",\n \"description\": \"Using === for secret comparison leaks timing information.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/===.*secret|===.*token|===.*apiKey|===.*password/i\",\n \"not\": [\"timingSafeEqual\", \"constantTimeCompare\", \"scrypt\", \"bcrypt\", \"argon\"],\n \"requiresNearby\": { \"any\": [\"verify\", \"authenticate\", \"check\", \"compare\", \"validate\"], \"within\": 5 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P2\",\n \"message\": \"Non-constant-time comparison for secrets — timing attack risk\",\n \"requiredProof\": \"Use crypto.timingSafeEqual for secret comparison\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html\"],\n \"tags\": [\"timing\", \"crypto\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n }\n]\n","/* eslint-disable max-lines */\n/**\n * Patterns API Client\n *\n * \"Patterns add coverage. Calibration adds precision.\"\n *\n * This module handles fetching Pro Patterns from the SecurityChecks API.\n * Patterns extend the built-in invariant checkers with framework-specific detection.\n *\n * Key principles:\n * - Patterns are cached locally (24h TTL by default)\n * - ETag-based conditional fetching for efficiency\n * - Fails safely to offline mode (no patterns, just built-in checkers)\n * - Patterns are filtered by detected frameworks\n */\n\nimport type {\n PatternConfig,\n PatternCache,\n PatternDefinition,\n Artifact,\n Severity,\n Finding,\n} from '@securitychecks/collector';\nimport { DEFAULT_PATTERN_CONFIG } from '@securitychecks/collector';\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync, readFileSync } from 'fs';\nimport { globSync } from 'glob';\nimport { Project, Node } from 'ts-morph';\nimport { join, dirname, relative } from 'path';\n\n// CLI version for API requests\nconst CLI_VERSION = '0.1.0';\n\n// Default cache path (relative to project root)\nconst DEFAULT_CACHE_PATH = '.securitychecks/patterns-cache.json';\n\n// ============================================================================\n// API Response Types (matches the API endpoint)\n// ============================================================================\n\ninterface PatternAPIResponse {\n patterns: APIPattern[];\n meta: {\n total: number;\n fromDatabase: number;\n builtIn: number;\n etag: string;\n maxAge: number;\n };\n}\n\ninterface APIPattern {\n id: string;\n patternId: string;\n version: string;\n name: string;\n description: string;\n invariantId: string;\n applicability: {\n frameworks: string[];\n frameworkVersions?: string;\n filePatterns: string[];\n };\n detection: unknown;\n finding: {\n severity: Severity;\n message: string;\n requiredProof: string;\n suggestedTest?: string;\n };\n metadata: {\n author: string;\n references: string[];\n tags: string[];\n };\n}\n\n// ============================================================================\n// Framework Detection\n// ============================================================================\n\n/**\n * Detect frameworks from a collector artifact.\n */\nexport function detectFrameworks(artifact: Artifact): string[] {\n const codebaseFrameworks = (artifact as Artifact & { codebase?: { frameworks?: string[] } })\n .codebase?.frameworks;\n if (codebaseFrameworks !== undefined) {\n return normalizeFrameworkList(codebaseFrameworks);\n }\n\n const frameworks = new Set<string>();\n\n // Check routes for framework hints\n if (artifact.routes) {\n for (const route of artifact.routes) {\n if (route.framework && route.framework !== 'unknown') {\n frameworks.add(route.framework.toLowerCase());\n }\n }\n }\n\n // Check services for framework indicators\n if (artifact.services) {\n for (const service of artifact.services) {\n // Check for Next.js patterns\n if (\n service.file.includes('/app/') &&\n (service.file.endsWith('route.ts') ||\n service.file.endsWith('route.js') ||\n service.file.includes('/actions/'))\n ) {\n frameworks.add('nextjs');\n }\n\n }\n }\n\n // Check webhooks for providers\n if (artifact.webhookHandlers) {\n for (const wh of artifact.webhookHandlers) {\n if (wh.provider) {\n // Add provider as a \"framework\" for pattern matching\n frameworks.add(wh.provider.toLowerCase());\n }\n }\n }\n\n return Array.from(frameworks);\n}\n\nfunction normalizeFrameworkList(frameworks: string[]): string[] {\n return Array.from(new Set(frameworks.map((framework) => framework.toLowerCase())));\n}\n\n// ============================================================================\n// Local Code Introspection (sync, cached)\n// ============================================================================\n\nconst fileDirectiveCache = new Map<string, Set<string>>();\nconst fileContentCache = new Map<string, { content: string; lines: string[] }>();\nconst functionRangeCache = new Map<string, FunctionRange[]>();\nconst packageJsonCache = new Map<string, Set<string>>();\nconst matcherCache = new Map<string, (text: string) => boolean>();\nlet tsProject: Project | null = null;\n\ninterface FunctionRange {\n name?: string;\n startLine: number;\n endLine: number;\n}\n\nfunction getDirectivePrologue(filePath: string): Set<string> {\n const cached = fileDirectiveCache.get(filePath);\n if (cached) return cached;\n\n const directives = new Set<string>();\n try {\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split(/\\r?\\n/);\n for (const line of lines.slice(0, 50)) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n if (trimmed.startsWith('//')) continue;\n if (trimmed.startsWith('/*') || trimmed.startsWith('*')) continue;\n\n const match = trimmed.match(/^['\"]([^'\"]+)['\"]\\s*;?\\s*$/);\n if (!match) break;\n\n const directive = match[1];\n if (!directive) break;\n directives.add(directive);\n }\n } catch {\n // Ignore file read errors; treat as no directives.\n }\n\n fileDirectiveCache.set(filePath, directives);\n return directives;\n}\n\n// ============================================================================\n// Code Pattern Matching Utilities\n// ============================================================================\n\ntype CodePattern = NonNullable<NonNullable<PatternDefinition['detection']>['codePatterns']>[number];\n\nconst DEFAULT_GLOB_IGNORE = [\n '**/node_modules/**',\n '**/.git/**',\n '**/.next/**',\n '**/dist/**',\n '**/build/**',\n '**/out/**',\n '**/.turbo/**',\n '**/coverage/**',\n '**/.cache/**',\n];\n\nconst DEFAULT_SOURCE_GLOBS = ['**/*.{ts,tsx,js,jsx,mjs,cjs}'];\n\nfunction getProject(): Project {\n if (!tsProject) {\n tsProject = new Project({\n skipAddingFilesFromTsConfig: true,\n compilerOptions: {\n allowJs: true,\n checkJs: false,\n },\n });\n }\n return tsProject;\n}\n\nfunction getFileContent(filePath: string): { content: string; lines: string[] } {\n const cached = fileContentCache.get(filePath);\n if (cached) return cached;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split(/\\r?\\n/);\n const payload = { content, lines };\n fileContentCache.set(filePath, payload);\n return payload;\n } catch {\n const payload = { content: '', lines: [] };\n fileContentCache.set(filePath, payload);\n return payload;\n }\n}\n\nfunction getFunctionRanges(filePath: string): FunctionRange[] {\n const cached = functionRangeCache.get(filePath);\n if (cached) return cached;\n\n let sourceFile;\n try {\n const project = getProject();\n sourceFile = project.getSourceFile(filePath) ?? project.addSourceFileAtPath(filePath);\n } catch {\n functionRangeCache.set(filePath, []);\n return [];\n }\n\n const ranges: FunctionRange[] = [];\n sourceFile.forEachDescendant((node) => {\n if (Node.isFunctionDeclaration(node) || Node.isMethodDeclaration(node)) {\n const name = node.getName();\n if (name) {\n ranges.push({\n name,\n startLine: node.getStartLineNumber(),\n endLine: node.getEndLineNumber(),\n });\n }\n return;\n }\n\n if (Node.isArrowFunction(node) || Node.isFunctionExpression(node)) {\n const parent = node.getParent();\n let name: string | undefined;\n if (Node.isVariableDeclaration(parent)) {\n name = parent.getName();\n } else if (Node.isPropertyAssignment(parent)) {\n name = parent.getName();\n }\n\n if (name) {\n ranges.push({\n name,\n startLine: node.getStartLineNumber(),\n endLine: node.getEndLineNumber(),\n });\n }\n }\n });\n\n functionRangeCache.set(filePath, ranges);\n return ranges;\n}\n\nfunction findFunctionForLine(line: number, ranges: FunctionRange[]): FunctionRange | undefined {\n let best: FunctionRange | undefined;\n for (const range of ranges) {\n if (line < range.startLine || line > range.endLine) continue;\n if (!best) {\n best = range;\n continue;\n }\n const bestSize = best.endLine - best.startLine;\n const currentSize = range.endLine - range.startLine;\n if (currentSize < bestSize) {\n best = range;\n }\n }\n return best;\n}\n\nfunction parseRegexLiteral(pattern: string): RegExp | null {\n const match = pattern.match(/^\\/(.+)\\/([gimsuy]*)$/);\n if (!match) return null;\n const source = match[1];\n if (!source) return null;\n const rawFlags = match[2] ?? '';\n const flags = rawFlags.replace('g', '');\n try {\n return new RegExp(source, flags);\n } catch {\n return null;\n }\n}\n\nfunction getMatcher(pattern: string): (text: string) => boolean {\n const cached = matcherCache.get(pattern);\n if (cached) return cached;\n\n const regex = parseRegexLiteral(pattern);\n const matcher = regex\n ? (text: string) => {\n regex.lastIndex = 0;\n return regex.test(text);\n }\n : (text: string) => text.includes(pattern);\n\n matcherCache.set(pattern, matcher);\n return matcher;\n}\n\nfunction normalizePatternList(value: string | string[] | undefined): string[] {\n if (!value) return [];\n return Array.isArray(value) ? value.filter((v) => v.length > 0) : [value];\n}\n\nfunction matchesAll(patterns: string[], text: string): boolean {\n return patterns.every((pattern) => getMatcher(pattern)(text));\n}\n\nfunction matchesAny(patterns: string[], text: string): boolean {\n return patterns.some((pattern) => getMatcher(pattern)(text));\n}\n\nfunction matchesNone(patterns: string[], text: string): boolean {\n return patterns.every((pattern) => !getMatcher(pattern)(text));\n}\n\nfunction meetsNearbyRequirement(\n lines: string[],\n lineIndex: number,\n requirement: NonNullable<CodePattern['requiresNearby']>\n): boolean {\n const start = Math.max(0, lineIndex - requirement.within);\n const end = Math.min(lines.length - 1, lineIndex + requirement.within);\n const windowLines = lines.slice(start, end + 1);\n\n const any = normalizePatternList(requirement.any);\n const all = normalizePatternList(requirement.all);\n const not = normalizePatternList(requirement.not);\n\n if (any.length > 0 && !windowLines.some((line) => matchesAny(any, line))) {\n return false;\n }\n\n if (all.length > 0 && !all.every((pattern) => windowLines.some((line) => getMatcher(pattern)(line)))) {\n return false;\n }\n\n if (not.length > 0 && windowLines.some((line) => matchesAny(not, line))) {\n return false;\n }\n\n return true;\n}\n\nfunction collectArtifactFiles(artifact: Artifact): string[] {\n const files = new Set<string>();\n\n for (const service of artifact.services ?? []) files.add(service.file);\n for (const route of artifact.routes ?? []) files.add(route.file);\n for (const webhook of artifact.webhookHandlers ?? []) files.add(webhook.file);\n for (const tx of artifact.transactionScopes ?? []) files.add(tx.file);\n for (const job of artifact.jobHandlers ?? []) files.add(job.file);\n for (const mutation of artifact.membershipMutations ?? []) files.add(mutation.file);\n for (const test of artifact.tests ?? []) files.add(test.file);\n for (const authzCall of artifact.authzCalls ?? []) files.add(authzCall.file);\n for (const cacheOp of artifact.cacheOperations ?? []) files.add(cacheOp.file);\n\n return [...files];\n}\n\nfunction collectFilesFromGlobs(targetPath: string, patterns: string[]): Set<string> {\n const files = new Set<string>();\n for (const pattern of patterns) {\n if (!pattern) continue;\n const matches = globSync(pattern, {\n cwd: targetPath,\n absolute: true,\n nodir: true,\n ignore: DEFAULT_GLOB_IGNORE,\n });\n for (const match of matches) {\n files.add(match);\n }\n }\n return files;\n}\n\nfunction intersectFiles(primary: Set<string>, secondary: Set<string>): Set<string> {\n if (primary.size === 0) return new Set(secondary);\n if (secondary.size === 0) return new Set(primary);\n const intersection = new Set<string>();\n for (const file of primary) {\n if (secondary.has(file)) intersection.add(file);\n }\n return intersection;\n}\n\nfunction resolveBaseCandidateFiles(artifact: Artifact, pattern: PatternDefinition): Set<string> {\n const filePatterns = pattern.applicability.filePatterns ?? [];\n if (filePatterns.length > 0) {\n return collectFilesFromGlobs(artifact.targetPath, filePatterns);\n }\n\n const artifactFiles = collectArtifactFiles(artifact)\n .map((file) => join(artifact.targetPath, file))\n .filter((file) => existsSync(file));\n\n if (artifactFiles.length > 0) {\n return new Set(artifactFiles);\n }\n\n return collectFilesFromGlobs(artifact.targetPath, DEFAULT_SOURCE_GLOBS);\n}\n\nfunction findNearestPackageJson(filePath: string, rootPath: string): string | null {\n let current = dirname(filePath);\n const root = rootPath;\n\n while (true) {\n const candidate = join(current, 'package.json');\n if (existsSync(candidate)) return candidate;\n\n if (current === root) break;\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n\n return null;\n}\n\nfunction getDependenciesFromPackageJson(packageJsonPath: string): Set<string> {\n const cached = packageJsonCache.get(packageJsonPath);\n if (cached) return cached;\n\n try {\n const raw = readFileSync(packageJsonPath, 'utf-8');\n const data = JSON.parse(raw) as Record<string, Record<string, string> | undefined>;\n const deps = new Set<string>([\n ...Object.keys(data['dependencies'] ?? {}),\n ...Object.keys(data['devDependencies'] ?? {}),\n ...Object.keys(data['peerDependencies'] ?? {}),\n ...Object.keys(data['optionalDependencies'] ?? {}),\n ]);\n packageJsonCache.set(packageJsonPath, deps);\n return deps;\n } catch {\n const deps = new Set<string>();\n packageJsonCache.set(packageJsonPath, deps);\n return deps;\n }\n}\n\nfunction collectDependenciesForFiles(files: string[], targetPath: string): Set<string> {\n const deps = new Set<string>();\n for (const file of files) {\n const pkg = findNearestPackageJson(file, targetPath);\n if (!pkg) continue;\n const pkgDeps = getDependenciesFromPackageJson(pkg);\n for (const dep of pkgDeps) deps.add(dep);\n }\n\n if (deps.size === 0) {\n const rootPackage = join(targetPath, 'package.json');\n if (existsSync(rootPackage)) {\n const rootDeps = getDependenciesFromPackageJson(rootPackage);\n for (const dep of rootDeps) deps.add(dep);\n }\n }\n\n return deps;\n}\n\nfunction hasRequiredDependencies(\n pattern: PatternDefinition,\n files: string[],\n targetPath: string\n): boolean {\n const required = pattern.applicability.requiredDependencies ?? [];\n if (required.length === 0) return true;\n\n const deps = collectDependenciesForFiles(files, targetPath);\n return required.every((dep) => deps.has(dep));\n}\n\nfunction hasExcludedPattern(pattern: PatternDefinition, files: string[]): boolean {\n const excludePatterns = pattern.applicability.excludePatterns ?? [];\n if (excludePatterns.length === 0) return false;\n\n for (const file of files) {\n const { content } = getFileContent(file);\n if (!content) continue;\n for (const excludePattern of excludePatterns) {\n if (getMatcher(excludePattern)(content)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n// ============================================================================\n// Cache Management\n// ============================================================================\n\n/**\n * Load pattern cache from disk.\n */\nasync function loadCache(cachePath: string): Promise<PatternCache | null> {\n try {\n if (existsSync(cachePath)) {\n const content = await readFile(cachePath, 'utf-8');\n const cache = JSON.parse(content) as PatternCache;\n\n // Check if cache is expired\n const expiresAt = new Date(cache.expiresAt).getTime();\n if (Date.now() < expiresAt) {\n return cache;\n }\n }\n } catch {\n // Cache corrupted or unreadable\n }\n return null;\n}\n\n/**\n * Save pattern cache to disk.\n */\nasync function saveCache(cachePath: string, cache: PatternCache): Promise<void> {\n try {\n await mkdir(dirname(cachePath), { recursive: true });\n await writeFile(cachePath, JSON.stringify(cache, null, 2));\n } catch {\n // Failed to save cache, not critical\n }\n}\n\n// ============================================================================\n// API Client\n// ============================================================================\n\n/**\n * Fetch patterns from the API.\n */\nasync function fetchFromAPI(\n config: PatternConfig,\n frameworks: string[],\n invariants?: string[],\n etag?: string\n): Promise<{ patterns: PatternDefinition[]; meta: PatternAPIResponse['meta'] } | null> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeout);\n\n try {\n // Build query string\n const params = new URLSearchParams();\n if (frameworks.length > 0) {\n params.set('frameworks', frameworks.join(','));\n }\n if (invariants && invariants.length > 0) {\n params.set('invariants', invariants.join(','));\n }\n params.set('version', CLI_VERSION);\n\n const url = `${config.endpoint}?${params.toString()}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Client-Version': CLI_VERSION,\n };\n\n if (config.apiKey) {\n headers['Authorization'] = `Bearer ${config.apiKey}`;\n }\n\n if (etag) {\n headers['If-None-Match'] = etag;\n }\n\n const response = await fetch(url, {\n method: 'GET',\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // 304 Not Modified - use cached version\n if (response.status === 304) {\n return null;\n }\n\n if (!response.ok) {\n // API error - fail safe to offline mode\n return null;\n }\n\n const data = (await response.json()) as PatternAPIResponse;\n\n // Convert API patterns to PatternDefinition format\n const patterns: PatternDefinition[] = data.patterns.map(convertAPIPattern);\n\n return { patterns, meta: data.meta };\n } catch {\n // Network error, timeout, etc.\n clearTimeout(timeoutId);\n return null;\n }\n}\n\n/**\n * Convert API pattern format to PatternDefinition.\n */\nfunction convertAPIPattern(apiPattern: APIPattern): PatternDefinition {\n return {\n id: apiPattern.patternId,\n version: apiPattern.version,\n invariantId: apiPattern.invariantId,\n name: apiPattern.name,\n description: apiPattern.description,\n applicability: {\n frameworks: apiPattern.applicability.frameworks,\n frameworkVersions: apiPattern.applicability.frameworkVersions,\n filePatterns: apiPattern.applicability.filePatterns,\n },\n detection: apiPattern.detection as PatternDefinition['detection'],\n finding: {\n severity: apiPattern.finding.severity,\n message: apiPattern.finding.message,\n requiredProof: apiPattern.finding.requiredProof,\n suggestedTest: apiPattern.finding.suggestedTest,\n references: apiPattern.metadata.references,\n tags: apiPattern.metadata.tags,\n },\n metadata: {\n author: apiPattern.metadata.author,\n created: new Date().toISOString(), // API doesn't provide this yet\n references: apiPattern.metadata.references,\n },\n };\n}\n\n// ============================================================================\n// Main API\n// ============================================================================\n\n/**\n * Fetch patterns for a codebase.\n *\n * This is the main entry point for pattern fetching.\n */\nexport async function fetchPatterns(\n artifact: Artifact,\n config: PatternConfig = DEFAULT_PATTERN_CONFIG,\n targetPath: string = process.cwd(),\n frameworksOverride?: string[]\n): Promise<PatternDefinition[]> {\n if (!config.enabled || config.offlineMode) {\n return [];\n }\n\n const frameworks =\n frameworksOverride !== undefined\n ? normalizeFrameworkList(frameworksOverride)\n : detectFrameworks(artifact);\n if (frameworks.length === 0) {\n // No frameworks detected, no patterns to fetch\n return [];\n }\n\n const cachePath = config.cache?.path ?? join(targetPath, DEFAULT_CACHE_PATH);\n\n // Try to load from cache first\n if (config.cache?.enabled) {\n const cache = await loadCache(cachePath);\n if (cache) {\n // Check if cache covers our frameworks\n const cachedFrameworks = new Set<string>();\n for (const pattern of cache.patterns) {\n for (const f of pattern.applicability.frameworks) {\n cachedFrameworks.add(f);\n }\n }\n\n const allCovered = frameworks.every((f) => cachedFrameworks.has(f));\n if (allCovered) {\n // Try conditional fetch with ETag\n const result = await fetchFromAPI(config, frameworks, undefined, cache.etag);\n if (result === null) {\n // 304 Not Modified - use cached patterns\n return filterPatternsForFrameworks(cache.patterns, frameworks);\n }\n\n // New patterns - update cache\n const newCache: PatternCache = {\n patterns: result.patterns,\n fetchedAt: new Date().toISOString(),\n etag: result.meta.etag,\n expiresAt: new Date(Date.now() + result.meta.maxAge * 1000).toISOString(),\n apiVersion: '1.0',\n };\n await saveCache(cachePath, newCache);\n return filterPatternsForFrameworks(result.patterns, frameworks);\n }\n }\n }\n\n // Fetch from API\n const result = await fetchFromAPI(config, frameworks);\n if (result === null) {\n // API failed - return empty (graceful degradation)\n return [];\n }\n\n // Save to cache\n if (config.cache?.enabled) {\n const cache: PatternCache = {\n patterns: result.patterns,\n fetchedAt: new Date().toISOString(),\n etag: result.meta.etag,\n expiresAt: new Date(Date.now() + result.meta.maxAge * 1000).toISOString(),\n apiVersion: '1.0',\n };\n await saveCache(cachePath, cache);\n }\n\n return filterPatternsForFrameworks(result.patterns, frameworks);\n}\n\n/**\n * Filter patterns to only those applicable to the detected frameworks.\n */\nfunction filterPatternsForFrameworks(\n patterns: PatternDefinition[],\n frameworks: string[]\n): PatternDefinition[] {\n return patterns.filter((pattern) =>\n pattern.applicability.frameworks.some((f) => frameworks.includes(f.toLowerCase()))\n );\n}\n\n// ============================================================================\n// Pattern Matching\n// ============================================================================\n\n/**\n * Result of matching a pattern against artifact.\n */\nexport interface PatternMatch {\n pattern: PatternDefinition;\n file: string;\n line: number;\n symbol?: string;\n evidence: string[];\n}\n\n/**\n * Apply patterns to an artifact and generate findings.\n *\n * This matches patterns against the artifact data and creates findings\n * for any matches.\n */\nexport function applyPatterns(\n artifact: Artifact,\n patterns: PatternDefinition[],\n options?: { changedFiles?: Set<string> }\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n\n for (const pattern of patterns) {\n const patternMatches = matchPattern(artifact, pattern, options?.changedFiles);\n matches.push(...patternMatches);\n }\n\n return matches;\n}\n\n/**\n * Match a single pattern against an artifact.\n */\nfunction matchPattern(artifact: Artifact, pattern: PatternDefinition, changedFiles?: Set<string>): PatternMatch[] {\n const matches: PatternMatch[] = [];\n const detection = pattern.detection;\n\n if (!detection) {\n return matches;\n }\n\n let baseFiles = resolveBaseCandidateFiles(artifact, pattern);\n if ((pattern.applicability.filePatterns ?? []).length > 0 && baseFiles.size === 0) {\n return matches;\n }\n\n // When --changed is active, restrict scanning to changed files only\n if (changedFiles && changedFiles.size > 0) {\n const filtered = new Set<string>();\n for (const f of baseFiles) {\n if (changedFiles.has(f)) filtered.add(f);\n }\n baseFiles = filtered;\n if (baseFiles.size === 0) return matches;\n }\n\n const baseFileList = [...baseFiles];\n if (!hasRequiredDependencies(pattern, baseFileList, artifact.targetPath)) {\n return matches;\n }\n if (hasExcludedPattern(pattern, baseFileList)) {\n return matches;\n }\n\n // Check artifact conditions (uses collector output)\n if (detection.artifactConditions) {\n for (const condition of detection.artifactConditions) {\n const conditionMatches = matchArtifactCondition(artifact, pattern, condition);\n matches.push(...conditionMatches);\n }\n }\n\n // Check code patterns (reads source files)\n if (detection.codePatterns && detection.codePatterns.length > 0) {\n matches.push(...matchCodePatterns(artifact, pattern, baseFiles));\n }\n\n return matches;\n}\n\nfunction matchCodePatterns(\n artifact: Artifact,\n pattern: PatternDefinition,\n baseFiles: Set<string>\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n const detection = pattern.detection;\n if (!detection?.codePatterns || detection.codePatterns.length === 0) {\n return matches;\n }\n\n for (const codePattern of detection.codePatterns) {\n const contextInFiles = normalizePatternList(codePattern.context?.inFiles);\n const contextFiles =\n contextInFiles.length > 0\n ? collectFilesFromGlobs(artifact.targetPath, contextInFiles)\n : new Set<string>();\n\n const candidateFiles = intersectFiles(baseFiles, contextFiles);\n if (candidateFiles.size === 0) {\n continue;\n }\n\n for (const filePath of candidateFiles) {\n const relativePath = relative(artifact.targetPath, filePath);\n const fileMatches = matchCodePatternInFile(pattern, codePattern, filePath, relativePath);\n matches.push(...fileMatches);\n }\n }\n\n return matches;\n}\n\nfunction matchCodePatternInFile(\n pattern: PatternDefinition,\n codePattern: CodePattern,\n filePath: string,\n relativePath: string\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n const { lines } = getFileContent(filePath);\n if (lines.length === 0) return matches;\n\n const functionRanges = getFunctionRanges(filePath);\n const validMatches = collectValidMatches(lines, codePattern, functionRanges);\n\n if (!codePattern.invert) {\n for (const match of validMatches) {\n matches.push({\n pattern,\n file: relativePath,\n line: match.lineIndex + 1,\n symbol: match.functionRange?.name,\n evidence: buildCodePatternEvidence(codePattern, false),\n });\n }\n return matches;\n }\n\n const context = codePattern.context;\n if (context?.atFunctionLevel || context?.inFunctions?.length) {\n const targetRanges = functionRanges.filter((range) => {\n if (!context?.inFunctions || context.inFunctions.length === 0) return true;\n return range.name ? context.inFunctions.includes(range.name) : false;\n });\n\n if (targetRanges.length === 0) return matches;\n\n for (const range of targetRanges) {\n const hasMatch = validMatches.some(\n (match) =>\n match.functionRange?.name === range.name &&\n match.lineIndex + 1 >= range.startLine &&\n match.lineIndex + 1 <= range.endLine\n );\n\n if (!hasMatch) {\n matches.push({\n pattern,\n file: relativePath,\n line: range.startLine,\n symbol: range.name,\n evidence: buildCodePatternEvidence(codePattern, true),\n });\n }\n }\n\n return matches;\n }\n\n if (validMatches.length === 0) {\n matches.push({\n pattern,\n file: relativePath,\n line: 1,\n evidence: buildCodePatternEvidence(codePattern, true),\n });\n }\n\n return matches;\n}\n\nfunction collectValidMatches(\n lines: string[],\n codePattern: CodePattern,\n functionRanges: FunctionRange[]\n): Array<{ lineIndex: number; functionRange?: FunctionRange }> {\n const matches: Array<{ lineIndex: number; functionRange?: FunctionRange }> = [];\n const andPatterns = normalizePatternList(codePattern.and);\n const notPatterns = normalizePatternList(codePattern.not);\n\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i] ?? '';\n if (!getMatcher(codePattern.pattern)(line)) continue;\n if (andPatterns.length > 0 && !matchesAll(andPatterns, line)) continue;\n if (notPatterns.length > 0 && !matchesNone(notPatterns, line)) continue;\n if (codePattern.requiresNearby && !meetsNearbyRequirement(lines, i, codePattern.requiresNearby)) continue;\n\n const functionRange = findFunctionForLine(i + 1, functionRanges);\n if (!passesContext(codePattern.context, functionRange)) continue;\n\n matches.push({ lineIndex: i, functionRange });\n }\n\n return matches;\n}\n\nfunction passesContext(\n context: CodePattern['context'] | undefined,\n functionRange: FunctionRange | undefined\n): boolean {\n if (!context) return true;\n\n if (context.atFileLevel && functionRange) return false;\n if (context.atFunctionLevel && !functionRange) return false;\n\n if (context.inFunctions && context.inFunctions.length > 0) {\n if (!functionRange?.name) return false;\n if (!context.inFunctions.includes(functionRange.name)) return false;\n }\n\n return true;\n}\n\nfunction buildCodePatternEvidence(codePattern: CodePattern, isMissing: boolean): string[] {\n const evidence: string[] = [];\n const label = isMissing ? 'Missing code pattern' : 'Matched code pattern';\n evidence.push(`${label}: ${codePattern.pattern}`);\n\n const andPatterns = normalizePatternList(codePattern.and);\n if (andPatterns.length > 0) {\n evidence.push(`Requires: ${andPatterns.join(', ')}`);\n }\n\n const notPatterns = normalizePatternList(codePattern.not);\n if (notPatterns.length > 0) {\n evidence.push(`Excludes: ${notPatterns.join(', ')}`);\n }\n\n if (codePattern.requiresNearby) {\n const nearby = codePattern.requiresNearby;\n const window = nearby.within;\n if (nearby.any && nearby.any.length > 0) {\n evidence.push(`Nearby (±${window}): any ${nearby.any.join(', ')}`);\n }\n if (nearby.all && nearby.all.length > 0) {\n evidence.push(`Nearby (±${window}): all ${nearby.all.join(', ')}`);\n }\n if (nearby.not && nearby.not.length > 0) {\n evidence.push(`Nearby (±${window}): none ${nearby.not.join(', ')}`);\n }\n }\n\n return evidence;\n}\n\n/**\n * Match an artifact condition.\n */\nfunction matchArtifactCondition(\n artifact: Artifact,\n pattern: PatternDefinition,\n condition: { type: string; conditions: Record<string, unknown> }\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n\n switch (condition.type) {\n case 'service':\n matches.push(...matchServiceCondition(artifact, pattern, condition.conditions));\n break;\n\n case 'transactionScope':\n matches.push(...matchTransactionCondition(artifact, pattern, condition.conditions));\n break;\n\n case 'webhookHandler':\n matches.push(...matchWebhookCondition(artifact, pattern, condition.conditions));\n break;\n\n // Add more condition types as needed\n }\n\n return matches;\n}\n\n/**\n * Match service-level conditions.\n */\nfunction matchServiceCondition(\n artifact: Artifact,\n pattern: PatternDefinition,\n conditions: Record<string, unknown>\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n\n if (!artifact.services) {\n return matches;\n }\n\n for (const service of artifact.services) {\n let isMatch = true;\n const evidence: string[] = [];\n\n // Check hasDirective\n const hasDirective = conditions['hasDirective'];\n if (typeof hasDirective === 'string' && hasDirective.length > 0) {\n const filePath = join(artifact.targetPath, service.file);\n const directives = getDirectivePrologue(filePath);\n const hasIt = directives.has(hasDirective);\n if (!hasIt) {\n isMatch = false;\n } else {\n evidence.push(`Has directive: \"${hasDirective}\"`);\n }\n }\n\n // Check missingAuthCall\n const missingAuthCall = conditions['missingAuthCall'] === true;\n if (missingAuthCall && isMatch) {\n // Check if there are any auth calls in this service\n const serviceAuthCalls =\n artifact.authzCalls?.filter((a) => a.file === service.file) ?? [];\n\n if (serviceAuthCalls.length > 0) {\n isMatch = false; // Has auth calls, not missing\n } else {\n evidence.push('No authentication calls found');\n }\n }\n\n if (isMatch && evidence.length > 0) {\n matches.push({\n pattern,\n file: service.file,\n line: service.line,\n symbol: service.name,\n evidence,\n });\n }\n }\n\n return matches;\n}\n\n/**\n * Match transaction-level conditions.\n */\nfunction matchTransactionCondition(\n artifact: Artifact,\n pattern: PatternDefinition,\n conditions: Record<string, unknown>\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n\n if (!artifact.transactionScopes) {\n return matches;\n }\n\n for (const tx of artifact.transactionScopes) {\n let isMatch = true;\n const evidence: string[] = [];\n\n // Check ORM type\n const orm = conditions['orm'];\n if (typeof orm === 'string' && orm.length > 0) {\n // Collector currently does not emit ORM type; fail closed to avoid false matches.\n isMatch = false;\n }\n\n // Check for side effects\n const containsSideEffects = conditions['containsSideEffects'] === true;\n if (containsSideEffects && isMatch) {\n const sideEffectTypes = conditions['sideEffectTypes'];\n const allowedTypes = Array.isArray(sideEffectTypes)\n ? sideEffectTypes.filter((t): t is string => typeof t === 'string')\n : undefined;\n\n const matchingSideEffects = allowedTypes\n ? tx.sideEffects.filter((se) => allowedTypes.includes(se.type))\n : tx.sideEffects;\n\n if (tx.containsSideEffects && matchingSideEffects.length > 0) {\n evidence.push(\n `Side effects inside transaction: ${matchingSideEffects.map((se) => se.type).join(', ')}`\n );\n } else {\n isMatch = false;\n }\n }\n\n if (isMatch && evidence.length > 0) {\n matches.push({\n pattern,\n file: tx.file,\n line: tx.line,\n symbol: tx.functionName,\n evidence,\n });\n }\n }\n\n return matches;\n}\n\n/**\n * Match webhook-level conditions.\n */\nfunction matchWebhookCondition(\n artifact: Artifact,\n pattern: PatternDefinition,\n conditions: Record<string, unknown>\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n\n if (!artifact.webhookHandlers) {\n return matches;\n }\n\n for (const wh of artifact.webhookHandlers) {\n let isMatch = true;\n const evidence: string[] = [];\n\n // Check provider\n const provider = conditions['provider'];\n if (typeof provider === 'string' && provider.length > 0) {\n if (wh.provider?.toLowerCase() !== provider.toLowerCase()) {\n isMatch = false;\n } else {\n evidence.push(`Provider: ${wh.provider}`);\n }\n }\n\n // Check missing signature verification\n const missingSignatureVerification = conditions['missingSignatureVerification'] === true;\n if (missingSignatureVerification && isMatch) {\n const method = wh.signatureVerification?.method;\n if (method && method !== 'none') {\n isMatch = false;\n } else {\n evidence.push('Missing signature verification');\n }\n }\n\n // Check missing idempotency\n const missingIdempotency = conditions['missingIdempotency'] === true;\n if (missingIdempotency && isMatch) {\n if (wh.hasIdempotencyCheck) {\n isMatch = false; // Has check, not missing\n } else {\n evidence.push('Missing idempotency check');\n }\n }\n\n if (isMatch && evidence.length > 0) {\n matches.push({\n pattern,\n file: wh.file,\n line: wh.line,\n symbol: wh.handlerName,\n evidence,\n });\n }\n }\n\n return matches;\n}\n\n// ============================================================================\n// Pattern Finding Conversion\n// ============================================================================\n\n/**\n * Convert pattern matches to findings.\n */\nexport function patternMatchesToFindings(matches: PatternMatch[], source?: Finding['source']): Finding[] {\n return matches.map((match) => ({\n invariantId: match.pattern.invariantId,\n severity: match.pattern.finding.severity,\n message: match.pattern.finding.message,\n evidence: [\n {\n file: match.file,\n line: match.line,\n symbol: match.symbol,\n context: match.evidence.join('; '),\n },\n ],\n requiredProof: match.pattern.finding.requiredProof,\n suggestedTest: match.pattern.finding.suggestedTest,\n structuredEvidence: {\n summary: `Matched Pro Pattern: ${match.pattern.name ?? match.pattern.id}`,\n signals: match.evidence,\n confidence: 'medium',\n },\n ...(source ? { source } : {}),\n }));\n}\n\n// ============================================================================\n// Statistics\n// ============================================================================\n\n/**\n * Get statistics about pattern application.\n */\nexport interface PatternStats {\n patternsLoaded: number;\n patternsApplied: number;\n matchesFound: number;\n frameworksDetected: string[];\n patternsByFramework: Record<string, number>;\n}\n\nexport function getPatternStats(\n patterns: PatternDefinition[],\n matches: PatternMatch[],\n frameworks: string[]\n): PatternStats {\n const patternsByFramework: Record<string, number> = {};\n for (const pattern of patterns) {\n for (const f of pattern.applicability.frameworks) {\n patternsByFramework[f] = (patternsByFramework[f] ?? 0) + 1;\n }\n }\n\n return {\n patternsLoaded: patterns.length,\n patternsApplied: patterns.length,\n matchesFound: matches.length,\n frameworksDetected: frameworks,\n patternsByFramework,\n };\n}\n\n// ============================================================================\n// Local Pattern Loading\n// ============================================================================\n\n/**\n * Load patterns from a local JSON file.\n * Useful for development and testing without cloud connectivity.\n */\nexport async function loadPatternsFromFile(filePath: string): Promise<PatternDefinition[]> {\n try {\n const content = await readFile(filePath, 'utf-8');\n const data = JSON.parse(content) as { patterns?: PatternDefinition[] } | PatternDefinition[];\n\n // Support both { patterns: [...] } and [...] formats\n if (Array.isArray(data)) {\n return data;\n }\n if (data.patterns && Array.isArray(data.patterns)) {\n return data.patterns;\n }\n\n return [];\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to load patterns from ${filePath}: ${message}`);\n }\n}\n\n/**\n * Load patterns from file if it exists, otherwise return empty array.\n * Does not throw on missing file.\n */\nexport async function loadPatternsFromFileIfExists(filePath: string): Promise<PatternDefinition[]> {\n if (!existsSync(filePath)) {\n return [];\n }\n return loadPatternsFromFile(filePath);\n}\n\n// ============================================================================\n// Cache Cleanup\n// ============================================================================\n\n/**\n * Clear all module-level caches used during pattern matching.\n * Call after applyPatterns() to free memory in large repos.\n */\nexport function clearPatternCaches(): void {\n fileDirectiveCache.clear();\n fileContentCache.clear();\n functionRangeCache.clear();\n packageJsonCache.clear();\n matcherCache.clear();\n tsProject = null;\n}\n\n// ============================================================================\n// Bundled Pattern Loading\n// ============================================================================\n\nimport bundledPatternsData from '../patterns/bundled.json' with { type: 'json' };\n\n/**\n * Load bundled source-level patterns shipped with the CLI.\n * These are open, commodity OWASP-type rules that run locally.\n *\n * Patterns with empty frameworks arrays apply to all codebases.\n * Patterns with specific frameworks are filtered to match the detected set.\n */\nexport function loadBundledPatterns(frameworks: string[]): PatternDefinition[] {\n const patterns = bundledPatternsData as unknown as PatternDefinition[];\n return patterns.filter(p =>\n p.applicability.frameworks.length === 0 ||\n p.applicability.frameworks.some(f => frameworks.includes(f.toLowerCase()))\n );\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { DEFAULT_PATTERN_CONFIG };\nexport type { PatternConfig, PatternDefinition, PatternCache };\n","/**\n * Test Patterns for Development\n *\n * These are real patterns used to test the pattern matching engine without\n * requiring cloud connectivity. Enable via:\n * - SECURITYCHECKS_DEV_PATTERNS=1\n * - scheck run --patterns-file ./patterns.json\n *\n * These patterns exercise all major detection mechanisms:\n * - Code patterns (regex, string matching)\n * - Artifact conditions (service, webhook, transaction)\n * - Context constraints (file-level, function-level)\n */\n\nimport type { PatternDefinition } from '@securitychecks/collector';\n\n/**\n * Test patterns for development and testing.\n * These are real patterns that detect actual security issues.\n */\nexport const TEST_PATTERNS: PatternDefinition[] = [\n // ============================================================================\n // Next.js Patterns\n // ============================================================================\n {\n id: 'nextjs.server-action.unprotected',\n version: '1.0.0',\n invariantId: 'AUTHZ.SERVICE_LAYER.ENFORCED',\n name: 'Unprotected Next.js Server Action',\n description:\n 'Server actions with \"use server\" directive should verify authentication before performing mutations.',\n applicability: {\n frameworks: ['nextjs'],\n requiredDependencies: ['next'],\n filePatterns: ['**/app/**/actions.ts', '**/app/**/actions/*.ts', '**/actions/**/*.ts'],\n },\n detection: {\n artifactConditions: [\n {\n type: 'service',\n conditions: {\n hasDirective: 'use server',\n missingAuthCall: true,\n },\n },\n ],\n },\n finding: {\n severity: 'P0',\n message: 'Server action missing authentication check',\n requiredProof: 'Add getServerSession() or auth() check before any mutations',\n suggestedTest: 'POST to server action without session should return 401/redirect',\n references: [\n 'https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations',\n ],\n tags: ['nextjs', 'authz', 'server-actions'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: [\n 'https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations',\n ],\n },\n },\n {\n id: 'nextjs.api-route.unprotected',\n version: '1.0.0',\n invariantId: 'AUTHZ.SERVICE_LAYER.ENFORCED',\n name: 'Unprotected Next.js API Route',\n description:\n 'API routes should verify authentication for mutating operations (POST, PUT, DELETE, PATCH).',\n applicability: {\n frameworks: ['nextjs'],\n requiredDependencies: ['next'],\n filePatterns: ['**/app/api/**/route.ts', '**/pages/api/**/*.ts'],\n },\n detection: {\n codePatterns: [\n {\n pattern: '/export\\\\s+(async\\\\s+)?function\\\\s+(POST|PUT|DELETE|PATCH)/',\n not: ['getServerSession', 'auth()', 'requireAuth', 'authorize'],\n context: {\n atFileLevel: true,\n },\n },\n ],\n },\n finding: {\n severity: 'P0',\n message: 'API route handler missing authentication check',\n requiredProof: 'Add session/auth check at the start of the handler',\n suggestedTest: 'Request without Authorization header should return 401',\n references: ['https://nextjs.org/docs/app/building-your-application/routing/route-handlers'],\n tags: ['nextjs', 'authz', 'api-routes'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://nextjs.org/docs/app/building-your-application/routing/route-handlers'],\n },\n },\n\n // ============================================================================\n // Stripe Webhook Patterns\n // ============================================================================\n {\n id: 'stripe.webhook.no-signature',\n version: '1.0.0',\n invariantId: 'WEBHOOK.SIGNATURE.VERIFIED',\n name: 'Stripe Webhook Missing Signature Verification',\n description:\n 'Stripe webhooks must verify signatures using stripe.webhooks.constructEvent() before processing.',\n applicability: {\n frameworks: ['stripe'],\n requiredDependencies: ['stripe'],\n filePatterns: ['**/webhook*/**/*.ts', '**/api/webhook*/**/*.ts', '**/stripe/**/*.ts'],\n },\n detection: {\n artifactConditions: [\n {\n type: 'webhookHandler',\n conditions: {\n provider: 'stripe',\n missingSignatureVerification: true,\n },\n },\n ],\n codePatterns: [\n {\n pattern: 'stripe-signature',\n not: ['constructEvent', 'verifyWebhook'],\n context: {\n atFileLevel: true,\n },\n invert: true, // Flag when pattern is missing\n },\n ],\n },\n finding: {\n severity: 'P0',\n message: 'Stripe webhook handler missing signature verification',\n requiredProof:\n 'Use stripe.webhooks.constructEvent(body, sig, webhookSecret) to verify signatures',\n suggestedTest: 'Request with invalid stripe-signature header should return 400',\n references: ['https://stripe.com/docs/webhooks/signatures'],\n tags: ['stripe', 'webhook', 'signature'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://stripe.com/docs/webhooks/signatures'],\n },\n },\n {\n id: 'stripe.webhook.no-idempotency',\n version: '1.0.0',\n invariantId: 'WEBHOOK.IDEMPOTENT',\n name: 'Stripe Webhook Missing Idempotency',\n description:\n 'Stripe webhooks should check if an event has already been processed to handle retries safely.',\n applicability: {\n frameworks: ['stripe'],\n requiredDependencies: ['stripe'],\n filePatterns: ['**/webhook*/**/*.ts', '**/api/webhook*/**/*.ts'],\n },\n detection: {\n artifactConditions: [\n {\n type: 'webhookHandler',\n conditions: {\n provider: 'stripe',\n missingIdempotency: true,\n },\n },\n ],\n },\n finding: {\n severity: 'P0',\n message: 'Stripe webhook handler missing idempotency check',\n requiredProof: 'Store processed event IDs and check before processing',\n suggestedTest: 'Sending the same event twice should only process once',\n references: ['https://stripe.com/docs/webhooks/best-practices#handle-duplicate-events'],\n tags: ['stripe', 'webhook', 'idempotency'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://stripe.com/docs/webhooks/best-practices'],\n },\n },\n\n // ============================================================================\n // Prisma Transaction Patterns\n // ============================================================================\n {\n id: 'prisma.transaction.email-inside',\n version: '1.0.0',\n invariantId: 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS',\n name: 'Email Sent Inside Prisma Transaction',\n description:\n 'Sending emails inside a transaction can lead to sent emails for rolled-back operations.',\n applicability: {\n frameworks: ['prisma'],\n requiredDependencies: ['@prisma/client'],\n filePatterns: ['**/*.ts'],\n },\n detection: {\n artifactConditions: [\n {\n type: 'transactionScope',\n conditions: {\n containsSideEffects: true,\n sideEffectTypes: ['email'],\n },\n },\n ],\n },\n finding: {\n severity: 'P0',\n message: 'Email side effect inside database transaction',\n requiredProof: 'Move email sending outside the transaction, after commit succeeds',\n suggestedTest:\n 'Simulate transaction rollback and verify no email was sent',\n references: [\n 'https://www.prisma.io/docs/concepts/components/prisma-client/transactions',\n ],\n tags: ['prisma', 'transaction', 'side-effect'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://www.prisma.io/docs/concepts/components/prisma-client/transactions'],\n },\n },\n {\n id: 'prisma.transaction.webhook-inside',\n version: '1.0.0',\n invariantId: 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS',\n name: 'External API Call Inside Prisma Transaction',\n description:\n 'Calling external APIs inside a transaction can trigger irreversible actions before commit.',\n applicability: {\n frameworks: ['prisma'],\n requiredDependencies: ['@prisma/client'],\n filePatterns: ['**/*.ts'],\n },\n detection: {\n artifactConditions: [\n {\n type: 'transactionScope',\n conditions: {\n containsSideEffects: true,\n sideEffectTypes: ['external_api', 'webhook'],\n },\n },\n ],\n },\n finding: {\n severity: 'P0',\n message: 'External API call inside database transaction',\n requiredProof: 'Move external API calls outside the transaction, after commit',\n suggestedTest: 'Simulate transaction rollback and verify no external call was made',\n references: [\n 'https://www.prisma.io/docs/concepts/components/prisma-client/transactions',\n ],\n tags: ['prisma', 'transaction', 'side-effect', 'api'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://www.prisma.io/docs/concepts/components/prisma-client/transactions'],\n },\n },\n\n // ============================================================================\n // Express Patterns\n // ============================================================================\n {\n id: 'express.route.no-auth-middleware',\n version: '1.0.0',\n invariantId: 'AUTHZ.SERVICE_LAYER.ENFORCED',\n name: 'Express Route Missing Auth Middleware',\n description:\n 'Express routes handling sensitive operations should use authentication middleware.',\n applicability: {\n frameworks: ['express'],\n requiredDependencies: ['express'],\n filePatterns: ['**/routes/**/*.ts', '**/router/**/*.ts', '**/api/**/*.ts'],\n },\n detection: {\n codePatterns: [\n {\n pattern: '/router\\\\.(post|put|delete|patch)\\\\s*\\\\(/',\n not: ['requireAuth', 'isAuthenticated', 'authenticate', 'authMiddleware', 'passport'],\n requiresNearby: {\n within: 5,\n not: ['requireAuth', 'isAuthenticated', 'authenticate', 'authMiddleware'],\n },\n },\n ],\n },\n finding: {\n severity: 'P1',\n message: 'Express route missing authentication middleware',\n requiredProof: 'Add authentication middleware before route handler',\n suggestedTest: 'Request without auth token should return 401',\n references: ['https://expressjs.com/en/guide/using-middleware.html'],\n tags: ['express', 'authz', 'middleware'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://expressjs.com/en/guide/using-middleware.html'],\n },\n },\n\n // ============================================================================\n // BullMQ Job Patterns\n // ============================================================================\n {\n id: 'bullmq.job.no-idempotency',\n version: '1.0.0',\n invariantId: 'JOBS.RETRY_SAFE',\n name: 'BullMQ Job Handler Missing Idempotency',\n description:\n 'BullMQ job handlers should be idempotent to safely handle retries.',\n applicability: {\n frameworks: ['bullmq'],\n requiredDependencies: ['bullmq'],\n filePatterns: ['**/jobs/**/*.ts', '**/workers/**/*.ts', '**/queues/**/*.ts'],\n },\n detection: {\n codePatterns: [\n {\n pattern: '/new\\\\s+Worker\\\\s*\\\\(/',\n not: ['idempotencyKey', 'processedJobs', 'alreadyProcessed', 'jobId'],\n context: {\n atFileLevel: true,\n },\n },\n ],\n },\n finding: {\n severity: 'P1',\n message: 'BullMQ worker may not be idempotent for retries',\n requiredProof: 'Track processed job IDs or use idempotency keys',\n suggestedTest: 'Running the same job twice should produce the same result',\n references: ['https://docs.bullmq.io/guide/retrying-failing-jobs'],\n tags: ['bullmq', 'jobs', 'idempotency'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://docs.bullmq.io/guide/retrying-failing-jobs'],\n },\n },\n];\n\n/**\n * Check if dev patterns should be used.\n */\nexport function shouldUseDevPatterns(): boolean {\n return process.env['SECURITYCHECKS_DEV_PATTERNS'] === '1' ||\n process.env['SECURITYCHECKS_DEV_PATTERNS'] === 'true';\n}\n\n/**\n * Get test patterns filtered by frameworks.\n */\nexport function getTestPatternsForFrameworks(frameworks: string[]): PatternDefinition[] {\n if (frameworks.length === 0) {\n return TEST_PATTERNS;\n }\n\n const normalizedFrameworks = frameworks.map(f => f.toLowerCase());\n return TEST_PATTERNS.filter(pattern =>\n pattern.applicability.frameworks.some(f =>\n normalizedFrameworks.includes(f.toLowerCase())\n )\n );\n}\n","/**\n * Baseline and Waiver Schema Versions\n *\n * These versions are CLI-level (separate from collector artifact schema).\n * Bump these when the storage format changes.\n */\n\nexport const BASELINE_SCHEMA_VERSION = '1.0.0';\nexport const WAIVER_SCHEMA_VERSION = '1.1.0';\n\nexport const WAIVER_REASON_KEYS = [\n 'false_positive',\n 'acceptable_risk',\n 'will_fix_later',\n 'not_applicable',\n 'other',\n] as const;\n\nexport type WaiverReasonKey = typeof WAIVER_REASON_KEYS[number];\n\nexport function isValidWaiverReasonKey(value: string): value is WaiverReasonKey {\n return (WAIVER_REASON_KEYS as readonly string[]).includes(value);\n}\n\n// ============================================================================\n// Baseline Types\n// ============================================================================\n\n/**\n * A baseline entry represents a known finding that should not fail CI.\n * Baselines are used to adopt scheck incrementally on existing codebases.\n */\nexport interface BaselineEntry {\n /** Stable finding ID (invariantId:hash) */\n findingId: string;\n /** The invariant this finding belongs to */\n invariantId: string;\n /** File where the finding was detected */\n file: string;\n /** Symbol (function/class name) if available */\n symbol?: string;\n /** When this was first added to baseline */\n createdAt: string; // ISO date\n /** When this was last seen in a run */\n lastSeenAt: string; // ISO date\n /** Optional notes explaining why this is baselined */\n notes?: string;\n}\n\n/**\n * The baseline file format.\n */\nexport interface BaselineFile {\n /** Schema version for baseline file format */\n schemaVersion: string;\n /** CLI version that generated this file */\n toolVersion: string;\n /** Collector schema version used when generating findings */\n collectorSchemaVersion?: string;\n /** Tool identifier (e.g., \"@securitychecks/cli@0.1.0\") */\n generatedBy: string;\n /** When the baseline was last updated (UTC ISO date) */\n updatedAt: string;\n /** Baseline entries keyed by findingId for O(1) lookup */\n entries: Record<string, BaselineEntry>;\n}\n\n// ============================================================================\n// Waiver Types\n// ============================================================================\n\n/**\n * A waiver temporarily suppresses a finding.\n * Unlike baselines, waivers expire and require explicit justification.\n */\nexport interface WaiverEntry {\n /** Stable finding ID (invariantId:hash) */\n findingId: string;\n /** The invariant this waiver applies to */\n invariantId: string;\n /** File where the finding was detected */\n file: string;\n /** Symbol (function/class name) if available */\n symbol?: string;\n /** Structured waiver reason (optional; aligns with web UI) */\n reasonKey?: WaiverReasonKey;\n /** Why this is being waived (required) */\n reason: string;\n /** Who created the waiver */\n owner: string;\n /** When the waiver expires (ISO date) */\n expiresAt: string;\n /** When the waiver was created */\n createdAt: string; // ISO date\n}\n\n/**\n * The waiver file format.\n */\nexport interface WaiverFile {\n /** Schema version for waiver file format */\n schemaVersion: string;\n /** CLI version that generated this file */\n toolVersion: string;\n /** Tool identifier (e.g., \"@securitychecks/cli@0.1.0\") */\n generatedBy: string;\n /** When the waiver file was last updated (UTC ISO date) */\n updatedAt: string;\n /** Waiver entries keyed by findingId */\n entries: Record<string, WaiverEntry>;\n}\n\n// ============================================================================\n// Empty File Factories\n// ============================================================================\n\n/** Package identifier for generatedBy field */\nexport const CLI_PACKAGE_NAME = '@securitychecks/cli';\n\n/** Get the generatedBy string (package@version) */\nexport function getGeneratedBy(version: string): string {\n return `${CLI_PACKAGE_NAME}@${version}`;\n}\n\nexport function createEmptyBaseline(version: string = '0.0.0'): BaselineFile {\n return {\n schemaVersion: BASELINE_SCHEMA_VERSION,\n toolVersion: version,\n generatedBy: getGeneratedBy(version),\n updatedAt: new Date().toISOString(),\n entries: {},\n };\n}\n\nexport function createEmptyWaiverFile(version: string = '0.0.0'): WaiverFile {\n return {\n schemaVersion: WAIVER_SCHEMA_VERSION,\n toolVersion: version,\n generatedBy: getGeneratedBy(version),\n updatedAt: new Date().toISOString(),\n entries: {},\n };\n}\n","/**\n * Stable Finding ID Generation\n *\n * Generates deterministic, stable IDs for findings that survive:\n * - Re-runs\n * - Ordering changes\n * - Remediation/message tweaks\n * - Minor code refactors\n *\n * IDs are NOT stable across:\n * - Moving code to different files\n * - Renaming functions (these are legitimately different anchors)\n *\n * Format: `${invariantId}:${hash}` (e.g., WEBHOOK.IDEMPOTENT:9c31f0a2b4d1)\n */\n\nimport { createHash } from 'crypto';\nimport type { Finding } from '@securitychecks/collector';\n\n// ============================================================================\n// Identity Payload Extraction\n// ============================================================================\n\n/**\n * Invariant-specific anchor extractors.\n * Each returns additional identity fields beyond the base (invariantId + file + symbol).\n */\ntype AnchorExtractor = (finding: Finding) => Record<string, string>;\n\nconst ANCHOR_EXTRACTORS: Record<string, AnchorExtractor> = {\n // Webhook: include provider from context if available\n 'WEBHOOK.IDEMPOTENT': (finding) => {\n const context = finding.evidence[0]?.context ?? '';\n // Extract provider from context like \"stripe: handleStripeWebhook\"\n const providerMatch = context.match(/^(stripe|github|slack|svix|generic):/i);\n return {\n provider: providerMatch?.[1]?.toLowerCase() ?? '',\n };\n },\n\n // Transaction: include side effect type from message\n 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS': (finding) => {\n // Extract side effect type from message like \"contains email side effect\"\n const typeMatch = finding.message.match(/contains (\\w+) side effect/i);\n return {\n sideEffectType: typeMatch?.[1]?.toLowerCase() ?? '',\n };\n },\n\n // Membership revocation: include mutation type\n 'AUTHZ.MEMBERSHIP.REVOCATION.IMMEDIATE': (finding) => {\n const context = finding.evidence[0]?.context ?? '';\n // Extract mutation type from context\n const mutationMatch = context.match(/mutationType[:\\s]+(\\w+)/i);\n return {\n mutationType: mutationMatch?.[1]?.toLowerCase() ?? '',\n };\n },\n\n // Keys revocation: include entity type\n 'AUTHZ.KEYS.REVOCATION.IMMEDIATE': (finding) => {\n const context = finding.evidence[0]?.context ?? '';\n const entityMatch = context.match(/entity[:\\s]+(\\w+)/i);\n return {\n entity: entityMatch?.[1]?.toLowerCase() ?? '',\n };\n },\n};\n\n/**\n * Extract the identity payload for a finding.\n * This is what gets hashed to produce the findingId.\n */\nexport function extractIdentityPayload(finding: Finding): Record<string, string> {\n const primary = finding.evidence[0];\n\n // Base identity: invariantId + file + symbol\n const base: Record<string, string> = {\n invariantId: finding.invariantId.toLowerCase(),\n file: normalizePath(primary?.file ?? ''),\n symbol: (primary?.symbol ?? '').toLowerCase(),\n };\n\n // Add invariant-specific anchors\n const extractor = ANCHOR_EXTRACTORS[finding.invariantId];\n if (extractor) {\n const anchors = extractor(finding);\n Object.assign(base, anchors);\n }\n\n return base;\n}\n\n// ============================================================================\n// Path Normalization\n// ============================================================================\n\n/**\n * Normalize file path for consistent hashing.\n * - Use forward slashes\n * - Remove leading ./ or /\n * - Lowercase\n * - Trim whitespace\n */\nfunction normalizePath(path: string): string {\n return path\n .trim()\n .replace(/\\\\/g, '/') // Windows backslashes\n .replace(/^\\.\\//, '') // Leading ./\n .replace(/^\\//, '') // Leading /\n .toLowerCase();\n}\n\n// ============================================================================\n// Hash Generation\n// ============================================================================\n\n/**\n * Generate a short, stable hash from the identity payload.\n * Uses SHA-256 truncated to 12 hex characters.\n */\nfunction hashPayload(payload: Record<string, string>): string {\n // Sort keys for deterministic ordering\n const keys = Object.keys(payload).sort();\n const canonical = keys.map((k) => `${k}:${payload[k]}`).join('|');\n\n const hash = createHash('sha256').update(canonical).digest('hex');\n\n // Take first 12 characters for readability while maintaining uniqueness\n return hash.slice(0, 12);\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Generate a stable findingId for a finding.\n *\n * @example\n * const id = generateFindingId(finding);\n * // \"WEBHOOK.IDEMPOTENT:9c31f0a2b4d1\"\n */\nexport function generateFindingId(finding: Finding): string {\n const payload = extractIdentityPayload(finding);\n const hash = hashPayload(payload);\n return `${finding.invariantId}:${hash}`;\n}\n\n/**\n * Add findingId to a finding (mutates the finding).\n * Returns the same finding for chaining.\n */\nexport function attachFindingId<T extends Finding>(finding: T): T & { findingId: string } {\n const findingId = generateFindingId(finding);\n return Object.assign(finding, { findingId });\n}\n\n/**\n * Add findingIds to all findings in a list.\n */\nexport function attachFindingIds<T extends Finding>(findings: T[]): (T & { findingId: string })[] {\n return findings.map(attachFindingId);\n}\n\n// ============================================================================\n// Baseline/Waiver Types\n// ============================================================================\n\n/**\n * A baseline entry stores known findings that should not fail CI.\n */\nexport interface BaselineEntry {\n findingId: string;\n invariantId: string;\n file: string;\n symbol?: string;\n firstSeenAt: string; // ISO date\n lastSeenAt: string; // ISO date\n}\n\n/**\n * A waiver temporarily suppresses a finding.\n */\nexport interface WaiverEntry {\n findingId: string;\n invariantId: string;\n reasonKey?: string;\n reason: string;\n expiresAt: string; // ISO date\n createdBy: string;\n createdAt: string; // ISO date\n}\n\n/**\n * Convert a finding to a baseline entry.\n */\nexport function toBaselineEntry(finding: Finding & { findingId: string }): BaselineEntry {\n const now = new Date().toISOString();\n return {\n findingId: finding.findingId,\n invariantId: finding.invariantId,\n file: finding.evidence[0]?.file ?? '',\n symbol: finding.evidence[0]?.symbol,\n firstSeenAt: now,\n lastSeenAt: now,\n };\n}\n","/**\n * Baseline and Waiver Storage\n *\n * Handles loading, saving, and managing baseline/waiver files.\n * Files are stored in `.scheck/` directory.\n */\n\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport type { Finding } from '@securitychecks/collector';\nimport { generateFindingId } from '../findings/finding-id.js';\nimport {\n BASELINE_SCHEMA_VERSION,\n WAIVER_SCHEMA_VERSION,\n createEmptyBaseline,\n createEmptyWaiverFile,\n getGeneratedBy,\n type BaselineFile,\n type WaiverFile,\n type WaiverEntry,\n} from './schema.js';\n\n// Version injected at build time via tsup define\nconst CLI_VERSION: string = process.env['CLI_VERSION'] ?? '0.0.0-dev';\n\n// ============================================================================\n// File Paths\n// ============================================================================\n\nconst SCHECK_DIR = '.scheck';\nconst BASELINE_FILE = 'baseline.json';\nconst WAIVER_FILE = 'waivers.json';\n\nexport function getBaselinePath(rootPath: string): string {\n return join(rootPath, SCHECK_DIR, BASELINE_FILE);\n}\n\nexport function getWaiverPath(rootPath: string): string {\n return join(rootPath, SCHECK_DIR, WAIVER_FILE);\n}\n\n// ============================================================================\n// Baseline Storage\n// ============================================================================\n\n/**\n * Load the baseline file, creating an empty one if it doesn't exist.\n */\nexport async function loadBaseline(rootPath: string): Promise<BaselineFile> {\n const path = getBaselinePath(rootPath);\n\n if (!existsSync(path)) {\n return createEmptyBaseline(CLI_VERSION);\n }\n\n try {\n const content = await readFile(path, 'utf-8');\n const data = JSON.parse(content) as BaselineFile;\n\n // Migrate: add missing fields for older files\n if (!data.schemaVersion) {\n data.schemaVersion = BASELINE_SCHEMA_VERSION;\n }\n if (!data.toolVersion) {\n data.toolVersion = CLI_VERSION;\n }\n if (!data.generatedBy) {\n data.generatedBy = getGeneratedBy(CLI_VERSION);\n }\n\n return data;\n } catch {\n // Corrupted file, return empty baseline\n console.warn(`Warning: Could not parse baseline file at ${path}, using empty baseline`);\n return createEmptyBaseline(CLI_VERSION);\n }\n}\n\n/**\n * Save the baseline file with deterministic ordering.\n */\nexport async function saveBaseline(\n rootPath: string,\n baseline: BaselineFile,\n collectorSchemaVersion?: string\n): Promise<void> {\n const path = getBaselinePath(rootPath);\n\n // Ensure directory exists\n await mkdir(dirname(path), { recursive: true });\n\n // Update metadata\n baseline.updatedAt = new Date().toISOString();\n baseline.toolVersion = CLI_VERSION;\n baseline.generatedBy = getGeneratedBy(CLI_VERSION);\n if (collectorSchemaVersion) {\n baseline.collectorSchemaVersion = collectorSchemaVersion;\n }\n\n // Create deterministically ordered output (field order matters for diffs)\n // Using spread with explicit ordering to ensure consistent JSON output\n const orderedBaseline = {\n schemaVersion: baseline.schemaVersion,\n toolVersion: baseline.toolVersion,\n ...(baseline.collectorSchemaVersion ? { collectorSchemaVersion: baseline.collectorSchemaVersion } : {}),\n generatedBy: baseline.generatedBy,\n updatedAt: baseline.updatedAt,\n entries: sortEntriesByFindingId(baseline.entries),\n };\n\n // Write with 2-space indent and trailing newline\n await writeFile(path, JSON.stringify(orderedBaseline, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Sort entries by findingId for deterministic output.\n */\nfunction sortEntriesByFindingId<T extends { findingId: string }>(\n entries: Record<string, T>\n): Record<string, T> {\n const sorted: Record<string, T> = {};\n const keys = Object.keys(entries).sort();\n for (const key of keys) {\n sorted[key] = entries[key] as T;\n }\n return sorted;\n}\n\n/**\n * Add findings to the baseline.\n * Returns the number of new entries added.\n */\nexport function addToBaseline(\n baseline: BaselineFile,\n findings: Finding[],\n notes?: string\n): number {\n const now = new Date().toISOString();\n let added = 0;\n\n for (const finding of findings) {\n const findingId = generateFindingId(finding);\n\n if (!baseline.entries[findingId]) {\n baseline.entries[findingId] = {\n findingId,\n invariantId: finding.invariantId,\n file: finding.evidence[0]?.file ?? '',\n symbol: finding.evidence[0]?.symbol,\n createdAt: now,\n lastSeenAt: now,\n notes,\n };\n added++;\n } else {\n // Update lastSeenAt for existing entries\n baseline.entries[findingId].lastSeenAt = now;\n }\n }\n\n return added;\n}\n\n/**\n * Check if a finding is in the baseline.\n */\nexport function isInBaseline(baseline: BaselineFile, finding: Finding): boolean {\n const findingId = generateFindingId(finding);\n return findingId in baseline.entries;\n}\n\n/**\n * Remove stale entries that haven't been seen in a certain number of days.\n * Returns the number of entries removed.\n */\nexport function pruneBaseline(baseline: BaselineFile, staleDays: number = 90): number {\n const cutoff = new Date();\n cutoff.setDate(cutoff.getDate() - staleDays);\n const cutoffIso = cutoff.toISOString();\n\n let removed = 0;\n for (const [id, entry] of Object.entries(baseline.entries)) {\n if (entry.lastSeenAt < cutoffIso) {\n delete baseline.entries[id];\n removed++;\n }\n }\n\n return removed;\n}\n\n// ============================================================================\n// Waiver Storage\n// ============================================================================\n\n/**\n * Load the waiver file, creating an empty one if it doesn't exist.\n */\nexport async function loadWaivers(rootPath: string): Promise<WaiverFile> {\n const path = getWaiverPath(rootPath);\n\n if (!existsSync(path)) {\n return createEmptyWaiverFile(CLI_VERSION);\n }\n\n try {\n const content = await readFile(path, 'utf-8');\n const data = JSON.parse(content) as WaiverFile;\n\n // Migrate: add missing fields for older files\n if (!data.schemaVersion) {\n data.schemaVersion = WAIVER_SCHEMA_VERSION;\n }\n if (!data.toolVersion) {\n data.toolVersion = CLI_VERSION;\n }\n if (!data.generatedBy) {\n data.generatedBy = getGeneratedBy(CLI_VERSION);\n }\n\n return data;\n } catch {\n console.warn(`Warning: Could not parse waiver file at ${path}, using empty waivers`);\n return createEmptyWaiverFile(CLI_VERSION);\n }\n}\n\n/**\n * Save the waiver file with deterministic ordering.\n */\nexport async function saveWaivers(rootPath: string, waivers: WaiverFile): Promise<void> {\n const path = getWaiverPath(rootPath);\n\n await mkdir(dirname(path), { recursive: true });\n\n // Update metadata\n waivers.updatedAt = new Date().toISOString();\n waivers.toolVersion = CLI_VERSION;\n waivers.generatedBy = getGeneratedBy(CLI_VERSION);\n\n // Create deterministically ordered output (field order matters for diffs)\n const orderedWaivers = {\n schemaVersion: waivers.schemaVersion,\n toolVersion: waivers.toolVersion,\n generatedBy: waivers.generatedBy,\n updatedAt: waivers.updatedAt,\n entries: sortEntriesByFindingId(waivers.entries),\n };\n\n // Write with 2-space indent and trailing newline\n await writeFile(path, JSON.stringify(orderedWaivers, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Add a waiver for a finding.\n */\nexport function addWaiver(\n waivers: WaiverFile,\n finding: Finding,\n options: {\n reason: string;\n reasonKey?: WaiverEntry['reasonKey'];\n owner: string;\n expiresInDays: number;\n }\n): WaiverEntry {\n const now = new Date();\n const expiresAt = new Date(now);\n expiresAt.setDate(expiresAt.getDate() + options.expiresInDays);\n\n const findingId = generateFindingId(finding);\n\n const entry: WaiverEntry = {\n findingId,\n invariantId: finding.invariantId,\n file: finding.evidence[0]?.file ?? '',\n symbol: finding.evidence[0]?.symbol,\n reasonKey: options.reasonKey,\n reason: options.reason,\n owner: options.owner,\n expiresAt: expiresAt.toISOString(),\n createdAt: now.toISOString(),\n };\n\n waivers.entries[findingId] = entry;\n return entry;\n}\n\n/**\n * Check if a finding has a valid (non-expired) waiver.\n * Returns the waiver if valid, undefined if expired or not found.\n */\nexport function getValidWaiver(waivers: WaiverFile, finding: Finding): WaiverEntry | undefined {\n const findingId = generateFindingId(finding);\n const waiver = waivers.entries[findingId];\n\n if (!waiver) {\n return undefined;\n }\n\n // Check expiration\n const now = new Date();\n const expiresAt = new Date(waiver.expiresAt);\n\n if (expiresAt < now) {\n // Waiver has expired - behaves as if no waiver exists\n return undefined;\n }\n\n return waiver;\n}\n\n/**\n * Remove expired waivers from the file.\n * Returns the number of waivers removed.\n */\nexport function pruneExpiredWaivers(waivers: WaiverFile): number {\n const now = new Date().toISOString();\n let removed = 0;\n\n for (const [id, entry] of Object.entries(waivers.entries)) {\n if (entry.expiresAt < now) {\n delete waivers.entries[id];\n removed++;\n }\n }\n\n return removed;\n}\n\n/**\n * Get all waivers that are about to expire (within N days).\n */\nexport function getExpiringWaivers(waivers: WaiverFile, withinDays: number = 7): WaiverEntry[] {\n const now = new Date();\n const threshold = new Date(now);\n threshold.setDate(threshold.getDate() + withinDays);\n const thresholdIso = threshold.toISOString();\n\n return Object.values(waivers.entries).filter(\n (entry) => entry.expiresAt > now.toISOString() && entry.expiresAt <= thresholdIso\n );\n}\n","/**\n * Baseline and Waiver Matching\n *\n * Applies baselines and waivers to findings, categorizing them for CI decisions.\n */\n\nimport type { Finding, Severity } from '@securitychecks/collector';\nimport { generateFindingId } from '../findings/finding-id.js';\nimport { isInBaseline, getValidWaiver } from './storage.js';\nimport type { BaselineFile, WaiverFile, WaiverEntry } from './schema.js';\n\n// ============================================================================\n// Categorized Finding Types\n// ============================================================================\n\n/**\n * A finding with its baseline/waiver status resolved.\n */\nexport interface CategorizedFinding extends Finding {\n findingId: string;\n /** Whether this finding is in the baseline */\n isBaselined: boolean;\n /** Active waiver if present */\n waiver?: WaiverEntry;\n /** Whether this finding should fail CI */\n shouldFail: boolean;\n}\n\n/**\n * Result of categorizing findings.\n */\nexport interface CategorizationResult {\n /** All findings with status */\n all: CategorizedFinding[];\n /** New findings not in baseline (may fail CI) */\n new: CategorizedFinding[];\n /** Findings in baseline (won't fail CI) */\n baselined: CategorizedFinding[];\n /** Findings with active waivers (won't fail CI) */\n waived: CategorizedFinding[];\n /** Summary counts */\n counts: {\n total: number;\n new: number;\n baselined: number;\n waived: number;\n willFail: number;\n };\n}\n\n// ============================================================================\n// Categorization Logic\n// ============================================================================\n\n/**\n * Categorize findings against baseline and waivers.\n *\n * @param findings - Raw findings from checkers\n * @param baseline - Loaded baseline file\n * @param waivers - Loaded waiver file\n * @param failSeverities - Which severities should fail CI (default: P0, P1)\n */\nexport function categorizeFindings(\n findings: Finding[],\n baseline: BaselineFile,\n waivers: WaiverFile,\n failSeverities: Severity[] = ['P0', 'P1']\n): CategorizationResult {\n const categorized: CategorizedFinding[] = [];\n const newFindings: CategorizedFinding[] = [];\n const baselinedFindings: CategorizedFinding[] = [];\n const waivedFindings: CategorizedFinding[] = [];\n\n for (const finding of findings) {\n const findingId = generateFindingId(finding);\n const isBaselined = isInBaseline(baseline, finding);\n const waiver = getValidWaiver(waivers, finding);\n\n // Determine if this finding should fail CI\n const isFailSeverity = failSeverities.includes(finding.severity);\n const shouldFail = isFailSeverity && !isBaselined && !waiver;\n\n const categorizedFinding: CategorizedFinding = {\n ...finding,\n findingId,\n isBaselined,\n waiver,\n shouldFail,\n };\n\n categorized.push(categorizedFinding);\n\n if (waiver) {\n waivedFindings.push(categorizedFinding);\n } else if (isBaselined) {\n baselinedFindings.push(categorizedFinding);\n } else {\n newFindings.push(categorizedFinding);\n }\n }\n\n return {\n all: categorized,\n new: newFindings,\n baselined: baselinedFindings,\n waived: waivedFindings,\n counts: {\n total: categorized.length,\n new: newFindings.length,\n baselined: baselinedFindings.length,\n waived: waivedFindings.length,\n willFail: categorized.filter((f) => f.shouldFail).length,\n },\n };\n}\n\n/**\n * Determine CI exit status based on categorized findings.\n *\n * @returns 0 for success, 1 for failure\n */\nexport function getCIExitCode(result: CategorizationResult): number {\n return result.counts.willFail > 0 ? 1 : 0;\n}\n\n/**\n * Get a summary message for CI output.\n */\nexport function getCISummary(result: CategorizationResult): string {\n const { counts } = result;\n\n if (counts.total === 0) {\n return 'No findings detected.';\n }\n\n const parts: string[] = [];\n\n if (counts.willFail > 0) {\n parts.push(`${counts.willFail} new finding(s) require attention`);\n }\n\n if (counts.baselined > 0) {\n parts.push(`${counts.baselined} baselined`);\n }\n\n if (counts.waived > 0) {\n parts.push(`${counts.waived} waived`);\n }\n\n if (counts.willFail === 0) {\n parts.unshift('All findings are baselined or waived');\n }\n\n return parts.join(', ') + '.';\n}\n\n// ============================================================================\n// Collision Detection\n// ============================================================================\n\n/**\n * Detect and handle findingId collisions.\n * Returns findings with unique IDs (appending :a, :b, etc. if needed).\n *\n * This is a defensive measure - collisions should be extremely rare with\n * 12 hex chars of SHA-256, but we define the behavior explicitly.\n */\nexport function resolveCollisions(findings: Finding[]): (Finding & { findingId: string })[] {\n const seen = new Map<string, number>();\n const result: (Finding & { findingId: string })[] = [];\n\n for (const finding of findings) {\n let findingId = generateFindingId(finding);\n\n // Check for collision\n const count = seen.get(findingId) ?? 0;\n if (count > 0) {\n // Append suffix: :a, :b, :c, etc.\n const suffix = String.fromCharCode(96 + count); // a=97, so 96+1=a\n findingId = `${findingId}:${suffix}`;\n }\n seen.set(generateFindingId(finding), count + 1);\n\n result.push({\n ...finding,\n findingId,\n });\n }\n\n return result;\n}\n\n/**\n * Check if there are any findingId collisions in a set of findings.\n * Returns true if collisions exist.\n */\nexport function hasCollisions(findings: Finding[]): boolean {\n const ids = new Set<string>();\n\n for (const finding of findings) {\n const id = generateFindingId(finding);\n if (ids.has(id)) {\n return true;\n }\n ids.add(id);\n }\n\n return false;\n}\n","/**\n * SARIF (Static Analysis Results Interchange Format) output\n *\n * Converts SecurityChecks findings to SARIF format for integration with:\n * - GitHub Code Scanning\n * - VS Code SARIF Viewer\n * - Other security tools\n *\n * @see https://sarifweb.azurewebsites.net/\n */\n\nimport type { AuditResult, Finding } from '@securitychecks/collector';\nimport { getInvariantById } from '@securitychecks/collector';\nimport { generateFindingId } from '../findings/index.js';\n\n// SARIF 2.1.0 types (simplified)\ninterface SarifLog {\n $schema: string;\n version: string;\n runs: SarifRun[];\n}\n\ninterface SarifRun {\n tool: SarifTool;\n results: SarifResult[];\n invocations?: SarifInvocation[];\n}\n\ninterface SarifTool {\n driver: SarifDriver;\n}\n\ninterface SarifDriver {\n name: string;\n informationUri: string;\n version: string;\n rules: SarifRule[];\n}\n\ninterface SarifRule {\n id: string;\n name: string;\n shortDescription: { text: string };\n fullDescription?: { text: string };\n helpUri?: string;\n defaultConfiguration?: {\n level: 'error' | 'warning' | 'note' | 'none';\n };\n properties?: {\n tags?: string[];\n precision?: string;\n 'security-severity'?: string;\n };\n}\n\ninterface SarifResult {\n ruleId: string;\n ruleIndex: number;\n level: 'error' | 'warning' | 'note' | 'none';\n message: { text: string };\n locations?: SarifLocation[];\n fingerprints?: Record<string, string>;\n properties?: Record<string, unknown>;\n}\n\ninterface SarifLocation {\n physicalLocation?: {\n artifactLocation?: {\n uri: string;\n uriBaseId?: string;\n };\n region?: {\n startLine?: number;\n startColumn?: number;\n endLine?: number;\n endColumn?: number;\n };\n };\n}\n\ninterface SarifInvocation {\n executionSuccessful: boolean;\n endTimeUtc?: string;\n}\n\n/**\n * Map SecurityChecks severity to SARIF level\n */\nfunction severityToLevel(severity: string): 'error' | 'warning' | 'note' {\n switch (severity) {\n case 'P0':\n return 'error';\n case 'P1':\n return 'warning';\n case 'P2':\n default:\n return 'note';\n }\n}\n\n/**\n * Map SecurityChecks severity to SARIF security-severity score (0-10)\n * GitHub uses this for severity ordering\n */\nfunction severityToScore(severity: string): string {\n switch (severity) {\n case 'P0':\n return '9.0'; // Critical\n case 'P1':\n return '7.0'; // High\n case 'P2':\n default:\n return '4.0'; // Medium\n }\n}\n\n/**\n * Build SARIF rules from findings\n */\nfunction buildRules(findings: Finding[]): SarifRule[] {\n const seenIds = new Set<string>();\n const rules: SarifRule[] = [];\n\n for (const finding of findings) {\n if (seenIds.has(finding.invariantId)) continue;\n seenIds.add(finding.invariantId);\n\n const invariant = getInvariantById(finding.invariantId);\n\n rules.push({\n id: finding.invariantId,\n name: invariant?.name ?? finding.invariantId,\n shortDescription: {\n text: invariant?.description ?? finding.message,\n },\n fullDescription: invariant\n ? { text: `${invariant.description}\\n\\nRequired proof: ${invariant.requiredProof}` }\n : undefined,\n helpUri: `https://securitychecks.ai/docs/invariants/${finding.invariantId.toLowerCase().replace(/\\./g, '-')}`,\n defaultConfiguration: {\n level: severityToLevel(finding.severity),\n },\n properties: {\n tags: ['security', 'production-invariant'],\n precision: 'high',\n 'security-severity': severityToScore(finding.severity),\n },\n });\n }\n\n return rules;\n}\n\n/**\n * Convert a finding to a SARIF result\n */\nfunction findingToResult(finding: Finding, ruleIndex: number): SarifResult {\n const locations: SarifLocation[] = finding.evidence.map((ev) => ({\n physicalLocation: {\n artifactLocation: {\n uri: ev.file,\n uriBaseId: '%SRCROOT%',\n },\n region: {\n startLine: ev.line,\n startColumn: 1,\n },\n },\n }));\n\n return {\n ruleId: finding.invariantId,\n ruleIndex,\n level: severityToLevel(finding.severity),\n message: {\n text: finding.message,\n },\n locations,\n fingerprints: {\n scheckId: generateFindingId(finding),\n },\n properties: {\n severity: finding.severity,\n waived: finding.waived ?? false,\n },\n };\n}\n\n/**\n * Convert AuditResult to SARIF format\n */\nexport function toSarif(result: AuditResult, version: string): SarifLog {\n const findings = result.results.flatMap((r) => r.findings);\n const rules = buildRules(findings);\n\n // Build rule index map for ruleIndex references\n const ruleIndexMap = new Map<string, number>();\n rules.forEach((rule, index) => {\n ruleIndexMap.set(rule.id, index);\n });\n\n const results = findings.map((finding) =>\n findingToResult(finding, ruleIndexMap.get(finding.invariantId) ?? 0)\n );\n\n return {\n $schema: 'https://json.schemastore.org/sarif-2.1.0.json',\n version: '2.1.0',\n runs: [\n {\n tool: {\n driver: {\n name: 'securitychecks',\n informationUri: 'https://securitychecks.ai',\n version,\n rules,\n },\n },\n results,\n invocations: [\n {\n executionSuccessful: true,\n endTimeUtc: result.runAt,\n },\n ],\n },\n ],\n };\n}\n","/**\n * Finding Correlation Engine\n *\n * Correlates findings across invariants to detect compounding risks.\n * Multiple findings on the same code path often compound each other,\n * creating worse outcomes than the sum of their parts.\n *\n * Key concepts:\n * - Correlated findings: Multiple findings sharing a code path\n * - Compounding risk: Combined severity is higher than individual\n * - Attack path: Narrative of how findings chain together\n *\n * Example:\n * Route: POST /api/webhooks/stripe\n * ├── WEBHOOK.IDEMPOTENT: ✗ No idempotency check\n * ├── TRANSACTION.POST_COMMIT: ✗ Email inside transaction\n * └── Combined: If replayed, sends duplicate emails AND inconsistent DB\n */\n\nimport type {\n Finding,\n Severity,\n CheckResult,\n Artifact,\n} from '@securitychecks/collector';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CorrelatedFinding {\n /** The primary finding (highest severity) */\n primary: Finding;\n /** Related findings on the same code path */\n related: Finding[];\n /** Shared context between findings */\n sharedContext: SharedContext;\n /** How the findings compound each other */\n compoundingEffect: CompoundingEffect;\n /** Adjusted severity based on correlation */\n adjustedSeverity: Severity;\n /** Attack path narrative */\n attackPath?: AttackPath;\n}\n\nexport interface SharedContext {\n /** Common file */\n file?: string;\n /** Common function */\n functionName?: string;\n /** Common route (if applicable) */\n route?: string;\n /** Shared call chain */\n callChain?: string[];\n /** Number of findings in this correlation */\n findingCount: number;\n}\n\nexport interface CompoundingEffect {\n /** Description of how findings compound */\n description: string;\n /** Risk multiplier (1.0 = no change, 2.0 = double risk) */\n riskMultiplier: number;\n /** Signals explaining the compounding */\n signals: string[];\n}\n\nexport interface AttackPath {\n /** Title of the attack path */\n title: string;\n /** Step-by-step narrative */\n steps: AttackStep[];\n /** Overall exploitability */\n exploitability: 'easy' | 'medium' | 'hard';\n /** Impact level */\n impact: 'low' | 'medium' | 'high' | 'critical';\n /** Time window (if applicable) */\n timeWindow?: string;\n}\n\nexport interface AttackStep {\n /** Step number */\n step: number;\n /** Description of this step */\n description: string;\n /** Which finding enables this step */\n invariantId: string;\n /** File/line reference */\n location?: { file: string; line: number };\n}\n\nexport interface CorrelationResult {\n /** All correlated finding groups */\n correlations: CorrelatedFinding[];\n /** Statistics */\n stats: {\n totalFindings: number;\n correlatedFindings: number;\n correlationGroups: number;\n severityEscalations: number;\n };\n}\n\n// ============================================================================\n// Compounding Rules\n// ============================================================================\n\n/**\n * Rules for how finding combinations compound\n */\nconst COMPOUNDING_RULES: Array<{\n invariants: string[];\n effect: CompoundingEffect;\n attackPathTemplate?: Omit<AttackPath, 'steps'>;\n}> = [\n // Webhook + Transaction = Replay causes inconsistent state\n {\n invariants: ['WEBHOOK.IDEMPOTENT', 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS'],\n effect: {\n description: 'Webhook replay can cause duplicate side effects AND inconsistent database state',\n riskMultiplier: 2.0,\n signals: ['webhook_replay', 'transaction_side_effect', 'data_inconsistency'],\n },\n attackPathTemplate: {\n title: 'Webhook Replay Attack with Data Inconsistency',\n exploitability: 'easy',\n impact: 'high',\n timeWindow: 'Immediate - no time limit on replay',\n },\n },\n\n // No auth + No service auth = Complete bypass\n {\n invariants: ['AUTHZ.SERVICE_LAYER.ENFORCED', 'AUTHZ.MEMBERSHIP.REVOCATION.IMMEDIATE'],\n effect: {\n description: 'Missing service-layer auth combined with delayed revocation allows extended unauthorized access',\n riskMultiplier: 2.5,\n signals: ['auth_bypass', 'delayed_revocation', 'privilege_persistence'],\n },\n attackPathTemplate: {\n title: 'Extended Privilege Persistence',\n exploitability: 'medium',\n impact: 'critical',\n timeWindow: 'Until cache expires or session timeout',\n },\n },\n\n // Cache + Membership revocation = Stale permissions\n {\n invariants: ['CACHE.INVALIDATION.ON_AUTH_CHANGE', 'AUTHZ.MEMBERSHIP.REVOCATION.IMMEDIATE'],\n effect: {\n description: 'Membership change without cache invalidation allows continued access via stale cache',\n riskMultiplier: 2.0,\n signals: ['stale_cache', 'permission_leak', 'revocation_bypass'],\n },\n attackPathTemplate: {\n title: 'Stale Permission Cache Exploit',\n exploitability: 'medium',\n impact: 'high',\n timeWindow: 'Cache TTL (often 5-15 minutes)',\n },\n },\n\n // Transaction + Cache = Inconsistent read after rollback\n {\n invariants: ['TRANSACTION.POST_COMMIT.SIDE_EFFECTS', 'CACHE.INVALIDATION.ON_AUTH_CHANGE'],\n effect: {\n description: 'Side effect in transaction + missing cache invalidation can leave cache inconsistent after rollback',\n riskMultiplier: 1.5,\n signals: ['rollback_inconsistency', 'cache_stale', 'side_effect_mismatch'],\n },\n },\n\n // Billing + Auth = Free tier bypass\n {\n invariants: ['BILLING.SERVER_ENFORCED', 'AUTHZ.SERVICE_LAYER.ENFORCED'],\n effect: {\n description: 'Missing billing enforcement + auth gap allows access to paid features without payment',\n riskMultiplier: 2.0,\n signals: ['billing_bypass', 'feature_theft', 'revenue_loss'],\n },\n attackPathTemplate: {\n title: 'Billing Bypass via Auth Gap',\n exploitability: 'medium',\n impact: 'high',\n },\n },\n\n // Jobs + Transaction = Retry causes duplicate side effects\n {\n invariants: ['JOBS.RETRY_SAFE', 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS'],\n effect: {\n description: 'Non-idempotent job with side effects in transaction can cause duplicates on retry',\n riskMultiplier: 1.8,\n signals: ['job_retry', 'duplicate_side_effect', 'data_duplication'],\n },\n },\n\n // API Key + Cache = Revoked key still works\n {\n invariants: ['AUTHZ.KEYS.REVOCATION.IMMEDIATE', 'CACHE.INVALIDATION.ON_AUTH_CHANGE'],\n effect: {\n description: 'API key revocation without cache invalidation allows continued API access',\n riskMultiplier: 2.0,\n signals: ['key_still_valid', 'cache_bypass', 'api_access_leak'],\n },\n attackPathTemplate: {\n title: 'API Key Revocation Bypass',\n exploitability: 'easy',\n impact: 'high',\n timeWindow: 'Until cache expires',\n },\n },\n];\n\n// ============================================================================\n// Main Correlation Function\n// ============================================================================\n\n/**\n * Correlate findings to detect compounding risks\n */\nexport function correlateFindings(\n results: CheckResult[],\n artifact: Artifact\n): CorrelationResult {\n // Flatten all findings\n const allFindings = results.flatMap(r => r.findings);\n\n if (allFindings.length === 0) {\n return {\n correlations: [],\n stats: {\n totalFindings: 0,\n correlatedFindings: 0,\n correlationGroups: 0,\n severityEscalations: 0,\n },\n };\n }\n\n // Group findings by location\n const groups = groupFindingsByLocation(allFindings);\n\n // Find correlations\n const correlations: CorrelatedFinding[] = [];\n let severityEscalations = 0;\n\n for (const group of groups.values()) {\n if (group.length < 2) continue;\n\n // Check if this group matches any compounding rules\n const correlation = findCorrelation(group, artifact);\n if (correlation) {\n correlations.push(correlation);\n if (severityToNumber(correlation.adjustedSeverity) > severityToNumber(correlation.primary.severity)) {\n severityEscalations++;\n }\n }\n }\n\n // Count correlated findings\n const correlatedFindingIds = new Set<string>();\n for (const c of correlations) {\n correlatedFindingIds.add(findingId(c.primary));\n for (const r of c.related) {\n correlatedFindingIds.add(findingId(r));\n }\n }\n\n return {\n correlations,\n stats: {\n totalFindings: allFindings.length,\n correlatedFindings: correlatedFindingIds.size,\n correlationGroups: correlations.length,\n severityEscalations,\n },\n };\n}\n\n// ============================================================================\n// Grouping Logic\n// ============================================================================\n\n/**\n * Group findings by their location (file + function)\n */\nfunction groupFindingsByLocation(findings: Finding[]): Map<string, Finding[]> {\n const groups = new Map<string, Finding[]>();\n\n for (const finding of findings) {\n // Get location key from evidence\n const evidence = finding.evidence[0];\n if (!evidence) continue;\n\n const key = `${evidence.file}:${evidence.symbol ?? 'unknown'}`;\n\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(finding);\n }\n\n return groups;\n}\n\n/**\n * Find correlation for a group of findings\n */\nfunction findCorrelation(\n findings: Finding[],\n _artifact: Artifact\n): CorrelatedFinding | null {\n // Get invariant IDs in this group\n const invariantIds = new Set(findings.map(f => f.invariantId));\n\n // Find matching compounding rule\n let bestMatch: (typeof COMPOUNDING_RULES)[0] | null = null;\n let matchCount = 0;\n\n for (const rule of COMPOUNDING_RULES) {\n const matches = rule.invariants.filter(inv => invariantIds.has(inv));\n if (matches.length >= 2 && matches.length > matchCount) {\n bestMatch = rule;\n matchCount = matches.length;\n }\n }\n\n if (!bestMatch) {\n // No specific rule, but still correlate if multiple findings\n if (findings.length >= 2) {\n return createGenericCorrelation(findings);\n }\n return null;\n }\n\n // Find the matching findings\n const matchingFindings = findings.filter(f =>\n bestMatch!.invariants.includes(f.invariantId)\n );\n\n // Sort by severity (P0 first)\n matchingFindings.sort((a, b) =>\n severityToNumber(b.severity) - severityToNumber(a.severity)\n );\n\n const primary = matchingFindings[0]!;\n const related = matchingFindings.slice(1);\n\n // Build shared context\n const evidence = primary.evidence[0];\n const sharedContext: SharedContext = {\n file: evidence?.file,\n functionName: evidence?.symbol,\n findingCount: matchingFindings.length,\n };\n\n // Calculate adjusted severity\n const adjustedSeverity = calculateAdjustedSeverity(\n primary.severity,\n bestMatch.effect.riskMultiplier\n );\n\n // Build attack path if template exists\n let attackPath: AttackPath | undefined;\n if (bestMatch.attackPathTemplate) {\n attackPath = buildAttackPath(\n bestMatch.attackPathTemplate,\n matchingFindings\n );\n }\n\n return {\n primary,\n related,\n sharedContext,\n compoundingEffect: bestMatch.effect,\n adjustedSeverity,\n attackPath,\n };\n}\n\n/**\n * Create a generic correlation for findings without specific rules\n */\nfunction createGenericCorrelation(findings: Finding[]): CorrelatedFinding {\n // Sort by severity\n findings.sort((a, b) =>\n severityToNumber(b.severity) - severityToNumber(a.severity)\n );\n\n const primary = findings[0]!;\n const related = findings.slice(1);\n const evidence = primary.evidence[0];\n\n return {\n primary,\n related,\n sharedContext: {\n file: evidence?.file,\n functionName: evidence?.symbol,\n findingCount: findings.length,\n },\n compoundingEffect: {\n description: `Multiple security issues in the same location (${findings.length} findings)`,\n riskMultiplier: 1.0 + (findings.length - 1) * 0.2,\n signals: findings.map(f => f.invariantId),\n },\n adjustedSeverity: primary.severity,\n };\n}\n\n// ============================================================================\n// Attack Path Builder\n// ============================================================================\n\n/**\n * Build an attack path from a template and findings\n */\nfunction buildAttackPath(\n template: Omit<AttackPath, 'steps'>,\n findings: Finding[]\n): AttackPath {\n const steps: AttackStep[] = [];\n\n for (let i = 0; i < findings.length; i++) {\n const finding = findings[i]!;\n const evidence = finding.evidence[0];\n\n steps.push({\n step: i + 1,\n description: getAttackStepDescription(finding),\n invariantId: finding.invariantId,\n location: evidence ? { file: evidence.file, line: evidence.line } : undefined,\n });\n }\n\n return {\n ...template,\n steps,\n };\n}\n\n/**\n * Get a description for an attack step based on the finding\n */\nfunction getAttackStepDescription(finding: Finding): string {\n const invariant = finding.invariantId;\n\n switch (invariant) {\n case 'WEBHOOK.IDEMPOTENT':\n return 'Attacker replays webhook request (no idempotency protection)';\n case 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS':\n return 'Side effect fires inside transaction (may be duplicated or inconsistent)';\n case 'AUTHZ.SERVICE_LAYER.ENFORCED':\n return 'Service function called without authorization check';\n case 'AUTHZ.MEMBERSHIP.REVOCATION.IMMEDIATE':\n return 'Membership/role change does not immediately revoke access';\n case 'AUTHZ.KEYS.REVOCATION.IMMEDIATE':\n return 'API key revocation does not immediately invalidate the key';\n case 'CACHE.INVALIDATION.ON_AUTH_CHANGE':\n return 'Auth change does not invalidate cached permissions';\n case 'BILLING.SERVER_ENFORCED':\n return 'Billing/entitlement check bypassed or missing';\n case 'JOBS.RETRY_SAFE':\n return 'Background job is not idempotent (retry causes duplicates)';\n default:\n return finding.message;\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction severityToNumber(severity: Severity): number {\n switch (severity) {\n case 'P0': return 3;\n case 'P1': return 2;\n case 'P2': return 1;\n default: return 0;\n }\n}\n\nfunction numberToSeverity(num: number): Severity {\n if (num >= 3) return 'P0';\n if (num >= 2) return 'P1';\n return 'P2';\n}\n\nfunction calculateAdjustedSeverity(\n baseSeverity: Severity,\n multiplier: number\n): Severity {\n const base = severityToNumber(baseSeverity);\n const adjusted = Math.min(3, Math.ceil(base * multiplier));\n return numberToSeverity(adjusted);\n}\n\nfunction findingId(finding: Finding): string {\n const evidence = finding.evidence[0];\n return `${finding.invariantId}:${evidence?.file ?? 'unknown'}:${evidence?.line ?? 0}`;\n}\n\n// ============================================================================\n// Formatters\n// ============================================================================\n\n/**\n * Format a correlated finding for display\n */\nexport function formatCorrelatedFinding(correlation: CorrelatedFinding): string {\n const lines: string[] = [];\n\n // Header\n const location = correlation.sharedContext.file\n ? `${correlation.sharedContext.file}:${correlation.sharedContext.functionName ?? 'unknown'}`\n : 'Unknown location';\n\n lines.push(`\\n┌─ CORRELATED FINDINGS ─ ${location}`);\n lines.push(`│`);\n\n // Primary finding\n lines.push(`│ [${correlation.adjustedSeverity}] ${correlation.primary.message}`);\n lines.push(`│ └─ ${correlation.primary.invariantId}`);\n\n // Related findings\n for (const related of correlation.related) {\n lines.push(`│ [${related.severity}] ${related.message}`);\n lines.push(`│ └─ ${related.invariantId}`);\n }\n\n lines.push(`│`);\n\n // Compounding effect\n lines.push(`│ ⚠ Compounding Effect:`);\n lines.push(`│ ${correlation.compoundingEffect.description}`);\n lines.push(`│ Risk multiplier: ${correlation.compoundingEffect.riskMultiplier}x`);\n\n // Attack path (if available)\n if (correlation.attackPath) {\n lines.push(`│`);\n lines.push(`│ 🎯 Attack Path: ${correlation.attackPath.title}`);\n lines.push(`│ Exploitability: ${correlation.attackPath.exploitability}`);\n lines.push(`│ Impact: ${correlation.attackPath.impact}`);\n if (correlation.attackPath.timeWindow) {\n lines.push(`│ Time window: ${correlation.attackPath.timeWindow}`);\n }\n lines.push(`│`);\n for (const step of correlation.attackPath.steps) {\n lines.push(`│ ${step.step}. ${step.description}`);\n }\n }\n\n lines.push(`└────────────────────────────────────────`);\n\n return lines.join('\\n');\n}\n\n/**\n * Format correlation statistics\n */\nexport function formatCorrelationStats(result: CorrelationResult): string {\n const { stats } = result;\n\n return `\nCorrelation Analysis:\n Total findings: ${stats.totalFindings}\n Correlated: ${stats.correlatedFindings} (${Math.round(stats.correlatedFindings / stats.totalFindings * 100)}%)\n Correlation groups: ${stats.correlationGroups}\n Severity escalations: ${stats.severityEscalations}\n`.trim();\n}\n\nexport default correlateFindings;\n","/**\n * Correlation Telemetry\n *\n * Reports correlation data to the SecurityChecks SaaS.\n * This builds the data moat around which invariant combinations\n * actually compound risk in production codebases.\n */\n\nimport type { CorrelationResult, CorrelatedFinding } from './correlation.js';\nimport { randomUUID } from 'crypto';\n\n// Default endpoint (can be overridden)\nconst DEFAULT_ENDPOINT = 'https://api.securitychecks.ai/v1/correlations';\n\nexport interface CorrelationTelemetryConfig {\n enabled: boolean;\n endpoint?: string;\n apiKey?: string;\n timeout?: number;\n}\n\ninterface CorrelationObservation {\n invariants: string[];\n context: {\n framework?: string;\n file?: string;\n functionName?: string;\n route?: string;\n };\n stats: {\n findingCount: number;\n severityBefore?: 'P0' | 'P1' | 'P2';\n severityAfter?: 'P0' | 'P1' | 'P2';\n wasEscalated: boolean;\n riskMultiplier?: number;\n };\n attackPath?: {\n title: string;\n exploitability: 'easy' | 'medium' | 'hard';\n impact: 'low' | 'medium' | 'high' | 'critical';\n timeWindow?: string;\n steps: Array<{\n step: number;\n description: string;\n invariantId: string;\n location?: { file: string; line: number };\n }>;\n };\n compoundingEffect?: {\n description: string;\n signals: string[];\n };\n meta: {\n clientVersion: string;\n requestId: string;\n timestamp: string;\n };\n}\n\n/**\n * Convert CorrelatedFinding to observation format for API\n */\nfunction toObservation(\n correlation: CorrelatedFinding,\n framework?: string\n): CorrelationObservation {\n const allFindings = [correlation.primary, ...correlation.related];\n const invariants = [...new Set(allFindings.map(f => f.invariantId))];\n\n return {\n invariants,\n context: {\n framework,\n file: correlation.sharedContext.file,\n functionName: correlation.sharedContext.functionName,\n route: correlation.sharedContext.route,\n },\n stats: {\n findingCount: correlation.sharedContext.findingCount,\n severityBefore: correlation.primary.severity,\n severityAfter: correlation.adjustedSeverity,\n wasEscalated: correlation.adjustedSeverity !== correlation.primary.severity,\n riskMultiplier: correlation.compoundingEffect.riskMultiplier,\n },\n attackPath: correlation.attackPath ? {\n title: correlation.attackPath.title,\n exploitability: correlation.attackPath.exploitability,\n impact: correlation.attackPath.impact,\n timeWindow: correlation.attackPath.timeWindow,\n steps: correlation.attackPath.steps,\n } : undefined,\n compoundingEffect: {\n description: correlation.compoundingEffect.description,\n signals: correlation.compoundingEffect.signals,\n },\n meta: {\n clientVersion: process.env['CLI_VERSION'] ?? '0.0.0',\n requestId: randomUUID(),\n timestamp: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Report correlation results to the SaaS\n */\nexport async function reportCorrelations(\n result: CorrelationResult,\n config: CorrelationTelemetryConfig,\n framework?: string\n): Promise<{ success: boolean; stored?: number; errors?: number }> {\n if (!config.enabled || result.correlations.length === 0) {\n return { success: true, stored: 0 };\n }\n\n const endpoint = config.endpoint ?? DEFAULT_ENDPOINT;\n const timeout = config.timeout ?? 5000;\n\n try {\n const observations = result.correlations.map(c => toObservation(c, framework));\n\n const payload = {\n correlations: observations,\n summary: result.stats,\n meta: {\n clientVersion: process.env['CLI_VERSION'] ?? '0.0.0',\n framework,\n },\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.apiKey && { Authorization: `Bearer ${config.apiKey}` }),\n 'X-Client-Version': process.env['CLI_VERSION'] ?? '0.0.0',\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return { success: false };\n }\n\n const data = await response.json() as { stored?: number; errors?: number };\n return {\n success: true,\n stored: data.stored ?? observations.length,\n errors: data.errors ?? 0,\n };\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (_error) {\n // Telemetry failures shouldn't break the CLI\n return { success: false };\n }\n}\n\n/**\n * Report feedback on a correlation (user marking as accurate/inaccurate)\n */\nexport async function reportCorrelationFeedback(\n requestId: string,\n wasAccurate: boolean,\n reason?: string,\n config?: CorrelationTelemetryConfig\n): Promise<boolean> {\n const endpoint = config?.endpoint ?? DEFAULT_ENDPOINT;\n\n try {\n const response = await fetch(endpoint, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.apiKey && { Authorization: `Bearer ${config.apiKey}` }),\n },\n body: JSON.stringify({\n requestId,\n wasAccurate,\n feedbackReason: reason,\n }),\n });\n\n return response.ok;\n } catch {\n return false;\n }\n}\n\nexport default reportCorrelations;\n","/**\n * Anonymous Telemetry\n *\n * Reports aggregate scan statistics to the SecurityChecks SaaS.\n * NO source code, NO file paths, NO PII - just patterns and numbers.\n *\n * This data powers:\n * - Framework-specific calibration\n * - Pattern effectiveness tracking\n * - Invariant impact analysis\n */\n\nimport { randomUUID } from 'crypto';\nimport type { AuditResult } from '@securitychecks/collector';\nimport type { CorrelationResult } from './correlation.js';\nimport { isValidWaiverReasonKey } from '../baseline/index.js';\nimport type { CategorizationResult } from '../baseline/index.js';\n\n// Default endpoint\nconst DEFAULT_ENDPOINT = 'https://api.securitychecks.ai/v1/telemetry';\n\nexport interface TelemetryConfig {\n enabled: boolean;\n endpoint?: string;\n apiKey?: string;\n timeout?: number;\n}\n\nexport interface ScanTelemetry {\n scanId: string;\n codebase: {\n filesScanned: number;\n servicesCount: number;\n linesOfCode?: number;\n };\n frameworks: string[];\n findings: {\n byInvariant: Record<string, number>;\n byPriority: { P0: number; P1: number; P2: number };\n total: number;\n };\n correlation?: {\n groups: number;\n escalations: number;\n correlatedFindings: number;\n };\n calibration?: {\n calibrated: number;\n suppressed: number;\n };\n patterns?: {\n applied: number;\n findings: number;\n };\n meta: {\n duration?: number;\n clientVersion: string;\n mode?: 'ci' | 'manual' | 'watch';\n ciProvider?: string;\n };\n baseline?: {\n size: number;\n waivers: number;\n newFindings: number;\n };\n feedback?: {\n waivedCount: number;\n waiverReasons: Record<string, number>;\n baselinedCount: number;\n };\n}\n\n/**\n * Build telemetry data from scan results\n */\nexport function buildTelemetry(\n result: AuditResult,\n options: {\n filesScanned: number;\n frameworks: string[];\n correlation?: CorrelationResult;\n categorization?: CategorizationResult;\n calibratedCount?: number;\n suppressedCount?: number;\n patternsApplied?: number;\n patternFindings?: number;\n mode?: 'ci' | 'manual' | 'watch';\n baselineSize?: number;\n waiversCount?: number;\n }\n): ScanTelemetry {\n // Count findings by invariant\n const byInvariant: Record<string, number> = {};\n for (const checkResult of result.results) {\n byInvariant[checkResult.invariantId] = checkResult.findings.length;\n }\n\n // Detect CI provider from environment\n const ciProvider = detectCIProvider();\n\n return {\n scanId: randomUUID(),\n codebase: {\n filesScanned: options.filesScanned,\n servicesCount: result.artifact.services.length,\n },\n frameworks: options.frameworks,\n findings: {\n byInvariant,\n byPriority: result.summary.byPriority,\n total: result.summary.byPriority.P0 + result.summary.byPriority.P1 + result.summary.byPriority.P2,\n },\n correlation: options.correlation ? {\n groups: options.correlation.stats.correlationGroups,\n escalations: options.correlation.stats.severityEscalations,\n correlatedFindings: options.correlation.stats.correlatedFindings,\n } : undefined,\n calibration: (options.calibratedCount !== undefined) ? {\n calibrated: options.calibratedCount,\n suppressed: options.suppressedCount ?? 0,\n } : undefined,\n patterns: (options.patternsApplied !== undefined) ? {\n applied: options.patternsApplied,\n findings: options.patternFindings ?? 0,\n } : undefined,\n meta: {\n duration: result.duration,\n clientVersion: process.env['CLI_VERSION'] ?? '0.0.0',\n mode: options.mode ?? (ciProvider ? 'ci' : 'manual'),\n ciProvider,\n },\n baseline: (options.categorization) ? {\n size: options.baselineSize ?? 0,\n waivers: options.waiversCount ?? 0,\n newFindings: options.categorization.counts.new,\n } : undefined,\n feedback: (options.categorization) ? {\n waivedCount: options.categorization.counts.waived,\n waiverReasons: buildWaiverReasonCounts(options.categorization),\n baselinedCount: options.categorization.counts.baselined,\n } : undefined,\n };\n}\n\n/**\n * Report telemetry to the SaaS\n */\nexport async function reportTelemetry(\n telemetry: ScanTelemetry,\n config: TelemetryConfig\n): Promise<boolean> {\n if (!config.enabled) {\n return true;\n }\n\n const endpoint = config.endpoint ?? DEFAULT_ENDPOINT;\n const timeout = config.timeout ?? 5000;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.apiKey && { Authorization: `Bearer ${config.apiKey}` }),\n 'X-Client-Version': telemetry.meta.clientVersion,\n },\n body: JSON.stringify(telemetry),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n return response.ok;\n } finally {\n clearTimeout(timeoutId);\n }\n } catch {\n // Telemetry failures are silent\n return false;\n }\n}\n\n/**\n * Build waiver reason distribution from categorization result\n */\nfunction buildWaiverReasonCounts(categorization: CategorizationResult): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const finding of categorization.waived) {\n const waiver = finding.waiver;\n if (!waiver) continue;\n const candidate = waiver.reasonKey ?? waiver.reason;\n const key = candidate && isValidWaiverReasonKey(candidate) ? candidate : 'other';\n counts[key] = (counts[key] ?? 0) + 1;\n }\n return counts;\n}\n\n/**\n * Detect CI provider from environment variables\n */\nfunction detectCIProvider(): string | undefined {\n if (process.env['GITHUB_ACTIONS']) return 'github';\n if (process.env['GITLAB_CI']) return 'gitlab';\n if (process.env['JENKINS_URL']) return 'jenkins';\n if (process.env['CIRCLECI']) return 'circleci';\n if (process.env['TRAVIS']) return 'travis';\n if (process.env['BITBUCKET_BUILD_NUMBER']) return 'bitbucket';\n if (process.env['AZURE_PIPELINES']) return 'azure';\n if (process.env['CI']) return 'unknown';\n return undefined;\n}\n\n/**\n * Check if telemetry is opt-out\n */\nexport function isTelemetryDisabled(): boolean {\n return (\n process.env['SECURITYCHECKS_TELEMETRY'] === 'false' ||\n process.env['DO_NOT_TRACK'] === '1'\n );\n}\n\nexport default reportTelemetry;\n","/**\n * Cloud Configuration Management\n *\n * Manages CLI configuration for cloud integration with SecurityChecks.ai\n * Configuration is stored in ~/.securitychecks/config.json\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n/** Configuration directory path */\nconst CONFIG_DIR = join(homedir(), '.securitychecks');\n\n/** Configuration file path */\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.json');\n\n/** Cloud API base URL */\nconst DEFAULT_API_URL = 'https://api.securitychecks.ai';\n\nexport function normalizeApiBaseUrl(input: string): string {\n const value = input.trim();\n if (!value) {\n throw new Error('API URL is empty');\n }\n\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(`Invalid API URL: ${input}`);\n }\n\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw new Error('API URL must start with http:// or https://');\n }\n\n if (url.username || url.password) {\n throw new Error('API URL must not include credentials');\n }\n\n url.hash = '';\n url.search = '';\n\n // Accept both base URLs and v1-style aliases, normalize to a base.\n // Examples:\n // - https://api.securitychecks.ai/v1 -> https://api.securitychecks.ai\n // - https://example.com/api/v1 -> https://example.com\n const pathname = url.pathname.replace(/\\/+$/, '');\n const stripped = pathname\n .replace(/\\/api\\/v1$/i, '')\n .replace(/\\/v1$/i, '');\n url.pathname = stripped.length === 0 ? '/' : `${stripped}/`;\n\n // Remove trailing slash (keep origin+path stable).\n return url.toString().replace(/\\/$/, '');\n}\n\n/**\n * Cloud configuration structure\n */\nexport interface CloudConfig {\n /** API key for authentication */\n apiKey?: string;\n\n /** Default project slug */\n project?: string;\n\n /** API base URL (for self-hosted instances) */\n apiUrl?: string;\n\n /** Enable cloud mode by default */\n cloudEnabled?: boolean;\n\n /** User email (for display purposes) */\n email?: string;\n\n /** Organization name (for display purposes) */\n organization?: string;\n\n /** Last sync timestamp */\n lastSync?: string;\n\n /** Suppress periodic usage awareness banner */\n usageBannerDisabled?: boolean;\n}\n\n/**\n * Ensure configuration directory exists\n */\nasync function ensureConfigDir(): Promise<void> {\n if (!existsSync(CONFIG_DIR)) {\n await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n/**\n * Load cloud configuration from disk\n */\nexport async function loadCloudConfig(): Promise<CloudConfig> {\n try {\n if (!existsSync(CONFIG_FILE)) {\n return {};\n }\n const content = await readFile(CONFIG_FILE, 'utf-8');\n return JSON.parse(content) as CloudConfig;\n } catch {\n return {};\n }\n}\n\n/**\n * Save cloud configuration to disk\n */\nexport async function saveCloudConfig(config: CloudConfig): Promise<void> {\n await ensureConfigDir();\n await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), { encoding: 'utf-8', mode: 0o600 });\n}\n\n/**\n * Update specific configuration values\n */\nexport async function updateCloudConfig(\n updates: Partial<CloudConfig>\n): Promise<CloudConfig> {\n const config = await loadCloudConfig();\n const updated = { ...config, ...updates };\n await saveCloudConfig(updated);\n return updated;\n}\n\n/**\n * Clear cloud configuration\n */\nexport async function clearCloudConfig(): Promise<void> {\n await saveCloudConfig({});\n}\n\n/**\n * Get the effective API key (from config, env, or CLI option)\n */\nexport function getApiKey(cliOption?: string): string | undefined {\n // CLI option takes precedence\n if (cliOption) return cliOption;\n\n // Then environment variable\n const envKey = process.env['SECURITYCHECKS_API_KEY'];\n if (envKey) return envKey;\n\n // Config is loaded async, so this needs to be called after loading config\n return undefined;\n}\n\n/**\n * Get the effective project slug (from config, env, or CLI option)\n */\nexport function getProject(cliOption?: string): string | undefined {\n if (cliOption) return cliOption;\n return process.env['SECURITYCHECKS_PROJECT'];\n}\n\n/**\n * Get the API base URL\n */\nexport function getApiUrl(config: CloudConfig): string {\n const raw = config.apiUrl || process.env['SECURITYCHECKS_API_URL'] || DEFAULT_API_URL;\n return normalizeApiBaseUrl(raw);\n}\n\n/**\n * Check if cloud mode is enabled\n */\nexport function isCloudEnabled(\n config: CloudConfig,\n cliOption?: boolean\n): boolean {\n if (cliOption !== undefined) return cliOption;\n if (process.env['SECURITYCHECKS_CLOUD'] === 'true') return true;\n return config.cloudEnabled ?? false;\n}\n\n/**\n * Format configuration for display\n */\nexport function formatConfig(config: CloudConfig): string {\n const lines: string[] = [];\n\n lines.push('Cloud Configuration:');\n lines.push('');\n\n if (config.apiKey) {\n const masked = config.apiKey.substring(0, 10) + '...' + config.apiKey.slice(-4);\n lines.push(` API Key: ${masked}`);\n } else {\n lines.push(' API Key: (not set)');\n }\n\n lines.push(` Project: ${config.project || '(not set)'}`);\n lines.push(` API URL: ${config.apiUrl || DEFAULT_API_URL}`);\n lines.push(` Cloud Mode: ${config.cloudEnabled ? 'enabled' : 'disabled'}`);\n\n if (config.email) {\n lines.push(` Email: ${config.email}`);\n }\n\n if (config.organization) {\n lines.push(` Organization: ${config.organization}`);\n }\n\n if (config.lastSync) {\n lines.push(` Last Sync: ${config.lastSync}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Validate API key format\n */\nexport function isValidApiKey(key: string): boolean {\n // API keys should start with sc_live_ or sc_test_\n return /^sc_(live|test)_[a-zA-Z0-9]{20,}$/.test(key);\n}\n\nexport { CONFIG_DIR, CONFIG_FILE, DEFAULT_API_URL };\n","/**\n * Cloud Access (Thinware)\n *\n * Local scans always run. Cloud features require an API key.\n */\n\nimport { normalizeApiBaseUrl } from './cloud-config.js';\n\nconst CLOUD_API_KEY_ENV_VARS = [\n 'SECURITYCHECKS_API_KEY',\n 'SECURITYCHECKS_LICENSE_KEY',\n];\n\nconst DEFAULT_CLOUD_BASE_URL = 'https://api.securitychecks.ai';\n\nexport function getCloudApiKey(): string | undefined {\n for (const envVar of CLOUD_API_KEY_ENV_VARS) {\n const value = process.env[envVar];\n if (value) {\n return value;\n }\n }\n return undefined;\n}\n\nexport function formatCloudStatus(apiKey?: string): string {\n if (apiKey) {\n return 'local + cloud (API key detected)';\n }\n return 'local-only (cloud features require SECURITYCHECKS_API_KEY)';\n}\n\nexport function getCloudApiBaseUrl(): string {\n const raw = process.env['SECURITYCHECKS_API_URL'] ?? DEFAULT_CLOUD_BASE_URL;\n return normalizeApiBaseUrl(raw);\n}\n\nexport function getCloudEndpoints(baseUrl?: string): {\n patterns: string;\n calibrate: string;\n telemetry: string;\n correlations: string;\n aggregateCalibration: string;\n} {\n const base = baseUrl ?? getCloudApiBaseUrl();\n return {\n patterns: `${base}/v1/patterns`,\n calibrate: `${base}/v1/calibrate`,\n telemetry: `${base}/v1/telemetry`,\n correlations: `${base}/v1/correlations`,\n aggregateCalibration: `${base}/v1/calibration`,\n };\n}\n","/**\n * Simple file watcher for watch mode\n *\n * Uses Node.js fs.watch with recursive watching where supported (macOS, Windows)\n * Falls back to polling on Linux\n */\n\nimport { watch, statSync, readdirSync } from 'node:fs';\nimport { join, extname } from 'node:path';\nimport { EventEmitter } from 'node:events';\n\nconst DEBOUNCE_MS = 500;\nconst POLL_INTERVAL_MS = 1000;\n\n// File extensions to watch\nconst WATCH_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mts', '.cts']);\n\n// Directories to ignore\nconst IGNORE_DIRS = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n '.next',\n 'coverage',\n '.securitychecks',\n '.scheck',\n]);\n\ninterface WatcherOptions {\n targetPath: string;\n onChanged: () => Promise<void>;\n verbose?: boolean;\n}\n\nexport class FileWatcher extends EventEmitter {\n private targetPath: string;\n private onChanged: () => Promise<void>;\n private verbose: boolean;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private isRunning = false;\n private watchers: ReturnType<typeof watch>[] = [];\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private lastModTimes = new Map<string, number>();\n\n constructor(options: WatcherOptions) {\n super();\n this.targetPath = options.targetPath;\n this.onChanged = options.onChanged;\n this.verbose = options.verbose ?? false;\n }\n\n /**\n * Start watching for file changes\n */\n start(): void {\n // Try recursive watching first (works on macOS, Windows)\n try {\n const watcher = watch(\n this.targetPath,\n { recursive: true },\n (eventType, filename) => {\n if (filename && this.shouldTrigger(filename)) {\n this.scheduleRun(filename);\n }\n }\n );\n\n watcher.on('error', (error) => {\n if (this.verbose) {\n console.error('Watch error:', error.message);\n }\n // Fall back to polling\n this.stopWatchers();\n this.startPolling();\n });\n\n this.watchers.push(watcher);\n\n if (this.verbose) {\n console.log('File watcher started (recursive mode)');\n }\n } catch {\n // Recursive watching not supported, use polling\n this.startPolling();\n }\n }\n\n /**\n * Start polling-based watching (fallback for Linux)\n */\n private startPolling(): void {\n if (this.verbose) {\n console.log('File watcher started (polling mode)');\n }\n\n // Initial scan\n this.scanFiles(this.targetPath);\n\n this.pollTimer = setInterval(() => {\n const changed = this.checkForChanges(this.targetPath);\n if (changed) {\n this.scheduleRun(changed);\n }\n }, POLL_INTERVAL_MS);\n }\n\n /**\n * Scan directory recursively and record modification times\n */\n private scanFiles(dir: string): void {\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (IGNORE_DIRS.has(entry.name)) continue;\n\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n this.scanFiles(fullPath);\n } else if (entry.isFile() && WATCH_EXTENSIONS.has(extname(entry.name))) {\n try {\n const stat = statSync(fullPath);\n this.lastModTimes.set(fullPath, stat.mtimeMs);\n } catch {\n // File may have been deleted\n }\n }\n }\n } catch {\n // Directory may not exist or be readable\n }\n }\n\n /**\n * Check for file changes\n */\n private checkForChanges(dir: string): string | null {\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (IGNORE_DIRS.has(entry.name)) continue;\n\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n const changed = this.checkForChanges(fullPath);\n if (changed) return changed;\n } else if (entry.isFile() && WATCH_EXTENSIONS.has(extname(entry.name))) {\n try {\n const stat = statSync(fullPath);\n const lastMod = this.lastModTimes.get(fullPath);\n\n if (!lastMod || stat.mtimeMs > lastMod) {\n this.lastModTimes.set(fullPath, stat.mtimeMs);\n if (lastMod) return fullPath; // Only trigger on actual changes, not initial scan\n }\n } catch {\n // File may have been deleted\n }\n }\n }\n } catch {\n // Directory may not exist\n }\n\n return null;\n }\n\n /**\n * Check if a file change should trigger a re-run\n */\n private shouldTrigger(filename: string): boolean {\n // Check extension\n const ext = extname(filename);\n if (!WATCH_EXTENSIONS.has(ext)) return false;\n\n // Check for ignored directories in path\n const parts = filename.split(/[/\\\\]/);\n for (const part of parts) {\n if (IGNORE_DIRS.has(part)) return false;\n }\n\n return true;\n }\n\n /**\n * Schedule a run with debouncing\n */\n private scheduleRun(filename: string): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(async () => {\n if (this.isRunning) return;\n\n this.isRunning = true;\n this.emit('change', filename);\n\n try {\n await this.onChanged();\n } catch {\n // Error handled by callback\n } finally {\n this.isRunning = false;\n }\n }, DEBOUNCE_MS);\n }\n\n /**\n * Stop watching\n */\n stop(): void {\n this.stopWatchers();\n\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n }\n\n private stopWatchers(): void {\n for (const watcher of this.watchers) {\n watcher.close();\n }\n this.watchers = [];\n }\n}\n","/**\n * CI Environment Detection\n *\n * Detects CI/CD environment and extracts relevant context\n * (branch, commit SHA, PR number) for proper scan association.\n */\n\nimport { readFileSync } from 'node:fs';\n\nexport interface CIContext {\n /** CI provider name */\n provider: 'github-actions' | 'gitlab-ci' | 'circleci' | 'jenkins' | 'unknown';\n /** Git branch name */\n branch?: string;\n /** Git commit SHA */\n commitSha?: string;\n /** Pull/Merge request number */\n prNumber?: number;\n /** Repository name (owner/repo) */\n repository?: string;\n /** Whether this is a PR/MR event */\n isPullRequest: boolean;\n}\n\n/**\n * Detect CI environment and extract context\n */\nexport function detectCIContext(): CIContext | null {\n // GitHub Actions\n if (process.env['GITHUB_ACTIONS'] === 'true') {\n return detectGitHubActions();\n }\n\n // GitLab CI\n if (process.env['GITLAB_CI'] === 'true') {\n return detectGitLabCI();\n }\n\n // CircleCI\n if (process.env['CIRCLECI'] === 'true') {\n return detectCircleCI();\n }\n\n // Jenkins\n if (process.env['JENKINS_URL']) {\n return detectJenkins();\n }\n\n // Not in CI\n return null;\n}\n\n/**\n * Detect GitHub Actions context\n */\nfunction detectGitHubActions(): CIContext {\n const eventName = process.env['GITHUB_EVENT_NAME'];\n const isPullRequest = eventName === 'pull_request' || eventName === 'pull_request_target';\n const eventPayload = readGitHubEventPayload();\n\n // For PRs, use the head branch; for pushes, parse from GITHUB_REF\n let branch: string | undefined;\n if (isPullRequest) {\n branch = eventPayload?.pull_request?.head?.ref || process.env['GITHUB_HEAD_REF'];\n } else {\n const ref = process.env['GITHUB_REF'] || '';\n // refs/heads/main -> main\n branch = ref.replace(/^refs\\/heads\\//, '');\n }\n\n // In GitHub pull_request workflows, GITHUB_SHA is often the synthetic merge commit.\n // Prefer payload head SHA so we can associate scans to webhook-created PR scans/check-runs.\n const commitSha = isPullRequest\n ? eventPayload?.pull_request?.head?.sha || process.env['GITHUB_SHA']\n : process.env['GITHUB_SHA'];\n\n // Prefer payload PR number, then fallback to refs/pull/<n>/merge parsing.\n let prNumber: number | undefined;\n if (isPullRequest) {\n prNumber = eventPayload?.number;\n if (!prNumber) {\n const prRef = process.env['GITHUB_REF'] || '';\n const match = prRef.match(/refs\\/pull\\/(\\d+)/);\n if (match && match[1]) {\n prNumber = parseInt(match[1], 10);\n }\n }\n }\n\n return {\n provider: 'github-actions',\n branch,\n commitSha,\n prNumber,\n repository: process.env['GITHUB_REPOSITORY'],\n isPullRequest,\n };\n}\n\ninterface GitHubPullRequestPayload {\n number?: number;\n pull_request?: {\n head?: {\n sha?: string;\n ref?: string;\n };\n };\n}\n\nfunction readGitHubEventPayload(): GitHubPullRequestPayload | null {\n const eventPath = process.env['GITHUB_EVENT_PATH'];\n if (!eventPath) {\n return null;\n }\n\n try {\n const raw = readFileSync(eventPath, 'utf8');\n return JSON.parse(raw) as GitHubPullRequestPayload;\n } catch {\n return null;\n }\n}\n\n/**\n * Detect GitLab CI context\n */\nfunction detectGitLabCI(): CIContext {\n const mrIid = process.env['CI_MERGE_REQUEST_IID'];\n const isPullRequest = !!mrIid;\n\n let prNumber: number | undefined;\n if (mrIid) {\n prNumber = parseInt(mrIid, 10);\n }\n\n return {\n provider: 'gitlab-ci',\n branch: process.env['CI_COMMIT_REF_NAME'],\n commitSha: process.env['CI_COMMIT_SHA'],\n prNumber,\n repository: process.env['CI_PROJECT_PATH'],\n isPullRequest,\n };\n}\n\n/**\n * Detect CircleCI context\n */\nfunction detectCircleCI(): CIContext {\n let prNumber: number | undefined;\n const prUrl = process.env['CIRCLE_PULL_REQUEST'];\n if (prUrl) {\n const match = prUrl.match(/\\/pull\\/(\\d+)/);\n if (match && match[1]) {\n prNumber = parseInt(match[1], 10);\n }\n }\n\n return {\n provider: 'circleci',\n branch: process.env['CIRCLE_BRANCH'],\n commitSha: process.env['CIRCLE_SHA1'],\n prNumber,\n repository: `${process.env['CIRCLE_PROJECT_USERNAME']}/${process.env['CIRCLE_PROJECT_REPONAME']}`,\n isPullRequest: !!prUrl,\n };\n}\n\n/**\n * Detect Jenkins context\n */\nfunction detectJenkins(): CIContext {\n const changeId = process.env['CHANGE_ID'];\n const isPullRequest = !!changeId;\n\n let prNumber: number | undefined;\n if (changeId) {\n prNumber = parseInt(changeId, 10);\n }\n\n return {\n provider: 'jenkins',\n branch: process.env['BRANCH_NAME'] || process.env['GIT_BRANCH'],\n commitSha: process.env['GIT_COMMIT'],\n prNumber,\n isPullRequest,\n };\n}\n","/**\n * Cloud Evaluation Client\n *\n * Sends artifacts to the cloud API for async server-side evaluation.\n * Artifacts are stored in R2 and processed by Fly.io workers.\n *\n * Architecture:\n * 1. CLI collects artifact locally (code never leaves)\n * 2. Artifact sent to /api/v1/evaluate, stored in R2\n * 3. Server queues QStash job for Fly.io worker\n * 4. CLI polls /api/v1/scans/{id} until complete\n * 5. Findings returned to CLI for display\n */\n\nimport type { CollectorArtifact, Finding } from '@securitychecks/collector';\nimport { CLIError, ErrorCodes } from './errors.js';\nimport { detectCIContext, type CIContext } from './ci-detect.js';\nimport { gzipSync } from 'node:zlib';\n\n// Re-export for convenience\nexport { detectCIContext, type CIContext } from './ci-detect.js';\n\n/**\n * Build request headers with optional Vercel deployment protection bypass.\n * Set VERCEL_AUTOMATION_BYPASS_SECRET env var to bypass Vercel deployment protection\n * on preview deployments.\n */\nfunction buildHeaders(extra: Record<string, string> = {}): Record<string, string> {\n const headers: Record<string, string> = { ...extra };\n const bypassSecret = process.env['VERCEL_AUTOMATION_BYPASS_SECRET'];\n if (bypassSecret) {\n headers['x-vercel-protection-bypass'] = bypassSecret;\n }\n return headers;\n}\n\nfunction isTruthy(value: string | undefined): boolean {\n if (!value) return false;\n return value === '1' || value.toLowerCase() === 'true' || value.toLowerCase() === 'yes';\n}\n\nexport interface CloudEvaluateOptions {\n /** API key for authentication */\n apiKey: string;\n /** Cloud API base URL */\n baseUrl: string;\n /** Specific invariants to run (default: all) */\n invariants?: string[];\n /** Invariants to skip */\n skip?: string[];\n /** Minimum severity to return */\n severity?: 'P0' | 'P1' | 'P2';\n /** Project slug for scan association */\n projectSlug?: string;\n /** Timeout in ms (default: 300000 = 5 min) */\n timeout?: number;\n /** Poll interval in ms (default: 2000 = 2s) */\n pollInterval?: number;\n /** Progress callback */\n onProgress?: EvaluationProgressCallback;\n /** CI context (auto-detected if not provided) */\n ciContext?: CIContext | null;\n}\n\nexport interface CloudEvaluateResult {\n findings: Finding[];\n stats: {\n invariantsRun: number;\n patternsRun: number;\n findingsCount: number;\n executionMs: number;\n };\n usage: {\n scansUsed: number;\n scansRemaining: number;\n };\n}\n\nexport interface CloudEvaluateError {\n error: string;\n details?: unknown;\n usage?: {\n scansUsed: number;\n scansRemaining: number;\n };\n}\n\n/** Scan status from API */\nexport type ScanStatus = 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED' | 'CANCELLED';\n\n/** Progress callback for evaluation */\nexport type EvaluationProgressCallback = (info: {\n status: ScanStatus;\n message?: string;\n}) => void;\n\n/** Response from submit endpoint */\ninterface SubmitResult {\n scanId: string;\n status: ScanStatus;\n pollUrl: string;\n usage?: {\n scansUsed: number;\n scansRemaining: number;\n };\n}\n\n/** Response from scan status endpoint */\ninterface ScanStatusResult {\n id: string;\n status: ScanStatus;\n findings?: Finding[];\n stats?: {\n invariantsRun: number;\n patternsRun: number;\n findingsCount: number;\n executionMs: number;\n };\n usage?: {\n scansUsed: number;\n scansRemaining: number;\n };\n errorMessage?: string;\n}\n\n/**\n * Check if cloud evaluation is available\n */\nexport function isCloudEvalAvailable(apiKey?: string): boolean {\n return !!apiKey;\n}\n\n/**\n * Build the artifact payload for cloud evaluation\n */\nfunction buildEvaluatePayload(artifact: CollectorArtifact, options: CloudEvaluateOptions) {\n // Auto-detect CI context if not provided\n const ciContext = options.ciContext !== undefined ? options.ciContext : detectCIContext();\n\n return {\n artifact: {\n version: artifact.version,\n schemaVersion: artifact.schemaVersion,\n profile: artifact.profile,\n extractedAt: artifact.extractedAt,\n targetPath: artifact.codebase?.root,\n codebase: {\n file_count: artifact.codebase?.filesScanned ?? 0,\n languages: artifact.codebase?.languages ?? [],\n },\n services: artifact.services,\n authzCalls: artifact.authzCalls ?? [],\n cacheOperations: artifact.cacheOperations ?? [],\n transactionScopes: artifact.transactionScopes ?? [],\n webhookHandlers: artifact.webhookHandlers ?? [],\n jobHandlers: artifact.jobHandlers ?? [],\n membershipMutations: artifact.membershipMutations ?? [],\n tests: artifact.tests ?? [],\n routes: artifact.routes ?? [],\n callGraph: artifact.callGraph,\n dataFlow: artifact.dataFlows?.flows ?? [],\n rlsPolicies: artifact.rlsArtifact?.rlsPolicies ?? [],\n },\n options: {\n invariants: options.invariants,\n skip: options.skip,\n severity: options.severity,\n projectSlug: options.projectSlug,\n // CI context for scan association (enables PR comments)\n branch: ciContext?.branch,\n commitSha: ciContext?.commitSha,\n prNumber: ciContext?.prNumber,\n // Opt-in guard for GitHub PR CI mode to enforce webhook + evaluate env alignment.\n // This is intentionally gated to avoid breaking standalone CLI workflows that do not use GitHub App webhooks.\n requireExistingCiScan:\n ciContext?.provider === 'github-actions' &&\n ciContext?.isPullRequest &&\n isTruthy(process.env['SECURITYCHECKS_REQUIRE_EXISTING_CI_SCAN'])\n ? true\n : undefined,\n },\n };\n}\n\n/**\n * Submit artifact for async evaluation\n * Returns scan ID for polling\n */\nasync function submitForEvaluation(\n artifact: CollectorArtifact,\n options: CloudEvaluateOptions\n): Promise<SubmitResult> {\n const endpoint = `${options.baseUrl}/api/v1/evaluate`;\n const payload = buildEvaluatePayload(artifact, options);\n const json = JSON.stringify(payload);\n const gz = gzipSync(Buffer.from(json, 'utf8'));\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: buildHeaders({\n 'Content-Type': 'application/json',\n 'Content-Encoding': 'gzip',\n Authorization: `Bearer ${options.apiKey}`,\n }),\n body: gz,\n });\n\n if (!response.ok) {\n const errorBody = (await response.json().catch(() => ({}))) as CloudEvaluateError;\n const serverMessage = (errorBody as any)?.message as string | undefined;\n const errorText = serverMessage\n ? `${errorBody.error || 'Cloud API error'}: ${serverMessage}`\n : errorBody.error;\n\n if (response.status === 401) {\n throw new CLIError(ErrorCodes.CLOUD_AUTH_FAILED, 'Invalid API key. Check your SECURITYCHECKS_API_KEY.');\n }\n\n if (response.status === 413) {\n throw new CLIError(\n ErrorCodes.CLOUD_API_ERROR,\n `Artifact too large. ${errorBody.details || 'Contact support if this persists.'}`,\n { details: errorBody.details }\n );\n }\n\n if (response.status === 429) {\n const remaining = errorBody.usage?.scansRemaining ?? 0;\n throw new CLIError(\n ErrorCodes.CLOUD_RATE_LIMITED,\n `Monthly scan limit reached (${remaining} remaining). Upgrade at https://securitychecks.ai/pricing`,\n { details: { scansRemaining: remaining } }\n );\n }\n\n if (response.status === 503) {\n throw new CLIError(ErrorCodes.CLOUD_API_ERROR, 'Cloud evaluation temporarily unavailable. Try again later.');\n }\n\n throw new CLIError(\n ErrorCodes.CLOUD_API_ERROR,\n errorText || `Cloud API error: ${response.status}`,\n { details: errorBody }\n );\n }\n\n return (await response.json()) as SubmitResult;\n}\n\n/**\n * Poll for evaluation results\n * Blocks until scan completes, fails, or times out\n */\nasync function pollForResults(\n scanId: string,\n options: CloudEvaluateOptions\n): Promise<CloudEvaluateResult> {\n const timeout = options.timeout ?? 300000; // 5 min default\n const pollInterval = options.pollInterval ?? 2000; // 2s default\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n const response = await fetch(`${options.baseUrl}/api/v1/scans/${scanId}`, {\n method: 'GET',\n headers: buildHeaders({\n Authorization: `Bearer ${options.apiKey}`,\n }),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new CLIError(ErrorCodes.CLOUD_NOT_FOUND, `Scan ${scanId} not found`);\n }\n throw new CLIError(ErrorCodes.CLOUD_API_ERROR, `Failed to get scan status: ${response.status}`);\n }\n\n const scan = (await response.json()) as ScanStatusResult;\n\n // Report progress\n options.onProgress?.({\n status: scan.status,\n message: scan.status === 'RUNNING' ? 'Evaluating...' : undefined,\n });\n\n if (scan.status === 'COMPLETED') {\n return {\n findings: scan.findings ?? [],\n stats: scan.stats ?? {\n invariantsRun: 0,\n patternsRun: 0,\n findingsCount: scan.findings?.length ?? 0,\n executionMs: Date.now() - startTime,\n },\n usage: scan.usage ?? { scansUsed: 0, scansRemaining: 0 },\n };\n }\n\n if (scan.status === 'FAILED') {\n throw new CLIError(\n ErrorCodes.CLOUD_API_ERROR,\n `Scan failed: ${scan.errorMessage ?? 'Unknown error'}`,\n { details: { scanId, errorMessage: scan.errorMessage } }\n );\n }\n\n if (scan.status === 'CANCELLED') {\n throw new CLIError(ErrorCodes.CLOUD_API_ERROR, 'Scan was cancelled', { details: { scanId } });\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new CLIError(\n ErrorCodes.CHECK_TIMEOUT,\n `Scan timed out after ${timeout / 1000}s. Check dashboard for results.`,\n { details: { timeoutMs: timeout, scanId } }\n );\n}\n\n/**\n * Evaluate artifact via cloud API (async with polling)\n *\n * @param artifact The artifact to evaluate\n * @param options Evaluation options\n * @throws Error if evaluation fails or times out\n */\nexport async function evaluateCloud(\n artifact: CollectorArtifact,\n options: CloudEvaluateOptions\n): Promise<CloudEvaluateResult> {\n // Submit artifact for evaluation\n const { scanId } = await submitForEvaluation(artifact, options);\n\n // Report initial status\n options.onProgress?.({\n status: 'PENDING',\n message: 'Submitted for evaluation...',\n });\n\n // Poll for results\n return pollForResults(scanId, options);\n}\n\n/**\n * Check cloud API health\n */\nexport async function checkCloudHealth(baseUrl: string): Promise<boolean> {\n try {\n const response = await fetch(`${baseUrl}/api/health`, {\n method: 'GET',\n headers: buildHeaders(),\n signal: AbortSignal.timeout(5000),\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Get available invariants from cloud API\n */\nexport async function getCloudInvariants(\n baseUrl: string,\n apiKey: string\n): Promise<Array<{ id: string; name: string; description: string; severity: string }>> {\n const response = await fetch(`${baseUrl}/api/v1/evaluate`, {\n method: 'GET',\n headers: buildHeaders({\n Authorization: `Bearer ${apiKey}`,\n }),\n });\n\n if (!response.ok) {\n throw new CLIError(ErrorCodes.CLOUD_API_ERROR, `Failed to fetch invariants: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n invariants: Array<{ id: string; name: string; description: string; severity: string }>;\n };\n return data.invariants;\n}\n","type Env = Record<string, string | undefined>;\n\nexport function getProjectSlug(env: Env = process.env): string | undefined {\n const raw = env['SECURITYCHECKS_PROJECT'];\n const trimmed = raw?.trim();\n return trimmed ? trimmed : undefined;\n}\n","/**\n * Staff Engineer Templates\n *\n * Shared, stable UX helpers used by:\n * - CLI output (human-readable prompts)\n * - MCP adapters (Claude Code, etc.)\n *\n * Keep these centralized to avoid drift across integration surfaces.\n */\n\nexport type TestFramework = 'jest' | 'vitest' | 'playwright' | (string & {});\n\nexport type InvariantLike = {\n id: string;\n name: string;\n requiredProof?: string;\n};\n\n/**\n * Returns the \"A staff engineer would ask...\" question for each invariant.\n * These are the probing questions that senior engineers ask in code review.\n */\nexport function getStaffQuestion(invariantId: string): string | null {\n const questions: Record<string, string> = {\n 'AUTHZ.SERVICE_LAYER.ENFORCED':\n 'What happens when a background job calls this function directly, bypassing the route?',\n 'AUTHZ.MEMBERSHIP.REVOCATION.IMMEDIATE':\n 'If I remove someone from a team right now, can they still access team resources?',\n 'AUTHZ.KEYS.REVOCATION.IMMEDIATE':\n 'If I revoke this API key, does it stop working immediately or is it cached?',\n 'WEBHOOK.IDEMPOTENT':\n 'What happens when Stripe retries this webhook? Will we double-charge the customer?',\n 'WEBHOOK.SIGNATURE.VERIFIED':\n 'Are we verifying webhook signatures before processing any side effects?',\n 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS':\n 'If this transaction rolls back, did we already send an email the user will never receive?',\n 'TESTS.NO_FALSE_CONFIDENCE':\n 'Is this test actually verifying behavior, or just making CI green?',\n 'CACHE.INVALIDATION.ON_AUTH_CHANGE':\n 'When someone loses access, how long until the cache catches up?',\n 'JOBS.RETRY_SAFE':\n 'If this job runs twice, will we have duplicate data or double-bill someone?',\n 'BILLING.SERVER_ENFORCED':\n 'Can someone bypass the paywall by calling the API directly?',\n 'ANALYTICS.SCHEMA.STABLE':\n 'If someone adds a field here, will it break our dashboards?',\n 'DATAFLOW.UNTRUSTED.SQL_QUERY':\n 'Can untrusted input reach a raw SQL/NoSQL query without strict validation?',\n 'DATAFLOW.UNTRUSTED.COMMAND_EXEC':\n 'Can user input make it into exec/spawn/eval and change what runs?',\n 'DATAFLOW.UNTRUSTED.FILE_ACCESS':\n 'Can user input control file paths or write locations here?',\n 'DATAFLOW.UNTRUSTED.RESPONSE':\n 'Can user input drive redirects or HTML output without sanitization?',\n 'SECRETS.HARDCODED':\n 'If this repo were accidentally made public, what credentials would be exposed?',\n 'CRYPTO.ALGORITHM.STRONG':\n 'Is this encryption strong enough for the data it protects?',\n };\n return questions[invariantId] ?? null;\n}\n\nexport function generateTestSkeleton(\n invariant: InvariantLike | null | undefined,\n framework: TestFramework,\n context?: string\n): string {\n if (!invariant) return 'Unknown invariant';\n\n const testFn = framework === 'jest' ? 'test' : framework === 'playwright' ? 'test' : 'it';\n const describe = framework === 'playwright' ? '' : 'describe';\n\n const wrap = (body: string) => {\n if (framework === 'playwright') {\n return body.trim();\n }\n return `\n${describe}('${escapeString(invariant.name)}', () => {\n${indent(body.trim(), 2)}\n});\n`.trim();\n };\n\n switch (invariant.id) {\n case 'AUTHZ.SERVICE_LAYER.ENFORCED':\n return wrap(`\n${testFn}('denies access without valid authorization', async () => {\n // Arrange: create context without auth\n const unauthorizedContext = { userId: null, tenantId: null };\n\n // Act + Assert: service call should throw (or return a forbidden result)\n await expect(\n yourService.sensitiveOperation({ context: unauthorizedContext })\n ).rejects.toThrow(/unauthorized|forbidden/i);\n});\n\n${testFn}('denies access to wrong-tenant resources', async () => {\n // Arrange: user from tenant-1 trying to access tenant-2 resource\n const context = { userId: 'user-1', tenantId: 'tenant-1' };\n const resourceFromOtherTenant = { id: 'resource-1', tenantId: 'tenant-2' };\n\n // Act + Assert\n await expect(\n yourService.getResource({ context, resourceId: resourceFromOtherTenant.id })\n ).rejects.toThrow(/forbidden|access denied/i);\n});\n`);\n\n case 'AUTHZ.MEMBERSHIP.REVOCATION.IMMEDIATE':\n return wrap(`\n${testFn}('denies access immediately after membership removal', async () => {\n // Arrange: user with team membership\n const userId = 'user-1';\n const teamId = 'team-1';\n await addMemberToTeam(userId, teamId);\n\n // Act: remove membership\n await removeMemberFromTeam(userId, teamId);\n\n // Assert: immediate access denial (no TTL grace period)\n await expect(accessTeamResource({ userId, teamId })).rejects.toThrow(/forbidden|not a member/i);\n});\n`);\n\n case 'WEBHOOK.IDEMPOTENT':\n return wrap(`\n${testFn}('handles duplicate webhook events idempotently', async () => {\n // Arrange: create a webhook event\n const event = { id: 'evt_test_123', type: 'payment.succeeded', data: { amount: 1000 } };\n\n // Act: process the same event twice\n await processWebhook(event);\n await processWebhook(event); // duplicate\n\n // Assert: side effect only happened once\n const payments = await getPaymentRecords();\n expect(payments.filter((p: any) => p.eventId === event.id)).toHaveLength(1);\n});\n\n${testFn}('stores event IDs to prevent duplicates', async () => {\n const event = { id: 'evt_test_456', type: 'payment.succeeded' };\n\n await processWebhook(event);\n\n // Verify idempotency key was stored\n const stored = await getProcessedEventIds();\n expect(stored).toContain(event.id);\n});\n`);\n\n case 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS':\n return wrap(`\n${testFn}('does not send side effects if transaction rolls back', async () => {\n const emailSpy = vi.spyOn(emailService, 'send');\n\n // Act: trigger action that should fail and rollback\n await expect(createOrderWithInvalidData({ /* invalid data causing rollback */ })).rejects.toThrow();\n\n // Assert: no email was sent\n expect(emailSpy).not.toHaveBeenCalled();\n});\n\n${testFn}('sends side effects only after successful commit', async () => {\n const emailSpy = vi.spyOn(emailService, 'send');\n\n // Act: successful order creation\n await createOrder({ productId: 'prod-1', quantity: 1 });\n\n // Assert: email was sent\n expect(emailSpy).toHaveBeenCalledOnce();\n});\n`);\n\n default: {\n const proof = invariant.requiredProof ? invariant.requiredProof : '(see invariant docs)';\n const contextLine = context ? `// Context: ${context}` : '';\n return wrap(`\n${testFn}('enforces ${invariant.id}', async () => {\n // TODO: implement test for ${invariant.id}\n // Required proof: ${proof}\n ${contextLine}\n\n throw new Error('Test not implemented');\n});\n`);\n }\n }\n}\n\nfunction indent(text: string, spaces: number): string {\n const prefix = ' '.repeat(spaces);\n return text\n .split('\\n')\n .map((line) => (line ? `${prefix}${line}` : line))\n .join('\\n');\n}\n\nfunction escapeString(text: string): string {\n return text.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\n","/* eslint-disable max-lines */\n/**\n * Run command - run the staff check on the codebase\n */\n\nimport pc from 'picocolors';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { resolve, dirname, join } from 'node:path';\nimport { collect, loadConfig, resolveTargetPath, DEFAULT_PATTERN_CONFIG } from '@securitychecks/collector';\nimport type { AuditResult, Finding, CollectorArtifact, Artifact, CalibrationConfig, PatternConfig } from '@securitychecks/collector';\nimport { ErrorCodes, isCLIError, wrapError, CLIError } from '../lib/errors.js';\nimport { validateSchemaVersion } from '../lib/schema.js';\nimport { calibrateFindings, getCalibrationStats } from '../lib/calibration.js';\nimport {\n fetchPatterns,\n applyPatterns,\n patternMatchesToFindings,\n detectFrameworks,\n getPatternStats,\n loadPatternsFromFile,\n loadBundledPatterns,\n clearPatternCaches,\n} from '../lib/patterns.js';\nimport {\n TEST_PATTERNS,\n shouldUseDevPatterns,\n getTestPatternsForFrameworks,\n} from '../lib/test-patterns.js';\nimport {\n loadBaseline,\n loadWaivers,\n categorizeFindings,\n getCIExitCode,\n getCISummary,\n type CategorizationResult,\n} from '../baseline/index.js';\nimport { generateFindingId } from '../findings/index.js';\nimport { toSarif } from '../lib/sarif.js';\nimport {\n correlateFindings,\n formatCorrelatedFinding,\n formatCorrelationStats,\n type CorrelationResult,\n} from '../lib/correlation.js';\nimport { reportCorrelations, type CorrelationTelemetryConfig } from '../lib/correlation-telemetry.js';\nimport { buildTelemetry, reportTelemetry, isTelemetryDisabled, type TelemetryConfig } from '../lib/telemetry.js';\nimport {\n fetchAggregateCalibration,\n formatAggregateCalibrationSummary,\n isAggregateCalibrationDisabled,\n type AggregateCalibrationData,\n type AggregateCalibrationConfig,\n} from '../lib/calibration.js';\nimport { getCloudApiKey, getCloudEndpoints, getCloudApiBaseUrl } from '../lib/license.js';\nimport { FileWatcher } from '../lib/watcher.js';\nimport { evaluateCloud } from '../lib/cloud-eval.js';\nimport { getProjectSlug } from '../lib/project-slug.js';\nimport { getStaffQuestion } from '../lib/staff.js';\n\n/** Default artifact cache path */\nconst DEFAULT_ARTIFACT_PATH = '.securitychecks/artifacts.json';\n\n/**\n * Check if a URL points to a local endpoint (localhost or 127.0.0.1).\n * Used to show a warning when using dev/test cloud endpoints.\n */\nfunction isLocalEndpoint(url: string): boolean {\n try {\n const parsed = new URL(url);\n const host = parsed.hostname.toLowerCase();\n return host === 'localhost' || host === '127.0.0.1';\n } catch {\n // If URL parsing fails, check simple string match\n const lower = url.toLowerCase();\n return lower.includes('localhost') || lower.includes('127.0.0.1');\n }\n}\n\ninterface RunOptions {\n path?: string;\n artifact?: string;\n changed?: boolean;\n ci?: boolean;\n only?: string[];\n skip?: string[];\n json?: boolean;\n sarif?: string; // Output path for SARIF file\n quiet?: boolean;\n all?: boolean; // Don't stop early, show everything (including P2)\n includeP2?: boolean; // Include P2 findings (hidden by default)\n // Calibration options\n calibrate?: boolean; // Enable calibration API (default: true from config)\n offline?: boolean; // Disable all API calls (calibration + patterns + cloud eval)\n calibrationEndpoint?: string; // Override calibration API endpoint\n // Pattern options\n patterns?: boolean; // Enable pattern fetching (default: true)\n noPatterns?: boolean; // Disable pattern fetching\n patternEndpoint?: string; // Override pattern API endpoint\n patternsFile?: string; // Load patterns from local file instead of API\n // Watch mode\n watch?: boolean; // Watch for file changes and re-run\n // Usage banner\n noUsageBanner?: boolean; // Suppress periodic usage awareness banner\n // Local scan\n noLocalScan?: boolean; // Skip local source-level pattern scanning\n}\n\n/**\n * Load and validate a pre-collected artifact from scc\n */\nasync function loadArtifact(artifactPath: string): Promise<CollectorArtifact> {\n const fullPath = resolve(artifactPath);\n\n try {\n const content = await readFile(fullPath, 'utf-8');\n const artifact = JSON.parse(content) as CollectorArtifact;\n\n // Validate required fields\n if (!artifact.version) {\n throw new CLIError(\n ErrorCodes.ARTIFACT_INVALID,\n `Invalid artifact: missing 'version' field`\n );\n }\n\n if (artifact.version !== '1.0') {\n throw new CLIError(\n ErrorCodes.ARTIFACT_INVALID,\n `Unsupported artifact version: ${artifact.version} (expected 1.0)`\n );\n }\n\n if (!artifact.profile) {\n throw new CLIError(\n ErrorCodes.ARTIFACT_INVALID,\n `Invalid artifact: missing 'profile' field`\n );\n }\n\n if (!artifact.services || !Array.isArray(artifact.services)) {\n throw new CLIError(\n ErrorCodes.ARTIFACT_INVALID,\n `Invalid artifact: missing or invalid 'services' array`\n );\n }\n\n // Validate schema version compatibility\n const schemaValidation = validateSchemaVersion(artifact.schemaVersion);\n if (!schemaValidation.valid) {\n throw new CLIError(\n ErrorCodes.ARTIFACT_VERSION_MISMATCH,\n schemaValidation.error,\n {\n details: {\n artifactVersion: schemaValidation.artifactVersion,\n currentVersion: schemaValidation.currentVersion,\n remediation: schemaValidation.remediation,\n },\n }\n );\n }\n\n return artifact;\n } catch (error) {\n if (error instanceof CLIError) throw error;\n\n if ((error as { code?: string }).code === 'ENOENT') {\n throw new CLIError(\n ErrorCodes.ARTIFACT_NOT_FOUND,\n `Artifact file not found: ${fullPath}`\n );\n }\n\n throw new CLIError(\n ErrorCodes.ARTIFACT_INVALID,\n `Failed to parse artifact: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n\n/**\n * Convert CollectorArtifact to Artifact for checker compatibility\n */\nfunction toArtifact(artifact: CollectorArtifact): Artifact {\n return {\n version: '1.0',\n extractedAt: artifact.extractedAt,\n targetPath: artifact.codebase.root,\n services: artifact.services,\n authzCalls: artifact.authzCalls ?? [],\n tests: artifact.tests ?? [],\n cacheOperations: artifact.cacheOperations ?? [],\n transactionScopes: artifact.transactionScopes ?? [],\n webhookHandlers: artifact.webhookHandlers ?? [],\n jobHandlers: artifact.jobHandlers ?? [],\n membershipMutations: artifact.membershipMutations ?? [],\n routes: artifact.routes ?? [],\n callGraph: artifact.callGraph,\n rlsArtifact: artifact.rlsArtifact,\n };\n}\n\nfunction normalizeFrameworkList(frameworks: string[]): string[] {\n return Array.from(new Set(frameworks.map((framework) => framework.toLowerCase())));\n}\n\nfunction getCodebaseFrameworks(artifact: CollectorArtifact): string[] | undefined {\n const codebase = artifact.codebase as { frameworks?: string[] };\n return codebase.frameworks;\n}\n\nfunction resolveFrameworks(artifact: CollectorArtifact, fallback: Artifact): string[] {\n const codebaseFrameworks = getCodebaseFrameworks(artifact);\n if (codebaseFrameworks !== undefined) {\n return normalizeFrameworkList(codebaseFrameworks);\n }\n return detectFrameworks(fallback);\n}\n\n/**\n * Resolve calibration config from options and loaded config\n */\nfunction resolveCalibrationConfig(\n options: RunOptions,\n loadedConfig: { calibration?: CalibrationConfig },\n cloudApiKey?: string,\n endpointOverride?: string\n): CalibrationConfig | undefined {\n // --offline flag disables calibration entirely\n if (options.offline) {\n return undefined;\n }\n\n // Start with loaded config (which has defaults)\n const baseConfig = loadedConfig.calibration;\n if (!baseConfig) {\n return undefined;\n }\n\n const apiKey = cloudApiKey ?? baseConfig.apiKey;\n if (!apiKey) {\n return undefined;\n }\n\n // Apply CLI overrides\n const config: CalibrationConfig = {\n ...baseConfig,\n // --calibrate flag explicitly enables\n enabled: options.calibrate ?? baseConfig.enabled,\n // --calibration-endpoint overrides\n endpoint: options.calibrationEndpoint ?? endpointOverride ?? baseConfig.endpoint,\n // API key for cloud calibration\n apiKey,\n };\n\n return config.enabled ? config : undefined;\n}\n\n/**\n * Resolve pattern config from options.\n * Returns config for patterns (from file, dev, or API).\n * Returns undefined only if --no-patterns is explicitly set.\n */\nfunction resolvePatternConfig(\n options: RunOptions,\n cloudApiKey?: string,\n endpointOverride?: string\n): PatternConfig | undefined {\n // --no-patterns explicitly disables all patterns\n if (options.noPatterns) {\n return undefined;\n }\n\n // If using local file or dev patterns, always return config (even offline)\n if (options.patternsFile || shouldUseDevPatterns()) {\n return {\n ...DEFAULT_PATTERN_CONFIG,\n enabled: true,\n endpoint: options.patternEndpoint ?? endpointOverride ?? DEFAULT_PATTERN_CONFIG.endpoint,\n apiKey: cloudApiKey,\n // Mark as offline mode since we're not fetching from API\n offlineMode: true,\n };\n }\n\n // For API-based patterns, need online mode and API key\n if (options.offline || !cloudApiKey) {\n return undefined;\n }\n\n // Start with defaults\n const config: PatternConfig = {\n ...DEFAULT_PATTERN_CONFIG,\n // --patterns flag explicitly enables (default is true)\n enabled: options.patterns ?? true,\n // --pattern-endpoint overrides\n endpoint: options.patternEndpoint ?? endpointOverride ?? DEFAULT_PATTERN_CONFIG.endpoint,\n // API key for cloud patterns\n apiKey: cloudApiKey,\n };\n\n return config.enabled ? config : undefined;\n}\n\n/**\n * Run checks using a pre-collected artifact\n */\ntype CloudEndpoints = ReturnType<typeof getCloudEndpoints>;\n\nasync function runFromArtifact(\n artifact: CollectorArtifact,\n options: RunOptions\n): Promise<{\n result: AuditResult;\n calibrationUsed: boolean;\n patternsUsed: boolean;\n cloudApiKey?: string;\n cloudEndpoints: CloudEndpoints;\n cloudEvalUsed: boolean;\n cloudUsage: { scansUsed: number; scansRemaining: number };\n}> {\n const startTime = Date.now();\n\n // Load config from the artifact's codebase root\n const targetPath = artifact.codebase.root;\n const config = await loadConfig(targetPath);\n const cloudApiKey = getCloudApiKey() ?? config.calibration?.apiKey;\n const cloudBaseUrl = getCloudApiBaseUrl();\n const cloudEndpoints = getCloudEndpoints(cloudBaseUrl);\n\n // Cloud evaluation is required - no local fallback (IP protection)\n if (!cloudApiKey) {\n throw new CLIError(\n ErrorCodes.AUTH_REQUIRED,\n 'API key required for evaluation',\n {\n details: {\n remediation: `Set SECURITYCHECKS_API_KEY environment variable or add apiKey to securitychecks.config.yaml.\nGet your API key at https://securitychecks.ai/dashboard/settings/api-keys`,\n },\n }\n );\n }\n\n if (options.offline) {\n throw new CLIError(\n ErrorCodes.OFFLINE_NOT_SUPPORTED,\n 'Offline mode is not supported',\n {\n details: {\n remediation: `SecurityChecks requires cloud evaluation for IP protection.\nRemove --offline flag to use cloud evaluation.\nFor air-gapped environments, contact sales for an enterprise on-premise license.`,\n },\n }\n );\n }\n\n if (!options.quiet) {\n console.log(pc.dim(`Mode: cloud evaluation (IP protected)`));\n if (isLocalEndpoint(cloudBaseUrl)) {\n console.log(pc.yellow('⚠ Using local cloud endpoint (dev/test)'));\n }\n }\n\n const auditArtifact = toArtifact(artifact);\n\n // Cloud evaluation - all pattern checking happens server-side\n if (!options.quiet) {\n console.log(pc.dim(`Evaluating via cloud API...`));\n }\n\n const cloudEvalResult = await evaluateCloud(artifact, {\n apiKey: cloudApiKey,\n baseUrl: cloudBaseUrl,\n invariants: options.only,\n skip: options.skip,\n // Required to associate CLI uploads with webhook-created scans for the same repo/PR.\n projectSlug: getProjectSlug(),\n });\n\n let findings: Finding[] = cloudEvalResult.findings;\n\n if (!options.quiet) {\n console.log(\n pc.dim(\n `Cloud: ${cloudEvalResult.stats.invariantsRun} invariants, ` +\n `${cloudEvalResult.stats.findingsCount} findings in ${cloudEvalResult.stats.executionMs}ms`\n )\n );\n if (cloudEvalResult.usage.scansRemaining !== Infinity) {\n console.log(\n pc.dim(`Usage: ${cloudEvalResult.usage.scansUsed} scans used, ${cloudEvalResult.usage.scansRemaining} remaining`)\n );\n }\n }\n\n // Track checker results for summary (synthesize from cloud findings)\n interface CheckResult {\n invariantId: string;\n passed: boolean;\n findings: Finding[];\n checkedAt: string;\n duration: number;\n }\n const results: CheckResult[] = [];\n const cloudEvalUsed = true;\n\n // Synthesize results from findings for compatibility\n const findingsByInvariantMap = new Map<string, Finding[]>();\n for (const finding of findings) {\n const existing = findingsByInvariantMap.get(finding.invariantId) ?? [];\n existing.push(finding);\n findingsByInvariantMap.set(finding.invariantId, existing);\n }\n\n // Create synthetic results for each invariant with findings\n for (const [invariantId, invariantFindings] of findingsByInvariantMap) {\n results.push({\n invariantId,\n passed: invariantFindings.length === 0,\n findings: invariantFindings,\n checkedAt: new Date().toISOString(),\n duration: cloudEvalResult.stats.executionMs ?? 0,\n });\n }\n\n // === LOCAL SOURCE-LEVEL PATTERNS ===\n // Cloud eval handles proprietary invariant checks (call graph, artifact-based).\n // Local patterns handle OWASP-type source-level scans (secrets, SQLi, XSS, weak crypto).\n // These are complementary — cloud patterns use artifact metadata, local patterns read source files.\n let patternsUsed = cloudEvalUsed; // Cloud eval includes its own patterns\n\n if (!options.noLocalScan && options.patterns !== false && !options.noPatterns) {\n // Build artifact for pattern matching (includes routes, webhooks, etc.)\n const artifactForPatterns = {\n version: '1.0' as const,\n extractedAt: artifact.extractedAt,\n targetPath: artifact.codebase.root,\n services: artifact.services,\n authzCalls: artifact.authzCalls ?? [],\n cacheOperations: artifact.cacheOperations ?? [],\n transactionScopes: artifact.transactionScopes ?? [],\n webhookHandlers: artifact.webhookHandlers ?? [],\n jobHandlers: artifact.jobHandlers ?? [],\n membershipMutations: artifact.membershipMutations ?? [],\n tests: artifact.tests ?? [],\n routes: artifact.routes ?? [],\n callGraph: artifact.callGraph,\n };\n\n const frameworks = resolveFrameworks(artifact, artifactForPatterns);\n\n if (!options.quiet && frameworks.length > 0) {\n console.log(pc.dim(`Frameworks detected: ${frameworks.join(', ')}`));\n }\n\n try {\n const localScanStart = Date.now();\n let patterns: typeof TEST_PATTERNS = [];\n let patternSource = 'bundled';\n\n // Priority: 1. --patterns-file, 2. SECURITYCHECKS_DEV_PATTERNS, 3. Bundled patterns\n // API-fetched patterns are also merged in when available.\n if (options.patternsFile) {\n if (!options.quiet) {\n console.log(pc.dim(`Loading patterns from ${options.patternsFile}...`));\n }\n patterns = await loadPatternsFromFile(options.patternsFile);\n patternSource = 'file';\n } else if (shouldUseDevPatterns()) {\n if (!options.quiet) {\n console.log(pc.yellow('⚠ Using dev test patterns (SECURITYCHECKS_DEV_PATTERNS=1)'));\n }\n patterns = getTestPatternsForFrameworks(frameworks);\n patternSource = 'dev';\n } else {\n // Load bundled source-level patterns (always available, no API needed)\n patterns = loadBundledPatterns(frameworks);\n patternSource = 'bundled';\n\n // Also try fetching Pro Patterns from API and merge\n const patternConfig = resolvePatternConfig(options, cloudApiKey, cloudEndpoints.patterns);\n if (patternConfig && !patternConfig.offlineMode) {\n try {\n if (!options.quiet) {\n console.log(pc.dim(`Fetching Pro Patterns from ${patternConfig.endpoint}...`));\n }\n const apiPatterns = await fetchPatterns(\n artifactForPatterns,\n patternConfig,\n targetPath,\n frameworks\n );\n if (apiPatterns.length > 0) {\n // Merge API patterns, dedup by id\n const existingIds = new Set(patterns.map(p => p.id));\n for (const ap of apiPatterns) {\n if (!existingIds.has(ap.id)) {\n patterns.push(ap);\n existingIds.add(ap.id);\n }\n }\n patternSource = 'bundled+api';\n }\n } catch {\n // API unavailable — bundled patterns still run\n }\n }\n }\n\n if (patterns.length > 0) {\n patternsUsed = true;\n\n // Apply patterns to find matches\n const matches = applyPatterns(artifactForPatterns, patterns);\n\n // Convert matches to findings\n const patternFindings = patternMatchesToFindings(matches, patternSource === 'bundled+api' ? 'local+api' : 'local');\n\n if (!options.quiet) {\n const stats = getPatternStats(patterns, matches, frameworks);\n const sourceLabel = patternSource === 'bundled' ? '' : ` (${patternSource})`;\n const localScanMs = Date.now() - localScanStart;\n console.log(\n pc.dim(`Local scan: ${stats.patternsLoaded} patterns${sourceLabel}, ${stats.matchesFound} match(es) found in ${localScanMs}ms`)\n );\n }\n\n // Merge pattern findings with checker findings\n // Avoid duplicates by checking invariantId + file + line\n const existingKeys = new Set(\n findings.map((f) => `${f.invariantId}:${f.evidence[0]?.file}:${f.evidence[0]?.line}`)\n );\n\n for (const pf of patternFindings) {\n const key = `${pf.invariantId}:${pf.evidence[0]?.file}:${pf.evidence[0]?.line}`;\n if (!existingKeys.has(key)) {\n findings.push(pf);\n existingKeys.add(key);\n }\n }\n } else if (!options.quiet) {\n console.log(pc.dim(`Local scan: No applicable patterns for detected frameworks`));\n }\n } catch {\n // Pattern loading failed - continue with cloud findings only\n if (!options.quiet) {\n console.log(pc.dim(`Local scan: Pattern loading failed, using cloud findings only`));\n }\n } finally {\n // Free memory from file content caches used during pattern matching\n clearPatternCaches();\n }\n }\n\n // Apply calibration if enabled\n // Skip if cloud evaluation was used (cloud already calibrated)\n // \"The SaaS advises. The local tool decides.\"\n const calibrationConfig = cloudEvalUsed ? undefined : resolveCalibrationConfig(\n options,\n config,\n cloudApiKey,\n cloudEndpoints.calibrate\n );\n let calibrationUsed = cloudEvalUsed; // Cloud eval includes calibration\n\n if (calibrationConfig) {\n if (!options.quiet) {\n console.log(pc.dim(`Calibrating findings via ${calibrationConfig.endpoint}...`));\n }\n\n try {\n // Convert CollectorArtifact to the Artifact type expected by calibration\n const artifactForCalibration = {\n version: '1.0' as const,\n extractedAt: artifact.extractedAt,\n targetPath: artifact.codebase.root,\n services: artifact.services,\n authzCalls: artifact.authzCalls ?? [],\n cacheOperations: artifact.cacheOperations ?? [],\n transactionScopes: artifact.transactionScopes ?? [],\n webhookHandlers: artifact.webhookHandlers ?? [],\n jobHandlers: artifact.jobHandlers ?? [],\n membershipMutations: artifact.membershipMutations ?? [],\n tests: artifact.tests ?? [],\n routes: artifact.routes ?? [],\n callGraph: artifact.callGraph,\n };\n\n findings = await calibrateFindings(\n findings,\n artifactForCalibration,\n calibrationConfig,\n targetPath\n );\n calibrationUsed = true;\n\n if (!options.quiet) {\n const stats = getCalibrationStats(findings);\n if (stats.calibrated > 0) {\n console.log(\n pc.dim(`Calibration: ${stats.applied}/${stats.calibrated} suggestions applied`)\n );\n for (const change of stats.severityChanges) {\n console.log(pc.dim(` ${change.from} → ${change.to}: ${change.count} finding(s)`));\n }\n }\n }\n } catch {\n // Calibration failed - continue with local results\n if (!options.quiet) {\n console.log(pc.dim(`Calibration unavailable, using local results`));\n }\n }\n }\n\n // Update results with calibrated findings\n // (We need to map findings back to their original results)\n const calibratedFindingsByInvariant = new Map<string, Finding[]>();\n for (const finding of findings) {\n const existing = calibratedFindingsByInvariant.get(finding.invariantId) ?? [];\n existing.push(finding);\n calibratedFindingsByInvariant.set(finding.invariantId, existing);\n }\n\n const updatedResults = results.map((r: CheckResult) => ({\n ...r,\n findings: calibratedFindingsByInvariant.get(r.invariantId) ?? [],\n }));\n\n const passed = updatedResults.filter((r) => r.passed).length;\n const failed = updatedResults.filter((r) => !r.passed).length;\n const waived = findings.filter((f) => f.waived).length;\n\n const byPriority = {\n P0: findings.filter((f) => f.severity === 'P0').length,\n P1: findings.filter((f) => f.severity === 'P1').length,\n P2: findings.filter((f) => f.severity === 'P2').length,\n };\n\n return {\n result: {\n version: '1.0',\n targetPath,\n runAt: new Date().toISOString(),\n duration: Date.now() - startTime,\n summary: { total: updatedResults.length, passed, failed, waived, byPriority },\n results: updatedResults,\n artifact: auditArtifact,\n },\n calibrationUsed,\n patternsUsed,\n cloudApiKey,\n cloudEndpoints,\n cloudEvalUsed,\n cloudUsage: cloudEvalResult.usage,\n };\n}\n\n/**\n * Run a single scan (used by both regular and watch mode)\n */\nasync function runSingleScan(options: RunOptions): Promise<void> {\n const _startTime = Date.now();\n\n if (!options.quiet) {\n console.log(pc.bold('\\n🔍 Scanning for invariants AI misses...\\n'));\n }\n\n try {\n let artifact: CollectorArtifact;\n\n if (options.artifact) {\n // Use pre-collected artifact\n if (!options.quiet) {\n console.log(pc.dim(`Loading artifact from ${options.artifact}...`));\n }\n\n artifact = await loadArtifact(options.artifact);\n } else {\n // Collect artifacts first (orchestrate scc collect)\n const targetPath = resolveTargetPath(options.path);\n\n if (!options.quiet) {\n console.log(pc.dim(`Collecting artifacts from ${targetPath}...`));\n }\n\n artifact = await collect({\n targetPath,\n profile: 'securitychecks',\n });\n\n // Cache artifact for inspection/debugging\n const artifactPath = join(targetPath, DEFAULT_ARTIFACT_PATH);\n try {\n await mkdir(dirname(artifactPath), { recursive: true });\n await writeFile(artifactPath, JSON.stringify(artifact, null, 2), 'utf-8');\n if (!options.quiet) {\n console.log(pc.dim(`Artifact cached at ${DEFAULT_ARTIFACT_PATH}`));\n }\n } catch {\n // Non-fatal: continue even if we can't cache\n }\n }\n\n if (!options.quiet) {\n const schemaVer = artifact.schemaVersion ?? '1.0.0';\n console.log(pc.dim(`Artifact: v${artifact.version}, schema=${schemaVer}, profile=${artifact.profile}`));\n console.log(pc.dim(`Codebase: ${artifact.codebase.root}`));\n console.log(pc.dim(`Files: ${artifact.codebase.filesScanned}, Services: ${artifact.services.length}`));\n console.log('');\n }\n\n const {\n result,\n calibrationUsed: _calibrationUsed,\n patternsUsed: _patternsUsed,\n cloudApiKey,\n cloudEndpoints,\n cloudEvalUsed: _cloudEvalUsed,\n cloudUsage,\n } = await runFromArtifact(artifact, options);\n\n // Load baseline and waivers\n const targetPath = artifact.codebase.root;\n const [baseline, waivers] = await Promise.all([\n loadBaseline(targetPath),\n loadWaivers(targetPath),\n ]);\n\n // Categorize findings against baseline/waivers\n const allFindings = result.results.flatMap((r) => r.findings);\n const categorization = categorizeFindings(allFindings, baseline, waivers);\n\n // Run correlation analysis to detect compounding risks\n const correlationResult = correlateFindings(result.results, result.artifact);\n if (!options.quiet && correlationResult.correlations.length > 0) {\n console.log(pc.dim(`Correlation: ${correlationResult.stats.correlationGroups} compounding risk group(s) detected`));\n }\n\n // Build artifact for framework detection (used by multiple telemetry calls)\n const artifactForFrameworks = {\n version: '1.0' as const,\n extractedAt: artifact.extractedAt,\n targetPath: artifact.codebase.root,\n services: artifact.services,\n authzCalls: artifact.authzCalls ?? [],\n cacheOperations: artifact.cacheOperations ?? [],\n transactionScopes: artifact.transactionScopes ?? [],\n webhookHandlers: artifact.webhookHandlers ?? [],\n jobHandlers: artifact.jobHandlers ?? [],\n membershipMutations: artifact.membershipMutations ?? [],\n tests: artifact.tests ?? [],\n routes: artifact.routes ?? [],\n callGraph: artifact.callGraph,\n };\n const detectedFrameworks = resolveFrameworks(artifact, artifactForFrameworks);\n\n // Report correlations to SaaS (non-blocking, for learning)\n if (!options.offline && cloudApiKey && correlationResult.correlations.length > 0) {\n const correlationTelemetryConfig: CorrelationTelemetryConfig = {\n enabled: true,\n apiKey: cloudApiKey,\n endpoint: cloudEndpoints.correlations,\n };\n\n // Fire-and-forget - don't block on telemetry\n reportCorrelations(correlationResult, correlationTelemetryConfig, detectedFrameworks[0])\n .catch(() => {/* Telemetry failures are silent */});\n }\n\n // Fetch aggregate calibration data for framework comparison\n let aggregateCalibration: AggregateCalibrationData | null = null;\n if (\n !options.offline &&\n cloudApiKey &&\n !isAggregateCalibrationDisabled() &&\n detectedFrameworks.length > 0\n ) {\n const aggregateConfig: AggregateCalibrationConfig = {\n enabled: true,\n apiKey: cloudApiKey,\n endpoint: cloudEndpoints.aggregateCalibration,\n };\n\n try {\n const calibrationResult = await fetchAggregateCalibration(detectedFrameworks, aggregateConfig);\n if (calibrationResult.data) {\n aggregateCalibration = calibrationResult.data;\n if (!options.quiet && calibrationResult.data.meta.totalScansAnalyzed > 0) {\n console.log(pc.dim(`Calibration: Loaded baseline from ${calibrationResult.data.meta.totalScansAnalyzed} scans${calibrationResult.fromCache ? ' (cached)' : ''}`));\n }\n }\n } catch {\n // Calibration failures are non-fatal\n }\n }\n\n // SARIF output for GitHub Code Scanning integration\n if (options.sarif) {\n const cliVersion = process.env['CLI_VERSION'] ?? '0.0.0';\n const sarifOutput = toSarif(result, cliVersion);\n await writeFile(options.sarif, JSON.stringify(sarifOutput, null, 2), 'utf-8');\n if (!options.quiet) {\n console.log(pc.green(`✓ SARIF report written to ${options.sarif}`));\n }\n }\n\n if (options.json) {\n // Include categorization and correlation in JSON output\n const jsonOutput = {\n ...result,\n categorization: {\n counts: categorization.counts,\n new: categorization.new.map((c) => ({ ...c, findingId: generateFindingId(c) })),\n baselined: categorization.baselined.map((c) => ({ ...c, findingId: generateFindingId(c) })),\n waived: categorization.waived.map((c) => ({\n ...c,\n findingId: generateFindingId(c),\n waiver: c.waiver,\n })),\n },\n correlation: {\n stats: correlationResult.stats,\n groups: correlationResult.correlations.map((c) => ({\n primary: { ...c.primary, findingId: generateFindingId(c.primary) },\n related: c.related.map((r) => ({ ...r, findingId: generateFindingId(r) })),\n sharedContext: c.sharedContext,\n compoundingEffect: c.compoundingEffect,\n adjustedSeverity: c.adjustedSeverity,\n attackPath: c.attackPath,\n })),\n },\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Display results with categorization, correlation, and calibration comparison\n displayResults(result, categorization, correlationResult, options, {\n aggregateCalibration,\n frameworks: detectedFrameworks,\n });\n\n // Usage awareness banner\n if (!options.quiet && !options.json && !options.ci) {\n const { scansUsed, scansRemaining } = cloudUsage;\n const total = scansUsed + scansRemaining;\n const isSuppressed = options.noUsageBanner\n || process.env['SECURITYCHECKS_NO_USAGE_BANNER'] === '1';\n\n if (!isSuppressed && scansRemaining !== Infinity && total > 0) {\n const isLow = scansRemaining / total <= 0.2;\n const isNthScan = scansUsed % 5 === 0;\n\n if (isLow || isNthScan) {\n const color = isLow ? pc.red : pc.yellow;\n const label = isLow ? 'Low quota' : 'Quota';\n console.log(color(`⚠ ${label}: ${scansUsed} of ${total} scans used this month (${scansRemaining} remaining)`));\n console.log(pc.dim(' Upgrade at https://securitychecks.ai/pricing'));\n if (!isLow) {\n console.log(pc.dim(' Suppress with --no-usage-banner or SECURITYCHECKS_NO_USAGE_BANNER=1'));\n }\n }\n }\n }\n\n // Report anonymous telemetry (non-blocking, opt-out via DO_NOT_TRACK=1)\n if (!options.offline && cloudApiKey && !isTelemetryDisabled()) {\n const telemetryConfig: TelemetryConfig = {\n enabled: true,\n apiKey: cloudApiKey,\n endpoint: cloudEndpoints.telemetry,\n };\n\n const telemetry = buildTelemetry(result, {\n filesScanned: artifact.codebase.filesScanned,\n frameworks: detectedFrameworks,\n correlation: correlationResult,\n categorization,\n mode: options.ci ? 'ci' : 'manual',\n baselineSize: baseline ? Object.keys(baseline.entries).length : 0,\n waiversCount: waivers ? Object.keys(waivers.entries).length : 0,\n });\n\n // Fire-and-forget - don't block on telemetry\n reportTelemetry(telemetry, telemetryConfig)\n .catch(() => {/* Telemetry failures are silent */});\n }\n\n // Exit with appropriate code (CI mode respects baseline/waivers)\n if (options.ci) {\n const exitCode = getCIExitCode(categorization);\n if (exitCode !== 0) {\n console.log(pc.red(`\\n${getCISummary(categorization)}`));\n console.log(pc.dim('Use `scheck baseline --update` to baseline known issues.'));\n console.log(pc.dim('Use `scheck waive <findingId>` to temporarily waive issues.\\n'));\n process.exit(exitCode);\n } else {\n console.log(pc.green(`\\n${getCISummary(categorization)}\\n`));\n }\n }\n } catch (error) {\n const cliError = isCLIError(error)\n ? error\n : wrapError(error, ErrorCodes.CHECK_EXECUTION_ERROR, 'Error running scheck');\n\n if (options.json) {\n console.error(JSON.stringify(cliError.toJSON(), null, 2));\n } else {\n console.error(pc.red(`\\n${cliError.toUserString()}\\n`));\n\n // Show remediation guidance\n const remediation = cliError.getRemediation();\n if (remediation) {\n console.error(pc.yellow('How to fix:'));\n for (const line of remediation.split('\\n')) {\n console.error(pc.dim(` ${line}`));\n }\n console.error('');\n }\n\n if (cliError.cause) {\n console.error(pc.dim(`Caused by: ${cliError.cause.message}`));\n console.error('');\n }\n\n console.error(pc.dim('Need help? https://securitychecks.ai/docs/troubleshooting'));\n console.error('');\n }\n process.exit(1);\n }\n}\n\n/**\n * Check if CLI is enabled via feature flag\n * CLI is in private beta - users should use GitHub App instead\n */\nfunction isCLIEnabled(): boolean {\n const flag = process.env['SECURITYCHECKS_CLI_ENABLED'];\n return flag === '1' || flag === 'true';\n}\n\n/**\n * Main run command entry point\n * Handles both single run and watch mode\n */\nexport async function runCommand(options: RunOptions): Promise<void> {\n // Feature flag: CLI is in private beta\n if (!isCLIEnabled()) {\n console.log(pc.bold('\\nSecurityChecks CLI is currently in private beta.\\n'));\n console.log('For public access, use our GitHub App instead:');\n console.log(pc.cyan(' https://securitychecks.ai\\n'));\n console.log('Benefits of the GitHub App:');\n console.log(' - No installation required');\n console.log(' - Automatic PR checks');\n console.log(' - Evidence directly in your PRs');\n console.log(' - Free tier available\\n');\n console.log(pc.dim('Enterprise or beta access? Contact sales@securitychecks.ai'));\n console.log(pc.dim('Set SECURITYCHECKS_CLI_ENABLED=1 if you have approved access.\\n'));\n process.exit(0);\n }\n\n // Watch mode incompatible with certain options\n if (options.watch) {\n if (options.ci) {\n console.error(pc.red('Error: --watch cannot be used with --ci mode'));\n process.exit(1);\n }\n if (options.artifact) {\n console.error(pc.red('Error: --watch cannot be used with --artifact'));\n process.exit(1);\n }\n if (options.json) {\n console.error(pc.red('Error: --watch cannot be used with --json output'));\n process.exit(1);\n }\n\n const targetPath = resolveTargetPath(options.path);\n\n console.log(pc.bold('\\n👀 Watch mode enabled\\n'));\n console.log(pc.dim(`Watching: ${targetPath}`));\n console.log(pc.dim('Press Ctrl+C to stop\\n'));\n\n // Run initial scan\n await runSingleScan(options);\n\n let runCount = 1;\n\n // Set up file watcher\n const watcher = new FileWatcher({\n targetPath,\n verbose: !options.quiet,\n onChanged: async () => {\n runCount++;\n // Clear console for cleaner output\n console.clear();\n console.log(pc.bold(`\\n👀 Watch mode (run #${runCount})\\n`));\n console.log(pc.dim(`Watching: ${targetPath}`));\n console.log(pc.dim('Press Ctrl+C to stop\\n'));\n\n try {\n await runSingleScan(options);\n } catch {\n // Error already displayed by runSingleScan\n console.log(pc.dim('\\nWaiting for changes...\\n'));\n }\n },\n });\n\n watcher.on('change', (filename: string) => {\n if (!options.quiet) {\n console.log(pc.dim(`\\nFile changed: ${filename}`));\n console.log(pc.dim('Re-running scan...\\n'));\n }\n });\n\n watcher.start();\n\n // Keep process alive and handle graceful shutdown\n process.on('SIGINT', () => {\n console.log(pc.dim('\\n\\nStopping watch mode...'));\n watcher.stop();\n process.exit(0);\n });\n\n // Keep process running\n await new Promise(() => {});\n }\n\n // Single run mode\n return runSingleScan(options);\n}\n\nfunction displayResults(\n result: AuditResult,\n categorization: CategorizationResult,\n correlation: CorrelationResult,\n options: RunOptions,\n calibration?: {\n aggregateCalibration: AggregateCalibrationData | null;\n frameworks: string[];\n }\n): void {\n const { counts } = categorization;\n const showP2 = options.all || options.includeP2;\n const earlyExit = !options.all && !options.ci;\n\n // Filter findings based on severity visibility\n const visibleFindings = categorization.new.filter(\n (f) => f.severity === 'P0' || f.severity === 'P1' || showP2\n );\n\n // Count visible findings by severity\n const p0Count = visibleFindings.filter((f) => f.severity === 'P0').length;\n const p1Count = visibleFindings.filter((f) => f.severity === 'P1').length;\n const p2Count = categorization.new.filter((f) => f.severity === 'P2').length;\n const criticalCount = p0Count;\n const totalVisible = p0Count + p1Count + (showP2 ? p2Count : 0);\n\n if (options.quiet && totalVisible === 0) {\n return;\n }\n\n // Early exit: stop on first P0 finding\n let stoppedEarly = false;\n let displayFindings = visibleFindings;\n\n if (earlyExit && p0Count > 0) {\n // Only show first P0 finding\n const firstP0 = visibleFindings.find((f) => f.severity === 'P0');\n if (firstP0) {\n displayFindings = [firstP0];\n stoppedEarly = true;\n }\n }\n\n // Display findings in new format\n if (displayFindings.length > 0) {\n // Group by invariant\n const byInvariant = new Map<string, typeof displayFindings>();\n for (const finding of displayFindings) {\n const id = finding.invariantId;\n if (!byInvariant.has(id)) {\n byInvariant.set(id, []);\n }\n byInvariant.get(id)!.push(finding);\n }\n\n for (const [invariantId, findings] of byInvariant) {\n const severity = findings[0]?.severity;\n const severityColor =\n severity === 'P0' ? pc.red : severity === 'P1' ? pc.yellow : pc.blue;\n\n // [P0] AUTHZ.SERVICE_LAYER.ENFORCED\n console.log(severityColor(`[${severity}] ${invariantId}`));\n console.log('');\n\n // Staff engineer question\n const staffQuestion = getStaffQuestion(invariantId);\n if (staffQuestion) {\n console.log(` A staff engineer would ask:`);\n console.log(` ${pc.cyan(`\"${staffQuestion}\"`)}`);\n console.log('');\n }\n\n // Evidence for each finding\n for (const finding of findings) {\n for (const evidence of finding.evidence) {\n console.log(` → ${pc.white(`${evidence.file}:${evidence.line}`)}`);\n console.log(` ${pc.dim(finding.message)}`);\n }\n }\n console.log('');\n }\n }\n\n // Stats line: Scanned X files in Y.Zs\n const duration = (result.duration / 1000).toFixed(1);\n const filesScanned = result.artifact?.services?.length ?? 0;\n console.log(pc.dim(`Scanned ${filesScanned} files in ${duration}s`));\n console.log('');\n\n // Summary line\n if (stoppedEarly) {\n console.log(pc.red(`✖ Found critical issue. Stopping early.`));\n console.log('');\n console.log(pc.dim(`Run \\`scheck run --all\\` to see all findings.`));\n console.log(pc.dim(`Run \\`scheck explain ${displayFindings[0]?.invariantId}\\` for details.`));\n } else if (totalVisible === 0) {\n console.log(pc.green(`✓ No issues found. Ship it.`));\n } else {\n const issueWord = totalVisible === 1 ? 'issue' : 'issues';\n const criticalNote = criticalCount > 0 ? ` (${criticalCount} critical)` : '';\n console.log(pc.red(`✖ ${totalVisible} ${issueWord} require attention${criticalNote}`));\n console.log('');\n\n // Show explain hint for the first invariant\n const firstInvariant = displayFindings[0]?.invariantId;\n if (firstInvariant) {\n console.log(pc.dim(`Run \\`scheck explain ${firstInvariant}\\` for details.`));\n }\n }\n\n // Show hidden P2 count if applicable\n if (!showP2 && p2Count > 0 && !stoppedEarly) {\n console.log(pc.dim(`(${p2Count} P2 finding(s) hidden. Run with --all to see them.)`));\n }\n\n // Show baselined/waived summary in non-quiet mode\n if (!options.quiet) {\n if (counts.baselined > 0 || counts.waived > 0) {\n console.log('');\n if (counts.baselined > 0) {\n console.log(pc.dim(`Baselined: ${counts.baselined} finding(s) in baseline`));\n }\n if (counts.waived > 0) {\n console.log(pc.dim(`Waived: ${counts.waived} finding(s) temporarily waived`));\n }\n }\n }\n\n // Correlation warnings (verbose mode only)\n if (correlation.correlations.length > 0 && !options.quiet && options.all) {\n console.log('');\n console.log(pc.bold(pc.magenta('Compounding Risks Detected:')));\n for (const corr of correlation.correlations) {\n console.log(formatCorrelatedFinding(corr));\n }\n console.log(pc.dim(formatCorrelationStats(correlation)));\n }\n\n // Framework comparison (verbose/all mode only)\n if (calibration?.aggregateCalibration && calibration.frameworks.length > 0 && options.all) {\n const findings = {\n P0: result.summary.byPriority.P0,\n P1: result.summary.byPriority.P1,\n P2: result.summary.byPriority.P2,\n total: counts.total,\n };\n const comparisonSummary = formatAggregateCalibrationSummary(\n calibration.aggregateCalibration,\n calibration.frameworks,\n findings\n );\n if (comparisonSummary) {\n console.log('');\n console.log(pc.bold('Framework Comparison:'));\n for (const line of comparisonSummary.split('\\n')) {\n console.log(` ${pc.dim(line)}`);\n }\n }\n }\n\n console.log('');\n}\n","/**\n * Explain command - explain an invariant and show required proofs\n */\n\nimport pc from 'picocolors';\nimport { getInvariantById, ALL_INVARIANTS } from '@securitychecks/collector';\n\nexport async function explainCommand(invariantId: string): Promise<void> {\n const invariant = getInvariantById(invariantId);\n\n if (!invariant) {\n console.log(pc.red(`\\nUnknown invariant: ${invariantId}\\n`));\n console.log(pc.bold('Available invariants:\\n'));\n\n for (const inv of ALL_INVARIANTS) {\n const severityColor =\n inv.severity === 'P0' ? pc.red : inv.severity === 'P1' ? pc.yellow : pc.blue;\n console.log(` ${severityColor(`[${inv.severity}]`)} ${inv.id}`);\n console.log(pc.dim(` ${inv.name}`));\n }\n console.log('');\n return;\n }\n\n const severityColor =\n invariant.severity === 'P0' ? pc.red : invariant.severity === 'P1' ? pc.yellow : pc.blue;\n\n console.log('');\n console.log(severityColor(pc.bold(`[${invariant.severity}] ${invariant.id}`)));\n console.log(pc.bold(invariant.name));\n console.log('');\n\n console.log(pc.bold('Description:'));\n console.log(wrapText(invariant.description, 80, 2));\n console.log('');\n\n console.log(pc.bold('Category:'));\n console.log(` ${invariant.category}`);\n console.log('');\n\n console.log(pc.bold('Required Proof:'));\n console.log(wrapText(invariant.requiredProof, 80, 2));\n console.log('');\n\n if (invariant.documentationUrl) {\n console.log(pc.bold('Documentation:'));\n console.log(` ${invariant.documentationUrl}`);\n console.log('');\n }\n}\n\nfunction wrapText(text: string, maxWidth: number, indent: number): string {\n const words = text.split(' ');\n const lines: string[] = [];\n let currentLine = '';\n const prefix = ' '.repeat(indent);\n\n for (const word of words) {\n if (currentLine.length + word.length + 1 > maxWidth - indent) {\n lines.push(prefix + currentLine.trim());\n currentLine = word;\n } else {\n currentLine += (currentLine ? ' ' : '') + word;\n }\n }\n\n if (currentLine) {\n lines.push(prefix + currentLine.trim());\n }\n\n return lines.join('\\n');\n}\n","/**\n * Init command - initialize scheck in a project\n */\n\nimport { writeFile, mkdir, chmod } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport pc from 'picocolors';\nimport { resolveTargetPath } from '@securitychecks/collector';\n\ninterface InitOptions {\n path?: string;\n hooks?: boolean;\n}\n\nconst DEFAULT_CONFIG = `# SecurityChecks Configuration\n# Catch what Copilot misses — Architectural security for AI-generated code\n# https://securitychecks.ai/docs/config\n\nversion: \"1.0\"\n\n# Paths to scan for source files\ninclude:\n - \"src/**/*.ts\"\n - \"src/**/*.tsx\"\n - \"lib/**/*.ts\"\n - \"app/**/*.ts\"\n - \"app/**/*.tsx\"\n\n# Paths to exclude\nexclude:\n - \"**/node_modules/**\"\n - \"**/dist/**\"\n - \"**/build/**\"\n - \"**/.next/**\"\n - \"**/coverage/**\"\n - \"**/*.d.ts\"\n\n# Test file patterns\ntestPatterns:\n - \"**/*.test.ts\"\n - \"**/*.test.tsx\"\n - \"**/*.spec.ts\"\n - \"**/*.spec.tsx\"\n - \"**/tests/**/*.ts\"\n - \"**/__tests__/**/*.ts\"\n\n# Service file patterns (where authz should be enforced)\nservicePatterns:\n - \"**/services/**/*.ts\"\n - \"**/service/**/*.ts\"\n - \"**/lib/**/*.ts\"\n - \"**/server/**/*.ts\"\n\n# Uncomment to disable specific invariants\n# disabledInvariants:\n# - \"TESTS.NO_FALSE_CONFIDENCE\"\n\n# Uncomment to only run specific invariants\n# enabledInvariants:\n# - \"AUTHZ.SERVICE_LAYER.ENFORCED\"\n`;\n\nconst PRE_COMMIT_HOOK = `#!/bin/sh\n# SecurityChecks pre-commit hook\n# https://securitychecks.ai/docs/hooks\n#\n# This hook runs scheck on changed files before each commit.\n# To skip this check for a single commit, use: git commit --no-verify\n\n# Check if scheck is available\nif ! command -v scheck &> /dev/null && ! npx scheck --version &> /dev/null 2>&1; then\n echo \"Warning: scheck not found. Install with: npm install -g @securitychecks/cli\"\n echo \"Skipping security checks...\"\n exit 0\nfi\n\necho \"Running SecurityChecks on staged files...\"\n\n# Run scheck on changed files only\n# --changed: only check files that differ from HEAD\n# --ci: fail on new violations\nif command -v scheck &> /dev/null; then\n scheck run --changed --ci\nelse\n npx scheck run --changed --ci\nfi\n\nexit_code=$?\n\nif [ $exit_code -ne 0 ]; then\n echo \"\"\n echo \"SecurityChecks found issues. Please fix them before committing.\"\n echo \"To skip this check once: git commit --no-verify\"\n echo \"\"\nfi\n\nexit $exit_code\n`;\n\nconst GITHUB_ACTION = `name: SecurityChecks\n\non:\n pull_request:\n branches: [main, master]\n push:\n branches: [main, master]\n\njobs:\n scheck:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Install dependencies\n run: npm ci\n\n - name: Run SecurityChecks\n run: npx -y -p @securitychecks/cli scheck run --ci\n`;\n\n/**\n * Install the pre-commit hook in the git repository\n */\nasync function installPreCommitHook(targetPath: string): Promise<void> {\n const gitDir = join(targetPath, '.git');\n\n // Check if this is a git repository\n if (!existsSync(gitDir)) {\n console.log(pc.yellow('⚠') + ' Not a git repository, skipping pre-commit hook');\n return;\n }\n\n const hooksDir = join(gitDir, 'hooks');\n const hookPath = join(hooksDir, 'pre-commit');\n\n // Create hooks directory if it doesn't exist\n if (!existsSync(hooksDir)) {\n await mkdir(hooksDir, { recursive: true });\n }\n\n // Check if pre-commit hook already exists\n if (existsSync(hookPath)) {\n // Read existing hook to see if it's ours or something else\n const existingHook = await import('fs').then((fs) =>\n fs.promises.readFile(hookPath, 'utf-8')\n );\n\n if (existingHook.includes('SecurityChecks pre-commit hook')) {\n console.log(pc.yellow('⚠') + ' Pre-commit hook already installed');\n return;\n }\n\n // Another hook exists - append our check\n console.log(pc.yellow('⚠') + ' Existing pre-commit hook found');\n console.log(pc.dim(' To integrate SecurityChecks, add this to your hook:'));\n console.log(pc.cyan(' scheck run --changed --ci'));\n return;\n }\n\n // Install fresh hook\n await writeFile(hookPath, PRE_COMMIT_HOOK);\n await chmod(hookPath, 0o755); // Make executable\n console.log(pc.green('✓') + ' Installed pre-commit hook');\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const targetPath = resolveTargetPath(options.path);\n\n console.log(pc.bold('\\n🔧 Initializing SecurityChecks for your project\\n'));\n\n try {\n // Create .scheck directory\n const scheckDir = join(targetPath, '.scheck');\n if (!existsSync(scheckDir)) {\n await mkdir(scheckDir, { recursive: true });\n console.log(pc.green('✓') + ' Created .scheck directory');\n }\n\n // Create config file\n const configPath = join(scheckDir, 'config.yaml');\n if (!existsSync(configPath)) {\n await writeFile(configPath, DEFAULT_CONFIG);\n console.log(pc.green('✓') + ' Created .scheck/config.yaml');\n } else {\n console.log(pc.yellow('⚠') + ' Config already exists, skipping');\n }\n\n // Create baseline file\n const baselinePath = join(scheckDir, 'baseline.json');\n if (!existsSync(baselinePath)) {\n const baseline = {\n version: '1.0',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n entries: [],\n };\n await writeFile(baselinePath, JSON.stringify(baseline, null, 2));\n console.log(pc.green('✓') + ' Created .scheck/baseline.json');\n } else {\n console.log(pc.yellow('⚠') + ' Baseline already exists, skipping');\n }\n\n // Create GitHub Action\n const workflowDir = join(targetPath, '.github', 'workflows');\n const workflowPath = join(workflowDir, 'scheck.yml');\n if (!existsSync(workflowPath)) {\n await mkdir(workflowDir, { recursive: true });\n await writeFile(workflowPath, GITHUB_ACTION);\n console.log(pc.green('✓') + ' Created .github/workflows/scheck.yml');\n } else {\n console.log(pc.yellow('⚠') + ' GitHub Action already exists, skipping');\n }\n\n // Install pre-commit hook if requested\n if (options.hooks) {\n await installPreCommitHook(targetPath);\n }\n\n // Add to .gitignore if needed\n const gitignorePath = join(targetPath, '.gitignore');\n if (existsSync(gitignorePath)) {\n const gitignore = await import('fs').then((fs) =>\n fs.promises.readFile(gitignorePath, 'utf-8')\n );\n if (!gitignore.includes('.scheck/cache')) {\n await import('fs').then((fs) =>\n fs.promises.appendFile(gitignorePath, '\\n# SecurityChecks\\n.scheck/cache/\\n')\n );\n console.log(pc.green('✓') + ' Updated .gitignore');\n }\n }\n\n console.log('');\n console.log(pc.green('✓ SecurityChecks is ready.'));\n console.log(pc.dim(' Catch what Copilot misses in your codebase.\\n'));\n console.log(pc.bold('Next steps:'));\n console.log('');\n console.log(' 1. Review the config at .scheck/config.yaml');\n console.log(' 2. Run your first scan:');\n console.log(pc.cyan(' scheck run'));\n console.log('');\n console.log(' 3. Fix any P0/P1 violations or add waivers');\n console.log(' 4. Commit the .scheck directory');\n console.log('');\n console.log(pc.dim('Learn more: https://securitychecks.ai/docs'));\n console.log('');\n } catch (error) {\n console.error(pc.red('\\nError initializing:'), error);\n process.exit(1);\n }\n}\n","/**\n * Audit API - Programmatic interface for running the staff check\n *\n * This module provides the core audit functionality that can be used by:\n * - CLI commands\n * - MCP server\n * - Programmatic integration\n *\n * SECURITY NOTE: All audit functions require cloud API authentication.\n * Detection logic runs server-side to protect IP.\n * See: docs/POST_MORTEM_001_ENGINE_EXPOSURE.md\n */\n\nimport {\n collect,\n resolveTargetPath,\n type AuditResult,\n type CollectorArtifact,\n type Artifact,\n} from '@securitychecks/collector';\nimport { getCloudApiKey, getCloudApiBaseUrl } from './lib/license.js';\nimport { evaluateCloud } from './lib/cloud-eval.js';\nimport { CLIError, ErrorCodes } from './lib/errors.js';\nimport { getProjectSlug } from './lib/project-slug.js';\n\n// NOTE: Engine import removed - detection runs server-side only\n// import { runAllCheckers } from '@securitychecks/engine';\n\nexport interface AuditOptions {\n /** Target path to audit (default: current directory) */\n targetPath?: string;\n /** Only run specific invariant checks by ID */\n only?: string[];\n /** Skip specific invariant checks by ID */\n skip?: string[];\n}\n\n/**\n * Convert CollectorArtifact to Artifact for checker compatibility\n */\nfunction toArtifact(collectorArtifact: CollectorArtifact): Artifact {\n return {\n version: '1.0',\n extractedAt: collectorArtifact.extractedAt,\n targetPath: collectorArtifact.codebase.root,\n services: collectorArtifact.services,\n authzCalls: collectorArtifact.authzCalls ?? [],\n cacheOperations: collectorArtifact.cacheOperations ?? [],\n transactionScopes: collectorArtifact.transactionScopes ?? [],\n webhookHandlers: collectorArtifact.webhookHandlers ?? [],\n jobHandlers: collectorArtifact.jobHandlers ?? [],\n membershipMutations: collectorArtifact.membershipMutations ?? [],\n tests: collectorArtifact.tests ?? [],\n routes: collectorArtifact.routes ?? [],\n dataFlows: collectorArtifact.dataFlows,\n callGraph: collectorArtifact.callGraph,\n };\n}\n\n/**\n * Run the full staff check audit\n *\n * This is the main programmatic API for running the staff check.\n * It performs two steps:\n * 1. Collect artifacts from the target codebase (facts)\n * 2. Send to cloud API for evaluation (findings)\n *\n * SECURITY: Detection logic runs server-side to protect IP.\n * An API key is required. Get one at https://securitychecks.ai/dashboard/settings/api-keys\n *\n * @example\n * ```ts\n * import { audit } from '@securitychecks/cli';\n *\n * // Requires SECURITYCHECKS_API_KEY environment variable\n * const result = await audit({\n * targetPath: '/path/to/codebase',\n * only: ['WEBHOOK.IDEMPOTENT'],\n * });\n *\n * console.log(result.summary);\n * ```\n */\nexport async function audit(options: AuditOptions = {}): Promise<AuditResult> {\n const startTime = Date.now();\n\n // SECURITY: Require API key - detection runs server-side to protect IP\n const apiKey = getCloudApiKey();\n if (!apiKey) {\n throw new CLIError(\n ErrorCodes.AUTH_REQUIRED,\n 'API key required for scanning',\n {\n details: {\n remediation: `Set SECURITYCHECKS_API_KEY environment variable.\nGet your API key at https://securitychecks.ai/dashboard/settings/api-keys\n\nFor air-gapped environments, contact sales@securitychecks.ai for enterprise options.`,\n },\n }\n );\n }\n\n const targetPath = resolveTargetPath(options.targetPath);\n\n // Step 1: Collect artifacts (facts) - runs locally\n const collectorArtifact = await collect({\n targetPath,\n profile: 'securitychecks',\n });\n\n // Step 2: Send to cloud for evaluation (findings) - runs server-side\n const cloudResult = await evaluateCloud(collectorArtifact, {\n apiKey,\n baseUrl: getCloudApiBaseUrl(),\n invariants: options.only,\n skip: options.skip,\n projectSlug: getProjectSlug(),\n });\n\n // Step 3: Convert to checker-compatible format for result\n const artifact = toArtifact(collectorArtifact);\n\n // Compute summary from cloud results\n const findings = cloudResult.findings;\n const byPriority = {\n P0: findings.filter((f) => f.severity === 'P0').length,\n P1: findings.filter((f) => f.severity === 'P1').length,\n P2: findings.filter((f) => f.severity === 'P2').length,\n };\n\n // Synthesize results format from cloud response\n const invariantIds = [...new Set(findings.map(f => f.invariantId))];\n const results = invariantIds.map(id => ({\n invariantId: id,\n passed: !findings.some(f => f.invariantId === id),\n findings: findings.filter(f => f.invariantId === id),\n checkedAt: new Date().toISOString(),\n duration: 0,\n }));\n\n const passed = results.filter((r) => r.passed).length;\n const failed = results.filter((r) => !r.passed).length;\n const waived = findings.filter((f) => f.waived).length;\n\n return {\n version: '1.0',\n targetPath,\n runAt: new Date().toISOString(),\n duration: Date.now() - startTime,\n summary: {\n total: cloudResult.stats.invariantsRun,\n passed,\n failed,\n waived,\n byPriority\n },\n results,\n artifact,\n };\n}\n","/**\n * Baseline Command\n *\n * Manages the baseline of known issues that should not fail CI.\n *\n * Usage:\n * scheck baseline --update # Add current findings to baseline\n * scheck baseline --show # Show current baseline\n * scheck baseline --prune # Remove stale entries\n */\n\nimport pc from 'picocolors';\nimport { resolve } from 'path';\nimport { createInterface } from 'readline';\nimport { audit } from '../audit.js';\nimport {\n loadBaseline,\n saveBaseline,\n addToBaseline,\n pruneBaseline,\n getBaselinePath,\n} from '../baseline/index.js';\nimport { generateFindingId } from '../findings/index.js';\n\nexport interface BaselineOptions {\n path?: string;\n update?: boolean;\n show?: boolean;\n prune?: boolean;\n pruneDays?: string;\n notes?: string;\n yes?: boolean;\n}\n\nexport async function baselineCommand(options: BaselineOptions): Promise<void> {\n const targetPath = resolve(options.path ?? process.cwd());\n\n if (options.show) {\n await showBaseline(targetPath);\n } else if (options.update) {\n await updateBaseline(targetPath, options.notes, options.yes ?? false);\n } else if (options.prune) {\n await pruneBaselineEntries(targetPath, parseInt(options.pruneDays ?? '90', 10));\n } else {\n // Default: show summary\n await showBaseline(targetPath);\n }\n}\n\nasync function showBaseline(targetPath: string): Promise<void> {\n const baseline = await loadBaseline(targetPath);\n const entries = Object.values(baseline.entries);\n\n if (entries.length === 0) {\n console.log(pc.dim('No baseline entries.'));\n console.log(pc.dim(`Run ${pc.bold('scheck baseline --update')} to add current findings.`));\n return;\n }\n\n console.log(pc.bold(`Baseline: ${entries.length} entries`));\n console.log(pc.dim(`Schema version: ${baseline.schemaVersion}`));\n console.log(pc.dim(`Last updated: ${baseline.updatedAt}`));\n console.log(pc.dim(`Path: ${getBaselinePath(targetPath)}`));\n console.log();\n\n // Group by invariant\n const byInvariant = new Map<string, typeof entries>();\n for (const entry of entries) {\n const list = byInvariant.get(entry.invariantId) ?? [];\n list.push(entry);\n byInvariant.set(entry.invariantId, list);\n }\n\n for (const [invariantId, invariantEntries] of byInvariant) {\n console.log(pc.cyan(`${invariantId} (${invariantEntries.length})`));\n for (const entry of invariantEntries.slice(0, 5)) {\n const symbol = entry.symbol ? `:${entry.symbol}` : '';\n console.log(` ${pc.dim('•')} ${entry.file}${symbol}`);\n if (entry.notes) {\n console.log(` ${pc.dim(entry.notes)}`);\n }\n }\n if (invariantEntries.length > 5) {\n console.log(pc.dim(` ... and ${invariantEntries.length - 5} more`));\n }\n }\n}\n\nasync function updateBaseline(targetPath: string, notes?: string, skipConfirmation = false): Promise<void> {\n console.log(pc.dim('Running audit to collect current findings...'));\n\n // Run audit to get current findings\n const result = await audit({\n targetPath,\n });\n\n const baseline = await loadBaseline(targetPath);\n const findings = result.results.flatMap((r) => r.findings);\n\n if (findings.length === 0) {\n console.log(pc.green('No findings to baseline.'));\n return;\n }\n\n // Check which findings are new (not already in baseline)\n const newFindings = findings.filter((f) => {\n const findingId = generateFindingId(f);\n return !(findingId in baseline.entries);\n });\n\n if (newFindings.length === 0) {\n console.log(pc.green('All findings are already in the baseline.'));\n return;\n }\n\n // Show what will be added\n console.log();\n console.log(pc.yellow(`About to add ${newFindings.length} finding(s) to the baseline:`));\n console.log();\n\n // Group by invariant for display\n const byInvariant = new Map<string, typeof newFindings>();\n for (const finding of newFindings) {\n const list = byInvariant.get(finding.invariantId) ?? [];\n list.push(finding);\n byInvariant.set(finding.invariantId, list);\n }\n\n for (const [invariantId, invariantFindings] of byInvariant) {\n console.log(pc.cyan(` ${invariantId} (${invariantFindings.length})`));\n for (const finding of invariantFindings.slice(0, 3)) {\n const evidence = finding.evidence[0];\n const location = evidence ? `${evidence.file}:${evidence.line}` : 'unknown';\n console.log(pc.dim(` • ${location}`));\n }\n if (invariantFindings.length > 3) {\n console.log(pc.dim(` ... and ${invariantFindings.length - 3} more`));\n }\n }\n console.log();\n\n // Ask for confirmation unless --yes\n if (!skipConfirmation && !isNonInteractive()) {\n const confirmed = await confirm(\n `Add ${newFindings.length} finding(s) to baseline? This will suppress them in CI. [y/N] `\n );\n if (!confirmed) {\n console.log(pc.dim('Cancelled.'));\n return;\n }\n }\n\n const added = addToBaseline(baseline, findings, notes);\n await saveBaseline(targetPath, baseline);\n\n console.log(pc.green(`✓ Baseline updated`));\n console.log(` ${pc.bold(added.toString())} new entries added`);\n console.log(` ${pc.dim(Object.keys(baseline.entries).length.toString())} total entries`);\n console.log(` ${pc.dim(`Path: ${getBaselinePath(targetPath)}`)}`);\n}\n\n/**\n * Check if running in a non-interactive environment (CI, piped input, etc.)\n */\nfunction isNonInteractive(): boolean {\n return !process.stdin.isTTY || !!process.env['CI'];\n}\n\n/**\n * Prompt the user for confirmation.\n */\nasync function confirm(message: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(message, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\nasync function pruneBaselineEntries(targetPath: string, staleDays: number): Promise<void> {\n const baseline = await loadBaseline(targetPath);\n const beforeCount = Object.keys(baseline.entries).length;\n\n const removed = pruneBaseline(baseline, staleDays);\n\n if (removed === 0) {\n console.log(pc.dim(`No entries older than ${staleDays} days.`));\n return;\n }\n\n await saveBaseline(targetPath, baseline);\n\n console.log(pc.green(`✓ Pruned ${removed} stale entries`));\n console.log(` ${pc.dim(`${beforeCount} → ${Object.keys(baseline.entries).length} entries`)}`);\n}\n","/**\n * Waiver Command\n *\n * Manages temporary waivers for findings that need to be fixed later.\n *\n * Usage:\n * scheck waive FINDING_ID --reason-key will_fix_later --reason \"...\" --expires 30d\n * scheck waiver --show # Show current waivers\n * scheck waiver --expiring # Show waivers expiring soon\n * scheck waiver --prune # Remove expired waivers\n */\n\nimport pc from 'picocolors';\nimport { resolve } from 'path';\nimport { audit } from '../audit.js';\nimport {\n loadWaivers,\n saveWaivers,\n addWaiver,\n pruneExpiredWaivers,\n getExpiringWaivers,\n getWaiverPath,\n WAIVER_REASON_KEYS,\n isValidWaiverReasonKey,\n} from '../baseline/index.js';\nimport { generateFindingId } from '../findings/index.js';\n\nexport interface WaiverOptions {\n path?: string;\n show?: boolean;\n expiring?: boolean;\n prune?: boolean;\n expiringDays?: string;\n}\n\nexport interface WaiveOptions {\n path?: string;\n reason?: string;\n reasonKey?: string;\n expires?: string;\n owner?: string;\n}\n\nexport async function waiverCommand(options: WaiverOptions): Promise<void> {\n const targetPath = resolve(options.path ?? process.cwd());\n\n if (options.expiring) {\n await showExpiringWaivers(targetPath, parseInt(options.expiringDays ?? '7', 10));\n } else if (options.prune) {\n await pruneWaivers(targetPath);\n } else {\n // Default: show all waivers\n await showWaivers(targetPath);\n }\n}\n\nexport async function waiveCommand(findingIdOrInvariant: string, options: WaiveOptions): Promise<void> {\n const targetPath = resolve(options.path ?? process.cwd());\n\n // Validate required options\n if (!options.reason) {\n console.error(pc.red('Error: --reason is required'));\n console.log(\n pc.dim('Example: scheck waive WEBHOOK.IDEMPOTENT:abc123 --reason-key will_fix_later --reason \"Fixing in sprint 42\"')\n );\n process.exit(1);\n }\n\n let reasonKey: import('../baseline/index.js').WaiverReasonKey | undefined;\n if (options.reasonKey) {\n if (!isValidWaiverReasonKey(options.reasonKey)) {\n console.error(pc.red(`Error: Invalid --reason-key \"${options.reasonKey}\"`));\n console.log(pc.dim(`Valid reason keys: ${WAIVER_REASON_KEYS.join(', ')}`));\n process.exit(1);\n }\n reasonKey = options.reasonKey;\n }\n\n // Parse expiration\n const expiresInDays = parseExpiration(options.expires ?? '30d');\n if (expiresInDays === null) {\n console.error(pc.red('Error: Invalid --expires format. Use: 7d, 30d, 90d, etc.'));\n process.exit(1);\n }\n\n // Get owner\n const owner = options.owner ?? process.env['USER'] ?? process.env['USERNAME'] ?? 'unknown';\n\n // If it's a full findingId (has :hash), find the matching finding\n // Otherwise, run audit and let user pick\n if (findingIdOrInvariant.includes(':')) {\n await waiveByFindingId(targetPath, findingIdOrInvariant, {\n reason: options.reason,\n reasonKey,\n owner,\n expiresInDays,\n });\n } else {\n await waiveByInvariant(targetPath, findingIdOrInvariant, {\n reason: options.reason,\n reasonKey,\n owner,\n expiresInDays,\n });\n }\n}\n\nasync function showWaivers(targetPath: string): Promise<void> {\n const waivers = await loadWaivers(targetPath);\n const entries = Object.values(waivers.entries);\n\n if (entries.length === 0) {\n console.log(pc.dim('No active waivers.'));\n return;\n }\n\n console.log(pc.bold(`Waivers: ${entries.length} active`));\n console.log(pc.dim(`Schema version: ${waivers.schemaVersion}`));\n console.log(pc.dim(`Path: ${getWaiverPath(targetPath)}`));\n console.log();\n\n // Sort by expiration\n entries.sort((a, b) => a.expiresAt.localeCompare(b.expiresAt));\n\n for (const entry of entries) {\n const expiresIn = getExpiresInLabel(entry.expiresAt);\n const isExpiringSoon = new Date(entry.expiresAt) < new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);\n\n console.log(pc.cyan(entry.findingId));\n console.log(` ${pc.dim('File:')} ${entry.file}${entry.symbol ? `:${entry.symbol}` : ''}`);\n console.log(` ${pc.dim('Reason:')} ${entry.reason}`);\n if (entry.reasonKey) {\n console.log(` ${pc.dim('Reason Key:')} ${entry.reasonKey}`);\n }\n console.log(` ${pc.dim('Owner:')} ${entry.owner}`);\n console.log(` ${pc.dim('Expires:')} ${isExpiringSoon ? pc.yellow(expiresIn) : expiresIn}`);\n console.log();\n }\n}\n\nasync function showExpiringWaivers(targetPath: string, withinDays: number): Promise<void> {\n const waivers = await loadWaivers(targetPath);\n const expiring = getExpiringWaivers(waivers, withinDays);\n\n if (expiring.length === 0) {\n console.log(pc.dim(`No waivers expiring within ${withinDays} days.`));\n return;\n }\n\n console.log(pc.yellow(`⚠ ${expiring.length} waiver(s) expiring within ${withinDays} days:`));\n console.log();\n\n for (const entry of expiring) {\n const expiresIn = getExpiresInLabel(entry.expiresAt);\n console.log(pc.yellow(entry.findingId));\n console.log(` ${pc.dim('File:')} ${entry.file}`);\n console.log(` ${pc.dim('Owner:')} ${entry.owner}`);\n console.log(` ${pc.dim('Expires:')} ${expiresIn}`);\n console.log();\n }\n}\n\nasync function pruneWaivers(targetPath: string): Promise<void> {\n const waivers = await loadWaivers(targetPath);\n const beforeCount = Object.keys(waivers.entries).length;\n\n const removed = pruneExpiredWaivers(waivers);\n\n if (removed === 0) {\n console.log(pc.dim('No expired waivers to remove.'));\n return;\n }\n\n await saveWaivers(targetPath, waivers);\n\n console.log(pc.green(`✓ Removed ${removed} expired waivers`));\n console.log(` ${pc.dim(`${beforeCount} → ${Object.keys(waivers.entries).length} waivers`)}`);\n}\n\nasync function waiveByFindingId(\n targetPath: string,\n findingId: string,\n options: {\n reason: string;\n reasonKey?: import('../baseline/index.js').WaiverReasonKey;\n owner: string;\n expiresInDays: number;\n }\n): Promise<void> {\n // Run audit to find the matching finding\n console.log(pc.dim('Finding matching issue...'));\n\n const result = await audit({ targetPath });\n const findings = result.results.flatMap((r) => r.findings);\n const normalizedId = findingId.split(':').slice(0, 2).join(':');\n const matching = findings.find((f) => generateFindingId(f) === normalizedId);\n\n if (!matching) {\n console.error(pc.red(`Error: No finding found matching ${findingId}`));\n console.log(pc.dim('Run `scheck run` to see current findings.'));\n process.exit(1);\n }\n\n const waivers = await loadWaivers(targetPath);\n const entry = addWaiver(waivers, matching, options);\n await saveWaivers(targetPath, waivers);\n\n console.log(pc.green(`✓ Waiver created`));\n console.log(` ${pc.dim('Finding:')} ${entry.findingId}`);\n console.log(` ${pc.dim('Reason:')} ${entry.reason}`);\n if (entry.reasonKey) {\n console.log(` ${pc.dim('Reason Key:')} ${entry.reasonKey}`);\n }\n console.log(` ${pc.dim('Expires:')} ${getExpiresInLabel(entry.expiresAt)}`);\n}\n\nasync function waiveByInvariant(\n targetPath: string,\n invariantId: string,\n options: {\n reason: string;\n reasonKey?: import('../baseline/index.js').WaiverReasonKey;\n owner: string;\n expiresInDays: number;\n }\n): Promise<void> {\n // Run audit to find findings for this invariant\n console.log(pc.dim('Finding matching issues...'));\n\n const result = await audit({ targetPath });\n const findings = result.results.flatMap((r) => r.findings);\n const matching = findings.filter((f) => f.invariantId === invariantId);\n\n if (matching.length === 0) {\n console.error(pc.red(`Error: No findings found for ${invariantId}`));\n console.log(pc.dim('Run `scheck run` to see current findings.'));\n process.exit(1);\n }\n\n const waivers = await loadWaivers(targetPath);\n\n for (const finding of matching) {\n addWaiver(waivers, finding, options);\n }\n\n await saveWaivers(targetPath, waivers);\n\n console.log(pc.green(`✓ Created ${matching.length} waiver(s) for ${invariantId}`));\n console.log(` ${pc.dim('Reason:')} ${options.reason}`);\n if (options.reasonKey) {\n console.log(` ${pc.dim('Reason Key:')} ${options.reasonKey}`);\n }\n console.log(` ${pc.dim('Expires:')} in ${options.expiresInDays} days`);\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction parseExpiration(value: string): number | null {\n const match = value.match(/^(\\d+)d$/i);\n if (!match) return null;\n const days = match[1];\n if (!days) return null;\n return parseInt(days, 10);\n}\n\nfunction getExpiresInLabel(expiresAt: string): string {\n const now = new Date();\n const expires = new Date(expiresAt);\n const diffMs = expires.getTime() - now.getTime();\n const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays < 0) return 'expired';\n if (diffDays === 0) return 'today';\n if (diffDays === 1) return 'tomorrow';\n return `in ${diffDays} days`;\n}\n","/**\n * Cloud API Client\n *\n * Client for interacting with the SecurityChecks.ai API\n */\n\nimport type { Finding } from '@securitychecks/collector';\nimport { CLIError, ErrorCodes } from './errors.js';\nimport { normalizeApiBaseUrl } from './cloud-config.js';\n\n/**\n * API response types\n */\nexport interface ProjectResponse {\n id: string;\n name: string;\n slug: string;\n organizationId: string;\n defaultBranch: string;\n}\n\nexport interface ScanResponse {\n id: string;\n projectId: string;\n status: 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED' | 'CANCELLED';\n branch?: string;\n commitSha?: string;\n startedAt?: string;\n completedAt?: string;\n}\n\nexport interface FindingSubmitResponse {\n created: number;\n updated: number;\n scanId: string;\n}\n\nexport interface UserInfoResponse {\n id: string;\n email: string;\n name?: string;\n organizations: Array<{\n id: string;\n name: string;\n slug: string;\n }>;\n}\n\nexport interface ValidateKeyResponse {\n valid: boolean;\n email?: string;\n organization?: string;\n plan?: string;\n}\n\n/** Default timeout for API requests (30 seconds) */\nconst DEFAULT_TIMEOUT_MS = 30000;\n\n/**\n * Cloud API client\n */\nexport class CloudApiClient {\n private apiUrl: string;\n private apiKey: string;\n private timeoutMs: number;\n\n constructor(apiUrl: string, apiKey: string, timeoutMs: number = DEFAULT_TIMEOUT_MS) {\n this.apiUrl = normalizeApiBaseUrl(apiUrl);\n this.apiKey = apiKey;\n this.timeoutMs = timeoutMs;\n }\n\n /**\n * Make an authenticated API request with timeout\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<T> {\n const url = `${this.apiUrl}/v1${path}`;\n\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `scheck-cli/${process.env['CLI_VERSION'] || '0.0.0'}`,\n };\n const bypassSecret = process.env['VERCEL_AUTOMATION_BYPASS_SECRET'];\n if (bypassSecret) {\n headers['x-vercel-protection-bypass'] = bypassSecret;\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage: string;\n\n try {\n const errorJson = JSON.parse(errorBody);\n const base = errorJson.error || errorJson.message || errorBody;\n const extra = errorJson.message && errorJson.error ? errorJson.message : undefined;\n const stage = typeof errorJson.stage === 'string' && errorJson.stage\n ? ` (stage: ${errorJson.stage})`\n : '';\n errorMessage = (extra ? `${base}: ${extra}` : base) + stage;\n } catch {\n errorMessage = errorBody || response.statusText;\n }\n\n if (response.status === 401) {\n throw new CLIError(\n ErrorCodes.CLOUD_AUTH_FAILED,\n 'Invalid or expired API key'\n );\n }\n\n if (response.status === 403) {\n throw new CLIError(\n ErrorCodes.CLOUD_PERMISSION_DENIED,\n `Permission denied: ${errorMessage}`\n );\n }\n\n if (response.status === 404) {\n throw new CLIError(\n ErrorCodes.CLOUD_NOT_FOUND,\n `Not found: ${errorMessage}`\n );\n }\n\n if (response.status === 429) {\n throw new CLIError(\n ErrorCodes.CLOUD_RATE_LIMITED,\n 'Rate limit exceeded. Please try again later.'\n );\n }\n\n throw new CLIError(\n ErrorCodes.CLOUD_API_ERROR,\n `API error (${response.status}): ${errorMessage}`\n );\n }\n\n const text = await response.text();\n if (!text) return {} as T;\n\n return JSON.parse(text) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof CLIError) throw error;\n\n // Handle abort/timeout errors\n if (error instanceof Error && error.name === 'AbortError') {\n throw new CLIError(\n ErrorCodes.CLOUD_NETWORK_ERROR,\n `Request timeout: API did not respond within ${this.timeoutMs / 1000} seconds`\n );\n }\n\n if (error instanceof TypeError && error.message.includes('fetch')) {\n throw new CLIError(\n ErrorCodes.CLOUD_NETWORK_ERROR,\n `Network error: Unable to connect to ${this.apiUrl}`\n );\n }\n\n throw new CLIError(\n ErrorCodes.CLOUD_API_ERROR,\n `API request failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Validate the API key\n */\n async validateKey(): Promise<ValidateKeyResponse> {\n return this.request<ValidateKeyResponse>('GET', '/keys/validate');\n }\n\n /**\n * Get project by slug\n */\n async getProject(slug: string): Promise<ProjectResponse> {\n return this.request<ProjectResponse>('GET', `/projects?slug=${encodeURIComponent(slug)}`);\n }\n\n /**\n * Create a new scan\n */\n async createScan(data: {\n projectSlug: string;\n branch?: string;\n commitSha?: string;\n }): Promise<ScanResponse> {\n return this.request<ScanResponse>('POST', '/scans', data);\n }\n\n /**\n * Get scan status\n */\n async getScan(id: string): Promise<ScanResponse> {\n return this.request<ScanResponse>('GET', `/scans/${id}`);\n }\n\n /**\n * Update scan status\n */\n async updateScan(\n id: string,\n data: {\n status: 'COMPLETED' | 'FAILED' | 'CANCELLED';\n summary?: { p0: number; p1: number; p2: number };\n duration?: number;\n }\n ): Promise<ScanResponse> {\n return this.request<ScanResponse>('PATCH', `/scans/${id}`, data);\n }\n\n /**\n * Submit findings for a scan\n */\n async submitFindings(\n scanId: string,\n findings: Finding[]\n ): Promise<FindingSubmitResponse> {\n const formattedFindings = findings.map((f) => {\n // Get primary evidence location\n const primaryEvidence = f.evidence[0];\n\n return {\n invariantId: f.invariantId,\n severity: f.severity,\n title: f.message,\n description: f.requiredProof,\n filePath: primaryEvidence?.file,\n lineNumber: primaryEvidence?.line,\n snippet: primaryEvidence?.snippet,\n remediation: f.remediation,\n testSkeleton: f.suggestedTest,\n };\n });\n\n return this.request<FindingSubmitResponse>('POST', '/findings', {\n scanId,\n findings: formattedFindings,\n });\n }\n\n /**\n * Get user info\n */\n async getUserInfo(): Promise<UserInfoResponse> {\n return this.request<UserInfoResponse>('GET', '/user');\n }\n}\n\n/**\n * Create a cloud API client from configuration\n */\nexport function createCloudClient(\n apiUrl: string,\n apiKey: string\n): CloudApiClient {\n return new CloudApiClient(apiUrl, apiKey);\n}\n","/**\n * Login command - authenticate with SecurityChecks cloud\n */\n\nimport pc from 'picocolors';\nimport * as readline from 'node:readline/promises';\nimport { stdin as input, stdout as output } from 'node:process';\nimport {\n loadCloudConfig,\n updateCloudConfig,\n isValidApiKey,\n getApiUrl,\n formatConfig,\n} from '../lib/cloud-config.js';\nimport { createCloudClient } from '../lib/cloud-api.js';\nimport { CLIError, ErrorCodes } from '../lib/errors.js';\n\ninterface LoginOptions {\n apiKey?: string;\n apiUrl?: string;\n check?: boolean;\n}\n\n/**\n * Prompt user for API key interactively\n */\nasync function promptForApiKey(): Promise<string> {\n const rl = readline.createInterface({ input, output });\n\n console.log(pc.bold('\\nSecurityChecks Cloud Login\\n'));\n console.log(pc.dim('Get your API key at: https://securitychecks.ai/dashboard/settings/api-keys\\n'));\n\n try {\n const apiKey = await rl.question('API Key: ');\n return apiKey.trim();\n } finally {\n rl.close();\n }\n}\n\nexport async function loginCommand(options: LoginOptions): Promise<void> {\n try {\n // Load existing config\n const config = await loadCloudConfig();\n\n // Check current login status\n if (options.check) {\n if (!config.apiKey) {\n console.log(pc.yellow('Not logged in to SecurityChecks cloud.\\n'));\n console.log('Run `scheck login` to authenticate.');\n return;\n }\n\n const apiUrl = options.apiUrl || getApiUrl(config);\n const client = createCloudClient(apiUrl, config.apiKey);\n\n try {\n const result = await client.validateKey();\n if (result.valid) {\n console.log(pc.green('✓ Logged in to SecurityChecks cloud\\n'));\n console.log(formatConfig(config));\n } else {\n console.log(pc.yellow('API key is invalid or expired.\\n'));\n console.log('Run `scheck login` to re-authenticate.');\n }\n } catch (error) {\n if (error instanceof CLIError) {\n console.log(pc.red(`✗ ${error.message}\\n`));\n } else {\n console.log(pc.red('✗ Failed to validate API key\\n'));\n }\n }\n return;\n }\n\n // Get API key from options, env, or prompt\n let apiKey = options.apiKey || process.env['SECURITYCHECKS_API_KEY'];\n\n if (!apiKey) {\n apiKey = await promptForApiKey();\n }\n\n if (!apiKey) {\n console.log(pc.red('\\n✗ No API key provided.\\n'));\n process.exit(1);\n }\n\n // Validate key format\n if (!isValidApiKey(apiKey)) {\n throw new CLIError(\n ErrorCodes.CLOUD_INVALID_API_KEY,\n 'Invalid API key format. Keys should start with sc_live_ or sc_test_'\n );\n }\n\n // Determine API URL\n const apiUrl = options.apiUrl || getApiUrl(config);\n\n console.log(pc.dim(`\\nConnecting to ${apiUrl}...`));\n\n // Validate key with API\n const client = createCloudClient(apiUrl, apiKey);\n const result = await client.validateKey();\n\n if (!result.valid) {\n throw new CLIError(ErrorCodes.CLOUD_AUTH_FAILED, 'API key validation failed');\n }\n\n // Get user info\n const userInfo = await client.getUserInfo();\n\n // Save configuration\n await updateCloudConfig({\n apiKey,\n apiUrl: options.apiUrl || undefined, // Only save if explicitly provided\n email: userInfo.email,\n organization: userInfo.organizations[0]?.name,\n cloudEnabled: true,\n lastSync: new Date().toISOString(),\n });\n\n console.log(pc.green('\\n✓ Successfully logged in!\\n'));\n console.log(` Email: ${userInfo.email}`);\n if (userInfo.name) {\n console.log(` Name: ${userInfo.name}`);\n }\n if (userInfo.organizations.length > 0) {\n console.log(` Organization: ${userInfo.organizations[0]?.name}`);\n }\n console.log('');\n console.log(pc.dim('Cloud mode is now enabled by default.'));\n console.log(pc.dim('Run `scheck run --cloud` to sync findings.'));\n console.log('');\n } catch (error) {\n if (error instanceof CLIError) {\n console.error(pc.red(`\\n✗ ${error.message}\\n`));\n const remediation = error.getRemediation();\n if (remediation) {\n console.error(pc.yellow('How to fix:'));\n for (const line of remediation.split('\\n')) {\n console.error(pc.dim(` ${line}`));\n }\n console.error('');\n }\n } else {\n console.error(pc.red(`\\n✗ Login failed: ${error instanceof Error ? error.message : 'Unknown error'}\\n`));\n }\n process.exit(1);\n }\n}\n\nexport async function logoutCommand(): Promise<void> {\n const config = await loadCloudConfig();\n\n if (!config.apiKey) {\n console.log(pc.yellow('Not logged in to SecurityChecks cloud.\\n'));\n return;\n }\n\n await updateCloudConfig({\n apiKey: undefined,\n email: undefined,\n organization: undefined,\n cloudEnabled: false,\n lastSync: undefined,\n });\n\n console.log(pc.green('✓ Successfully logged out.\\n'));\n console.log(pc.dim('Cloud mode has been disabled.'));\n console.log('');\n}\n","/**\n * Config command - manage SecurityChecks cloud configuration\n */\n\nimport pc from 'picocolors';\nimport {\n loadCloudConfig,\n updateCloudConfig,\n clearCloudConfig,\n formatConfig,\n CONFIG_FILE,\n} from '../lib/cloud-config.js';\nimport { CLIError, ErrorCodes } from '../lib/errors.js';\n\ninterface ConfigOptions {\n show?: boolean;\n set?: string;\n unset?: string;\n clear?: boolean;\n project?: string;\n apiUrl?: string;\n cloudEnabled?: boolean;\n}\n\nconst ALLOWED_KEYS = ['project', 'apiUrl', 'cloudEnabled'] as const;\ntype AllowedKey = (typeof ALLOWED_KEYS)[number];\n\nfunction isAllowedKey(key: string): key is AllowedKey {\n return ALLOWED_KEYS.includes(key as AllowedKey);\n}\n\nexport async function configCommand(options: ConfigOptions): Promise<void> {\n try {\n const config = await loadCloudConfig();\n\n // Show current config\n if (options.show || Object.keys(options).length === 0) {\n console.log('');\n console.log(formatConfig(config));\n console.log('');\n console.log(pc.dim(`Config file: ${CONFIG_FILE}`));\n console.log('');\n return;\n }\n\n // Clear all configuration\n if (options.clear) {\n await clearCloudConfig();\n console.log(pc.green('✓ Configuration cleared.\\n'));\n return;\n }\n\n // Set a value\n if (options.set) {\n const [key, ...valueParts] = options.set.split('=');\n const value = valueParts.join('=');\n\n if (!key || !value) {\n throw new CLIError(\n ErrorCodes.CLI_INVALID_ARGUMENT,\n 'Set requires format: --set key=value'\n );\n }\n\n if (!isAllowedKey(key)) {\n throw new CLIError(\n ErrorCodes.CLI_INVALID_ARGUMENT,\n `Invalid config key: ${key}. Allowed keys: ${ALLOWED_KEYS.join(', ')}`\n );\n }\n\n // Handle boolean values\n let parsedValue: string | boolean = value;\n if (key === 'cloudEnabled') {\n parsedValue = value === 'true' || value === '1';\n }\n\n await updateCloudConfig({ [key]: parsedValue });\n console.log(pc.green(`✓ Set ${key} = ${parsedValue}\\n`));\n return;\n }\n\n // Unset a value\n if (options.unset) {\n const key = options.unset;\n\n if (!isAllowedKey(key)) {\n throw new CLIError(\n ErrorCodes.CLI_INVALID_ARGUMENT,\n `Invalid config key: ${key}. Allowed keys: ${ALLOWED_KEYS.join(', ')}`\n );\n }\n\n await updateCloudConfig({ [key]: undefined });\n console.log(pc.green(`✓ Unset ${key}\\n`));\n return;\n }\n\n // Shorthand options for common settings\n if (options.project !== undefined) {\n await updateCloudConfig({ project: options.project });\n console.log(pc.green(`✓ Set project = ${options.project}\\n`));\n }\n\n if (options.apiUrl !== undefined) {\n await updateCloudConfig({ apiUrl: options.apiUrl });\n console.log(pc.green(`✓ Set apiUrl = ${options.apiUrl}\\n`));\n }\n\n if (options.cloudEnabled !== undefined) {\n await updateCloudConfig({ cloudEnabled: options.cloudEnabled });\n console.log(pc.green(`✓ Set cloudEnabled = ${options.cloudEnabled}\\n`));\n }\n } catch (error) {\n if (error instanceof CLIError) {\n console.error(pc.red(`\\n✗ ${error.message}\\n`));\n const remediation = error.getRemediation();\n if (remediation) {\n console.error(pc.yellow('How to fix:'));\n for (const line of remediation.split('\\n')) {\n console.error(pc.dim(` ${line}`));\n }\n console.error('');\n }\n } else {\n console.error(pc.red(`\\n✗ Config failed: ${error instanceof Error ? error.message : 'Unknown error'}\\n`));\n }\n process.exit(1);\n }\n}\n","/**\n * Sync command - sync scan results to SecurityChecks cloud\n */\n\nimport pc from 'picocolors';\nimport { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { Finding } from '@securitychecks/collector';\nimport {\n loadCloudConfig,\n updateCloudConfig,\n getApiUrl,\n getProject,\n getApiKey,\n} from '../lib/cloud-config.js';\nimport { createCloudClient } from '../lib/cloud-api.js';\nimport { CLIError, ErrorCodes } from '../lib/errors.js';\n\ninterface SyncOptions {\n project?: string;\n branch?: string;\n commit?: string;\n findings?: string;\n dryRun?: boolean;\n}\n\n/** Default findings file path */\nconst DEFAULT_FINDINGS_PATH = '.securitychecks/results.json';\n\ninterface ScanResults {\n targetPath: string;\n runAt: string;\n duration: number;\n summary: {\n total: number;\n passed: number;\n failed: number;\n waived: number;\n byPriority: { P0: number; P1: number; P2: number };\n };\n results: Array<{\n invariantId: string;\n findings: Finding[];\n }>;\n}\n\n/**\n * Load scan results from file\n */\nasync function loadResults(findingsPath: string): Promise<ScanResults> {\n const fullPath = resolve(findingsPath);\n\n if (!existsSync(fullPath)) {\n throw new CLIError(\n ErrorCodes.ARTIFACT_NOT_FOUND,\n `Results file not found: ${fullPath}`\n );\n }\n\n try {\n const content = await readFile(fullPath, 'utf-8');\n return JSON.parse(content) as ScanResults;\n } catch (error) {\n throw new CLIError(\n ErrorCodes.ARTIFACT_INVALID,\n `Failed to parse results: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n\n/**\n * Try to detect git branch and commit\n */\nasync function detectGitInfo(targetPath: string): Promise<{ branch?: string; commit?: string }> {\n try {\n const { execSync } = await import('node:child_process');\n\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd: targetPath,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const commit = execSync('git rev-parse HEAD', {\n cwd: targetPath,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n return { branch, commit };\n } catch {\n return {};\n }\n}\n\nexport async function syncCommand(options: SyncOptions): Promise<void> {\n try {\n const config = await loadCloudConfig();\n const apiKey = getApiKey(options.project) || config.apiKey;\n\n if (!apiKey) {\n throw new CLIError(\n ErrorCodes.CLOUD_AUTH_FAILED,\n 'Not logged in. Run `scheck login` first.'\n );\n }\n\n const projectSlug = getProject(options.project) || config.project;\n\n if (!projectSlug) {\n throw new CLIError(\n ErrorCodes.CLI_MISSING_ARGUMENT,\n 'No project specified. Use --project or set default with `scheck config --set project=<slug>`'\n );\n }\n\n // Load results\n const findingsPath = options.findings || DEFAULT_FINDINGS_PATH;\n console.log(pc.dim(`Loading results from ${findingsPath}...`));\n\n const results = await loadResults(findingsPath);\n const allFindings = results.results.flatMap((r) => r.findings);\n\n // Detect git info\n const gitInfo = await detectGitInfo(results.targetPath);\n const branch = options.branch || gitInfo.branch;\n const commitSha = options.commit || gitInfo.commit;\n\n console.log('');\n console.log(pc.bold('Sync Summary:'));\n console.log(` Project: ${projectSlug}`);\n console.log(` Branch: ${branch || '(none)'}`);\n console.log(` Commit: ${commitSha ? commitSha.substring(0, 8) : '(none)'}`);\n console.log(` Findings: ${allFindings.length}`);\n console.log(` P0: ${results.summary.byPriority.P0}, P1: ${results.summary.byPriority.P1}, P2: ${results.summary.byPriority.P2}`);\n console.log('');\n\n if (options.dryRun) {\n console.log(pc.yellow('Dry run - no changes made.\\n'));\n return;\n }\n\n const apiUrl = getApiUrl(config);\n const client = createCloudClient(apiUrl, apiKey);\n\n // Create scan\n console.log(pc.dim('Creating scan...'));\n const scan = await client.createScan({\n projectSlug,\n branch,\n commitSha,\n });\n\n console.log(pc.dim(`Scan created: ${scan.id}`));\n\n // Submit findings\n if (allFindings.length > 0) {\n console.log(pc.dim('Submitting findings...'));\n const submitResult = await client.submitFindings(scan.id, allFindings);\n console.log(pc.dim(`Created: ${submitResult.created}, Updated: ${submitResult.updated}`));\n }\n\n // Mark scan complete\n console.log(pc.dim('Completing scan...'));\n await client.updateScan(scan.id, {\n status: 'COMPLETED',\n summary: {\n p0: results.summary.byPriority.P0,\n p1: results.summary.byPriority.P1,\n p2: results.summary.byPriority.P2,\n },\n duration: results.duration,\n });\n\n // Update last sync timestamp\n await updateCloudConfig({ lastSync: new Date().toISOString() });\n\n console.log(pc.green('\\n✓ Sync complete!\\n'));\n console.log(pc.dim(`View at: https://securitychecks.ai/dashboard/scans/${scan.id}`));\n console.log('');\n } catch (error) {\n if (error instanceof CLIError) {\n console.error(pc.red(`\\n✗ ${error.message}\\n`));\n const remediation = error.getRemediation();\n if (remediation) {\n console.error(pc.yellow('How to fix:'));\n for (const line of remediation.split('\\n')) {\n console.error(pc.dim(` ${line}`));\n }\n console.error('');\n }\n } else {\n console.error(pc.red(`\\n✗ Sync failed: ${error instanceof Error ? error.message : 'Unknown error'}\\n`));\n }\n process.exit(1);\n }\n}\n","/**\n * Hooks command - manage git hooks for SecurityChecks\n */\n\nimport { writeFile, mkdir, chmod, unlink, readFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport pc from 'picocolors';\nimport { resolveTargetPath } from '@securitychecks/collector';\n\ninterface HooksOptions {\n path?: string;\n install?: boolean;\n uninstall?: boolean;\n show?: boolean;\n}\n\nconst PRE_COMMIT_HOOK = `#!/bin/sh\n# SecurityChecks pre-commit hook\n# https://securitychecks.ai/docs/hooks\n#\n# This hook runs scheck on changed files before each commit.\n# To skip this check for a single commit, use: git commit --no-verify\n\n# Check if scheck is available\nif ! command -v scheck &> /dev/null && ! npx scheck --version &> /dev/null 2>&1; then\n echo \"Warning: scheck not found. Install with: npm install -g @securitychecks/cli\"\n echo \"Skipping security checks...\"\n exit 0\nfi\n\necho \"Running SecurityChecks on staged files...\"\n\n# Run scheck on changed files only\n# --changed: only check files that differ from HEAD\n# --ci: fail on new violations\nif command -v scheck &> /dev/null; then\n scheck run --changed --ci\nelse\n npx scheck run --changed --ci\nfi\n\nexit_code=$?\n\nif [ $exit_code -ne 0 ]; then\n echo \"\"\n echo \"SecurityChecks found issues. Please fix them before committing.\"\n echo \"To skip this check once: git commit --no-verify\"\n echo \"\"\nfi\n\nexit $exit_code\n`;\n\nexport async function hooksCommand(options: HooksOptions): Promise<void> {\n const targetPath = resolveTargetPath(options.path);\n const gitDir = join(targetPath, '.git');\n\n // Check if this is a git repository\n if (!existsSync(gitDir)) {\n console.error(pc.red('Error:') + ' Not a git repository');\n process.exit(1);\n }\n\n const hooksDir = join(gitDir, 'hooks');\n const hookPath = join(hooksDir, 'pre-commit');\n\n // Default to --show if no action specified\n if (!options.install && !options.uninstall) {\n options.show = true;\n }\n\n if (options.show) {\n console.log(pc.bold('\\nSecurityChecks Git Hooks\\n'));\n\n if (existsSync(hookPath)) {\n const hookContent = await readFile(hookPath, 'utf-8');\n if (hookContent.includes('SecurityChecks pre-commit hook')) {\n console.log(pc.green('✓') + ' Pre-commit hook is installed');\n console.log(pc.dim(` Location: ${hookPath}`));\n } else {\n console.log(pc.yellow('⚠') + ' Pre-commit hook exists but is not SecurityChecks');\n console.log(pc.dim(' Use --install to add SecurityChecks to your workflow'));\n }\n } else {\n console.log(pc.dim('○') + ' Pre-commit hook is not installed');\n console.log(pc.dim(' Use --install to install it'));\n }\n console.log('');\n return;\n }\n\n if (options.install) {\n // Create hooks directory if it doesn't exist\n if (!existsSync(hooksDir)) {\n await mkdir(hooksDir, { recursive: true });\n }\n\n // Check if hook already exists\n if (existsSync(hookPath)) {\n const existingHook = await readFile(hookPath, 'utf-8');\n\n if (existingHook.includes('SecurityChecks pre-commit hook')) {\n console.log(pc.yellow('⚠') + ' Pre-commit hook already installed');\n return;\n }\n\n // Another hook exists\n console.log(pc.yellow('⚠') + ' Existing pre-commit hook found');\n console.log(pc.dim(' To manually integrate, add this to your hook:'));\n console.log(pc.cyan(' scheck run --changed --ci'));\n console.log('');\n console.log(pc.dim(' Or use --uninstall first to replace the existing hook'));\n return;\n }\n\n // Install fresh hook\n await writeFile(hookPath, PRE_COMMIT_HOOK);\n await chmod(hookPath, 0o755);\n console.log(pc.green('✓') + ' Installed pre-commit hook');\n console.log(pc.dim(' SecurityChecks will run on staged files before each commit'));\n console.log(pc.dim(' To skip: git commit --no-verify'));\n return;\n }\n\n if (options.uninstall) {\n if (!existsSync(hookPath)) {\n console.log(pc.yellow('⚠') + ' No pre-commit hook found');\n return;\n }\n\n const hookContent = await readFile(hookPath, 'utf-8');\n if (!hookContent.includes('SecurityChecks pre-commit hook')) {\n console.log(pc.yellow('⚠') + ' Pre-commit hook is not a SecurityChecks hook');\n console.log(pc.dim(' Not removing to avoid breaking your existing hook'));\n return;\n }\n\n await unlink(hookPath);\n console.log(pc.green('✓') + ' Uninstalled pre-commit hook');\n return;\n }\n}\n","/**\n * Finding Feedback Client\n *\n * Reports finding quality feedback (TP/FP verdicts) to the SecurityChecks SaaS.\n * Privacy-preserving: sends only invariantId + verdict + predefined reason enum.\n * No source code, no file paths, no PII.\n */\n\nconst DEFAULT_ENDPOINT = 'https://api.securitychecks.ai/v1/feedback';\n\nexport function buildFeedbackEndpoint(apiBaseUrl: string): string {\n const base = apiBaseUrl.trim().replace(/\\/$/, '');\n let url: URL;\n try {\n url = new URL(base);\n } catch {\n return `${base}/v1/feedback`;\n }\n\n const host = url.hostname.toLowerCase();\n const isApiHost = host.startsWith('api.') || host === 'api.securitychecks.ai';\n const suffix = isApiHost ? '/v1/feedback' : '/api/v1/feedback';\n\n const basePath = url.pathname.replace(/\\/$/, '');\n url.pathname = `${basePath}${suffix}`;\n return url.toString();\n}\n\nexport interface FeedbackPayload {\n invariantId: string;\n verdict: 'true_positive' | 'false_positive';\n reason?: 'not_applicable' | 'acceptable_risk' | 'wrong_location' | 'outdated_pattern' | 'missing_context';\n framework?: string;\n clientVersion: string;\n}\n\nexport interface FeedbackConfig {\n enabled: boolean;\n endpoint?: string;\n apiKey?: string;\n timeout?: number;\n}\n\n/**\n * Report finding feedback to the SaaS\n *\n * Follows the same fire-and-forget pattern as correlation-telemetry.ts:\n * AbortController with timeout, silent failures.\n */\nexport async function reportFeedback(\n payload: FeedbackPayload,\n config: FeedbackConfig\n): Promise<boolean> {\n if (!config.enabled) {\n return true;\n }\n\n const endpoint = config.endpoint ?? DEFAULT_ENDPOINT;\n const timeout = config.timeout ?? 5000;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.apiKey && { Authorization: `Bearer ${config.apiKey}` }),\n ...(process.env['VERCEL_AUTOMATION_BYPASS_SECRET'] && {\n 'x-vercel-protection-bypass': process.env['VERCEL_AUTOMATION_BYPASS_SECRET'],\n }),\n 'X-Client-Version': payload.clientVersion,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n return response.ok;\n } finally {\n clearTimeout(timeoutId);\n }\n } catch {\n // Feedback failures are silent - shouldn't break CLI\n return false;\n }\n}\n\nexport const VALID_REASONS = [\n 'not_applicable',\n 'acceptable_risk',\n 'wrong_location',\n 'outdated_pattern',\n 'missing_context',\n] as const;\n\nexport type FeedbackReason = (typeof VALID_REASONS)[number];\n\nexport function isValidReason(reason: string): reason is FeedbackReason {\n return (VALID_REASONS as readonly string[]).includes(reason);\n}\n","/**\n * Feedback Command\n *\n * Report whether a finding was a true positive or false positive.\n * Improves pattern accuracy over time.\n *\n * Usage:\n * scheck feedback AUTHZ.SERVICE_LAYER.ENFORCED --verdict fp --reason not_applicable\n * scheck feedback WEBHOOK.IDEMPOTENT --verdict tp\n */\n\nimport pc from 'picocolors';\nimport {\n reportFeedback,\n isValidReason,\n VALID_REASONS,\n buildFeedbackEndpoint,\n type FeedbackConfig,\n type FeedbackReason,\n} from '../lib/feedback.js';\nimport { isTelemetryDisabled } from '../lib/telemetry.js';\nimport { getApiUrl, loadCloudConfig } from '../lib/cloud-config.js';\n\nexport interface FeedbackOptions {\n path?: string;\n verdict: string;\n reason?: string;\n endpoint?: string;\n}\n\nconst VERDICT_MAP: Record<string, 'true_positive' | 'false_positive'> = {\n tp: 'true_positive',\n true_positive: 'true_positive',\n fp: 'false_positive',\n false_positive: 'false_positive',\n};\n\nexport async function feedbackCommand(\n invariantIdOrFindingId: string,\n options: FeedbackOptions\n): Promise<void> {\n // Validate verdict\n const verdict = VERDICT_MAP[options.verdict];\n if (!verdict) {\n console.error(pc.red(`Error: Invalid verdict \"${options.verdict}\"`));\n console.log(pc.dim('Valid values: tp, fp, true_positive, false_positive'));\n process.exit(1);\n }\n\n // Validate reason if provided\n if (options.reason && !isValidReason(options.reason)) {\n console.error(pc.red(`Error: Invalid reason \"${options.reason}\"`));\n console.log(pc.dim(`Valid reasons: ${VALID_REASONS.join(', ')}`));\n process.exit(1);\n }\n\n const reason = options.reason as FeedbackReason | undefined;\n\n // Extract invariant ID (strip hash suffix if present)\n const invariantId = invariantIdOrFindingId.includes(':')\n ? invariantIdOrFindingId.split(':').slice(0, -1).join(':')\n : invariantIdOrFindingId;\n\n // Check telemetry opt-out\n if (isTelemetryDisabled()) {\n console.log(pc.yellow('Telemetry is disabled. Feedback will not be sent.'));\n console.log(pc.dim('Unset SECURITYCHECKS_TELEMETRY=false or DO_NOT_TRACK=1 to enable.'));\n return;\n }\n\n // Build config from cloud settings\n const cloudConfig = await loadCloudConfig();\n const endpointOverride =\n options.endpoint || process.env['SECURITYCHECKS_FEEDBACK_URL'];\n let endpoint = endpointOverride;\n if (!endpoint) {\n try {\n endpoint = buildFeedbackEndpoint(getApiUrl(cloudConfig));\n } catch {\n endpoint = undefined;\n }\n }\n const feedbackConfig: FeedbackConfig = {\n enabled: true,\n apiKey: cloudConfig.apiKey ?? undefined,\n endpoint,\n timeout: 5000,\n };\n\n const clientVersion = process.env['CLI_VERSION'] ?? '0.0.0-dev';\n\n console.log(pc.dim('Sending feedback...'));\n\n const success = await reportFeedback(\n {\n invariantId,\n verdict,\n reason,\n clientVersion,\n },\n feedbackConfig\n );\n\n if (success) {\n const verdictLabel = verdict === 'true_positive' ? pc.green('true positive') : pc.red('false positive');\n console.log(pc.green('✓ Feedback recorded'));\n console.log(` ${pc.dim('Invariant:')} ${invariantId}`);\n console.log(` ${pc.dim('Verdict:')} ${verdictLabel}`);\n if (reason) {\n console.log(` ${pc.dim('Reason:')} ${reason}`);\n }\n } else {\n console.error(pc.red('Failed to send feedback. The API may be unreachable.'));\n process.exit(1);\n }\n}\n","/**\n * List invariants command\n *\n * Prints all supported invariants (optionally filtered), for scripting and discovery.\n */\n\nimport pc from 'picocolors';\nimport { ALL_INVARIANTS } from '@securitychecks/collector';\nimport { getStaffQuestion } from '../lib/staff.js';\n\nexport interface ListInvariantsOptions {\n category?: string;\n severity?: 'P0' | 'P1' | 'P2';\n json?: boolean;\n}\n\nexport async function listInvariantsCommand(options: ListInvariantsOptions): Promise<void> {\n const category = options.category?.trim();\n const severity = options.severity?.trim() as ListInvariantsOptions['severity'] | undefined;\n\n let invariants = ALL_INVARIANTS;\n if (category) invariants = invariants.filter((i) => i.category === category);\n if (severity) invariants = invariants.filter((i) => i.severity === severity);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n invariants.map((i) => ({\n id: i.id,\n name: i.name,\n severity: i.severity,\n category: i.category,\n staff_engineer_asks: getStaffQuestion(i.id),\n })),\n null,\n 2\n )\n );\n return;\n }\n\n if (category || severity) {\n console.log(pc.dim(`Filters: ${category ? `category=${category}` : ''}${category && severity ? ', ' : ''}${severity ? `severity=${severity}` : ''}`));\n console.log('');\n }\n\n for (const inv of invariants) {\n const severityColor =\n inv.severity === 'P0' ? pc.red : inv.severity === 'P1' ? pc.yellow : pc.blue;\n console.log(` ${severityColor(`[${inv.severity}]`)} ${inv.id}`);\n console.log(pc.dim(` ${inv.name}`));\n\n const question = getStaffQuestion(inv.id);\n if (question) {\n console.log(pc.dim(` Staff asks: ${question}`));\n }\n }\n console.log('');\n}\n\n","/**\n * Generate test command\n *\n * Produces a test skeleton that proves an invariant is enforced.\n */\n\nimport pc from 'picocolors';\nimport { getInvariantById } from '@securitychecks/collector';\nimport { generateTestSkeleton, type TestFramework } from '../lib/staff.js';\n\nexport interface GenerateTestOptions {\n framework?: TestFramework;\n context?: string;\n}\n\nexport async function generateTestCommand(\n invariantId: string,\n options: GenerateTestOptions\n): Promise<void> {\n const invariant = getInvariantById(invariantId);\n if (!invariant) {\n console.error(pc.red(`Unknown invariant: ${invariantId}`));\n process.exit(1);\n }\n\n const framework = options.framework ?? 'vitest';\n const test = generateTestSkeleton(invariant, framework, options.context);\n console.log(test);\n}\n\n","/**\n * Structured Logger for SecurityChecks CLI\n *\n * Features:\n * - Log levels: debug, info, warn, error\n * - Verbose mode support\n * - Silent mode for JSON output\n * - Automatic redaction of sensitive data\n */\n\nimport pc from 'picocolors';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\ninterface LoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n json?: boolean;\n}\n\n/**\n * Patterns that indicate sensitive data to redact\n */\nconst SENSITIVE_PATTERNS = [\n /api[_-]?key/i,\n /secret/i,\n /password/i,\n /token/i,\n /credential/i,\n /auth/i,\n];\n\n/**\n * Prefixes that indicate sensitive values\n */\nconst SENSITIVE_PREFIXES = ['sk_', 'pk_', 'Bearer ', 'Basic '];\n\nclass Logger {\n private verbose = false;\n private silent = false;\n private json = false;\n\n configure(options: LoggerOptions): void {\n this.verbose = options.verbose ?? false;\n this.silent = options.silent ?? false;\n this.json = options.json ?? false;\n }\n\n debug(message: string, data?: Record<string, unknown>): void {\n if (!this.verbose || this.silent) return;\n this.log('debug', message, data);\n }\n\n info(message: string, data?: Record<string, unknown>): void {\n if (this.silent) return;\n this.log('info', message, data);\n }\n\n warn(message: string, data?: Record<string, unknown>): void {\n if (this.silent) return;\n this.log('warn', message, data);\n }\n\n error(message: string, data?: Record<string, unknown>): void {\n this.log('error', message, data);\n }\n\n /**\n * Log a step in a process (for progress indication)\n */\n step(step: number, total: number, message: string): void {\n if (this.silent) return;\n console.log(pc.dim(`[${step}/${total}]`), message);\n }\n\n /**\n * Log a success message\n */\n success(message: string): void {\n if (this.silent) return;\n console.log(pc.green('✓'), message);\n }\n\n /**\n * Log a failure message\n */\n fail(message: string): void {\n console.log(pc.red('✗'), message);\n }\n\n private log(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n const timestamp = new Date().toISOString();\n const redactedData = data ? this.redact(data) : undefined;\n\n if (this.json) {\n console.log(\n JSON.stringify({\n timestamp,\n level,\n message,\n ...(redactedData && { data: redactedData }),\n })\n );\n return;\n }\n\n const prefix = this.getPrefix(level);\n const formattedMessage = `${prefix} ${message}`;\n\n if (level === 'error') {\n console.error(formattedMessage);\n } else {\n console.log(formattedMessage);\n }\n\n if (this.verbose && redactedData) {\n console.log(pc.dim(JSON.stringify(redactedData, null, 2)));\n }\n }\n\n private getPrefix(level: LogLevel): string {\n switch (level) {\n case 'debug':\n return pc.dim('[DEBUG]');\n case 'info':\n return pc.blue('[INFO]');\n case 'warn':\n return pc.yellow('[WARN]');\n case 'error':\n return pc.red('[ERROR]');\n }\n }\n\n /**\n * Redact sensitive data from log output\n */\n private redact(data: Record<string, unknown>): Record<string, unknown> {\n const redacted: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (this.isSensitiveKey(key)) {\n redacted[key] = '[REDACTED]';\n } else if (typeof value === 'string' && this.isSensitiveValue(value)) {\n redacted[key] = this.redactValue(value);\n } else if (typeof value === 'object' && value !== null) {\n redacted[key] = this.redact(value as Record<string, unknown>);\n } else {\n redacted[key] = value;\n }\n }\n\n return redacted;\n }\n\n private isSensitiveKey(key: string): boolean {\n return SENSITIVE_PATTERNS.some((pattern) => pattern.test(key));\n }\n\n private isSensitiveValue(value: string): boolean {\n return SENSITIVE_PREFIXES.some((prefix) => value.startsWith(prefix));\n }\n\n private redactValue(value: string): string {\n if (value.length <= 8) {\n return '[REDACTED]';\n }\n return value.slice(0, 4) + '...' + value.slice(-4);\n }\n}\n\n// Singleton logger instance\nexport const logger = new Logger();\n\n// Convenience exports\nexport const debug = logger.debug.bind(logger);\nexport const info = logger.info.bind(logger);\nexport const warn = logger.warn.bind(logger);\nexport const error = logger.error.bind(logger);\nexport const step = logger.step.bind(logger);\nexport const success = logger.success.bind(logger);\nexport const fail = logger.fail.bind(logger);\n","#!/usr/bin/env node\n\n/**\n * SecurityChecks CLI\n *\n * Enforce backend invariants in your codebase.\n * https://securitychecks.ai\n */\n\nimport { Command } from 'commander';\nimport { runCommand } from './commands/run.js';\nimport { explainCommand } from './commands/explain.js';\nimport { initCommand } from './commands/init.js';\nimport { baselineCommand } from './commands/baseline.js';\nimport { waiverCommand, waiveCommand } from './commands/waiver.js';\nimport { loginCommand, logoutCommand } from './commands/login.js';\nimport { configCommand } from './commands/config.js';\nimport { syncCommand } from './commands/sync.js';\nimport { hooksCommand } from './commands/hooks.js';\nimport { feedbackCommand } from './commands/feedback.js';\nimport { listInvariantsCommand } from './commands/list-invariants.js';\nimport { generateTestCommand } from './commands/generate-test.js';\nimport { logger } from './lib/logger.js';\n\n// Version injected at build time via tsup define\nconst version = process.env['CLI_VERSION'] ?? '0.0.0-dev';\n\nconst program = new Command();\n\nprogram\n .name('scheck')\n .description('Enforce backend invariants in your codebase')\n .version(version);\n\n// Run command - scan for security invariants\nprogram\n .command('run')\n .description('Scan for security invariants')\n .option('-p, --path <path>', 'Target path to audit (default: current directory)')\n .option('-a, --artifact <path>', 'Use pre-collected artifact from scc (skips collection)')\n .option('--changed', 'Only check changed files (requires git)')\n .option('--ci', 'CI mode - fail on new violations')\n // Output control\n .option('--all', 'Show all findings (don\\'t stop early, include P2)')\n .option('--include-p2', 'Include P2 (medium) findings')\n .option('--only <invariants...>', 'Only run specific invariant checks')\n .option('--skip <invariants...>', 'Skip specific invariant checks')\n .option('--json', 'Output results as JSON')\n .option('--sarif <path>', 'Write SARIF report to file (for GitHub Code Scanning)')\n .option('--quiet', 'Suppress output except errors')\n .option('-v, --verbose', 'Enable verbose output')\n // Cloud control\n .option('--calibrate', 'Enable calibration API (default: enabled)')\n .option('--offline', 'Disable all API calls (not supported - shows error)')\n .option('--calibration-endpoint <url>', 'Override calibration API endpoint')\n .option('--patterns', 'Enable Pro Patterns fetching (default: enabled)')\n .option('--no-patterns', 'Disable Pro Patterns fetching')\n .option('--pattern-endpoint <url>', 'Override patterns API endpoint')\n .option('--patterns-file <path>', 'Load patterns from local JSON file (dev/testing)')\n .option('-w, --watch', 'Watch for file changes and re-run')\n .option('--no-local-scan', 'Skip local source-level pattern scanning')\n .option('--no-usage-banner', 'Suppress periodic API usage reminders')\n .action((options) => {\n logger.configure({\n verbose: options.verbose,\n silent: options.quiet,\n json: options.json,\n });\n return runCommand(options);\n });\n\n// Explain command - explain an invariant\nprogram\n .command('explain <invariant>')\n .description('Deep-dive on any invariant (why it matters, what good looks like)')\n .action(explainCommand);\n\n// List invariants command\nprogram\n .command('list-invariants')\n .description('List all invariants (optionally filtered)')\n .option('--category <category>', 'Filter by category (authz, webhooks, transactions, etc.)')\n .option('--severity <severity>', 'Filter by severity (P0, P1, P2)')\n .option('--json', 'Output as JSON')\n .action((options) => listInvariantsCommand(options));\n\n// Generate test skeleton command\nprogram\n .command('generate-test <invariantId>')\n .description('Generate a test skeleton proving an invariant is enforced')\n .option('--framework <framework>', 'Test framework: vitest, jest, playwright', 'vitest')\n .option('--context <context>', 'Extra context to make the test more targeted')\n .action((invariantId, options) => generateTestCommand(invariantId, options));\n\n// Init command - initialize SecurityChecks in a project\nprogram\n .command('init')\n .description('Initialize SecurityChecks in a project')\n .option('-p, --path <path>', 'Target path (default: current directory)')\n .option('--hooks', 'Install git pre-commit hook to run checks before commits')\n .action(initCommand);\n\n// Hooks command - manage git hooks\nprogram\n .command('hooks')\n .description('Manage git pre-commit hooks')\n .option('-p, --path <path>', 'Target path (default: current directory)')\n .option('--install', 'Install pre-commit hook')\n .option('--uninstall', 'Uninstall pre-commit hook')\n .option('--show', 'Show current hook status (default)')\n .action(hooksCommand);\n\n// Baseline command - manage baseline of known issues\nprogram\n .command('baseline')\n .description('Manage the baseline of known issues')\n .option('-p, --path <path>', 'Target path (default: current directory)')\n .option('--update', 'Update baseline with current findings')\n .option('--show', 'Show current baseline')\n .option('--prune', 'Remove stale entries not seen recently')\n .option('--prune-days <days>', 'Days before considering stale (default: 90)')\n .option('--notes <notes>', 'Notes to attach to new baseline entries')\n .option('-y, --yes', 'Skip confirmation prompt (for CI/automation)')\n .action(baselineCommand);\n\n// Waive command - temporarily waive a finding\nprogram\n .command('waive <findingId>')\n .description('Temporarily waive a finding (use full findingId or invariant)')\n .option('-p, --path <path>', 'Target path (default: current directory)')\n .option('-r, --reason <reason>', 'Reason for waiving (required)')\n .option('--reason-key <key>', 'Reason key (optional): false_positive, acceptable_risk, will_fix_later, not_applicable, other')\n .option('-e, --expires <duration>', 'Expiration duration (e.g., 7d, 30d, 90d)', '30d')\n .option('-o, --owner <owner>', 'Owner/contact for this waiver')\n .action(waiveCommand);\n\n// Waiver command - manage waivers\nprogram\n .command('waiver')\n .description('View and manage temporary waivers')\n .option('-p, --path <path>', 'Target path (default: current directory)')\n .option('--show', 'Show all active waivers')\n .option('--expiring', 'Show waivers expiring soon')\n .option('--expiring-days <days>', 'Days to consider \"expiring soon\" (default: 7)')\n .option('--prune', 'Remove expired waivers')\n .action(waiverCommand);\n\n// Feedback command - report finding quality\nprogram\n .command('feedback <invariantId>')\n .description('Report whether a finding was a true positive or false positive')\n .option('-p, --path <path>', 'Target path (default: current directory)')\n .option('--verdict <verdict>', 'Verdict: tp (true positive) or fp (false positive)')\n .option('--reason <reason>', 'Reason: not_applicable, acceptable_risk, wrong_location, outdated_pattern, missing_context')\n .option('--endpoint <url>', 'Feedback endpoint URL (or set SECURITYCHECKS_FEEDBACK_URL)')\n .action(feedbackCommand);\n\n// ==========================================\n// Cloud commands\n// ==========================================\n\n// Login command - authenticate with cloud\nprogram\n .command('login')\n .description('Authenticate with SecurityChecks cloud')\n .option('-k, --api-key <key>', 'API key (or set SECURITYCHECKS_API_KEY)')\n .option('--api-url <url>', 'Custom API URL (for self-hosted)')\n .option('--check', 'Check current login status')\n .action(loginCommand);\n\n// Logout command - clear cloud credentials\nprogram\n .command('logout')\n .description('Log out from SecurityChecks cloud')\n .action(logoutCommand);\n\n// Config command - manage cloud configuration\nprogram\n .command('config')\n .description('Manage cloud configuration')\n .option('--show', 'Show current configuration')\n .option('--set <key=value>', 'Set a configuration value')\n .option('--unset <key>', 'Unset a configuration value')\n .option('--clear', 'Clear all configuration')\n .option('--project <slug>', 'Set default project')\n .option('--api-url <url>', 'Set API URL')\n .option('--cloud-enabled', 'Enable cloud mode')\n .option('--no-cloud-enabled', 'Disable cloud mode')\n .action(configCommand);\n\n// Sync command - sync findings to cloud\nprogram\n .command('sync')\n .description('Sync scan results to SecurityChecks cloud')\n .option('--project <slug>', 'Project slug')\n .option('--branch <name>', 'Git branch name')\n .option('--commit <sha>', 'Git commit SHA')\n .option('--findings <path>', 'Path to findings file')\n .option('--dry-run', 'Show what would be synced without syncing')\n .action(syncCommand);\n\nprogram.parse();\n"]}
1
+ {"version":3,"sources":["../src/lib/errors.ts","../src/lib/schema.ts","../src/lib/calibration.ts","../src/patterns/bundled.json","../src/lib/patterns.ts","../src/lib/test-patterns.ts","../src/baseline/schema.ts","../src/findings/finding-id.ts","../src/baseline/storage.ts","../src/baseline/matcher.ts","../src/lib/sarif.ts","../src/lib/correlation.ts","../src/lib/correlation-telemetry.ts","../src/lib/telemetry.ts","../src/lib/cloud-config.ts","../src/lib/license.ts","../src/lib/watcher.ts","../src/lib/ci-detect.ts","../src/lib/cloud-eval.ts","../src/lib/project-slug.ts","../src/lib/staff.ts","../src/lib/score.ts","../src/commands/run.ts","../src/commands/explain.ts","../src/commands/init.ts","../src/audit.ts","../src/commands/baseline.ts","../src/commands/waiver.ts","../src/lib/cloud-api.ts","../src/commands/login.ts","../src/commands/config.ts","../src/commands/sync.ts","../src/commands/hooks.ts","../src/lib/feedback.ts","../src/commands/feedback.ts","../src/commands/list-invariants.ts","../src/commands/generate-test.ts","../src/commands/preflight.ts","../src/lib/logger.ts","../src/index.ts"],"names":["error","version","CLI_VERSION","DEFAULT_CACHE_PATH","join","existsSync","dirname","loadCache","readFile","saveCache","mkdir","writeFile","result","findingId","step","randomUUID","DEFAULT_ENDPOINT","input","getProject","readFileSync","resolve","pc","normalizeFrameworkList","DEFAULT_PATTERN_CONFIG","targetPath","getInvariantById","severityColor","indent","resolveTargetPath","toArtifact","collect","output","apiUrl","client","PRE_COMMIT_HOOK","chmod","success","ALL_INVARIANTS"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Deterministic Error Codes for SecurityChecks CLI\n *\n * Format: SC_<CATEGORY>_<NUMBER>\n *\n * Categories:\n * - CONFIG: Configuration errors\n * - PARSE: Parsing/syntax errors\n * - CHECK: Checker execution errors\n * - IO: File system / network errors\n * - CLI: Command line argument errors\n */\n\nexport const ErrorCodes = {\n // CONFIG errors (001-099)\n CONFIG_NOT_FOUND: 'SC_CONFIG_001',\n CONFIG_INVALID: 'SC_CONFIG_002',\n CONFIG_SCHEMA_ERROR: 'SC_CONFIG_003',\n\n // PARSE errors (100-199)\n PARSE_TYPESCRIPT_ERROR: 'SC_PARSE_101',\n PARSE_FILE_NOT_FOUND: 'SC_PARSE_102',\n PARSE_UNSUPPORTED_SYNTAX: 'SC_PARSE_103',\n\n // CHECK errors (200-299)\n CHECK_EXECUTION_ERROR: 'SC_CHECK_201',\n CHECK_TIMEOUT: 'SC_CHECK_202',\n CHECK_INVARIANT_NOT_FOUND: 'SC_CHECK_203',\n\n // IO errors (300-399)\n IO_READ_ERROR: 'SC_IO_301',\n IO_WRITE_ERROR: 'SC_IO_302',\n IO_PERMISSION_DENIED: 'SC_IO_303',\n IO_PATH_NOT_FOUND: 'SC_IO_304',\n\n // CLI errors (400-499)\n CLI_INVALID_ARGUMENT: 'SC_CLI_401',\n CLI_MISSING_ARGUMENT: 'SC_CLI_402',\n CLI_UNKNOWN_COMMAND: 'SC_CLI_403',\n\n // ARTIFACT errors (500-599)\n ARTIFACT_NOT_FOUND: 'SC_ARTIFACT_501',\n ARTIFACT_INVALID: 'SC_ARTIFACT_502',\n ARTIFACT_VERSION_MISMATCH: 'SC_ARTIFACT_503',\n\n // CLOUD errors (600-699)\n CLOUD_AUTH_FAILED: 'SC_CLOUD_601',\n CLOUD_PERMISSION_DENIED: 'SC_CLOUD_602',\n CLOUD_NOT_FOUND: 'SC_CLOUD_603',\n CLOUD_RATE_LIMITED: 'SC_CLOUD_604',\n CLOUD_API_ERROR: 'SC_CLOUD_605',\n CLOUD_NETWORK_ERROR: 'SC_CLOUD_606',\n CLOUD_INVALID_API_KEY: 'SC_CLOUD_607',\n AUTH_REQUIRED: 'SC_CLOUD_608',\n OFFLINE_NOT_SUPPORTED: 'SC_CLOUD_609',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/**\n * User-friendly error messages for each error code\n */\nexport const ErrorMessages: Record<ErrorCode, string> = {\n [ErrorCodes.CONFIG_NOT_FOUND]: 'Configuration file not found',\n [ErrorCodes.CONFIG_INVALID]: 'Configuration file is invalid',\n [ErrorCodes.CONFIG_SCHEMA_ERROR]: 'Configuration does not match expected schema',\n\n [ErrorCodes.PARSE_TYPESCRIPT_ERROR]: 'Failed to parse TypeScript file',\n [ErrorCodes.PARSE_FILE_NOT_FOUND]: 'Source file not found',\n [ErrorCodes.PARSE_UNSUPPORTED_SYNTAX]: 'Unsupported syntax encountered',\n\n [ErrorCodes.CHECK_EXECUTION_ERROR]: 'Error executing invariant check',\n [ErrorCodes.CHECK_TIMEOUT]: 'Invariant check timed out',\n [ErrorCodes.CHECK_INVARIANT_NOT_FOUND]: 'Invariant not found',\n\n [ErrorCodes.IO_READ_ERROR]: 'Failed to read file',\n [ErrorCodes.IO_WRITE_ERROR]: 'Failed to write file',\n [ErrorCodes.IO_PERMISSION_DENIED]: 'Permission denied',\n [ErrorCodes.IO_PATH_NOT_FOUND]: 'Path not found',\n\n [ErrorCodes.CLI_INVALID_ARGUMENT]: 'Invalid argument provided',\n [ErrorCodes.CLI_MISSING_ARGUMENT]: 'Required argument missing',\n [ErrorCodes.CLI_UNKNOWN_COMMAND]: 'Unknown command',\n\n [ErrorCodes.ARTIFACT_NOT_FOUND]: 'Artifact file not found',\n [ErrorCodes.ARTIFACT_INVALID]: 'Invalid artifact format',\n [ErrorCodes.ARTIFACT_VERSION_MISMATCH]: 'Artifact version not supported',\n\n [ErrorCodes.CLOUD_AUTH_FAILED]: 'Authentication failed',\n [ErrorCodes.CLOUD_PERMISSION_DENIED]: 'Permission denied',\n [ErrorCodes.CLOUD_NOT_FOUND]: 'Resource not found',\n [ErrorCodes.CLOUD_RATE_LIMITED]: 'Rate limit exceeded',\n [ErrorCodes.CLOUD_API_ERROR]: 'Cloud API error',\n [ErrorCodes.CLOUD_NETWORK_ERROR]: 'Network error',\n [ErrorCodes.CLOUD_INVALID_API_KEY]: 'Invalid API key format',\n [ErrorCodes.AUTH_REQUIRED]: 'API key required for evaluation',\n [ErrorCodes.OFFLINE_NOT_SUPPORTED]: 'Offline mode is not supported',\n};\n\n/**\n * Remediation guidance for each error code\n * Helps users understand what to do when they encounter an error.\n */\nexport const ErrorRemediation: Record<ErrorCode, string> = {\n // CONFIG errors\n [ErrorCodes.CONFIG_NOT_FOUND]: `\nCreate a configuration file in your project root:\n\n scheck init\n\nOr create securitychecks.config.ts manually:\n\n export default {\n include: ['src/**/*.ts'],\n exclude: ['node_modules/**'],\n };\n`.trim(),\n\n [ErrorCodes.CONFIG_INVALID]: `\nCheck your securitychecks.config.ts for syntax errors.\n\nCommon issues:\n- Missing export default\n- Invalid JSON in securitychecks.json\n- Typo in configuration keys\n\nRun with --verbose for more details.\n`.trim(),\n\n [ErrorCodes.CONFIG_SCHEMA_ERROR]: `\nYour configuration has invalid options. Check these common issues:\n\n- 'include' and 'exclude' must be arrays of glob patterns\n- 'testPatterns' must be an array of test file patterns\n- 'servicePatterns' must be an array of service file patterns\n\nSee: https://securitychecks.ai/docs/configuration\n`.trim(),\n\n // PARSE errors\n [ErrorCodes.PARSE_TYPESCRIPT_ERROR]: `\nA TypeScript file failed to parse. This usually means:\n\n1. The file has syntax errors - run tsc to check\n2. The file uses unsupported TypeScript features\n3. There are missing dependencies\n\nTry:\n npx tsc --noEmit\n\nIf the error persists, exclude the problematic file:\n exclude: ['path/to/problematic-file.ts']\n`.trim(),\n\n [ErrorCodes.PARSE_FILE_NOT_FOUND]: `\nThe specified source file doesn't exist. Check:\n\n1. The file path is correct\n2. The file hasn't been moved or deleted\n3. Your include/exclude patterns are correct\n\nRun: ls <path> to verify the file exists.\n`.trim(),\n\n [ErrorCodes.PARSE_UNSUPPORTED_SYNTAX]: `\nThe file contains syntax that can't be parsed. This may happen with:\n\n- Very new TypeScript/JavaScript features\n- Non-standard syntax extensions\n- Malformed source code\n\nTry excluding the file or updating the parser.\n`.trim(),\n\n // CHECK errors\n [ErrorCodes.CHECK_EXECUTION_ERROR]: `\nAn invariant check failed to run. This is usually a bug in scheck.\n\nPlease report this issue with:\n1. The full error message (--verbose)\n2. A minimal reproduction\n3. Your Node.js and @securitychecks/cli versions\n\nReport at: https://github.com/securitychecks/securitychecks.ai/issues\n`.trim(),\n\n [ErrorCodes.CHECK_TIMEOUT]: `\nAn invariant check took too long. This can happen with:\n\n1. Very large codebases\n2. Complex file structures\n3. Slow file system access\n\nTry:\n- Narrowing include patterns to scan fewer files\n- Excluding large generated files\n- Running with --only to check specific invariants\n`.trim(),\n\n [ErrorCodes.CHECK_INVARIANT_NOT_FOUND]: `\nThe specified invariant ID doesn't exist.\n\nList available invariants:\n scheck explain --list\n\nCommon invariant IDs:\n- AUTHZ.SERVICE_LAYER.ENFORCED\n- WEBHOOK.IDEMPOTENT\n- TRANSACTION.POST_COMMIT.SIDE_EFFECTS\n`.trim(),\n\n // IO errors\n [ErrorCodes.IO_READ_ERROR]: `\nFailed to read a file. Check:\n\n1. The file exists and is readable\n2. You have permission to read the file\n3. The file is not locked by another process\n\nTry: cat <file> to verify readability.\n`.trim(),\n\n [ErrorCodes.IO_WRITE_ERROR]: `\nFailed to write a file. Check:\n\n1. The directory exists\n2. You have write permission\n3. There's enough disk space\n4. The file is not locked\n\nTry: touch <file> to verify writability.\n`.trim(),\n\n [ErrorCodes.IO_PERMISSION_DENIED]: `\nPermission denied accessing a file or directory.\n\nOn Unix/Mac:\n chmod +r <file> # Make readable\n chmod +w <file> # Make writable\n\nOn Windows: Check file properties > Security tab.\n`.trim(),\n\n [ErrorCodes.IO_PATH_NOT_FOUND]: `\nThe specified path doesn't exist.\n\nCheck:\n1. You're in the correct directory\n2. The path is spelled correctly\n3. The directory structure is correct\n\nRun: pwd && ls to verify your location.\n`.trim(),\n\n // CLI errors\n [ErrorCodes.CLI_INVALID_ARGUMENT]: `\nInvalid command-line argument.\n\nRun: scheck --help\n\nCommon commands:\n scheck run # Run all checks\n scheck run --ci # CI mode (fails on P0/P1)\n scheck explain <id> # Explain an invariant\n scheck init # Initialize configuration\n`.trim(),\n\n [ErrorCodes.CLI_MISSING_ARGUMENT]: `\nA required argument is missing.\n\nCheck the command syntax:\n scheck --help\n scheck <command> --help\n`.trim(),\n\n [ErrorCodes.CLI_UNKNOWN_COMMAND]: `\nUnknown command. Available commands:\n\n run Run invariant checks\n init Initialize configuration\n explain Explain an invariant\n baseline Manage baseline\n waive Waive a finding\n\nRun: scheck --help\n`.trim(),\n\n // ARTIFACT errors\n [ErrorCodes.ARTIFACT_NOT_FOUND]: `\nArtifact file not found.\n\nThe artifact file stores collected code facts. Options:\n\n1. Let scheck collect automatically (default):\n scheck run\n\n2. Collect manually first:\n npx scc collect -o .securitychecks/artifacts.json\n scheck run --artifact .securitychecks/artifacts.json\n\n3. Check if file was deleted:\n ls .securitychecks/\n`.trim(),\n\n [ErrorCodes.ARTIFACT_INVALID]: `\nThe artifact file is malformed or corrupt.\n\nCommon issues:\n- Incomplete JSON (process was killed during write)\n- Modified manually with syntax errors\n- Wrong file format\n\nFix:\n1. Delete the corrupt artifact:\n rm .securitychecks/artifacts.json\n\n2. Re-collect:\n scheck run\n (or: npx scc collect -o .securitychecks/artifacts.json)\n`.trim(),\n\n [ErrorCodes.ARTIFACT_VERSION_MISMATCH]: `\nThe artifact was created by an incompatible version.\n\nThis happens when:\n- Artifact was created by an older/newer scheck version\n- Artifact schema has changed\n\nFix:\n1. Delete the old artifact:\n rm .securitychecks/artifacts.json\n\n2. Re-collect with current version:\n scheck run\n\nYour current version: scheck --version\n`.trim(),\n\n // CLOUD errors\n [ErrorCodes.CLOUD_AUTH_FAILED]: `\nAuthentication failed. Your API key may be invalid or expired.\n\nFix:\n1. Generate a new API key at https://securitychecks.ai/dashboard/settings/api-keys\n2. Log in again:\n scheck login\n\nEnvironment variable:\n export SECURITYCHECKS_API_KEY=sc_live_...\n`.trim(),\n\n [ErrorCodes.CLOUD_PERMISSION_DENIED]: `\nYou don't have permission for this action.\n\nCheck:\n1. You have access to the project/organization\n2. Your API key has the required scopes\n3. Your subscription is active\n\nManage at: https://securitychecks.ai/dashboard\n`.trim(),\n\n [ErrorCodes.CLOUD_NOT_FOUND]: `\nThe requested resource was not found.\n\nCheck:\n1. The project slug is correct\n2. The project exists and you have access\n3. The resource ID is valid\n\nList your projects:\n scheck config --show\n`.trim(),\n\n [ErrorCodes.CLOUD_RATE_LIMITED]: `\nYou've hit the rate limit. Please try again later.\n\nOptions:\n1. Wait a few minutes and retry\n2. Upgrade your plan for higher limits\n\nPlan limits: https://securitychecks.ai/pricing\n`.trim(),\n\n [ErrorCodes.CLOUD_API_ERROR]: `\nThe SecurityChecks API returned an error.\n\nThis could be:\n1. A temporary service issue - try again shortly\n2. An invalid request - check your parameters\n\nStatus: https://status.securitychecks.ai\nHelp: https://securitychecks.ai/docs/troubleshooting\n`.trim(),\n\n [ErrorCodes.CLOUD_NETWORK_ERROR]: `\nCould not connect to SecurityChecks API.\n\nCheck:\n1. Your internet connection\n2. Firewall/proxy settings\n3. API endpoint accessibility\n\nDefault API: https://api.securitychecks.ai\n`.trim(),\n\n [ErrorCodes.CLOUD_INVALID_API_KEY]: `\nThe API key format is invalid.\n\nAPI keys should start with:\n- sc_live_ for production\n- sc_test_ for testing\n\nGet a key at: https://securitychecks.ai/dashboard/settings/api-keys\n`.trim(),\n\n [ErrorCodes.AUTH_REQUIRED]: `\nAn API key is required to run security checks.\n\nSecurityChecks uses cloud evaluation to protect proprietary patterns.\nYour source code never leaves your machine - only structural facts are sent.\n\nSetup:\n1. Get your API key at https://securitychecks.ai/dashboard/settings/api-keys\n2. Set environment variable:\n export SECURITYCHECKS_API_KEY=sc_live_...\n\nOr add to securitychecks.config.yaml:\n calibration:\n apiKey: sc_live_...\n`.trim(),\n\n [ErrorCodes.OFFLINE_NOT_SUPPORTED]: `\nOffline mode is not supported.\n\nSecurityChecks requires cloud evaluation to protect proprietary patterns.\nYour source code never leaves your machine - only structural facts are sent.\n\nOptions:\n1. Remove --offline flag and ensure network connectivity\n2. For air-gapped environments, contact sales for an enterprise on-premise license:\n https://securitychecks.ai/enterprise\n`.trim(),\n};\n\n/**\n * Structured CLI Error with deterministic error code\n */\nexport class CLIError extends Error {\n public readonly code: ErrorCode;\n public readonly details?: unknown;\n public override readonly cause?: Error;\n\n constructor(code: ErrorCode, message?: string, options?: { details?: unknown; cause?: Error }) {\n const baseMessage = message ?? ErrorMessages[code];\n super(baseMessage, { cause: options?.cause });\n\n this.name = 'CLIError';\n this.code = code;\n this.details = options?.details;\n this.cause = options?.cause;\n\n // Maintains proper stack trace for where error was thrown\n Error.captureStackTrace?.(this, CLIError);\n }\n\n /**\n * Get remediation guidance for this error\n */\n getRemediation(): string {\n return ErrorRemediation[this.code];\n }\n\n /**\n * Format error for user display\n */\n toUserString(verbose = false): string {\n const parts: string[] = [`[${this.code}] ${this.message}`];\n\n if (verbose && this.details) {\n parts.push(`\\nDetails: ${JSON.stringify(this.details, null, 2)}`);\n }\n\n if (verbose && this.cause) {\n parts.push(`\\nCaused by: ${this.cause.message}`);\n if (this.cause.stack) {\n parts.push(`\\n${this.cause.stack}`);\n }\n }\n\n return parts.join('');\n }\n\n /**\n * Format error with remediation for user display\n */\n toUserStringWithRemediation(): string {\n const parts: string[] = [this.toUserString()];\n const remediation = this.getRemediation();\n\n if (remediation) {\n parts.push('\\n\\nHow to fix:\\n');\n // Indent each line of remediation\n const indented = remediation\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n parts.push(indented);\n }\n\n return parts.join('');\n }\n\n /**\n * Format error for JSON output\n */\n toJSON(): Record<string, unknown> {\n return {\n code: this.code,\n message: this.message,\n remediation: this.getRemediation(),\n details: this.details,\n cause: this.cause\n ? {\n message: this.cause.message,\n stack: this.cause.stack,\n }\n : undefined,\n };\n }\n}\n\n/**\n * Check if an error is a CLIError\n */\nexport function isCLIError(error: unknown): error is CLIError {\n return error instanceof CLIError;\n}\n\n/**\n * Wrap an unknown error in a CLIError\n */\nexport function wrapError(error: unknown, code: ErrorCode, message?: string): CLIError {\n if (error instanceof CLIError) {\n return error;\n }\n\n const cause = error instanceof Error ? error : new Error(String(error));\n return new CLIError(code, message, { cause });\n}\n","/**\n * Schema Version Compatibility\n *\n * Ensures CLI can consume artifacts from compatible collector versions.\n *\n * The schema version follows semver:\n * - MAJOR: Breaking changes (fields removed, types changed)\n * - MINOR: Additive changes (new optional fields)\n * - PATCH: Bug fixes, clarifications\n *\n * CLI declares a supported range, collector emits current version.\n */\n\nimport { ARTIFACT_SCHEMA_VERSION } from '@securitychecks/collector';\n\n/**\n * The schema version range this CLI version supports.\n *\n * Format: \"^MAJOR.MINOR.x\" - compatible with any version that has:\n * - Same MAJOR version (no breaking changes)\n * - Same or higher MINOR version (may have new optional fields)\n *\n * When updating:\n * - Bump MINOR when CLI starts using new optional fields\n * - Bump MAJOR when CLI requires breaking schema changes\n */\nexport const SUPPORTED_SCHEMA_RANGE = {\n // Minimum version we can consume\n minMajor: 1,\n minMinor: 0,\n // Maximum major version we understand (breaking changes)\n maxMajor: 1,\n};\n\nexport interface SchemaValidationResult {\n valid: boolean;\n artifactVersion: string;\n currentVersion: string;\n error?: string;\n remediation?: string;\n}\n\n/**\n * Parse a semver string into components\n */\nfunction parseSemver(version: string): { major: number; minor: number; patch: number } | null {\n const match = version.match(/^(\\d+)\\.(\\d+)\\.(\\d+)/);\n if (!match || !match[1] || !match[2] || !match[3]) return null;\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n };\n}\n\n/**\n * Validate that an artifact's schema version is compatible with this CLI.\n *\n * Compatibility rules:\n * - Artifact MAJOR must equal CLI's supported MAJOR (breaking changes)\n * - Artifact MINOR must be >= CLI's minMinor (additive features)\n * - Pre-1.0.0 artifacts (missing schemaVersion) are assumed \"1.0.0\"\n */\nexport function validateSchemaVersion(artifactSchemaVersion?: string): SchemaValidationResult {\n const currentVersion = ARTIFACT_SCHEMA_VERSION;\n\n // Handle missing schemaVersion (pre-versioning artifacts)\n const effectiveVersion = artifactSchemaVersion ?? '1.0.0';\n\n const parsed = parseSemver(effectiveVersion);\n if (!parsed) {\n return {\n valid: false,\n artifactVersion: effectiveVersion,\n currentVersion,\n error: `Invalid schema version format: \"${effectiveVersion}\" (expected semver like \"1.0.0\")`,\n remediation: 'Re-collect artifacts with: npx scc collect -o .securitychecks/artifacts.json',\n };\n }\n\n const { major, minor } = parsed;\n\n // Check MAJOR version (breaking changes)\n if (major > SUPPORTED_SCHEMA_RANGE.maxMajor) {\n return {\n valid: false,\n artifactVersion: effectiveVersion,\n currentVersion,\n error: `Artifact schema version ${effectiveVersion} is too new (CLI supports up to ${SUPPORTED_SCHEMA_RANGE.maxMajor}.x.x)`,\n remediation: `Upgrade scheck: npm install -g @securitychecks/cli@latest`,\n };\n }\n\n if (major < SUPPORTED_SCHEMA_RANGE.minMajor) {\n return {\n valid: false,\n artifactVersion: effectiveVersion,\n currentVersion,\n error: `Artifact schema version ${effectiveVersion} is too old (CLI requires ${SUPPORTED_SCHEMA_RANGE.minMajor}.x.x+)`,\n remediation: 'Re-collect artifacts: npx scc collect -o .securitychecks/artifacts.json',\n };\n }\n\n // Check MINOR version (additive features - older artifacts may lack fields we use)\n if (minor < SUPPORTED_SCHEMA_RANGE.minMinor) {\n return {\n valid: false,\n artifactVersion: effectiveVersion,\n currentVersion,\n error: `Artifact schema version ${effectiveVersion} is missing required fields (CLI requires ${SUPPORTED_SCHEMA_RANGE.minMajor}.${SUPPORTED_SCHEMA_RANGE.minMinor}.x+)`,\n remediation: 'Re-collect artifacts: npx scc collect -o .securitychecks/artifacts.json',\n };\n }\n\n return {\n valid: true,\n artifactVersion: effectiveVersion,\n currentVersion,\n };\n}\n\n/**\n * Get the current collector schema version\n */\nexport function getCurrentSchemaVersion(): string {\n return ARTIFACT_SCHEMA_VERSION;\n}\n","/**\n * Calibration API Client\n *\n * \"The SaaS advises. The local tool decides.\"\n *\n * This module handles communication with the SecurityChecks Calibration API.\n * The API provides confidence tuning based on aggregate data from many codebases.\n *\n * Key principles:\n * - No source code is ever sent (only patterns and metadata)\n * - API suggestions are advisory only\n * - Local tool retains veto power via minConfidence threshold\n * - Fails safely to local-only mode on network errors\n */\n\nimport type {\n CalibrationConfig,\n CalibrationRequest,\n CalibrationResponse,\n Finding,\n FindingCalibration,\n Severity,\n Artifact,\n} from '@securitychecks/collector';\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { randomUUID } from 'crypto';\n\n// CLI version for telemetry\nconst CLI_VERSION = '0.1.0';\n\n// Default cache path\nconst DEFAULT_CACHE_PATH = '.securitychecks/calibration-cache.json';\n\ninterface CacheEntry {\n response: CalibrationResponse;\n timestamp: number;\n requestHash: string;\n}\n\ninterface CalibrationCache {\n version: '1.0';\n entries: Record<string, CacheEntry>;\n}\n\n/**\n * Create a hash for a calibration request (for caching)\n */\nfunction hashRequest(request: CalibrationRequest): string {\n // Simple hash based on key fields (not crypto-secure, just for caching)\n const key = JSON.stringify({\n invariantId: request.invariantId,\n localSeverity: request.localSeverity,\n pattern: request.pattern,\n context: request.context,\n });\n // Simple string hash\n let hash = 0;\n for (let i = 0; i < key.length; i++) {\n const char = key.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Load calibration cache from disk\n */\nasync function loadCache(cachePath: string): Promise<CalibrationCache> {\n try {\n if (existsSync(cachePath)) {\n const content = await readFile(cachePath, 'utf-8');\n return JSON.parse(content);\n }\n } catch {\n // Cache corrupted or unreadable, start fresh\n }\n return { version: '1.0', entries: {} };\n}\n\n/**\n * Save calibration cache to disk\n */\nasync function saveCache(cachePath: string, cache: CalibrationCache): Promise<void> {\n try {\n await mkdir(dirname(cachePath), { recursive: true });\n await writeFile(cachePath, JSON.stringify(cache, null, 2));\n } catch {\n // Failed to save cache, not critical\n }\n}\n\n/**\n * Extract calibration-safe pattern from a finding\n * This is what we send to the API - no source code, just metadata\n */\nexport function extractPatternFromFinding(finding: Finding): CalibrationRequest['pattern'] {\n const pattern: CalibrationRequest['pattern'] = {};\n\n // Extract from structured evidence if available\n if (finding.structuredEvidence) {\n const se = finding.structuredEvidence;\n\n if (se.mutationSite) {\n pattern.functionName = se.mutationSite.functionName;\n pattern.mutationType = se.mutationSite.mutationType;\n pattern.entity = se.mutationSite.entity;\n }\n\n pattern.signals = se.signals;\n pattern.confidence = se.confidence;\n\n pattern.indicators = {\n hasCacheInvalidation: (se.invalidationSites?.length ?? 0) > 0,\n hasTests: (se.testsCovering?.length ?? 0) > 0,\n };\n }\n\n // Extract from basic evidence as fallback\n const firstEvidence = finding.evidence[0];\n if (firstEvidence?.symbol && !pattern.functionName) {\n pattern.functionName = firstEvidence.symbol;\n }\n\n return pattern;\n}\n\n/**\n * Detect framework from artifact\n */\nexport function detectFramework(artifact: Artifact): string | undefined {\n // Check routes for framework hints\n if (artifact.routes && artifact.routes.length > 0) {\n const frameworks = artifact.routes.map((r) => r.framework);\n const counts = new Map<string, number>();\n for (const f of frameworks) {\n counts.set(f, (counts.get(f) ?? 0) + 1);\n }\n // Return most common non-unknown framework\n let maxFramework: string | undefined;\n let maxCount = 0;\n for (const [f, c] of counts) {\n if (f !== 'unknown' && c > maxCount) {\n maxFramework = f;\n maxCount = c;\n }\n }\n return maxFramework;\n }\n return undefined;\n}\n\n/**\n * Build context for calibration request\n */\nexport function buildContext(\n artifact: Artifact,\n invariantId: string,\n allFindings: Finding[]\n): CalibrationRequest['context'] {\n const findingsOfType = allFindings.filter((f) => f.invariantId === invariantId);\n\n return {\n framework: detectFramework(artifact),\n serviceCount: artifact.services.length,\n findingCount: findingsOfType.length,\n hasTests: (artifact.tests?.length ?? 0) > 0,\n };\n}\n\n/**\n * Call the Calibration API for a single finding\n */\nasync function callCalibrationAPI(\n request: CalibrationRequest,\n config: CalibrationConfig\n): Promise<CalibrationResponse | null> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeout);\n\n try {\n const response = await fetch(config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.apiKey ? { Authorization: `Bearer ${config.apiKey}` } : {}),\n 'X-Client-Version': CLI_VERSION,\n },\n body: JSON.stringify(request),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n // API error - fail safe to local result\n return null;\n }\n\n const data = await response.json();\n return data as CalibrationResponse;\n } catch {\n // Network error, timeout, etc. - fail safe to local result\n clearTimeout(timeoutId);\n return null;\n }\n}\n\n/**\n * Calibrate a single finding\n */\nexport async function calibrateFinding(\n finding: Finding,\n artifact: Artifact,\n allFindings: Finding[],\n config: CalibrationConfig,\n cache: CalibrationCache\n): Promise<Finding> {\n // Build request\n const request: CalibrationRequest = {\n invariantId: finding.invariantId,\n localSeverity: finding.severity,\n pattern: extractPatternFromFinding(finding),\n context: buildContext(artifact, finding.invariantId, allFindings),\n meta: {\n clientVersion: CLI_VERSION,\n requestId: randomUUID(),\n timestamp: new Date().toISOString(),\n },\n };\n\n const requestHash = hashRequest(request);\n\n // Check cache first\n if (config.cache?.enabled) {\n const cached = cache.entries[requestHash];\n if (cached) {\n const age = Date.now() - cached.timestamp;\n const ttlMs = (config.cache.ttl ?? 86400) * 1000;\n if (age < ttlMs) {\n // Use cached response\n return applyCalibration(finding, cached.response, config);\n }\n }\n }\n\n // Call API\n const response = await callCalibrationAPI(request, config);\n\n if (!response) {\n // API failed - return finding unchanged\n return finding;\n }\n\n // Cache response\n if (config.cache?.enabled) {\n cache.entries[requestHash] = {\n response,\n timestamp: Date.now(),\n requestHash,\n };\n }\n\n return applyCalibration(finding, response, config);\n}\n\n/**\n * Apply calibration response to a finding\n */\nfunction applyCalibration(\n finding: Finding,\n response: CalibrationResponse,\n config: CalibrationConfig\n): Finding {\n const originalSeverity = finding.severity;\n\n // Check if we should apply the recommendation\n const shouldApply = response.confidence >= config.minConfidence && !response.suppress;\n\n const calibration: FindingCalibration = {\n apiRecommendation: response,\n applied: shouldApply,\n originalSeverity,\n reason: shouldApply\n ? `API confidence ${(response.confidence * 100).toFixed(0)}% >= threshold ${(config.minConfidence * 100).toFixed(0)}%`\n : `API confidence ${(response.confidence * 100).toFixed(0)}% < threshold ${(config.minConfidence * 100).toFixed(0)}%`,\n };\n\n // Create new finding with calibration data\n const calibratedFinding: Finding = {\n ...finding,\n calibration,\n };\n\n // Apply severity change if recommended and above threshold\n if (shouldApply && response.recommendedSeverity !== originalSeverity) {\n calibratedFinding.severity = response.recommendedSeverity;\n }\n\n return calibratedFinding;\n}\n\n/**\n * Calibrate all findings in a batch\n * This is the main entry point for calibration\n */\nexport async function calibrateFindings(\n findings: Finding[],\n artifact: Artifact,\n config: CalibrationConfig,\n targetPath: string\n): Promise<Finding[]> {\n if (!config.enabled) {\n return findings;\n }\n\n // Load cache\n const cachePath = config.cache?.path ?? join(targetPath, DEFAULT_CACHE_PATH);\n const cache = await loadCache(cachePath);\n\n // Calibrate each finding\n const calibratedFindings = await Promise.all(\n findings.map((finding) => calibrateFinding(finding, artifact, findings, config, cache))\n );\n\n // Save cache\n if (config.cache?.enabled) {\n await saveCache(cachePath, cache);\n }\n\n return calibratedFindings;\n}\n\n/**\n * Get calibration statistics from findings\n */\nexport function getCalibrationStats(findings: Finding[]): {\n total: number;\n calibrated: number;\n applied: number;\n unchanged: number;\n severityChanges: { from: Severity; to: Severity; count: number }[];\n} {\n const calibrated = findings.filter((f) => f.calibration);\n const applied = calibrated.filter((f) => f.calibration?.applied);\n\n const changes = new Map<string, number>();\n for (const finding of applied) {\n if (finding.calibration && finding.calibration.originalSeverity !== finding.severity) {\n const key = `${finding.calibration.originalSeverity}->${finding.severity}`;\n changes.set(key, (changes.get(key) ?? 0) + 1);\n }\n }\n\n const severityChanges = Array.from(changes.entries()).map(([key, count]) => {\n const [from, to] = key.split('->') as [Severity, Severity];\n return { from, to, count };\n });\n\n return {\n total: findings.length,\n calibrated: calibrated.length,\n applied: applied.length,\n unchanged: findings.length - applied.length,\n severityChanges,\n };\n}\n\n// ============================================================================\n// Aggregate Calibration (from SaaS learning loop)\n// ============================================================================\n\nconst AGGREGATE_CALIBRATION_ENDPOINT = 'https://api.securitychecks.ai/v1/calibration';\n\n// In-memory cache for aggregate data (1 hour TTL)\nconst AGGREGATE_CACHE_TTL_MS = 60 * 60 * 1000;\nlet aggregateCache: AggregateCalibrationData | null = null;\nlet aggregateCacheTimestamp = 0;\n\nexport interface AggregateCalibrationConfig {\n enabled: boolean;\n endpoint?: string;\n apiKey?: string;\n timeout?: number;\n cacheEnabled?: boolean;\n}\n\nexport interface FrameworkBaseline {\n framework: string;\n avgFindings: number;\n avgP0: number;\n avgP1: number;\n avgP2: number;\n scansAnalyzed: number;\n confidence: 'high' | 'medium' | 'low';\n}\n\nexport interface InvariantStats {\n invariantId: string;\n avgPerScan: number;\n hitRate: number;\n p0Rate: number;\n p1Rate: number;\n p2Rate: number;\n}\n\nexport interface PatternStats {\n patternId: string;\n framework: string | null;\n accuracy: number | null;\n matchesPerScan: number;\n confidence: 'high' | 'medium' | 'low';\n}\n\nexport interface CorrelationStats {\n ruleId: string;\n accuracy: number | null;\n escalationRate: number | null;\n isVerified: boolean;\n}\n\nexport interface AggregateCalibrationData {\n version: string;\n generatedAt: string;\n frameworks: FrameworkBaseline[];\n invariants: InvariantStats[];\n patterns: PatternStats[];\n correlations: CorrelationStats[];\n meta: {\n totalScansAnalyzed: number;\n lastUpdated: string | null;\n };\n}\n\nexport interface AggregateCalibrationResult {\n data: AggregateCalibrationData | null;\n fromCache: boolean;\n error?: string;\n}\n\n/**\n * Fetch aggregate calibration data for the specified frameworks\n */\nexport async function fetchAggregateCalibration(\n frameworks: string[],\n config: AggregateCalibrationConfig\n): Promise<AggregateCalibrationResult> {\n if (!config.enabled) {\n return { data: null, fromCache: false, error: 'Aggregate calibration disabled' };\n }\n\n // Check cache first\n if (config.cacheEnabled !== false && aggregateCache && Date.now() - aggregateCacheTimestamp < AGGREGATE_CACHE_TTL_MS) {\n return { data: aggregateCache, fromCache: true };\n }\n\n const endpoint = config.endpoint ?? AGGREGATE_CALIBRATION_ENDPOINT;\n const timeout = config.timeout ?? 5000;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const url = new URL(endpoint);\n url.searchParams.set('frameworks', frameworks.join(','));\n\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n ...(config.apiKey && { Authorization: `Bearer ${config.apiKey}` }),\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return {\n data: null,\n fromCache: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const data = await response.json() as AggregateCalibrationData;\n\n // Update cache\n if (config.cacheEnabled !== false) {\n aggregateCache = data;\n aggregateCacheTimestamp = Date.now();\n }\n\n return { data, fromCache: false };\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (err) {\n // Calibration failures are non-fatal\n return {\n data: null,\n fromCache: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Clear the aggregate calibration cache\n */\nexport function clearAggregateCache(): void {\n aggregateCache = null;\n aggregateCacheTimestamp = 0;\n}\n\n/**\n * Get the framework baseline for comparison\n */\nexport function getFrameworkBaseline(\n calibration: AggregateCalibrationData,\n framework: string\n): FrameworkBaseline | undefined {\n return calibration.frameworks.find((f) => f.framework === framework);\n}\n\n/**\n * Check if a pattern should be skipped due to low accuracy\n */\nexport function shouldSkipPattern(\n calibration: AggregateCalibrationData,\n patternId: string,\n framework?: string,\n accuracyThreshold = 0.3\n): boolean {\n const pattern = calibration.patterns.find(\n (p) => p.patternId === patternId &&\n (p.framework === framework || p.framework === null)\n );\n\n if (!pattern || pattern.accuracy === null) {\n return false; // No data, don't skip\n }\n\n // Only skip if we have high confidence it's a bad pattern\n if (pattern.confidence !== 'high') {\n return false;\n }\n\n return pattern.accuracy < accuracyThreshold;\n}\n\n/**\n * Get patterns that should be skipped for a framework\n */\nexport function getSkippedPatterns(\n calibration: AggregateCalibrationData,\n framework?: string,\n accuracyThreshold = 0.3\n): string[] {\n return calibration.patterns\n .filter((p) => {\n if (p.accuracy === null || p.confidence !== 'high') {\n return false;\n }\n if (framework && p.framework && p.framework !== framework) {\n return false;\n }\n return p.accuracy < accuracyThreshold;\n })\n .map((p) => p.patternId);\n}\n\n/**\n * Get correlation rules with high confidence\n */\nexport function getVerifiedCorrelations(\n calibration: AggregateCalibrationData\n): CorrelationStats[] {\n return calibration.correlations.filter((c) => c.isVerified);\n}\n\n/**\n * Calculate relative finding severity based on framework baseline\n */\nexport function calculateRelativeSeverity(\n findingCount: number,\n baseline: FrameworkBaseline,\n type: 'total' | 'P0' | 'P1' | 'P2' = 'total'\n): 'below_average' | 'average' | 'above_average' | 'critical' {\n let avg: number;\n switch (type) {\n case 'P0':\n avg = baseline.avgP0;\n break;\n case 'P1':\n avg = baseline.avgP1;\n break;\n case 'P2':\n avg = baseline.avgP2;\n break;\n default:\n avg = baseline.avgFindings;\n }\n\n if (avg === 0) {\n return findingCount > 0 ? 'above_average' : 'average';\n }\n\n const ratio = findingCount / avg;\n\n if (ratio < 0.5) return 'below_average';\n if (ratio < 1.5) return 'average';\n if (ratio < 3) return 'above_average';\n return 'critical';\n}\n\n/**\n * Generate calibration summary for output\n */\nexport function formatAggregateCalibrationSummary(\n calibration: AggregateCalibrationData,\n frameworks: string[],\n findings: { P0: number; P1: number; P2: number; total: number }\n): string {\n const lines: string[] = [];\n\n // Framework comparison\n for (const fw of frameworks) {\n const baseline = getFrameworkBaseline(calibration, fw);\n if (baseline && baseline.confidence !== 'low') {\n const severity = calculateRelativeSeverity(findings.total, baseline);\n const avgStr = baseline.avgFindings.toFixed(1);\n\n if (severity === 'below_average') {\n lines.push(`${fw}: ${findings.total} findings (${avgStr} avg) - Below average`);\n } else if (severity === 'above_average') {\n lines.push(`${fw}: ${findings.total} findings (${avgStr} avg) - Above average`);\n } else if (severity === 'critical') {\n lines.push(`${fw}: ${findings.total} findings (${avgStr} avg) - Significantly above average`);\n } else {\n lines.push(`${fw}: ${findings.total} findings (${avgStr} avg) - Typical`);\n }\n }\n }\n\n // Skipped patterns\n const skipped = getSkippedPatterns(calibration, frameworks[0]);\n if (skipped.length > 0) {\n lines.push(`Skipped ${skipped.length} low-accuracy patterns`);\n }\n\n // Data confidence\n if (calibration.meta.totalScansAnalyzed < 100) {\n lines.push(`Calibration based on ${calibration.meta.totalScansAnalyzed} scans (limited data)`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Check if aggregate calibration is disabled via environment\n */\nexport function isAggregateCalibrationDisabled(): boolean {\n return process.env['SECURITYCHECKS_CALIBRATION'] === 'false';\n}\n","[\n {\n \"id\": \"secrets.aws-access-key-id\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"AWS Access Key ID\",\n \"description\": \"AWS access key ID found in code. These start with AKIA and are 20 chars.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/AKIA[0-9A-Z]{16}/\",\n \"not\": [\"process.env\", \"import.meta.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"xxx\", \"placeholder\", \"changeme\"]\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"AWS Access Key ID found in code\",\n \"requiredProof\": \"Move to environment variable or AWS Secrets Manager\",\n \"references\": [\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html\"],\n \"tags\": [\"aws\", \"secrets\", \"credentials\"]\n },\n \"metadata\": {\n \"author\": \"SecurityChecks\",\n \"created\": \"2025-01-01T00:00:00Z\",\n \"references\": [\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html\"]\n }\n },\n {\n \"id\": \"secrets.aws-secret-access-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"AWS Secret Access Key\",\n \"description\": \"AWS secret access key found in code.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/aws_secret_access_key\\\\s*[=:]\\\\s*[\\\"'][A-Za-z0-9/+=]{40}[\\\"']/\",\n \"not\": [\"process.env\", \"import.meta.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"]\n },\n {\n \"pattern\": \"/AWS_SECRET_ACCESS_KEY\\\\s*[=:]\\\\s*[\\\"'][A-Za-z0-9/+=]{40}[\\\"']/\",\n \"not\": [\"process.env\"]\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"AWS Secret Access Key found in code\",\n \"requiredProof\": \"Remove from code, rotate key immediately\",\n \"references\": [\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html\"],\n \"tags\": [\"aws\", \"secrets\", \"credentials\"]\n },\n \"metadata\": {\n \"author\": \"SecurityChecks\",\n \"created\": \"2025-01-01T00:00:00Z\"\n }\n },\n {\n \"id\": \"secrets.github-personal-access-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"GitHub Personal Access Token\",\n \"description\": \"GitHub PAT found in code. Starts with ghp_ (classic) or github_pat_.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/ghp_[A-Za-z0-9]{36}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] },\n { \"pattern\": \"/github_pat_[A-Za-z0-9]{22}_[A-Za-z0-9]{59}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"GitHub Personal Access Token found in code\",\n \"requiredProof\": \"Remove and rotate token immediately\",\n \"references\": [\"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens\"],\n \"tags\": [\"github\", \"secrets\", \"token\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.github-oauth-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"GitHub OAuth Token\",\n \"description\": \"GitHub OAuth access token. Starts with gho_.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/gho_[A-Za-z0-9]{36}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"GitHub OAuth Token found in code\",\n \"requiredProof\": \"Remove and rotate token\",\n \"references\": [\"https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps\"],\n \"tags\": [\"github\", \"secrets\", \"oauth\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.stripe-secret-key-live\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Stripe Live Secret Key\",\n \"description\": \"Stripe live secret key found. This grants full access to the Stripe account.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/sk_live_[a-zA-Z0-9]{24,}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Stripe LIVE secret key found in code - critical exposure\",\n \"requiredProof\": \"Remove from code, rotate in Stripe dashboard immediately\",\n \"references\": [\"https://stripe.com/docs/keys\"],\n \"tags\": [\"stripe\", \"secrets\", \"payment\", \"critical\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.stripe-secret-key-test\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Stripe Test Secret Key\",\n \"description\": \"Stripe test secret key found. Should still be env var.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/sk_test_[a-zA-Z0-9]{24,}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\", \".env\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Stripe test secret key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://stripe.com/docs/keys\"],\n \"tags\": [\"stripe\", \"secrets\", \"payment\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.private-key-rsa\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"RSA Private Key\",\n \"description\": \"RSA private key found in code.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"**/*.java\", \"**/*.rb\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/-----BEGIN RSA PRIVATE KEY-----/\", \"not\": [\"example\", \"sample\", \"test\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"RSA private key found in source code\",\n \"requiredProof\": \"Remove from code, store in secrets manager\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Key_Management_Cheat_Sheet.html\"],\n \"tags\": [\"secrets\", \"cryptography\", \"private-key\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.private-key-generic\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Private Key (Generic)\",\n \"description\": \"Generic private key found in code.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"**/*.java\", \"**/*.rb\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/-----BEGIN PRIVATE KEY-----/\", \"not\": [\"example\", \"sample\", \"test\"] },\n { \"pattern\": \"/-----BEGIN EC PRIVATE KEY-----/\", \"not\": [\"example\", \"sample\", \"test\"] },\n { \"pattern\": \"/-----BEGIN DSA PRIVATE KEY-----/\", \"not\": [\"example\", \"sample\", \"test\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Private key found in source code\",\n \"requiredProof\": \"Remove from code, store in secrets manager\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Key_Management_Cheat_Sheet.html\"],\n \"tags\": [\"secrets\", \"cryptography\", \"private-key\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.google-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Google API Key\",\n \"description\": \"Google API key found (AIza prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/AIza[0-9A-Za-z_-]{35}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Google API key found in code\",\n \"requiredProof\": \"Move to environment variable, restrict key in Google Cloud Console\",\n \"references\": [\"https://cloud.google.com/docs/authentication/api-keys\"],\n \"tags\": [\"google\", \"gcp\", \"secrets\", \"api-key\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.gcp-service-account\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"GCP Service Account Key\",\n \"description\": \"GCP service account private key found in code.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.json\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/\\\"private_key\\\":\\\\s*\\\"-----BEGIN PRIVATE KEY-----/\", \"not\": [\"example\", \"sample\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"GCP service account key found in code\",\n \"requiredProof\": \"Use Workload Identity or store in Secret Manager\",\n \"references\": [\"https://cloud.google.com/iam/docs/best-practices-for-managing-service-account-keys\"],\n \"tags\": [\"gcp\", \"secrets\", \"service-account\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.database-url-with-password\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Database URL with Password\",\n \"description\": \"Database connection string with embedded password.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"**/*.java\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/postgres(ql)?:\\\\/\\\\/[^:]+:[^@]+@[^/]+/\", \"not\": [\"process.env\", \"DATABASE_URL\", \"localhost\", \"127.0.0.1\", \"password\"] },\n { \"pattern\": \"/mysql:\\\\/\\\\/[^:]+:[^@]+@[^/]+/\", \"not\": [\"process.env\", \"DATABASE_URL\", \"localhost\", \"127.0.0.1\", \"password\"] },\n { \"pattern\": \"/mongodb(\\\\+srv)?:\\\\/\\\\/[^:]+:[^@]+@[^/]+/\", \"not\": [\"process.env\", \"MONGODB_URI\", \"localhost\", \"127.0.0.1\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Database connection string with password found in code\",\n \"requiredProof\": \"Move to environment variable or secrets manager\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Database_Security_Cheat_Sheet.html\"],\n \"tags\": [\"database\", \"secrets\", \"connection-string\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.slack-webhook-url\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Slack Webhook URL\",\n \"description\": \"Slack incoming webhook URL found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/https:\\\\/\\\\/hooks\\\\.slack\\\\.com\\\\/services\\\\/T[A-Z0-9]+\\\\/B[A-Z0-9]+\\\\/[a-zA-Z0-9]+/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Slack webhook URL found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://api.slack.com/messaging/webhooks\"],\n \"tags\": [\"slack\", \"secrets\", \"webhook\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.slack-bot-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Slack Bot Token\",\n \"description\": \"Slack bot/user token found (xoxb-/xoxp- prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/xoxb-[0-9]+-[0-9]+-[a-zA-Z0-9]+/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] },\n { \"pattern\": \"/xoxp-[0-9]+-[0-9]+-[0-9]+-[a-f0-9]+/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Slack token found in code\",\n \"requiredProof\": \"Remove and rotate in Slack app settings\",\n \"references\": [\"https://api.slack.com/authentication/token-types\"],\n \"tags\": [\"slack\", \"secrets\", \"token\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.sendgrid-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"SendGrid API Key\",\n \"description\": \"SendGrid API key found (SG. prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/SG\\\\.[a-zA-Z0-9_-]{22}\\\\.[a-zA-Z0-9_-]{43}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"SendGrid API key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://docs.sendgrid.com/ui/account-and-settings/api-keys\"],\n \"tags\": [\"sendgrid\", \"secrets\", \"email\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.twilio-account-sid\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Twilio Account SID\",\n \"description\": \"Twilio account SID found (AC prefix, 32 chars).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/AC[a-f0-9]{32}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Twilio Account SID found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://www.twilio.com/docs/iam/keys/api-key\"],\n \"tags\": [\"twilio\", \"secrets\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.twilio-auth-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Twilio Auth Token\",\n \"description\": \"Twilio auth token found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/TWILIO_AUTH_TOKEN\\\\s*[=:]\\\\s*[\\\"'][a-f0-9]{32}[\\\"']/\", \"not\": [\"process.env\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Twilio Auth Token found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://www.twilio.com/docs/iam/keys/api-key\"],\n \"tags\": [\"twilio\", \"secrets\", \"auth-token\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.npm-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"NPM Access Token\",\n \"description\": \"NPM access token found (npm_ prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/node_modules/**\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/npm_[a-zA-Z0-9]{36}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"NPM access token found in code\",\n \"requiredProof\": \"Remove and rotate token in npm settings\",\n \"references\": [\"https://docs.npmjs.com/creating-and-viewing-access-tokens\"],\n \"tags\": [\"npm\", \"secrets\", \"token\", \"supply-chain\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.pypi-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"PyPI API Token\",\n \"description\": \"PyPI API token found (pypi- prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/pypi-[A-Za-z0-9_-]{32,}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"PyPI API token found in code\",\n \"requiredProof\": \"Remove and rotate token in PyPI settings\",\n \"references\": [\"https://pypi.org/help/#apitoken\"],\n \"tags\": [\"pypi\", \"python\", \"secrets\", \"token\", \"supply-chain\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.firebase-admin-sdk\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Firebase Admin SDK Credentials\",\n \"description\": \"Firebase Admin SDK service account credentials found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.json\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/\\\"type\\\":\\\\s*\\\"service_account\\\"/\", \"not\": [\"example\", \"sample\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Firebase Admin SDK credentials found in code\",\n \"requiredProof\": \"Use environment variables or Secret Manager\",\n \"references\": [\"https://firebase.google.com/docs/admin/setup\"],\n \"tags\": [\"firebase\", \"secrets\", \"google\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.mailchimp-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Mailchimp API Key\",\n \"description\": \"Mailchimp API key found (ends with -us## datacenter).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/[a-f0-9]{32}-us[0-9]{1,2}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Mailchimp API key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://mailchimp.com/developer/marketing/guides/quick-start/\"],\n \"tags\": [\"mailchimp\", \"secrets\", \"email\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.mailgun-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Mailgun API Key\",\n \"description\": \"Mailgun API key found (key- prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/key-[a-f0-9]{32}/\",\n \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"],\n \"requiresNearby\": { \"any\": [\"mailgun\", \"Mailgun\", \"MAILGUN\"], \"within\": 10 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Mailgun API key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://documentation.mailgun.com/en/latest/api-intro.html\"],\n \"tags\": [\"mailgun\", \"secrets\", \"email\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.discord-bot-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Discord Bot Token\",\n \"description\": \"Discord bot token found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/[MN][A-Za-z\\\\d]{23,}\\\\.[\\\\w-]{6}\\\\.[\\\\w-]{27}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Discord bot token found in code\",\n \"requiredProof\": \"Move to environment variable, regenerate token\",\n \"references\": [\"https://discord.com/developers/docs/topics/oauth2\"],\n \"tags\": [\"discord\", \"secrets\", \"bot\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.discord-webhook-url\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Discord Webhook URL\",\n \"description\": \"Discord webhook URL found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/https:\\\\/\\\\/discord(app)?\\\\.com\\\\/api\\\\/webhooks\\\\/[0-9]+\\\\/[A-Za-z0-9_-]+/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Discord webhook URL found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://discord.com/developers/docs/resources/webhook\"],\n \"tags\": [\"discord\", \"secrets\", \"webhook\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.datadog-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Datadog API Key\",\n \"description\": \"Datadog API key found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/DD_API_KEY\\\\s*[=:]\\\\s*[\\\"'][a-f0-9]{32}[\\\"']/\", \"not\": [\"process.env\"] },\n { \"pattern\": \"/DATADOG_API_KEY\\\\s*[=:]\\\\s*[\\\"'][a-f0-9]{32}[\\\"']/\", \"not\": [\"process.env\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Datadog API key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://docs.datadoghq.com/account_management/api-app-keys/\"],\n \"tags\": [\"datadog\", \"secrets\", \"observability\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.openai-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"OpenAI API Key\",\n \"description\": \"OpenAI API key found (sk- prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/sk-[a-zA-Z0-9]{48}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] },\n { \"pattern\": \"/sk-proj-[a-zA-Z0-9_-]{48,}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"OpenAI API key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://platform.openai.com/docs/api-reference/authentication\"],\n \"tags\": [\"openai\", \"ai\", \"secrets\", \"api-key\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.anthropic-api-key\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Anthropic API Key\",\n \"description\": \"Anthropic API key found (sk-ant- prefix).\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/sk-ant-[a-zA-Z0-9_-]{32,}/\", \"not\": [\"process.env\", \"EXAMPLE\", \"TODO\", \"REPLACE\", \"YOUR_\", \"placeholder\", \"changeme\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Anthropic API key found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://docs.anthropic.com/claude/reference/getting-started-with-the-api\"],\n \"tags\": [\"anthropic\", \"ai\", \"secrets\", \"api-key\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.vercel-token\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Vercel Token\",\n \"description\": \"Vercel authentication token found.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/VERCEL_TOKEN\\\\s*[=:]\\\\s*[\\\"'][a-zA-Z0-9]{24}[\\\"']/\", \"not\": [\"process.env\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Vercel token found in code\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://vercel.com/docs/rest-api#authentication\"],\n \"tags\": [\"vercel\", \"secrets\", \"deployment\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.jwt-secret-hardcoded\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"JWT Secret Hardcoded\",\n \"description\": \"JWT secret hardcoded in source code.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/JWT_SECRET\\\\s*[=:]\\\\s*[\\\"'][^\\\"']{16,}[\\\"']/\", \"not\": [\"process.env\", \"example\", \"changeme\", \"secret\"] },\n { \"pattern\": \"/jwtSecret\\\\s*[=:]\\\\s*[\\\"'][^\\\"']{16,}[\\\"']/\", \"not\": [\"process.env\", \"example\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"JWT secret appears to be hardcoded\",\n \"requiredProof\": \"Move to environment variable\",\n \"references\": [\"https://auth0.com/blog/a-look-at-the-latest-draft-for-jwt-bcp/\"],\n \"tags\": [\"jwt\", \"secrets\", \"auth\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"secrets.encryption-key-hardcoded\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Encryption Key Hardcoded\",\n \"description\": \"Encryption key hardcoded in source code.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/ENCRYPTION_KEY\\\\s*[=:]\\\\s*[\\\"'][a-fA-F0-9]{32,}[\\\"']/\", \"not\": [\"process.env\", \"example\"] },\n { \"pattern\": \"/encryptionKey\\\\s*[=:]\\\\s*[\\\"'][a-fA-F0-9]{32,}[\\\"']/\", \"not\": [\"process.env\", \"example\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Encryption key appears to be hardcoded\",\n \"requiredProof\": \"Move to environment variable or KMS\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Key_Management_Cheat_Sheet.html\"],\n \"tags\": [\"encryption\", \"secrets\", \"cryptography\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n\n {\n \"id\": \"xss.dangerously-set-inner-html\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"Unsanitized HTML Rendering\",\n \"description\": \"User input rendered without sanitization via dangerouslySetInnerHTML, innerHTML, or v-html.\",\n \"applicability\": {\n \"frameworks\": [\"react\", \"nextjs\", \"vue\"],\n \"filePatterns\": [\"**/*.tsx\", \"**/*.jsx\", \"**/*.vue\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/dangerouslySetInnerHTML|innerHTML|v-html/\", \"not\": [\"sanitize\", \"DOMPurify\", \"escape\", \"trusted\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"User input may be rendered unsanitized (XSS risk)\",\n \"requiredProof\": \"Sanitize HTML with DOMPurify before rendering\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html\"],\n \"tags\": [\"xss\", \"html\", \"input\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"sqli.raw-query\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.SQL_QUERY\",\n \"name\": \"Raw SQL with String Interpolation\",\n \"description\": \"SQL query constructed with string interpolation or concatenation.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"**/*.java\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/\\\\$queryRaw`|\\\\$executeRaw`/\", \"not\": [\"Prisma.sql\", \"Prisma.join\", \"Prisma.raw\"] },\n { \"pattern\": \"/query\\\\(.*\\\\$\\\\{|execute\\\\(.*\\\\$\\\\{/\", \"not\": [\"parameterized\", \"prepared\", \"placeholder\", \"\\\\?\"] },\n { \"pattern\": \"/\\\\.raw\\\\(.*\\\\+|raw\\\\(.*\\\\$\\\\{/\", \"not\": [\"parameterized\", \"prepared\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"SQL query uses string interpolation — potential SQL injection\",\n \"requiredProof\": \"Use parameterized queries or tagged template literals (Prisma.sql)\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html\"],\n \"tags\": [\"sql\", \"injection\", \"database\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"cmdi.exec-user-input\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.COMMAND_EXEC\",\n \"name\": \"Command Execution with User Input\",\n \"description\": \"exec/spawn/execSync called with potentially user-controlled input.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/exec\\\\(.*\\\\$\\\\{|exec\\\\(.*req\\\\.|exec\\\\(.*params/\", \"not\": [\"escape\", \"sanitize\", \"allowlist\", \"whitelist\"] },\n { \"pattern\": \"/execSync\\\\(.*\\\\$\\\\{|execSync\\\\(.*req\\\\.|execSync\\\\(.*params/\", \"not\": [\"escape\", \"sanitize\", \"allowlist\", \"whitelist\"] },\n { \"pattern\": \"/spawn\\\\(.*\\\\$\\\\{|spawn\\\\(.*req\\\\.|spawn\\\\(.*params/\", \"not\": [\"escape\", \"sanitize\", \"allowlist\", \"whitelist\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"Command execution with potentially user-controlled input\",\n \"requiredProof\": \"Use parameterized commands (spawn with array args) or strict input validation\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/OS_Command_Injection_Defense_Cheat_Sheet.html\"],\n \"tags\": [\"command-injection\", \"exec\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"cmdi.eval-usage\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.COMMAND_EXEC\",\n \"name\": \"eval() Usage\",\n \"description\": \"eval() executes arbitrary code. Extremely dangerous with any external input.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/\\\\beval\\\\s*\\\\(/\", \"not\": [\"// eslint-disable\", \"JSON.parse\"] },\n { \"pattern\": \"/new Function\\\\s*\\\\(/\", \"not\": [\"// eslint-disable\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"eval() or new Function() used — potential code injection\",\n \"requiredProof\": \"Replace with safer alternatives (JSON.parse, structured data)\",\n \"references\": [\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#never_use_eval!\"],\n \"tags\": [\"eval\", \"code-injection\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"path.traversal.user-input\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.FILE_ACCESS\",\n \"name\": \"Path Traversal with User Input\",\n \"description\": \"File operations with user-controlled paths allow reading arbitrary files.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/readFile.*req\\\\.|readFileSync.*req\\\\.|readFile.*params/\", \"not\": [\"path.resolve\", \"path.normalize\", \"startsWith\", \"sanitize\"] },\n { \"pattern\": \"/createReadStream.*req\\\\.|createReadStream.*params/\", \"not\": [\"path.resolve\", \"sanitize\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"File path from user input may allow path traversal\",\n \"requiredProof\": \"Validate path is within allowed directory using path.resolve\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Path_Traversal_Cheat_Sheet.html\"],\n \"tags\": [\"path\", \"traversal\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"ssrf.fetch-user-input\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"SSRF via User-Controlled URL\",\n \"description\": \"fetch/redirect called with user-provided URL without validation.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/fetch\\\\(.*req|redirect\\\\(.*req|new URL\\\\(.*req/\", \"not\": [\"URL.canParse\", \"isValidUrl\", \"allowlist\", \"validateUrl\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"User-provided URL not validated (SSRF risk)\",\n \"requiredProof\": \"Validate URLs against allowlist\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html\"],\n \"tags\": [\"ssrf\", \"url\", \"input\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"crypto.weak-des\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Weak Encryption Algorithm DES\",\n \"description\": \"DES encryption is cryptographically broken.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/createCipheriv\\\\(['\\\"]des/\" },\n { \"pattern\": \"/createDecipher\\\\(['\\\"]des/\" }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"DES encryption is weak — use AES-256-GCM instead\",\n \"requiredProof\": \"Use AES-256-GCM instead of DES\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html\"],\n \"tags\": [\"crypto\", \"des\", \"weak\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"crypto.weak-rc4\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Weak Encryption Algorithm RC4\",\n \"description\": \"RC4 encryption has known vulnerabilities.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/createCipheriv\\\\(['\\\"]rc4/\" }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"RC4 encryption is weak — use AES-256-GCM instead\",\n \"requiredProof\": \"Use AES-256-GCM instead of RC4\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html\"],\n \"tags\": [\"crypto\", \"rc4\", \"weak\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"crypto.weak-md5\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Weak Hash Algorithm MD5\",\n \"description\": \"MD5 is cryptographically broken for security use.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/createHash\\\\(['\\\"]md5['\\\"]\\\\)/\", \"not\": [\"checksum\", \"etag\", \"cache\", \"fingerprint\"] },\n { \"pattern\": \"/hashlib\\\\.md5/\", \"not\": [\"checksum\", \"etag\", \"cache\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"MD5 hash used — weak for security purposes\",\n \"requiredProof\": \"Use SHA-256 or SHA-3 for security; MD5 is acceptable only for non-security checksums\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html\"],\n \"tags\": [\"crypto\", \"md5\", \"weak\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"crypto.weak-sha1\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Weak Hash Algorithm SHA1\",\n \"description\": \"SHA1 has known collision attacks and should not be used for security.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"**/*.py\", \"**/*.go\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/createHash\\\\(['\\\"]sha1['\\\"]\\\\)/\", \"not\": [\"checksum\", \"etag\", \"cache\", \"git\"] },\n { \"pattern\": \"/hashlib\\\\.sha1/\", \"not\": [\"checksum\", \"etag\", \"cache\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"SHA1 hash used — weak for security purposes\",\n \"requiredProof\": \"Use SHA-256 or SHA-3 for security\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html\"],\n \"tags\": [\"crypto\", \"sha1\", \"weak\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"crypto.hardcoded-iv\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Hardcoded Initialization Vector\",\n \"description\": \"IVs must be random, not hardcoded.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/iv\\\\s*[=:]\\\\s*[\\\"'][0-9a-fA-F]+[\\\"']|iv:\\\\s*Buffer\\\\.from\\\\s*\\\\([\\\"']/\", \"not\": [\"randomBytes\", \"random\", \"generate\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Hardcoded IV detected — use random IV per encryption\",\n \"requiredProof\": \"Generate random IV with crypto.randomBytes()\",\n \"references\": [\"https://nodejs.org/api/crypto.html\"],\n \"tags\": [\"crypto\", \"iv\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"crypto.math-random-security\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Math.random Used for Security\",\n \"description\": \"Math.random is not cryptographically secure.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/Math\\\\.random\\\\s*\\\\(/\",\n \"requiresNearby\": { \"any\": [\"token\", \"secret\", \"password\", \"key\", \"session\", \"nonce\", \"csrf\"], \"within\": 5 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Math.random is not cryptographically secure for token/key generation\",\n \"requiredProof\": \"Use crypto.randomBytes or crypto.randomUUID for security\",\n \"references\": [\"https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues\"],\n \"tags\": [\"crypto\", \"random\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"cookie.no-httponly\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"Cookie Missing HttpOnly Flag\",\n \"description\": \"Session cookies should have HttpOnly flag to prevent XSS theft.\",\n \"applicability\": {\n \"frameworks\": [\"express\", \"nextjs\", \"node\"],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/setCookie|cookie\\\\s*\\\\(|set-cookie/i\",\n \"not\": [\"httpOnly\", \"HttpOnly\", \"http_only\"],\n \"requiresNearby\": { \"any\": [\"session\", \"token\", \"auth\"], \"within\": 20 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Cookie may be missing HttpOnly flag\",\n \"requiredProof\": \"Set httpOnly: true for session cookies\",\n \"references\": [\"https://owasp.org/www-community/HttpOnly\"],\n \"tags\": [\"cookie\", \"session\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"cors.wildcard-origin\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"CORS Wildcard Origin\",\n \"description\": \"CORS with * origin allows any site to make requests.\",\n \"applicability\": {\n \"frameworks\": [\"express\", \"nextjs\", \"node\"],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/Access-Control-Allow-Origin.*\\\\*|cors.*origin:\\\\s*[\\\"']\\\\*[\\\"']/\" }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"CORS wildcard origin allows any site to make requests\",\n \"requiredProof\": \"Restrict CORS origin to known domains\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Cross-Origin_Resource_Sharing_Cheat_Sheet.html\"],\n \"tags\": [\"cors\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"session.weak-secret\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Session Secret Too Weak\",\n \"description\": \"Session secrets should be long, random strings from environment.\",\n \"applicability\": {\n \"frameworks\": [\"express\", \"node\"],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/session.*secret\\\\s*[=:]\\\\s*[\\\"'][^\\\"']{1,20}[\\\"']/\", \"not\": [\"process.env\", \"import.meta.env\"] },\n { \"pattern\": \"/cookieParser\\\\s*\\\\(['\\\"][^'\\\"]{1,20}['\\\"]\\\\)/\", \"not\": [\"process.env\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Session secret appears to be weak or hardcoded\",\n \"requiredProof\": \"Use long random secret from environment variable\",\n \"references\": [\"https://expressjs.com/en/resources/middleware/session.html\"],\n \"tags\": [\"session\", \"secrets\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"filename.unsanitized\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.FILE_ACCESS\",\n \"name\": \"Filename Not Sanitized\",\n \"description\": \"User-provided filenames should be sanitized before use.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/req\\\\.file\\\\.originalname|body\\\\.filename|params\\\\.filename/\", \"not\": [\"sanitize\", \"path.basename\", \"normalize\", \"slugify\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Filename may not be sanitized — path traversal risk\",\n \"requiredProof\": \"Sanitize user-provided filenames with path.basename or slugify\",\n \"references\": [\"https://owasp.org/www-community/attacks/Path_Traversal\"],\n \"tags\": [\"sanitize\", \"filename\", \"traversal\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"nextjs.server-action.unprotected\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"AUTHZ.SERVICE_LAYER.ENFORCED\",\n \"name\": \"Unprotected Next.js Server Action\",\n \"description\": \"Server actions with 'use server' directive should verify authentication.\",\n \"applicability\": {\n \"frameworks\": [\"nextjs\"],\n \"filePatterns\": [\"**/app/**/actions.ts\", \"**/app/**/actions/*.ts\", \"**/actions/**/*.ts\", \"**/*.ts\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/'use server'/\",\n \"not\": [\"getServerSession\", \"auth()\", \"currentUser\", \"getSession\", \"requireAuth\", \"protect\"],\n \"requiresNearby\": { \"any\": [\"export async function\", \"export const\"], \"within\": 50 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Server action missing authentication check\",\n \"requiredProof\": \"Add getServerSession() or auth() check before any mutations\",\n \"references\": [\"https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations\"],\n \"tags\": [\"nextjs\", \"authz\", \"server-actions\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"nextjs.env.exposed\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"SECRETS.HARDCODED\",\n \"name\": \"Server Environment Variable Exposed to Client\",\n \"description\": \"Non-NEXT_PUBLIC_ environment variables should not be in client components.\",\n \"applicability\": {\n \"frameworks\": [\"nextjs\"],\n \"filePatterns\": [\"**/*.tsx\", \"**/*.ts\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/process\\\\.env\\\\.(DATABASE|SECRET|API_KEY|STRIPE_SECRET)/\",\n \"requiresNearby\": { \"any\": [\"use client\"], \"within\": 5 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Server-only environment variable may be exposed to client\",\n \"requiredProof\": \"Only access server env vars in server components/actions/API routes\",\n \"references\": [\"https://nextjs.org/docs/app/building-your-application/configuring/environment-variables\"],\n \"tags\": [\"nextjs\", \"security\", \"env\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"nosqli.mongo-injection\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.SQL_QUERY\",\n \"name\": \"NoSQL Injection via Object Input\",\n \"description\": \"MongoDB queries with unsanitized user input allow operator injection.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/\\\\.find\\\\(.*req\\\\.body|\\\\.findOne\\\\(.*req\\\\.body|\\\\.updateOne\\\\(.*req\\\\.body/\", \"not\": [\"sanitize\", \"validate\", \"schema\", \"zod\", \"joi\"] },\n { \"pattern\": \"/\\\\$where.*req\\\\.|\\\\$regex.*req\\\\./\", \"not\": [\"sanitize\", \"escape\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P0\",\n \"message\": \"MongoDB query with unsanitized user input — NoSQL injection risk\",\n \"requiredProof\": \"Validate and sanitize input before MongoDB queries\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Injection_Prevention_Cheat_Sheet.html\"],\n \"tags\": [\"nosql\", \"injection\", \"mongodb\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"debug.console-log-sensitive\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"Sensitive Data in Console Log\",\n \"description\": \"Logging sensitive data (passwords, tokens, keys) to console.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/console\\\\.log.*password|console\\\\.log.*secret|console\\\\.log.*token|console\\\\.log.*apiKey/i\", \"not\": [\"debug\", \"// \", \"redact\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Sensitive data may be logged to console\",\n \"requiredProof\": \"Remove sensitive data from logs or use structured logging with redaction\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html\"],\n \"tags\": [\"logging\", \"debug\", \"sensitive-data\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"upload.no-type-validation\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.FILE_ACCESS\",\n \"name\": \"File Upload Type Not Validated\",\n \"description\": \"Uploaded file types should be validated.\",\n \"applicability\": {\n \"frameworks\": [\"express\", \"node\"],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/multer|formidable/\", \"not\": [\"fileFilter\", \"mimetype\", \"file-type\", \"allowedTypes\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"File upload type not validated\",\n \"requiredProof\": \"Validate file MIME type and extension\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html\"],\n \"tags\": [\"upload\", \"file-type\", \"input\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"header.missing-csp\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"Missing Content-Security-Policy\",\n \"description\": \"Content-Security-Policy header should be set to prevent XSS and data injection.\",\n \"applicability\": {\n \"frameworks\": [\"express\", \"nextjs\", \"node\"],\n \"filePatterns\": [\"**/middleware.ts\", \"**/middleware.js\", \"**/server.ts\", \"**/server.js\", \"**/app.ts\", \"**/app.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/helmet|setHeader|headers/\",\n \"not\": [\"Content-Security-Policy\", \"content-security-policy\", \"csp\"],\n \"requiresNearby\": { \"any\": [\"express\", \"app.\", \"server.\"], \"within\": 20 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P2\",\n \"message\": \"Content-Security-Policy header may not be set\",\n \"requiredProof\": \"Set Content-Security-Policy header via helmet or manually\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html\"],\n \"tags\": [\"headers\", \"csp\", \"xss\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"prototype.pollution\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.COMMAND_EXEC\",\n \"name\": \"Prototype Pollution Risk\",\n \"description\": \"Object merge/assign with user input may allow prototype pollution.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/Object\\\\.assign\\\\(.*req\\\\.body|\\\\.\\\\.\\\\.(req\\\\.body|req\\\\.query)/\", \"not\": [\"sanitize\", \"pick\", \"omit\", \"allowlist\", \"zod\", \"schema\"] },\n { \"pattern\": \"/lodash\\\\.merge\\\\(.*req|deepMerge\\\\(.*req|_.merge\\\\(.*req/\", \"not\": [\"sanitize\", \"validate\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Object merge with user input may allow prototype pollution\",\n \"requiredProof\": \"Use allowlist (pick/omit) instead of spreading user input directly\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.html\"],\n \"tags\": [\"prototype-pollution\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"redirect.open-redirect\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"DATAFLOW.UNTRUSTED.RESPONSE\",\n \"name\": \"Open Redirect\",\n \"description\": \"Redirect with user-controlled URL allows phishing attacks.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n { \"pattern\": \"/redirect\\\\(.*req\\\\.query|redirect\\\\(.*searchParams|res\\\\.redirect\\\\(.*req/\", \"not\": [\"allowlist\", \"startsWith\", \"hostname\", \"validateUrl\", \"URL\"] }\n ]\n },\n \"finding\": {\n \"severity\": \"P1\",\n \"message\": \"Redirect URL from user input — open redirect risk\",\n \"requiredProof\": \"Validate redirect URL is same-origin or on allowlist\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html\"],\n \"tags\": [\"redirect\", \"phishing\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n },\n {\n \"id\": \"timing.non-constant-compare\",\n \"version\": \"1.0.0\",\n \"invariantId\": \"CRYPTO.ALGORITHM.STRONG\",\n \"name\": \"Non-Constant-Time String Comparison\",\n \"description\": \"Using === for secret comparison leaks timing information.\",\n \"applicability\": {\n \"frameworks\": [],\n \"filePatterns\": [\"**/*.ts\", \"**/*.js\", \"!**/__tests__/**\", \"!**/*.test.*\", \"!**/*.spec.*\", \"!**/test/**\", \"!**/tests/**\", \"!**/__mocks__/**\", \"!**/fixtures/**\"]\n },\n \"detection\": {\n \"codePatterns\": [\n {\n \"pattern\": \"/===.*secret|===.*token|===.*apiKey|===.*password/i\",\n \"not\": [\"timingSafeEqual\", \"constantTimeCompare\", \"scrypt\", \"bcrypt\", \"argon\"],\n \"requiresNearby\": { \"any\": [\"verify\", \"authenticate\", \"check\", \"compare\", \"validate\"], \"within\": 5 }\n }\n ]\n },\n \"finding\": {\n \"severity\": \"P2\",\n \"message\": \"Non-constant-time comparison for secrets — timing attack risk\",\n \"requiredProof\": \"Use crypto.timingSafeEqual for secret comparison\",\n \"references\": [\"https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html\"],\n \"tags\": [\"timing\", \"crypto\", \"security\"]\n },\n \"metadata\": { \"author\": \"SecurityChecks\", \"created\": \"2025-01-01T00:00:00Z\" }\n }\n]\n","/* eslint-disable max-lines */\n/**\n * Patterns API Client\n *\n * \"Patterns add coverage. Calibration adds precision.\"\n *\n * This module handles fetching Pro Patterns from the SecurityChecks API.\n * Patterns extend the built-in invariant checkers with framework-specific detection.\n *\n * Key principles:\n * - Patterns are cached locally (24h TTL by default)\n * - ETag-based conditional fetching for efficiency\n * - Fails safely to offline mode (no patterns, just built-in checkers)\n * - Patterns are filtered by detected frameworks\n */\n\nimport type {\n PatternConfig,\n PatternCache,\n PatternDefinition,\n Artifact,\n Severity,\n Finding,\n} from '@securitychecks/collector';\nimport { DEFAULT_PATTERN_CONFIG } from '@securitychecks/collector';\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync, readFileSync } from 'fs';\nimport { globSync } from 'glob';\nimport { Project, Node } from 'ts-morph';\nimport { join, dirname, relative } from 'path';\n\n// CLI version for API requests\nconst CLI_VERSION = '0.1.0';\n\n// Default cache path (relative to project root)\nconst DEFAULT_CACHE_PATH = '.securitychecks/patterns-cache.json';\n\n// ============================================================================\n// API Response Types (matches the API endpoint)\n// ============================================================================\n\ninterface PatternAPIResponse {\n patterns: APIPattern[];\n meta: {\n total: number;\n fromDatabase: number;\n builtIn: number;\n etag: string;\n maxAge: number;\n };\n}\n\ninterface APIPattern {\n id: string;\n patternId: string;\n version: string;\n name: string;\n description: string;\n invariantId: string;\n applicability: {\n frameworks: string[];\n frameworkVersions?: string;\n filePatterns: string[];\n };\n detection: unknown;\n finding: {\n severity: Severity;\n message: string;\n requiredProof: string;\n suggestedTest?: string;\n };\n metadata: {\n author: string;\n references: string[];\n tags: string[];\n };\n}\n\n// ============================================================================\n// Framework Detection\n// ============================================================================\n\n/**\n * Detect frameworks from a collector artifact.\n */\nexport function detectFrameworks(artifact: Artifact): string[] {\n const codebaseFrameworks = (artifact as Artifact & { codebase?: { frameworks?: string[] } })\n .codebase?.frameworks;\n if (codebaseFrameworks !== undefined) {\n return normalizeFrameworkList(codebaseFrameworks);\n }\n\n const frameworks = new Set<string>();\n\n // Check routes for framework hints\n if (artifact.routes) {\n for (const route of artifact.routes) {\n if (route.framework && route.framework !== 'unknown') {\n frameworks.add(route.framework.toLowerCase());\n }\n }\n }\n\n // Check services for framework indicators\n if (artifact.services) {\n for (const service of artifact.services) {\n // Check for Next.js patterns\n if (\n service.file.includes('/app/') &&\n (service.file.endsWith('route.ts') ||\n service.file.endsWith('route.js') ||\n service.file.includes('/actions/'))\n ) {\n frameworks.add('nextjs');\n }\n\n }\n }\n\n // Check webhooks for providers\n if (artifact.webhookHandlers) {\n for (const wh of artifact.webhookHandlers) {\n if (wh.provider) {\n // Add provider as a \"framework\" for pattern matching\n frameworks.add(wh.provider.toLowerCase());\n }\n }\n }\n\n return Array.from(frameworks);\n}\n\nfunction normalizeFrameworkList(frameworks: string[]): string[] {\n return Array.from(new Set(frameworks.map((framework) => framework.toLowerCase())));\n}\n\n// ============================================================================\n// Local Code Introspection (sync, cached)\n// ============================================================================\n\nconst fileDirectiveCache = new Map<string, Set<string>>();\nconst fileContentCache = new Map<string, { content: string; lines: string[] }>();\nconst functionRangeCache = new Map<string, FunctionRange[]>();\nconst packageJsonCache = new Map<string, Set<string>>();\nconst matcherCache = new Map<string, (text: string) => boolean>();\nlet tsProject: Project | null = null;\n\ninterface FunctionRange {\n name?: string;\n startLine: number;\n endLine: number;\n}\n\nfunction getDirectivePrologue(filePath: string): Set<string> {\n const cached = fileDirectiveCache.get(filePath);\n if (cached) return cached;\n\n const directives = new Set<string>();\n try {\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split(/\\r?\\n/);\n for (const line of lines.slice(0, 50)) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n if (trimmed.startsWith('//')) continue;\n if (trimmed.startsWith('/*') || trimmed.startsWith('*')) continue;\n\n const match = trimmed.match(/^['\"]([^'\"]+)['\"]\\s*;?\\s*$/);\n if (!match) break;\n\n const directive = match[1];\n if (!directive) break;\n directives.add(directive);\n }\n } catch {\n // Ignore file read errors; treat as no directives.\n }\n\n fileDirectiveCache.set(filePath, directives);\n return directives;\n}\n\n// ============================================================================\n// Code Pattern Matching Utilities\n// ============================================================================\n\ntype CodePattern = NonNullable<NonNullable<PatternDefinition['detection']>['codePatterns']>[number];\n\nconst DEFAULT_GLOB_IGNORE = [\n '**/node_modules/**',\n '**/.git/**',\n '**/.next/**',\n '**/dist/**',\n '**/build/**',\n '**/out/**',\n '**/.turbo/**',\n '**/coverage/**',\n '**/.cache/**',\n];\n\nconst DEFAULT_SOURCE_GLOBS = ['**/*.{ts,tsx,js,jsx,mjs,cjs}'];\n\nfunction getProject(): Project {\n if (!tsProject) {\n tsProject = new Project({\n skipAddingFilesFromTsConfig: true,\n compilerOptions: {\n allowJs: true,\n checkJs: false,\n },\n });\n }\n return tsProject;\n}\n\nfunction getFileContent(filePath: string): { content: string; lines: string[] } {\n const cached = fileContentCache.get(filePath);\n if (cached) return cached;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split(/\\r?\\n/);\n const payload = { content, lines };\n fileContentCache.set(filePath, payload);\n return payload;\n } catch {\n const payload = { content: '', lines: [] };\n fileContentCache.set(filePath, payload);\n return payload;\n }\n}\n\nfunction getFunctionRanges(filePath: string): FunctionRange[] {\n const cached = functionRangeCache.get(filePath);\n if (cached) return cached;\n\n let sourceFile;\n try {\n const project = getProject();\n sourceFile = project.getSourceFile(filePath) ?? project.addSourceFileAtPath(filePath);\n } catch {\n functionRangeCache.set(filePath, []);\n return [];\n }\n\n const ranges: FunctionRange[] = [];\n sourceFile.forEachDescendant((node) => {\n if (Node.isFunctionDeclaration(node) || Node.isMethodDeclaration(node)) {\n const name = node.getName();\n if (name) {\n ranges.push({\n name,\n startLine: node.getStartLineNumber(),\n endLine: node.getEndLineNumber(),\n });\n }\n return;\n }\n\n if (Node.isArrowFunction(node) || Node.isFunctionExpression(node)) {\n const parent = node.getParent();\n let name: string | undefined;\n if (Node.isVariableDeclaration(parent)) {\n name = parent.getName();\n } else if (Node.isPropertyAssignment(parent)) {\n name = parent.getName();\n }\n\n if (name) {\n ranges.push({\n name,\n startLine: node.getStartLineNumber(),\n endLine: node.getEndLineNumber(),\n });\n }\n }\n });\n\n functionRangeCache.set(filePath, ranges);\n return ranges;\n}\n\nfunction findFunctionForLine(line: number, ranges: FunctionRange[]): FunctionRange | undefined {\n let best: FunctionRange | undefined;\n for (const range of ranges) {\n if (line < range.startLine || line > range.endLine) continue;\n if (!best) {\n best = range;\n continue;\n }\n const bestSize = best.endLine - best.startLine;\n const currentSize = range.endLine - range.startLine;\n if (currentSize < bestSize) {\n best = range;\n }\n }\n return best;\n}\n\nfunction parseRegexLiteral(pattern: string): RegExp | null {\n const match = pattern.match(/^\\/(.+)\\/([gimsuy]*)$/);\n if (!match) return null;\n const source = match[1];\n if (!source) return null;\n const rawFlags = match[2] ?? '';\n const flags = rawFlags.replace('g', '');\n try {\n return new RegExp(source, flags);\n } catch {\n return null;\n }\n}\n\nfunction getMatcher(pattern: string): (text: string) => boolean {\n const cached = matcherCache.get(pattern);\n if (cached) return cached;\n\n const regex = parseRegexLiteral(pattern);\n const matcher = regex\n ? (text: string) => {\n regex.lastIndex = 0;\n return regex.test(text);\n }\n : (text: string) => text.includes(pattern);\n\n matcherCache.set(pattern, matcher);\n return matcher;\n}\n\nfunction normalizePatternList(value: string | string[] | undefined): string[] {\n if (!value) return [];\n return Array.isArray(value) ? value.filter((v) => v.length > 0) : [value];\n}\n\nfunction matchesAll(patterns: string[], text: string): boolean {\n return patterns.every((pattern) => getMatcher(pattern)(text));\n}\n\nfunction matchesAny(patterns: string[], text: string): boolean {\n return patterns.some((pattern) => getMatcher(pattern)(text));\n}\n\nfunction matchesNone(patterns: string[], text: string): boolean {\n return patterns.every((pattern) => !getMatcher(pattern)(text));\n}\n\nfunction meetsNearbyRequirement(\n lines: string[],\n lineIndex: number,\n requirement: NonNullable<CodePattern['requiresNearby']>\n): boolean {\n const start = Math.max(0, lineIndex - requirement.within);\n const end = Math.min(lines.length - 1, lineIndex + requirement.within);\n const windowLines = lines.slice(start, end + 1);\n\n const any = normalizePatternList(requirement.any);\n const all = normalizePatternList(requirement.all);\n const not = normalizePatternList(requirement.not);\n\n if (any.length > 0 && !windowLines.some((line) => matchesAny(any, line))) {\n return false;\n }\n\n if (all.length > 0 && !all.every((pattern) => windowLines.some((line) => getMatcher(pattern)(line)))) {\n return false;\n }\n\n if (not.length > 0 && windowLines.some((line) => matchesAny(not, line))) {\n return false;\n }\n\n return true;\n}\n\nfunction collectArtifactFiles(artifact: Artifact): string[] {\n const files = new Set<string>();\n\n for (const service of artifact.services ?? []) files.add(service.file);\n for (const route of artifact.routes ?? []) files.add(route.file);\n for (const webhook of artifact.webhookHandlers ?? []) files.add(webhook.file);\n for (const tx of artifact.transactionScopes ?? []) files.add(tx.file);\n for (const job of artifact.jobHandlers ?? []) files.add(job.file);\n for (const mutation of artifact.membershipMutations ?? []) files.add(mutation.file);\n for (const test of artifact.tests ?? []) files.add(test.file);\n for (const authzCall of artifact.authzCalls ?? []) files.add(authzCall.file);\n for (const cacheOp of artifact.cacheOperations ?? []) files.add(cacheOp.file);\n\n return [...files];\n}\n\nfunction collectFilesFromGlobs(targetPath: string, patterns: string[]): Set<string> {\n const files = new Set<string>();\n for (const pattern of patterns) {\n if (!pattern) continue;\n const matches = globSync(pattern, {\n cwd: targetPath,\n absolute: true,\n nodir: true,\n ignore: DEFAULT_GLOB_IGNORE,\n });\n for (const match of matches) {\n files.add(match);\n }\n }\n return files;\n}\n\nfunction intersectFiles(primary: Set<string>, secondary: Set<string>): Set<string> {\n if (primary.size === 0) return new Set(secondary);\n if (secondary.size === 0) return new Set(primary);\n const intersection = new Set<string>();\n for (const file of primary) {\n if (secondary.has(file)) intersection.add(file);\n }\n return intersection;\n}\n\nfunction resolveBaseCandidateFiles(artifact: Artifact, pattern: PatternDefinition): Set<string> {\n const filePatterns = pattern.applicability.filePatterns ?? [];\n if (filePatterns.length > 0) {\n return collectFilesFromGlobs(artifact.targetPath, filePatterns);\n }\n\n const artifactFiles = collectArtifactFiles(artifact)\n .map((file) => join(artifact.targetPath, file))\n .filter((file) => existsSync(file));\n\n if (artifactFiles.length > 0) {\n return new Set(artifactFiles);\n }\n\n return collectFilesFromGlobs(artifact.targetPath, DEFAULT_SOURCE_GLOBS);\n}\n\nfunction findNearestPackageJson(filePath: string, rootPath: string): string | null {\n let current = dirname(filePath);\n const root = rootPath;\n\n while (true) {\n const candidate = join(current, 'package.json');\n if (existsSync(candidate)) return candidate;\n\n if (current === root) break;\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n\n return null;\n}\n\nfunction getDependenciesFromPackageJson(packageJsonPath: string): Set<string> {\n const cached = packageJsonCache.get(packageJsonPath);\n if (cached) return cached;\n\n try {\n const raw = readFileSync(packageJsonPath, 'utf-8');\n const data = JSON.parse(raw) as Record<string, Record<string, string> | undefined>;\n const deps = new Set<string>([\n ...Object.keys(data['dependencies'] ?? {}),\n ...Object.keys(data['devDependencies'] ?? {}),\n ...Object.keys(data['peerDependencies'] ?? {}),\n ...Object.keys(data['optionalDependencies'] ?? {}),\n ]);\n packageJsonCache.set(packageJsonPath, deps);\n return deps;\n } catch {\n const deps = new Set<string>();\n packageJsonCache.set(packageJsonPath, deps);\n return deps;\n }\n}\n\nfunction collectDependenciesForFiles(files: string[], targetPath: string): Set<string> {\n const deps = new Set<string>();\n for (const file of files) {\n const pkg = findNearestPackageJson(file, targetPath);\n if (!pkg) continue;\n const pkgDeps = getDependenciesFromPackageJson(pkg);\n for (const dep of pkgDeps) deps.add(dep);\n }\n\n if (deps.size === 0) {\n const rootPackage = join(targetPath, 'package.json');\n if (existsSync(rootPackage)) {\n const rootDeps = getDependenciesFromPackageJson(rootPackage);\n for (const dep of rootDeps) deps.add(dep);\n }\n }\n\n return deps;\n}\n\nfunction hasRequiredDependencies(\n pattern: PatternDefinition,\n files: string[],\n targetPath: string\n): boolean {\n const required = pattern.applicability.requiredDependencies ?? [];\n if (required.length === 0) return true;\n\n const deps = collectDependenciesForFiles(files, targetPath);\n return required.every((dep) => deps.has(dep));\n}\n\nfunction hasExcludedPattern(pattern: PatternDefinition, files: string[]): boolean {\n const excludePatterns = pattern.applicability.excludePatterns ?? [];\n if (excludePatterns.length === 0) return false;\n\n for (const file of files) {\n const { content } = getFileContent(file);\n if (!content) continue;\n for (const excludePattern of excludePatterns) {\n if (getMatcher(excludePattern)(content)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n// ============================================================================\n// Cache Management\n// ============================================================================\n\n/**\n * Load pattern cache from disk.\n */\nasync function loadCache(cachePath: string): Promise<PatternCache | null> {\n try {\n if (existsSync(cachePath)) {\n const content = await readFile(cachePath, 'utf-8');\n const cache = JSON.parse(content) as PatternCache;\n\n // Check if cache is expired\n const expiresAt = new Date(cache.expiresAt).getTime();\n if (Date.now() < expiresAt) {\n return cache;\n }\n }\n } catch {\n // Cache corrupted or unreadable\n }\n return null;\n}\n\n/**\n * Save pattern cache to disk.\n */\nasync function saveCache(cachePath: string, cache: PatternCache): Promise<void> {\n try {\n await mkdir(dirname(cachePath), { recursive: true });\n await writeFile(cachePath, JSON.stringify(cache, null, 2));\n } catch {\n // Failed to save cache, not critical\n }\n}\n\n// ============================================================================\n// API Client\n// ============================================================================\n\n/**\n * Fetch patterns from the API.\n */\nasync function fetchFromAPI(\n config: PatternConfig,\n frameworks: string[],\n invariants?: string[],\n etag?: string\n): Promise<{ patterns: PatternDefinition[]; meta: PatternAPIResponse['meta'] } | null> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeout);\n\n try {\n // Build query string\n const params = new URLSearchParams();\n if (frameworks.length > 0) {\n params.set('frameworks', frameworks.join(','));\n }\n if (invariants && invariants.length > 0) {\n params.set('invariants', invariants.join(','));\n }\n params.set('version', CLI_VERSION);\n\n const url = `${config.endpoint}?${params.toString()}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Client-Version': CLI_VERSION,\n };\n\n if (config.apiKey) {\n headers['Authorization'] = `Bearer ${config.apiKey}`;\n }\n\n if (etag) {\n headers['If-None-Match'] = etag;\n }\n\n const response = await fetch(url, {\n method: 'GET',\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // 304 Not Modified - use cached version\n if (response.status === 304) {\n return null;\n }\n\n if (!response.ok) {\n // API error - fail safe to offline mode\n return null;\n }\n\n const data = (await response.json()) as PatternAPIResponse;\n\n // Convert API patterns to PatternDefinition format\n const patterns: PatternDefinition[] = data.patterns.map(convertAPIPattern);\n\n return { patterns, meta: data.meta };\n } catch {\n // Network error, timeout, etc.\n clearTimeout(timeoutId);\n return null;\n }\n}\n\n/**\n * Convert API pattern format to PatternDefinition.\n */\nfunction convertAPIPattern(apiPattern: APIPattern): PatternDefinition {\n return {\n id: apiPattern.patternId,\n version: apiPattern.version,\n invariantId: apiPattern.invariantId,\n name: apiPattern.name,\n description: apiPattern.description,\n applicability: {\n frameworks: apiPattern.applicability.frameworks,\n frameworkVersions: apiPattern.applicability.frameworkVersions,\n filePatterns: apiPattern.applicability.filePatterns,\n },\n detection: apiPattern.detection as PatternDefinition['detection'],\n finding: {\n severity: apiPattern.finding.severity,\n message: apiPattern.finding.message,\n requiredProof: apiPattern.finding.requiredProof,\n suggestedTest: apiPattern.finding.suggestedTest,\n references: apiPattern.metadata.references,\n tags: apiPattern.metadata.tags,\n },\n metadata: {\n author: apiPattern.metadata.author,\n created: new Date().toISOString(), // API doesn't provide this yet\n references: apiPattern.metadata.references,\n },\n };\n}\n\n// ============================================================================\n// Main API\n// ============================================================================\n\n/**\n * Fetch patterns for a codebase.\n *\n * This is the main entry point for pattern fetching.\n */\nexport async function fetchPatterns(\n artifact: Artifact,\n config: PatternConfig = DEFAULT_PATTERN_CONFIG,\n targetPath: string = process.cwd(),\n frameworksOverride?: string[]\n): Promise<PatternDefinition[]> {\n if (!config.enabled || config.offlineMode) {\n return [];\n }\n\n const frameworks =\n frameworksOverride !== undefined\n ? normalizeFrameworkList(frameworksOverride)\n : detectFrameworks(artifact);\n if (frameworks.length === 0) {\n // No frameworks detected, no patterns to fetch\n return [];\n }\n\n const cachePath = config.cache?.path ?? join(targetPath, DEFAULT_CACHE_PATH);\n\n // Try to load from cache first\n if (config.cache?.enabled) {\n const cache = await loadCache(cachePath);\n if (cache) {\n // Check if cache covers our frameworks\n const cachedFrameworks = new Set<string>();\n for (const pattern of cache.patterns) {\n for (const f of pattern.applicability.frameworks) {\n cachedFrameworks.add(f);\n }\n }\n\n const allCovered = frameworks.every((f) => cachedFrameworks.has(f));\n if (allCovered) {\n // Try conditional fetch with ETag\n const result = await fetchFromAPI(config, frameworks, undefined, cache.etag);\n if (result === null) {\n // 304 Not Modified - use cached patterns\n return filterPatternsForFrameworks(cache.patterns, frameworks);\n }\n\n // New patterns - update cache\n const newCache: PatternCache = {\n patterns: result.patterns,\n fetchedAt: new Date().toISOString(),\n etag: result.meta.etag,\n expiresAt: new Date(Date.now() + result.meta.maxAge * 1000).toISOString(),\n apiVersion: '1.0',\n };\n await saveCache(cachePath, newCache);\n return filterPatternsForFrameworks(result.patterns, frameworks);\n }\n }\n }\n\n // Fetch from API\n const result = await fetchFromAPI(config, frameworks);\n if (result === null) {\n // API failed - return empty (graceful degradation)\n return [];\n }\n\n // Save to cache\n if (config.cache?.enabled) {\n const cache: PatternCache = {\n patterns: result.patterns,\n fetchedAt: new Date().toISOString(),\n etag: result.meta.etag,\n expiresAt: new Date(Date.now() + result.meta.maxAge * 1000).toISOString(),\n apiVersion: '1.0',\n };\n await saveCache(cachePath, cache);\n }\n\n return filterPatternsForFrameworks(result.patterns, frameworks);\n}\n\n/**\n * Filter patterns to only those applicable to the detected frameworks.\n */\nfunction filterPatternsForFrameworks(\n patterns: PatternDefinition[],\n frameworks: string[]\n): PatternDefinition[] {\n return patterns.filter((pattern) =>\n pattern.applicability.frameworks.some((f) => frameworks.includes(f.toLowerCase()))\n );\n}\n\n// ============================================================================\n// Pattern Matching\n// ============================================================================\n\n/**\n * Result of matching a pattern against artifact.\n */\nexport interface PatternMatch {\n pattern: PatternDefinition;\n file: string;\n line: number;\n symbol?: string;\n evidence: string[];\n}\n\n/**\n * Apply patterns to an artifact and generate findings.\n *\n * This matches patterns against the artifact data and creates findings\n * for any matches.\n */\nexport function applyPatterns(\n artifact: Artifact,\n patterns: PatternDefinition[],\n options?: { changedFiles?: Set<string> }\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n\n for (const pattern of patterns) {\n const patternMatches = matchPattern(artifact, pattern, options?.changedFiles);\n matches.push(...patternMatches);\n }\n\n return matches;\n}\n\n/**\n * Match a single pattern against an artifact.\n */\nfunction matchPattern(artifact: Artifact, pattern: PatternDefinition, changedFiles?: Set<string>): PatternMatch[] {\n const matches: PatternMatch[] = [];\n const detection = pattern.detection;\n\n if (!detection) {\n return matches;\n }\n\n let baseFiles = resolveBaseCandidateFiles(artifact, pattern);\n if ((pattern.applicability.filePatterns ?? []).length > 0 && baseFiles.size === 0) {\n return matches;\n }\n\n // When --changed is active, restrict scanning to changed files only\n if (changedFiles && changedFiles.size > 0) {\n const filtered = new Set<string>();\n for (const f of baseFiles) {\n if (changedFiles.has(f)) filtered.add(f);\n }\n baseFiles = filtered;\n if (baseFiles.size === 0) return matches;\n }\n\n const baseFileList = [...baseFiles];\n if (!hasRequiredDependencies(pattern, baseFileList, artifact.targetPath)) {\n return matches;\n }\n if (hasExcludedPattern(pattern, baseFileList)) {\n return matches;\n }\n\n // Check artifact conditions (uses collector output)\n if (detection.artifactConditions) {\n for (const condition of detection.artifactConditions) {\n const conditionMatches = matchArtifactCondition(artifact, pattern, condition);\n matches.push(...conditionMatches);\n }\n }\n\n // Check code patterns (reads source files)\n if (detection.codePatterns && detection.codePatterns.length > 0) {\n matches.push(...matchCodePatterns(artifact, pattern, baseFiles));\n }\n\n return matches;\n}\n\nfunction matchCodePatterns(\n artifact: Artifact,\n pattern: PatternDefinition,\n baseFiles: Set<string>\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n const detection = pattern.detection;\n if (!detection?.codePatterns || detection.codePatterns.length === 0) {\n return matches;\n }\n\n for (const codePattern of detection.codePatterns) {\n const contextInFiles = normalizePatternList(codePattern.context?.inFiles);\n const contextFiles =\n contextInFiles.length > 0\n ? collectFilesFromGlobs(artifact.targetPath, contextInFiles)\n : new Set<string>();\n\n const candidateFiles = intersectFiles(baseFiles, contextFiles);\n if (candidateFiles.size === 0) {\n continue;\n }\n\n for (const filePath of candidateFiles) {\n const relativePath = relative(artifact.targetPath, filePath);\n const fileMatches = matchCodePatternInFile(pattern, codePattern, filePath, relativePath);\n matches.push(...fileMatches);\n }\n }\n\n return matches;\n}\n\nfunction matchCodePatternInFile(\n pattern: PatternDefinition,\n codePattern: CodePattern,\n filePath: string,\n relativePath: string\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n const { lines } = getFileContent(filePath);\n if (lines.length === 0) return matches;\n\n const functionRanges = getFunctionRanges(filePath);\n const validMatches = collectValidMatches(lines, codePattern, functionRanges);\n\n if (!codePattern.invert) {\n for (const match of validMatches) {\n matches.push({\n pattern,\n file: relativePath,\n line: match.lineIndex + 1,\n symbol: match.functionRange?.name,\n evidence: buildCodePatternEvidence(codePattern, false),\n });\n }\n return matches;\n }\n\n const context = codePattern.context;\n if (context?.atFunctionLevel || context?.inFunctions?.length) {\n const targetRanges = functionRanges.filter((range) => {\n if (!context?.inFunctions || context.inFunctions.length === 0) return true;\n return range.name ? context.inFunctions.includes(range.name) : false;\n });\n\n if (targetRanges.length === 0) return matches;\n\n for (const range of targetRanges) {\n const hasMatch = validMatches.some(\n (match) =>\n match.functionRange?.name === range.name &&\n match.lineIndex + 1 >= range.startLine &&\n match.lineIndex + 1 <= range.endLine\n );\n\n if (!hasMatch) {\n matches.push({\n pattern,\n file: relativePath,\n line: range.startLine,\n symbol: range.name,\n evidence: buildCodePatternEvidence(codePattern, true),\n });\n }\n }\n\n return matches;\n }\n\n if (validMatches.length === 0) {\n matches.push({\n pattern,\n file: relativePath,\n line: 1,\n evidence: buildCodePatternEvidence(codePattern, true),\n });\n }\n\n return matches;\n}\n\nfunction collectValidMatches(\n lines: string[],\n codePattern: CodePattern,\n functionRanges: FunctionRange[]\n): Array<{ lineIndex: number; functionRange?: FunctionRange }> {\n const matches: Array<{ lineIndex: number; functionRange?: FunctionRange }> = [];\n const andPatterns = normalizePatternList(codePattern.and);\n const notPatterns = normalizePatternList(codePattern.not);\n\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i] ?? '';\n if (!getMatcher(codePattern.pattern)(line)) continue;\n if (andPatterns.length > 0 && !matchesAll(andPatterns, line)) continue;\n if (notPatterns.length > 0 && !matchesNone(notPatterns, line)) continue;\n if (codePattern.requiresNearby && !meetsNearbyRequirement(lines, i, codePattern.requiresNearby)) continue;\n\n const functionRange = findFunctionForLine(i + 1, functionRanges);\n if (!passesContext(codePattern.context, functionRange)) continue;\n\n matches.push({ lineIndex: i, functionRange });\n }\n\n return matches;\n}\n\nfunction passesContext(\n context: CodePattern['context'] | undefined,\n functionRange: FunctionRange | undefined\n): boolean {\n if (!context) return true;\n\n if (context.atFileLevel && functionRange) return false;\n if (context.atFunctionLevel && !functionRange) return false;\n\n if (context.inFunctions && context.inFunctions.length > 0) {\n if (!functionRange?.name) return false;\n if (!context.inFunctions.includes(functionRange.name)) return false;\n }\n\n return true;\n}\n\nfunction buildCodePatternEvidence(codePattern: CodePattern, isMissing: boolean): string[] {\n const evidence: string[] = [];\n const label = isMissing ? 'Missing code pattern' : 'Matched code pattern';\n evidence.push(`${label}: ${codePattern.pattern}`);\n\n const andPatterns = normalizePatternList(codePattern.and);\n if (andPatterns.length > 0) {\n evidence.push(`Requires: ${andPatterns.join(', ')}`);\n }\n\n const notPatterns = normalizePatternList(codePattern.not);\n if (notPatterns.length > 0) {\n evidence.push(`Excludes: ${notPatterns.join(', ')}`);\n }\n\n if (codePattern.requiresNearby) {\n const nearby = codePattern.requiresNearby;\n const window = nearby.within;\n if (nearby.any && nearby.any.length > 0) {\n evidence.push(`Nearby (±${window}): any ${nearby.any.join(', ')}`);\n }\n if (nearby.all && nearby.all.length > 0) {\n evidence.push(`Nearby (±${window}): all ${nearby.all.join(', ')}`);\n }\n if (nearby.not && nearby.not.length > 0) {\n evidence.push(`Nearby (±${window}): none ${nearby.not.join(', ')}`);\n }\n }\n\n return evidence;\n}\n\n/**\n * Match an artifact condition.\n */\nfunction matchArtifactCondition(\n artifact: Artifact,\n pattern: PatternDefinition,\n condition: { type: string; conditions: Record<string, unknown> }\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n\n switch (condition.type) {\n case 'service':\n matches.push(...matchServiceCondition(artifact, pattern, condition.conditions));\n break;\n\n case 'transactionScope':\n matches.push(...matchTransactionCondition(artifact, pattern, condition.conditions));\n break;\n\n case 'webhookHandler':\n matches.push(...matchWebhookCondition(artifact, pattern, condition.conditions));\n break;\n\n // Add more condition types as needed\n }\n\n return matches;\n}\n\n/**\n * Match service-level conditions.\n */\nfunction matchServiceCondition(\n artifact: Artifact,\n pattern: PatternDefinition,\n conditions: Record<string, unknown>\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n\n if (!artifact.services) {\n return matches;\n }\n\n for (const service of artifact.services) {\n let isMatch = true;\n const evidence: string[] = [];\n\n // Check hasDirective\n const hasDirective = conditions['hasDirective'];\n if (typeof hasDirective === 'string' && hasDirective.length > 0) {\n const filePath = join(artifact.targetPath, service.file);\n const directives = getDirectivePrologue(filePath);\n const hasIt = directives.has(hasDirective);\n if (!hasIt) {\n isMatch = false;\n } else {\n evidence.push(`Has directive: \"${hasDirective}\"`);\n }\n }\n\n // Check missingAuthCall\n const missingAuthCall = conditions['missingAuthCall'] === true;\n if (missingAuthCall && isMatch) {\n // Check if there are any auth calls in this service\n const serviceAuthCalls =\n artifact.authzCalls?.filter((a) => a.file === service.file) ?? [];\n\n if (serviceAuthCalls.length > 0) {\n isMatch = false; // Has auth calls, not missing\n } else {\n evidence.push('No authentication calls found');\n }\n }\n\n if (isMatch && evidence.length > 0) {\n matches.push({\n pattern,\n file: service.file,\n line: service.line,\n symbol: service.name,\n evidence,\n });\n }\n }\n\n return matches;\n}\n\n/**\n * Match transaction-level conditions.\n */\nfunction matchTransactionCondition(\n artifact: Artifact,\n pattern: PatternDefinition,\n conditions: Record<string, unknown>\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n\n if (!artifact.transactionScopes) {\n return matches;\n }\n\n for (const tx of artifact.transactionScopes) {\n let isMatch = true;\n const evidence: string[] = [];\n\n // Check ORM type\n const orm = conditions['orm'];\n if (typeof orm === 'string' && orm.length > 0) {\n // Collector currently does not emit ORM type; fail closed to avoid false matches.\n isMatch = false;\n }\n\n // Check for side effects\n const containsSideEffects = conditions['containsSideEffects'] === true;\n if (containsSideEffects && isMatch) {\n const sideEffectTypes = conditions['sideEffectTypes'];\n const allowedTypes = Array.isArray(sideEffectTypes)\n ? sideEffectTypes.filter((t): t is string => typeof t === 'string')\n : undefined;\n\n const matchingSideEffects = allowedTypes\n ? tx.sideEffects.filter((se) => allowedTypes.includes(se.type))\n : tx.sideEffects;\n\n if (tx.containsSideEffects && matchingSideEffects.length > 0) {\n evidence.push(\n `Side effects inside transaction: ${matchingSideEffects.map((se) => se.type).join(', ')}`\n );\n } else {\n isMatch = false;\n }\n }\n\n if (isMatch && evidence.length > 0) {\n matches.push({\n pattern,\n file: tx.file,\n line: tx.line,\n symbol: tx.functionName,\n evidence,\n });\n }\n }\n\n return matches;\n}\n\n/**\n * Match webhook-level conditions.\n */\nfunction matchWebhookCondition(\n artifact: Artifact,\n pattern: PatternDefinition,\n conditions: Record<string, unknown>\n): PatternMatch[] {\n const matches: PatternMatch[] = [];\n\n if (!artifact.webhookHandlers) {\n return matches;\n }\n\n for (const wh of artifact.webhookHandlers) {\n let isMatch = true;\n const evidence: string[] = [];\n\n // Check provider\n const provider = conditions['provider'];\n if (typeof provider === 'string' && provider.length > 0) {\n if (wh.provider?.toLowerCase() !== provider.toLowerCase()) {\n isMatch = false;\n } else {\n evidence.push(`Provider: ${wh.provider}`);\n }\n }\n\n // Check missing signature verification\n const missingSignatureVerification = conditions['missingSignatureVerification'] === true;\n if (missingSignatureVerification && isMatch) {\n const method = wh.signatureVerification?.method;\n if (method && method !== 'none') {\n isMatch = false;\n } else {\n evidence.push('Missing signature verification');\n }\n }\n\n // Check missing idempotency\n const missingIdempotency = conditions['missingIdempotency'] === true;\n if (missingIdempotency && isMatch) {\n if (wh.hasIdempotencyCheck) {\n isMatch = false; // Has check, not missing\n } else {\n evidence.push('Missing idempotency check');\n }\n }\n\n if (isMatch && evidence.length > 0) {\n matches.push({\n pattern,\n file: wh.file,\n line: wh.line,\n symbol: wh.handlerName,\n evidence,\n });\n }\n }\n\n return matches;\n}\n\n// ============================================================================\n// Pattern Finding Conversion\n// ============================================================================\n\n/**\n * Convert pattern matches to findings.\n */\nexport function patternMatchesToFindings(matches: PatternMatch[], source?: Finding['source']): Finding[] {\n return matches.map((match) => ({\n invariantId: match.pattern.invariantId,\n severity: match.pattern.finding.severity,\n message: match.pattern.finding.message,\n evidence: [\n {\n file: match.file,\n line: match.line,\n symbol: match.symbol,\n context: match.evidence.join('; '),\n },\n ],\n requiredProof: match.pattern.finding.requiredProof,\n suggestedTest: match.pattern.finding.suggestedTest,\n structuredEvidence: {\n summary: `Matched Pro Pattern: ${match.pattern.name ?? match.pattern.id}`,\n signals: match.evidence,\n confidence: 'medium',\n },\n ...(source ? { source } : {}),\n }));\n}\n\n// ============================================================================\n// Statistics\n// ============================================================================\n\n/**\n * Get statistics about pattern application.\n */\nexport interface PatternStats {\n patternsLoaded: number;\n patternsApplied: number;\n matchesFound: number;\n frameworksDetected: string[];\n patternsByFramework: Record<string, number>;\n}\n\nexport function getPatternStats(\n patterns: PatternDefinition[],\n matches: PatternMatch[],\n frameworks: string[]\n): PatternStats {\n const patternsByFramework: Record<string, number> = {};\n for (const pattern of patterns) {\n for (const f of pattern.applicability.frameworks) {\n patternsByFramework[f] = (patternsByFramework[f] ?? 0) + 1;\n }\n }\n\n return {\n patternsLoaded: patterns.length,\n patternsApplied: patterns.length,\n matchesFound: matches.length,\n frameworksDetected: frameworks,\n patternsByFramework,\n };\n}\n\n// ============================================================================\n// Local Pattern Loading\n// ============================================================================\n\n/**\n * Load patterns from a local JSON file.\n * Useful for development and testing without cloud connectivity.\n */\nexport async function loadPatternsFromFile(filePath: string): Promise<PatternDefinition[]> {\n try {\n const content = await readFile(filePath, 'utf-8');\n const data = JSON.parse(content) as { patterns?: PatternDefinition[] } | PatternDefinition[];\n\n // Support both { patterns: [...] } and [...] formats\n if (Array.isArray(data)) {\n return data;\n }\n if (data.patterns && Array.isArray(data.patterns)) {\n return data.patterns;\n }\n\n return [];\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to load patterns from ${filePath}: ${message}`);\n }\n}\n\n/**\n * Load patterns from file if it exists, otherwise return empty array.\n * Does not throw on missing file.\n */\nexport async function loadPatternsFromFileIfExists(filePath: string): Promise<PatternDefinition[]> {\n if (!existsSync(filePath)) {\n return [];\n }\n return loadPatternsFromFile(filePath);\n}\n\n// ============================================================================\n// Cache Cleanup\n// ============================================================================\n\n/**\n * Clear all module-level caches used during pattern matching.\n * Call after applyPatterns() to free memory in large repos.\n */\nexport function clearPatternCaches(): void {\n fileDirectiveCache.clear();\n fileContentCache.clear();\n functionRangeCache.clear();\n packageJsonCache.clear();\n matcherCache.clear();\n tsProject = null;\n}\n\n// ============================================================================\n// Bundled Pattern Loading\n// ============================================================================\n\nimport bundledPatternsData from '../patterns/bundled.json' with { type: 'json' };\n\n/**\n * Load bundled source-level patterns shipped with the CLI.\n * These are open, commodity OWASP-type rules that run locally.\n *\n * Patterns with empty frameworks arrays apply to all codebases.\n * Patterns with specific frameworks are filtered to match the detected set.\n */\nexport function loadBundledPatterns(frameworks: string[]): PatternDefinition[] {\n const patterns = bundledPatternsData as unknown as PatternDefinition[];\n return patterns.filter(p =>\n p.applicability.frameworks.length === 0 ||\n p.applicability.frameworks.some(f => frameworks.includes(f.toLowerCase()))\n );\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { DEFAULT_PATTERN_CONFIG };\nexport type { PatternConfig, PatternDefinition, PatternCache };\n","/**\n * Test Patterns for Development\n *\n * These are real patterns used to test the pattern matching engine without\n * requiring cloud connectivity. Enable via:\n * - SECURITYCHECKS_DEV_PATTERNS=1\n * - scheck run --patterns-file ./patterns.json\n *\n * These patterns exercise all major detection mechanisms:\n * - Code patterns (regex, string matching)\n * - Artifact conditions (service, webhook, transaction)\n * - Context constraints (file-level, function-level)\n */\n\nimport type { PatternDefinition } from '@securitychecks/collector';\n\n/**\n * Test patterns for development and testing.\n * These are real patterns that detect actual security issues.\n */\nexport const TEST_PATTERNS: PatternDefinition[] = [\n // ============================================================================\n // Next.js Patterns\n // ============================================================================\n {\n id: 'nextjs.server-action.unprotected',\n version: '1.0.0',\n invariantId: 'AUTHZ.SERVICE_LAYER.ENFORCED',\n name: 'Unprotected Next.js Server Action',\n description:\n 'Server actions with \"use server\" directive should verify authentication before performing mutations.',\n applicability: {\n frameworks: ['nextjs'],\n requiredDependencies: ['next'],\n filePatterns: ['**/app/**/actions.ts', '**/app/**/actions/*.ts', '**/actions/**/*.ts'],\n },\n detection: {\n artifactConditions: [\n {\n type: 'service',\n conditions: {\n hasDirective: 'use server',\n missingAuthCall: true,\n },\n },\n ],\n },\n finding: {\n severity: 'P0',\n message: 'Server action missing authentication check',\n requiredProof: 'Add getServerSession() or auth() check before any mutations',\n suggestedTest: 'POST to server action without session should return 401/redirect',\n references: [\n 'https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations',\n ],\n tags: ['nextjs', 'authz', 'server-actions'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: [\n 'https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations',\n ],\n },\n },\n {\n id: 'nextjs.api-route.unprotected',\n version: '1.0.0',\n invariantId: 'AUTHZ.SERVICE_LAYER.ENFORCED',\n name: 'Unprotected Next.js API Route',\n description:\n 'API routes should verify authentication for mutating operations (POST, PUT, DELETE, PATCH).',\n applicability: {\n frameworks: ['nextjs'],\n requiredDependencies: ['next'],\n filePatterns: ['**/app/api/**/route.ts', '**/pages/api/**/*.ts'],\n },\n detection: {\n codePatterns: [\n {\n pattern: '/export\\\\s+(async\\\\s+)?function\\\\s+(POST|PUT|DELETE|PATCH)/',\n not: ['getServerSession', 'auth()', 'requireAuth', 'authorize'],\n context: {\n atFileLevel: true,\n },\n },\n ],\n },\n finding: {\n severity: 'P0',\n message: 'API route handler missing authentication check',\n requiredProof: 'Add session/auth check at the start of the handler',\n suggestedTest: 'Request without Authorization header should return 401',\n references: ['https://nextjs.org/docs/app/building-your-application/routing/route-handlers'],\n tags: ['nextjs', 'authz', 'api-routes'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://nextjs.org/docs/app/building-your-application/routing/route-handlers'],\n },\n },\n\n // ============================================================================\n // Stripe Webhook Patterns\n // ============================================================================\n {\n id: 'stripe.webhook.no-signature',\n version: '1.0.0',\n invariantId: 'WEBHOOK.SIGNATURE.VERIFIED',\n name: 'Stripe Webhook Missing Signature Verification',\n description:\n 'Stripe webhooks must verify signatures using stripe.webhooks.constructEvent() before processing.',\n applicability: {\n frameworks: ['stripe'],\n requiredDependencies: ['stripe'],\n filePatterns: ['**/webhook*/**/*.ts', '**/api/webhook*/**/*.ts', '**/stripe/**/*.ts'],\n },\n detection: {\n artifactConditions: [\n {\n type: 'webhookHandler',\n conditions: {\n provider: 'stripe',\n missingSignatureVerification: true,\n },\n },\n ],\n codePatterns: [\n {\n pattern: 'stripe-signature',\n not: ['constructEvent', 'verifyWebhook'],\n context: {\n atFileLevel: true,\n },\n invert: true, // Flag when pattern is missing\n },\n ],\n },\n finding: {\n severity: 'P0',\n message: 'Stripe webhook handler missing signature verification',\n requiredProof:\n 'Use stripe.webhooks.constructEvent(body, sig, webhookSecret) to verify signatures',\n suggestedTest: 'Request with invalid stripe-signature header should return 400',\n references: ['https://stripe.com/docs/webhooks/signatures'],\n tags: ['stripe', 'webhook', 'signature'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://stripe.com/docs/webhooks/signatures'],\n },\n },\n {\n id: 'stripe.webhook.no-idempotency',\n version: '1.0.0',\n invariantId: 'WEBHOOK.IDEMPOTENT',\n name: 'Stripe Webhook Missing Idempotency',\n description:\n 'Stripe webhooks should check if an event has already been processed to handle retries safely.',\n applicability: {\n frameworks: ['stripe'],\n requiredDependencies: ['stripe'],\n filePatterns: ['**/webhook*/**/*.ts', '**/api/webhook*/**/*.ts'],\n },\n detection: {\n artifactConditions: [\n {\n type: 'webhookHandler',\n conditions: {\n provider: 'stripe',\n missingIdempotency: true,\n },\n },\n ],\n },\n finding: {\n severity: 'P0',\n message: 'Stripe webhook handler missing idempotency check',\n requiredProof: 'Store processed event IDs and check before processing',\n suggestedTest: 'Sending the same event twice should only process once',\n references: ['https://stripe.com/docs/webhooks/best-practices#handle-duplicate-events'],\n tags: ['stripe', 'webhook', 'idempotency'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://stripe.com/docs/webhooks/best-practices'],\n },\n },\n\n // ============================================================================\n // Prisma Transaction Patterns\n // ============================================================================\n {\n id: 'prisma.transaction.email-inside',\n version: '1.0.0',\n invariantId: 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS',\n name: 'Email Sent Inside Prisma Transaction',\n description:\n 'Sending emails inside a transaction can lead to sent emails for rolled-back operations.',\n applicability: {\n frameworks: ['prisma'],\n requiredDependencies: ['@prisma/client'],\n filePatterns: ['**/*.ts'],\n },\n detection: {\n artifactConditions: [\n {\n type: 'transactionScope',\n conditions: {\n containsSideEffects: true,\n sideEffectTypes: ['email'],\n },\n },\n ],\n },\n finding: {\n severity: 'P0',\n message: 'Email side effect inside database transaction',\n requiredProof: 'Move email sending outside the transaction, after commit succeeds',\n suggestedTest:\n 'Simulate transaction rollback and verify no email was sent',\n references: [\n 'https://www.prisma.io/docs/concepts/components/prisma-client/transactions',\n ],\n tags: ['prisma', 'transaction', 'side-effect'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://www.prisma.io/docs/concepts/components/prisma-client/transactions'],\n },\n },\n {\n id: 'prisma.transaction.webhook-inside',\n version: '1.0.0',\n invariantId: 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS',\n name: 'External API Call Inside Prisma Transaction',\n description:\n 'Calling external APIs inside a transaction can trigger irreversible actions before commit.',\n applicability: {\n frameworks: ['prisma'],\n requiredDependencies: ['@prisma/client'],\n filePatterns: ['**/*.ts'],\n },\n detection: {\n artifactConditions: [\n {\n type: 'transactionScope',\n conditions: {\n containsSideEffects: true,\n sideEffectTypes: ['external_api', 'webhook'],\n },\n },\n ],\n },\n finding: {\n severity: 'P0',\n message: 'External API call inside database transaction',\n requiredProof: 'Move external API calls outside the transaction, after commit',\n suggestedTest: 'Simulate transaction rollback and verify no external call was made',\n references: [\n 'https://www.prisma.io/docs/concepts/components/prisma-client/transactions',\n ],\n tags: ['prisma', 'transaction', 'side-effect', 'api'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://www.prisma.io/docs/concepts/components/prisma-client/transactions'],\n },\n },\n\n // ============================================================================\n // Express Patterns\n // ============================================================================\n {\n id: 'express.route.no-auth-middleware',\n version: '1.0.0',\n invariantId: 'AUTHZ.SERVICE_LAYER.ENFORCED',\n name: 'Express Route Missing Auth Middleware',\n description:\n 'Express routes handling sensitive operations should use authentication middleware.',\n applicability: {\n frameworks: ['express'],\n requiredDependencies: ['express'],\n filePatterns: ['**/routes/**/*.ts', '**/router/**/*.ts', '**/api/**/*.ts'],\n },\n detection: {\n codePatterns: [\n {\n pattern: '/router\\\\.(post|put|delete|patch)\\\\s*\\\\(/',\n not: ['requireAuth', 'isAuthenticated', 'authenticate', 'authMiddleware', 'passport'],\n requiresNearby: {\n within: 5,\n not: ['requireAuth', 'isAuthenticated', 'authenticate', 'authMiddleware'],\n },\n },\n ],\n },\n finding: {\n severity: 'P1',\n message: 'Express route missing authentication middleware',\n requiredProof: 'Add authentication middleware before route handler',\n suggestedTest: 'Request without auth token should return 401',\n references: ['https://expressjs.com/en/guide/using-middleware.html'],\n tags: ['express', 'authz', 'middleware'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://expressjs.com/en/guide/using-middleware.html'],\n },\n },\n\n // ============================================================================\n // BullMQ Job Patterns\n // ============================================================================\n {\n id: 'bullmq.job.no-idempotency',\n version: '1.0.0',\n invariantId: 'JOBS.RETRY_SAFE',\n name: 'BullMQ Job Handler Missing Idempotency',\n description:\n 'BullMQ job handlers should be idempotent to safely handle retries.',\n applicability: {\n frameworks: ['bullmq'],\n requiredDependencies: ['bullmq'],\n filePatterns: ['**/jobs/**/*.ts', '**/workers/**/*.ts', '**/queues/**/*.ts'],\n },\n detection: {\n codePatterns: [\n {\n pattern: '/new\\\\s+Worker\\\\s*\\\\(/',\n not: ['idempotencyKey', 'processedJobs', 'alreadyProcessed', 'jobId'],\n context: {\n atFileLevel: true,\n },\n },\n ],\n },\n finding: {\n severity: 'P1',\n message: 'BullMQ worker may not be idempotent for retries',\n requiredProof: 'Track processed job IDs or use idempotency keys',\n suggestedTest: 'Running the same job twice should produce the same result',\n references: ['https://docs.bullmq.io/guide/retrying-failing-jobs'],\n tags: ['bullmq', 'jobs', 'idempotency'],\n },\n metadata: {\n author: 'SecurityChecks',\n created: '2026-01-09T00:00:00Z',\n references: ['https://docs.bullmq.io/guide/retrying-failing-jobs'],\n },\n },\n];\n\n/**\n * Check if dev patterns should be used.\n */\nexport function shouldUseDevPatterns(): boolean {\n return process.env['SECURITYCHECKS_DEV_PATTERNS'] === '1' ||\n process.env['SECURITYCHECKS_DEV_PATTERNS'] === 'true';\n}\n\n/**\n * Get test patterns filtered by frameworks.\n */\nexport function getTestPatternsForFrameworks(frameworks: string[]): PatternDefinition[] {\n if (frameworks.length === 0) {\n return TEST_PATTERNS;\n }\n\n const normalizedFrameworks = frameworks.map(f => f.toLowerCase());\n return TEST_PATTERNS.filter(pattern =>\n pattern.applicability.frameworks.some(f =>\n normalizedFrameworks.includes(f.toLowerCase())\n )\n );\n}\n","/**\n * Baseline and Waiver Schema Versions\n *\n * These versions are CLI-level (separate from collector artifact schema).\n * Bump these when the storage format changes.\n */\n\nexport const BASELINE_SCHEMA_VERSION = '1.0.0';\nexport const WAIVER_SCHEMA_VERSION = '1.1.0';\n\nexport const WAIVER_REASON_KEYS = [\n 'false_positive',\n 'acceptable_risk',\n 'will_fix_later',\n 'not_applicable',\n 'other',\n] as const;\n\nexport type WaiverReasonKey = typeof WAIVER_REASON_KEYS[number];\n\nexport function isValidWaiverReasonKey(value: string): value is WaiverReasonKey {\n return (WAIVER_REASON_KEYS as readonly string[]).includes(value);\n}\n\n// ============================================================================\n// Baseline Types\n// ============================================================================\n\n/**\n * A baseline entry represents a known finding that should not fail CI.\n * Baselines are used to adopt scheck incrementally on existing codebases.\n */\nexport interface BaselineEntry {\n /** Stable finding ID (invariantId:hash) */\n findingId: string;\n /** The invariant this finding belongs to */\n invariantId: string;\n /** File where the finding was detected */\n file: string;\n /** Symbol (function/class name) if available */\n symbol?: string;\n /** When this was first added to baseline */\n createdAt: string; // ISO date\n /** When this was last seen in a run */\n lastSeenAt: string; // ISO date\n /** Optional notes explaining why this is baselined */\n notes?: string;\n}\n\n/**\n * The baseline file format.\n */\nexport interface BaselineFile {\n /** Schema version for baseline file format */\n schemaVersion: string;\n /** CLI version that generated this file */\n toolVersion: string;\n /** Collector schema version used when generating findings */\n collectorSchemaVersion?: string;\n /** Tool identifier (e.g., \"@securitychecks/cli@0.1.0\") */\n generatedBy: string;\n /** When the baseline was last updated (UTC ISO date) */\n updatedAt: string;\n /** Baseline entries keyed by findingId for O(1) lookup */\n entries: Record<string, BaselineEntry>;\n}\n\n// ============================================================================\n// Waiver Types\n// ============================================================================\n\n/**\n * A waiver temporarily suppresses a finding.\n * Unlike baselines, waivers expire and require explicit justification.\n */\nexport interface WaiverEntry {\n /** Stable finding ID (invariantId:hash) */\n findingId: string;\n /** The invariant this waiver applies to */\n invariantId: string;\n /** File where the finding was detected */\n file: string;\n /** Symbol (function/class name) if available */\n symbol?: string;\n /** Structured waiver reason (optional; aligns with web UI) */\n reasonKey?: WaiverReasonKey;\n /** Why this is being waived (required) */\n reason: string;\n /** Who created the waiver */\n owner: string;\n /** When the waiver expires (ISO date) */\n expiresAt: string;\n /** When the waiver was created */\n createdAt: string; // ISO date\n}\n\n/**\n * The waiver file format.\n */\nexport interface WaiverFile {\n /** Schema version for waiver file format */\n schemaVersion: string;\n /** CLI version that generated this file */\n toolVersion: string;\n /** Tool identifier (e.g., \"@securitychecks/cli@0.1.0\") */\n generatedBy: string;\n /** When the waiver file was last updated (UTC ISO date) */\n updatedAt: string;\n /** Waiver entries keyed by findingId */\n entries: Record<string, WaiverEntry>;\n}\n\n// ============================================================================\n// Empty File Factories\n// ============================================================================\n\n/** Package identifier for generatedBy field */\nexport const CLI_PACKAGE_NAME = '@securitychecks/cli';\n\n/** Get the generatedBy string (package@version) */\nexport function getGeneratedBy(version: string): string {\n return `${CLI_PACKAGE_NAME}@${version}`;\n}\n\nexport function createEmptyBaseline(version: string = '0.0.0'): BaselineFile {\n return {\n schemaVersion: BASELINE_SCHEMA_VERSION,\n toolVersion: version,\n generatedBy: getGeneratedBy(version),\n updatedAt: new Date().toISOString(),\n entries: {},\n };\n}\n\nexport function createEmptyWaiverFile(version: string = '0.0.0'): WaiverFile {\n return {\n schemaVersion: WAIVER_SCHEMA_VERSION,\n toolVersion: version,\n generatedBy: getGeneratedBy(version),\n updatedAt: new Date().toISOString(),\n entries: {},\n };\n}\n","/**\n * Stable Finding ID Generation\n *\n * Generates deterministic, stable IDs for findings that survive:\n * - Re-runs\n * - Ordering changes\n * - Remediation/message tweaks\n * - Minor code refactors\n *\n * IDs are NOT stable across:\n * - Moving code to different files\n * - Renaming functions (these are legitimately different anchors)\n *\n * Format: `${invariantId}:${hash}` (e.g., WEBHOOK.IDEMPOTENT:9c31f0a2b4d1)\n */\n\nimport { createHash } from 'crypto';\nimport type { Finding } from '@securitychecks/collector';\n\n// ============================================================================\n// Identity Payload Extraction\n// ============================================================================\n\n/**\n * Invariant-specific anchor extractors.\n * Each returns additional identity fields beyond the base (invariantId + file + symbol).\n */\ntype AnchorExtractor = (finding: Finding) => Record<string, string>;\n\nconst ANCHOR_EXTRACTORS: Record<string, AnchorExtractor> = {\n // Webhook: include provider from context if available\n 'WEBHOOK.IDEMPOTENT': (finding) => {\n const context = finding.evidence[0]?.context ?? '';\n // Extract provider from context like \"stripe: handleStripeWebhook\"\n const providerMatch = context.match(/^(stripe|github|slack|svix|generic):/i);\n return {\n provider: providerMatch?.[1]?.toLowerCase() ?? '',\n };\n },\n\n // Transaction: include side effect type from message\n 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS': (finding) => {\n // Extract side effect type from message like \"contains email side effect\"\n const typeMatch = finding.message.match(/contains (\\w+) side effect/i);\n return {\n sideEffectType: typeMatch?.[1]?.toLowerCase() ?? '',\n };\n },\n\n // Membership revocation: include mutation type\n 'AUTHZ.MEMBERSHIP.REVOCATION.IMMEDIATE': (finding) => {\n const context = finding.evidence[0]?.context ?? '';\n // Extract mutation type from context\n const mutationMatch = context.match(/mutationType[:\\s]+(\\w+)/i);\n return {\n mutationType: mutationMatch?.[1]?.toLowerCase() ?? '',\n };\n },\n\n // Keys revocation: include entity type\n 'AUTHZ.KEYS.REVOCATION.IMMEDIATE': (finding) => {\n const context = finding.evidence[0]?.context ?? '';\n const entityMatch = context.match(/entity[:\\s]+(\\w+)/i);\n return {\n entity: entityMatch?.[1]?.toLowerCase() ?? '',\n };\n },\n};\n\n/**\n * Extract the identity payload for a finding.\n * This is what gets hashed to produce the findingId.\n */\nexport function extractIdentityPayload(finding: Finding): Record<string, string> {\n const primary = finding.evidence[0];\n\n // Base identity: invariantId + file + symbol\n const base: Record<string, string> = {\n invariantId: finding.invariantId.toLowerCase(),\n file: normalizePath(primary?.file ?? ''),\n symbol: (primary?.symbol ?? '').toLowerCase(),\n };\n\n // Add invariant-specific anchors\n const extractor = ANCHOR_EXTRACTORS[finding.invariantId];\n if (extractor) {\n const anchors = extractor(finding);\n Object.assign(base, anchors);\n }\n\n return base;\n}\n\n// ============================================================================\n// Path Normalization\n// ============================================================================\n\n/**\n * Normalize file path for consistent hashing.\n * - Use forward slashes\n * - Remove leading ./ or /\n * - Lowercase\n * - Trim whitespace\n */\nfunction normalizePath(path: string): string {\n return path\n .trim()\n .replace(/\\\\/g, '/') // Windows backslashes\n .replace(/^\\.\\//, '') // Leading ./\n .replace(/^\\//, '') // Leading /\n .toLowerCase();\n}\n\n// ============================================================================\n// Hash Generation\n// ============================================================================\n\n/**\n * Generate a short, stable hash from the identity payload.\n * Uses SHA-256 truncated to 12 hex characters.\n */\nfunction hashPayload(payload: Record<string, string>): string {\n // Sort keys for deterministic ordering\n const keys = Object.keys(payload).sort();\n const canonical = keys.map((k) => `${k}:${payload[k]}`).join('|');\n\n const hash = createHash('sha256').update(canonical).digest('hex');\n\n // Take first 12 characters for readability while maintaining uniqueness\n return hash.slice(0, 12);\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Generate a stable findingId for a finding.\n *\n * @example\n * const id = generateFindingId(finding);\n * // \"WEBHOOK.IDEMPOTENT:9c31f0a2b4d1\"\n */\nexport function generateFindingId(finding: Finding): string {\n const payload = extractIdentityPayload(finding);\n const hash = hashPayload(payload);\n return `${finding.invariantId}:${hash}`;\n}\n\n/**\n * Add findingId to a finding (mutates the finding).\n * Returns the same finding for chaining.\n */\nexport function attachFindingId<T extends Finding>(finding: T): T & { findingId: string } {\n const findingId = generateFindingId(finding);\n return Object.assign(finding, { findingId });\n}\n\n/**\n * Add findingIds to all findings in a list.\n */\nexport function attachFindingIds<T extends Finding>(findings: T[]): (T & { findingId: string })[] {\n return findings.map(attachFindingId);\n}\n\n// ============================================================================\n// Baseline/Waiver Types\n// ============================================================================\n\n/**\n * A baseline entry stores known findings that should not fail CI.\n */\nexport interface BaselineEntry {\n findingId: string;\n invariantId: string;\n file: string;\n symbol?: string;\n firstSeenAt: string; // ISO date\n lastSeenAt: string; // ISO date\n}\n\n/**\n * A waiver temporarily suppresses a finding.\n */\nexport interface WaiverEntry {\n findingId: string;\n invariantId: string;\n reasonKey?: string;\n reason: string;\n expiresAt: string; // ISO date\n createdBy: string;\n createdAt: string; // ISO date\n}\n\n/**\n * Convert a finding to a baseline entry.\n */\nexport function toBaselineEntry(finding: Finding & { findingId: string }): BaselineEntry {\n const now = new Date().toISOString();\n return {\n findingId: finding.findingId,\n invariantId: finding.invariantId,\n file: finding.evidence[0]?.file ?? '',\n symbol: finding.evidence[0]?.symbol,\n firstSeenAt: now,\n lastSeenAt: now,\n };\n}\n","/**\n * Baseline and Waiver Storage\n *\n * Handles loading, saving, and managing baseline/waiver files.\n * Files are stored in `.scheck/` directory.\n */\n\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport type { Finding } from '@securitychecks/collector';\nimport { generateFindingId } from '../findings/finding-id.js';\nimport {\n BASELINE_SCHEMA_VERSION,\n WAIVER_SCHEMA_VERSION,\n createEmptyBaseline,\n createEmptyWaiverFile,\n getGeneratedBy,\n type BaselineFile,\n type WaiverFile,\n type WaiverEntry,\n} from './schema.js';\n\n// Version injected at build time via tsup define\nconst CLI_VERSION: string = process.env['CLI_VERSION'] ?? '0.0.0-dev';\n\n// ============================================================================\n// File Paths\n// ============================================================================\n\nconst SCHECK_DIR = '.scheck';\nconst BASELINE_FILE = 'baseline.json';\nconst WAIVER_FILE = 'waivers.json';\n\nexport function getBaselinePath(rootPath: string): string {\n return join(rootPath, SCHECK_DIR, BASELINE_FILE);\n}\n\nexport function getWaiverPath(rootPath: string): string {\n return join(rootPath, SCHECK_DIR, WAIVER_FILE);\n}\n\n// ============================================================================\n// Baseline Storage\n// ============================================================================\n\n/**\n * Load the baseline file, creating an empty one if it doesn't exist.\n */\nexport async function loadBaseline(rootPath: string): Promise<BaselineFile> {\n const path = getBaselinePath(rootPath);\n\n if (!existsSync(path)) {\n return createEmptyBaseline(CLI_VERSION);\n }\n\n try {\n const content = await readFile(path, 'utf-8');\n const data = JSON.parse(content) as BaselineFile;\n\n // Migrate: add missing fields for older files\n if (!data.schemaVersion) {\n data.schemaVersion = BASELINE_SCHEMA_VERSION;\n }\n if (!data.toolVersion) {\n data.toolVersion = CLI_VERSION;\n }\n if (!data.generatedBy) {\n data.generatedBy = getGeneratedBy(CLI_VERSION);\n }\n\n return data;\n } catch {\n // Corrupted file, return empty baseline\n console.warn(`Warning: Could not parse baseline file at ${path}, using empty baseline`);\n return createEmptyBaseline(CLI_VERSION);\n }\n}\n\n/**\n * Save the baseline file with deterministic ordering.\n */\nexport async function saveBaseline(\n rootPath: string,\n baseline: BaselineFile,\n collectorSchemaVersion?: string\n): Promise<void> {\n const path = getBaselinePath(rootPath);\n\n // Ensure directory exists\n await mkdir(dirname(path), { recursive: true });\n\n // Update metadata\n baseline.updatedAt = new Date().toISOString();\n baseline.toolVersion = CLI_VERSION;\n baseline.generatedBy = getGeneratedBy(CLI_VERSION);\n if (collectorSchemaVersion) {\n baseline.collectorSchemaVersion = collectorSchemaVersion;\n }\n\n // Create deterministically ordered output (field order matters for diffs)\n // Using spread with explicit ordering to ensure consistent JSON output\n const orderedBaseline = {\n schemaVersion: baseline.schemaVersion,\n toolVersion: baseline.toolVersion,\n ...(baseline.collectorSchemaVersion ? { collectorSchemaVersion: baseline.collectorSchemaVersion } : {}),\n generatedBy: baseline.generatedBy,\n updatedAt: baseline.updatedAt,\n entries: sortEntriesByFindingId(baseline.entries),\n };\n\n // Write with 2-space indent and trailing newline\n await writeFile(path, JSON.stringify(orderedBaseline, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Sort entries by findingId for deterministic output.\n */\nfunction sortEntriesByFindingId<T extends { findingId: string }>(\n entries: Record<string, T>\n): Record<string, T> {\n const sorted: Record<string, T> = {};\n const keys = Object.keys(entries).sort();\n for (const key of keys) {\n sorted[key] = entries[key] as T;\n }\n return sorted;\n}\n\n/**\n * Add findings to the baseline.\n * Returns the number of new entries added.\n */\nexport function addToBaseline(\n baseline: BaselineFile,\n findings: Finding[],\n notes?: string\n): number {\n const now = new Date().toISOString();\n let added = 0;\n\n for (const finding of findings) {\n const findingId = generateFindingId(finding);\n\n if (!baseline.entries[findingId]) {\n baseline.entries[findingId] = {\n findingId,\n invariantId: finding.invariantId,\n file: finding.evidence[0]?.file ?? '',\n symbol: finding.evidence[0]?.symbol,\n createdAt: now,\n lastSeenAt: now,\n notes,\n };\n added++;\n } else {\n // Update lastSeenAt for existing entries\n baseline.entries[findingId].lastSeenAt = now;\n }\n }\n\n return added;\n}\n\n/**\n * Check if a finding is in the baseline.\n */\nexport function isInBaseline(baseline: BaselineFile, finding: Finding): boolean {\n const findingId = generateFindingId(finding);\n return findingId in baseline.entries;\n}\n\n/**\n * Remove stale entries that haven't been seen in a certain number of days.\n * Returns the number of entries removed.\n */\nexport function pruneBaseline(baseline: BaselineFile, staleDays: number = 90): number {\n const cutoff = new Date();\n cutoff.setDate(cutoff.getDate() - staleDays);\n const cutoffIso = cutoff.toISOString();\n\n let removed = 0;\n for (const [id, entry] of Object.entries(baseline.entries)) {\n if (entry.lastSeenAt < cutoffIso) {\n delete baseline.entries[id];\n removed++;\n }\n }\n\n return removed;\n}\n\n// ============================================================================\n// Waiver Storage\n// ============================================================================\n\n/**\n * Load the waiver file, creating an empty one if it doesn't exist.\n */\nexport async function loadWaivers(rootPath: string): Promise<WaiverFile> {\n const path = getWaiverPath(rootPath);\n\n if (!existsSync(path)) {\n return createEmptyWaiverFile(CLI_VERSION);\n }\n\n try {\n const content = await readFile(path, 'utf-8');\n const data = JSON.parse(content) as WaiverFile;\n\n // Migrate: add missing fields for older files\n if (!data.schemaVersion) {\n data.schemaVersion = WAIVER_SCHEMA_VERSION;\n }\n if (!data.toolVersion) {\n data.toolVersion = CLI_VERSION;\n }\n if (!data.generatedBy) {\n data.generatedBy = getGeneratedBy(CLI_VERSION);\n }\n\n return data;\n } catch {\n console.warn(`Warning: Could not parse waiver file at ${path}, using empty waivers`);\n return createEmptyWaiverFile(CLI_VERSION);\n }\n}\n\n/**\n * Save the waiver file with deterministic ordering.\n */\nexport async function saveWaivers(rootPath: string, waivers: WaiverFile): Promise<void> {\n const path = getWaiverPath(rootPath);\n\n await mkdir(dirname(path), { recursive: true });\n\n // Update metadata\n waivers.updatedAt = new Date().toISOString();\n waivers.toolVersion = CLI_VERSION;\n waivers.generatedBy = getGeneratedBy(CLI_VERSION);\n\n // Create deterministically ordered output (field order matters for diffs)\n const orderedWaivers = {\n schemaVersion: waivers.schemaVersion,\n toolVersion: waivers.toolVersion,\n generatedBy: waivers.generatedBy,\n updatedAt: waivers.updatedAt,\n entries: sortEntriesByFindingId(waivers.entries),\n };\n\n // Write with 2-space indent and trailing newline\n await writeFile(path, JSON.stringify(orderedWaivers, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Add a waiver for a finding.\n */\nexport function addWaiver(\n waivers: WaiverFile,\n finding: Finding,\n options: {\n reason: string;\n reasonKey?: WaiverEntry['reasonKey'];\n owner: string;\n expiresInDays: number;\n }\n): WaiverEntry {\n const now = new Date();\n const expiresAt = new Date(now);\n expiresAt.setDate(expiresAt.getDate() + options.expiresInDays);\n\n const findingId = generateFindingId(finding);\n\n const entry: WaiverEntry = {\n findingId,\n invariantId: finding.invariantId,\n file: finding.evidence[0]?.file ?? '',\n symbol: finding.evidence[0]?.symbol,\n reasonKey: options.reasonKey,\n reason: options.reason,\n owner: options.owner,\n expiresAt: expiresAt.toISOString(),\n createdAt: now.toISOString(),\n };\n\n waivers.entries[findingId] = entry;\n return entry;\n}\n\n/**\n * Check if a finding has a valid (non-expired) waiver.\n * Returns the waiver if valid, undefined if expired or not found.\n */\nexport function getValidWaiver(waivers: WaiverFile, finding: Finding): WaiverEntry | undefined {\n const findingId = generateFindingId(finding);\n const waiver = waivers.entries[findingId];\n\n if (!waiver) {\n return undefined;\n }\n\n // Check expiration\n const now = new Date();\n const expiresAt = new Date(waiver.expiresAt);\n\n if (expiresAt < now) {\n // Waiver has expired - behaves as if no waiver exists\n return undefined;\n }\n\n return waiver;\n}\n\n/**\n * Remove expired waivers from the file.\n * Returns the number of waivers removed.\n */\nexport function pruneExpiredWaivers(waivers: WaiverFile): number {\n const now = new Date().toISOString();\n let removed = 0;\n\n for (const [id, entry] of Object.entries(waivers.entries)) {\n if (entry.expiresAt < now) {\n delete waivers.entries[id];\n removed++;\n }\n }\n\n return removed;\n}\n\n/**\n * Get all waivers that are about to expire (within N days).\n */\nexport function getExpiringWaivers(waivers: WaiverFile, withinDays: number = 7): WaiverEntry[] {\n const now = new Date();\n const threshold = new Date(now);\n threshold.setDate(threshold.getDate() + withinDays);\n const thresholdIso = threshold.toISOString();\n\n return Object.values(waivers.entries).filter(\n (entry) => entry.expiresAt > now.toISOString() && entry.expiresAt <= thresholdIso\n );\n}\n","/**\n * Baseline and Waiver Matching\n *\n * Applies baselines and waivers to findings, categorizing them for CI decisions.\n */\n\nimport type { Finding, Severity } from '@securitychecks/collector';\nimport { generateFindingId } from '../findings/finding-id.js';\nimport { isInBaseline, getValidWaiver } from './storage.js';\nimport type { BaselineFile, WaiverFile, WaiverEntry } from './schema.js';\n\n// ============================================================================\n// Categorized Finding Types\n// ============================================================================\n\n/**\n * A finding with its baseline/waiver status resolved.\n */\nexport interface CategorizedFinding extends Finding {\n findingId: string;\n /** Whether this finding is in the baseline */\n isBaselined: boolean;\n /** Active waiver if present */\n waiver?: WaiverEntry;\n /** Whether this finding should fail CI */\n shouldFail: boolean;\n}\n\n/**\n * Result of categorizing findings.\n */\nexport interface CategorizationResult {\n /** All findings with status */\n all: CategorizedFinding[];\n /** New findings not in baseline (may fail CI) */\n new: CategorizedFinding[];\n /** Findings in baseline (won't fail CI) */\n baselined: CategorizedFinding[];\n /** Findings with active waivers (won't fail CI) */\n waived: CategorizedFinding[];\n /** Summary counts */\n counts: {\n total: number;\n new: number;\n baselined: number;\n waived: number;\n willFail: number;\n };\n}\n\n// ============================================================================\n// Categorization Logic\n// ============================================================================\n\n/**\n * Categorize findings against baseline and waivers.\n *\n * @param findings - Raw findings from checkers\n * @param baseline - Loaded baseline file\n * @param waivers - Loaded waiver file\n * @param failSeverities - Which severities should fail CI (default: P0, P1)\n */\nexport function categorizeFindings(\n findings: Finding[],\n baseline: BaselineFile,\n waivers: WaiverFile,\n failSeverities: Severity[] = ['P0', 'P1']\n): CategorizationResult {\n const categorized: CategorizedFinding[] = [];\n const newFindings: CategorizedFinding[] = [];\n const baselinedFindings: CategorizedFinding[] = [];\n const waivedFindings: CategorizedFinding[] = [];\n\n for (const finding of findings) {\n const findingId = generateFindingId(finding);\n const isBaselined = isInBaseline(baseline, finding);\n const waiver = getValidWaiver(waivers, finding);\n\n // Determine if this finding should fail CI\n const isFailSeverity = failSeverities.includes(finding.severity);\n const shouldFail = isFailSeverity && !isBaselined && !waiver;\n\n const categorizedFinding: CategorizedFinding = {\n ...finding,\n findingId,\n isBaselined,\n waiver,\n shouldFail,\n };\n\n categorized.push(categorizedFinding);\n\n if (waiver) {\n waivedFindings.push(categorizedFinding);\n } else if (isBaselined) {\n baselinedFindings.push(categorizedFinding);\n } else {\n newFindings.push(categorizedFinding);\n }\n }\n\n return {\n all: categorized,\n new: newFindings,\n baselined: baselinedFindings,\n waived: waivedFindings,\n counts: {\n total: categorized.length,\n new: newFindings.length,\n baselined: baselinedFindings.length,\n waived: waivedFindings.length,\n willFail: categorized.filter((f) => f.shouldFail).length,\n },\n };\n}\n\n/**\n * Determine CI exit status based on categorized findings.\n *\n * @returns 0 for success, 1 for failure\n */\nexport function getCIExitCode(result: CategorizationResult): number {\n return result.counts.willFail > 0 ? 1 : 0;\n}\n\n/**\n * Get a summary message for CI output.\n */\nexport function getCISummary(result: CategorizationResult): string {\n const { counts } = result;\n\n if (counts.total === 0) {\n return 'No findings detected.';\n }\n\n const parts: string[] = [];\n\n if (counts.willFail > 0) {\n parts.push(`${counts.willFail} new finding(s) require attention`);\n }\n\n if (counts.baselined > 0) {\n parts.push(`${counts.baselined} baselined`);\n }\n\n if (counts.waived > 0) {\n parts.push(`${counts.waived} waived`);\n }\n\n if (counts.willFail === 0) {\n parts.unshift('All findings are baselined or waived');\n }\n\n return parts.join(', ') + '.';\n}\n\n// ============================================================================\n// Collision Detection\n// ============================================================================\n\n/**\n * Detect and handle findingId collisions.\n * Returns findings with unique IDs (appending :a, :b, etc. if needed).\n *\n * This is a defensive measure - collisions should be extremely rare with\n * 12 hex chars of SHA-256, but we define the behavior explicitly.\n */\nexport function resolveCollisions(findings: Finding[]): (Finding & { findingId: string })[] {\n const seen = new Map<string, number>();\n const result: (Finding & { findingId: string })[] = [];\n\n for (const finding of findings) {\n let findingId = generateFindingId(finding);\n\n // Check for collision\n const count = seen.get(findingId) ?? 0;\n if (count > 0) {\n // Append suffix: :a, :b, :c, etc.\n const suffix = String.fromCharCode(96 + count); // a=97, so 96+1=a\n findingId = `${findingId}:${suffix}`;\n }\n seen.set(generateFindingId(finding), count + 1);\n\n result.push({\n ...finding,\n findingId,\n });\n }\n\n return result;\n}\n\n/**\n * Check if there are any findingId collisions in a set of findings.\n * Returns true if collisions exist.\n */\nexport function hasCollisions(findings: Finding[]): boolean {\n const ids = new Set<string>();\n\n for (const finding of findings) {\n const id = generateFindingId(finding);\n if (ids.has(id)) {\n return true;\n }\n ids.add(id);\n }\n\n return false;\n}\n","/**\n * SARIF (Static Analysis Results Interchange Format) output\n *\n * Converts SecurityChecks findings to SARIF format for integration with:\n * - GitHub Code Scanning\n * - VS Code SARIF Viewer\n * - Other security tools\n *\n * @see https://sarifweb.azurewebsites.net/\n */\n\nimport type { AuditResult, Finding } from '@securitychecks/collector';\nimport { getInvariantById } from '@securitychecks/collector';\nimport { generateFindingId } from '../findings/index.js';\n\n// SARIF 2.1.0 types (simplified)\ninterface SarifLog {\n $schema: string;\n version: string;\n runs: SarifRun[];\n}\n\ninterface SarifRun {\n tool: SarifTool;\n results: SarifResult[];\n invocations?: SarifInvocation[];\n}\n\ninterface SarifTool {\n driver: SarifDriver;\n}\n\ninterface SarifDriver {\n name: string;\n informationUri: string;\n version: string;\n rules: SarifRule[];\n}\n\ninterface SarifRule {\n id: string;\n name: string;\n shortDescription: { text: string };\n fullDescription?: { text: string };\n helpUri?: string;\n defaultConfiguration?: {\n level: 'error' | 'warning' | 'note' | 'none';\n };\n properties?: {\n tags?: string[];\n precision?: string;\n 'security-severity'?: string;\n };\n}\n\ninterface SarifResult {\n ruleId: string;\n ruleIndex: number;\n level: 'error' | 'warning' | 'note' | 'none';\n message: { text: string };\n locations?: SarifLocation[];\n fingerprints?: Record<string, string>;\n properties?: Record<string, unknown>;\n}\n\ninterface SarifLocation {\n physicalLocation?: {\n artifactLocation?: {\n uri: string;\n uriBaseId?: string;\n };\n region?: {\n startLine?: number;\n startColumn?: number;\n endLine?: number;\n endColumn?: number;\n };\n };\n}\n\ninterface SarifInvocation {\n executionSuccessful: boolean;\n endTimeUtc?: string;\n}\n\n/**\n * Map SecurityChecks severity to SARIF level\n */\nfunction severityToLevel(severity: string): 'error' | 'warning' | 'note' {\n switch (severity) {\n case 'P0':\n return 'error';\n case 'P1':\n return 'warning';\n case 'P2':\n default:\n return 'note';\n }\n}\n\n/**\n * Map SecurityChecks severity to SARIF security-severity score (0-10)\n * GitHub uses this for severity ordering\n */\nfunction severityToScore(severity: string): string {\n switch (severity) {\n case 'P0':\n return '9.0'; // Critical\n case 'P1':\n return '7.0'; // High\n case 'P2':\n default:\n return '4.0'; // Medium\n }\n}\n\n/**\n * Build SARIF rules from findings\n */\nfunction buildRules(findings: Finding[]): SarifRule[] {\n const seenIds = new Set<string>();\n const rules: SarifRule[] = [];\n\n for (const finding of findings) {\n if (seenIds.has(finding.invariantId)) continue;\n seenIds.add(finding.invariantId);\n\n const invariant = getInvariantById(finding.invariantId);\n\n rules.push({\n id: finding.invariantId,\n name: invariant?.name ?? finding.invariantId,\n shortDescription: {\n text: invariant?.description ?? finding.message,\n },\n fullDescription: invariant\n ? { text: `${invariant.description}\\n\\nRequired proof: ${invariant.requiredProof}` }\n : undefined,\n helpUri: `https://securitychecks.ai/docs/invariants/${finding.invariantId.toLowerCase().replace(/\\./g, '-')}`,\n defaultConfiguration: {\n level: severityToLevel(finding.severity),\n },\n properties: {\n tags: ['security', 'production-invariant'],\n precision: 'high',\n 'security-severity': severityToScore(finding.severity),\n },\n });\n }\n\n return rules;\n}\n\n/**\n * Convert a finding to a SARIF result\n */\nfunction findingToResult(finding: Finding, ruleIndex: number): SarifResult {\n const locations: SarifLocation[] = finding.evidence.map((ev) => ({\n physicalLocation: {\n artifactLocation: {\n uri: ev.file,\n uriBaseId: '%SRCROOT%',\n },\n region: {\n startLine: ev.line,\n startColumn: 1,\n },\n },\n }));\n\n return {\n ruleId: finding.invariantId,\n ruleIndex,\n level: severityToLevel(finding.severity),\n message: {\n text: finding.message,\n },\n locations,\n fingerprints: {\n scheckId: generateFindingId(finding),\n },\n properties: {\n severity: finding.severity,\n waived: finding.waived ?? false,\n },\n };\n}\n\n/**\n * Convert AuditResult to SARIF format\n */\nexport function toSarif(result: AuditResult, version: string): SarifLog {\n const findings = result.results.flatMap((r) => r.findings);\n const rules = buildRules(findings);\n\n // Build rule index map for ruleIndex references\n const ruleIndexMap = new Map<string, number>();\n rules.forEach((rule, index) => {\n ruleIndexMap.set(rule.id, index);\n });\n\n const results = findings.map((finding) =>\n findingToResult(finding, ruleIndexMap.get(finding.invariantId) ?? 0)\n );\n\n return {\n $schema: 'https://json.schemastore.org/sarif-2.1.0.json',\n version: '2.1.0',\n runs: [\n {\n tool: {\n driver: {\n name: 'securitychecks',\n informationUri: 'https://securitychecks.ai',\n version,\n rules,\n },\n },\n results,\n invocations: [\n {\n executionSuccessful: true,\n endTimeUtc: result.runAt,\n },\n ],\n },\n ],\n };\n}\n","/**\n * Finding Correlation Engine\n *\n * Correlates findings across invariants to detect compounding risks.\n * Multiple findings on the same code path often compound each other,\n * creating worse outcomes than the sum of their parts.\n *\n * Key concepts:\n * - Correlated findings: Multiple findings sharing a code path\n * - Compounding risk: Combined severity is higher than individual\n * - Attack path: Narrative of how findings chain together\n *\n * Example:\n * Route: POST /api/webhooks/stripe\n * ├── WEBHOOK.IDEMPOTENT: ✗ No idempotency check\n * ├── TRANSACTION.POST_COMMIT: ✗ Email inside transaction\n * └── Combined: If replayed, sends duplicate emails AND inconsistent DB\n */\n\nimport type {\n Finding,\n Severity,\n CheckResult,\n Artifact,\n} from '@securitychecks/collector';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CorrelatedFinding {\n /** The primary finding (highest severity) */\n primary: Finding;\n /** Related findings on the same code path */\n related: Finding[];\n /** Shared context between findings */\n sharedContext: SharedContext;\n /** How the findings compound each other */\n compoundingEffect: CompoundingEffect;\n /** Adjusted severity based on correlation */\n adjustedSeverity: Severity;\n /** Attack path narrative */\n attackPath?: AttackPath;\n}\n\nexport interface SharedContext {\n /** Common file */\n file?: string;\n /** Common function */\n functionName?: string;\n /** Common route (if applicable) */\n route?: string;\n /** Shared call chain */\n callChain?: string[];\n /** Number of findings in this correlation */\n findingCount: number;\n}\n\nexport interface CompoundingEffect {\n /** Description of how findings compound */\n description: string;\n /** Risk multiplier (1.0 = no change, 2.0 = double risk) */\n riskMultiplier: number;\n /** Signals explaining the compounding */\n signals: string[];\n}\n\nexport interface AttackPath {\n /** Title of the attack path */\n title: string;\n /** Step-by-step narrative */\n steps: AttackStep[];\n /** Overall exploitability */\n exploitability: 'easy' | 'medium' | 'hard';\n /** Impact level */\n impact: 'low' | 'medium' | 'high' | 'critical';\n /** Time window (if applicable) */\n timeWindow?: string;\n}\n\nexport interface AttackStep {\n /** Step number */\n step: number;\n /** Description of this step */\n description: string;\n /** Which finding enables this step */\n invariantId: string;\n /** File/line reference */\n location?: { file: string; line: number };\n}\n\nexport interface CorrelationResult {\n /** All correlated finding groups */\n correlations: CorrelatedFinding[];\n /** Statistics */\n stats: {\n totalFindings: number;\n correlatedFindings: number;\n correlationGroups: number;\n severityEscalations: number;\n };\n}\n\n// ============================================================================\n// Compounding Rules\n// ============================================================================\n\n/**\n * Rules for how finding combinations compound\n */\nconst COMPOUNDING_RULES: Array<{\n invariants: string[];\n effect: CompoundingEffect;\n attackPathTemplate?: Omit<AttackPath, 'steps'>;\n}> = [\n // Webhook + Transaction = Replay causes inconsistent state\n {\n invariants: ['WEBHOOK.IDEMPOTENT', 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS'],\n effect: {\n description: 'Webhook replay can cause duplicate side effects AND inconsistent database state',\n riskMultiplier: 2.0,\n signals: ['webhook_replay', 'transaction_side_effect', 'data_inconsistency'],\n },\n attackPathTemplate: {\n title: 'Webhook Replay Attack with Data Inconsistency',\n exploitability: 'easy',\n impact: 'high',\n timeWindow: 'Immediate - no time limit on replay',\n },\n },\n\n // No auth + No service auth = Complete bypass\n {\n invariants: ['AUTHZ.SERVICE_LAYER.ENFORCED', 'AUTHZ.MEMBERSHIP.REVOCATION.IMMEDIATE'],\n effect: {\n description: 'Missing service-layer auth combined with delayed revocation allows extended unauthorized access',\n riskMultiplier: 2.5,\n signals: ['auth_bypass', 'delayed_revocation', 'privilege_persistence'],\n },\n attackPathTemplate: {\n title: 'Extended Privilege Persistence',\n exploitability: 'medium',\n impact: 'critical',\n timeWindow: 'Until cache expires or session timeout',\n },\n },\n\n // Cache + Membership revocation = Stale permissions\n {\n invariants: ['CACHE.INVALIDATION.ON_AUTH_CHANGE', 'AUTHZ.MEMBERSHIP.REVOCATION.IMMEDIATE'],\n effect: {\n description: 'Membership change without cache invalidation allows continued access via stale cache',\n riskMultiplier: 2.0,\n signals: ['stale_cache', 'permission_leak', 'revocation_bypass'],\n },\n attackPathTemplate: {\n title: 'Stale Permission Cache Exploit',\n exploitability: 'medium',\n impact: 'high',\n timeWindow: 'Cache TTL (often 5-15 minutes)',\n },\n },\n\n // Transaction + Cache = Inconsistent read after rollback\n {\n invariants: ['TRANSACTION.POST_COMMIT.SIDE_EFFECTS', 'CACHE.INVALIDATION.ON_AUTH_CHANGE'],\n effect: {\n description: 'Side effect in transaction + missing cache invalidation can leave cache inconsistent after rollback',\n riskMultiplier: 1.5,\n signals: ['rollback_inconsistency', 'cache_stale', 'side_effect_mismatch'],\n },\n },\n\n // Billing + Auth = Free tier bypass\n {\n invariants: ['BILLING.SERVER_ENFORCED', 'AUTHZ.SERVICE_LAYER.ENFORCED'],\n effect: {\n description: 'Missing billing enforcement + auth gap allows access to paid features without payment',\n riskMultiplier: 2.0,\n signals: ['billing_bypass', 'feature_theft', 'revenue_loss'],\n },\n attackPathTemplate: {\n title: 'Billing Bypass via Auth Gap',\n exploitability: 'medium',\n impact: 'high',\n },\n },\n\n // Jobs + Transaction = Retry causes duplicate side effects\n {\n invariants: ['JOBS.RETRY_SAFE', 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS'],\n effect: {\n description: 'Non-idempotent job with side effects in transaction can cause duplicates on retry',\n riskMultiplier: 1.8,\n signals: ['job_retry', 'duplicate_side_effect', 'data_duplication'],\n },\n },\n\n // API Key + Cache = Revoked key still works\n {\n invariants: ['AUTHZ.KEYS.REVOCATION.IMMEDIATE', 'CACHE.INVALIDATION.ON_AUTH_CHANGE'],\n effect: {\n description: 'API key revocation without cache invalidation allows continued API access',\n riskMultiplier: 2.0,\n signals: ['key_still_valid', 'cache_bypass', 'api_access_leak'],\n },\n attackPathTemplate: {\n title: 'API Key Revocation Bypass',\n exploitability: 'easy',\n impact: 'high',\n timeWindow: 'Until cache expires',\n },\n },\n];\n\n// ============================================================================\n// Main Correlation Function\n// ============================================================================\n\n/**\n * Correlate findings to detect compounding risks\n */\nexport function correlateFindings(\n results: CheckResult[],\n artifact: Artifact\n): CorrelationResult {\n // Flatten all findings\n const allFindings = results.flatMap(r => r.findings);\n\n if (allFindings.length === 0) {\n return {\n correlations: [],\n stats: {\n totalFindings: 0,\n correlatedFindings: 0,\n correlationGroups: 0,\n severityEscalations: 0,\n },\n };\n }\n\n // Group findings by location\n const groups = groupFindingsByLocation(allFindings);\n\n // Find correlations\n const correlations: CorrelatedFinding[] = [];\n let severityEscalations = 0;\n\n for (const group of groups.values()) {\n if (group.length < 2) continue;\n\n // Check if this group matches any compounding rules\n const correlation = findCorrelation(group, artifact);\n if (correlation) {\n correlations.push(correlation);\n if (severityToNumber(correlation.adjustedSeverity) > severityToNumber(correlation.primary.severity)) {\n severityEscalations++;\n }\n }\n }\n\n // Count correlated findings\n const correlatedFindingIds = new Set<string>();\n for (const c of correlations) {\n correlatedFindingIds.add(findingId(c.primary));\n for (const r of c.related) {\n correlatedFindingIds.add(findingId(r));\n }\n }\n\n return {\n correlations,\n stats: {\n totalFindings: allFindings.length,\n correlatedFindings: correlatedFindingIds.size,\n correlationGroups: correlations.length,\n severityEscalations,\n },\n };\n}\n\n// ============================================================================\n// Grouping Logic\n// ============================================================================\n\n/**\n * Group findings by their location (file + function)\n */\nfunction groupFindingsByLocation(findings: Finding[]): Map<string, Finding[]> {\n const groups = new Map<string, Finding[]>();\n\n for (const finding of findings) {\n // Get location key from evidence\n const evidence = finding.evidence[0];\n if (!evidence) continue;\n\n const key = `${evidence.file}:${evidence.symbol ?? 'unknown'}`;\n\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(finding);\n }\n\n return groups;\n}\n\n/**\n * Find correlation for a group of findings\n */\nfunction findCorrelation(\n findings: Finding[],\n _artifact: Artifact\n): CorrelatedFinding | null {\n // Get invariant IDs in this group\n const invariantIds = new Set(findings.map(f => f.invariantId));\n\n // Find matching compounding rule\n let bestMatch: (typeof COMPOUNDING_RULES)[0] | null = null;\n let matchCount = 0;\n\n for (const rule of COMPOUNDING_RULES) {\n const matches = rule.invariants.filter(inv => invariantIds.has(inv));\n if (matches.length >= 2 && matches.length > matchCount) {\n bestMatch = rule;\n matchCount = matches.length;\n }\n }\n\n if (!bestMatch) {\n // No specific rule, but still correlate if multiple findings\n if (findings.length >= 2) {\n return createGenericCorrelation(findings);\n }\n return null;\n }\n\n // Find the matching findings\n const matchingFindings = findings.filter(f =>\n bestMatch!.invariants.includes(f.invariantId)\n );\n\n // Sort by severity (P0 first)\n matchingFindings.sort((a, b) =>\n severityToNumber(b.severity) - severityToNumber(a.severity)\n );\n\n const primary = matchingFindings[0]!;\n const related = matchingFindings.slice(1);\n\n // Build shared context\n const evidence = primary.evidence[0];\n const sharedContext: SharedContext = {\n file: evidence?.file,\n functionName: evidence?.symbol,\n findingCount: matchingFindings.length,\n };\n\n // Calculate adjusted severity\n const adjustedSeverity = calculateAdjustedSeverity(\n primary.severity,\n bestMatch.effect.riskMultiplier\n );\n\n // Build attack path if template exists\n let attackPath: AttackPath | undefined;\n if (bestMatch.attackPathTemplate) {\n attackPath = buildAttackPath(\n bestMatch.attackPathTemplate,\n matchingFindings\n );\n }\n\n return {\n primary,\n related,\n sharedContext,\n compoundingEffect: bestMatch.effect,\n adjustedSeverity,\n attackPath,\n };\n}\n\n/**\n * Create a generic correlation for findings without specific rules\n */\nfunction createGenericCorrelation(findings: Finding[]): CorrelatedFinding {\n // Sort by severity\n findings.sort((a, b) =>\n severityToNumber(b.severity) - severityToNumber(a.severity)\n );\n\n const primary = findings[0]!;\n const related = findings.slice(1);\n const evidence = primary.evidence[0];\n\n return {\n primary,\n related,\n sharedContext: {\n file: evidence?.file,\n functionName: evidence?.symbol,\n findingCount: findings.length,\n },\n compoundingEffect: {\n description: `Multiple security issues in the same location (${findings.length} findings)`,\n riskMultiplier: 1.0 + (findings.length - 1) * 0.2,\n signals: findings.map(f => f.invariantId),\n },\n adjustedSeverity: primary.severity,\n };\n}\n\n// ============================================================================\n// Attack Path Builder\n// ============================================================================\n\n/**\n * Build an attack path from a template and findings\n */\nfunction buildAttackPath(\n template: Omit<AttackPath, 'steps'>,\n findings: Finding[]\n): AttackPath {\n const steps: AttackStep[] = [];\n\n for (let i = 0; i < findings.length; i++) {\n const finding = findings[i]!;\n const evidence = finding.evidence[0];\n\n steps.push({\n step: i + 1,\n description: getAttackStepDescription(finding),\n invariantId: finding.invariantId,\n location: evidence ? { file: evidence.file, line: evidence.line } : undefined,\n });\n }\n\n return {\n ...template,\n steps,\n };\n}\n\n/**\n * Get a description for an attack step based on the finding\n */\nfunction getAttackStepDescription(finding: Finding): string {\n const invariant = finding.invariantId;\n\n switch (invariant) {\n case 'WEBHOOK.IDEMPOTENT':\n return 'Attacker replays webhook request (no idempotency protection)';\n case 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS':\n return 'Side effect fires inside transaction (may be duplicated or inconsistent)';\n case 'AUTHZ.SERVICE_LAYER.ENFORCED':\n return 'Service function called without authorization check';\n case 'AUTHZ.MEMBERSHIP.REVOCATION.IMMEDIATE':\n return 'Membership/role change does not immediately revoke access';\n case 'AUTHZ.KEYS.REVOCATION.IMMEDIATE':\n return 'API key revocation does not immediately invalidate the key';\n case 'CACHE.INVALIDATION.ON_AUTH_CHANGE':\n return 'Auth change does not invalidate cached permissions';\n case 'BILLING.SERVER_ENFORCED':\n return 'Billing/entitlement check bypassed or missing';\n case 'JOBS.RETRY_SAFE':\n return 'Background job is not idempotent (retry causes duplicates)';\n default:\n return finding.message;\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction severityToNumber(severity: Severity): number {\n switch (severity) {\n case 'P0': return 3;\n case 'P1': return 2;\n case 'P2': return 1;\n default: return 0;\n }\n}\n\nfunction numberToSeverity(num: number): Severity {\n if (num >= 3) return 'P0';\n if (num >= 2) return 'P1';\n return 'P2';\n}\n\nfunction calculateAdjustedSeverity(\n baseSeverity: Severity,\n multiplier: number\n): Severity {\n const base = severityToNumber(baseSeverity);\n const adjusted = Math.min(3, Math.ceil(base * multiplier));\n return numberToSeverity(adjusted);\n}\n\nfunction findingId(finding: Finding): string {\n const evidence = finding.evidence[0];\n return `${finding.invariantId}:${evidence?.file ?? 'unknown'}:${evidence?.line ?? 0}`;\n}\n\n// ============================================================================\n// Formatters\n// ============================================================================\n\n/**\n * Format a correlated finding for display\n */\nexport function formatCorrelatedFinding(correlation: CorrelatedFinding): string {\n const lines: string[] = [];\n\n // Header\n const location = correlation.sharedContext.file\n ? `${correlation.sharedContext.file}:${correlation.sharedContext.functionName ?? 'unknown'}`\n : 'Unknown location';\n\n lines.push(`\\n┌─ CORRELATED FINDINGS ─ ${location}`);\n lines.push(`│`);\n\n // Primary finding\n lines.push(`│ [${correlation.adjustedSeverity}] ${correlation.primary.message}`);\n lines.push(`│ └─ ${correlation.primary.invariantId}`);\n\n // Related findings\n for (const related of correlation.related) {\n lines.push(`│ [${related.severity}] ${related.message}`);\n lines.push(`│ └─ ${related.invariantId}`);\n }\n\n lines.push(`│`);\n\n // Compounding effect\n lines.push(`│ ⚠ Compounding Effect:`);\n lines.push(`│ ${correlation.compoundingEffect.description}`);\n lines.push(`│ Risk multiplier: ${correlation.compoundingEffect.riskMultiplier}x`);\n\n // Attack path (if available)\n if (correlation.attackPath) {\n lines.push(`│`);\n lines.push(`│ 🎯 Attack Path: ${correlation.attackPath.title}`);\n lines.push(`│ Exploitability: ${correlation.attackPath.exploitability}`);\n lines.push(`│ Impact: ${correlation.attackPath.impact}`);\n if (correlation.attackPath.timeWindow) {\n lines.push(`│ Time window: ${correlation.attackPath.timeWindow}`);\n }\n lines.push(`│`);\n for (const step of correlation.attackPath.steps) {\n lines.push(`│ ${step.step}. ${step.description}`);\n }\n }\n\n lines.push(`└────────────────────────────────────────`);\n\n return lines.join('\\n');\n}\n\n/**\n * Format correlation statistics\n */\nexport function formatCorrelationStats(result: CorrelationResult): string {\n const { stats } = result;\n\n return `\nCorrelation Analysis:\n Total findings: ${stats.totalFindings}\n Correlated: ${stats.correlatedFindings} (${Math.round(stats.correlatedFindings / stats.totalFindings * 100)}%)\n Correlation groups: ${stats.correlationGroups}\n Severity escalations: ${stats.severityEscalations}\n`.trim();\n}\n\nexport default correlateFindings;\n","/**\n * Correlation Telemetry\n *\n * Reports correlation data to the SecurityChecks SaaS.\n * This builds the data moat around which invariant combinations\n * actually compound risk in production codebases.\n */\n\nimport type { CorrelationResult, CorrelatedFinding } from './correlation.js';\nimport { randomUUID } from 'crypto';\n\n// Default endpoint (can be overridden)\nconst DEFAULT_ENDPOINT = 'https://api.securitychecks.ai/v1/correlations';\n\nexport interface CorrelationTelemetryConfig {\n enabled: boolean;\n endpoint?: string;\n apiKey?: string;\n timeout?: number;\n}\n\ninterface CorrelationObservation {\n invariants: string[];\n context: {\n framework?: string;\n file?: string;\n functionName?: string;\n route?: string;\n };\n stats: {\n findingCount: number;\n severityBefore?: 'P0' | 'P1' | 'P2';\n severityAfter?: 'P0' | 'P1' | 'P2';\n wasEscalated: boolean;\n riskMultiplier?: number;\n };\n attackPath?: {\n title: string;\n exploitability: 'easy' | 'medium' | 'hard';\n impact: 'low' | 'medium' | 'high' | 'critical';\n timeWindow?: string;\n steps: Array<{\n step: number;\n description: string;\n invariantId: string;\n location?: { file: string; line: number };\n }>;\n };\n compoundingEffect?: {\n description: string;\n signals: string[];\n };\n meta: {\n clientVersion: string;\n requestId: string;\n timestamp: string;\n };\n}\n\n/**\n * Convert CorrelatedFinding to observation format for API\n */\nfunction toObservation(\n correlation: CorrelatedFinding,\n framework?: string\n): CorrelationObservation {\n const allFindings = [correlation.primary, ...correlation.related];\n const invariants = [...new Set(allFindings.map(f => f.invariantId))];\n\n return {\n invariants,\n context: {\n framework,\n file: correlation.sharedContext.file,\n functionName: correlation.sharedContext.functionName,\n route: correlation.sharedContext.route,\n },\n stats: {\n findingCount: correlation.sharedContext.findingCount,\n severityBefore: correlation.primary.severity,\n severityAfter: correlation.adjustedSeverity,\n wasEscalated: correlation.adjustedSeverity !== correlation.primary.severity,\n riskMultiplier: correlation.compoundingEffect.riskMultiplier,\n },\n attackPath: correlation.attackPath ? {\n title: correlation.attackPath.title,\n exploitability: correlation.attackPath.exploitability,\n impact: correlation.attackPath.impact,\n timeWindow: correlation.attackPath.timeWindow,\n steps: correlation.attackPath.steps,\n } : undefined,\n compoundingEffect: {\n description: correlation.compoundingEffect.description,\n signals: correlation.compoundingEffect.signals,\n },\n meta: {\n clientVersion: process.env['CLI_VERSION'] ?? '0.0.0',\n requestId: randomUUID(),\n timestamp: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Report correlation results to the SaaS\n */\nexport async function reportCorrelations(\n result: CorrelationResult,\n config: CorrelationTelemetryConfig,\n framework?: string\n): Promise<{ success: boolean; stored?: number; errors?: number }> {\n if (!config.enabled || result.correlations.length === 0) {\n return { success: true, stored: 0 };\n }\n\n const endpoint = config.endpoint ?? DEFAULT_ENDPOINT;\n const timeout = config.timeout ?? 5000;\n\n try {\n const observations = result.correlations.map(c => toObservation(c, framework));\n\n const payload = {\n correlations: observations,\n summary: result.stats,\n meta: {\n clientVersion: process.env['CLI_VERSION'] ?? '0.0.0',\n framework,\n },\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.apiKey && { Authorization: `Bearer ${config.apiKey}` }),\n 'X-Client-Version': process.env['CLI_VERSION'] ?? '0.0.0',\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return { success: false };\n }\n\n const data = await response.json() as { stored?: number; errors?: number };\n return {\n success: true,\n stored: data.stored ?? observations.length,\n errors: data.errors ?? 0,\n };\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (_error) {\n // Telemetry failures shouldn't break the CLI\n return { success: false };\n }\n}\n\n/**\n * Report feedback on a correlation (user marking as accurate/inaccurate)\n */\nexport async function reportCorrelationFeedback(\n requestId: string,\n wasAccurate: boolean,\n reason?: string,\n config?: CorrelationTelemetryConfig\n): Promise<boolean> {\n const endpoint = config?.endpoint ?? DEFAULT_ENDPOINT;\n\n try {\n const response = await fetch(endpoint, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.apiKey && { Authorization: `Bearer ${config.apiKey}` }),\n },\n body: JSON.stringify({\n requestId,\n wasAccurate,\n feedbackReason: reason,\n }),\n });\n\n return response.ok;\n } catch {\n return false;\n }\n}\n\nexport default reportCorrelations;\n","/**\n * Anonymous Telemetry\n *\n * Reports aggregate scan statistics to the SecurityChecks SaaS.\n * NO source code, NO file paths, NO PII - just patterns and numbers.\n *\n * This data powers:\n * - Framework-specific calibration\n * - Pattern effectiveness tracking\n * - Invariant impact analysis\n */\n\nimport { randomUUID } from 'crypto';\nimport type { AuditResult } from '@securitychecks/collector';\nimport type { CorrelationResult } from './correlation.js';\nimport { isValidWaiverReasonKey } from '../baseline/index.js';\nimport type { CategorizationResult } from '../baseline/index.js';\n\n// Default endpoint\nconst DEFAULT_ENDPOINT = 'https://api.securitychecks.ai/v1/telemetry';\n\nexport interface TelemetryConfig {\n enabled: boolean;\n endpoint?: string;\n apiKey?: string;\n timeout?: number;\n}\n\nexport interface ScanTelemetry {\n scanId: string;\n codebase: {\n filesScanned: number;\n servicesCount: number;\n linesOfCode?: number;\n };\n frameworks: string[];\n findings: {\n byInvariant: Record<string, number>;\n byPriority: { P0: number; P1: number; P2: number };\n total: number;\n };\n correlation?: {\n groups: number;\n escalations: number;\n correlatedFindings: number;\n };\n calibration?: {\n calibrated: number;\n suppressed: number;\n };\n patterns?: {\n applied: number;\n findings: number;\n };\n meta: {\n duration?: number;\n clientVersion: string;\n mode?: 'ci' | 'manual' | 'watch';\n ciProvider?: string;\n };\n baseline?: {\n size: number;\n waivers: number;\n newFindings: number;\n };\n feedback?: {\n waivedCount: number;\n waiverReasons: Record<string, number>;\n baselinedCount: number;\n };\n}\n\n/**\n * Build telemetry data from scan results\n */\nexport function buildTelemetry(\n result: AuditResult,\n options: {\n filesScanned: number;\n frameworks: string[];\n correlation?: CorrelationResult;\n categorization?: CategorizationResult;\n calibratedCount?: number;\n suppressedCount?: number;\n patternsApplied?: number;\n patternFindings?: number;\n mode?: 'ci' | 'manual' | 'watch';\n baselineSize?: number;\n waiversCount?: number;\n }\n): ScanTelemetry {\n // Count findings by invariant\n const byInvariant: Record<string, number> = {};\n for (const checkResult of result.results) {\n byInvariant[checkResult.invariantId] = checkResult.findings.length;\n }\n\n // Detect CI provider from environment\n const ciProvider = detectCIProvider();\n\n return {\n scanId: randomUUID(),\n codebase: {\n filesScanned: options.filesScanned,\n servicesCount: result.artifact.services.length,\n },\n frameworks: options.frameworks,\n findings: {\n byInvariant,\n byPriority: result.summary.byPriority,\n total: result.summary.byPriority.P0 + result.summary.byPriority.P1 + result.summary.byPriority.P2,\n },\n correlation: options.correlation ? {\n groups: options.correlation.stats.correlationGroups,\n escalations: options.correlation.stats.severityEscalations,\n correlatedFindings: options.correlation.stats.correlatedFindings,\n } : undefined,\n calibration: (options.calibratedCount !== undefined) ? {\n calibrated: options.calibratedCount,\n suppressed: options.suppressedCount ?? 0,\n } : undefined,\n patterns: (options.patternsApplied !== undefined) ? {\n applied: options.patternsApplied,\n findings: options.patternFindings ?? 0,\n } : undefined,\n meta: {\n duration: result.duration,\n clientVersion: process.env['CLI_VERSION'] ?? '0.0.0',\n mode: options.mode ?? (ciProvider ? 'ci' : 'manual'),\n ciProvider,\n },\n baseline: (options.categorization) ? {\n size: options.baselineSize ?? 0,\n waivers: options.waiversCount ?? 0,\n newFindings: options.categorization.counts.new,\n } : undefined,\n feedback: (options.categorization) ? {\n waivedCount: options.categorization.counts.waived,\n waiverReasons: buildWaiverReasonCounts(options.categorization),\n baselinedCount: options.categorization.counts.baselined,\n } : undefined,\n };\n}\n\n/**\n * Report telemetry to the SaaS\n */\nexport async function reportTelemetry(\n telemetry: ScanTelemetry,\n config: TelemetryConfig\n): Promise<boolean> {\n if (!config.enabled) {\n return true;\n }\n\n const endpoint = config.endpoint ?? DEFAULT_ENDPOINT;\n const timeout = config.timeout ?? 5000;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.apiKey && { Authorization: `Bearer ${config.apiKey}` }),\n 'X-Client-Version': telemetry.meta.clientVersion,\n },\n body: JSON.stringify(telemetry),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n return response.ok;\n } finally {\n clearTimeout(timeoutId);\n }\n } catch {\n // Telemetry failures are silent\n return false;\n }\n}\n\n/**\n * Build waiver reason distribution from categorization result\n */\nfunction buildWaiverReasonCounts(categorization: CategorizationResult): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const finding of categorization.waived) {\n const waiver = finding.waiver;\n if (!waiver) continue;\n const candidate = waiver.reasonKey ?? waiver.reason;\n const key = candidate && isValidWaiverReasonKey(candidate) ? candidate : 'other';\n counts[key] = (counts[key] ?? 0) + 1;\n }\n return counts;\n}\n\n/**\n * Detect CI provider from environment variables\n */\nfunction detectCIProvider(): string | undefined {\n if (process.env['GITHUB_ACTIONS']) return 'github';\n if (process.env['GITLAB_CI']) return 'gitlab';\n if (process.env['JENKINS_URL']) return 'jenkins';\n if (process.env['CIRCLECI']) return 'circleci';\n if (process.env['TRAVIS']) return 'travis';\n if (process.env['BITBUCKET_BUILD_NUMBER']) return 'bitbucket';\n if (process.env['AZURE_PIPELINES']) return 'azure';\n if (process.env['CI']) return 'unknown';\n return undefined;\n}\n\n/**\n * Check if telemetry is opt-out\n */\nexport function isTelemetryDisabled(): boolean {\n return (\n process.env['SECURITYCHECKS_TELEMETRY'] === 'false' ||\n process.env['DO_NOT_TRACK'] === '1'\n );\n}\n\nexport default reportTelemetry;\n","/**\n * Cloud Configuration Management\n *\n * Manages CLI configuration for cloud integration with SecurityChecks.ai\n * Configuration is stored in ~/.securitychecks/config.json\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n/** Configuration directory path */\nconst CONFIG_DIR = join(homedir(), '.securitychecks');\n\n/** Configuration file path */\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.json');\n\n/** Cloud API base URL */\nconst DEFAULT_API_URL = 'https://api.securitychecks.ai';\n\nexport function normalizeApiBaseUrl(input: string): string {\n const value = input.trim();\n if (!value) {\n throw new Error('API URL is empty');\n }\n\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(`Invalid API URL: ${input}`);\n }\n\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw new Error('API URL must start with http:// or https://');\n }\n\n if (url.username || url.password) {\n throw new Error('API URL must not include credentials');\n }\n\n url.hash = '';\n url.search = '';\n\n // Accept both base URLs and v1-style aliases, normalize to a base.\n // Examples:\n // - https://api.securitychecks.ai/v1 -> https://api.securitychecks.ai\n // - https://example.com/api/v1 -> https://example.com\n const pathname = url.pathname.replace(/\\/+$/, '');\n const stripped = pathname\n .replace(/\\/api\\/v1$/i, '')\n .replace(/\\/v1$/i, '');\n url.pathname = stripped.length === 0 ? '/' : `${stripped}/`;\n\n // Remove trailing slash (keep origin+path stable).\n return url.toString().replace(/\\/$/, '');\n}\n\n/**\n * Cloud configuration structure\n */\nexport interface CloudConfig {\n /** API key for authentication */\n apiKey?: string;\n\n /** Default project slug */\n project?: string;\n\n /** API base URL (for self-hosted instances) */\n apiUrl?: string;\n\n /** Enable cloud mode by default */\n cloudEnabled?: boolean;\n\n /** User email (for display purposes) */\n email?: string;\n\n /** Organization name (for display purposes) */\n organization?: string;\n\n /** Last sync timestamp */\n lastSync?: string;\n\n /** Suppress periodic usage awareness banner */\n usageBannerDisabled?: boolean;\n}\n\n/**\n * Ensure configuration directory exists\n */\nasync function ensureConfigDir(): Promise<void> {\n if (!existsSync(CONFIG_DIR)) {\n await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n/**\n * Load cloud configuration from disk\n */\nexport async function loadCloudConfig(): Promise<CloudConfig> {\n try {\n if (!existsSync(CONFIG_FILE)) {\n return {};\n }\n const content = await readFile(CONFIG_FILE, 'utf-8');\n return JSON.parse(content) as CloudConfig;\n } catch {\n return {};\n }\n}\n\n/**\n * Save cloud configuration to disk\n */\nexport async function saveCloudConfig(config: CloudConfig): Promise<void> {\n await ensureConfigDir();\n await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), { encoding: 'utf-8', mode: 0o600 });\n}\n\n/**\n * Update specific configuration values\n */\nexport async function updateCloudConfig(\n updates: Partial<CloudConfig>\n): Promise<CloudConfig> {\n const config = await loadCloudConfig();\n const updated = { ...config, ...updates };\n await saveCloudConfig(updated);\n return updated;\n}\n\n/**\n * Clear cloud configuration\n */\nexport async function clearCloudConfig(): Promise<void> {\n await saveCloudConfig({});\n}\n\n/**\n * Get the effective API key (from config, env, or CLI option)\n */\nexport function getApiKey(cliOption?: string): string | undefined {\n // CLI option takes precedence\n if (cliOption) return cliOption;\n\n // Then environment variable\n const envKey = process.env['SECURITYCHECKS_API_KEY'];\n if (envKey) return envKey;\n\n // Config is loaded async, so this needs to be called after loading config\n return undefined;\n}\n\n/**\n * Get the effective project slug (from config, env, or CLI option)\n */\nexport function getProject(cliOption?: string): string | undefined {\n if (cliOption) return cliOption;\n return process.env['SECURITYCHECKS_PROJECT'];\n}\n\n/**\n * Get the API base URL\n */\nexport function getApiUrl(config: CloudConfig): string {\n const raw = config.apiUrl || process.env['SECURITYCHECKS_API_URL'] || DEFAULT_API_URL;\n return normalizeApiBaseUrl(raw);\n}\n\n/**\n * Check if cloud mode is enabled\n */\nexport function isCloudEnabled(\n config: CloudConfig,\n cliOption?: boolean\n): boolean {\n if (cliOption !== undefined) return cliOption;\n if (process.env['SECURITYCHECKS_CLOUD'] === 'true') return true;\n return config.cloudEnabled ?? false;\n}\n\n/**\n * Format configuration for display\n */\nexport function formatConfig(config: CloudConfig): string {\n const lines: string[] = [];\n\n lines.push('Cloud Configuration:');\n lines.push('');\n\n if (config.apiKey) {\n const masked = config.apiKey.substring(0, 10) + '...' + config.apiKey.slice(-4);\n lines.push(` API Key: ${masked}`);\n } else {\n lines.push(' API Key: (not set)');\n }\n\n lines.push(` Project: ${config.project || '(not set)'}`);\n lines.push(` API URL: ${config.apiUrl || DEFAULT_API_URL}`);\n lines.push(` Cloud Mode: ${config.cloudEnabled ? 'enabled' : 'disabled'}`);\n\n if (config.email) {\n lines.push(` Email: ${config.email}`);\n }\n\n if (config.organization) {\n lines.push(` Organization: ${config.organization}`);\n }\n\n if (config.lastSync) {\n lines.push(` Last Sync: ${config.lastSync}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Validate API key format\n */\nexport function isValidApiKey(key: string): boolean {\n // API keys should start with sc_live_ or sc_test_\n return /^sc_(live|test)_[a-zA-Z0-9]{20,}$/.test(key);\n}\n\nexport { CONFIG_DIR, CONFIG_FILE, DEFAULT_API_URL };\n","/**\n * Cloud Access (Thinware)\n *\n * Local scans always run. Cloud features require an API key.\n */\n\nimport { normalizeApiBaseUrl } from './cloud-config.js';\n\nconst CLOUD_API_KEY_ENV_VARS = [\n 'SECURITYCHECKS_API_KEY',\n 'SECURITYCHECKS_LICENSE_KEY',\n];\n\nconst DEFAULT_CLOUD_BASE_URL = 'https://api.securitychecks.ai';\n\nexport function getCloudApiKey(): string | undefined {\n for (const envVar of CLOUD_API_KEY_ENV_VARS) {\n const value = process.env[envVar];\n if (value) {\n return value;\n }\n }\n return undefined;\n}\n\nexport function formatCloudStatus(apiKey?: string): string {\n if (apiKey) {\n return 'local + cloud (API key detected)';\n }\n return 'local-only (cloud features require SECURITYCHECKS_API_KEY)';\n}\n\nexport function getCloudApiBaseUrl(): string {\n const raw = process.env['SECURITYCHECKS_API_URL'] ?? DEFAULT_CLOUD_BASE_URL;\n return normalizeApiBaseUrl(raw);\n}\n\nexport function getCloudEndpoints(baseUrl?: string): {\n patterns: string;\n calibrate: string;\n telemetry: string;\n correlations: string;\n aggregateCalibration: string;\n} {\n const base = baseUrl ?? getCloudApiBaseUrl();\n return {\n patterns: `${base}/v1/patterns`,\n calibrate: `${base}/v1/calibrate`,\n telemetry: `${base}/v1/telemetry`,\n correlations: `${base}/v1/correlations`,\n aggregateCalibration: `${base}/v1/calibration`,\n };\n}\n","/**\n * Simple file watcher for watch mode\n *\n * Uses Node.js fs.watch with recursive watching where supported (macOS, Windows)\n * Falls back to polling on Linux\n */\n\nimport { watch, statSync, readdirSync } from 'node:fs';\nimport { join, extname } from 'node:path';\nimport { EventEmitter } from 'node:events';\n\nconst DEBOUNCE_MS = 500;\nconst POLL_INTERVAL_MS = 1000;\n\n// File extensions to watch\nconst WATCH_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mts', '.cts']);\n\n// Directories to ignore\nconst IGNORE_DIRS = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n '.next',\n 'coverage',\n '.securitychecks',\n '.scheck',\n]);\n\ninterface WatcherOptions {\n targetPath: string;\n onChanged: () => Promise<void>;\n verbose?: boolean;\n}\n\nexport class FileWatcher extends EventEmitter {\n private targetPath: string;\n private onChanged: () => Promise<void>;\n private verbose: boolean;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private isRunning = false;\n private watchers: ReturnType<typeof watch>[] = [];\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private lastModTimes = new Map<string, number>();\n\n constructor(options: WatcherOptions) {\n super();\n this.targetPath = options.targetPath;\n this.onChanged = options.onChanged;\n this.verbose = options.verbose ?? false;\n }\n\n /**\n * Start watching for file changes\n */\n start(): void {\n // Try recursive watching first (works on macOS, Windows)\n try {\n const watcher = watch(\n this.targetPath,\n { recursive: true },\n (eventType, filename) => {\n if (filename && this.shouldTrigger(filename)) {\n this.scheduleRun(filename);\n }\n }\n );\n\n watcher.on('error', (error) => {\n if (this.verbose) {\n console.error('Watch error:', error.message);\n }\n // Fall back to polling\n this.stopWatchers();\n this.startPolling();\n });\n\n this.watchers.push(watcher);\n\n if (this.verbose) {\n console.log('File watcher started (recursive mode)');\n }\n } catch {\n // Recursive watching not supported, use polling\n this.startPolling();\n }\n }\n\n /**\n * Start polling-based watching (fallback for Linux)\n */\n private startPolling(): void {\n if (this.verbose) {\n console.log('File watcher started (polling mode)');\n }\n\n // Initial scan\n this.scanFiles(this.targetPath);\n\n this.pollTimer = setInterval(() => {\n const changed = this.checkForChanges(this.targetPath);\n if (changed) {\n this.scheduleRun(changed);\n }\n }, POLL_INTERVAL_MS);\n }\n\n /**\n * Scan directory recursively and record modification times\n */\n private scanFiles(dir: string): void {\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (IGNORE_DIRS.has(entry.name)) continue;\n\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n this.scanFiles(fullPath);\n } else if (entry.isFile() && WATCH_EXTENSIONS.has(extname(entry.name))) {\n try {\n const stat = statSync(fullPath);\n this.lastModTimes.set(fullPath, stat.mtimeMs);\n } catch {\n // File may have been deleted\n }\n }\n }\n } catch {\n // Directory may not exist or be readable\n }\n }\n\n /**\n * Check for file changes\n */\n private checkForChanges(dir: string): string | null {\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (IGNORE_DIRS.has(entry.name)) continue;\n\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n const changed = this.checkForChanges(fullPath);\n if (changed) return changed;\n } else if (entry.isFile() && WATCH_EXTENSIONS.has(extname(entry.name))) {\n try {\n const stat = statSync(fullPath);\n const lastMod = this.lastModTimes.get(fullPath);\n\n if (!lastMod || stat.mtimeMs > lastMod) {\n this.lastModTimes.set(fullPath, stat.mtimeMs);\n if (lastMod) return fullPath; // Only trigger on actual changes, not initial scan\n }\n } catch {\n // File may have been deleted\n }\n }\n }\n } catch {\n // Directory may not exist\n }\n\n return null;\n }\n\n /**\n * Check if a file change should trigger a re-run\n */\n private shouldTrigger(filename: string): boolean {\n // Check extension\n const ext = extname(filename);\n if (!WATCH_EXTENSIONS.has(ext)) return false;\n\n // Check for ignored directories in path\n const parts = filename.split(/[/\\\\]/);\n for (const part of parts) {\n if (IGNORE_DIRS.has(part)) return false;\n }\n\n return true;\n }\n\n /**\n * Schedule a run with debouncing\n */\n private scheduleRun(filename: string): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(async () => {\n if (this.isRunning) return;\n\n this.isRunning = true;\n this.emit('change', filename);\n\n try {\n await this.onChanged();\n } catch {\n // Error handled by callback\n } finally {\n this.isRunning = false;\n }\n }, DEBOUNCE_MS);\n }\n\n /**\n * Stop watching\n */\n stop(): void {\n this.stopWatchers();\n\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n }\n\n private stopWatchers(): void {\n for (const watcher of this.watchers) {\n watcher.close();\n }\n this.watchers = [];\n }\n}\n","/**\n * CI Environment Detection\n *\n * Detects CI/CD environment and extracts relevant context\n * (branch, commit SHA, PR number) for proper scan association.\n */\n\nimport { readFileSync } from 'node:fs';\n\nexport interface CIContext {\n /** CI provider name */\n provider: 'github-actions' | 'gitlab-ci' | 'circleci' | 'jenkins' | 'unknown';\n /** Git branch name */\n branch?: string;\n /** Git commit SHA */\n commitSha?: string;\n /** Pull/Merge request number */\n prNumber?: number;\n /** Repository name (owner/repo) */\n repository?: string;\n /** Whether this is a PR/MR event */\n isPullRequest: boolean;\n}\n\n/**\n * Detect CI environment and extract context\n */\nexport function detectCIContext(): CIContext | null {\n // GitHub Actions\n if (process.env['GITHUB_ACTIONS'] === 'true') {\n return detectGitHubActions();\n }\n\n // GitLab CI\n if (process.env['GITLAB_CI'] === 'true') {\n return detectGitLabCI();\n }\n\n // CircleCI\n if (process.env['CIRCLECI'] === 'true') {\n return detectCircleCI();\n }\n\n // Jenkins\n if (process.env['JENKINS_URL']) {\n return detectJenkins();\n }\n\n // Not in CI\n return null;\n}\n\n/**\n * Detect GitHub Actions context\n */\nfunction detectGitHubActions(): CIContext {\n const eventName = process.env['GITHUB_EVENT_NAME'];\n const isPullRequest = eventName === 'pull_request' || eventName === 'pull_request_target';\n const eventPayload = readGitHubEventPayload();\n\n // For PRs, use the head branch; for pushes, parse from GITHUB_REF\n let branch: string | undefined;\n if (isPullRequest) {\n branch = eventPayload?.pull_request?.head?.ref || process.env['GITHUB_HEAD_REF'];\n } else {\n const ref = process.env['GITHUB_REF'] || '';\n // refs/heads/main -> main\n branch = ref.replace(/^refs\\/heads\\//, '');\n }\n\n // In GitHub pull_request workflows, GITHUB_SHA is often the synthetic merge commit.\n // Prefer payload head SHA so we can associate scans to webhook-created PR scans/check-runs.\n const commitSha = isPullRequest\n ? eventPayload?.pull_request?.head?.sha || process.env['GITHUB_SHA']\n : process.env['GITHUB_SHA'];\n\n // Prefer payload PR number, then fallback to refs/pull/<n>/merge parsing.\n let prNumber: number | undefined;\n if (isPullRequest) {\n prNumber = eventPayload?.number;\n if (!prNumber) {\n const prRef = process.env['GITHUB_REF'] || '';\n const match = prRef.match(/refs\\/pull\\/(\\d+)/);\n if (match && match[1]) {\n prNumber = parseInt(match[1], 10);\n }\n }\n }\n\n return {\n provider: 'github-actions',\n branch,\n commitSha,\n prNumber,\n repository: process.env['GITHUB_REPOSITORY'],\n isPullRequest,\n };\n}\n\ninterface GitHubPullRequestPayload {\n number?: number;\n pull_request?: {\n head?: {\n sha?: string;\n ref?: string;\n };\n };\n}\n\nfunction readGitHubEventPayload(): GitHubPullRequestPayload | null {\n const eventPath = process.env['GITHUB_EVENT_PATH'];\n if (!eventPath) {\n return null;\n }\n\n try {\n const raw = readFileSync(eventPath, 'utf8');\n return JSON.parse(raw) as GitHubPullRequestPayload;\n } catch {\n return null;\n }\n}\n\n/**\n * Detect GitLab CI context\n */\nfunction detectGitLabCI(): CIContext {\n const mrIid = process.env['CI_MERGE_REQUEST_IID'];\n const isPullRequest = !!mrIid;\n\n let prNumber: number | undefined;\n if (mrIid) {\n prNumber = parseInt(mrIid, 10);\n }\n\n return {\n provider: 'gitlab-ci',\n branch: process.env['CI_COMMIT_REF_NAME'],\n commitSha: process.env['CI_COMMIT_SHA'],\n prNumber,\n repository: process.env['CI_PROJECT_PATH'],\n isPullRequest,\n };\n}\n\n/**\n * Detect CircleCI context\n */\nfunction detectCircleCI(): CIContext {\n let prNumber: number | undefined;\n const prUrl = process.env['CIRCLE_PULL_REQUEST'];\n if (prUrl) {\n const match = prUrl.match(/\\/pull\\/(\\d+)/);\n if (match && match[1]) {\n prNumber = parseInt(match[1], 10);\n }\n }\n\n return {\n provider: 'circleci',\n branch: process.env['CIRCLE_BRANCH'],\n commitSha: process.env['CIRCLE_SHA1'],\n prNumber,\n repository: `${process.env['CIRCLE_PROJECT_USERNAME']}/${process.env['CIRCLE_PROJECT_REPONAME']}`,\n isPullRequest: !!prUrl,\n };\n}\n\n/**\n * Detect Jenkins context\n */\nfunction detectJenkins(): CIContext {\n const changeId = process.env['CHANGE_ID'];\n const isPullRequest = !!changeId;\n\n let prNumber: number | undefined;\n if (changeId) {\n prNumber = parseInt(changeId, 10);\n }\n\n return {\n provider: 'jenkins',\n branch: process.env['BRANCH_NAME'] || process.env['GIT_BRANCH'],\n commitSha: process.env['GIT_COMMIT'],\n prNumber,\n isPullRequest,\n };\n}\n","/**\n * Cloud Evaluation Client\n *\n * Sends artifacts to the cloud API for async server-side evaluation.\n * Artifacts are stored in R2 and processed by Fly.io workers.\n *\n * Architecture:\n * 1. CLI collects artifact locally (code never leaves)\n * 2. Artifact sent to /api/v1/evaluate, stored in R2\n * 3. Server queues QStash job for Fly.io worker\n * 4. CLI polls /api/v1/scans/{id} until complete\n * 5. Findings returned to CLI for display\n */\n\nimport type { CollectorArtifact, Finding } from '@securitychecks/collector';\nimport { CLIError, ErrorCodes } from './errors.js';\nimport { detectCIContext, type CIContext } from './ci-detect.js';\nimport { gzipSync } from 'node:zlib';\n\n// Re-export for convenience\nexport { detectCIContext, type CIContext } from './ci-detect.js';\n\n/**\n * Build request headers with optional Vercel deployment protection bypass.\n * Set VERCEL_AUTOMATION_BYPASS_SECRET env var to bypass Vercel deployment protection\n * on preview deployments.\n */\nfunction buildHeaders(extra: Record<string, string> = {}): Record<string, string> {\n const headers: Record<string, string> = { ...extra };\n const bypassSecret = process.env['VERCEL_AUTOMATION_BYPASS_SECRET'];\n if (bypassSecret) {\n headers['x-vercel-protection-bypass'] = bypassSecret;\n }\n return headers;\n}\n\nfunction isTruthy(value: string | undefined): boolean {\n if (!value) return false;\n return value === '1' || value.toLowerCase() === 'true' || value.toLowerCase() === 'yes';\n}\n\nexport interface CloudEvaluateOptions {\n /** API key for authentication */\n apiKey: string;\n /** Cloud API base URL */\n baseUrl: string;\n /** Specific invariants to run (default: all) */\n invariants?: string[];\n /** Invariants to skip */\n skip?: string[];\n /** Minimum severity to return */\n severity?: 'P0' | 'P1' | 'P2';\n /** Project slug for scan association */\n projectSlug?: string;\n /** Timeout in ms (default: 300000 = 5 min) */\n timeout?: number;\n /** Poll interval in ms (default: 2000 = 2s) */\n pollInterval?: number;\n /** Progress callback */\n onProgress?: EvaluationProgressCallback;\n /** CI context (auto-detected if not provided) */\n ciContext?: CIContext | null;\n}\n\nexport interface CloudEvaluateResult {\n findings: Finding[];\n stats: {\n invariantsRun: number;\n patternsRun: number;\n findingsCount: number;\n executionMs: number;\n };\n usage: {\n scansUsed: number;\n scansRemaining: number;\n };\n}\n\nexport interface CloudEvaluateError {\n error: string;\n details?: unknown;\n usage?: {\n scansUsed: number;\n scansRemaining: number;\n };\n}\n\n/** Scan status from API */\nexport type ScanStatus = 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED' | 'CANCELLED';\n\n/** Progress callback for evaluation */\nexport type EvaluationProgressCallback = (info: {\n status: ScanStatus;\n message?: string;\n}) => void;\n\n/** Response from submit endpoint */\ninterface SubmitResult {\n scanId: string;\n status: ScanStatus;\n pollUrl: string;\n usage?: {\n scansUsed: number;\n scansRemaining: number;\n };\n}\n\n/** Response from scan status endpoint */\ninterface ScanStatusResult {\n id: string;\n status: ScanStatus;\n findings?: Finding[];\n stats?: {\n invariantsRun: number;\n patternsRun: number;\n findingsCount: number;\n executionMs: number;\n };\n usage?: {\n scansUsed: number;\n scansRemaining: number;\n };\n errorMessage?: string;\n}\n\n/**\n * Check if cloud evaluation is available\n */\nexport function isCloudEvalAvailable(apiKey?: string): boolean {\n return !!apiKey;\n}\n\n/**\n * Build the artifact payload for cloud evaluation\n */\nfunction buildEvaluatePayload(artifact: CollectorArtifact, options: CloudEvaluateOptions) {\n // Auto-detect CI context if not provided\n const ciContext = options.ciContext !== undefined ? options.ciContext : detectCIContext();\n\n return {\n artifact: {\n version: artifact.version,\n schemaVersion: artifact.schemaVersion,\n profile: artifact.profile,\n extractedAt: artifact.extractedAt,\n targetPath: artifact.codebase?.root,\n codebase: {\n file_count: artifact.codebase?.filesScanned ?? 0,\n languages: artifact.codebase?.languages ?? [],\n },\n services: artifact.services,\n authzCalls: artifact.authzCalls ?? [],\n cacheOperations: artifact.cacheOperations ?? [],\n transactionScopes: artifact.transactionScopes ?? [],\n webhookHandlers: artifact.webhookHandlers ?? [],\n jobHandlers: artifact.jobHandlers ?? [],\n membershipMutations: artifact.membershipMutations ?? [],\n tests: artifact.tests ?? [],\n routes: artifact.routes ?? [],\n callGraph: artifact.callGraph,\n dataFlow: artifact.dataFlows?.flows ?? [],\n rlsPolicies: artifact.rlsArtifact?.rlsPolicies ?? [],\n },\n options: {\n invariants: options.invariants,\n skip: options.skip,\n severity: options.severity,\n projectSlug: options.projectSlug,\n // CI context for scan association (enables PR comments)\n branch: ciContext?.branch,\n commitSha: ciContext?.commitSha,\n prNumber: ciContext?.prNumber,\n // Opt-in guard for GitHub PR CI mode to enforce webhook + evaluate env alignment.\n // This is intentionally gated to avoid breaking standalone CLI workflows that do not use GitHub App webhooks.\n requireExistingCiScan:\n ciContext?.provider === 'github-actions' &&\n ciContext?.isPullRequest &&\n isTruthy(process.env['SECURITYCHECKS_REQUIRE_EXISTING_CI_SCAN'])\n ? true\n : undefined,\n },\n };\n}\n\n/**\n * Submit artifact for async evaluation\n * Returns scan ID for polling\n */\nasync function submitForEvaluation(\n artifact: CollectorArtifact,\n options: CloudEvaluateOptions\n): Promise<SubmitResult> {\n const endpoint = `${options.baseUrl}/api/v1/evaluate`;\n const payload = buildEvaluatePayload(artifact, options);\n const json = JSON.stringify(payload);\n const gz = gzipSync(Buffer.from(json, 'utf8'));\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: buildHeaders({\n 'Content-Type': 'application/json',\n 'Content-Encoding': 'gzip',\n Authorization: `Bearer ${options.apiKey}`,\n }),\n body: gz,\n });\n\n if (!response.ok) {\n const errorBody = (await response.json().catch(() => ({}))) as CloudEvaluateError;\n const serverMessage = (errorBody as any)?.message as string | undefined;\n const errorText = serverMessage\n ? `${errorBody.error || 'Cloud API error'}: ${serverMessage}`\n : errorBody.error;\n\n if (response.status === 401) {\n throw new CLIError(ErrorCodes.CLOUD_AUTH_FAILED, 'Invalid API key. Check your SECURITYCHECKS_API_KEY.');\n }\n\n if (response.status === 413) {\n throw new CLIError(\n ErrorCodes.CLOUD_API_ERROR,\n `Artifact too large. ${errorBody.details || 'Contact support if this persists.'}`,\n { details: errorBody.details }\n );\n }\n\n if (response.status === 429) {\n const remaining = errorBody.usage?.scansRemaining ?? 0;\n throw new CLIError(\n ErrorCodes.CLOUD_RATE_LIMITED,\n `Monthly scan limit reached (${remaining} remaining). Upgrade at https://securitychecks.ai/pricing`,\n { details: { scansRemaining: remaining } }\n );\n }\n\n if (response.status === 503) {\n throw new CLIError(ErrorCodes.CLOUD_API_ERROR, 'Cloud evaluation temporarily unavailable. Try again later.');\n }\n\n throw new CLIError(\n ErrorCodes.CLOUD_API_ERROR,\n errorText || `Cloud API error: ${response.status}`,\n { details: errorBody }\n );\n }\n\n return (await response.json()) as SubmitResult;\n}\n\n/**\n * Poll for evaluation results\n * Blocks until scan completes, fails, or times out\n */\nasync function pollForResults(\n scanId: string,\n options: CloudEvaluateOptions\n): Promise<CloudEvaluateResult> {\n const timeout = options.timeout ?? 300000; // 5 min default\n const pollInterval = options.pollInterval ?? 2000; // 2s default\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n const response = await fetch(`${options.baseUrl}/api/v1/scans/${scanId}`, {\n method: 'GET',\n headers: buildHeaders({\n Authorization: `Bearer ${options.apiKey}`,\n }),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new CLIError(ErrorCodes.CLOUD_NOT_FOUND, `Scan ${scanId} not found`);\n }\n throw new CLIError(ErrorCodes.CLOUD_API_ERROR, `Failed to get scan status: ${response.status}`);\n }\n\n const scan = (await response.json()) as ScanStatusResult;\n\n // Report progress\n options.onProgress?.({\n status: scan.status,\n message: scan.status === 'RUNNING' ? 'Evaluating...' : undefined,\n });\n\n if (scan.status === 'COMPLETED') {\n return {\n findings: scan.findings ?? [],\n stats: scan.stats ?? {\n invariantsRun: 0,\n patternsRun: 0,\n findingsCount: scan.findings?.length ?? 0,\n executionMs: Date.now() - startTime,\n },\n usage: scan.usage ?? { scansUsed: 0, scansRemaining: 0 },\n };\n }\n\n if (scan.status === 'FAILED') {\n throw new CLIError(\n ErrorCodes.CLOUD_API_ERROR,\n `Scan failed: ${scan.errorMessage ?? 'Unknown error'}`,\n { details: { scanId, errorMessage: scan.errorMessage } }\n );\n }\n\n if (scan.status === 'CANCELLED') {\n throw new CLIError(ErrorCodes.CLOUD_API_ERROR, 'Scan was cancelled', { details: { scanId } });\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new CLIError(\n ErrorCodes.CHECK_TIMEOUT,\n `Scan timed out after ${timeout / 1000}s. Check dashboard for results.`,\n { details: { timeoutMs: timeout, scanId } }\n );\n}\n\n/**\n * Evaluate artifact via cloud API (async with polling)\n *\n * @param artifact The artifact to evaluate\n * @param options Evaluation options\n * @throws Error if evaluation fails or times out\n */\nexport async function evaluateCloud(\n artifact: CollectorArtifact,\n options: CloudEvaluateOptions\n): Promise<CloudEvaluateResult> {\n // Submit artifact for evaluation\n const { scanId } = await submitForEvaluation(artifact, options);\n\n // Report initial status\n options.onProgress?.({\n status: 'PENDING',\n message: 'Submitted for evaluation...',\n });\n\n // Poll for results\n return pollForResults(scanId, options);\n}\n\n/**\n * Check cloud API health\n */\nexport async function checkCloudHealth(baseUrl: string): Promise<boolean> {\n try {\n const response = await fetch(`${baseUrl}/api/health`, {\n method: 'GET',\n headers: buildHeaders(),\n signal: AbortSignal.timeout(5000),\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Get available invariants from cloud API\n */\nexport async function getCloudInvariants(\n baseUrl: string,\n apiKey: string\n): Promise<Array<{ id: string; name: string; description: string; severity: string }>> {\n const response = await fetch(`${baseUrl}/api/v1/evaluate`, {\n method: 'GET',\n headers: buildHeaders({\n Authorization: `Bearer ${apiKey}`,\n }),\n });\n\n if (!response.ok) {\n throw new CLIError(ErrorCodes.CLOUD_API_ERROR, `Failed to fetch invariants: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n invariants: Array<{ id: string; name: string; description: string; severity: string }>;\n };\n return data.invariants;\n}\n","type Env = Record<string, string | undefined>;\n\nexport function getProjectSlug(env: Env = process.env): string | undefined {\n const raw = env['SECURITYCHECKS_PROJECT'];\n const trimmed = raw?.trim();\n return trimmed ? trimmed : undefined;\n}\n","/**\n * Staff Engineer Templates\n *\n * Shared, stable UX helpers used by:\n * - CLI output (human-readable prompts)\n * - MCP adapters (Claude Code, etc.)\n *\n * Keep these centralized to avoid drift across integration surfaces.\n */\n\nexport type TestFramework = 'jest' | 'vitest' | 'playwright' | (string & {});\n\nexport type InvariantLike = {\n id: string;\n name: string;\n requiredProof?: string;\n};\n\n/**\n * Returns the \"A staff engineer would ask...\" question for each invariant.\n * These are the probing questions that senior engineers ask in code review.\n */\nexport function getStaffQuestion(invariantId: string): string | null {\n const questions: Record<string, string> = {\n 'AUTHZ.SERVICE_LAYER.ENFORCED':\n 'What happens when a background job calls this function directly, bypassing the route?',\n 'AUTHZ.MEMBERSHIP.REVOCATION.IMMEDIATE':\n 'If I remove someone from a team right now, can they still access team resources?',\n 'AUTHZ.KEYS.REVOCATION.IMMEDIATE':\n 'If I revoke this API key, does it stop working immediately or is it cached?',\n 'WEBHOOK.IDEMPOTENT':\n 'What happens when Stripe retries this webhook? Will we double-charge the customer?',\n 'WEBHOOK.SIGNATURE.VERIFIED':\n 'Are we verifying webhook signatures before processing any side effects?',\n 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS':\n 'If this transaction rolls back, did we already send an email the user will never receive?',\n 'TESTS.NO_FALSE_CONFIDENCE':\n 'Is this test actually verifying behavior, or just making CI green?',\n 'CACHE.INVALIDATION.ON_AUTH_CHANGE':\n 'When someone loses access, how long until the cache catches up?',\n 'JOBS.RETRY_SAFE':\n 'If this job runs twice, will we have duplicate data or double-bill someone?',\n 'BILLING.SERVER_ENFORCED':\n 'Can someone bypass the paywall by calling the API directly?',\n 'ANALYTICS.SCHEMA.STABLE':\n 'If someone adds a field here, will it break our dashboards?',\n 'DATAFLOW.UNTRUSTED.SQL_QUERY':\n 'Can untrusted input reach a raw SQL/NoSQL query without strict validation?',\n 'DATAFLOW.UNTRUSTED.COMMAND_EXEC':\n 'Can user input make it into exec/spawn/eval and change what runs?',\n 'DATAFLOW.UNTRUSTED.FILE_ACCESS':\n 'Can user input control file paths or write locations here?',\n 'DATAFLOW.UNTRUSTED.RESPONSE':\n 'Can user input drive redirects or HTML output without sanitization?',\n 'SECRETS.HARDCODED':\n 'If this repo were accidentally made public, what credentials would be exposed?',\n 'CRYPTO.ALGORITHM.STRONG':\n 'Is this encryption strong enough for the data it protects?',\n };\n return questions[invariantId] ?? null;\n}\n\nexport function generateTestSkeleton(\n invariant: InvariantLike | null | undefined,\n framework: TestFramework,\n context?: string\n): string {\n if (!invariant) return 'Unknown invariant';\n\n const testFn = framework === 'jest' ? 'test' : framework === 'playwright' ? 'test' : 'it';\n const describe = framework === 'playwright' ? '' : 'describe';\n\n const wrap = (body: string) => {\n if (framework === 'playwright') {\n return body.trim();\n }\n return `\n${describe}('${escapeString(invariant.name)}', () => {\n${indent(body.trim(), 2)}\n});\n`.trim();\n };\n\n switch (invariant.id) {\n case 'AUTHZ.SERVICE_LAYER.ENFORCED':\n return wrap(`\n${testFn}('denies access without valid authorization', async () => {\n // Arrange: create context without auth\n const unauthorizedContext = { userId: null, tenantId: null };\n\n // Act + Assert: service call should throw (or return a forbidden result)\n await expect(\n yourService.sensitiveOperation({ context: unauthorizedContext })\n ).rejects.toThrow(/unauthorized|forbidden/i);\n});\n\n${testFn}('denies access to wrong-tenant resources', async () => {\n // Arrange: user from tenant-1 trying to access tenant-2 resource\n const context = { userId: 'user-1', tenantId: 'tenant-1' };\n const resourceFromOtherTenant = { id: 'resource-1', tenantId: 'tenant-2' };\n\n // Act + Assert\n await expect(\n yourService.getResource({ context, resourceId: resourceFromOtherTenant.id })\n ).rejects.toThrow(/forbidden|access denied/i);\n});\n`);\n\n case 'AUTHZ.MEMBERSHIP.REVOCATION.IMMEDIATE':\n return wrap(`\n${testFn}('denies access immediately after membership removal', async () => {\n // Arrange: user with team membership\n const userId = 'user-1';\n const teamId = 'team-1';\n await addMemberToTeam(userId, teamId);\n\n // Act: remove membership\n await removeMemberFromTeam(userId, teamId);\n\n // Assert: immediate access denial (no TTL grace period)\n await expect(accessTeamResource({ userId, teamId })).rejects.toThrow(/forbidden|not a member/i);\n});\n`);\n\n case 'WEBHOOK.IDEMPOTENT':\n return wrap(`\n${testFn}('handles duplicate webhook events idempotently', async () => {\n // Arrange: create a webhook event\n const event = { id: 'evt_test_123', type: 'payment.succeeded', data: { amount: 1000 } };\n\n // Act: process the same event twice\n await processWebhook(event);\n await processWebhook(event); // duplicate\n\n // Assert: side effect only happened once\n const payments = await getPaymentRecords();\n expect(payments.filter((p: any) => p.eventId === event.id)).toHaveLength(1);\n});\n\n${testFn}('stores event IDs to prevent duplicates', async () => {\n const event = { id: 'evt_test_456', type: 'payment.succeeded' };\n\n await processWebhook(event);\n\n // Verify idempotency key was stored\n const stored = await getProcessedEventIds();\n expect(stored).toContain(event.id);\n});\n`);\n\n case 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS':\n return wrap(`\n${testFn}('does not send side effects if transaction rolls back', async () => {\n const emailSpy = vi.spyOn(emailService, 'send');\n\n // Act: trigger action that should fail and rollback\n await expect(createOrderWithInvalidData({ /* invalid data causing rollback */ })).rejects.toThrow();\n\n // Assert: no email was sent\n expect(emailSpy).not.toHaveBeenCalled();\n});\n\n${testFn}('sends side effects only after successful commit', async () => {\n const emailSpy = vi.spyOn(emailService, 'send');\n\n // Act: successful order creation\n await createOrder({ productId: 'prod-1', quantity: 1 });\n\n // Assert: email was sent\n expect(emailSpy).toHaveBeenCalledOnce();\n});\n`);\n\n default: {\n const proof = invariant.requiredProof ? invariant.requiredProof : '(see invariant docs)';\n const contextLine = context ? `// Context: ${context}` : '';\n return wrap(`\n${testFn}('enforces ${invariant.id}', async () => {\n // TODO: implement test for ${invariant.id}\n // Required proof: ${proof}\n ${contextLine}\n\n throw new Error('Test not implemented');\n});\n`);\n }\n }\n}\n\nfunction indent(text: string, spaces: number): string {\n const prefix = ' '.repeat(spaces);\n return text\n .split('\\n')\n .map((line) => (line ? `${prefix}${line}` : line))\n .join('\\n');\n}\n\nfunction escapeString(text: string): string {\n return text.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\n","import pc from 'picocolors';\n\nexport type Grade = 'A' | 'B' | 'C' | 'F';\n\nexport interface ReadinessScore {\n score: number;\n grade: Grade;\n total: number;\n passed: number;\n failed: number;\n hasP0: boolean;\n}\n\nexport function getScoreGrade(score: number): Grade {\n if (score >= 90) return 'A';\n if (score >= 70) return 'B';\n if (score >= 50) return 'C';\n return 'F';\n}\n\nexport function computeReadinessScore(summary: {\n total: number;\n passed: number;\n failed: number;\n byPriority: { P0: number; P1: number; P2: number };\n}): ReadinessScore {\n const { total, passed, failed, byPriority } = summary;\n const hasP0 = byPriority.P0 > 0;\n\n if (total === 0) {\n return { score: 100, grade: 'A', total: 0, passed: 0, failed: 0, hasP0: false };\n }\n\n let score = Math.round(100 * passed / total);\n\n // Cap at 49 if any P0 findings exist\n if (hasP0 && score > 49) {\n score = 49;\n }\n\n return {\n score,\n grade: getScoreGrade(score),\n total,\n passed,\n failed,\n hasP0,\n };\n}\n\nexport function formatScoreForCli(rs: ReadinessScore): string {\n const gradeColor =\n rs.grade === 'A' ? pc.green :\n rs.grade === 'B' ? pc.yellow :\n rs.grade === 'C' ? pc.red :\n pc.red;\n\n return gradeColor(`Score: ${rs.score}/100 (${rs.grade})`);\n}\n","/* eslint-disable max-lines */\n/**\n * Run command - run the staff check on the codebase\n */\n\nimport pc from 'picocolors';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { resolve, dirname, join } from 'node:path';\nimport { collect, loadConfig, resolveTargetPath, DEFAULT_PATTERN_CONFIG } from '@securitychecks/collector';\nimport type { AuditResult, Finding, CollectorArtifact, Artifact, CalibrationConfig, PatternConfig } from '@securitychecks/collector';\nimport { ErrorCodes, isCLIError, wrapError, CLIError } from '../lib/errors.js';\nimport { validateSchemaVersion } from '../lib/schema.js';\nimport { calibrateFindings, getCalibrationStats } from '../lib/calibration.js';\nimport {\n fetchPatterns,\n applyPatterns,\n patternMatchesToFindings,\n detectFrameworks,\n getPatternStats,\n loadPatternsFromFile,\n loadBundledPatterns,\n clearPatternCaches,\n} from '../lib/patterns.js';\nimport {\n TEST_PATTERNS,\n shouldUseDevPatterns,\n getTestPatternsForFrameworks,\n} from '../lib/test-patterns.js';\nimport {\n loadBaseline,\n loadWaivers,\n categorizeFindings,\n getCIExitCode,\n getCISummary,\n type CategorizationResult,\n} from '../baseline/index.js';\nimport { generateFindingId } from '../findings/index.js';\nimport { toSarif } from '../lib/sarif.js';\nimport {\n correlateFindings,\n formatCorrelatedFinding,\n formatCorrelationStats,\n type CorrelationResult,\n} from '../lib/correlation.js';\nimport { reportCorrelations, type CorrelationTelemetryConfig } from '../lib/correlation-telemetry.js';\nimport { buildTelemetry, reportTelemetry, isTelemetryDisabled, type TelemetryConfig } from '../lib/telemetry.js';\nimport {\n fetchAggregateCalibration,\n formatAggregateCalibrationSummary,\n isAggregateCalibrationDisabled,\n type AggregateCalibrationData,\n type AggregateCalibrationConfig,\n} from '../lib/calibration.js';\nimport { getCloudApiKey, getCloudEndpoints, getCloudApiBaseUrl } from '../lib/license.js';\nimport { FileWatcher } from '../lib/watcher.js';\nimport { evaluateCloud } from '../lib/cloud-eval.js';\nimport { getProjectSlug } from '../lib/project-slug.js';\nimport { getStaffQuestion } from '../lib/staff.js';\nimport { computeReadinessScore, formatScoreForCli } from '../lib/score.js';\n\n/** Default artifact cache path */\nconst DEFAULT_ARTIFACT_PATH = '.securitychecks/artifacts.json';\n\n/**\n * Check if a URL points to a local endpoint (localhost or 127.0.0.1).\n * Used to show a warning when using dev/test cloud endpoints.\n */\nfunction isLocalEndpoint(url: string): boolean {\n try {\n const parsed = new URL(url);\n const host = parsed.hostname.toLowerCase();\n return host === 'localhost' || host === '127.0.0.1';\n } catch {\n // If URL parsing fails, check simple string match\n const lower = url.toLowerCase();\n return lower.includes('localhost') || lower.includes('127.0.0.1');\n }\n}\n\ninterface RunOptions {\n path?: string;\n artifact?: string;\n changed?: boolean;\n ci?: boolean;\n only?: string[];\n skip?: string[];\n json?: boolean;\n sarif?: string; // Output path for SARIF file\n quiet?: boolean;\n all?: boolean; // Don't stop early, show everything (including P2)\n includeP2?: boolean; // Include P2 findings (hidden by default)\n // Calibration options\n calibrate?: boolean; // Enable calibration API (default: true from config)\n offline?: boolean; // Disable all API calls (calibration + patterns + cloud eval)\n calibrationEndpoint?: string; // Override calibration API endpoint\n // Pattern options\n patterns?: boolean; // Enable pattern fetching (default: true)\n noPatterns?: boolean; // Disable pattern fetching\n patternEndpoint?: string; // Override pattern API endpoint\n patternsFile?: string; // Load patterns from local file instead of API\n // Watch mode\n watch?: boolean; // Watch for file changes and re-run\n // Usage banner\n noUsageBanner?: boolean; // Suppress periodic usage awareness banner\n // Local scan\n noLocalScan?: boolean; // Skip local source-level pattern scanning\n}\n\n/**\n * Load and validate a pre-collected artifact from scc\n */\nasync function loadArtifact(artifactPath: string): Promise<CollectorArtifact> {\n const fullPath = resolve(artifactPath);\n\n try {\n const content = await readFile(fullPath, 'utf-8');\n const artifact = JSON.parse(content) as CollectorArtifact;\n\n // Validate required fields\n if (!artifact.version) {\n throw new CLIError(\n ErrorCodes.ARTIFACT_INVALID,\n `Invalid artifact: missing 'version' field`\n );\n }\n\n if (artifact.version !== '1.0') {\n throw new CLIError(\n ErrorCodes.ARTIFACT_INVALID,\n `Unsupported artifact version: ${artifact.version} (expected 1.0)`\n );\n }\n\n if (!artifact.profile) {\n throw new CLIError(\n ErrorCodes.ARTIFACT_INVALID,\n `Invalid artifact: missing 'profile' field`\n );\n }\n\n if (!artifact.services || !Array.isArray(artifact.services)) {\n throw new CLIError(\n ErrorCodes.ARTIFACT_INVALID,\n `Invalid artifact: missing or invalid 'services' array`\n );\n }\n\n // Validate schema version compatibility\n const schemaValidation = validateSchemaVersion(artifact.schemaVersion);\n if (!schemaValidation.valid) {\n throw new CLIError(\n ErrorCodes.ARTIFACT_VERSION_MISMATCH,\n schemaValidation.error,\n {\n details: {\n artifactVersion: schemaValidation.artifactVersion,\n currentVersion: schemaValidation.currentVersion,\n remediation: schemaValidation.remediation,\n },\n }\n );\n }\n\n return artifact;\n } catch (error) {\n if (error instanceof CLIError) throw error;\n\n if ((error as { code?: string }).code === 'ENOENT') {\n throw new CLIError(\n ErrorCodes.ARTIFACT_NOT_FOUND,\n `Artifact file not found: ${fullPath}`\n );\n }\n\n throw new CLIError(\n ErrorCodes.ARTIFACT_INVALID,\n `Failed to parse artifact: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n\n/**\n * Convert CollectorArtifact to Artifact for checker compatibility\n */\nfunction toArtifact(artifact: CollectorArtifact): Artifact {\n return {\n version: '1.0',\n extractedAt: artifact.extractedAt,\n targetPath: artifact.codebase.root,\n services: artifact.services,\n authzCalls: artifact.authzCalls ?? [],\n tests: artifact.tests ?? [],\n cacheOperations: artifact.cacheOperations ?? [],\n transactionScopes: artifact.transactionScopes ?? [],\n webhookHandlers: artifact.webhookHandlers ?? [],\n jobHandlers: artifact.jobHandlers ?? [],\n membershipMutations: artifact.membershipMutations ?? [],\n routes: artifact.routes ?? [],\n callGraph: artifact.callGraph,\n rlsArtifact: artifact.rlsArtifact,\n };\n}\n\nfunction normalizeFrameworkList(frameworks: string[]): string[] {\n return Array.from(new Set(frameworks.map((framework) => framework.toLowerCase())));\n}\n\nfunction getCodebaseFrameworks(artifact: CollectorArtifact): string[] | undefined {\n const codebase = artifact.codebase as { frameworks?: string[] };\n return codebase.frameworks;\n}\n\nfunction resolveFrameworks(artifact: CollectorArtifact, fallback: Artifact): string[] {\n const codebaseFrameworks = getCodebaseFrameworks(artifact);\n if (codebaseFrameworks !== undefined) {\n return normalizeFrameworkList(codebaseFrameworks);\n }\n return detectFrameworks(fallback);\n}\n\n/**\n * Resolve calibration config from options and loaded config\n */\nfunction resolveCalibrationConfig(\n options: RunOptions,\n loadedConfig: { calibration?: CalibrationConfig },\n cloudApiKey?: string,\n endpointOverride?: string\n): CalibrationConfig | undefined {\n // --offline flag disables calibration entirely\n if (options.offline) {\n return undefined;\n }\n\n // Start with loaded config (which has defaults)\n const baseConfig = loadedConfig.calibration;\n if (!baseConfig) {\n return undefined;\n }\n\n const apiKey = cloudApiKey ?? baseConfig.apiKey;\n if (!apiKey) {\n return undefined;\n }\n\n // Apply CLI overrides\n const config: CalibrationConfig = {\n ...baseConfig,\n // --calibrate flag explicitly enables\n enabled: options.calibrate ?? baseConfig.enabled,\n // --calibration-endpoint overrides\n endpoint: options.calibrationEndpoint ?? endpointOverride ?? baseConfig.endpoint,\n // API key for cloud calibration\n apiKey,\n };\n\n return config.enabled ? config : undefined;\n}\n\n/**\n * Resolve pattern config from options.\n * Returns config for patterns (from file, dev, or API).\n * Returns undefined only if --no-patterns is explicitly set.\n */\nfunction resolvePatternConfig(\n options: RunOptions,\n cloudApiKey?: string,\n endpointOverride?: string\n): PatternConfig | undefined {\n // --no-patterns explicitly disables all patterns\n if (options.noPatterns) {\n return undefined;\n }\n\n // If using local file or dev patterns, always return config (even offline)\n if (options.patternsFile || shouldUseDevPatterns()) {\n return {\n ...DEFAULT_PATTERN_CONFIG,\n enabled: true,\n endpoint: options.patternEndpoint ?? endpointOverride ?? DEFAULT_PATTERN_CONFIG.endpoint,\n apiKey: cloudApiKey,\n // Mark as offline mode since we're not fetching from API\n offlineMode: true,\n };\n }\n\n // For API-based patterns, need online mode and API key\n if (options.offline || !cloudApiKey) {\n return undefined;\n }\n\n // Start with defaults\n const config: PatternConfig = {\n ...DEFAULT_PATTERN_CONFIG,\n // --patterns flag explicitly enables (default is true)\n enabled: options.patterns ?? true,\n // --pattern-endpoint overrides\n endpoint: options.patternEndpoint ?? endpointOverride ?? DEFAULT_PATTERN_CONFIG.endpoint,\n // API key for cloud patterns\n apiKey: cloudApiKey,\n };\n\n return config.enabled ? config : undefined;\n}\n\n/**\n * Run checks using a pre-collected artifact\n */\ntype CloudEndpoints = ReturnType<typeof getCloudEndpoints>;\n\nasync function runFromArtifact(\n artifact: CollectorArtifact,\n options: RunOptions\n): Promise<{\n result: AuditResult;\n calibrationUsed: boolean;\n patternsUsed: boolean;\n cloudApiKey?: string;\n cloudEndpoints: CloudEndpoints;\n cloudEvalUsed: boolean;\n cloudUsage: { scansUsed: number; scansRemaining: number };\n}> {\n const startTime = Date.now();\n\n // Load config from the artifact's codebase root\n const targetPath = artifact.codebase.root;\n const config = await loadConfig(targetPath);\n const cloudApiKey = getCloudApiKey() ?? config.calibration?.apiKey;\n const cloudBaseUrl = getCloudApiBaseUrl();\n const cloudEndpoints = getCloudEndpoints(cloudBaseUrl);\n\n // Cloud evaluation is required - no local fallback (IP protection)\n if (!cloudApiKey) {\n throw new CLIError(\n ErrorCodes.AUTH_REQUIRED,\n 'API key required for evaluation',\n {\n details: {\n remediation: `Set SECURITYCHECKS_API_KEY environment variable or add apiKey to securitychecks.config.yaml.\nGet your API key at https://securitychecks.ai/dashboard/settings/api-keys`,\n },\n }\n );\n }\n\n if (options.offline) {\n throw new CLIError(\n ErrorCodes.OFFLINE_NOT_SUPPORTED,\n 'Offline mode is not supported',\n {\n details: {\n remediation: `SecurityChecks requires cloud evaluation for IP protection.\nRemove --offline flag to use cloud evaluation.\nFor air-gapped environments, contact sales for an enterprise on-premise license.`,\n },\n }\n );\n }\n\n if (!options.quiet) {\n console.log(pc.dim(`Mode: cloud evaluation (IP protected)`));\n if (isLocalEndpoint(cloudBaseUrl)) {\n console.log(pc.yellow('⚠ Using local cloud endpoint (dev/test)'));\n }\n }\n\n const auditArtifact = toArtifact(artifact);\n\n // Cloud evaluation - all pattern checking happens server-side\n if (!options.quiet) {\n console.log(pc.dim(`Evaluating via cloud API...`));\n }\n\n const cloudEvalResult = await evaluateCloud(artifact, {\n apiKey: cloudApiKey,\n baseUrl: cloudBaseUrl,\n invariants: options.only,\n skip: options.skip,\n // Required to associate CLI uploads with webhook-created scans for the same repo/PR.\n projectSlug: getProjectSlug(),\n });\n\n let findings: Finding[] = cloudEvalResult.findings;\n\n if (!options.quiet) {\n console.log(\n pc.dim(\n `Cloud: ${cloudEvalResult.stats.invariantsRun} invariants, ` +\n `${cloudEvalResult.stats.findingsCount} findings in ${cloudEvalResult.stats.executionMs}ms`\n )\n );\n if (cloudEvalResult.usage.scansRemaining !== Infinity) {\n console.log(\n pc.dim(`Usage: ${cloudEvalResult.usage.scansUsed} scans used, ${cloudEvalResult.usage.scansRemaining} remaining`)\n );\n }\n }\n\n // Track checker results for summary (synthesize from cloud findings)\n interface CheckResult {\n invariantId: string;\n passed: boolean;\n findings: Finding[];\n checkedAt: string;\n duration: number;\n }\n const results: CheckResult[] = [];\n const cloudEvalUsed = true;\n\n // Synthesize results from findings for compatibility\n const findingsByInvariantMap = new Map<string, Finding[]>();\n for (const finding of findings) {\n const existing = findingsByInvariantMap.get(finding.invariantId) ?? [];\n existing.push(finding);\n findingsByInvariantMap.set(finding.invariantId, existing);\n }\n\n // Create synthetic results for each invariant with findings\n for (const [invariantId, invariantFindings] of findingsByInvariantMap) {\n results.push({\n invariantId,\n passed: invariantFindings.length === 0,\n findings: invariantFindings,\n checkedAt: new Date().toISOString(),\n duration: cloudEvalResult.stats.executionMs ?? 0,\n });\n }\n\n // === LOCAL SOURCE-LEVEL PATTERNS ===\n // Cloud eval handles proprietary invariant checks (call graph, artifact-based).\n // Local patterns handle OWASP-type source-level scans (secrets, SQLi, XSS, weak crypto).\n // These are complementary — cloud patterns use artifact metadata, local patterns read source files.\n let patternsUsed = cloudEvalUsed; // Cloud eval includes its own patterns\n\n if (!options.noLocalScan && options.patterns !== false && !options.noPatterns) {\n // Build artifact for pattern matching (includes routes, webhooks, etc.)\n const artifactForPatterns = {\n version: '1.0' as const,\n extractedAt: artifact.extractedAt,\n targetPath: artifact.codebase.root,\n services: artifact.services,\n authzCalls: artifact.authzCalls ?? [],\n cacheOperations: artifact.cacheOperations ?? [],\n transactionScopes: artifact.transactionScopes ?? [],\n webhookHandlers: artifact.webhookHandlers ?? [],\n jobHandlers: artifact.jobHandlers ?? [],\n membershipMutations: artifact.membershipMutations ?? [],\n tests: artifact.tests ?? [],\n routes: artifact.routes ?? [],\n callGraph: artifact.callGraph,\n };\n\n const frameworks = resolveFrameworks(artifact, artifactForPatterns);\n\n if (!options.quiet && frameworks.length > 0) {\n console.log(pc.dim(`Frameworks detected: ${frameworks.join(', ')}`));\n }\n\n try {\n const localScanStart = Date.now();\n let patterns: typeof TEST_PATTERNS = [];\n let patternSource = 'bundled';\n\n // Priority: 1. --patterns-file, 2. SECURITYCHECKS_DEV_PATTERNS, 3. Bundled patterns\n // API-fetched patterns are also merged in when available.\n if (options.patternsFile) {\n if (!options.quiet) {\n console.log(pc.dim(`Loading patterns from ${options.patternsFile}...`));\n }\n patterns = await loadPatternsFromFile(options.patternsFile);\n patternSource = 'file';\n } else if (shouldUseDevPatterns()) {\n if (!options.quiet) {\n console.log(pc.yellow('⚠ Using dev test patterns (SECURITYCHECKS_DEV_PATTERNS=1)'));\n }\n patterns = getTestPatternsForFrameworks(frameworks);\n patternSource = 'dev';\n } else {\n // Load bundled source-level patterns (always available, no API needed)\n patterns = loadBundledPatterns(frameworks);\n patternSource = 'bundled';\n\n // Also try fetching Pro Patterns from API and merge\n const patternConfig = resolvePatternConfig(options, cloudApiKey, cloudEndpoints.patterns);\n if (patternConfig && !patternConfig.offlineMode) {\n try {\n if (!options.quiet) {\n console.log(pc.dim(`Fetching Pro Patterns from ${patternConfig.endpoint}...`));\n }\n const apiPatterns = await fetchPatterns(\n artifactForPatterns,\n patternConfig,\n targetPath,\n frameworks\n );\n if (apiPatterns.length > 0) {\n // Merge API patterns, dedup by id\n const existingIds = new Set(patterns.map(p => p.id));\n for (const ap of apiPatterns) {\n if (!existingIds.has(ap.id)) {\n patterns.push(ap);\n existingIds.add(ap.id);\n }\n }\n patternSource = 'bundled+api';\n }\n } catch {\n // API unavailable — bundled patterns still run\n }\n }\n }\n\n if (patterns.length > 0) {\n patternsUsed = true;\n\n // Apply patterns to find matches\n const matches = applyPatterns(artifactForPatterns, patterns);\n\n // Convert matches to findings\n const patternFindings = patternMatchesToFindings(matches, patternSource === 'bundled+api' ? 'local+api' : 'local');\n\n if (!options.quiet) {\n const stats = getPatternStats(patterns, matches, frameworks);\n const sourceLabel = patternSource === 'bundled' ? '' : ` (${patternSource})`;\n const localScanMs = Date.now() - localScanStart;\n console.log(\n pc.dim(`Local scan: ${stats.patternsLoaded} patterns${sourceLabel}, ${stats.matchesFound} match(es) found in ${localScanMs}ms`)\n );\n }\n\n // Merge pattern findings with checker findings\n // Avoid duplicates by checking invariantId + file + line\n const existingKeys = new Set(\n findings.map((f) => `${f.invariantId}:${f.evidence[0]?.file}:${f.evidence[0]?.line}`)\n );\n\n for (const pf of patternFindings) {\n const key = `${pf.invariantId}:${pf.evidence[0]?.file}:${pf.evidence[0]?.line}`;\n if (!existingKeys.has(key)) {\n findings.push(pf);\n existingKeys.add(key);\n }\n }\n } else if (!options.quiet) {\n console.log(pc.dim(`Local scan: No applicable patterns for detected frameworks`));\n }\n } catch {\n // Pattern loading failed - continue with cloud findings only\n if (!options.quiet) {\n console.log(pc.dim(`Local scan: Pattern loading failed, using cloud findings only`));\n }\n } finally {\n // Free memory from file content caches used during pattern matching\n clearPatternCaches();\n }\n }\n\n // Apply calibration if enabled\n // Skip if cloud evaluation was used (cloud already calibrated)\n // \"The SaaS advises. The local tool decides.\"\n const calibrationConfig = cloudEvalUsed ? undefined : resolveCalibrationConfig(\n options,\n config,\n cloudApiKey,\n cloudEndpoints.calibrate\n );\n let calibrationUsed = cloudEvalUsed; // Cloud eval includes calibration\n\n if (calibrationConfig) {\n if (!options.quiet) {\n console.log(pc.dim(`Calibrating findings via ${calibrationConfig.endpoint}...`));\n }\n\n try {\n // Convert CollectorArtifact to the Artifact type expected by calibration\n const artifactForCalibration = {\n version: '1.0' as const,\n extractedAt: artifact.extractedAt,\n targetPath: artifact.codebase.root,\n services: artifact.services,\n authzCalls: artifact.authzCalls ?? [],\n cacheOperations: artifact.cacheOperations ?? [],\n transactionScopes: artifact.transactionScopes ?? [],\n webhookHandlers: artifact.webhookHandlers ?? [],\n jobHandlers: artifact.jobHandlers ?? [],\n membershipMutations: artifact.membershipMutations ?? [],\n tests: artifact.tests ?? [],\n routes: artifact.routes ?? [],\n callGraph: artifact.callGraph,\n };\n\n findings = await calibrateFindings(\n findings,\n artifactForCalibration,\n calibrationConfig,\n targetPath\n );\n calibrationUsed = true;\n\n if (!options.quiet) {\n const stats = getCalibrationStats(findings);\n if (stats.calibrated > 0) {\n console.log(\n pc.dim(`Calibration: ${stats.applied}/${stats.calibrated} suggestions applied`)\n );\n for (const change of stats.severityChanges) {\n console.log(pc.dim(` ${change.from} → ${change.to}: ${change.count} finding(s)`));\n }\n }\n }\n } catch {\n // Calibration failed - continue with local results\n if (!options.quiet) {\n console.log(pc.dim(`Calibration unavailable, using local results`));\n }\n }\n }\n\n // Update results with calibrated findings\n // (We need to map findings back to their original results)\n const calibratedFindingsByInvariant = new Map<string, Finding[]>();\n for (const finding of findings) {\n const existing = calibratedFindingsByInvariant.get(finding.invariantId) ?? [];\n existing.push(finding);\n calibratedFindingsByInvariant.set(finding.invariantId, existing);\n }\n\n const updatedResults = results.map((r: CheckResult) => ({\n ...r,\n findings: calibratedFindingsByInvariant.get(r.invariantId) ?? [],\n }));\n\n const passed = updatedResults.filter((r) => r.passed).length;\n const failed = updatedResults.filter((r) => !r.passed).length;\n const waived = findings.filter((f) => f.waived).length;\n\n const byPriority = {\n P0: findings.filter((f) => f.severity === 'P0').length,\n P1: findings.filter((f) => f.severity === 'P1').length,\n P2: findings.filter((f) => f.severity === 'P2').length,\n };\n\n const summaryData = { total: updatedResults.length, passed, failed, waived, byPriority };\n const readiness = computeReadinessScore(summaryData);\n\n return {\n result: {\n version: '1.0',\n targetPath,\n runAt: new Date().toISOString(),\n duration: Date.now() - startTime,\n summary: { ...summaryData, score: readiness.score, grade: readiness.grade },\n results: updatedResults,\n artifact: auditArtifact,\n },\n calibrationUsed,\n patternsUsed,\n cloudApiKey,\n cloudEndpoints,\n cloudEvalUsed,\n cloudUsage: cloudEvalResult.usage,\n };\n}\n\n/**\n * Run a single scan (used by both regular and watch mode)\n */\nasync function runSingleScan(options: RunOptions): Promise<void> {\n const _startTime = Date.now();\n\n if (!options.quiet) {\n console.log(pc.bold('\\n🔍 Scanning for invariants AI misses...\\n'));\n }\n\n try {\n let artifact: CollectorArtifact;\n\n if (options.artifact) {\n // Use pre-collected artifact\n if (!options.quiet) {\n console.log(pc.dim(`Loading artifact from ${options.artifact}...`));\n }\n\n artifact = await loadArtifact(options.artifact);\n } else {\n // Collect artifacts first (orchestrate scc collect)\n const targetPath = resolveTargetPath(options.path);\n\n if (!options.quiet) {\n console.log(pc.dim(`Collecting artifacts from ${targetPath}...`));\n }\n\n artifact = await collect({\n targetPath,\n profile: 'securitychecks',\n });\n\n // Cache artifact for inspection/debugging\n const artifactPath = join(targetPath, DEFAULT_ARTIFACT_PATH);\n try {\n await mkdir(dirname(artifactPath), { recursive: true });\n await writeFile(artifactPath, JSON.stringify(artifact, null, 2), 'utf-8');\n if (!options.quiet) {\n console.log(pc.dim(`Artifact cached at ${DEFAULT_ARTIFACT_PATH}`));\n }\n } catch {\n // Non-fatal: continue even if we can't cache\n }\n }\n\n if (!options.quiet) {\n const schemaVer = artifact.schemaVersion ?? '1.0.0';\n console.log(pc.dim(`Artifact: v${artifact.version}, schema=${schemaVer}, profile=${artifact.profile}`));\n console.log(pc.dim(`Codebase: ${artifact.codebase.root}`));\n console.log(pc.dim(`Files: ${artifact.codebase.filesScanned}, Services: ${artifact.services.length}`));\n console.log('');\n }\n\n const {\n result,\n calibrationUsed: _calibrationUsed,\n patternsUsed: _patternsUsed,\n cloudApiKey,\n cloudEndpoints,\n cloudEvalUsed: _cloudEvalUsed,\n cloudUsage,\n } = await runFromArtifact(artifact, options);\n\n // Load baseline and waivers\n const targetPath = artifact.codebase.root;\n const [baseline, waivers] = await Promise.all([\n loadBaseline(targetPath),\n loadWaivers(targetPath),\n ]);\n\n // Categorize findings against baseline/waivers\n const allFindings = result.results.flatMap((r) => r.findings);\n const categorization = categorizeFindings(allFindings, baseline, waivers);\n\n // Run correlation analysis to detect compounding risks\n const correlationResult = correlateFindings(result.results, result.artifact);\n if (!options.quiet && correlationResult.correlations.length > 0) {\n console.log(pc.dim(`Correlation: ${correlationResult.stats.correlationGroups} compounding risk group(s) detected`));\n }\n\n // Build artifact for framework detection (used by multiple telemetry calls)\n const artifactForFrameworks = {\n version: '1.0' as const,\n extractedAt: artifact.extractedAt,\n targetPath: artifact.codebase.root,\n services: artifact.services,\n authzCalls: artifact.authzCalls ?? [],\n cacheOperations: artifact.cacheOperations ?? [],\n transactionScopes: artifact.transactionScopes ?? [],\n webhookHandlers: artifact.webhookHandlers ?? [],\n jobHandlers: artifact.jobHandlers ?? [],\n membershipMutations: artifact.membershipMutations ?? [],\n tests: artifact.tests ?? [],\n routes: artifact.routes ?? [],\n callGraph: artifact.callGraph,\n };\n const detectedFrameworks = resolveFrameworks(artifact, artifactForFrameworks);\n\n // Report correlations to SaaS (non-blocking, for learning)\n if (!options.offline && cloudApiKey && correlationResult.correlations.length > 0) {\n const correlationTelemetryConfig: CorrelationTelemetryConfig = {\n enabled: true,\n apiKey: cloudApiKey,\n endpoint: cloudEndpoints.correlations,\n };\n\n // Fire-and-forget - don't block on telemetry\n reportCorrelations(correlationResult, correlationTelemetryConfig, detectedFrameworks[0])\n .catch(() => {/* Telemetry failures are silent */});\n }\n\n // Fetch aggregate calibration data for framework comparison\n let aggregateCalibration: AggregateCalibrationData | null = null;\n if (\n !options.offline &&\n cloudApiKey &&\n !isAggregateCalibrationDisabled() &&\n detectedFrameworks.length > 0\n ) {\n const aggregateConfig: AggregateCalibrationConfig = {\n enabled: true,\n apiKey: cloudApiKey,\n endpoint: cloudEndpoints.aggregateCalibration,\n };\n\n try {\n const calibrationResult = await fetchAggregateCalibration(detectedFrameworks, aggregateConfig);\n if (calibrationResult.data) {\n aggregateCalibration = calibrationResult.data;\n if (!options.quiet && calibrationResult.data.meta.totalScansAnalyzed > 0) {\n console.log(pc.dim(`Calibration: Loaded baseline from ${calibrationResult.data.meta.totalScansAnalyzed} scans${calibrationResult.fromCache ? ' (cached)' : ''}`));\n }\n }\n } catch {\n // Calibration failures are non-fatal\n }\n }\n\n // SARIF output for GitHub Code Scanning integration\n if (options.sarif) {\n const cliVersion = process.env['CLI_VERSION'] ?? '0.0.0';\n const sarifOutput = toSarif(result, cliVersion);\n await writeFile(options.sarif, JSON.stringify(sarifOutput, null, 2), 'utf-8');\n if (!options.quiet) {\n console.log(pc.green(`✓ SARIF report written to ${options.sarif}`));\n }\n }\n\n if (options.json) {\n // Include categorization and correlation in JSON output\n const jsonOutput = {\n ...result,\n categorization: {\n counts: categorization.counts,\n new: categorization.new.map((c) => ({ ...c, findingId: generateFindingId(c) })),\n baselined: categorization.baselined.map((c) => ({ ...c, findingId: generateFindingId(c) })),\n waived: categorization.waived.map((c) => ({\n ...c,\n findingId: generateFindingId(c),\n waiver: c.waiver,\n })),\n },\n correlation: {\n stats: correlationResult.stats,\n groups: correlationResult.correlations.map((c) => ({\n primary: { ...c.primary, findingId: generateFindingId(c.primary) },\n related: c.related.map((r) => ({ ...r, findingId: generateFindingId(r) })),\n sharedContext: c.sharedContext,\n compoundingEffect: c.compoundingEffect,\n adjustedSeverity: c.adjustedSeverity,\n attackPath: c.attackPath,\n })),\n },\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Display results with categorization, correlation, and calibration comparison\n displayResults(result, categorization, correlationResult, options, {\n aggregateCalibration,\n frameworks: detectedFrameworks,\n });\n\n // Usage awareness banner\n if (!options.quiet && !options.json && !options.ci) {\n const { scansUsed, scansRemaining } = cloudUsage;\n const total = scansUsed + scansRemaining;\n const isSuppressed = options.noUsageBanner\n || process.env['SECURITYCHECKS_NO_USAGE_BANNER'] === '1';\n\n if (!isSuppressed && scansRemaining !== Infinity && total > 0) {\n const isLow = scansRemaining / total <= 0.2;\n const isNthScan = scansUsed % 5 === 0;\n\n if (isLow || isNthScan) {\n const color = isLow ? pc.red : pc.yellow;\n const label = isLow ? 'Low quota' : 'Quota';\n console.log(color(`⚠ ${label}: ${scansUsed} of ${total} scans used this month (${scansRemaining} remaining)`));\n console.log(pc.dim(' Upgrade at https://securitychecks.ai/pricing'));\n if (!isLow) {\n console.log(pc.dim(' Suppress with --no-usage-banner or SECURITYCHECKS_NO_USAGE_BANNER=1'));\n }\n }\n }\n }\n\n // Report anonymous telemetry (non-blocking, opt-out via DO_NOT_TRACK=1)\n if (!options.offline && cloudApiKey && !isTelemetryDisabled()) {\n const telemetryConfig: TelemetryConfig = {\n enabled: true,\n apiKey: cloudApiKey,\n endpoint: cloudEndpoints.telemetry,\n };\n\n const telemetry = buildTelemetry(result, {\n filesScanned: artifact.codebase.filesScanned,\n frameworks: detectedFrameworks,\n correlation: correlationResult,\n categorization,\n mode: options.ci ? 'ci' : 'manual',\n baselineSize: baseline ? Object.keys(baseline.entries).length : 0,\n waiversCount: waivers ? Object.keys(waivers.entries).length : 0,\n });\n\n // Fire-and-forget - don't block on telemetry\n reportTelemetry(telemetry, telemetryConfig)\n .catch(() => {/* Telemetry failures are silent */});\n }\n\n // Exit with appropriate code (CI mode respects baseline/waivers)\n if (options.ci) {\n const exitCode = getCIExitCode(categorization);\n if (exitCode !== 0) {\n console.log(pc.red(`\\n${getCISummary(categorization)}`));\n console.log(pc.dim('Use `scheck baseline --update` to baseline known issues.'));\n console.log(pc.dim('Use `scheck waive <findingId>` to temporarily waive issues.\\n'));\n process.exit(exitCode);\n } else {\n console.log(pc.green(`\\n${getCISummary(categorization)}\\n`));\n }\n }\n } catch (error) {\n const cliError = isCLIError(error)\n ? error\n : wrapError(error, ErrorCodes.CHECK_EXECUTION_ERROR, 'Error running scheck');\n\n if (options.json) {\n console.error(JSON.stringify(cliError.toJSON(), null, 2));\n } else {\n console.error(pc.red(`\\n${cliError.toUserString()}\\n`));\n\n // Show remediation guidance\n const remediation = cliError.getRemediation();\n if (remediation) {\n console.error(pc.yellow('How to fix:'));\n for (const line of remediation.split('\\n')) {\n console.error(pc.dim(` ${line}`));\n }\n console.error('');\n }\n\n if (cliError.cause) {\n console.error(pc.dim(`Caused by: ${cliError.cause.message}`));\n console.error('');\n }\n\n console.error(pc.dim('Need help? https://securitychecks.ai/docs/troubleshooting'));\n console.error('');\n }\n process.exit(1);\n }\n}\n\n/**\n * Check if CLI is enabled via feature flag\n * CLI is in private beta - users should use GitHub App instead\n */\nfunction isCLIEnabled(): boolean {\n const flag = process.env['SECURITYCHECKS_CLI_ENABLED'];\n return flag === '1' || flag === 'true';\n}\n\n/**\n * Main run command entry point\n * Handles both single run and watch mode\n */\nexport async function runCommand(options: RunOptions): Promise<void> {\n // Feature flag: CLI is in private beta\n if (!isCLIEnabled()) {\n console.log(pc.bold('\\nSecurityChecks CLI is currently in private beta.\\n'));\n console.log('For public access, use our GitHub App instead:');\n console.log(pc.cyan(' https://securitychecks.ai\\n'));\n console.log('Benefits of the GitHub App:');\n console.log(' - No installation required');\n console.log(' - Automatic PR checks');\n console.log(' - Evidence directly in your PRs');\n console.log(' - Free tier available\\n');\n console.log(pc.dim('Enterprise or beta access? Contact sales@securitychecks.ai'));\n console.log(pc.dim('Set SECURITYCHECKS_CLI_ENABLED=1 if you have approved access.\\n'));\n process.exit(0);\n }\n\n // Watch mode incompatible with certain options\n if (options.watch) {\n if (options.ci) {\n console.error(pc.red('Error: --watch cannot be used with --ci mode'));\n process.exit(1);\n }\n if (options.artifact) {\n console.error(pc.red('Error: --watch cannot be used with --artifact'));\n process.exit(1);\n }\n if (options.json) {\n console.error(pc.red('Error: --watch cannot be used with --json output'));\n process.exit(1);\n }\n\n const targetPath = resolveTargetPath(options.path);\n\n console.log(pc.bold('\\n👀 Watch mode enabled\\n'));\n console.log(pc.dim(`Watching: ${targetPath}`));\n console.log(pc.dim('Press Ctrl+C to stop\\n'));\n\n // Run initial scan\n await runSingleScan(options);\n\n let runCount = 1;\n\n // Set up file watcher\n const watcher = new FileWatcher({\n targetPath,\n verbose: !options.quiet,\n onChanged: async () => {\n runCount++;\n // Clear console for cleaner output\n console.clear();\n console.log(pc.bold(`\\n👀 Watch mode (run #${runCount})\\n`));\n console.log(pc.dim(`Watching: ${targetPath}`));\n console.log(pc.dim('Press Ctrl+C to stop\\n'));\n\n try {\n await runSingleScan(options);\n } catch {\n // Error already displayed by runSingleScan\n console.log(pc.dim('\\nWaiting for changes...\\n'));\n }\n },\n });\n\n watcher.on('change', (filename: string) => {\n if (!options.quiet) {\n console.log(pc.dim(`\\nFile changed: ${filename}`));\n console.log(pc.dim('Re-running scan...\\n'));\n }\n });\n\n watcher.start();\n\n // Keep process alive and handle graceful shutdown\n process.on('SIGINT', () => {\n console.log(pc.dim('\\n\\nStopping watch mode...'));\n watcher.stop();\n process.exit(0);\n });\n\n // Keep process running\n await new Promise(() => {});\n }\n\n // Single run mode\n return runSingleScan(options);\n}\n\nfunction displayResults(\n result: AuditResult,\n categorization: CategorizationResult,\n correlation: CorrelationResult,\n options: RunOptions,\n calibration?: {\n aggregateCalibration: AggregateCalibrationData | null;\n frameworks: string[];\n }\n): void {\n const { counts } = categorization;\n const showP2 = options.all || options.includeP2;\n const earlyExit = !options.all && !options.ci;\n\n // Filter findings based on severity visibility\n const visibleFindings = categorization.new.filter(\n (f) => f.severity === 'P0' || f.severity === 'P1' || showP2\n );\n\n // Count visible findings by severity\n const p0Count = visibleFindings.filter((f) => f.severity === 'P0').length;\n const p1Count = visibleFindings.filter((f) => f.severity === 'P1').length;\n const p2Count = categorization.new.filter((f) => f.severity === 'P2').length;\n const criticalCount = p0Count;\n const totalVisible = p0Count + p1Count + (showP2 ? p2Count : 0);\n\n if (options.quiet && totalVisible === 0) {\n return;\n }\n\n // Early exit: stop on first P0 finding\n let stoppedEarly = false;\n let displayFindings = visibleFindings;\n\n if (earlyExit && p0Count > 0) {\n // Only show first P0 finding\n const firstP0 = visibleFindings.find((f) => f.severity === 'P0');\n if (firstP0) {\n displayFindings = [firstP0];\n stoppedEarly = true;\n }\n }\n\n // Display findings in new format\n if (displayFindings.length > 0) {\n // Group by invariant\n const byInvariant = new Map<string, typeof displayFindings>();\n for (const finding of displayFindings) {\n const id = finding.invariantId;\n if (!byInvariant.has(id)) {\n byInvariant.set(id, []);\n }\n byInvariant.get(id)!.push(finding);\n }\n\n for (const [invariantId, findings] of byInvariant) {\n const severity = findings[0]?.severity;\n const severityColor =\n severity === 'P0' ? pc.red : severity === 'P1' ? pc.yellow : pc.blue;\n\n // [P0] AUTHZ.SERVICE_LAYER.ENFORCED\n console.log(severityColor(`[${severity}] ${invariantId}`));\n console.log('');\n\n // Staff engineer question\n const staffQuestion = getStaffQuestion(invariantId);\n if (staffQuestion) {\n console.log(` A staff engineer would ask:`);\n console.log(` ${pc.cyan(`\"${staffQuestion}\"`)}`);\n console.log('');\n }\n\n // Evidence for each finding\n for (const finding of findings) {\n for (const evidence of finding.evidence) {\n console.log(` → ${pc.white(`${evidence.file}:${evidence.line}`)}`);\n console.log(` ${pc.dim(finding.message)}`);\n }\n }\n console.log('');\n }\n }\n\n // Stats line: Scanned X files in Y.Zs\n const duration = (result.duration / 1000).toFixed(1);\n const filesScanned = result.artifact?.services?.length ?? 0;\n console.log(pc.dim(`Scanned ${filesScanned} files in ${duration}s`));\n\n // Readiness score\n const readiness = computeReadinessScore(result.summary);\n console.log(formatScoreForCli(readiness));\n console.log('');\n\n // Summary line\n if (stoppedEarly) {\n console.log(pc.red(`✖ Found critical issue. Stopping early.`));\n console.log('');\n console.log(pc.dim(`Run \\`scheck run --all\\` to see all findings.`));\n console.log(pc.dim(`Run \\`scheck explain ${displayFindings[0]?.invariantId}\\` for details.`));\n } else if (totalVisible === 0) {\n console.log(pc.green(`✓ No issues found. Ship it.`));\n } else {\n const issueWord = totalVisible === 1 ? 'issue' : 'issues';\n const criticalNote = criticalCount > 0 ? ` (${criticalCount} critical)` : '';\n console.log(pc.red(`✖ ${totalVisible} ${issueWord} require attention${criticalNote}`));\n console.log('');\n\n // Show explain hint for the first invariant\n const firstInvariant = displayFindings[0]?.invariantId;\n if (firstInvariant) {\n console.log(pc.dim(`Run \\`scheck explain ${firstInvariant}\\` for details.`));\n }\n }\n\n // Show hidden P2 count if applicable\n if (!showP2 && p2Count > 0 && !stoppedEarly) {\n console.log(pc.dim(`(${p2Count} P2 finding(s) hidden. Run with --all to see them.)`));\n }\n\n // Show baselined/waived summary in non-quiet mode\n if (!options.quiet) {\n if (counts.baselined > 0 || counts.waived > 0) {\n console.log('');\n if (counts.baselined > 0) {\n console.log(pc.dim(`Baselined: ${counts.baselined} finding(s) in baseline`));\n }\n if (counts.waived > 0) {\n console.log(pc.dim(`Waived: ${counts.waived} finding(s) temporarily waived`));\n }\n }\n }\n\n // Correlation warnings (verbose mode only)\n if (correlation.correlations.length > 0 && !options.quiet && options.all) {\n console.log('');\n console.log(pc.bold(pc.magenta('Compounding Risks Detected:')));\n for (const corr of correlation.correlations) {\n console.log(formatCorrelatedFinding(corr));\n }\n console.log(pc.dim(formatCorrelationStats(correlation)));\n }\n\n // Framework comparison (verbose/all mode only)\n if (calibration?.aggregateCalibration && calibration.frameworks.length > 0 && options.all) {\n const findings = {\n P0: result.summary.byPriority.P0,\n P1: result.summary.byPriority.P1,\n P2: result.summary.byPriority.P2,\n total: counts.total,\n };\n const comparisonSummary = formatAggregateCalibrationSummary(\n calibration.aggregateCalibration,\n calibration.frameworks,\n findings\n );\n if (comparisonSummary) {\n console.log('');\n console.log(pc.bold('Framework Comparison:'));\n for (const line of comparisonSummary.split('\\n')) {\n console.log(` ${pc.dim(line)}`);\n }\n }\n }\n\n console.log('');\n}\n","/**\n * Explain command - explain an invariant and show required proofs\n */\n\nimport pc from 'picocolors';\nimport { getInvariantById, ALL_INVARIANTS } from '@securitychecks/collector';\n\nexport async function explainCommand(invariantId: string): Promise<void> {\n const invariant = getInvariantById(invariantId);\n\n if (!invariant) {\n console.log(pc.red(`\\nUnknown invariant: ${invariantId}\\n`));\n console.log(pc.bold('Available invariants:\\n'));\n\n for (const inv of ALL_INVARIANTS) {\n const severityColor =\n inv.severity === 'P0' ? pc.red : inv.severity === 'P1' ? pc.yellow : pc.blue;\n console.log(` ${severityColor(`[${inv.severity}]`)} ${inv.id}`);\n console.log(pc.dim(` ${inv.name}`));\n }\n console.log('');\n return;\n }\n\n const severityColor =\n invariant.severity === 'P0' ? pc.red : invariant.severity === 'P1' ? pc.yellow : pc.blue;\n\n console.log('');\n console.log(severityColor(pc.bold(`[${invariant.severity}] ${invariant.id}`)));\n console.log(pc.bold(invariant.name));\n console.log('');\n\n console.log(pc.bold('Description:'));\n console.log(wrapText(invariant.description, 80, 2));\n console.log('');\n\n console.log(pc.bold('Category:'));\n console.log(` ${invariant.category}`);\n console.log('');\n\n console.log(pc.bold('Required Proof:'));\n console.log(wrapText(invariant.requiredProof, 80, 2));\n console.log('');\n\n if (invariant.documentationUrl) {\n console.log(pc.bold('Documentation:'));\n console.log(` ${invariant.documentationUrl}`);\n console.log('');\n }\n}\n\nfunction wrapText(text: string, maxWidth: number, indent: number): string {\n const words = text.split(' ');\n const lines: string[] = [];\n let currentLine = '';\n const prefix = ' '.repeat(indent);\n\n for (const word of words) {\n if (currentLine.length + word.length + 1 > maxWidth - indent) {\n lines.push(prefix + currentLine.trim());\n currentLine = word;\n } else {\n currentLine += (currentLine ? ' ' : '') + word;\n }\n }\n\n if (currentLine) {\n lines.push(prefix + currentLine.trim());\n }\n\n return lines.join('\\n');\n}\n","/**\n * Init command - initialize scheck in a project\n */\n\nimport { writeFile, mkdir, chmod } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport pc from 'picocolors';\nimport { resolveTargetPath } from '@securitychecks/collector';\n\ninterface InitOptions {\n path?: string;\n hooks?: boolean;\n}\n\nconst DEFAULT_CONFIG = `# SecurityChecks Configuration\n# Catch what Copilot misses — Architectural security for AI-generated code\n# https://securitychecks.ai/docs/config\n\nversion: \"1.0\"\n\n# Paths to scan for source files\ninclude:\n - \"src/**/*.ts\"\n - \"src/**/*.tsx\"\n - \"lib/**/*.ts\"\n - \"app/**/*.ts\"\n - \"app/**/*.tsx\"\n\n# Paths to exclude\nexclude:\n - \"**/node_modules/**\"\n - \"**/dist/**\"\n - \"**/build/**\"\n - \"**/.next/**\"\n - \"**/coverage/**\"\n - \"**/*.d.ts\"\n\n# Test file patterns\ntestPatterns:\n - \"**/*.test.ts\"\n - \"**/*.test.tsx\"\n - \"**/*.spec.ts\"\n - \"**/*.spec.tsx\"\n - \"**/tests/**/*.ts\"\n - \"**/__tests__/**/*.ts\"\n\n# Service file patterns (where authz should be enforced)\nservicePatterns:\n - \"**/services/**/*.ts\"\n - \"**/service/**/*.ts\"\n - \"**/lib/**/*.ts\"\n - \"**/server/**/*.ts\"\n\n# Uncomment to disable specific invariants\n# disabledInvariants:\n# - \"TESTS.NO_FALSE_CONFIDENCE\"\n\n# Uncomment to only run specific invariants\n# enabledInvariants:\n# - \"AUTHZ.SERVICE_LAYER.ENFORCED\"\n`;\n\nconst PRE_COMMIT_HOOK = `#!/bin/sh\n# SecurityChecks pre-commit hook\n# https://securitychecks.ai/docs/hooks\n#\n# This hook runs scheck on changed files before each commit.\n# To skip this check for a single commit, use: git commit --no-verify\n\n# Check if scheck is available\nif ! command -v scheck &> /dev/null && ! npx scheck --version &> /dev/null 2>&1; then\n echo \"Warning: scheck not found. Install with: npm install -g @securitychecks/cli\"\n echo \"Skipping security checks...\"\n exit 0\nfi\n\necho \"Running SecurityChecks on staged files...\"\n\n# Run scheck on changed files only\n# --changed: only check files that differ from HEAD\n# --ci: fail on new violations\nif command -v scheck &> /dev/null; then\n scheck run --changed --ci\nelse\n npx scheck run --changed --ci\nfi\n\nexit_code=$?\n\nif [ $exit_code -ne 0 ]; then\n echo \"\"\n echo \"SecurityChecks found issues. Please fix them before committing.\"\n echo \"To skip this check once: git commit --no-verify\"\n echo \"\"\nfi\n\nexit $exit_code\n`;\n\nconst GITHUB_ACTION = `name: SecurityChecks\n\non:\n pull_request:\n branches: [main, master]\n push:\n branches: [main, master]\n\njobs:\n scheck:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Install dependencies\n run: npm ci\n\n - name: Run SecurityChecks\n run: npx -y -p @securitychecks/cli scheck run --ci\n`;\n\n/**\n * Install the pre-commit hook in the git repository\n */\nasync function installPreCommitHook(targetPath: string): Promise<void> {\n const gitDir = join(targetPath, '.git');\n\n // Check if this is a git repository\n if (!existsSync(gitDir)) {\n console.log(pc.yellow('⚠') + ' Not a git repository, skipping pre-commit hook');\n return;\n }\n\n const hooksDir = join(gitDir, 'hooks');\n const hookPath = join(hooksDir, 'pre-commit');\n\n // Create hooks directory if it doesn't exist\n if (!existsSync(hooksDir)) {\n await mkdir(hooksDir, { recursive: true });\n }\n\n // Check if pre-commit hook already exists\n if (existsSync(hookPath)) {\n // Read existing hook to see if it's ours or something else\n const existingHook = await import('fs').then((fs) =>\n fs.promises.readFile(hookPath, 'utf-8')\n );\n\n if (existingHook.includes('SecurityChecks pre-commit hook')) {\n console.log(pc.yellow('⚠') + ' Pre-commit hook already installed');\n return;\n }\n\n // Another hook exists - append our check\n console.log(pc.yellow('⚠') + ' Existing pre-commit hook found');\n console.log(pc.dim(' To integrate SecurityChecks, add this to your hook:'));\n console.log(pc.cyan(' scheck run --changed --ci'));\n return;\n }\n\n // Install fresh hook\n await writeFile(hookPath, PRE_COMMIT_HOOK);\n await chmod(hookPath, 0o755); // Make executable\n console.log(pc.green('✓') + ' Installed pre-commit hook');\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const targetPath = resolveTargetPath(options.path);\n\n console.log(pc.bold('\\n🔧 Initializing SecurityChecks for your project\\n'));\n\n try {\n // Create .scheck directory\n const scheckDir = join(targetPath, '.scheck');\n if (!existsSync(scheckDir)) {\n await mkdir(scheckDir, { recursive: true });\n console.log(pc.green('✓') + ' Created .scheck directory');\n }\n\n // Create config file\n const configPath = join(scheckDir, 'config.yaml');\n if (!existsSync(configPath)) {\n await writeFile(configPath, DEFAULT_CONFIG);\n console.log(pc.green('✓') + ' Created .scheck/config.yaml');\n } else {\n console.log(pc.yellow('⚠') + ' Config already exists, skipping');\n }\n\n // Create baseline file\n const baselinePath = join(scheckDir, 'baseline.json');\n if (!existsSync(baselinePath)) {\n const baseline = {\n version: '1.0',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n entries: [],\n };\n await writeFile(baselinePath, JSON.stringify(baseline, null, 2));\n console.log(pc.green('✓') + ' Created .scheck/baseline.json');\n } else {\n console.log(pc.yellow('⚠') + ' Baseline already exists, skipping');\n }\n\n // Create GitHub Action\n const workflowDir = join(targetPath, '.github', 'workflows');\n const workflowPath = join(workflowDir, 'scheck.yml');\n if (!existsSync(workflowPath)) {\n await mkdir(workflowDir, { recursive: true });\n await writeFile(workflowPath, GITHUB_ACTION);\n console.log(pc.green('✓') + ' Created .github/workflows/scheck.yml');\n } else {\n console.log(pc.yellow('⚠') + ' GitHub Action already exists, skipping');\n }\n\n // Install pre-commit hook if requested\n if (options.hooks) {\n await installPreCommitHook(targetPath);\n }\n\n // Add to .gitignore if needed\n const gitignorePath = join(targetPath, '.gitignore');\n if (existsSync(gitignorePath)) {\n const gitignore = await import('fs').then((fs) =>\n fs.promises.readFile(gitignorePath, 'utf-8')\n );\n if (!gitignore.includes('.scheck/cache')) {\n await import('fs').then((fs) =>\n fs.promises.appendFile(gitignorePath, '\\n# SecurityChecks\\n.scheck/cache/\\n')\n );\n console.log(pc.green('✓') + ' Updated .gitignore');\n }\n }\n\n console.log('');\n console.log(pc.green('✓ SecurityChecks is ready.'));\n console.log(pc.dim(' Catch what Copilot misses in your codebase.\\n'));\n console.log(pc.bold('Next steps:'));\n console.log('');\n console.log(' 1. Review the config at .scheck/config.yaml');\n console.log(' 2. Run your first scan:');\n console.log(pc.cyan(' scheck run'));\n console.log('');\n console.log(' 3. Fix any P0/P1 violations or add waivers');\n console.log(' 4. Commit the .scheck directory');\n console.log('');\n console.log(pc.dim('Learn more: https://securitychecks.ai/docs'));\n console.log('');\n } catch (error) {\n console.error(pc.red('\\nError initializing:'), error);\n process.exit(1);\n }\n}\n","/**\n * Audit API - Programmatic interface for running the staff check\n *\n * This module provides the core audit functionality that can be used by:\n * - CLI commands\n * - MCP server\n * - Programmatic integration\n *\n * SECURITY NOTE: All audit functions require cloud API authentication.\n * Detection logic runs server-side to protect IP.\n * See: docs/POST_MORTEM_001_ENGINE_EXPOSURE.md\n */\n\nimport {\n collect,\n resolveTargetPath,\n type AuditResult,\n type CollectorArtifact,\n type Artifact,\n} from '@securitychecks/collector';\nimport { getCloudApiKey, getCloudApiBaseUrl } from './lib/license.js';\nimport { evaluateCloud } from './lib/cloud-eval.js';\nimport { CLIError, ErrorCodes } from './lib/errors.js';\nimport { getProjectSlug } from './lib/project-slug.js';\n\n// NOTE: Engine import removed - detection runs server-side only\n// import { runAllCheckers } from '@securitychecks/engine';\n\nexport interface AuditOptions {\n /** Target path to audit (default: current directory) */\n targetPath?: string;\n /** Only run specific invariant checks by ID */\n only?: string[];\n /** Skip specific invariant checks by ID */\n skip?: string[];\n}\n\n/**\n * Convert CollectorArtifact to Artifact for checker compatibility\n */\nfunction toArtifact(collectorArtifact: CollectorArtifact): Artifact {\n return {\n version: '1.0',\n extractedAt: collectorArtifact.extractedAt,\n targetPath: collectorArtifact.codebase.root,\n services: collectorArtifact.services,\n authzCalls: collectorArtifact.authzCalls ?? [],\n cacheOperations: collectorArtifact.cacheOperations ?? [],\n transactionScopes: collectorArtifact.transactionScopes ?? [],\n webhookHandlers: collectorArtifact.webhookHandlers ?? [],\n jobHandlers: collectorArtifact.jobHandlers ?? [],\n membershipMutations: collectorArtifact.membershipMutations ?? [],\n tests: collectorArtifact.tests ?? [],\n routes: collectorArtifact.routes ?? [],\n dataFlows: collectorArtifact.dataFlows,\n callGraph: collectorArtifact.callGraph,\n };\n}\n\n/**\n * Run the full staff check audit\n *\n * This is the main programmatic API for running the staff check.\n * It performs two steps:\n * 1. Collect artifacts from the target codebase (facts)\n * 2. Send to cloud API for evaluation (findings)\n *\n * SECURITY: Detection logic runs server-side to protect IP.\n * An API key is required. Get one at https://securitychecks.ai/dashboard/settings/api-keys\n *\n * @example\n * ```ts\n * import { audit } from '@securitychecks/cli';\n *\n * // Requires SECURITYCHECKS_API_KEY environment variable\n * const result = await audit({\n * targetPath: '/path/to/codebase',\n * only: ['WEBHOOK.IDEMPOTENT'],\n * });\n *\n * console.log(result.summary);\n * ```\n */\nexport async function audit(options: AuditOptions = {}): Promise<AuditResult> {\n const startTime = Date.now();\n\n // SECURITY: Require API key - detection runs server-side to protect IP\n const apiKey = getCloudApiKey();\n if (!apiKey) {\n throw new CLIError(\n ErrorCodes.AUTH_REQUIRED,\n 'API key required for scanning',\n {\n details: {\n remediation: `Set SECURITYCHECKS_API_KEY environment variable.\nGet your API key at https://securitychecks.ai/dashboard/settings/api-keys\n\nFor air-gapped environments, contact sales@securitychecks.ai for enterprise options.`,\n },\n }\n );\n }\n\n const targetPath = resolveTargetPath(options.targetPath);\n\n // Step 1: Collect artifacts (facts) - runs locally\n const collectorArtifact = await collect({\n targetPath,\n profile: 'securitychecks',\n });\n\n // Step 2: Send to cloud for evaluation (findings) - runs server-side\n const cloudResult = await evaluateCloud(collectorArtifact, {\n apiKey,\n baseUrl: getCloudApiBaseUrl(),\n invariants: options.only,\n skip: options.skip,\n projectSlug: getProjectSlug(),\n });\n\n // Step 3: Convert to checker-compatible format for result\n const artifact = toArtifact(collectorArtifact);\n\n // Compute summary from cloud results\n const findings = cloudResult.findings;\n const byPriority = {\n P0: findings.filter((f) => f.severity === 'P0').length,\n P1: findings.filter((f) => f.severity === 'P1').length,\n P2: findings.filter((f) => f.severity === 'P2').length,\n };\n\n // Synthesize results format from cloud response\n const invariantIds = [...new Set(findings.map(f => f.invariantId))];\n const results = invariantIds.map(id => ({\n invariantId: id,\n passed: !findings.some(f => f.invariantId === id),\n findings: findings.filter(f => f.invariantId === id),\n checkedAt: new Date().toISOString(),\n duration: 0,\n }));\n\n const passed = results.filter((r) => r.passed).length;\n const failed = results.filter((r) => !r.passed).length;\n const waived = findings.filter((f) => f.waived).length;\n\n return {\n version: '1.0',\n targetPath,\n runAt: new Date().toISOString(),\n duration: Date.now() - startTime,\n summary: {\n total: cloudResult.stats.invariantsRun,\n passed,\n failed,\n waived,\n byPriority\n },\n results,\n artifact,\n };\n}\n","/**\n * Baseline Command\n *\n * Manages the baseline of known issues that should not fail CI.\n *\n * Usage:\n * scheck baseline --update # Add current findings to baseline\n * scheck baseline --show # Show current baseline\n * scheck baseline --prune # Remove stale entries\n */\n\nimport pc from 'picocolors';\nimport { resolve } from 'path';\nimport { createInterface } from 'readline';\nimport { audit } from '../audit.js';\nimport {\n loadBaseline,\n saveBaseline,\n addToBaseline,\n pruneBaseline,\n getBaselinePath,\n} from '../baseline/index.js';\nimport { generateFindingId } from '../findings/index.js';\n\nexport interface BaselineOptions {\n path?: string;\n update?: boolean;\n show?: boolean;\n prune?: boolean;\n pruneDays?: string;\n notes?: string;\n yes?: boolean;\n}\n\nexport async function baselineCommand(options: BaselineOptions): Promise<void> {\n const targetPath = resolve(options.path ?? process.cwd());\n\n if (options.show) {\n await showBaseline(targetPath);\n } else if (options.update) {\n await updateBaseline(targetPath, options.notes, options.yes ?? false);\n } else if (options.prune) {\n await pruneBaselineEntries(targetPath, parseInt(options.pruneDays ?? '90', 10));\n } else {\n // Default: show summary\n await showBaseline(targetPath);\n }\n}\n\nasync function showBaseline(targetPath: string): Promise<void> {\n const baseline = await loadBaseline(targetPath);\n const entries = Object.values(baseline.entries);\n\n if (entries.length === 0) {\n console.log(pc.dim('No baseline entries.'));\n console.log(pc.dim(`Run ${pc.bold('scheck baseline --update')} to add current findings.`));\n return;\n }\n\n console.log(pc.bold(`Baseline: ${entries.length} entries`));\n console.log(pc.dim(`Schema version: ${baseline.schemaVersion}`));\n console.log(pc.dim(`Last updated: ${baseline.updatedAt}`));\n console.log(pc.dim(`Path: ${getBaselinePath(targetPath)}`));\n console.log();\n\n // Group by invariant\n const byInvariant = new Map<string, typeof entries>();\n for (const entry of entries) {\n const list = byInvariant.get(entry.invariantId) ?? [];\n list.push(entry);\n byInvariant.set(entry.invariantId, list);\n }\n\n for (const [invariantId, invariantEntries] of byInvariant) {\n console.log(pc.cyan(`${invariantId} (${invariantEntries.length})`));\n for (const entry of invariantEntries.slice(0, 5)) {\n const symbol = entry.symbol ? `:${entry.symbol}` : '';\n console.log(` ${pc.dim('•')} ${entry.file}${symbol}`);\n if (entry.notes) {\n console.log(` ${pc.dim(entry.notes)}`);\n }\n }\n if (invariantEntries.length > 5) {\n console.log(pc.dim(` ... and ${invariantEntries.length - 5} more`));\n }\n }\n}\n\nasync function updateBaseline(targetPath: string, notes?: string, skipConfirmation = false): Promise<void> {\n console.log(pc.dim('Running audit to collect current findings...'));\n\n // Run audit to get current findings\n const result = await audit({\n targetPath,\n });\n\n const baseline = await loadBaseline(targetPath);\n const findings = result.results.flatMap((r) => r.findings);\n\n if (findings.length === 0) {\n console.log(pc.green('No findings to baseline.'));\n return;\n }\n\n // Check which findings are new (not already in baseline)\n const newFindings = findings.filter((f) => {\n const findingId = generateFindingId(f);\n return !(findingId in baseline.entries);\n });\n\n if (newFindings.length === 0) {\n console.log(pc.green('All findings are already in the baseline.'));\n return;\n }\n\n // Show what will be added\n console.log();\n console.log(pc.yellow(`About to add ${newFindings.length} finding(s) to the baseline:`));\n console.log();\n\n // Group by invariant for display\n const byInvariant = new Map<string, typeof newFindings>();\n for (const finding of newFindings) {\n const list = byInvariant.get(finding.invariantId) ?? [];\n list.push(finding);\n byInvariant.set(finding.invariantId, list);\n }\n\n for (const [invariantId, invariantFindings] of byInvariant) {\n console.log(pc.cyan(` ${invariantId} (${invariantFindings.length})`));\n for (const finding of invariantFindings.slice(0, 3)) {\n const evidence = finding.evidence[0];\n const location = evidence ? `${evidence.file}:${evidence.line}` : 'unknown';\n console.log(pc.dim(` • ${location}`));\n }\n if (invariantFindings.length > 3) {\n console.log(pc.dim(` ... and ${invariantFindings.length - 3} more`));\n }\n }\n console.log();\n\n // Ask for confirmation unless --yes\n if (!skipConfirmation && !isNonInteractive()) {\n const confirmed = await confirm(\n `Add ${newFindings.length} finding(s) to baseline? This will suppress them in CI. [y/N] `\n );\n if (!confirmed) {\n console.log(pc.dim('Cancelled.'));\n return;\n }\n }\n\n const added = addToBaseline(baseline, findings, notes);\n await saveBaseline(targetPath, baseline);\n\n console.log(pc.green(`✓ Baseline updated`));\n console.log(` ${pc.bold(added.toString())} new entries added`);\n console.log(` ${pc.dim(Object.keys(baseline.entries).length.toString())} total entries`);\n console.log(` ${pc.dim(`Path: ${getBaselinePath(targetPath)}`)}`);\n}\n\n/**\n * Check if running in a non-interactive environment (CI, piped input, etc.)\n */\nfunction isNonInteractive(): boolean {\n return !process.stdin.isTTY || !!process.env['CI'];\n}\n\n/**\n * Prompt the user for confirmation.\n */\nasync function confirm(message: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(message, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\nasync function pruneBaselineEntries(targetPath: string, staleDays: number): Promise<void> {\n const baseline = await loadBaseline(targetPath);\n const beforeCount = Object.keys(baseline.entries).length;\n\n const removed = pruneBaseline(baseline, staleDays);\n\n if (removed === 0) {\n console.log(pc.dim(`No entries older than ${staleDays} days.`));\n return;\n }\n\n await saveBaseline(targetPath, baseline);\n\n console.log(pc.green(`✓ Pruned ${removed} stale entries`));\n console.log(` ${pc.dim(`${beforeCount} → ${Object.keys(baseline.entries).length} entries`)}`);\n}\n","/**\n * Waiver Command\n *\n * Manages temporary waivers for findings that need to be fixed later.\n *\n * Usage:\n * scheck waive FINDING_ID --reason-key will_fix_later --reason \"...\" --expires 30d\n * scheck waiver --show # Show current waivers\n * scheck waiver --expiring # Show waivers expiring soon\n * scheck waiver --prune # Remove expired waivers\n */\n\nimport pc from 'picocolors';\nimport { resolve } from 'path';\nimport { audit } from '../audit.js';\nimport {\n loadWaivers,\n saveWaivers,\n addWaiver,\n pruneExpiredWaivers,\n getExpiringWaivers,\n getWaiverPath,\n WAIVER_REASON_KEYS,\n isValidWaiverReasonKey,\n} from '../baseline/index.js';\nimport { generateFindingId } from '../findings/index.js';\n\nexport interface WaiverOptions {\n path?: string;\n show?: boolean;\n expiring?: boolean;\n prune?: boolean;\n expiringDays?: string;\n}\n\nexport interface WaiveOptions {\n path?: string;\n reason?: string;\n reasonKey?: string;\n expires?: string;\n owner?: string;\n}\n\nexport async function waiverCommand(options: WaiverOptions): Promise<void> {\n const targetPath = resolve(options.path ?? process.cwd());\n\n if (options.expiring) {\n await showExpiringWaivers(targetPath, parseInt(options.expiringDays ?? '7', 10));\n } else if (options.prune) {\n await pruneWaivers(targetPath);\n } else {\n // Default: show all waivers\n await showWaivers(targetPath);\n }\n}\n\nexport async function waiveCommand(findingIdOrInvariant: string, options: WaiveOptions): Promise<void> {\n const targetPath = resolve(options.path ?? process.cwd());\n\n // Validate required options\n if (!options.reason) {\n console.error(pc.red('Error: --reason is required'));\n console.log(\n pc.dim('Example: scheck waive WEBHOOK.IDEMPOTENT:abc123 --reason-key will_fix_later --reason \"Fixing in sprint 42\"')\n );\n process.exit(1);\n }\n\n let reasonKey: import('../baseline/index.js').WaiverReasonKey | undefined;\n if (options.reasonKey) {\n if (!isValidWaiverReasonKey(options.reasonKey)) {\n console.error(pc.red(`Error: Invalid --reason-key \"${options.reasonKey}\"`));\n console.log(pc.dim(`Valid reason keys: ${WAIVER_REASON_KEYS.join(', ')}`));\n process.exit(1);\n }\n reasonKey = options.reasonKey;\n }\n\n // Parse expiration\n const expiresInDays = parseExpiration(options.expires ?? '30d');\n if (expiresInDays === null) {\n console.error(pc.red('Error: Invalid --expires format. Use: 7d, 30d, 90d, etc.'));\n process.exit(1);\n }\n\n // Get owner\n const owner = options.owner ?? process.env['USER'] ?? process.env['USERNAME'] ?? 'unknown';\n\n // If it's a full findingId (has :hash), find the matching finding\n // Otherwise, run audit and let user pick\n if (findingIdOrInvariant.includes(':')) {\n await waiveByFindingId(targetPath, findingIdOrInvariant, {\n reason: options.reason,\n reasonKey,\n owner,\n expiresInDays,\n });\n } else {\n await waiveByInvariant(targetPath, findingIdOrInvariant, {\n reason: options.reason,\n reasonKey,\n owner,\n expiresInDays,\n });\n }\n}\n\nasync function showWaivers(targetPath: string): Promise<void> {\n const waivers = await loadWaivers(targetPath);\n const entries = Object.values(waivers.entries);\n\n if (entries.length === 0) {\n console.log(pc.dim('No active waivers.'));\n return;\n }\n\n console.log(pc.bold(`Waivers: ${entries.length} active`));\n console.log(pc.dim(`Schema version: ${waivers.schemaVersion}`));\n console.log(pc.dim(`Path: ${getWaiverPath(targetPath)}`));\n console.log();\n\n // Sort by expiration\n entries.sort((a, b) => a.expiresAt.localeCompare(b.expiresAt));\n\n for (const entry of entries) {\n const expiresIn = getExpiresInLabel(entry.expiresAt);\n const isExpiringSoon = new Date(entry.expiresAt) < new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);\n\n console.log(pc.cyan(entry.findingId));\n console.log(` ${pc.dim('File:')} ${entry.file}${entry.symbol ? `:${entry.symbol}` : ''}`);\n console.log(` ${pc.dim('Reason:')} ${entry.reason}`);\n if (entry.reasonKey) {\n console.log(` ${pc.dim('Reason Key:')} ${entry.reasonKey}`);\n }\n console.log(` ${pc.dim('Owner:')} ${entry.owner}`);\n console.log(` ${pc.dim('Expires:')} ${isExpiringSoon ? pc.yellow(expiresIn) : expiresIn}`);\n console.log();\n }\n}\n\nasync function showExpiringWaivers(targetPath: string, withinDays: number): Promise<void> {\n const waivers = await loadWaivers(targetPath);\n const expiring = getExpiringWaivers(waivers, withinDays);\n\n if (expiring.length === 0) {\n console.log(pc.dim(`No waivers expiring within ${withinDays} days.`));\n return;\n }\n\n console.log(pc.yellow(`⚠ ${expiring.length} waiver(s) expiring within ${withinDays} days:`));\n console.log();\n\n for (const entry of expiring) {\n const expiresIn = getExpiresInLabel(entry.expiresAt);\n console.log(pc.yellow(entry.findingId));\n console.log(` ${pc.dim('File:')} ${entry.file}`);\n console.log(` ${pc.dim('Owner:')} ${entry.owner}`);\n console.log(` ${pc.dim('Expires:')} ${expiresIn}`);\n console.log();\n }\n}\n\nasync function pruneWaivers(targetPath: string): Promise<void> {\n const waivers = await loadWaivers(targetPath);\n const beforeCount = Object.keys(waivers.entries).length;\n\n const removed = pruneExpiredWaivers(waivers);\n\n if (removed === 0) {\n console.log(pc.dim('No expired waivers to remove.'));\n return;\n }\n\n await saveWaivers(targetPath, waivers);\n\n console.log(pc.green(`✓ Removed ${removed} expired waivers`));\n console.log(` ${pc.dim(`${beforeCount} → ${Object.keys(waivers.entries).length} waivers`)}`);\n}\n\nasync function waiveByFindingId(\n targetPath: string,\n findingId: string,\n options: {\n reason: string;\n reasonKey?: import('../baseline/index.js').WaiverReasonKey;\n owner: string;\n expiresInDays: number;\n }\n): Promise<void> {\n // Run audit to find the matching finding\n console.log(pc.dim('Finding matching issue...'));\n\n const result = await audit({ targetPath });\n const findings = result.results.flatMap((r) => r.findings);\n const normalizedId = findingId.split(':').slice(0, 2).join(':');\n const matching = findings.find((f) => generateFindingId(f) === normalizedId);\n\n if (!matching) {\n console.error(pc.red(`Error: No finding found matching ${findingId}`));\n console.log(pc.dim('Run `scheck run` to see current findings.'));\n process.exit(1);\n }\n\n const waivers = await loadWaivers(targetPath);\n const entry = addWaiver(waivers, matching, options);\n await saveWaivers(targetPath, waivers);\n\n console.log(pc.green(`✓ Waiver created`));\n console.log(` ${pc.dim('Finding:')} ${entry.findingId}`);\n console.log(` ${pc.dim('Reason:')} ${entry.reason}`);\n if (entry.reasonKey) {\n console.log(` ${pc.dim('Reason Key:')} ${entry.reasonKey}`);\n }\n console.log(` ${pc.dim('Expires:')} ${getExpiresInLabel(entry.expiresAt)}`);\n}\n\nasync function waiveByInvariant(\n targetPath: string,\n invariantId: string,\n options: {\n reason: string;\n reasonKey?: import('../baseline/index.js').WaiverReasonKey;\n owner: string;\n expiresInDays: number;\n }\n): Promise<void> {\n // Run audit to find findings for this invariant\n console.log(pc.dim('Finding matching issues...'));\n\n const result = await audit({ targetPath });\n const findings = result.results.flatMap((r) => r.findings);\n const matching = findings.filter((f) => f.invariantId === invariantId);\n\n if (matching.length === 0) {\n console.error(pc.red(`Error: No findings found for ${invariantId}`));\n console.log(pc.dim('Run `scheck run` to see current findings.'));\n process.exit(1);\n }\n\n const waivers = await loadWaivers(targetPath);\n\n for (const finding of matching) {\n addWaiver(waivers, finding, options);\n }\n\n await saveWaivers(targetPath, waivers);\n\n console.log(pc.green(`✓ Created ${matching.length} waiver(s) for ${invariantId}`));\n console.log(` ${pc.dim('Reason:')} ${options.reason}`);\n if (options.reasonKey) {\n console.log(` ${pc.dim('Reason Key:')} ${options.reasonKey}`);\n }\n console.log(` ${pc.dim('Expires:')} in ${options.expiresInDays} days`);\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction parseExpiration(value: string): number | null {\n const match = value.match(/^(\\d+)d$/i);\n if (!match) return null;\n const days = match[1];\n if (!days) return null;\n return parseInt(days, 10);\n}\n\nfunction getExpiresInLabel(expiresAt: string): string {\n const now = new Date();\n const expires = new Date(expiresAt);\n const diffMs = expires.getTime() - now.getTime();\n const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays < 0) return 'expired';\n if (diffDays === 0) return 'today';\n if (diffDays === 1) return 'tomorrow';\n return `in ${diffDays} days`;\n}\n","/**\n * Cloud API Client\n *\n * Client for interacting with the SecurityChecks.ai API\n */\n\nimport type { Finding } from '@securitychecks/collector';\nimport { CLIError, ErrorCodes } from './errors.js';\nimport { normalizeApiBaseUrl } from './cloud-config.js';\n\n/**\n * API response types\n */\nexport interface ProjectResponse {\n id: string;\n name: string;\n slug: string;\n organizationId: string;\n defaultBranch: string;\n}\n\nexport interface ScanResponse {\n id: string;\n projectId: string;\n status: 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED' | 'CANCELLED';\n branch?: string;\n commitSha?: string;\n startedAt?: string;\n completedAt?: string;\n}\n\nexport interface FindingSubmitResponse {\n created: number;\n updated: number;\n scanId: string;\n}\n\nexport interface UserInfoResponse {\n id: string;\n email: string;\n name?: string;\n organizations: Array<{\n id: string;\n name: string;\n slug: string;\n }>;\n}\n\nexport interface ValidateKeyResponse {\n valid: boolean;\n email?: string;\n organization?: string;\n plan?: string;\n}\n\n/** Default timeout for API requests (30 seconds) */\nconst DEFAULT_TIMEOUT_MS = 30000;\n\n/**\n * Cloud API client\n */\nexport class CloudApiClient {\n private apiUrl: string;\n private apiKey: string;\n private timeoutMs: number;\n\n constructor(apiUrl: string, apiKey: string, timeoutMs: number = DEFAULT_TIMEOUT_MS) {\n this.apiUrl = normalizeApiBaseUrl(apiUrl);\n this.apiKey = apiKey;\n this.timeoutMs = timeoutMs;\n }\n\n /**\n * Make an authenticated API request with timeout\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<T> {\n const url = `${this.apiUrl}/v1${path}`;\n\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `scheck-cli/${process.env['CLI_VERSION'] || '0.0.0'}`,\n };\n const bypassSecret = process.env['VERCEL_AUTOMATION_BYPASS_SECRET'];\n if (bypassSecret) {\n headers['x-vercel-protection-bypass'] = bypassSecret;\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage: string;\n\n try {\n const errorJson = JSON.parse(errorBody);\n const base = errorJson.error || errorJson.message || errorBody;\n const extra = errorJson.message && errorJson.error ? errorJson.message : undefined;\n const stage = typeof errorJson.stage === 'string' && errorJson.stage\n ? ` (stage: ${errorJson.stage})`\n : '';\n errorMessage = (extra ? `${base}: ${extra}` : base) + stage;\n } catch {\n errorMessage = errorBody || response.statusText;\n }\n\n if (response.status === 401) {\n throw new CLIError(\n ErrorCodes.CLOUD_AUTH_FAILED,\n 'Invalid or expired API key'\n );\n }\n\n if (response.status === 403) {\n throw new CLIError(\n ErrorCodes.CLOUD_PERMISSION_DENIED,\n `Permission denied: ${errorMessage}`\n );\n }\n\n if (response.status === 404) {\n throw new CLIError(\n ErrorCodes.CLOUD_NOT_FOUND,\n `Not found: ${errorMessage}`\n );\n }\n\n if (response.status === 429) {\n throw new CLIError(\n ErrorCodes.CLOUD_RATE_LIMITED,\n 'Rate limit exceeded. Please try again later.'\n );\n }\n\n throw new CLIError(\n ErrorCodes.CLOUD_API_ERROR,\n `API error (${response.status}): ${errorMessage}`\n );\n }\n\n const text = await response.text();\n if (!text) return {} as T;\n\n return JSON.parse(text) as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof CLIError) throw error;\n\n // Handle abort/timeout errors\n if (error instanceof Error && error.name === 'AbortError') {\n throw new CLIError(\n ErrorCodes.CLOUD_NETWORK_ERROR,\n `Request timeout: API did not respond within ${this.timeoutMs / 1000} seconds`\n );\n }\n\n if (error instanceof TypeError && error.message.includes('fetch')) {\n throw new CLIError(\n ErrorCodes.CLOUD_NETWORK_ERROR,\n `Network error: Unable to connect to ${this.apiUrl}`\n );\n }\n\n throw new CLIError(\n ErrorCodes.CLOUD_API_ERROR,\n `API request failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Validate the API key\n */\n async validateKey(): Promise<ValidateKeyResponse> {\n return this.request<ValidateKeyResponse>('GET', '/keys/validate');\n }\n\n /**\n * Get project by slug\n */\n async getProject(slug: string): Promise<ProjectResponse> {\n return this.request<ProjectResponse>('GET', `/projects?slug=${encodeURIComponent(slug)}`);\n }\n\n /**\n * Create a new scan\n */\n async createScan(data: {\n projectSlug: string;\n branch?: string;\n commitSha?: string;\n }): Promise<ScanResponse> {\n return this.request<ScanResponse>('POST', '/scans', data);\n }\n\n /**\n * Get scan status\n */\n async getScan(id: string): Promise<ScanResponse> {\n return this.request<ScanResponse>('GET', `/scans/${id}`);\n }\n\n /**\n * Update scan status\n */\n async updateScan(\n id: string,\n data: {\n status: 'COMPLETED' | 'FAILED' | 'CANCELLED';\n summary?: { p0: number; p1: number; p2: number };\n duration?: number;\n }\n ): Promise<ScanResponse> {\n return this.request<ScanResponse>('PATCH', `/scans/${id}`, data);\n }\n\n /**\n * Submit findings for a scan\n */\n async submitFindings(\n scanId: string,\n findings: Finding[]\n ): Promise<FindingSubmitResponse> {\n const formattedFindings = findings.map((f) => {\n // Get primary evidence location\n const primaryEvidence = f.evidence[0];\n\n return {\n invariantId: f.invariantId,\n severity: f.severity,\n title: f.message,\n description: f.requiredProof,\n filePath: primaryEvidence?.file,\n lineNumber: primaryEvidence?.line,\n snippet: primaryEvidence?.snippet,\n remediation: f.remediation,\n testSkeleton: f.suggestedTest,\n };\n });\n\n return this.request<FindingSubmitResponse>('POST', '/findings', {\n scanId,\n findings: formattedFindings,\n });\n }\n\n /**\n * Get user info\n */\n async getUserInfo(): Promise<UserInfoResponse> {\n return this.request<UserInfoResponse>('GET', '/user');\n }\n}\n\n/**\n * Create a cloud API client from configuration\n */\nexport function createCloudClient(\n apiUrl: string,\n apiKey: string\n): CloudApiClient {\n return new CloudApiClient(apiUrl, apiKey);\n}\n","/**\n * Login command - authenticate with SecurityChecks cloud\n */\n\nimport pc from 'picocolors';\nimport * as readline from 'node:readline/promises';\nimport { stdin as input, stdout as output } from 'node:process';\nimport {\n loadCloudConfig,\n updateCloudConfig,\n isValidApiKey,\n getApiUrl,\n formatConfig,\n} from '../lib/cloud-config.js';\nimport { createCloudClient } from '../lib/cloud-api.js';\nimport { CLIError, ErrorCodes } from '../lib/errors.js';\n\ninterface LoginOptions {\n apiKey?: string;\n apiUrl?: string;\n check?: boolean;\n}\n\n/**\n * Prompt user for API key interactively\n */\nasync function promptForApiKey(): Promise<string> {\n const rl = readline.createInterface({ input, output });\n\n console.log(pc.bold('\\nSecurityChecks Cloud Login\\n'));\n console.log(pc.dim('Get your API key at: https://securitychecks.ai/dashboard/settings/api-keys\\n'));\n\n try {\n const apiKey = await rl.question('API Key: ');\n return apiKey.trim();\n } finally {\n rl.close();\n }\n}\n\nexport async function loginCommand(options: LoginOptions): Promise<void> {\n try {\n // Load existing config\n const config = await loadCloudConfig();\n\n // Check current login status\n if (options.check) {\n if (!config.apiKey) {\n console.log(pc.yellow('Not logged in to SecurityChecks cloud.\\n'));\n console.log('Run `scheck login` to authenticate.');\n return;\n }\n\n const apiUrl = options.apiUrl || getApiUrl(config);\n const client = createCloudClient(apiUrl, config.apiKey);\n\n try {\n const result = await client.validateKey();\n if (result.valid) {\n console.log(pc.green('✓ Logged in to SecurityChecks cloud\\n'));\n console.log(formatConfig(config));\n } else {\n console.log(pc.yellow('API key is invalid or expired.\\n'));\n console.log('Run `scheck login` to re-authenticate.');\n }\n } catch (error) {\n if (error instanceof CLIError) {\n console.log(pc.red(`✗ ${error.message}\\n`));\n } else {\n console.log(pc.red('✗ Failed to validate API key\\n'));\n }\n }\n return;\n }\n\n // Get API key from options, env, or prompt\n let apiKey = options.apiKey || process.env['SECURITYCHECKS_API_KEY'];\n\n if (!apiKey) {\n apiKey = await promptForApiKey();\n }\n\n if (!apiKey) {\n console.log(pc.red('\\n✗ No API key provided.\\n'));\n process.exit(1);\n }\n\n // Validate key format\n if (!isValidApiKey(apiKey)) {\n throw new CLIError(\n ErrorCodes.CLOUD_INVALID_API_KEY,\n 'Invalid API key format. Keys should start with sc_live_ or sc_test_'\n );\n }\n\n // Determine API URL\n const apiUrl = options.apiUrl || getApiUrl(config);\n\n console.log(pc.dim(`\\nConnecting to ${apiUrl}...`));\n\n // Validate key with API\n const client = createCloudClient(apiUrl, apiKey);\n const result = await client.validateKey();\n\n if (!result.valid) {\n throw new CLIError(ErrorCodes.CLOUD_AUTH_FAILED, 'API key validation failed');\n }\n\n // Get user info\n const userInfo = await client.getUserInfo();\n\n // Save configuration\n await updateCloudConfig({\n apiKey,\n apiUrl: options.apiUrl || undefined, // Only save if explicitly provided\n email: userInfo.email,\n organization: userInfo.organizations[0]?.name,\n cloudEnabled: true,\n lastSync: new Date().toISOString(),\n });\n\n console.log(pc.green('\\n✓ Successfully logged in!\\n'));\n console.log(` Email: ${userInfo.email}`);\n if (userInfo.name) {\n console.log(` Name: ${userInfo.name}`);\n }\n if (userInfo.organizations.length > 0) {\n console.log(` Organization: ${userInfo.organizations[0]?.name}`);\n }\n console.log('');\n console.log(pc.dim('Cloud mode is now enabled by default.'));\n console.log(pc.dim('Run `scheck run --cloud` to sync findings.'));\n console.log('');\n } catch (error) {\n if (error instanceof CLIError) {\n console.error(pc.red(`\\n✗ ${error.message}\\n`));\n const remediation = error.getRemediation();\n if (remediation) {\n console.error(pc.yellow('How to fix:'));\n for (const line of remediation.split('\\n')) {\n console.error(pc.dim(` ${line}`));\n }\n console.error('');\n }\n } else {\n console.error(pc.red(`\\n✗ Login failed: ${error instanceof Error ? error.message : 'Unknown error'}\\n`));\n }\n process.exit(1);\n }\n}\n\nexport async function logoutCommand(): Promise<void> {\n const config = await loadCloudConfig();\n\n if (!config.apiKey) {\n console.log(pc.yellow('Not logged in to SecurityChecks cloud.\\n'));\n return;\n }\n\n await updateCloudConfig({\n apiKey: undefined,\n email: undefined,\n organization: undefined,\n cloudEnabled: false,\n lastSync: undefined,\n });\n\n console.log(pc.green('✓ Successfully logged out.\\n'));\n console.log(pc.dim('Cloud mode has been disabled.'));\n console.log('');\n}\n","/**\n * Config command - manage SecurityChecks cloud configuration\n */\n\nimport pc from 'picocolors';\nimport {\n loadCloudConfig,\n updateCloudConfig,\n clearCloudConfig,\n formatConfig,\n CONFIG_FILE,\n} from '../lib/cloud-config.js';\nimport { CLIError, ErrorCodes } from '../lib/errors.js';\n\ninterface ConfigOptions {\n show?: boolean;\n set?: string;\n unset?: string;\n clear?: boolean;\n project?: string;\n apiUrl?: string;\n cloudEnabled?: boolean;\n}\n\nconst ALLOWED_KEYS = ['project', 'apiUrl', 'cloudEnabled'] as const;\ntype AllowedKey = (typeof ALLOWED_KEYS)[number];\n\nfunction isAllowedKey(key: string): key is AllowedKey {\n return ALLOWED_KEYS.includes(key as AllowedKey);\n}\n\nexport async function configCommand(options: ConfigOptions): Promise<void> {\n try {\n const config = await loadCloudConfig();\n\n // Show current config\n if (options.show || Object.keys(options).length === 0) {\n console.log('');\n console.log(formatConfig(config));\n console.log('');\n console.log(pc.dim(`Config file: ${CONFIG_FILE}`));\n console.log('');\n return;\n }\n\n // Clear all configuration\n if (options.clear) {\n await clearCloudConfig();\n console.log(pc.green('✓ Configuration cleared.\\n'));\n return;\n }\n\n // Set a value\n if (options.set) {\n const [key, ...valueParts] = options.set.split('=');\n const value = valueParts.join('=');\n\n if (!key || !value) {\n throw new CLIError(\n ErrorCodes.CLI_INVALID_ARGUMENT,\n 'Set requires format: --set key=value'\n );\n }\n\n if (!isAllowedKey(key)) {\n throw new CLIError(\n ErrorCodes.CLI_INVALID_ARGUMENT,\n `Invalid config key: ${key}. Allowed keys: ${ALLOWED_KEYS.join(', ')}`\n );\n }\n\n // Handle boolean values\n let parsedValue: string | boolean = value;\n if (key === 'cloudEnabled') {\n parsedValue = value === 'true' || value === '1';\n }\n\n await updateCloudConfig({ [key]: parsedValue });\n console.log(pc.green(`✓ Set ${key} = ${parsedValue}\\n`));\n return;\n }\n\n // Unset a value\n if (options.unset) {\n const key = options.unset;\n\n if (!isAllowedKey(key)) {\n throw new CLIError(\n ErrorCodes.CLI_INVALID_ARGUMENT,\n `Invalid config key: ${key}. Allowed keys: ${ALLOWED_KEYS.join(', ')}`\n );\n }\n\n await updateCloudConfig({ [key]: undefined });\n console.log(pc.green(`✓ Unset ${key}\\n`));\n return;\n }\n\n // Shorthand options for common settings\n if (options.project !== undefined) {\n await updateCloudConfig({ project: options.project });\n console.log(pc.green(`✓ Set project = ${options.project}\\n`));\n }\n\n if (options.apiUrl !== undefined) {\n await updateCloudConfig({ apiUrl: options.apiUrl });\n console.log(pc.green(`✓ Set apiUrl = ${options.apiUrl}\\n`));\n }\n\n if (options.cloudEnabled !== undefined) {\n await updateCloudConfig({ cloudEnabled: options.cloudEnabled });\n console.log(pc.green(`✓ Set cloudEnabled = ${options.cloudEnabled}\\n`));\n }\n } catch (error) {\n if (error instanceof CLIError) {\n console.error(pc.red(`\\n✗ ${error.message}\\n`));\n const remediation = error.getRemediation();\n if (remediation) {\n console.error(pc.yellow('How to fix:'));\n for (const line of remediation.split('\\n')) {\n console.error(pc.dim(` ${line}`));\n }\n console.error('');\n }\n } else {\n console.error(pc.red(`\\n✗ Config failed: ${error instanceof Error ? error.message : 'Unknown error'}\\n`));\n }\n process.exit(1);\n }\n}\n","/**\n * Sync command - sync scan results to SecurityChecks cloud\n */\n\nimport pc from 'picocolors';\nimport { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { Finding } from '@securitychecks/collector';\nimport {\n loadCloudConfig,\n updateCloudConfig,\n getApiUrl,\n getProject,\n getApiKey,\n} from '../lib/cloud-config.js';\nimport { createCloudClient } from '../lib/cloud-api.js';\nimport { CLIError, ErrorCodes } from '../lib/errors.js';\n\ninterface SyncOptions {\n project?: string;\n branch?: string;\n commit?: string;\n findings?: string;\n dryRun?: boolean;\n}\n\n/** Default findings file path */\nconst DEFAULT_FINDINGS_PATH = '.securitychecks/results.json';\n\ninterface ScanResults {\n targetPath: string;\n runAt: string;\n duration: number;\n summary: {\n total: number;\n passed: number;\n failed: number;\n waived: number;\n byPriority: { P0: number; P1: number; P2: number };\n };\n results: Array<{\n invariantId: string;\n findings: Finding[];\n }>;\n}\n\n/**\n * Load scan results from file\n */\nasync function loadResults(findingsPath: string): Promise<ScanResults> {\n const fullPath = resolve(findingsPath);\n\n if (!existsSync(fullPath)) {\n throw new CLIError(\n ErrorCodes.ARTIFACT_NOT_FOUND,\n `Results file not found: ${fullPath}`\n );\n }\n\n try {\n const content = await readFile(fullPath, 'utf-8');\n return JSON.parse(content) as ScanResults;\n } catch (error) {\n throw new CLIError(\n ErrorCodes.ARTIFACT_INVALID,\n `Failed to parse results: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n\n/**\n * Try to detect git branch and commit\n */\nasync function detectGitInfo(targetPath: string): Promise<{ branch?: string; commit?: string }> {\n try {\n const { execSync } = await import('node:child_process');\n\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd: targetPath,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const commit = execSync('git rev-parse HEAD', {\n cwd: targetPath,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n return { branch, commit };\n } catch {\n return {};\n }\n}\n\nexport async function syncCommand(options: SyncOptions): Promise<void> {\n try {\n const config = await loadCloudConfig();\n const apiKey = getApiKey(options.project) || config.apiKey;\n\n if (!apiKey) {\n throw new CLIError(\n ErrorCodes.CLOUD_AUTH_FAILED,\n 'Not logged in. Run `scheck login` first.'\n );\n }\n\n const projectSlug = getProject(options.project) || config.project;\n\n if (!projectSlug) {\n throw new CLIError(\n ErrorCodes.CLI_MISSING_ARGUMENT,\n 'No project specified. Use --project or set default with `scheck config --set project=<slug>`'\n );\n }\n\n // Load results\n const findingsPath = options.findings || DEFAULT_FINDINGS_PATH;\n console.log(pc.dim(`Loading results from ${findingsPath}...`));\n\n const results = await loadResults(findingsPath);\n const allFindings = results.results.flatMap((r) => r.findings);\n\n // Detect git info\n const gitInfo = await detectGitInfo(results.targetPath);\n const branch = options.branch || gitInfo.branch;\n const commitSha = options.commit || gitInfo.commit;\n\n console.log('');\n console.log(pc.bold('Sync Summary:'));\n console.log(` Project: ${projectSlug}`);\n console.log(` Branch: ${branch || '(none)'}`);\n console.log(` Commit: ${commitSha ? commitSha.substring(0, 8) : '(none)'}`);\n console.log(` Findings: ${allFindings.length}`);\n console.log(` P0: ${results.summary.byPriority.P0}, P1: ${results.summary.byPriority.P1}, P2: ${results.summary.byPriority.P2}`);\n console.log('');\n\n if (options.dryRun) {\n console.log(pc.yellow('Dry run - no changes made.\\n'));\n return;\n }\n\n const apiUrl = getApiUrl(config);\n const client = createCloudClient(apiUrl, apiKey);\n\n // Create scan\n console.log(pc.dim('Creating scan...'));\n const scan = await client.createScan({\n projectSlug,\n branch,\n commitSha,\n });\n\n console.log(pc.dim(`Scan created: ${scan.id}`));\n\n // Submit findings\n if (allFindings.length > 0) {\n console.log(pc.dim('Submitting findings...'));\n const submitResult = await client.submitFindings(scan.id, allFindings);\n console.log(pc.dim(`Created: ${submitResult.created}, Updated: ${submitResult.updated}`));\n }\n\n // Mark scan complete\n console.log(pc.dim('Completing scan...'));\n await client.updateScan(scan.id, {\n status: 'COMPLETED',\n summary: {\n p0: results.summary.byPriority.P0,\n p1: results.summary.byPriority.P1,\n p2: results.summary.byPriority.P2,\n },\n duration: results.duration,\n });\n\n // Update last sync timestamp\n await updateCloudConfig({ lastSync: new Date().toISOString() });\n\n console.log(pc.green('\\n✓ Sync complete!\\n'));\n console.log(pc.dim(`View at: https://securitychecks.ai/dashboard/scans/${scan.id}`));\n console.log('');\n } catch (error) {\n if (error instanceof CLIError) {\n console.error(pc.red(`\\n✗ ${error.message}\\n`));\n const remediation = error.getRemediation();\n if (remediation) {\n console.error(pc.yellow('How to fix:'));\n for (const line of remediation.split('\\n')) {\n console.error(pc.dim(` ${line}`));\n }\n console.error('');\n }\n } else {\n console.error(pc.red(`\\n✗ Sync failed: ${error instanceof Error ? error.message : 'Unknown error'}\\n`));\n }\n process.exit(1);\n }\n}\n","/**\n * Hooks command - manage git hooks for SecurityChecks\n */\n\nimport { writeFile, mkdir, chmod, unlink, readFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport pc from 'picocolors';\nimport { resolveTargetPath } from '@securitychecks/collector';\n\ninterface HooksOptions {\n path?: string;\n install?: boolean;\n uninstall?: boolean;\n show?: boolean;\n}\n\nconst PRE_COMMIT_HOOK = `#!/bin/sh\n# SecurityChecks pre-commit hook\n# https://securitychecks.ai/docs/hooks\n#\n# This hook runs scheck on changed files before each commit.\n# To skip this check for a single commit, use: git commit --no-verify\n\n# Check if scheck is available\nif ! command -v scheck &> /dev/null && ! npx scheck --version &> /dev/null 2>&1; then\n echo \"Warning: scheck not found. Install with: npm install -g @securitychecks/cli\"\n echo \"Skipping security checks...\"\n exit 0\nfi\n\necho \"Running SecurityChecks on staged files...\"\n\n# Run scheck on changed files only\n# --changed: only check files that differ from HEAD\n# --ci: fail on new violations\nif command -v scheck &> /dev/null; then\n scheck run --changed --ci\nelse\n npx scheck run --changed --ci\nfi\n\nexit_code=$?\n\nif [ $exit_code -ne 0 ]; then\n echo \"\"\n echo \"SecurityChecks found issues. Please fix them before committing.\"\n echo \"To skip this check once: git commit --no-verify\"\n echo \"\"\nfi\n\nexit $exit_code\n`;\n\nexport async function hooksCommand(options: HooksOptions): Promise<void> {\n const targetPath = resolveTargetPath(options.path);\n const gitDir = join(targetPath, '.git');\n\n // Check if this is a git repository\n if (!existsSync(gitDir)) {\n console.error(pc.red('Error:') + ' Not a git repository');\n process.exit(1);\n }\n\n const hooksDir = join(gitDir, 'hooks');\n const hookPath = join(hooksDir, 'pre-commit');\n\n // Default to --show if no action specified\n if (!options.install && !options.uninstall) {\n options.show = true;\n }\n\n if (options.show) {\n console.log(pc.bold('\\nSecurityChecks Git Hooks\\n'));\n\n if (existsSync(hookPath)) {\n const hookContent = await readFile(hookPath, 'utf-8');\n if (hookContent.includes('SecurityChecks pre-commit hook')) {\n console.log(pc.green('✓') + ' Pre-commit hook is installed');\n console.log(pc.dim(` Location: ${hookPath}`));\n } else {\n console.log(pc.yellow('⚠') + ' Pre-commit hook exists but is not SecurityChecks');\n console.log(pc.dim(' Use --install to add SecurityChecks to your workflow'));\n }\n } else {\n console.log(pc.dim('○') + ' Pre-commit hook is not installed');\n console.log(pc.dim(' Use --install to install it'));\n }\n console.log('');\n return;\n }\n\n if (options.install) {\n // Create hooks directory if it doesn't exist\n if (!existsSync(hooksDir)) {\n await mkdir(hooksDir, { recursive: true });\n }\n\n // Check if hook already exists\n if (existsSync(hookPath)) {\n const existingHook = await readFile(hookPath, 'utf-8');\n\n if (existingHook.includes('SecurityChecks pre-commit hook')) {\n console.log(pc.yellow('⚠') + ' Pre-commit hook already installed');\n return;\n }\n\n // Another hook exists\n console.log(pc.yellow('⚠') + ' Existing pre-commit hook found');\n console.log(pc.dim(' To manually integrate, add this to your hook:'));\n console.log(pc.cyan(' scheck run --changed --ci'));\n console.log('');\n console.log(pc.dim(' Or use --uninstall first to replace the existing hook'));\n return;\n }\n\n // Install fresh hook\n await writeFile(hookPath, PRE_COMMIT_HOOK);\n await chmod(hookPath, 0o755);\n console.log(pc.green('✓') + ' Installed pre-commit hook');\n console.log(pc.dim(' SecurityChecks will run on staged files before each commit'));\n console.log(pc.dim(' To skip: git commit --no-verify'));\n return;\n }\n\n if (options.uninstall) {\n if (!existsSync(hookPath)) {\n console.log(pc.yellow('⚠') + ' No pre-commit hook found');\n return;\n }\n\n const hookContent = await readFile(hookPath, 'utf-8');\n if (!hookContent.includes('SecurityChecks pre-commit hook')) {\n console.log(pc.yellow('⚠') + ' Pre-commit hook is not a SecurityChecks hook');\n console.log(pc.dim(' Not removing to avoid breaking your existing hook'));\n return;\n }\n\n await unlink(hookPath);\n console.log(pc.green('✓') + ' Uninstalled pre-commit hook');\n return;\n }\n}\n","/**\n * Finding Feedback Client\n *\n * Reports finding quality feedback (TP/FP verdicts) to the SecurityChecks SaaS.\n * Privacy-preserving: sends only invariantId + verdict + predefined reason enum.\n * No source code, no file paths, no PII.\n */\n\nconst DEFAULT_ENDPOINT = 'https://api.securitychecks.ai/v1/feedback';\n\nexport function buildFeedbackEndpoint(apiBaseUrl: string): string {\n const base = apiBaseUrl.trim().replace(/\\/$/, '');\n let url: URL;\n try {\n url = new URL(base);\n } catch {\n return `${base}/v1/feedback`;\n }\n\n const host = url.hostname.toLowerCase();\n const isApiHost = host.startsWith('api.') || host === 'api.securitychecks.ai';\n const suffix = isApiHost ? '/v1/feedback' : '/api/v1/feedback';\n\n const basePath = url.pathname.replace(/\\/$/, '');\n url.pathname = `${basePath}${suffix}`;\n return url.toString();\n}\n\nexport interface FeedbackPayload {\n invariantId: string;\n verdict: 'true_positive' | 'false_positive';\n reason?: 'not_applicable' | 'acceptable_risk' | 'wrong_location' | 'outdated_pattern' | 'missing_context';\n framework?: string;\n clientVersion: string;\n}\n\nexport interface FeedbackConfig {\n enabled: boolean;\n endpoint?: string;\n apiKey?: string;\n timeout?: number;\n}\n\n/**\n * Report finding feedback to the SaaS\n *\n * Follows the same fire-and-forget pattern as correlation-telemetry.ts:\n * AbortController with timeout, silent failures.\n */\nexport async function reportFeedback(\n payload: FeedbackPayload,\n config: FeedbackConfig\n): Promise<boolean> {\n if (!config.enabled) {\n return true;\n }\n\n const endpoint = config.endpoint ?? DEFAULT_ENDPOINT;\n const timeout = config.timeout ?? 5000;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.apiKey && { Authorization: `Bearer ${config.apiKey}` }),\n ...(process.env['VERCEL_AUTOMATION_BYPASS_SECRET'] && {\n 'x-vercel-protection-bypass': process.env['VERCEL_AUTOMATION_BYPASS_SECRET'],\n }),\n 'X-Client-Version': payload.clientVersion,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n return response.ok;\n } finally {\n clearTimeout(timeoutId);\n }\n } catch {\n // Feedback failures are silent - shouldn't break CLI\n return false;\n }\n}\n\nexport const VALID_REASONS = [\n 'not_applicable',\n 'acceptable_risk',\n 'wrong_location',\n 'outdated_pattern',\n 'missing_context',\n] as const;\n\nexport type FeedbackReason = (typeof VALID_REASONS)[number];\n\nexport function isValidReason(reason: string): reason is FeedbackReason {\n return (VALID_REASONS as readonly string[]).includes(reason);\n}\n","/**\n * Feedback Command\n *\n * Report whether a finding was a true positive or false positive.\n * Improves pattern accuracy over time.\n *\n * Usage:\n * scheck feedback AUTHZ.SERVICE_LAYER.ENFORCED --verdict fp --reason not_applicable\n * scheck feedback WEBHOOK.IDEMPOTENT --verdict tp\n */\n\nimport pc from 'picocolors';\nimport {\n reportFeedback,\n isValidReason,\n VALID_REASONS,\n buildFeedbackEndpoint,\n type FeedbackConfig,\n type FeedbackReason,\n} from '../lib/feedback.js';\nimport { isTelemetryDisabled } from '../lib/telemetry.js';\nimport { getApiUrl, loadCloudConfig } from '../lib/cloud-config.js';\n\nexport interface FeedbackOptions {\n path?: string;\n verdict: string;\n reason?: string;\n endpoint?: string;\n}\n\nconst VERDICT_MAP: Record<string, 'true_positive' | 'false_positive'> = {\n tp: 'true_positive',\n true_positive: 'true_positive',\n fp: 'false_positive',\n false_positive: 'false_positive',\n};\n\nexport async function feedbackCommand(\n invariantIdOrFindingId: string,\n options: FeedbackOptions\n): Promise<void> {\n // Validate verdict\n const verdict = VERDICT_MAP[options.verdict];\n if (!verdict) {\n console.error(pc.red(`Error: Invalid verdict \"${options.verdict}\"`));\n console.log(pc.dim('Valid values: tp, fp, true_positive, false_positive'));\n process.exit(1);\n }\n\n // Validate reason if provided\n if (options.reason && !isValidReason(options.reason)) {\n console.error(pc.red(`Error: Invalid reason \"${options.reason}\"`));\n console.log(pc.dim(`Valid reasons: ${VALID_REASONS.join(', ')}`));\n process.exit(1);\n }\n\n const reason = options.reason as FeedbackReason | undefined;\n\n // Extract invariant ID (strip hash suffix if present)\n const invariantId = invariantIdOrFindingId.includes(':')\n ? invariantIdOrFindingId.split(':').slice(0, -1).join(':')\n : invariantIdOrFindingId;\n\n // Check telemetry opt-out\n if (isTelemetryDisabled()) {\n console.log(pc.yellow('Telemetry is disabled. Feedback will not be sent.'));\n console.log(pc.dim('Unset SECURITYCHECKS_TELEMETRY=false or DO_NOT_TRACK=1 to enable.'));\n return;\n }\n\n // Build config from cloud settings\n const cloudConfig = await loadCloudConfig();\n const endpointOverride =\n options.endpoint || process.env['SECURITYCHECKS_FEEDBACK_URL'];\n let endpoint = endpointOverride;\n if (!endpoint) {\n try {\n endpoint = buildFeedbackEndpoint(getApiUrl(cloudConfig));\n } catch {\n endpoint = undefined;\n }\n }\n const feedbackConfig: FeedbackConfig = {\n enabled: true,\n apiKey: cloudConfig.apiKey ?? undefined,\n endpoint,\n timeout: 5000,\n };\n\n const clientVersion = process.env['CLI_VERSION'] ?? '0.0.0-dev';\n\n console.log(pc.dim('Sending feedback...'));\n\n const success = await reportFeedback(\n {\n invariantId,\n verdict,\n reason,\n clientVersion,\n },\n feedbackConfig\n );\n\n if (success) {\n const verdictLabel = verdict === 'true_positive' ? pc.green('true positive') : pc.red('false positive');\n console.log(pc.green('✓ Feedback recorded'));\n console.log(` ${pc.dim('Invariant:')} ${invariantId}`);\n console.log(` ${pc.dim('Verdict:')} ${verdictLabel}`);\n if (reason) {\n console.log(` ${pc.dim('Reason:')} ${reason}`);\n }\n } else {\n console.error(pc.red('Failed to send feedback. The API may be unreachable.'));\n process.exit(1);\n }\n}\n","/**\n * List invariants command\n *\n * Prints all supported invariants (optionally filtered), for scripting and discovery.\n */\n\nimport pc from 'picocolors';\nimport { ALL_INVARIANTS } from '@securitychecks/collector';\nimport { getStaffQuestion } from '../lib/staff.js';\n\nexport interface ListInvariantsOptions {\n category?: string;\n severity?: 'P0' | 'P1' | 'P2';\n json?: boolean;\n}\n\nexport async function listInvariantsCommand(options: ListInvariantsOptions): Promise<void> {\n const category = options.category?.trim();\n const severity = options.severity?.trim() as ListInvariantsOptions['severity'] | undefined;\n\n let invariants = ALL_INVARIANTS;\n if (category) invariants = invariants.filter((i) => i.category === category);\n if (severity) invariants = invariants.filter((i) => i.severity === severity);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n invariants.map((i) => ({\n id: i.id,\n name: i.name,\n severity: i.severity,\n category: i.category,\n staff_engineer_asks: getStaffQuestion(i.id),\n })),\n null,\n 2\n )\n );\n return;\n }\n\n if (category || severity) {\n console.log(pc.dim(`Filters: ${category ? `category=${category}` : ''}${category && severity ? ', ' : ''}${severity ? `severity=${severity}` : ''}`));\n console.log('');\n }\n\n for (const inv of invariants) {\n const severityColor =\n inv.severity === 'P0' ? pc.red : inv.severity === 'P1' ? pc.yellow : pc.blue;\n console.log(` ${severityColor(`[${inv.severity}]`)} ${inv.id}`);\n console.log(pc.dim(` ${inv.name}`));\n\n const question = getStaffQuestion(inv.id);\n if (question) {\n console.log(pc.dim(` Staff asks: ${question}`));\n }\n }\n console.log('');\n}\n\n","/**\n * Generate test command\n *\n * Produces a test skeleton that proves an invariant is enforced.\n */\n\nimport pc from 'picocolors';\nimport { getInvariantById } from '@securitychecks/collector';\nimport { generateTestSkeleton, type TestFramework } from '../lib/staff.js';\n\nexport interface GenerateTestOptions {\n framework?: TestFramework;\n context?: string;\n}\n\nexport async function generateTestCommand(\n invariantId: string,\n options: GenerateTestOptions\n): Promise<void> {\n const invariant = getInvariantById(invariantId);\n if (!invariant) {\n console.error(pc.red(`Unknown invariant: ${invariantId}`));\n process.exit(1);\n }\n\n const framework = options.framework ?? 'vitest';\n const test = generateTestSkeleton(invariant, framework, options.context);\n console.log(test);\n}\n\n","import pc from 'picocolors';\nimport { audit } from '../audit.js';\nimport { computeReadinessScore, formatScoreForCli } from '../lib/score.js';\n\n/**\n * Curated invariant subset for deployment readiness.\n */\nconst PREFLIGHT_INVARIANTS = [\n 'AUTHZ.SERVICE_LAYER.ENFORCED',\n 'WEBHOOK.IDEMPOTENT',\n 'WEBHOOK.SIGNATURE.VERIFIED',\n 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS',\n 'CONFIG.ENV_HARDCODED',\n 'CONFIG.HEALTH_CHECK_MISSING',\n 'CONFIG.ERROR_STACK_LEAK',\n 'CONFIG.GRACEFUL_SHUTDOWN_MISSING',\n 'SECRETS.HARDCODED',\n 'DATAFLOW.UNTRUSTED.SQL_QUERY',\n];\n\n/** Human-readable labels for each invariant */\nconst INVARIANT_LABELS: Record<string, string> = {\n 'AUTHZ.SERVICE_LAYER.ENFORCED': 'Auth at service layer',\n 'WEBHOOK.IDEMPOTENT': 'Webhook idempotency',\n 'WEBHOOK.SIGNATURE.VERIFIED': 'Webhook signature verification',\n 'TRANSACTION.POST_COMMIT.SIDE_EFFECTS': 'No side effects in transactions',\n 'CONFIG.ENV_HARDCODED': 'No hardcoded env values',\n 'CONFIG.HEALTH_CHECK_MISSING': 'Health endpoint exists',\n 'CONFIG.ERROR_STACK_LEAK': 'No stack traces leaked',\n 'CONFIG.GRACEFUL_SHUTDOWN_MISSING': 'Graceful shutdown',\n 'SECRETS.HARDCODED': 'No hardcoded secrets',\n 'DATAFLOW.UNTRUSTED.SQL_QUERY': 'No SQL injection',\n};\n\nexport interface PreflightOptions {\n path?: string;\n json?: boolean;\n quiet?: boolean;\n}\n\nexport async function preflightCommand(options: PreflightOptions): Promise<void> {\n if (!options.quiet) {\n console.log(pc.bold('\\nPreflight Check\\n'));\n }\n\n try {\n const result = await audit({\n targetPath: options.path,\n only: PREFLIGHT_INVARIANTS,\n });\n\n const readiness = computeReadinessScore(result.summary);\n\n // Build per-invariant pass/fail map\n const failedInvariants = new Map<string, { file: string; line: number; message: string }[]>();\n for (const r of result.results) {\n if (!r.passed) {\n const evidence = r.findings.map((f) => ({\n file: f.evidence?.[0]?.file ?? 'unknown',\n line: f.evidence?.[0]?.line ?? 0,\n message: f.message,\n }));\n failedInvariants.set(r.invariantId, evidence);\n }\n }\n\n if (options.json) {\n const jsonOutput = {\n passed: readiness.passed,\n failed: readiness.failed,\n total: readiness.total,\n score: readiness.score,\n grade: readiness.grade,\n hasP0: readiness.hasP0,\n checks: PREFLIGHT_INVARIANTS.map((id) => ({\n invariantId: id,\n label: INVARIANT_LABELS[id] ?? id,\n passed: !failedInvariants.has(id),\n findings: failedInvariants.get(id) ?? [],\n })),\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n if (options.quiet) {\n // Just exit code\n if (readiness.failed > 0) {\n process.exit(1);\n }\n return;\n }\n\n // Display checklist\n console.log(`Preflight Check — ${readiness.passed}/${readiness.total} passed\\n`);\n\n for (const id of PREFLIGHT_INVARIANTS) {\n const label = INVARIANT_LABELS[id] ?? id;\n const evidence = failedInvariants.get(id);\n\n if (evidence) {\n console.log(pc.red(` \\u2717 ${label}`));\n for (const e of evidence) {\n console.log(pc.dim(` \\u2192 ${e.file}:${e.line} \\u2014 ${e.message}`));\n }\n } else {\n console.log(pc.green(` \\u2713 ${label}`));\n }\n }\n\n console.log('');\n console.log(` ${formatScoreForCli(readiness)}`);\n\n if (readiness.failed > 0) {\n const issueWord = readiness.failed === 1 ? 'issue' : 'issues';\n console.log(` ${readiness.failed} ${issueWord} to fix before deploy.`);\n } else {\n console.log(pc.green(' Ready to deploy.'));\n }\n\n console.log('');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (options.json) {\n console.error(JSON.stringify({ error: message }, null, 2));\n } else {\n console.error(pc.red(`\\nPreflight failed: ${message}\\n`));\n }\n process.exit(1);\n }\n}\n","/**\n * Structured Logger for SecurityChecks CLI\n *\n * Features:\n * - Log levels: debug, info, warn, error\n * - Verbose mode support\n * - Silent mode for JSON output\n * - Automatic redaction of sensitive data\n */\n\nimport pc from 'picocolors';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\ninterface LoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n json?: boolean;\n}\n\n/**\n * Patterns that indicate sensitive data to redact\n */\nconst SENSITIVE_PATTERNS = [\n /api[_-]?key/i,\n /secret/i,\n /password/i,\n /token/i,\n /credential/i,\n /auth/i,\n];\n\n/**\n * Prefixes that indicate sensitive values\n */\nconst SENSITIVE_PREFIXES = ['sk_', 'pk_', 'Bearer ', 'Basic '];\n\nclass Logger {\n private verbose = false;\n private silent = false;\n private json = false;\n\n configure(options: LoggerOptions): void {\n this.verbose = options.verbose ?? false;\n this.silent = options.silent ?? false;\n this.json = options.json ?? false;\n }\n\n debug(message: string, data?: Record<string, unknown>): void {\n if (!this.verbose || this.silent) return;\n this.log('debug', message, data);\n }\n\n info(message: string, data?: Record<string, unknown>): void {\n if (this.silent) return;\n this.log('info', message, data);\n }\n\n warn(message: string, data?: Record<string, unknown>): void {\n if (this.silent) return;\n this.log('warn', message, data);\n }\n\n error(message: string, data?: Record<string, unknown>): void {\n this.log('error', message, data);\n }\n\n /**\n * Log a step in a process (for progress indication)\n */\n step(step: number, total: number, message: string): void {\n if (this.silent) return;\n console.log(pc.dim(`[${step}/${total}]`), message);\n }\n\n /**\n * Log a success message\n */\n success(message: string): void {\n if (this.silent) return;\n console.log(pc.green('✓'), message);\n }\n\n /**\n * Log a failure message\n */\n fail(message: string): void {\n console.log(pc.red('✗'), message);\n }\n\n private log(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n const timestamp = new Date().toISOString();\n const redactedData = data ? this.redact(data) : undefined;\n\n if (this.json) {\n console.log(\n JSON.stringify({\n timestamp,\n level,\n message,\n ...(redactedData && { data: redactedData }),\n })\n );\n return;\n }\n\n const prefix = this.getPrefix(level);\n const formattedMessage = `${prefix} ${message}`;\n\n if (level === 'error') {\n console.error(formattedMessage);\n } else {\n console.log(formattedMessage);\n }\n\n if (this.verbose && redactedData) {\n console.log(pc.dim(JSON.stringify(redactedData, null, 2)));\n }\n }\n\n private getPrefix(level: LogLevel): string {\n switch (level) {\n case 'debug':\n return pc.dim('[DEBUG]');\n case 'info':\n return pc.blue('[INFO]');\n case 'warn':\n return pc.yellow('[WARN]');\n case 'error':\n return pc.red('[ERROR]');\n }\n }\n\n /**\n * Redact sensitive data from log output\n */\n private redact(data: Record<string, unknown>): Record<string, unknown> {\n const redacted: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (this.isSensitiveKey(key)) {\n redacted[key] = '[REDACTED]';\n } else if (typeof value === 'string' && this.isSensitiveValue(value)) {\n redacted[key] = this.redactValue(value);\n } else if (typeof value === 'object' && value !== null) {\n redacted[key] = this.redact(value as Record<string, unknown>);\n } else {\n redacted[key] = value;\n }\n }\n\n return redacted;\n }\n\n private isSensitiveKey(key: string): boolean {\n return SENSITIVE_PATTERNS.some((pattern) => pattern.test(key));\n }\n\n private isSensitiveValue(value: string): boolean {\n return SENSITIVE_PREFIXES.some((prefix) => value.startsWith(prefix));\n }\n\n private redactValue(value: string): string {\n if (value.length <= 8) {\n return '[REDACTED]';\n }\n return value.slice(0, 4) + '...' + value.slice(-4);\n }\n}\n\n// Singleton logger instance\nexport const logger = new Logger();\n\n// Convenience exports\nexport const debug = logger.debug.bind(logger);\nexport const info = logger.info.bind(logger);\nexport const warn = logger.warn.bind(logger);\nexport const error = logger.error.bind(logger);\nexport const step = logger.step.bind(logger);\nexport const success = logger.success.bind(logger);\nexport const fail = logger.fail.bind(logger);\n","#!/usr/bin/env node\n\n/**\n * SecurityChecks CLI\n *\n * Enforce backend invariants in your codebase.\n * https://securitychecks.ai\n */\n\nimport { Command } from 'commander';\nimport { runCommand } from './commands/run.js';\nimport { explainCommand } from './commands/explain.js';\nimport { initCommand } from './commands/init.js';\nimport { baselineCommand } from './commands/baseline.js';\nimport { waiverCommand, waiveCommand } from './commands/waiver.js';\nimport { loginCommand, logoutCommand } from './commands/login.js';\nimport { configCommand } from './commands/config.js';\nimport { syncCommand } from './commands/sync.js';\nimport { hooksCommand } from './commands/hooks.js';\nimport { feedbackCommand } from './commands/feedback.js';\nimport { listInvariantsCommand } from './commands/list-invariants.js';\nimport { generateTestCommand } from './commands/generate-test.js';\nimport { preflightCommand } from './commands/preflight.js';\nimport { logger } from './lib/logger.js';\n\n// Version injected at build time via tsup define\nconst version = process.env['CLI_VERSION'] ?? '0.0.0-dev';\n\nconst program = new Command();\n\nprogram\n .name('scheck')\n .description('Enforce backend invariants in your codebase')\n .version(version);\n\n// Run command - scan for security invariants\nprogram\n .command('run')\n .description('Scan for security invariants')\n .option('-p, --path <path>', 'Target path to audit (default: current directory)')\n .option('-a, --artifact <path>', 'Use pre-collected artifact from scc (skips collection)')\n .option('--changed', 'Only check changed files (requires git)')\n .option('--ci', 'CI mode - fail on new violations')\n // Output control\n .option('--all', 'Show all findings (don\\'t stop early, include P2)')\n .option('--include-p2', 'Include P2 (medium) findings')\n .option('--only <invariants...>', 'Only run specific invariant checks')\n .option('--skip <invariants...>', 'Skip specific invariant checks')\n .option('--json', 'Output results as JSON')\n .option('--sarif <path>', 'Write SARIF report to file (for GitHub Code Scanning)')\n .option('--quiet', 'Suppress output except errors')\n .option('-v, --verbose', 'Enable verbose output')\n // Cloud control\n .option('--calibrate', 'Enable calibration API (default: enabled)')\n .option('--offline', 'Disable all API calls (not supported - shows error)')\n .option('--calibration-endpoint <url>', 'Override calibration API endpoint')\n .option('--patterns', 'Enable Pro Patterns fetching (default: enabled)')\n .option('--no-patterns', 'Disable Pro Patterns fetching')\n .option('--pattern-endpoint <url>', 'Override patterns API endpoint')\n .option('--patterns-file <path>', 'Load patterns from local JSON file (dev/testing)')\n .option('-w, --watch', 'Watch for file changes and re-run')\n .option('--no-local-scan', 'Skip local source-level pattern scanning')\n .option('--no-usage-banner', 'Suppress periodic API usage reminders')\n .action((options) => {\n logger.configure({\n verbose: options.verbose,\n silent: options.quiet,\n json: options.json,\n });\n return runCommand(options);\n });\n\n// Explain command - explain an invariant\nprogram\n .command('explain <invariant>')\n .description('Deep-dive on any invariant (why it matters, what good looks like)')\n .action(explainCommand);\n\n// List invariants command\nprogram\n .command('list-invariants')\n .description('List all invariants (optionally filtered)')\n .option('--category <category>', 'Filter by category (authz, webhooks, transactions, etc.)')\n .option('--severity <severity>', 'Filter by severity (P0, P1, P2)')\n .option('--json', 'Output as JSON')\n .action((options) => listInvariantsCommand(options));\n\n// Generate test skeleton command\nprogram\n .command('generate-test <invariantId>')\n .description('Generate a test skeleton proving an invariant is enforced')\n .option('--framework <framework>', 'Test framework: vitest, jest, playwright', 'vitest')\n .option('--context <context>', 'Extra context to make the test more targeted')\n .action((invariantId, options) => generateTestCommand(invariantId, options));\n\n// Preflight command - curated deployment readiness check\nprogram\n .command('preflight')\n .description('Quick deployment readiness check (curated invariant subset)')\n .option('-p, --path <path>', 'Target path to audit (default: current directory)')\n .option('--json', 'Output results as JSON')\n .option('--quiet', 'Suppress output except errors (exit code only)')\n .action((options) => {\n logger.configure({ silent: options.quiet, json: options.json });\n return preflightCommand(options);\n });\n\n// Init command - initialize SecurityChecks in a project\nprogram\n .command('init')\n .description('Initialize SecurityChecks in a project')\n .option('-p, --path <path>', 'Target path (default: current directory)')\n .option('--hooks', 'Install git pre-commit hook to run checks before commits')\n .action(initCommand);\n\n// Hooks command - manage git hooks\nprogram\n .command('hooks')\n .description('Manage git pre-commit hooks')\n .option('-p, --path <path>', 'Target path (default: current directory)')\n .option('--install', 'Install pre-commit hook')\n .option('--uninstall', 'Uninstall pre-commit hook')\n .option('--show', 'Show current hook status (default)')\n .action(hooksCommand);\n\n// Baseline command - manage baseline of known issues\nprogram\n .command('baseline')\n .description('Manage the baseline of known issues')\n .option('-p, --path <path>', 'Target path (default: current directory)')\n .option('--update', 'Update baseline with current findings')\n .option('--show', 'Show current baseline')\n .option('--prune', 'Remove stale entries not seen recently')\n .option('--prune-days <days>', 'Days before considering stale (default: 90)')\n .option('--notes <notes>', 'Notes to attach to new baseline entries')\n .option('-y, --yes', 'Skip confirmation prompt (for CI/automation)')\n .action(baselineCommand);\n\n// Waive command - temporarily waive a finding\nprogram\n .command('waive <findingId>')\n .description('Temporarily waive a finding (use full findingId or invariant)')\n .option('-p, --path <path>', 'Target path (default: current directory)')\n .option('-r, --reason <reason>', 'Reason for waiving (required)')\n .option('--reason-key <key>', 'Reason key (optional): false_positive, acceptable_risk, will_fix_later, not_applicable, other')\n .option('-e, --expires <duration>', 'Expiration duration (e.g., 7d, 30d, 90d)', '30d')\n .option('-o, --owner <owner>', 'Owner/contact for this waiver')\n .action(waiveCommand);\n\n// Waiver command - manage waivers\nprogram\n .command('waiver')\n .description('View and manage temporary waivers')\n .option('-p, --path <path>', 'Target path (default: current directory)')\n .option('--show', 'Show all active waivers')\n .option('--expiring', 'Show waivers expiring soon')\n .option('--expiring-days <days>', 'Days to consider \"expiring soon\" (default: 7)')\n .option('--prune', 'Remove expired waivers')\n .action(waiverCommand);\n\n// Feedback command - report finding quality\nprogram\n .command('feedback <invariantId>')\n .description('Report whether a finding was a true positive or false positive')\n .option('-p, --path <path>', 'Target path (default: current directory)')\n .option('--verdict <verdict>', 'Verdict: tp (true positive) or fp (false positive)')\n .option('--reason <reason>', 'Reason: not_applicable, acceptable_risk, wrong_location, outdated_pattern, missing_context')\n .option('--endpoint <url>', 'Feedback endpoint URL (or set SECURITYCHECKS_FEEDBACK_URL)')\n .action(feedbackCommand);\n\n// ==========================================\n// Cloud commands\n// ==========================================\n\n// Login command - authenticate with cloud\nprogram\n .command('login')\n .description('Authenticate with SecurityChecks cloud')\n .option('-k, --api-key <key>', 'API key (or set SECURITYCHECKS_API_KEY)')\n .option('--api-url <url>', 'Custom API URL (for self-hosted)')\n .option('--check', 'Check current login status')\n .action(loginCommand);\n\n// Logout command - clear cloud credentials\nprogram\n .command('logout')\n .description('Log out from SecurityChecks cloud')\n .action(logoutCommand);\n\n// Config command - manage cloud configuration\nprogram\n .command('config')\n .description('Manage cloud configuration')\n .option('--show', 'Show current configuration')\n .option('--set <key=value>', 'Set a configuration value')\n .option('--unset <key>', 'Unset a configuration value')\n .option('--clear', 'Clear all configuration')\n .option('--project <slug>', 'Set default project')\n .option('--api-url <url>', 'Set API URL')\n .option('--cloud-enabled', 'Enable cloud mode')\n .option('--no-cloud-enabled', 'Disable cloud mode')\n .action(configCommand);\n\n// Sync command - sync findings to cloud\nprogram\n .command('sync')\n .description('Sync scan results to SecurityChecks cloud')\n .option('--project <slug>', 'Project slug')\n .option('--branch <name>', 'Git branch name')\n .option('--commit <sha>', 'Git commit SHA')\n .option('--findings <path>', 'Path to findings file')\n .option('--dry-run', 'Show what would be synced without syncing')\n .action(syncCommand);\n\nprogram.parse();\n"]}