{"version":3,"sources":["../src/errors.ts","../src/kernel.ts","../src/utils/fs.ts","../src/ast/parser.ts","../src/ast/helpers.ts","../src/ast/walker.ts","../src/utils/glob.ts","../src/graph/builder.ts","../src/graph/cache.ts","../src/graph/incremental.ts","../src/graph/query.ts","../src/rules/context.ts","../src/rules/suppression.ts","../src/rules/engine.ts","../src/config/defaults.ts","../src/types.ts","../src/config/validator.ts","../src/config/loader.ts","../src/git/staged.ts","../src/utils/color.ts","../src/reporter/terminal.ts","../src/reporter/json.ts","../src/reporter/sarif.ts","../src/discovery/conventions.ts","../src/plugins/core/architecture.ts","../src/plugins/core/security.ts","../src/plugins/core/performance.ts","../src/plugins/core/quality.ts","../src/plugins/optional/naming.ts","../src/plugins/optional/api.ts","../src/plugins/optional/test-guard.ts","../src/plugins/optional/dep-audit.ts","../src/index.ts"],"names":["readFileSync","fs","writeFileSync","path","path2","ts","exports","path3","path4","path5","path6","path7","execSync"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base error class for all codeguardian errors.\n *\n * @example\n * ```typescript\n * throw new CodeGuardianError('Something went wrong', 'GENERAL');\n * ```\n */\nexport class CodeGuardianError extends Error {\n  public readonly code: string;\n  public readonly context?: Record<string, unknown>;\n\n  constructor(message: string, code: string, context?: Record<string, unknown>) {\n    super(message);\n    this.name = 'CodeGuardianError';\n    this.code = code;\n    this.context = context;\n  }\n}\n\n/**\n * Error thrown when configuration is invalid.\n *\n * @example\n * ```typescript\n * throw new ConfigError('Invalid severity level', { field: 'severity.blockOn' });\n * ```\n */\nexport class ConfigError extends CodeGuardianError {\n  constructor(message: string, context?: Record<string, unknown>) {\n    super(message, 'CONFIG_ERROR', context);\n    this.name = 'ConfigError';\n  }\n}\n\n/**\n * Error thrown when TypeScript parsing fails.\n *\n * @example\n * ```typescript\n * throw new ParseError('Failed to parse file', { file: 'src/index.ts' });\n * ```\n */\nexport class ParseError extends CodeGuardianError {\n  constructor(message: string, context?: Record<string, unknown>) {\n    super(message, 'PARSE_ERROR', context);\n    this.name = 'ParseError';\n  }\n}\n\n/**\n * Error thrown when a plugin encounters an error.\n *\n * @example\n * ```typescript\n * throw new PluginError('Plugin failed to install', { plugin: 'security' });\n * ```\n */\nexport class PluginError extends CodeGuardianError {\n  constructor(message: string, context?: Record<string, unknown>) {\n    super(message, 'PLUGIN_ERROR', context);\n    this.name = 'PluginError';\n  }\n}\n\n/**\n * Error thrown when graph construction fails.\n *\n * @example\n * ```typescript\n * throw new GraphError('Failed to build graph', { files: 42 });\n * ```\n */\nexport class GraphError extends CodeGuardianError {\n  constructor(message: string, context?: Record<string, unknown>) {\n    super(message, 'GRAPH_ERROR', context);\n    this.name = 'GraphError';\n  }\n}\n\n/**\n * Error thrown when a git operation fails.\n *\n * @example\n * ```typescript\n * throw new GitError('Not a git repository');\n * ```\n */\nexport class GitError extends CodeGuardianError {\n  constructor(message: string, context?: Record<string, unknown>) {\n    super(message, 'GIT_ERROR', context);\n    this.name = 'GitError';\n  }\n}\n","import type {\n  CodebaseGraph,\n  GuardianKernel,\n  GuardianPlugin,\n  Rule,\n} from './types.js';\nimport { PluginError } from './errors.js';\n\n/**\n * Create the micro kernel that manages plugins and rules.\n *\n * @returns Kernel instance with plugin/rule management\n *\n * @example\n * ```typescript\n * const kernel = createKernel();\n * kernel.installPlugin(myPlugin);\n * const rules = kernel.getRules();\n * ```\n */\nexport function createKernel() {\n  const plugins = new Map<string, GuardianPlugin>();\n  const rules = new Map<string, Rule>();\n\n  /**\n   * Create a GuardianKernel adapter for a specific plugin.\n   */\n  function createKernelAdapter<TConfig>(config: TConfig): GuardianKernel<TConfig> {\n    return {\n      registerRule(rule: Rule): void {\n        if (rules.has(rule.name)) {\n          throw new PluginError(`Rule \"${rule.name}\" is already registered`, {\n            rule: rule.name,\n          });\n        }\n        rules.set(rule.name, rule);\n      },\n\n      unregisterRule(name: string): void {\n        rules.delete(name);\n      },\n\n      getRules(): Rule[] {\n        return Array.from(rules.values());\n      },\n\n      getConfig(): TConfig {\n        return config;\n      },\n    };\n  }\n\n  return {\n    /**\n     * Install a plugin into the kernel.\n     *\n     * @example\n     * ```typescript\n     * kernel.installPlugin(architecturePlugin({ layers: [...] }));\n     * ```\n     */\n    installPlugin<TConfig>(plugin: GuardianPlugin<TConfig>, config?: TConfig): void {\n      if (plugins.has(plugin.name)) {\n        throw new PluginError(`Plugin \"${plugin.name}\" is already installed`, {\n          plugin: plugin.name,\n        });\n      }\n\n      // Check dependencies\n      if (plugin.dependencies) {\n        for (const dep of plugin.dependencies) {\n          if (!plugins.has(dep)) {\n            throw new PluginError(\n              `Plugin \"${plugin.name}\" depends on \"${dep}\" which is not installed`,\n              { plugin: plugin.name, dependency: dep },\n            );\n          }\n        }\n      }\n\n      const adapter = createKernelAdapter(config ?? ({} as TConfig));\n\n      try {\n        plugin.install(adapter);\n        plugins.set(plugin.name, plugin as GuardianPlugin);\n      } catch (err) {\n        if (plugin.onError && err instanceof Error) {\n          plugin.onError(err);\n        }\n        throw new PluginError(\n          `Failed to install plugin \"${plugin.name}\": ${err instanceof Error ? err.message : String(err)}`,\n          { plugin: plugin.name },\n        );\n      }\n    },\n\n    /**\n     * Uninstall a plugin from the kernel.\n     */\n    async uninstallPlugin(name: string): Promise<void> {\n      const plugin = plugins.get(name);\n      if (!plugin) return;\n\n      // Remove rules from this plugin\n      const prefix = name + '/';\n      for (const [ruleName] of rules) {\n        if (ruleName.startsWith(prefix)) {\n          rules.delete(ruleName);\n        }\n      }\n\n      if (plugin.onDestroy) {\n        await plugin.onDestroy();\n      }\n\n      plugins.delete(name);\n    },\n\n    /**\n     * Initialize all plugins with the built graph.\n     */\n    async initPlugins(graph: CodebaseGraph): Promise<void> {\n      for (const plugin of plugins.values()) {\n        if (plugin.onInit) {\n          try {\n            await plugin.onInit(graph);\n          } catch (err) {\n            if (plugin.onError && err instanceof Error) {\n              plugin.onError(err);\n            }\n          }\n        }\n      }\n    },\n\n    /**\n     * Get all registered rules.\n     */\n    getRules(): Rule[] {\n      return Array.from(rules.values());\n    },\n\n    /**\n     * Get all installed plugin names.\n     */\n    getPluginNames(): string[] {\n      return Array.from(plugins.keys());\n    },\n\n    /**\n     * Check if a plugin is installed.\n     */\n    hasPlugin(name: string): boolean {\n      return plugins.has(name);\n    },\n\n    /**\n     * Get the number of registered rules.\n     */\n    getRuleCount(): number {\n      return rules.size;\n    },\n  };\n}\n\nexport type Kernel = ReturnType<typeof createKernel>;\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Read a file as UTF-8 string.\n *\n * @example\n * ```typescript\n * const content = readFileSync('src/index.ts');\n * ```\n */\nexport function readFileSync(filePath: string): string {\n  return fs.readFileSync(filePath, 'utf-8');\n}\n\n/**\n * Write a string to a file (creates parent dirs).\n *\n * @example\n * ```typescript\n * writeFileSync('.codeguardian/graph.json', JSON.stringify(data));\n * ```\n */\nexport function writeFileSync(filePath: string, content: string): void {\n  const dir = path.dirname(filePath);\n  if (!fs.existsSync(dir)) {\n    fs.mkdirSync(dir, { recursive: true });\n  }\n  fs.writeFileSync(filePath, content, 'utf-8');\n}\n\n/**\n * Check if a file or directory exists.\n *\n * @example\n * ```typescript\n * if (fileExists('.codeguardian/graph.json')) { ... }\n * ```\n */\nexport function fileExists(filePath: string): boolean {\n  return fs.existsSync(filePath);\n}\n\n/**\n * Read a JSON file and parse it.\n *\n * @example\n * ```typescript\n * const config = readJsonSync<ProjectConfig>('.codeguardian.json');\n * ```\n */\nexport function readJsonSync<T>(filePath: string): T {\n  const content = readFileSync(filePath);\n  return JSON.parse(content) as T;\n}\n\n/**\n * Write an object as JSON to a file.\n *\n * @example\n * ```typescript\n * writeJsonSync('.codeguardian/graph.json', serializedGraph);\n * ```\n */\nexport function writeJsonSync(filePath: string, data: unknown): void {\n  writeFileSync(filePath, JSON.stringify(data, null, 2));\n}\n\n/**\n * Recursively find files matching a simple pattern.\n * Uses node:fs only (no external glob library).\n *\n * @param dir - Directory to search\n * @param extensions - File extensions to match (e.g., ['.ts'])\n * @param exclude - Directory names to exclude\n * @returns Array of file paths (relative to dir)\n *\n * @example\n * ```typescript\n * const files = findFiles('src', ['.ts'], ['node_modules']);\n * ```\n */\nexport function findFiles(\n  dir: string,\n  extensions: string[] = ['.ts'],\n  exclude: string[] = ['node_modules', '.git', 'dist'],\n): string[] {\n  const results: string[] = [];\n\n  if (!fs.existsSync(dir)) return results;\n\n  const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n  for (const entry of entries) {\n    const fullPath = path.join(dir, entry.name);\n\n    if (entry.isDirectory()) {\n      if (!exclude.includes(entry.name)) {\n        results.push(...findFiles(fullPath, extensions, exclude));\n      }\n    } else if (entry.isFile()) {\n      const ext = path.extname(entry.name);\n      if (extensions.includes(ext)) {\n        results.push(fullPath);\n      }\n    }\n  }\n\n  return results;\n}\n\n/**\n * Normalize a file path to use forward slashes.\n *\n * @example\n * ```typescript\n * normalizePath('src\\\\utils\\\\helper.ts'); // 'src/utils/helper.ts'\n * ```\n */\nexport function normalizePath(filePath: string): string {\n  return filePath.replace(/\\\\/g, '/');\n}\n\n/**\n * Get relative path from root, normalized with forward slashes.\n *\n * @example\n * ```typescript\n * relativePath('/project', '/project/src/index.ts'); // 'src/index.ts'\n * ```\n */\nexport function relativePath(rootDir: string, filePath: string): string {\n  return normalizePath(path.relative(rootDir, filePath));\n}\n","import ts from 'typescript';\nimport * as path from 'node:path';\nimport { ParseError } from '../errors.js';\nimport { readFileSync } from '../utils/fs.js';\n\n/**\n * Create a TypeScript program from a tsconfig path.\n *\n * @param rootDir - Project root directory\n * @param tsconfigPath - Path to tsconfig.json (relative to rootDir)\n * @returns TypeScript Program instance\n *\n * @example\n * ```typescript\n * const program = createTSProgram('/my-project', './tsconfig.json');\n * const checker = program.getTypeChecker();\n * ```\n */\nexport function createTSProgram(rootDir: string, tsconfigPath: string): ts.Program {\n  const configPath = path.resolve(rootDir, tsconfigPath);\n\n  const configFile = ts.readConfigFile(configPath, (p) => readFileSync(p));\n  if (configFile.error) {\n    throw new ParseError(`Failed to read tsconfig: ${configFile.error.messageText}`, {\n      file: configPath,\n    });\n  }\n\n  const parsed = ts.parseJsonConfigFileContent(\n    configFile.config,\n    ts.sys,\n    rootDir,\n  );\n\n  if (parsed.errors.length > 0) {\n    const messages = parsed.errors\n      /* v8 ignore next */\n      .map((e) => (typeof e.messageText === 'string' ? e.messageText : e.messageText.messageText))\n      .join(', ');\n    throw new ParseError(`tsconfig parse errors: ${messages}`, { file: configPath });\n  }\n\n  return ts.createProgram({\n    rootNames: parsed.fileNames,\n    options: parsed.options,\n  });\n}\n\n/**\n * Parse a single TypeScript file into a SourceFile AST.\n *\n * @param filePath - Absolute path to the .ts file\n * @param content - Optional file content (reads from disk if not provided)\n * @returns TypeScript SourceFile\n *\n * @example\n * ```typescript\n * const ast = parseFile('/project/src/index.ts');\n * ```\n */\nexport function parseFile(filePath: string, content?: string): ts.SourceFile {\n  const source = content ?? readFileSync(filePath);\n  const sourceFile = ts.createSourceFile(\n    filePath,\n    source,\n    ts.ScriptTarget.ES2022,\n    true,\n    ts.ScriptKind.TS,\n  );\n  return sourceFile;\n}\n\n/**\n * Get all source file paths from a TypeScript program (excluding .d.ts and node_modules).\n *\n * @param program - TypeScript Program\n * @returns Array of source file paths\n *\n * @example\n * ```typescript\n * const files = getSourceFiles(program);\n * ```\n */\nexport function getSourceFiles(program: ts.Program): string[] {\n  return program\n    .getSourceFiles()\n    .filter((sf) => !sf.isDeclarationFile && !sf.fileName.includes('node_modules'))\n    .map((sf) => sf.fileName);\n}\n","import ts from 'typescript';\nimport type { ImportInfo, ParamInfo } from '../types.js';\n\n/**\n * Check if a CallExpression calls a specific function name.\n *\n * @example\n * ```typescript\n * // Checks for calls like: someFunction()\n * isCallTo(node, 'someFunction');\n * // Checks for calls like: db.query()\n * isCallTo(node, 'query');\n * ```\n */\nexport function isCallTo(node: ts.CallExpression, name: string): boolean {\n  const expr = node.expression;\n\n  // Direct call: name()\n  if (ts.isIdentifier(expr)) {\n    return expr.text === name;\n  }\n\n  // Property access: obj.name()\n  if (ts.isPropertyAccessExpression(expr)) {\n    return expr.name.text === name;\n  }\n\n  return false;\n}\n\n/**\n * Check if a CallExpression is a console.* call.\n *\n * @param node - CallExpression node\n * @param method - Optional specific method (e.g., 'log', 'error')\n * @returns true if it's a console call\n *\n * @example\n * ```typescript\n * isConsoleCall(node);         // any console.*\n * isConsoleCall(node, 'log');  // only console.log\n * ```\n */\nexport function isConsoleCall(node: ts.CallExpression, method?: string): boolean {\n  const expr = node.expression;\n\n  if (ts.isPropertyAccessExpression(expr)) {\n    if (ts.isIdentifier(expr.expression) && expr.expression.text === 'console') {\n      if (method) {\n        return expr.name.text === method;\n      }\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Get the type of a node as a string using the TypeChecker.\n *\n * @example\n * ```typescript\n * const typeStr = getTypeString(node, checker);\n * // e.g., 'string', 'Promise<User>', 'number[]'\n * ```\n */\nexport function getTypeString(node: ts.Node, checker: ts.TypeChecker): string {\n  try {\n    const type = checker.getTypeAtLocation(node);\n    return checker.typeToString(type);\n  } catch {\n    return 'unknown';\n  }\n}\n\n/**\n * Check if a node contains string concatenation or template literals.\n *\n * @example\n * ```typescript\n * // Returns true for: `SELECT * FROM ${table}`\n * // Returns true for: \"SELECT \" + table\n * hasStringConcat(node);\n * ```\n */\nexport function hasStringConcat(node: ts.Node): boolean {\n  if (ts.isTemplateExpression(node)) {\n    return true;\n  }\n\n  if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.PlusToken) {\n    // Check if either side is a string\n    if (ts.isStringLiteral(node.left) || ts.isStringLiteral(node.right)) {\n      return true;\n    }\n    if (ts.isTemplateExpression(node.left) || ts.isTemplateExpression(node.right)) {\n      return true;\n    }\n  }\n\n  let found = false;\n  ts.forEachChild(node, (child) => {\n    if (!found && hasStringConcat(child)) {\n      found = true;\n    }\n  });\n\n  return found;\n}\n\n/**\n * Extract all imports from a source file.\n *\n * @example\n * ```typescript\n * const imports = extractImports(sourceFile);\n * // [{ source: './user.service', specifiers: ['UserService'], isTypeOnly: false }]\n * ```\n */\nexport function extractImports(sourceFile: ts.SourceFile): ImportInfo[] {\n  const imports: ImportInfo[] = [];\n\n  for (const stmt of sourceFile.statements) {\n    if (ts.isImportDeclaration(stmt)) {\n      const moduleSpecifier = stmt.moduleSpecifier;\n      /* v8 ignore next */\n      if (!ts.isStringLiteral(moduleSpecifier)) continue;\n\n      const source = moduleSpecifier.text;\n      const isTypeOnly = stmt.importClause?.isTypeOnly ?? false;\n      const specifiers: string[] = [];\n\n      if (stmt.importClause) {\n        // Default import\n        if (stmt.importClause.name) {\n          specifiers.push(stmt.importClause.name.text);\n        }\n\n        // Named imports\n        const namedBindings = stmt.importClause.namedBindings;\n        if (namedBindings) {\n          if (ts.isNamedImports(namedBindings)) {\n            for (const element of namedBindings.elements) {\n              specifiers.push(element.name.text);\n            }\n          } else if (ts.isNamespaceImport(namedBindings)) {\n            specifiers.push(namedBindings.name.text);\n          }\n        }\n      }\n\n      imports.push({ source, specifiers, isTypeOnly });\n    }\n  }\n\n  return imports;\n}\n\n/**\n * Extract all exports from a source file (named exports and declarations).\n *\n * @example\n * ```typescript\n * const exports = extractExports(sourceFile);\n * // ['UserService', 'getUser', 'UserType']\n * ```\n */\nexport function extractExports(sourceFile: ts.SourceFile): string[] {\n  const exports: string[] = [];\n\n  for (const stmt of sourceFile.statements) {\n    // export function/class/interface/type/enum/variable\n    if (hasExportModifier(stmt)) {\n      if (ts.isFunctionDeclaration(stmt) && stmt.name) {\n        exports.push(stmt.name.text);\n      } else if (ts.isClassDeclaration(stmt) && stmt.name) {\n        exports.push(stmt.name.text);\n      } else if (ts.isInterfaceDeclaration(stmt)) {\n        exports.push(stmt.name.text);\n      } else if (ts.isTypeAliasDeclaration(stmt)) {\n        exports.push(stmt.name.text);\n      } else if (ts.isEnumDeclaration(stmt)) {\n        exports.push(stmt.name.text);\n      } else if (ts.isVariableStatement(stmt)) {\n        for (const decl of stmt.declarationList.declarations) {\n          if (ts.isIdentifier(decl.name)) {\n            exports.push(decl.name.text);\n          }\n        }\n      }\n    }\n\n    // export { ... }\n    if (ts.isExportDeclaration(stmt) && stmt.exportClause && ts.isNamedExports(stmt.exportClause)) {\n      for (const element of stmt.exportClause.elements) {\n        exports.push(element.name.text);\n      }\n    }\n\n    // export default\n    if (ts.isExportAssignment(stmt)) {\n      exports.push('default');\n    }\n  }\n\n  return exports;\n}\n\n/**\n * Check if a statement has the 'export' modifier.\n */\nfunction hasExportModifier(node: ts.Node): boolean {\n  /* v8 ignore next */\n  const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;\n  return modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false;\n}\n\n/**\n * Extract function declarations and methods from a source file.\n *\n * @example\n * ```typescript\n * const fns = extractFunctions(sourceFile, 'src/service.ts');\n * ```\n */\nexport function extractFunctions(\n  sourceFile: ts.SourceFile,\n  filePath: string,\n): Array<{\n  name: string;\n  startLine: number;\n  endLine: number;\n  params: ParamInfo[];\n  returnType: string;\n  isAsync: boolean;\n  node: ts.Node;\n}> {\n  const functions: Array<{\n    name: string;\n    startLine: number;\n    endLine: number;\n    params: ParamInfo[];\n    returnType: string;\n    isAsync: boolean;\n    node: ts.Node;\n  }> = [];\n\n  const visit = (node: ts.Node): void => {\n    if (ts.isFunctionDeclaration(node) && node.name) {\n      functions.push(buildFunctionInfo(node, node.name.text, sourceFile, filePath));\n    } else if (ts.isMethodDeclaration(node) && ts.isIdentifier(node.name)) {\n      functions.push(buildFunctionInfo(node, node.name.text, sourceFile, filePath));\n    } else if (ts.isArrowFunction(node)) {\n      const parent = node.parent;\n      if (ts.isVariableDeclaration(parent) && ts.isIdentifier(parent.name)) {\n        functions.push(buildFunctionInfo(node, parent.name.text, sourceFile, filePath));\n      }\n    } else if (ts.isFunctionExpression(node)) {\n      const parent = node.parent;\n      if (ts.isVariableDeclaration(parent) && ts.isIdentifier(parent.name)) {\n        functions.push(buildFunctionInfo(node, parent.name.text, sourceFile, filePath));\n      }\n    }\n\n    ts.forEachChild(node, visit);\n  };\n\n  ts.forEachChild(sourceFile, visit);\n  return functions;\n}\n\nfunction buildFunctionInfo(\n  node: ts.FunctionDeclaration | ts.MethodDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n  name: string,\n  sourceFile: ts.SourceFile,\n  _filePath: string,\n) {\n  const startLine = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;\n  const endLine = sourceFile.getLineAndCharacterOfPosition(node.getEnd()).line + 1;\n\n  const params: ParamInfo[] = node.parameters.map((p) => ({\n    name: ts.isIdentifier(p.name) ? p.name.text : p.name.getText(sourceFile),\n    type: p.type ? p.type.getText(sourceFile) : 'any',\n    optional: !!p.questionToken || !!p.initializer,\n  }));\n\n  const returnType = node.type ? node.type.getText(sourceFile) : 'void';\n\n  /* v8 ignore next */\n  const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;\n  const isAsync = modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) ?? false;\n\n  return {\n    name,\n    startLine,\n    endLine,\n    params,\n    returnType,\n    isAsync,\n    node: node as ts.Node,\n  };\n}\n\n/**\n * Detect the kind of a top-level symbol from its declaration.\n */\nexport function detectSymbolKind(\n  node: ts.Node,\n): 'function' | 'class' | 'interface' | 'type' | 'variable' | 'enum' {\n  if (ts.isFunctionDeclaration(node)) return 'function';\n  if (ts.isClassDeclaration(node)) return 'class';\n  if (ts.isInterfaceDeclaration(node)) return 'interface';\n  if (ts.isTypeAliasDeclaration(node)) return 'type';\n  if (ts.isEnumDeclaration(node)) return 'enum';\n  if (ts.isVariableStatement(node) || ts.isVariableDeclaration(node)) return 'variable';\n  if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) return 'function';\n  return 'variable';\n}\n","import ts from 'typescript';\nimport type { ASTVisitors } from '../types.js';\n\n/**\n * Walk a TypeScript AST tree, calling visitor functions for matching node kinds.\n *\n * Visitors are keyed by SyntaxKind name (e.g., 'CallExpression', 'IfStatement').\n *\n * @param node - Root node to walk\n * @param visitors - Map of node kind name to visitor function\n *\n * @example\n * ```typescript\n * walkAST(sourceFile, {\n *   CallExpression(node) {\n *     console.log('Found call at', node.getStart());\n *   },\n *   IfStatement(node) {\n *     console.log('Found if at', node.getStart());\n *   },\n * });\n * ```\n */\nexport function walkAST(node: ts.Node, visitors: ASTVisitors): void {\n  const kindName = ts.SyntaxKind[node.kind];\n\n  /* v8 ignore next */\n  let visitor = kindName !== undefined ? visitors[kindName] : undefined;\n\n  // Handle SyntaxKind aliases (e.g., NumericLiteral vs FirstLiteralToken)\n  if (!visitor) {\n    for (const key of Object.keys(visitors)) {\n      if ((ts.SyntaxKind as Record<string, unknown>)[key] === node.kind) {\n        visitor = visitors[key];\n        break;\n      }\n    }\n  }\n\n  if (visitor) {\n    visitor(node);\n  }\n\n  ts.forEachChild(node, (child) => walkAST(child, visitors));\n}\n\n/**\n * Calculate cyclomatic complexity of an AST node.\n *\n * Counts decision points: if, else if, case, for, while, do, &&, ||, ??, ?., catch, ternary.\n * Base complexity is 1.\n *\n * @param node - AST node (typically a function body)\n * @returns Cyclomatic complexity score\n *\n * @example\n * ```typescript\n * const complexity = calculateComplexity(functionDeclaration);\n * // Returns >= 1\n * ```\n */\nexport function calculateComplexity(node: ts.Node): number {\n  let complexity = 1;\n\n  const visit = (child: ts.Node): void => {\n    switch (child.kind) {\n      case ts.SyntaxKind.IfStatement:\n      case ts.SyntaxKind.ForStatement:\n      case ts.SyntaxKind.ForInStatement:\n      case ts.SyntaxKind.ForOfStatement:\n      case ts.SyntaxKind.WhileStatement:\n      case ts.SyntaxKind.DoStatement:\n      case ts.SyntaxKind.CatchClause:\n      case ts.SyntaxKind.ConditionalExpression:\n        complexity++;\n        break;\n      case ts.SyntaxKind.CaseClause:\n        complexity++;\n        break;\n      case ts.SyntaxKind.BinaryExpression: {\n        const binExpr = child as ts.BinaryExpression;\n        if (\n          binExpr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken ||\n          binExpr.operatorToken.kind === ts.SyntaxKind.BarBarToken ||\n          binExpr.operatorToken.kind === ts.SyntaxKind.QuestionQuestionToken\n        ) {\n          complexity++;\n        }\n        break;\n      }\n    }\n\n    ts.forEachChild(child, visit);\n  };\n\n  ts.forEachChild(node, visit);\n  return complexity;\n}\n\n/**\n * Count lines of code in a source file (excluding blank lines and comment-only lines).\n *\n * @param sourceFile - TypeScript SourceFile\n * @returns Number of lines of code\n *\n * @example\n * ```typescript\n * const loc = countLOC(sourceFile);\n * ```\n */\nexport function countLOC(sourceFile: ts.SourceFile): number {\n  const text = sourceFile.getFullText();\n  const lines = text.split('\\n');\n  let count = 0;\n\n  for (const line of lines) {\n    const trimmed = line.trim();\n    if (trimmed.length > 0 && !trimmed.startsWith('//') && !trimmed.startsWith('/*') && !trimmed.startsWith('*')) {\n      count++;\n    }\n  }\n\n  return count;\n}\n","/**\n * Simple glob pattern matching (zero dependencies).\n * Supports `*`, `**`, and `?` wildcards.\n *\n * @example\n * ```typescript\n * import { globMatch } from './glob';\n * globMatch('src/services/user.service.ts', 'src/**\\/*.service.ts'); // true\n * globMatch('test.js', '*.ts'); // false\n * ```\n */\n\n/**\n * Convert a glob pattern to a regular expression.\n *\n * @param pattern - Glob pattern\n * @returns RegExp equivalent\n *\n * @example\n * ```typescript\n * const re = globToRegex('src/**\\/*.ts');\n * re.test('src/utils/helper.ts'); // true\n * ```\n */\nexport function globToRegex(pattern: string): RegExp {\n  let result = '';\n  let i = 0;\n  const len = pattern.length;\n\n  while (i < len) {\n    const c = pattern[i]!;\n\n    if (c === '*') {\n      if (pattern[i + 1] === '*') {\n        // ** matches any path segment(s)\n        if (pattern[i + 2] === '/') {\n          result += '(?:.+/)?';\n          i += 3;\n        } else {\n          result += '.*';\n          i += 2;\n        }\n      } else {\n        // * matches anything except /\n        result += '[^/]*';\n        i++;\n      }\n    } else if (c === '?') {\n      result += '[^/]';\n      i++;\n    } else if (c === '.' || c === '(' || c === ')' || c === '{' || c === '}' || c === '[' || c === ']' || c === '+' || c === '^' || c === '$' || c === '|' || c === '\\\\') {\n      result += '\\\\' + c;\n      i++;\n    } else {\n      result += c;\n      i++;\n    }\n  }\n\n  return new RegExp(`^${result}$`);\n}\n\n/**\n * Test if a file path matches a glob pattern.\n *\n * @param filePath - File path to test (uses forward slashes)\n * @param pattern - Glob pattern\n * @returns true if the path matches\n *\n * @example\n * ```typescript\n * globMatch('src/index.ts', 'src/**\\/*.ts'); // true\n * globMatch('lib/index.js', 'src/**\\/*.ts'); // false\n * ```\n */\nexport function globMatch(filePath: string, pattern: string): boolean {\n  const normalized = filePath.replace(/\\\\/g, '/');\n  const normalizedPattern = pattern.replace(/\\\\/g, '/');\n  const regex = globToRegex(normalizedPattern);\n  return regex.test(normalized);\n}\n\n/**\n * Test if a file path matches any of the given glob patterns.\n *\n * @param filePath - File path to test\n * @param patterns - Array of glob patterns\n * @returns true if the path matches at least one pattern\n *\n * @example\n * ```typescript\n * globMatchAny('test.spec.ts', ['**\\/*.test.ts', '**\\/*.spec.ts']); // true\n * ```\n */\nexport function globMatchAny(filePath: string, patterns: string[]): boolean {\n  return patterns.some((p) => globMatch(filePath, p));\n}\n","import ts from 'typescript';\nimport * as path from 'node:path';\nimport type {\n  CodebaseGraph,\n  FileNode,\n  FileRole,\n  FunctionNode,\n  LayerDefinition,\n  SymbolNode,\n} from '../types.js';\nimport { createTSProgram, getSourceFiles } from '../ast/parser.js';\nimport { extractExports, extractFunctions, extractImports } from '../ast/helpers.js';\nimport { calculateComplexity, countLOC } from '../ast/walker.js';\nimport { relativePath } from '../utils/fs.js';\nimport { globMatchAny } from '../utils/glob.js';\n\n/**\n * Build a complete codebase knowledge graph.\n *\n * @param rootDir - Project root directory\n * @param tsconfigPath - Path to tsconfig.json\n * @param include - Glob patterns for files to include\n * @param exclude - Glob patterns for files to exclude\n * @param layers - Architectural layer definitions\n * @returns Complete CodebaseGraph\n *\n * @example\n * ```typescript\n * const graph = buildGraph('/project', './tsconfig.json', ['src/**\\/*.ts'], ['**\\/*.test.ts']);\n * console.log(`${graph.files.size} files scanned`);\n * ```\n */\nexport function buildGraph(\n  rootDir: string,\n  tsconfigPath: string,\n  include: string[],\n  exclude: string[],\n  layers: string[] = ['controller', 'service', 'repository', 'util'],\n): CodebaseGraph {\n  const program = createTSProgram(rootDir, tsconfigPath);\n  const checker = program.getTypeChecker();\n  const sourceFilePaths = getSourceFiles(program);\n\n  const graph: CodebaseGraph = {\n    files: new Map(),\n    symbols: new Map(),\n    edges: [],\n    layers: buildLayerDefinitions(layers),\n    patterns: [],\n    dependencies: { adjacency: new Map() },\n  };\n\n  // Filter files by include/exclude\n  const filteredPaths = sourceFilePaths.filter((fp) => {\n    const rel = relativePath(rootDir, fp);\n    const included = include.length === 0 || globMatchAny(rel, include);\n    const excluded = exclude.length > 0 && globMatchAny(rel, exclude);\n    return included && !excluded;\n  });\n\n  // Process each file\n  for (const filePath of filteredPaths) {\n    const sourceFile = program.getSourceFile(filePath);\n    /* v8 ignore next */\n    if (!sourceFile) continue;\n\n    const relPath = relativePath(rootDir, filePath);\n    processFile(graph, sourceFile, relPath, rootDir, checker);\n  }\n\n  // Build dependency graph\n  buildDependencyGraph(graph);\n\n  return graph;\n}\n\n/**\n * Process a single file and add its data to the graph.\n *\n * @example\n * ```typescript\n * processFile(graph, sourceFile, 'src/services/user.ts', rootDir, checker);\n * ```\n */\nexport function processFile(\n  graph: CodebaseGraph,\n  sourceFile: ts.SourceFile,\n  relPath: string,\n  rootDir: string,\n  _checker: ts.TypeChecker,\n): void {\n  const imports = extractImports(sourceFile);\n  const exports = extractExports(sourceFile);\n  const rawFunctions = extractFunctions(sourceFile, relPath);\n  const role = detectFileRole(relPath);\n  const layer = detectLayer(relPath);\n  const loc = countLOC(sourceFile);\n\n  // Build function nodes\n  const functions: FunctionNode[] = rawFunctions.map((fn) => ({\n    name: fn.name,\n    file: relPath,\n    startLine: fn.startLine,\n    endLine: fn.endLine,\n    params: fn.params,\n    returnType: fn.returnType,\n    complexity: calculateComplexity(fn.node),\n    isAsync: fn.isAsync,\n    hasSideEffects: false,\n    issues: [],\n  }));\n\n  // Calculate file complexity\n  const fileComplexity = functions.reduce((sum, fn) => sum + fn.complexity, 0);\n\n  const fileNode: FileNode = {\n    path: relPath,\n    role,\n    layer,\n    exports,\n    imports,\n    complexity: fileComplexity,\n    loc,\n    functions,\n  };\n\n  graph.files.set(relPath, fileNode);\n\n  // Add symbol nodes\n  for (const exportName of exports) {\n    const symbolNode: SymbolNode = {\n      name: exportName,\n      kind: 'variable',\n      file: relPath,\n      usedBy: [],\n      dependsOn: [],\n      isPublicAPI: false,\n    };\n    graph.symbols.set(`${relPath}:${exportName}`, symbolNode);\n  }\n\n  // Add import edges\n  for (const imp of imports) {\n    const resolvedPath = resolveImportPath(relPath, imp.source, rootDir);\n    if (resolvedPath) {\n      graph.edges.push({\n        from: relPath,\n        to: resolvedPath,\n        specifiers: imp.specifiers,\n        isTypeOnly: imp.isTypeOnly,\n      });\n    }\n  }\n}\n\n/**\n * Detect file role from path patterns.\n *\n * @example\n * ```typescript\n * detectFileRole('src/services/user.service.ts'); // 'service'\n * detectFileRole('src/controllers/auth.ts');       // 'controller'\n * detectFileRole('tests/user.test.ts');            // 'test'\n * ```\n */\nexport function detectFileRole(filePath: string): FileRole {\n  const lower = filePath.toLowerCase();\n\n  if (/\\.(test|spec)\\.(ts|tsx|js|jsx)$/.test(lower) || lower.includes('/tests/') || lower.includes('/__tests__/')) {\n    return 'test';\n  }\n  if (lower.includes('/controller') || lower.includes('.controller.')) return 'controller';\n  if (lower.includes('/service') || lower.includes('.service.')) return 'service';\n  if (lower.includes('/repositor') || lower.includes('.repository.') || lower.includes('.repo.')) return 'repository';\n  if (lower.includes('/util') || lower.includes('/helper') || lower.includes('.util.') || lower.includes('.helper.')) return 'util';\n  if (lower.includes('/type') || lower.endsWith('.d.ts') || lower.includes('.types.')) return 'type';\n  if (lower.includes('/config') || lower.includes('.config.')) return 'config';\n\n  return 'unknown';\n}\n\n/**\n * Detect architectural layer from file path.\n *\n * @example\n * ```typescript\n * detectLayer('src/controllers/user.ts'); // 'controller'\n * detectLayer('src/services/auth.ts');    // 'service'\n * detectLayer('src/utils/hash.ts');       // 'util'\n * ```\n */\nexport function detectLayer(filePath: string): string {\n  const lower = filePath.toLowerCase();\n\n  if (lower.includes('/controller')) return 'controller';\n  if (lower.includes('/service')) return 'service';\n  if (lower.includes('/repositor')) return 'repository';\n  if (lower.includes('/util') || lower.includes('/helper')) return 'util';\n  if (lower.includes('/middleware')) return 'middleware';\n  if (lower.includes('/model')) return 'model';\n\n  return 'unknown';\n}\n\n/**\n * Build layer definitions from layer names.\n */\nfunction buildLayerDefinitions(layers: string[]): LayerDefinition[] {\n  return layers.map((name, index) => ({\n    name,\n    order: index,\n    patterns: [`**/${name}s/**`, `**/${name}/**`, `**/*.${name}.*`],\n  }));\n}\n\n/**\n * Resolve an import path to a relative file path.\n */\nfunction resolveImportPath(\n  fromFile: string,\n  importSource: string,\n  _rootDir: string,\n): string | undefined {\n  // Skip external imports (node_modules, node: prefix, etc.)\n  if (!importSource.startsWith('.') && !importSource.startsWith('/')) {\n    return undefined;\n  }\n\n  const fromDir = path.dirname(fromFile);\n  let resolved = path.posix.join(fromDir, importSource);\n\n  // Handle .js/.jsx -> .ts/.tsx mapping (ESM moduleResolution: NodeNext)\n  if (resolved.endsWith('.js')) {\n    resolved = resolved.slice(0, -3) + '.ts';\n  /* v8 ignore next 2 */\n  } else if (resolved.endsWith('.jsx')) {\n    resolved = resolved.slice(0, -4) + '.tsx';\n  } else if (!resolved.endsWith('.ts') && !resolved.endsWith('.tsx')) {\n    resolved = resolved + '.ts';\n  }\n\n  return resolved.replace(/\\\\/g, '/');\n}\n\n/**\n * Build dependency graph (adjacency list) from import edges.\n */\nfunction buildDependencyGraph(graph: CodebaseGraph): void {\n  const adjacency = new Map<string, Set<string>>();\n\n  // Initialize all files\n  for (const filePath of graph.files.keys()) {\n    adjacency.set(filePath, new Set());\n  }\n\n  // Add edges\n  for (const edge of graph.edges) {\n    const deps = adjacency.get(edge.from);\n    if (deps) {\n      deps.add(edge.to);\n    }\n  }\n\n  // Update usedBy for symbols\n  for (const edge of graph.edges) {\n    for (const spec of edge.specifiers) {\n      const symbolKey = `${edge.to}:${spec}`;\n      const symbol = graph.symbols.get(symbolKey);\n      if (symbol) {\n        symbol.usedBy.push(edge.from);\n      }\n    }\n  }\n\n  graph.dependencies = { adjacency };\n}\n","import * as path from 'node:path';\nimport type { CodebaseGraph, SerializedGraph } from '../types.js';\nimport { fileExists, readJsonSync, writeJsonSync } from '../utils/fs.js';\nimport { GraphError } from '../errors.js';\n\nconst GRAPH_VERSION = '1.0.0';\n\n/**\n * Serialize a CodebaseGraph to a JSON-safe object for caching.\n *\n * @param graph - The graph to serialize\n * @returns Serialized graph object\n *\n * @example\n * ```typescript\n * const serialized = serializeGraph(graph);\n * writeJsonSync('.codeguardian/graph.json', serialized);\n * ```\n */\nexport function serializeGraph(graph: CodebaseGraph): SerializedGraph {\n  return {\n    version: GRAPH_VERSION,\n    timestamp: Date.now(),\n    files: Array.from(graph.files.entries()),\n    symbols: Array.from(graph.symbols.entries()),\n    edges: graph.edges,\n    layers: graph.layers,\n    patterns: graph.patterns,\n    adjacency: Array.from(graph.dependencies.adjacency.entries()).map(\n      ([key, value]) => [key, Array.from(value)] as [string, string[]],\n    ),\n  };\n}\n\n/**\n * Deserialize a cached graph back into a CodebaseGraph.\n *\n * @param data - Serialized graph data\n * @returns Reconstructed CodebaseGraph\n *\n * @example\n * ```typescript\n * const data = readJsonSync<SerializedGraph>('.codeguardian/graph.json');\n * const graph = deserializeGraph(data);\n * ```\n */\nexport function deserializeGraph(data: SerializedGraph): CodebaseGraph {\n  if (data.version !== GRAPH_VERSION) {\n    throw new GraphError(`Graph cache version mismatch: expected ${GRAPH_VERSION}, got ${data.version}`);\n  }\n\n  const adjacency = new Map<string, Set<string>>();\n  for (const [key, values] of data.adjacency) {\n    adjacency.set(key, new Set(values));\n  }\n\n  return {\n    files: new Map(data.files),\n    symbols: new Map(data.symbols),\n    edges: data.edges,\n    layers: data.layers,\n    patterns: data.patterns,\n    dependencies: { adjacency },\n  };\n}\n\n/**\n * Save graph to the .codeguardian cache directory.\n *\n * @param rootDir - Project root directory\n * @param graph - Graph to save\n *\n * @example\n * ```typescript\n * saveGraphCache('/my-project', graph);\n * ```\n */\nexport function saveGraphCache(rootDir: string, graph: CodebaseGraph): void {\n  const cachePath = path.join(rootDir, '.codeguardian', 'graph.json');\n  const serialized = serializeGraph(graph);\n  writeJsonSync(cachePath, serialized);\n}\n\n/**\n * Load graph from the .codeguardian cache directory.\n *\n * @param rootDir - Project root directory\n * @returns Cached graph or null if not found/invalid\n *\n * @example\n * ```typescript\n * const graph = loadGraphCache('/my-project');\n * if (graph) { console.log('Loaded cached graph'); }\n * ```\n */\nexport function loadGraphCache(rootDir: string): CodebaseGraph | null {\n  const cachePath = path.join(rootDir, '.codeguardian', 'graph.json');\n\n  if (!fileExists(cachePath)) {\n    return null;\n  }\n\n  try {\n    const data = readJsonSync<SerializedGraph>(cachePath);\n    return deserializeGraph(data);\n  } catch {\n    return null;\n  }\n}\n","import ts from 'typescript';\nimport * as path from 'node:path';\nimport type { CodebaseGraph, IncrementalResult } from '../types.js';\nimport { processFile } from './builder.js';\nimport { parseFile } from '../ast/parser.js';\nimport { relativePath } from '../utils/fs.js';\n\n/**\n * Incrementally update the graph with changed files.\n *\n * @param graph - Existing graph to update\n * @param changedFiles - List of changed file paths (relative to rootDir)\n * @param rootDir - Project root directory\n * @param program - TypeScript program (for type checking)\n * @returns IncrementalResult with changed and affected files\n *\n * @example\n * ```typescript\n * const result = updateGraphIncremental(graph, ['src/service.ts'], '/project', program);\n * console.log(`Updated ${result.changedFiles.length} files`);\n * ```\n */\nexport function updateGraphIncremental(\n  graph: CodebaseGraph,\n  changedFiles: string[],\n  rootDir: string,\n  program: ts.Program,\n): IncrementalResult {\n  const checker = program.getTypeChecker();\n  const affectedFiles = new Set<string>();\n\n  for (const filePath of changedFiles) {\n    const relPath = filePath.startsWith(rootDir)\n      ? relativePath(rootDir, filePath)\n      : filePath;\n\n    // Find files that import this file BEFORE removing old data\n    const dependents = findDependents(graph, relPath);\n    for (const dep of dependents) {\n      affectedFiles.add(dep);\n    }\n\n    // Remove old data for this file\n    removeFileFromGraph(graph, relPath);\n\n    // Re-parse the file\n    const absolutePath = path.resolve(rootDir, relPath);\n    try {\n      const sourceFile = program.getSourceFile(absolutePath) ?? parseFile(absolutePath);\n      processFile(graph, sourceFile, relPath, rootDir, checker);\n    } catch {\n      // File might have been deleted\n      continue;\n    }\n\n    affectedFiles.add(relPath);\n  }\n\n  // Rebuild dependency adjacency\n  rebuildAdjacency(graph);\n\n  return {\n    changedFiles,\n    affectedFiles: Array.from(affectedFiles),\n    graph,\n  };\n}\n\n/**\n * Remove all graph data related to a specific file.\n */\nfunction removeFileFromGraph(graph: CodebaseGraph, filePath: string): void {\n  // Remove file node\n  graph.files.delete(filePath);\n\n  // Remove symbols from this file\n  const symbolKeysToDelete: string[] = [];\n  for (const [key, symbol] of graph.symbols) {\n    if (symbol.file === filePath) {\n      symbolKeysToDelete.push(key);\n    }\n  }\n  for (const key of symbolKeysToDelete) {\n    graph.symbols.delete(key);\n  }\n\n  // Remove edges from/to this file\n  graph.edges = graph.edges.filter(\n    (edge) => edge.from !== filePath && edge.to !== filePath,\n  );\n\n  // Remove from dependency graph\n  graph.dependencies.adjacency.delete(filePath);\n  for (const deps of graph.dependencies.adjacency.values()) {\n    deps.delete(filePath);\n  }\n}\n\n/**\n * Find all files that depend on (import from) the given file.\n */\nfunction findDependents(graph: CodebaseGraph, filePath: string): string[] {\n  const dependents: string[] = [];\n\n  for (const [file, deps] of graph.dependencies.adjacency) {\n    if (deps.has(filePath)) {\n      dependents.push(file);\n    }\n  }\n\n  return dependents;\n}\n\n/**\n * Rebuild the dependency adjacency list from edges.\n */\nfunction rebuildAdjacency(graph: CodebaseGraph): void {\n  const adjacency = new Map<string, Set<string>>();\n\n  for (const filePath of graph.files.keys()) {\n    adjacency.set(filePath, new Set());\n  }\n\n  for (const edge of graph.edges) {\n    const deps = adjacency.get(edge.from);\n    if (deps) {\n      deps.add(edge.to);\n    }\n  }\n\n  graph.dependencies.adjacency = adjacency;\n}\n","import type { CodebaseGraph, FileNode, SymbolNode } from '../types.js';\n\n/**\n * Get a file node from the graph.\n *\n * @example\n * ```typescript\n * const file = getFile(graph, 'src/services/user.service.ts');\n * ```\n */\nexport function getFile(graph: CodebaseGraph, filePath: string): FileNode | undefined {\n  return graph.files.get(filePath);\n}\n\n/**\n * Get a symbol node from the graph.\n *\n * @example\n * ```typescript\n * const symbol = getSymbol(graph, 'UserService');\n * ```\n */\nexport function getSymbol(graph: CodebaseGraph, name: string): SymbolNode | undefined {\n  // Try direct lookup first\n  for (const [, symbol] of graph.symbols) {\n    if (symbol.name === name) {\n      return symbol;\n    }\n  }\n  return undefined;\n}\n\n/**\n * Get all files that the given file depends on (imports from).\n *\n * @example\n * ```typescript\n * const deps = getDependencies(graph, 'src/controllers/user.controller.ts');\n * // ['src/services/user.service.ts', 'src/types.ts']\n * ```\n */\nexport function getDependencies(graph: CodebaseGraph, filePath: string): string[] {\n  const deps = graph.dependencies.adjacency.get(filePath);\n  return deps ? Array.from(deps) : [];\n}\n\n/**\n * Get all files that depend on (import from) the given file.\n *\n * @example\n * ```typescript\n * const dependents = getDependents(graph, 'src/services/user.service.ts');\n * // ['src/controllers/user.controller.ts']\n * ```\n */\nexport function getDependents(graph: CodebaseGraph, filePath: string): string[] {\n  const dependents: string[] = [];\n  for (const [file, deps] of graph.dependencies.adjacency) {\n    if (deps.has(filePath)) {\n      dependents.push(file);\n    }\n  }\n  return dependents;\n}\n\n/**\n * Find all circular dependency chains in the graph.\n *\n * Uses DFS cycle detection on the dependency adjacency list.\n *\n * @returns Array of circular dependency chains (each chain is a string array of file paths)\n *\n * @example\n * ```typescript\n * const cycles = findCircularDeps(graph);\n * // [['a.ts', 'b.ts', 'c.ts', 'a.ts']]\n * ```\n */\nexport function findCircularDeps(graph: CodebaseGraph): string[][] {\n  const cycles: string[][] = [];\n  const visited = new Set<string>();\n  const inStack = new Set<string>();\n  const stack: string[] = [];\n\n  const dfs = (node: string): void => {\n    if (inStack.has(node)) {\n      // Found a cycle\n      const cycleStart = stack.indexOf(node);\n      if (cycleStart !== -1) {\n        const cycle = [...stack.slice(cycleStart), node];\n        cycles.push(cycle);\n      }\n      return;\n    }\n\n    if (visited.has(node)) return;\n\n    visited.add(node);\n    inStack.add(node);\n    stack.push(node);\n\n    const deps = graph.dependencies.adjacency.get(node);\n    if (deps) {\n      for (const dep of deps) {\n        dfs(dep);\n      }\n    }\n\n    stack.pop();\n    inStack.delete(node);\n  };\n\n  for (const node of graph.dependencies.adjacency.keys()) {\n    dfs(node);\n  }\n\n  return cycles;\n}\n\n/**\n * Get graph statistics.\n *\n * @example\n * ```typescript\n * const stats = getGraphStats(graph);\n * console.log(`${stats.totalFiles} files, ${stats.totalSymbols} symbols`);\n * ```\n */\nexport function getGraphStats(graph: CodebaseGraph): {\n  totalFiles: number;\n  totalSymbols: number;\n  totalEdges: number;\n  totalFunctions: number;\n  totalLOC: number;\n  avgComplexity: number;\n  filesByRole: Record<string, number>;\n  filesByLayer: Record<string, number>;\n} {\n  let totalFunctions = 0;\n  let totalLOC = 0;\n  let totalComplexity = 0;\n  const filesByRole: Record<string, number> = {};\n  const filesByLayer: Record<string, number> = {};\n\n  for (const file of graph.files.values()) {\n    totalFunctions += file.functions.length;\n    totalLOC += file.loc;\n    totalComplexity += file.complexity;\n\n    filesByRole[file.role] = (filesByRole[file.role] ?? 0) + 1;\n    filesByLayer[file.layer] = (filesByLayer[file.layer] ?? 0) + 1;\n  }\n\n  const fileCount = graph.files.size;\n\n  return {\n    totalFiles: fileCount,\n    totalSymbols: graph.symbols.size,\n    totalEdges: graph.edges.length,\n    totalFunctions,\n    totalLOC,\n    avgComplexity: fileCount > 0 ? totalComplexity / fileCount : 0,\n    filesByRole,\n    filesByLayer,\n  };\n}\n","import ts from 'typescript';\nimport type { CodebaseGraph, FileNode, ImportInfo, RuleContext, ASTVisitors } from '../types.js';\nimport { walkAST } from '../ast/walker.js';\nimport {\n  isCallTo as astIsCallTo,\n  isConsoleCall as astIsConsoleCall,\n  getTypeString as astGetTypeString,\n  hasStringConcat as astHasStringConcat,\n  extractImports,\n} from '../ast/helpers.js';\n\n/**\n * Create a RuleContext for a given file.\n *\n * @param file - FileNode from the graph\n * @param ast - TypeScript SourceFile AST\n * @param graph - Full codebase graph\n * @param program - TypeScript Program\n * @param checker - TypeScript TypeChecker\n * @param pluginConfig - Plugin-specific configuration\n * @returns RuleContext instance\n *\n * @example\n * ```typescript\n * const context = createRuleContext(fileNode, sourceFile, graph, program, checker, {});\n * const findings = rule.check(context);\n * ```\n */\nexport function createRuleContext(\n  file: FileNode,\n  ast: ts.SourceFile,\n  graph: CodebaseGraph,\n  program: ts.Program,\n  checker: ts.TypeChecker,\n  pluginConfig: Record<string, unknown> = {},\n): RuleContext {\n  return {\n    file,\n    ast,\n    graph,\n    program,\n    checker,\n\n    walk(node: ts.Node, visitors: ASTVisitors): void {\n      walkAST(node, visitors);\n    },\n\n    isCallTo(node: ts.CallExpression, name: string): boolean {\n      return astIsCallTo(node, name);\n    },\n\n    isConsoleCall(node: ts.CallExpression, method?: string): boolean {\n      return astIsConsoleCall(node, method);\n    },\n\n    getTypeString(node: ts.Node): string {\n      return astGetTypeString(node, checker);\n    },\n\n    hasStringConcat(node: ts.Node): boolean {\n      return astHasStringConcat(node);\n    },\n\n    getImports(): ImportInfo[] {\n      return extractImports(ast);\n    },\n\n    isExternallyUsed(symbolName: string): boolean {\n      const symbolKey = `${file.path}:${symbolName}`;\n      const symbol = graph.symbols.get(symbolKey);\n      if (!symbol) return false;\n      return symbol.usedBy.length > 0;\n    },\n\n    config: pluginConfig,\n  };\n}\n","import ts from 'typescript';\nimport type { SuppressionDirective } from '../types.js';\n\n/**\n * Parse inline suppression comments from a source file.\n *\n * Supports:\n * - `// codeguardian-disable-next-line rule1 rule2`\n * - `// codeguardian-disable rule1 -- reason`\n * - `// codeguardian-enable rule1`\n *\n * @param sourceFile - TypeScript SourceFile\n * @returns Array of suppression directives\n *\n * @example\n * ```typescript\n * const suppressions = parseSuppressions(sourceFile);\n * // [{ type: 'disable-next-line', rules: ['security/sql-injection'], line: 10 }]\n * ```\n */\nexport function parseSuppressions(sourceFile: ts.SourceFile): SuppressionDirective[] {\n  const directives: SuppressionDirective[] = [];\n  const text = sourceFile.getFullText();\n  const lines = text.split('\\n');\n\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i]!.trim();\n\n    // Match codeguardian comments\n    const match = line.match(\n      /\\/\\/\\s*codeguardian-(disable-next-line|disable|enable)\\s+(.*)/,\n    );\n\n    if (!match) continue;\n\n    const type = match[1] as SuppressionDirective['type'];\n    const rest = match[2]!.trim();\n\n    // Parse rules and optional reason (separated by --)\n    const reasonSplit = rest.split('--');\n    const rulesPart = reasonSplit[0]!.trim();\n    const reason = reasonSplit[1]?.trim();\n\n    const rules = rulesPart\n      .split(/\\s+/)\n      .filter((r) => r.length > 0);\n\n    if (rules.length > 0) {\n      directives.push({\n        type,\n        rules,\n        reason,\n        line: i + 1,\n      });\n    }\n  }\n\n  return directives;\n}\n\n/**\n * Check if a specific rule is suppressed at a given line.\n *\n * @param directives - Parsed suppression directives\n * @param ruleName - Rule name to check (e.g., 'security/sql-injection')\n * @param line - Line number (1-based)\n * @returns true if the rule is suppressed at that line\n *\n * @example\n * ```typescript\n * const suppressed = isRuleSuppressed(directives, 'security/sql-injection', 42);\n * ```\n */\nexport function isRuleSuppressed(\n  directives: SuppressionDirective[],\n  ruleName: string,\n  line: number,\n): boolean {\n  // Track active disable regions\n  let disabled = false;\n\n  for (const directive of directives) {\n    if (!directive.rules.includes(ruleName)) continue;\n\n    if (directive.type === 'disable-next-line') {\n      // Suppresses the next line only\n      if (directive.line + 1 === line) {\n        return true;\n      }\n    } else if (directive.type === 'disable') {\n      // Start suppression region\n      if (directive.line <= line) {\n        disabled = true;\n      }\n    } else if (directive.type === 'enable') {\n      // End suppression region\n      if (directive.line <= line) {\n        disabled = false;\n      }\n    }\n  }\n\n  return disabled;\n}\n","import ts from 'typescript';\nimport * as path from 'node:path';\nimport type {\n  CodebaseGraph,\n  Finding,\n  Rule,\n  RunResult,\n  RunStats,\n  Severity,\n} from '../types.js';\nimport { createRuleContext } from './context.js';\nimport { isRuleSuppressed, parseSuppressions } from './suppression.js';\n\n/**\n * Execute all rules against the given files and return results.\n *\n * @param graph - Codebase knowledge graph\n * @param rules - Array of rules to execute\n * @param targetFiles - File paths to analyze (subset of graph)\n * @param program - TypeScript Program\n * @param config - Plugin configs\n * @param ignoredRules - Rules to skip globally\n * @param ignoredFiles - Files to skip\n * @returns RunResult with findings, stats, and block status\n *\n * @example\n * ```typescript\n * const result = await executeRules(graph, rules, ['src/index.ts'], program, {}, [], []);\n * console.log(`${result.findings.length} findings`);\n * ```\n */\nexport async function executeRules(\n  graph: CodebaseGraph,\n  rules: Rule[],\n  targetFiles: string[],\n  program: ts.Program,\n  config: Record<string, Record<string, unknown>>,\n  ignoredRules: string[],\n  ignoredFiles: string[],\n  blockOn: Severity[] = ['critical', 'error'],\n  rootDir?: string,\n): Promise<RunResult> {\n  const startTime = Date.now();\n  const parseStart = Date.now();\n  const allFindings: Finding[] = [];\n  let rulesExecuted = 0;\n\n  const checker = program.getTypeChecker();\n  const parseTime = Date.now() - parseStart;\n  const analysisStart = Date.now();\n\n  // Filter out ignored rules\n  const activeRules = rules.filter((r) => !ignoredRules.includes(r.name));\n\n  for (const filePath of targetFiles) {\n    // Skip ignored files\n    if (ignoredFiles.includes(filePath)) continue;\n\n    const fileNode = graph.files.get(filePath);\n    if (!fileNode) continue;\n\n    // Get AST — resolve relative paths against rootDir\n    const absPath = rootDir ? path.resolve(rootDir, filePath) : filePath;\n    const sourceFile = program.getSourceFile(absPath);\n    if (!sourceFile) continue;\n\n    // Parse suppressions for this file\n    const suppressions = parseSuppressions(sourceFile);\n\n    for (const rule of activeRules) {\n      // Get plugin config\n      /* v8 ignore next */\n      const pluginName = rule.name.split('/')[0] ?? '';\n      const pluginConfig = config[pluginName] ?? {};\n\n      // Create context\n      const context = createRuleContext(\n        fileNode,\n        sourceFile,\n        graph,\n        program,\n        checker,\n        pluginConfig,\n      );\n\n      try {\n        const findings = await rule.check(context);\n        rulesExecuted++;\n\n        for (const finding of findings) {\n          // Check suppression\n          if (isRuleSuppressed(suppressions, rule.name, finding.line)) {\n            continue;\n          }\n\n          // Add rule metadata\n          allFindings.push({\n            ...finding,\n            rule: finding.rule ?? rule.name,\n            severity: finding.severity ?? rule.severity,\n          });\n        }\n      } catch (err) {\n        // Rule execution error — don't crash, just skip\n        allFindings.push({\n          message: `Rule ${rule.name} failed: ${err instanceof Error ? err.message : String(err)}`,\n          file: filePath,\n          line: 0,\n          column: 0,\n          rule: rule.name,\n          severity: 'warning',\n        });\n      }\n    }\n  }\n\n  const analysisTime = Date.now() - analysisStart;\n  const duration = Date.now() - startTime;\n\n  // Group findings\n  const bySeverity: Record<Severity, Finding[]> = {\n    critical: [],\n    error: [],\n    warning: [],\n    info: [],\n  };\n\n  const byFile: Record<string, Finding[]> = {};\n\n  for (const finding of allFindings) {\n    /* v8 ignore next */\n    const sev = finding.severity ?? 'info';\n    bySeverity[sev].push(finding);\n\n    if (!byFile[finding.file]) {\n      byFile[finding.file] = [];\n    }\n    byFile[finding.file]!.push(finding);\n  }\n\n  // Determine if commit should be blocked\n  const blocked = allFindings.some(\n    (f) => f.severity && blockOn.includes(f.severity),\n  );\n\n  const stats: RunStats = {\n    filesAnalyzed: targetFiles.length,\n    rulesExecuted,\n    duration,\n    parseTime,\n    analysisTime,\n  };\n\n  return {\n    findings: allFindings,\n    stats,\n    blocked,\n    bySeverity,\n    byFile,\n  };\n}\n","import type { ProjectConfig } from '../types.js';\n\n/**\n * Default project configuration.\n *\n * @example\n * ```typescript\n * import { DEFAULT_CONFIG } from './defaults';\n * const config = { ...DEFAULT_CONFIG, rootDir: '/my-project' };\n * ```\n */\nexport const DEFAULT_CONFIG: ProjectConfig = {\n  rootDir: '.',\n  tsconfig: './tsconfig.json',\n  include: ['src/**/*.ts'],\n  exclude: ['**/*.test.ts', '**/*.spec.ts', '**/node_modules/**', '**/dist/**'],\n  severity: {\n    blockOn: ['critical', 'error'],\n    warnOn: ['warning'],\n    ignoreBelow: 'info',\n  },\n  plugins: {\n    architecture: {\n      enabled: true,\n      layers: ['controller', 'service', 'repository', 'util'],\n      enforceDirection: true,\n      maxFileLines: 300,\n      maxFunctionLines: 50,\n      maxFunctionComplexity: 15,\n    },\n    security: {\n      enabled: true,\n      checkInjection: true,\n      checkAuth: true,\n      checkSecrets: true,\n      checkXSS: true,\n      checkCSRF: true,\n    },\n    performance: {\n      enabled: true,\n      checkN1Queries: true,\n      checkMemoryLeaks: true,\n      checkAsyncPatterns: true,\n      checkBundleSize: false,\n    },\n    quality: {\n      enabled: true,\n      checkDeadCode: true,\n      checkNaming: true,\n      checkComplexity: true,\n      maxCyclomaticComplexity: 15,\n    },\n  },\n  ignore: {\n    rules: [],\n    files: [],\n    lines: {},\n  },\n};\n\n/**\n * Default configuration as JSON string (for writing .codeguardian.json).\n *\n * @example\n * ```typescript\n * writeFileSync('.codeguardian.json', getDefaultConfigJSON());\n * ```\n */\nexport function getDefaultConfigJSON(): string {\n  const { rootDir: _r, tsconfig: _t, ...rest } = DEFAULT_CONFIG;\n  return JSON.stringify(rest, null, 2);\n}\n","import type ts from 'typescript';\n\n// ─── Severity ───────────────────────────────────────────────\n\n/** Severity level for findings. */\nexport type Severity = 'critical' | 'error' | 'warning' | 'info';\n\n/** Ordered severity levels from most to least severe. */\nexport const SEVERITY_ORDER: readonly Severity[] = [\n  'critical',\n  'error',\n  'warning',\n  'info',\n] as const;\n\n// ─── File Roles ─────────────────────────────────────────────\n\n/** Detected role of a source file based on path and content. */\nexport type FileRole =\n  | 'controller'\n  | 'service'\n  | 'repository'\n  | 'util'\n  | 'type'\n  | 'config'\n  | 'test'\n  | 'unknown';\n\n// ─── Graph Types ────────────────────────────────────────────\n\n/**\n * Information about a single import statement.\n *\n * @example\n * ```typescript\n * const info: ImportInfo = {\n *   source: './user.service',\n *   specifiers: ['UserService'],\n *   isTypeOnly: false,\n * };\n * ```\n */\nexport interface ImportInfo {\n  /** Module specifier (e.g., './user.service') */\n  source: string;\n  /** Imported names */\n  specifiers: string[];\n  /** Whether this is a type-only import */\n  isTypeOnly: boolean;\n}\n\n/**\n * An edge in the import dependency graph.\n *\n * @example\n * ```typescript\n * const edge: ImportEdge = {\n *   from: 'src/controllers/user.controller.ts',\n *   to: 'src/services/user.service.ts',\n *   specifiers: ['UserService'],\n *   isTypeOnly: false,\n * };\n * ```\n */\nexport interface ImportEdge {\n  /** Importing file path */\n  from: string;\n  /** Imported file path */\n  to: string;\n  /** Imported symbol names */\n  specifiers: string[];\n  /** Whether type-only import */\n  isTypeOnly: boolean;\n}\n\n/** Parameter information for a function. */\nexport interface ParamInfo {\n  name: string;\n  type: string;\n  optional: boolean;\n}\n\n/** An issue detected in a function during graph building. */\nexport interface Issue {\n  message: string;\n  line: number;\n  column: number;\n}\n\n/**\n * A node representing a source file in the codebase graph.\n *\n * @example\n * ```typescript\n * const file: FileNode = {\n *   path: 'src/services/user.service.ts',\n *   role: 'service',\n *   layer: 'service',\n *   exports: ['UserService'],\n *   imports: [],\n *   complexity: 5,\n *   loc: 120,\n *   functions: [],\n * };\n * ```\n */\nexport interface FileNode {\n  /** Relative file path */\n  path: string;\n  /** Detected role */\n  role: FileRole;\n  /** Architectural layer */\n  layer: string;\n  /** Exported symbol names */\n  exports: string[];\n  /** Import information */\n  imports: ImportInfo[];\n  /** Cyclomatic complexity (sum of all functions) */\n  complexity: number;\n  /** Lines of code */\n  loc: number;\n  /** Functions defined in this file */\n  functions: FunctionNode[];\n}\n\n/**\n * A node representing a function in the codebase graph.\n *\n * @example\n * ```typescript\n * const fn: FunctionNode = {\n *   name: 'getUser',\n *   file: 'src/services/user.service.ts',\n *   startLine: 10,\n *   endLine: 25,\n *   params: [{ name: 'id', type: 'string', optional: false }],\n *   returnType: 'Promise<User>',\n *   complexity: 3,\n *   isAsync: true,\n *   hasSideEffects: true,\n *   issues: [],\n * };\n * ```\n */\nexport interface FunctionNode {\n  name: string;\n  file: string;\n  startLine: number;\n  endLine: number;\n  params: ParamInfo[];\n  returnType: string;\n  complexity: number;\n  isAsync: boolean;\n  hasSideEffects: boolean;\n  issues: Issue[];\n}\n\n/**\n * A node representing an exported symbol.\n *\n * @example\n * ```typescript\n * const sym: SymbolNode = {\n *   name: 'UserService',\n *   kind: 'class',\n *   file: 'src/services/user.service.ts',\n *   usedBy: ['src/controllers/user.controller.ts'],\n *   dependsOn: ['src/repositories/user.repository.ts'],\n *   isPublicAPI: true,\n * };\n * ```\n */\nexport interface SymbolNode {\n  name: string;\n  kind: 'function' | 'class' | 'interface' | 'type' | 'variable' | 'enum';\n  file: string;\n  usedBy: string[];\n  dependsOn: string[];\n  isPublicAPI: boolean;\n}\n\n/** Architectural layer definition. */\nexport interface LayerDefinition {\n  name: string;\n  order: number;\n  patterns: string[];\n}\n\n/** A detected pattern in the codebase. */\nexport interface DetectedPattern {\n  type: string;\n  description: string;\n  files: string[];\n  confidence: number;\n}\n\n/** Module dependency graph (adjacency list). */\nexport interface DependencyGraph {\n  /** Map of file path → set of file paths it depends on */\n  adjacency: Map<string, Set<string>>;\n}\n\n/**\n * The codebase knowledge graph — core data structure.\n *\n * @example\n * ```typescript\n * const graph: CodebaseGraph = {\n *   files: new Map(),\n *   symbols: new Map(),\n *   edges: [],\n *   layers: [],\n *   patterns: [],\n *   dependencies: { adjacency: new Map() },\n * };\n * ```\n */\nexport interface CodebaseGraph {\n  files: Map<string, FileNode>;\n  symbols: Map<string, SymbolNode>;\n  edges: ImportEdge[];\n  layers: LayerDefinition[];\n  patterns: DetectedPattern[];\n  dependencies: DependencyGraph;\n}\n\n// ─── Finding ────────────────────────────────────────────────\n\n/**\n * A single finding (issue) detected by a rule.\n *\n * @example\n * ```typescript\n * const finding: Finding = {\n *   message: 'console.log should not be in production code',\n *   file: 'src/services/user.service.ts',\n *   line: 42,\n *   column: 5,\n *   rule: 'quality/no-console',\n *   severity: 'warning',\n *   fix: { suggestion: 'Use a logger instead' },\n * };\n * ```\n */\nexport interface Finding {\n  message: string;\n  file: string;\n  line: number;\n  column: number;\n  rule?: string;\n  severity?: Severity;\n  fix?: {\n    suggestion: string;\n    replacement?: string;\n  };\n}\n\n// ─── Rule ───────────────────────────────────────────────────\n\n/** Category for grouping rules. */\nexport type RuleCategory = 'architecture' | 'security' | 'performance' | 'quality';\n\n/** AST visitor function map. */\nexport type ASTVisitors = {\n  [K in string]?: (node: ts.Node) => void;\n};\n\n/**\n * Context provided to rules during analysis.\n *\n * @example\n * ```typescript\n * const check = (context: RuleContext) => {\n *   const findings: Finding[] = [];\n *   context.walk(context.ast, {\n *     CallExpression(node) {\n *       if (context.isConsoleCall(node as ts.CallExpression)) {\n *         findings.push({ message: 'No console', file: context.file.path, line: 1, column: 1 });\n *       }\n *     },\n *   });\n *   return findings;\n * };\n * ```\n */\nexport interface RuleContext {\n  file: FileNode;\n  ast: ts.SourceFile;\n  graph: CodebaseGraph;\n  program: ts.Program;\n  checker: ts.TypeChecker;\n  walk: (node: ts.Node, visitors: ASTVisitors) => void;\n  isCallTo: (node: ts.CallExpression, name: string) => boolean;\n  isConsoleCall: (node: ts.CallExpression, method?: string) => boolean;\n  getTypeString: (node: ts.Node) => string;\n  hasStringConcat: (node: ts.Node) => boolean;\n  getImports: () => ImportInfo[];\n  isExternallyUsed: (symbolName: string) => boolean;\n  config: Record<string, unknown>;\n}\n\n/**\n * A single analysis rule.\n *\n * @example\n * ```typescript\n * const rule: Rule = {\n *   name: 'quality/no-any',\n *   severity: 'warning',\n *   description: 'Disallow any type',\n *   category: 'quality',\n *   check: (ctx) => [],\n * };\n * ```\n */\nexport interface Rule {\n  name: string;\n  severity: Severity;\n  description: string;\n  category: RuleCategory;\n  check: (context: RuleContext) => Finding[] | Promise<Finding[]>;\n}\n\n// ─── Plugin ─────────────────────────────────────────────────\n\n/**\n * The kernel interface exposed to plugins during installation.\n *\n * @example\n * ```typescript\n * const install = (kernel: GuardianKernel) => {\n *   kernel.registerRule(myRule);\n * };\n * ```\n */\nexport interface GuardianKernel<TConfig = unknown> {\n  registerRule: (rule: Rule) => void;\n  unregisterRule: (name: string) => void;\n  getRules: () => Rule[];\n  getConfig: () => TConfig;\n}\n\n/**\n * Plugin interface for extending codeguardian.\n *\n * @typeParam TConfig - Plugin-specific configuration type\n *\n * @example\n * ```typescript\n * const myPlugin: GuardianPlugin = {\n *   name: 'my-plugin',\n *   version: '1.0.0',\n *   install: (kernel) => {\n *     kernel.registerRule(myRule);\n *   },\n * };\n * ```\n */\nexport interface GuardianPlugin<TConfig = unknown> {\n  name: string;\n  version: string;\n  dependencies?: string[];\n  install: (kernel: GuardianKernel<TConfig>) => void;\n  onInit?: (graph: CodebaseGraph) => void | Promise<void>;\n  onDestroy?: () => void | Promise<void>;\n  onError?: (error: Error) => void;\n}\n\n// ─── Configuration ──────────────────────────────────────────\n\n/** Severity configuration for commit blocking. */\nexport interface SeverityConfig {\n  blockOn: Severity[];\n  warnOn: Severity[];\n  ignoreBelow?: Severity;\n}\n\n/** Architecture plugin config. */\nexport interface ArchitecturePluginConfig {\n  enabled: boolean;\n  layers?: string[];\n  enforceDirection?: boolean;\n  maxFileLines?: number;\n  maxFunctionLines?: number;\n  maxFunctionComplexity?: number;\n}\n\n/** Security plugin config. */\nexport interface SecurityPluginConfig {\n  enabled: boolean;\n  checkInjection?: boolean;\n  checkAuth?: boolean;\n  checkSecrets?: boolean;\n  checkXSS?: boolean;\n  checkCSRF?: boolean;\n}\n\n/** Performance plugin config. */\nexport interface PerformancePluginConfig {\n  enabled: boolean;\n  checkN1Queries?: boolean;\n  checkMemoryLeaks?: boolean;\n  checkAsyncPatterns?: boolean;\n  checkBundleSize?: boolean;\n}\n\n/** Quality plugin config. */\nexport interface QualityPluginConfig {\n  enabled: boolean;\n  checkDeadCode?: boolean;\n  checkNaming?: boolean;\n  checkComplexity?: boolean;\n  maxCyclomaticComplexity?: number;\n}\n\n/** Optional plugin configs. */\nexport interface NamingPluginConfig {\n  enabled: boolean;\n}\n\nexport interface ApiPluginConfig {\n  enabled: boolean;\n}\n\nexport interface TestGuardPluginConfig {\n  enabled: boolean;\n}\n\nexport interface DepAuditPluginConfig {\n  enabled: boolean;\n  maxDepth?: number;\n}\n\n/** All plugin configurations. */\nexport interface PluginConfigs {\n  architecture?: ArchitecturePluginConfig;\n  security?: SecurityPluginConfig;\n  performance?: PerformancePluginConfig;\n  quality?: QualityPluginConfig;\n  naming?: NamingPluginConfig;\n  api?: ApiPluginConfig;\n  testGuard?: TestGuardPluginConfig;\n  depAudit?: DepAuditPluginConfig;\n}\n\n/** Ignore configuration. */\nexport interface IgnoreConfig {\n  rules?: string[];\n  files?: string[];\n  lines?: Record<string, number[]>;\n}\n\n/**\n * Full project configuration (shape of .codeguardian.json).\n *\n * @example\n * ```typescript\n * const config: ProjectConfig = {\n *   rootDir: '.',\n *   tsconfig: './tsconfig.json',\n *   include: ['src/**\\/*.ts'],\n *   exclude: ['**\\/*.test.ts'],\n *   severity: { blockOn: ['critical', 'error'], warnOn: ['warning'] },\n *   plugins: { architecture: { enabled: true } },\n *   ignore: { rules: [], files: [] },\n * };\n * ```\n */\nexport interface ProjectConfig {\n  rootDir: string;\n  tsconfig: string;\n  include: string[];\n  exclude: string[];\n  severity: SeverityConfig;\n  plugins: PluginConfigs;\n  ignore: IgnoreConfig;\n}\n\n/**\n * Inline configuration (same shape minus rootDir/tsconfig which come from GuardianConfig).\n */\nexport interface InlineConfig {\n  include?: string[];\n  exclude?: string[];\n  severity?: Partial<SeverityConfig>;\n  plugins?: Partial<PluginConfigs>;\n  ignore?: Partial<IgnoreConfig>;\n}\n\n/**\n * Options passed to createGuardian().\n *\n * @example\n * ```typescript\n * const config: GuardianConfig = {\n *   rootDir: process.cwd(),\n *   tsconfig: './tsconfig.json',\n * };\n * ```\n */\nexport interface GuardianConfig {\n  rootDir: string;\n  tsconfig?: string;\n  config?: string | InlineConfig;\n  autoDiscover?: boolean;\n}\n\n/** Options for running analysis. */\nexport interface RunOptions {\n  staged?: boolean;\n  verbose?: boolean;\n  plugins?: string[];\n  format?: 'terminal' | 'json' | 'sarif';\n}\n\n/** Statistics from a run. */\nexport interface RunStats {\n  filesAnalyzed: number;\n  rulesExecuted: number;\n  duration: number;\n  parseTime: number;\n  analysisTime: number;\n}\n\n/**\n * Result of running analysis.\n *\n * @example\n * ```typescript\n * const result: RunResult = {\n *   findings: [],\n *   stats: { filesAnalyzed: 10, rulesExecuted: 29, duration: 150, parseTime: 80, analysisTime: 70 },\n *   blocked: false,\n *   bySeverity: { critical: [], error: [], warning: [], info: [] },\n *   byFile: {},\n * };\n * ```\n */\nexport interface RunResult {\n  findings: Finding[];\n  stats: RunStats;\n  blocked: boolean;\n  bySeverity: Record<Severity, Finding[]>;\n  byFile: Record<string, Finding[]>;\n}\n\n/** Result of incremental scan. */\nexport interface IncrementalResult {\n  changedFiles: string[];\n  affectedFiles: string[];\n  graph: CodebaseGraph;\n}\n\n/** Serialized graph format for cache. */\nexport interface SerializedGraph {\n  version: string;\n  timestamp: number;\n  files: Array<[string, FileNode]>;\n  symbols: Array<[string, SymbolNode]>;\n  edges: ImportEdge[];\n  layers: LayerDefinition[];\n  patterns: DetectedPattern[];\n  adjacency: Array<[string, string[]]>;\n}\n\n/** Parsed CLI arguments. */\nexport interface ParsedArgs {\n  command: string;\n  flags: Record<string, string | boolean>;\n  positional: string[];\n}\n\n/** Suppression directive parsed from a comment. */\nexport interface SuppressionDirective {\n  type: 'disable-next-line' | 'disable' | 'enable';\n  rules: string[];\n  reason?: string;\n  line: number;\n}\n\n/** Git diff entry for a changed file. */\nexport interface DiffEntry {\n  path: string;\n  status: 'added' | 'modified' | 'deleted' | 'renamed';\n  oldPath?: string;\n  additions: number;\n  deletions: number;\n}\n","import { ConfigError } from '../errors.js';\nimport type { ProjectConfig, Severity } from '../types.js';\nimport { SEVERITY_ORDER } from '../types.js';\n\nconst VALID_SEVERITIES = new Set<string>(SEVERITY_ORDER);\n\n/**\n * Validate a project configuration object.\n * Throws ConfigError if invalid.\n *\n * @param config - Configuration to validate\n *\n * @example\n * ```typescript\n * validateConfig(config); // throws if invalid\n * ```\n */\nexport function validateConfig(config: Partial<ProjectConfig>): void {\n  // Validate severity\n  if (config.severity) {\n    if (config.severity.blockOn) {\n      for (const s of config.severity.blockOn) {\n        if (!VALID_SEVERITIES.has(s)) {\n          throw new ConfigError(`Invalid severity in blockOn: \"${s}\"`, {\n            field: 'severity.blockOn',\n            validValues: [...SEVERITY_ORDER],\n          });\n        }\n      }\n    }\n    if (config.severity.warnOn) {\n      for (const s of config.severity.warnOn) {\n        if (!VALID_SEVERITIES.has(s)) {\n          throw new ConfigError(`Invalid severity in warnOn: \"${s}\"`, {\n            field: 'severity.warnOn',\n            validValues: [...SEVERITY_ORDER],\n          });\n        }\n      }\n    }\n    if (config.severity.ignoreBelow !== undefined) {\n      if (!VALID_SEVERITIES.has(config.severity.ignoreBelow)) {\n        throw new ConfigError(`Invalid severity in ignoreBelow: \"${config.severity.ignoreBelow}\"`, {\n          field: 'severity.ignoreBelow',\n          validValues: [...SEVERITY_ORDER],\n        });\n      }\n    }\n  }\n\n  // Validate include/exclude patterns\n  if (config.include) {\n    if (!Array.isArray(config.include)) {\n      throw new ConfigError('\"include\" must be an array of glob patterns', {\n        field: 'include',\n      });\n    }\n  }\n\n  if (config.exclude) {\n    if (!Array.isArray(config.exclude)) {\n      throw new ConfigError('\"exclude\" must be an array of glob patterns', {\n        field: 'exclude',\n      });\n    }\n  }\n\n  // Validate plugin configs\n  if (config.plugins) {\n    if (config.plugins.architecture) {\n      const arch = config.plugins.architecture;\n      if (arch.maxFileLines !== undefined && (typeof arch.maxFileLines !== 'number' || arch.maxFileLines < 1)) {\n        throw new ConfigError('maxFileLines must be a positive number', {\n          field: 'plugins.architecture.maxFileLines',\n        });\n      }\n      if (arch.maxFunctionLines !== undefined && (typeof arch.maxFunctionLines !== 'number' || arch.maxFunctionLines < 1)) {\n        throw new ConfigError('maxFunctionLines must be a positive number', {\n          field: 'plugins.architecture.maxFunctionLines',\n        });\n      }\n      if (arch.maxFunctionComplexity !== undefined && (typeof arch.maxFunctionComplexity !== 'number' || arch.maxFunctionComplexity < 1)) {\n        throw new ConfigError('maxFunctionComplexity must be a positive number', {\n          field: 'plugins.architecture.maxFunctionComplexity',\n        });\n      }\n    }\n\n    if (config.plugins.quality) {\n      const q = config.plugins.quality;\n      if (q.maxCyclomaticComplexity !== undefined && (typeof q.maxCyclomaticComplexity !== 'number' || q.maxCyclomaticComplexity < 1)) {\n        throw new ConfigError('maxCyclomaticComplexity must be a positive number', {\n          field: 'plugins.quality.maxCyclomaticComplexity',\n        });\n      }\n    }\n  }\n}\n\n/**\n * Check if a severity should block a commit.\n *\n * @example\n * ```typescript\n * shouldBlock('critical', ['critical', 'error']); // true\n * shouldBlock('warning', ['critical', 'error']);   // false\n * ```\n */\nexport function shouldBlock(severity: Severity, blockOn: Severity[]): boolean {\n  return blockOn.includes(severity);\n}\n\n/**\n * Check if a severity should be shown as a warning.\n *\n * @example\n * ```typescript\n * shouldWarn('warning', ['warning']); // true\n * shouldWarn('info', ['warning']);     // false\n * ```\n */\nexport function shouldWarn(severity: Severity, warnOn: Severity[]): boolean {\n  return warnOn.includes(severity);\n}\n\n/**\n * Check if a severity is below the ignore threshold.\n *\n * @example\n * ```typescript\n * isBelowThreshold('info', 'info');     // true\n * isBelowThreshold('warning', 'info');  // false\n * ```\n */\nexport function isBelowThreshold(severity: Severity, threshold?: Severity): boolean {\n  if (!threshold) return false;\n  const severityIndex = SEVERITY_ORDER.indexOf(severity);\n  const thresholdIndex = SEVERITY_ORDER.indexOf(threshold);\n  return severityIndex >= thresholdIndex;\n}\n","import * as path from 'node:path';\nimport type { InlineConfig, ProjectConfig } from '../types.js';\nimport { ConfigError } from '../errors.js';\nimport { fileExists, readJsonSync } from '../utils/fs.js';\nimport { DEFAULT_CONFIG } from './defaults.js';\nimport { validateConfig } from './validator.js';\n\n/**\n * Load project configuration from disk or inline config.\n *\n * Resolution order:\n * 1. Inline config object (if provided)\n * 2. .codeguardian.json\n * 3. codeguardian field in package.json\n * 4. Default config\n *\n * @param rootDir - Project root directory\n * @param configPathOrInline - Path to config file or inline config object\n * @returns Resolved project configuration\n *\n * @example\n * ```typescript\n * const config = loadConfig('/my-project');\n * const config2 = loadConfig('/my-project', '.codeguardian.json');\n * const config3 = loadConfig('/my-project', { plugins: { security: { enabled: false } } });\n * ```\n */\nexport function loadConfig(\n  rootDir: string,\n  configPathOrInline?: string | InlineConfig,\n): ProjectConfig {\n  let fileConfig: Partial<ProjectConfig> = {};\n\n  if (typeof configPathOrInline === 'object') {\n    // Inline config\n    fileConfig = configPathOrInline as Partial<ProjectConfig>;\n  } else if (typeof configPathOrInline === 'string') {\n    // Explicit path\n    const fullPath = path.resolve(rootDir, configPathOrInline);\n    if (fileExists(fullPath)) {\n      fileConfig = readJsonSync<Partial<ProjectConfig>>(fullPath);\n    } else {\n      throw new ConfigError(`Config file not found: ${configPathOrInline}`, {\n        path: fullPath,\n      });\n    }\n  } else {\n    // Auto-detect\n    const codeguardianPath = path.resolve(rootDir, '.codeguardian.json');\n    const packageJsonPath = path.resolve(rootDir, 'package.json');\n\n    if (fileExists(codeguardianPath)) {\n      fileConfig = readJsonSync<Partial<ProjectConfig>>(codeguardianPath);\n    } else if (fileExists(packageJsonPath)) {\n      const pkg = readJsonSync<Record<string, unknown>>(packageJsonPath);\n      if (pkg['codeguardian'] && typeof pkg['codeguardian'] === 'object') {\n        fileConfig = pkg['codeguardian'] as Partial<ProjectConfig>;\n      }\n    }\n  }\n\n  // Merge with defaults\n  const config = mergeConfig(DEFAULT_CONFIG, fileConfig, rootDir);\n\n  // Validate\n  validateConfig(config);\n\n  return config;\n}\n\n/**\n * Deep merge config with defaults.\n */\nfunction mergeConfig(\n  defaults: ProjectConfig,\n  overrides: Partial<ProjectConfig>,\n  rootDir: string,\n): ProjectConfig {\n  return {\n    rootDir,\n    tsconfig: overrides.tsconfig ?? defaults.tsconfig,\n    include: overrides.include ?? defaults.include,\n    exclude: overrides.exclude ?? defaults.exclude,\n    severity: {\n      ...defaults.severity,\n      ...overrides.severity,\n    },\n    plugins: {\n      architecture: {\n        ...defaults.plugins.architecture!,\n        ...overrides.plugins?.architecture,\n      },\n      security: {\n        ...defaults.plugins.security!,\n        ...overrides.plugins?.security,\n      },\n      performance: {\n        ...defaults.plugins.performance!,\n        ...overrides.plugins?.performance,\n      },\n      quality: {\n        ...defaults.plugins.quality!,\n        ...overrides.plugins?.quality,\n      },\n      naming: overrides.plugins?.naming,\n      api: overrides.plugins?.api,\n      testGuard: overrides.plugins?.testGuard,\n      depAudit: overrides.plugins?.depAudit,\n    },\n    ignore: {\n      rules: overrides.ignore?.rules ?? defaults.ignore.rules,\n      files: overrides.ignore?.files ?? defaults.ignore.files,\n      lines: overrides.ignore?.lines ?? defaults.ignore.lines,\n    },\n  };\n}\n","import { execSync } from 'node:child_process';\nimport { GitError } from '../errors.js';\nimport type { DiffEntry } from '../types.js';\nimport { parseDiffNameStatus, parseDiffNumstat } from './diff.js';\n\n/**\n * Get list of staged files from git.\n *\n * @param rootDir - Project root directory (where .git is)\n * @returns Array of staged file paths (relative to rootDir)\n *\n * @example\n * ```typescript\n * const files = getStagedFiles('/my-project');\n * // ['src/index.ts', 'src/service.ts']\n * ```\n */\nexport function getStagedFiles(rootDir: string): string[] {\n  try {\n    const output = execSync('git diff --cached --name-only', {\n      cwd: rootDir,\n      encoding: 'utf-8',\n      stdio: ['pipe', 'pipe', 'pipe'],\n    });\n    return output\n      .trim()\n      .split('\\n')\n      .filter((line) => line.trim().length > 0);\n  } catch (err) {\n    throw new GitError('Failed to get staged files. Is this a git repository?', {\n      rootDir,\n      error: String(err),\n    });\n  }\n}\n\n/**\n * Get detailed diff entries for staged files.\n *\n * @param rootDir - Project root directory\n * @returns Array of DiffEntry objects with status and stats\n *\n * @example\n * ```typescript\n * const entries = getStagedDiff('/my-project');\n * // [{ path: 'src/index.ts', status: 'modified', additions: 5, deletions: 2 }]\n * ```\n */\nexport function getStagedDiff(rootDir: string): DiffEntry[] {\n  try {\n    const nameStatusOutput = execSync('git diff --cached --name-status', {\n      cwd: rootDir,\n      encoding: 'utf-8',\n      stdio: ['pipe', 'pipe', 'pipe'],\n    });\n\n    const numstatOutput = execSync('git diff --cached --numstat', {\n      cwd: rootDir,\n      encoding: 'utf-8',\n      stdio: ['pipe', 'pipe', 'pipe'],\n    });\n\n    const entries = parseDiffNameStatus(nameStatusOutput);\n    const stats = parseDiffNumstat(numstatOutput);\n\n    // Merge stats into entries\n    for (const entry of entries) {\n      const stat = stats.get(entry.path);\n      if (stat) {\n        entry.additions = stat.additions;\n        entry.deletions = stat.deletions;\n      }\n    }\n\n    return entries;\n  } catch (err) {\n    throw new GitError('Failed to get staged diff', {\n      rootDir,\n      error: String(err),\n    });\n  }\n}\n\n/**\n * Check if the current directory is a git repository.\n *\n * @param rootDir - Directory to check\n * @returns true if it's a git repo\n *\n * @example\n * ```typescript\n * if (!isGitRepo('/my-project')) {\n *   console.error('Not a git repository');\n * }\n * ```\n */\nexport function isGitRepo(rootDir: string): boolean {\n  try {\n    execSync('git rev-parse --is-inside-work-tree', {\n      cwd: rootDir,\n      encoding: 'utf-8',\n      stdio: ['pipe', 'pipe', 'pipe'],\n    });\n    return true;\n  } catch {\n    return false;\n  }\n}\n","/**\n * Terminal ANSI color utilities (zero dependencies).\n *\n * @example\n * ```typescript\n * import { color } from './color';\n * console.log(color.red('Error!'));\n * console.log(color.bold(color.green('Success')));\n * ```\n */\n\nconst isColorSupported = (): boolean => {\n  if (typeof process !== 'undefined') {\n    if (process.env['NO_COLOR'] !== undefined) return false;\n    if (process.env['FORCE_COLOR'] !== undefined) return true;\n    /* v8 ignore next */\n    if (process.stdout && 'isTTY' in process.stdout) return !!process.stdout.isTTY;\n  }\n  return false;\n};\n\nconst enabled = isColorSupported();\n\nconst wrap = (open: string, close: string) => {\n  if (!enabled) return (str: string) => str;\n  return (str: string) => `\\x1b[${open}m${str}\\x1b[${close}m`;\n};\n\n/** Terminal color functions. */\nexport const color = {\n  /** Check if colors are enabled */\n  enabled,\n\n  // Modifiers\n  bold: wrap('1', '22'),\n  dim: wrap('2', '22'),\n  italic: wrap('3', '23'),\n  underline: wrap('4', '24'),\n\n  // Colors\n  red: wrap('31', '39'),\n  green: wrap('32', '39'),\n  yellow: wrap('33', '39'),\n  blue: wrap('34', '39'),\n  magenta: wrap('35', '39'),\n  cyan: wrap('36', '39'),\n  white: wrap('37', '39'),\n  gray: wrap('90', '39'),\n\n  // Background\n  bgRed: wrap('41', '49'),\n  bgGreen: wrap('42', '49'),\n  bgYellow: wrap('43', '49'),\n  bgBlue: wrap('44', '49'),\n};\n","import type { Finding, RunResult, Severity } from '../types.js';\nimport { color } from '../utils/color.js';\n\n/**\n * Format run results as colored terminal output.\n *\n * @param result - Run result to format\n * @param verbose - Whether to include info-level findings\n * @returns Formatted string for terminal output\n *\n * @example\n * ```typescript\n * const output = formatTerminal(result, false);\n * console.log(output);\n * ```\n */\nexport function formatTerminal(result: RunResult, verbose: boolean = false): string {\n  const lines: string[] = [];\n\n  // Header\n  lines.push('');\n  lines.push(color.bold('  @oxog/codeguardian'));\n  lines.push(color.dim(`  Analyzed ${result.stats.filesAnalyzed} files in ${result.stats.duration}ms`));\n  lines.push('');\n\n  // Filter findings based on verbosity\n  const findings = verbose\n    ? result.findings\n    : result.findings.filter((f) => f.severity !== 'info');\n\n  if (findings.length === 0) {\n    lines.push(color.green('  ✓ No issues found'));\n    lines.push('');\n    return lines.join('\\n');\n  }\n\n  // Sort findings: critical first, then error, warning, info\n  const sorted = [...findings].sort((a, b) => {\n    const order: Record<Severity, number> = { critical: 0, error: 1, warning: 2, info: 3 };\n    /* v8 ignore next */\n    return (order[a.severity ?? 'info'] ?? 3) - (order[b.severity ?? 'info'] ?? 3);\n  });\n\n  // Print each finding\n  for (const finding of sorted) {\n    lines.push(formatFinding(finding));\n  }\n\n  // Summary\n  lines.push('');\n  lines.push(formatSummaryLine(result));\n  lines.push('');\n\n  return lines.join('\\n');\n}\n\n/**\n * Format a single finding for terminal display.\n */\nfunction formatFinding(finding: Finding): string {\n  const lines: string[] = [];\n  const sev = finding.severity ?? 'info';\n\n  const icon = getIcon(sev);\n  const label = getSeverityLabel(sev);\n  const location = `${finding.file}:${finding.line}`;\n\n  lines.push(`${icon} ${label}  ${color.white(location)}`);\n  lines.push(`  ${color.dim(`[${finding.rule ?? 'unknown'}]`)} ${finding.message}`);\n\n  if (finding.fix?.suggestion) {\n    lines.push(`  ${color.dim('→')} ${color.dim(finding.fix.suggestion)}`);\n  }\n\n  lines.push('');\n\n  return lines.join('\\n');\n}\n\n/**\n * Get icon for severity level.\n */\nfunction getIcon(severity: Severity): string {\n  switch (severity) {\n    case 'critical':\n    case 'error':\n      return color.red('✗');\n    case 'warning':\n      return color.yellow('⚠');\n    case 'info':\n      return color.blue('ℹ');\n  }\n}\n\n/**\n * Get colored label for severity level.\n */\nfunction getSeverityLabel(severity: Severity): string {\n  switch (severity) {\n    case 'critical':\n      return color.red(color.bold('CRITICAL'));\n    case 'error':\n      return color.red(color.bold('ERROR   '));\n    case 'warning':\n      return color.yellow('WARNING ');\n    case 'info':\n      return color.blue('INFO    ');\n  }\n}\n\n/**\n * Format the summary line.\n */\nfunction formatSummaryLine(result: RunResult): string {\n  const criticalCount = result.bySeverity.critical.length;\n  const errorCount = result.bySeverity.error.length;\n  const warningCount = result.bySeverity.warning.length;\n  const infoCount = result.bySeverity.info.length;\n\n  const blockCount = criticalCount + errorCount;\n  const parts: string[] = [];\n\n  if (blockCount > 0) {\n    parts.push(color.red(`  ${blockCount} critical/error (commit blocked)`));\n  }\n  if (warningCount > 0) {\n    parts.push(color.yellow(`${warningCount} warnings`));\n  }\n  if (infoCount > 0) {\n    parts.push(color.dim(`${infoCount} info`));\n  }\n\n  const line = '─'.repeat(50);\n\n  if (result.blocked) {\n    return `${color.dim(line)}\\n${parts.join('  │  ')}\\n${color.dim(line)}`;\n  }\n\n  if (parts.length === 0) {\n    return `${color.dim(line)}\\n${color.green('  ✓ All clear')}\\n${color.dim(line)}`;\n  }\n\n  return `${color.dim(line)}\\n${parts.join('  │  ')}\\n${color.dim(line)}`;\n}\n","import type { RunResult } from '../types.js';\n\n/**\n * Format run results as JSON string.\n *\n * @param result - Run result to format\n * @returns Pretty-printed JSON string\n *\n * @example\n * ```typescript\n * const json = formatJSON(result);\n * console.log(json);\n * ```\n */\nexport function formatJSON(result: RunResult): string {\n  return JSON.stringify(\n    {\n      blocked: result.blocked,\n      stats: result.stats,\n      findings: result.findings.map((f) => ({\n        rule: f.rule,\n        severity: f.severity,\n        message: f.message,\n        file: f.file,\n        line: f.line,\n        column: f.column,\n        fix: f.fix,\n      })),\n      summary: {\n        critical: result.bySeverity.critical.length,\n        error: result.bySeverity.error.length,\n        warning: result.bySeverity.warning.length,\n        info: result.bySeverity.info.length,\n        total: result.findings.length,\n      },\n    },\n    null,\n    2,\n  );\n}\n","import type { RunResult, Severity } from '../types.js';\n\n/**\n * SARIF severity level mapping.\n */\nfunction toSarifLevel(severity: Severity): string {\n  switch (severity) {\n    case 'critical':\n    case 'error':\n      return 'error';\n    case 'warning':\n      return 'warning';\n    case 'info':\n      return 'note';\n  }\n}\n\n/**\n * Format run results as SARIF (Static Analysis Results Interchange Format).\n * Compatible with GitHub Code Scanning.\n *\n * @param result - Run result to format\n * @returns SARIF JSON string\n *\n * @example\n * ```typescript\n * const sarif = formatSARIF(result);\n * writeFileSync('results.sarif', sarif);\n * ```\n */\nexport function formatSARIF(result: RunResult): string {\n  const rules = new Map<string, { name: string; description: string; severity: Severity }>();\n\n  for (const finding of result.findings) {\n    if (finding.rule && !rules.has(finding.rule)) {\n      rules.set(finding.rule, {\n        name: finding.rule,\n        description: finding.message,\n        severity: finding.severity ?? 'info',\n      });\n    }\n  }\n\n  const sarif = {\n    $schema: 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json',\n    version: '2.1.0',\n    runs: [\n      {\n        tool: {\n          driver: {\n            name: '@oxog/codeguardian',\n            version: '1.0.0',\n            informationUri: 'https://codeguardian.oxog.dev',\n            rules: Array.from(rules.values()).map((r) => ({\n              id: r.name,\n              shortDescription: { text: r.description },\n              defaultConfiguration: {\n                level: toSarifLevel(r.severity),\n              },\n            })),\n          },\n        },\n        results: result.findings.map((f) => ({\n          ruleId: f.rule ?? 'unknown',\n          level: toSarifLevel(f.severity ?? 'info'),\n          message: { text: f.message },\n          locations: [\n            {\n              physicalLocation: {\n                artifactLocation: { uri: f.file },\n                region: {\n                  startLine: f.line,\n                  startColumn: f.column,\n                },\n              },\n            },\n          ],\n          ...(f.fix\n            ? {\n                fixes: [\n                  {\n                    description: { text: f.fix.suggestion },\n                  },\n                ],\n              }\n            : {}),\n        })),\n      },\n    ],\n  };\n\n  return JSON.stringify(sarif, null, 2);\n}\n","import type { CodebaseGraph, DetectedPattern } from '../types.js';\n\n/**\n * Auto-discover project conventions by analyzing the codebase graph.\n *\n * Detects patterns like:\n * - File naming conventions (*.service.ts, *.controller.ts)\n * - Export patterns (services export classes, utils export functions)\n * - Import direction (controllers → services → repositories)\n * - Naming conventions (camelCase functions, PascalCase classes)\n *\n * @param graph - Codebase knowledge graph\n * @returns Array of detected patterns\n *\n * @example\n * ```typescript\n * const patterns = discoverConventions(graph);\n * for (const p of patterns) {\n *   console.log(`${p.type}: ${p.description} (${p.confidence}%)`);\n * }\n * ```\n */\nexport function discoverConventions(graph: CodebaseGraph): DetectedPattern[] {\n  const patterns: DetectedPattern[] = [];\n\n  patterns.push(...detectFileNamingPatterns(graph));\n  patterns.push(...detectExportPatterns(graph));\n  patterns.push(...detectImportDirectionPatterns(graph));\n  patterns.push(...detectNamingConventions(graph));\n\n  return patterns;\n}\n\n/**\n * Detect file naming patterns in directories.\n */\nfunction detectFileNamingPatterns(graph: CodebaseGraph): DetectedPattern[] {\n  const patterns: DetectedPattern[] = [];\n  const dirFiles = new Map<string, string[]>();\n\n  // Group files by directory\n  for (const [filePath] of graph.files) {\n    const parts = filePath.split('/');\n    const dir = parts.slice(0, -1).join('/');\n    /* v8 ignore next */\n    const file = parts[parts.length - 1] ?? '';\n\n    if (!dirFiles.has(dir)) {\n      dirFiles.set(dir, []);\n    }\n    dirFiles.get(dir)!.push(file);\n  }\n\n  // Find naming patterns in each directory\n  for (const [dir, files] of dirFiles) {\n    if (files.length < 2) continue;\n\n    // Check for suffix patterns like *.service.ts, *.controller.ts\n    const suffixes = new Map<string, string[]>();\n    for (const file of files) {\n      const parts = file.split('.');\n      if (parts.length >= 3) {\n        const suffix = parts.slice(-2).join('.');\n        if (!suffixes.has(suffix)) {\n          suffixes.set(suffix, []);\n        }\n        suffixes.get(suffix)!.push(file);\n      }\n    }\n\n    for (const [suffix, matchingFiles] of suffixes) {\n      const ratio = matchingFiles.length / files.length;\n      if (ratio >= 0.5 && matchingFiles.length >= 2) {\n        patterns.push({\n          type: 'file-naming',\n          description: `Files in ${dir}/ follow *.${suffix} naming pattern`,\n          files: matchingFiles.map((f) => `${dir}/${f}`),\n          confidence: Math.round(ratio * 100),\n        });\n      }\n    }\n  }\n\n  return patterns;\n}\n\n/**\n * Detect export patterns (e.g., services export classes).\n */\nfunction detectExportPatterns(graph: CodebaseGraph): DetectedPattern[] {\n  const patterns: DetectedPattern[] = [];\n  const roleExports = new Map<string, { classes: number; functions: number; files: string[] }>();\n\n  for (const [filePath, fileNode] of graph.files) {\n    if (fileNode.role === 'unknown' || fileNode.role === 'test') continue;\n\n    if (!roleExports.has(fileNode.role)) {\n      roleExports.set(fileNode.role, { classes: 0, functions: 0, files: [] });\n    }\n\n    const entry = roleExports.get(fileNode.role)!;\n    entry.files.push(filePath);\n\n    // Check export types\n    for (const exp of fileNode.exports) {\n      const symbol = graph.symbols.get(`${filePath}:${exp}`);\n      if (symbol) {\n        if (symbol.kind === 'class') entry.classes++;\n        if (symbol.kind === 'function') entry.functions++;\n      }\n    }\n  }\n\n  for (const [role, data] of roleExports) {\n    if (data.files.length < 2) continue;\n\n    if (data.classes > data.functions && data.classes >= 2) {\n      patterns.push({\n        type: 'export-pattern',\n        description: `${role} files primarily export classes`,\n        files: data.files,\n        confidence: Math.round((data.classes / (data.classes + data.functions)) * 100),\n      });\n    } else if (data.functions > data.classes && data.functions >= 2) {\n      patterns.push({\n        type: 'export-pattern',\n        description: `${role} files primarily export functions`,\n        files: data.files,\n        confidence: Math.round((data.functions / (data.classes + data.functions)) * 100),\n      });\n    }\n  }\n\n  return patterns;\n}\n\n/**\n * Detect import direction patterns.\n */\nfunction detectImportDirectionPatterns(graph: CodebaseGraph): DetectedPattern[] {\n  const patterns: DetectedPattern[] = [];\n  const layerImports = new Map<string, Map<string, number>>();\n\n  for (const edge of graph.edges) {\n    const fromFile = graph.files.get(edge.from);\n    const toFile = graph.files.get(edge.to);\n    if (!fromFile || !toFile) continue;\n\n    const fromLayer = fromFile.layer;\n    const toLayer = toFile.layer;\n    if (fromLayer === 'unknown' || toLayer === 'unknown') continue;\n\n    if (!layerImports.has(fromLayer)) {\n      layerImports.set(fromLayer, new Map());\n    }\n    const targets = layerImports.get(fromLayer)!;\n    targets.set(toLayer, (targets.get(toLayer) ?? 0) + 1);\n  }\n\n  for (const [fromLayer, targets] of layerImports) {\n    for (const [toLayer, count] of targets) {\n      if (count >= 2) {\n        patterns.push({\n          type: 'import-direction',\n          description: `${fromLayer} → ${toLayer} (${count} imports)`,\n          files: [],\n          confidence: Math.min(100, count * 20),\n        });\n      }\n    }\n  }\n\n  return patterns;\n}\n\n/**\n * Detect naming conventions.\n */\nfunction detectNamingConventions(graph: CodebaseGraph): DetectedPattern[] {\n  const patterns: DetectedPattern[] = [];\n  let camelCase = 0;\n  let pascalCase = 0;\n  let snakeCase = 0;\n\n  for (const file of graph.files.values()) {\n    for (const fn of file.functions) {\n      if (/^[a-z][a-zA-Z0-9]*$/.test(fn.name)) camelCase++;\n      else if (/^[A-Z][a-zA-Z0-9]*$/.test(fn.name)) pascalCase++;\n      else if (/^[a-z][a-z0-9_]*$/.test(fn.name)) snakeCase++;\n    }\n  }\n\n  const total = camelCase + pascalCase + snakeCase;\n  if (total >= 5) {\n    if (camelCase / total >= 0.7) {\n      patterns.push({\n        type: 'naming-convention',\n        description: 'Functions use camelCase naming',\n        files: [],\n        confidence: Math.round((camelCase / total) * 100),\n      });\n    }\n  }\n\n  return patterns;\n}\n","import type { Finding, GuardianPlugin, ArchitecturePluginConfig, RuleContext } from '../../types.js';\nimport { findCircularDeps } from '../../graph/query.js';\n\n/**\n * Architecture plugin — enforces layer boundaries, detects circular deps,\n * validates file structure conventions.\n *\n * Rules:\n * - architecture/layer-violation\n * - architecture/circular-dependency\n * - architecture/file-role-mismatch\n * - architecture/god-file\n * - architecture/god-function\n * - architecture/barrel-explosion\n *\n * @param config - Architecture plugin configuration\n * @returns GuardianPlugin instance\n *\n * @example\n * ```typescript\n * guardian.use(architecturePlugin({\n *   enabled: true,\n *   layers: ['controller', 'service', 'repository'],\n *   enforceDirection: true,\n * }));\n * ```\n */\nexport function architecturePlugin(\n  config: Partial<ArchitecturePluginConfig> = {},\n): GuardianPlugin<ArchitecturePluginConfig> {\n  const fullConfig: ArchitecturePluginConfig = {\n    enabled: true,\n    layers: ['controller', 'service', 'repository', 'util'],\n    enforceDirection: true,\n    maxFileLines: 300,\n    maxFunctionLines: 50,\n    maxFunctionComplexity: 15,\n    ...config,\n  };\n\n  return {\n    name: 'architecture',\n    version: '1.0.0',\n    install(kernel) {\n      // architecture/layer-violation\n      kernel.registerRule({\n        name: 'architecture/layer-violation',\n        severity: 'error',\n        description: 'Detects when a lower layer imports from a higher layer',\n        category: 'architecture',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n          const layers = fullConfig.layers!;\n          if (!fullConfig.enforceDirection || layers.length === 0) return findings;\n\n          const fileLayer = context.file.layer;\n          const fileLayerIndex = layers.indexOf(fileLayer);\n          if (fileLayerIndex === -1) return findings;\n\n          for (const imp of context.file.imports) {\n            const targetFile = context.graph.files.get(resolveImport(context.file.path, imp.source));\n            if (!targetFile) continue;\n\n            const targetLayerIndex = layers.indexOf(targetFile.layer);\n            if (targetLayerIndex === -1) continue;\n\n            // Layers: lower index = higher layer (e.g., controller=0, service=1, repo=2)\n            // Fine: higher layer (lower index) importing from lower layer (higher index)\n            if (fileLayerIndex <= targetLayerIndex) {\n              // Normal dependency direction — ok\n            } else {\n              // Violation: lower layer importing from higher layer\n              findings.push({\n                message: `${fileLayer} layer importing from ${targetFile.layer} layer (violates layer direction)`,\n                file: context.file.path,\n                line: 1,\n                column: 1,\n                fix: {\n                  suggestion: `${capitalize(fileLayer)}s should not depend on ${targetFile.layer}s. Invert the dependency.`,\n                },\n              });\n            }\n          }\n\n          return findings;\n        },\n      });\n\n      // architecture/circular-dependency\n      kernel.registerRule({\n        name: 'architecture/circular-dependency',\n        severity: 'error',\n        description: 'Detects circular import chains',\n        category: 'architecture',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n          const cycles = findCircularDeps(context.graph);\n\n          for (const cycle of cycles) {\n            if (cycle.includes(context.file.path)) {\n              findings.push({\n                message: `Circular dependency detected: ${cycle.join(' → ')}`,\n                file: context.file.path,\n                line: 1,\n                column: 1,\n                fix: {\n                  suggestion: 'Break the cycle by extracting shared types or using dependency injection.',\n                },\n              });\n            }\n          }\n\n          return findings;\n        },\n      });\n\n      // architecture/file-role-mismatch\n      kernel.registerRule({\n        name: 'architecture/file-role-mismatch',\n        severity: 'warning',\n        description: 'Detects when file content does not match directory role',\n        category: 'architecture',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n          const path = context.file.path.toLowerCase();\n          const role = context.file.role;\n\n          // Check if path suggests a role but content doesn't match\n          if (path.includes('/service') && role !== 'service' && role !== 'unknown') {\n            findings.push({\n              message: `File is in services directory but detected role is \"${role}\"`,\n              file: context.file.path,\n              line: 1,\n              column: 1,\n              fix: {\n                suggestion: 'Move this file to the appropriate directory or rename it.',\n              },\n            });\n          }\n\n          if (path.includes('/controller') && role !== 'controller' && role !== 'unknown') {\n            findings.push({\n              message: `File is in controllers directory but detected role is \"${role}\"`,\n              file: context.file.path,\n              line: 1,\n              column: 1,\n              fix: {\n                suggestion: 'Move this file to the appropriate directory or rename it.',\n              },\n            });\n          }\n\n          return findings;\n        },\n      });\n\n      // architecture/god-file\n      kernel.registerRule({\n        name: 'architecture/god-file',\n        severity: 'warning',\n        description: 'Detects files exceeding maximum line count',\n        category: 'architecture',\n        check(context: RuleContext): Finding[] {\n          const maxLines = fullConfig.maxFileLines ?? 300;\n          if (context.file.loc > maxLines) {\n            return [\n              {\n                message: `File has ${context.file.loc} lines (max: ${maxLines})`,\n                file: context.file.path,\n                line: 1,\n                column: 1,\n                fix: {\n                  suggestion: 'Split this file into smaller, focused modules.',\n                },\n              },\n            ];\n          }\n          return [];\n        },\n      });\n\n      // architecture/god-function\n      kernel.registerRule({\n        name: 'architecture/god-function',\n        severity: 'warning',\n        description: 'Detects functions exceeding maximum line count',\n        category: 'architecture',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n          const maxLines = fullConfig.maxFunctionLines ?? 50;\n\n          for (const fn of context.file.functions) {\n            const fnLines = fn.endLine - fn.startLine + 1;\n            if (fnLines > maxLines) {\n              findings.push({\n                message: `Function \"${fn.name}\" has ${fnLines} lines (max: ${maxLines})`,\n                file: context.file.path,\n                line: fn.startLine,\n                column: 1,\n                fix: {\n                  suggestion: 'Extract logic into smaller helper functions.',\n                },\n              });\n            }\n          }\n\n          return findings;\n        },\n      });\n\n      // architecture/barrel-explosion\n      kernel.registerRule({\n        name: 'architecture/barrel-explosion',\n        severity: 'info',\n        description: 'Detects barrel files (index.ts) that re-export everything',\n        category: 'architecture',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n          /* v8 ignore next */\n          const fileName = context.file.path.split('/').pop() ?? '';\n\n          if (fileName === 'index.ts' || fileName === 'index.tsx') {\n            const exportCount = context.file.exports.length;\n            if (exportCount > 10) {\n              findings.push({\n                message: `Barrel file re-exports ${exportCount} symbols (may cause bundle size issues)`,\n                file: context.file.path,\n                line: 1,\n                column: 1,\n                fix: {\n                  suggestion: 'Consider using direct imports instead of barrel files for tree-shaking.',\n                },\n              });\n            }\n          }\n\n          return findings;\n        },\n      });\n    },\n  };\n}\n\nfunction resolveImport(fromFile: string, source: string): string {\n  if (!source.startsWith('.')) return source;\n  const fromDir = fromFile.split('/').slice(0, -1).join('/');\n  const parts = [...fromDir.split('/'), ...source.split('/')];\n  const resolved: string[] = [];\n  for (const part of parts) {\n    if (part === '..') resolved.pop();\n    else if (part !== '.') resolved.push(part);\n  }\n  let result = resolved.join('/');\n  if (result.endsWith('.js')) {\n    result = result.slice(0, -3) + '.ts';\n  /* v8 ignore next 2 */\n  } else if (result.endsWith('.jsx')) {\n    result = result.slice(0, -4) + '.tsx';\n  } else if (!result.endsWith('.ts') && !result.endsWith('.tsx')) {\n    result += '.ts';\n  }\n  return result;\n}\n\nfunction capitalize(str: string): string {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import ts from 'typescript';\nimport type { Finding, GuardianPlugin, SecurityPluginConfig, RuleContext } from '../../types.js';\n\nconst DB_METHODS = ['query', 'execute', 'raw', 'prepare', 'exec'];\nconst SECRET_PATTERNS = [\n  /^(sk_|pk_|api_|token_|secret_|password|auth_)/i,\n  /^(AKIA[0-9A-Z]{16})/, // AWS access key\n  /^eyJ[A-Za-z0-9-_]+\\.eyJ/, // JWT token\n  /^(ghp_|gho_|ghu_|ghs_|ghr_)/, // GitHub tokens\n  /(mongodb(\\+srv)?:\\/\\/|postgres(ql)?:\\/\\/|mysql:\\/\\/|redis:\\/\\/)/i, // Connection strings\n];\n\n/**\n * Security plugin — detects security anti-patterns and vulnerabilities.\n *\n * Rules:\n * - security/sql-injection\n * - security/hardcoded-secret\n * - security/eval-usage\n * - security/prototype-pollution\n * - security/xss-risk\n * - security/missing-auth-check\n * - security/insecure-random\n * - security/path-traversal\n *\n * @param config - Security plugin configuration\n * @returns GuardianPlugin instance\n *\n * @example\n * ```typescript\n * guardian.use(securityPlugin({ checkInjection: true, checkSecrets: true }));\n * ```\n */\nexport function securityPlugin(\n  config: Partial<SecurityPluginConfig> = {},\n): GuardianPlugin<SecurityPluginConfig> {\n  const fullConfig: SecurityPluginConfig = {\n    enabled: true,\n    checkInjection: true,\n    checkAuth: true,\n    checkSecrets: true,\n    checkXSS: true,\n    checkCSRF: true,\n    ...config,\n  };\n\n  return {\n    name: 'security',\n    version: '1.0.0',\n    install(kernel) {\n      // security/sql-injection\n      kernel.registerRule({\n        name: 'security/sql-injection',\n        severity: 'critical',\n        description: 'Detects string concatenation in SQL queries',\n        category: 'security',\n        check(context: RuleContext): Finding[] {\n          if (!fullConfig.checkInjection) return [];\n          const findings: Finding[] = [];\n\n          context.walk(context.ast, {\n            CallExpression(node: ts.Node) {\n              const call = node as ts.CallExpression;\n\n              const expr = call.expression;\n              let methodName = '';\n\n              if (ts.isPropertyAccessExpression(expr)) {\n                methodName = expr.name.text;\n              } else if (ts.isIdentifier(expr)) {\n                methodName = expr.text;\n              }\n\n              if (DB_METHODS.includes(methodName)) {\n                for (const arg of call.arguments) {\n                  if (ts.isTemplateExpression(arg) || context.hasStringConcat(arg)) {\n                    const pos = context.ast.getLineAndCharacterOfPosition(call.getStart(context.ast));\n                    findings.push({\n                      message: 'Raw string concatenation in SQL query — potential SQL injection',\n                      file: context.file.path,\n                      line: pos.line + 1,\n                      column: pos.character + 1,\n                      fix: {\n                        suggestion: 'Use parameterized queries instead of string templates.',\n                      },\n                    });\n                  }\n                }\n              }\n            },\n          });\n\n          return findings;\n        },\n      });\n\n      // security/hardcoded-secret\n      kernel.registerRule({\n        name: 'security/hardcoded-secret',\n        severity: 'critical',\n        description: 'Detects hardcoded API keys, tokens, and passwords',\n        category: 'security',\n        check(context: RuleContext): Finding[] {\n          if (!fullConfig.checkSecrets) return [];\n          if (context.file.role === 'test') return [];\n          const findings: Finding[] = [];\n\n          context.walk(context.ast, {\n            StringLiteral(node: ts.Node) {\n              const str = node as ts.StringLiteral;\n              const value = str.text;\n\n              if (value.length < 8) return;\n\n              for (const pattern of SECRET_PATTERNS) {\n                if (pattern.test(value)) {\n                  const pos = context.ast.getLineAndCharacterOfPosition(str.getStart(context.ast));\n                  findings.push({\n                    message: 'Possible hardcoded secret detected',\n                    file: context.file.path,\n                    line: pos.line + 1,\n                    column: pos.character + 1,\n                    fix: {\n                      suggestion: 'Move secrets to environment variables or a secure vault.',\n                    },\n                  });\n                  break;\n                }\n              }\n            },\n            NoSubstitutionTemplateLiteral(node: ts.Node) {\n              const tmpl = node as ts.NoSubstitutionTemplateLiteral;\n              const value = tmpl.text;\n              if (value.length < 8) return;\n\n              for (const pattern of SECRET_PATTERNS) {\n                if (pattern.test(value)) {\n                  const pos = context.ast.getLineAndCharacterOfPosition(tmpl.getStart(context.ast));\n                  findings.push({\n                    message: 'Possible hardcoded secret detected',\n                    file: context.file.path,\n                    line: pos.line + 1,\n                    column: pos.character + 1,\n                    fix: {\n                      suggestion: 'Move secrets to environment variables or a secure vault.',\n                    },\n                  });\n                  break;\n                }\n              }\n            },\n          });\n\n          return findings;\n        },\n      });\n\n      // security/eval-usage\n      kernel.registerRule({\n        name: 'security/eval-usage',\n        severity: 'critical',\n        description: 'Detects eval(), Function(), and similar unsafe patterns',\n        category: 'security',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n\n          context.walk(context.ast, {\n            CallExpression(node: ts.Node) {\n              const call = node as ts.CallExpression;\n\n              let name = '';\n              if (ts.isIdentifier(call.expression)) {\n                name = call.expression.text;\n              }\n\n              if (name === 'eval' || name === 'Function') {\n                const pos = context.ast.getLineAndCharacterOfPosition(call.getStart(context.ast));\n                findings.push({\n                  message: `Unsafe ${name}() call — potential code injection`,\n                  file: context.file.path,\n                  line: pos.line + 1,\n                  column: pos.character + 1,\n                  fix: {\n                    suggestion: `Avoid ${name}(). Use safe alternatives like JSON.parse() or structured data.`,\n                  },\n                });\n              }\n\n              // setTimeout/setInterval with string argument\n              if ((name === 'setTimeout' || name === 'setInterval') && call.arguments.length > 0) {\n                const firstArg = call.arguments[0]!;\n                if (ts.isStringLiteral(firstArg)) {\n                  const pos = context.ast.getLineAndCharacterOfPosition(call.getStart(context.ast));\n                  findings.push({\n                    message: `${name}() with string argument is equivalent to eval()`,\n                    file: context.file.path,\n                    line: pos.line + 1,\n                    column: pos.character + 1,\n                    fix: {\n                      suggestion: 'Pass a function reference instead of a string.',\n                    },\n                  });\n                }\n              }\n            },\n            NewExpression(node: ts.Node) {\n              const newExpr = node as ts.NewExpression;\n              if (ts.isIdentifier(newExpr.expression) && newExpr.expression.text === 'Function') {\n                const pos = context.ast.getLineAndCharacterOfPosition(newExpr.getStart(context.ast));\n                findings.push({\n                  message: 'new Function() is equivalent to eval() — potential code injection',\n                  file: context.file.path,\n                  line: pos.line + 1,\n                  column: pos.character + 1,\n                  fix: {\n                    suggestion: 'Avoid new Function(). Use safe alternatives.',\n                  },\n                });\n              }\n            },\n          });\n\n          return findings;\n        },\n      });\n\n      // security/prototype-pollution\n      kernel.registerRule({\n        name: 'security/prototype-pollution',\n        severity: 'error',\n        description: 'Detects potential prototype pollution',\n        category: 'security',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n\n          context.walk(context.ast, {\n            PropertyAccessExpression(node: ts.Node) {\n              const propAccess = node as ts.PropertyAccessExpression;\n\n              if (propAccess.name.text === '__proto__' || propAccess.name.text === 'prototype') {\n                // Check if it's Object.prototype assignment\n                const parent = propAccess.parent;\n                if (ts.isBinaryExpression(parent) && parent.operatorToken.kind === ts.SyntaxKind.EqualsToken) {\n                  const pos = context.ast.getLineAndCharacterOfPosition(propAccess.getStart(context.ast));\n                  findings.push({\n                    message: 'Direct prototype assignment — potential prototype pollution',\n                    file: context.file.path,\n                    line: pos.line + 1,\n                    column: pos.character + 1,\n                    fix: {\n                      suggestion: 'Use Object.create(null) or Map for dynamic key-value stores.',\n                    },\n                  });\n                }\n              }\n            },\n          });\n\n          return findings;\n        },\n      });\n\n      // security/xss-risk\n      kernel.registerRule({\n        name: 'security/xss-risk',\n        severity: 'error',\n        description: 'Detects innerHTML and similar XSS-prone patterns',\n        category: 'security',\n        check(context: RuleContext): Finding[] {\n          if (!fullConfig.checkXSS) return [];\n          const findings: Finding[] = [];\n          const xssProps = ['innerHTML', 'outerHTML', 'dangerouslySetInnerHTML'];\n\n          context.walk(context.ast, {\n            PropertyAccessExpression(node: ts.Node) {\n              const propAccess = node as ts.PropertyAccessExpression;\n\n              if (xssProps.includes(propAccess.name.text)) {\n                const pos = context.ast.getLineAndCharacterOfPosition(propAccess.getStart(context.ast));\n                findings.push({\n                  message: `Use of ${propAccess.name.text} — potential XSS vulnerability`,\n                  file: context.file.path,\n                  line: pos.line + 1,\n                  column: pos.character + 1,\n                  fix: {\n                    suggestion: 'Sanitize HTML content before insertion or use safe alternatives.',\n                  },\n                });\n              }\n            },\n            CallExpression(node: ts.Node) {\n              const call = node as ts.CallExpression;\n\n              if (ts.isPropertyAccessExpression(call.expression)) {\n                const name = call.expression.name.text;\n                if (name === 'write' || name === 'writeln') {\n                  if (ts.isIdentifier(call.expression.expression) && call.expression.expression.text === 'document') {\n                    const pos = context.ast.getLineAndCharacterOfPosition(call.getStart(context.ast));\n                    findings.push({\n                      message: 'document.write() is an XSS risk',\n                      file: context.file.path,\n                      line: pos.line + 1,\n                      column: pos.character + 1,\n                      fix: {\n                        suggestion: 'Use DOM manipulation methods instead of document.write().',\n                      },\n                    });\n                  }\n                }\n              }\n            },\n          });\n\n          return findings;\n        },\n      });\n\n      // security/missing-auth-check\n      kernel.registerRule({\n        name: 'security/missing-auth-check',\n        severity: 'warning',\n        description: 'Detects route handlers without auth checks',\n        category: 'security',\n        check(context: RuleContext): Finding[] {\n          if (!fullConfig.checkAuth) return [];\n          if (context.file.role !== 'controller') return [];\n          const findings: Finding[] = [];\n\n          const fileText = context.ast.getFullText();\n          const hasAuthReference =\n            fileText.includes('auth') ||\n            fileText.includes('Auth') ||\n            fileText.includes('authenticate') ||\n            fileText.includes('authorize') ||\n            fileText.includes('guard') ||\n            fileText.includes('middleware') ||\n            fileText.includes('jwt') ||\n            fileText.includes('token');\n\n          if (!hasAuthReference && context.file.functions.length > 0) {\n            findings.push({\n              message: 'Controller has no authentication/authorization references',\n              file: context.file.path,\n              line: 1,\n              column: 1,\n              fix: {\n                suggestion: 'Add authentication middleware or auth checks to route handlers.',\n              },\n            });\n          }\n\n          return findings;\n        },\n      });\n\n      // security/insecure-random\n      kernel.registerRule({\n        name: 'security/insecure-random',\n        severity: 'warning',\n        description: 'Detects Math.random() in security-sensitive contexts',\n        category: 'security',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n\n          context.walk(context.ast, {\n            CallExpression(node: ts.Node) {\n              const call = node as ts.CallExpression;\n\n              if (ts.isPropertyAccessExpression(call.expression)) {\n                if (\n                  ts.isIdentifier(call.expression.expression) &&\n                  call.expression.expression.text === 'Math' &&\n                  call.expression.name.text === 'random'\n                ) {\n                  // Check if used in security context\n                  const fileText = context.ast.getFullText();\n                  const isSecurityContext =\n                    fileText.includes('token') ||\n                    fileText.includes('secret') ||\n                    // codeguardian-disable-next-line security/hardcoded-secret -- detection keyword, not a real secret\n                    fileText.includes('password') ||\n                    fileText.includes('hash') ||\n                    fileText.includes('crypto') ||\n                    fileText.includes('session');\n\n                  if (isSecurityContext) {\n                    const pos = context.ast.getLineAndCharacterOfPosition(call.getStart(context.ast));\n                    findings.push({\n                      message: 'Math.random() is not cryptographically secure',\n                      file: context.file.path,\n                      line: pos.line + 1,\n                      column: pos.character + 1,\n                      fix: {\n                        suggestion: 'Use crypto.randomBytes() or crypto.randomUUID() for security-sensitive values.',\n                      },\n                    });\n                  }\n                }\n              }\n            },\n          });\n\n          return findings;\n        },\n      });\n\n      // security/path-traversal\n      kernel.registerRule({\n        name: 'security/path-traversal',\n        severity: 'error',\n        description: 'Detects file operations with potential path traversal',\n        category: 'security',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n          const fsOps = ['readFile', 'readFileSync', 'writeFile', 'writeFileSync', 'createReadStream', 'createWriteStream', 'access', 'open'];\n\n          context.walk(context.ast, {\n            CallExpression(node: ts.Node) {\n              const call = node as ts.CallExpression;\n\n              let methodName = '';\n              if (ts.isPropertyAccessExpression(call.expression)) {\n                methodName = call.expression.name.text;\n              } else if (ts.isIdentifier(call.expression)) {\n                methodName = call.expression.text;\n              }\n\n              if (fsOps.includes(methodName) && call.arguments.length > 0) {\n                const firstArg = call.arguments[0]!;\n                if (ts.isTemplateExpression(firstArg) || context.hasStringConcat(firstArg)) {\n                  const pos = context.ast.getLineAndCharacterOfPosition(call.getStart(context.ast));\n                  findings.push({\n                    message: `File operation \"${methodName}\" with dynamic path — potential path traversal`,\n                    file: context.file.path,\n                    line: pos.line + 1,\n                    column: pos.character + 1,\n                    fix: {\n                      suggestion: 'Validate and sanitize file paths. Use path.resolve() and check against a whitelist.',\n                    },\n                  });\n                }\n              }\n            },\n          });\n\n          return findings;\n        },\n      });\n    },\n  };\n}\n","import ts from 'typescript';\nimport type { Finding, GuardianPlugin, PerformancePluginConfig, RuleContext } from '../../types.js';\n\nconst DB_CALL_PATTERNS = ['find', 'findOne', 'findAll', 'findById', 'query', 'execute', 'fetch', 'select'];\nconst SYNC_FS_METHODS = ['readFileSync', 'writeFileSync', 'appendFileSync', 'mkdirSync', 'readdirSync', 'statSync', 'existsSync', 'unlinkSync', 'copyFileSync'];\n\n/**\n * Performance plugin — catches N+1 queries, memory leaks, sync operations.\n *\n * Rules:\n * - performance/n1-query\n * - performance/sync-in-async\n * - performance/memory-leak-risk\n * - performance/unbounded-query\n * - performance/missing-index-hint\n * - performance/heavy-import\n * - performance/blocking-operation\n *\n * @param config - Performance plugin configuration\n * @returns GuardianPlugin instance\n *\n * @example\n * ```typescript\n * guardian.use(performancePlugin({ checkN1Queries: true }));\n * ```\n */\nexport function performancePlugin(\n  config: Partial<PerformancePluginConfig> = {},\n): GuardianPlugin<PerformancePluginConfig> {\n  const fullConfig: PerformancePluginConfig = {\n    enabled: true,\n    checkN1Queries: true,\n    checkMemoryLeaks: true,\n    checkAsyncPatterns: true,\n    checkBundleSize: false,\n    ...config,\n  };\n\n  return {\n    name: 'performance',\n    version: '1.0.0',\n    install(kernel) {\n      // performance/n1-query\n      kernel.registerRule({\n        name: 'performance/n1-query',\n        severity: 'warning',\n        description: 'Detects database calls inside loops (potential N+1 query)',\n        category: 'performance',\n        check(context: RuleContext): Finding[] {\n          if (!fullConfig.checkN1Queries) return [];\n          const findings: Finding[] = [];\n\n          const checkForDbCallsInLoop = (loopNode: ts.Node): void => {\n            ts.forEachChild(loopNode, function visitChild(child) {\n              if (ts.isCallExpression(child)) {\n                let methodName = '';\n                if (ts.isPropertyAccessExpression(child.expression)) {\n                  methodName = child.expression.name.text;\n                }\n                if (DB_CALL_PATTERNS.includes(methodName)) {\n                  const pos = context.ast.getLineAndCharacterOfPosition(child.getStart(context.ast));\n                  findings.push({\n                    message: `Potential N+1 query: \"${methodName}\" called inside a loop`,\n                    file: context.file.path,\n                    line: pos.line + 1,\n                    column: pos.character + 1,\n                    fix: {\n                      suggestion: 'Batch queries using Promise.all() or a single query with IN clause.',\n                    },\n                  });\n                }\n              }\n              ts.forEachChild(child, visitChild);\n            });\n          };\n\n          context.walk(context.ast, {\n            ForStatement(node: ts.Node) { checkForDbCallsInLoop(node); },\n            ForInStatement(node: ts.Node) { checkForDbCallsInLoop(node); },\n            ForOfStatement(node: ts.Node) { checkForDbCallsInLoop(node); },\n            WhileStatement(node: ts.Node) { checkForDbCallsInLoop(node); },\n            DoStatement(node: ts.Node) { checkForDbCallsInLoop(node); },\n          });\n\n          // Also check .forEach() and .map()\n          context.walk(context.ast, {\n            CallExpression(node: ts.Node) {\n              const call = node as ts.CallExpression;\n\n              if (ts.isPropertyAccessExpression(call.expression)) {\n                const name = call.expression.name.text;\n                if (name === 'forEach' || name === 'map') {\n                  if (call.arguments.length > 0) {\n                    checkForDbCallsInLoop(call.arguments[0]!);\n                  }\n                }\n              }\n            },\n          });\n\n          return findings;\n        },\n      });\n\n      // performance/sync-in-async\n      kernel.registerRule({\n        name: 'performance/sync-in-async',\n        severity: 'warning',\n        description: 'Detects synchronous file operations in async functions',\n        category: 'performance',\n        check(context: RuleContext): Finding[] {\n          if (!fullConfig.checkAsyncPatterns) return [];\n          const findings: Finding[] = [];\n\n          for (const fn of context.file.functions) {\n            if (!fn.isAsync) continue;\n\n            // Walk the function's AST to find sync calls\n            context.walk(context.ast, {\n              CallExpression(node: ts.Node) {\n                const call = node as ts.CallExpression;\n\n                const pos = context.ast.getLineAndCharacterOfPosition(call.getStart(context.ast));\n                const callLine = pos.line + 1;\n\n                // Check if this call is within the async function's range\n                if (callLine < fn.startLine || callLine > fn.endLine) return;\n\n                let methodName = '';\n                if (ts.isPropertyAccessExpression(call.expression)) {\n                  methodName = call.expression.name.text;\n                } else if (ts.isIdentifier(call.expression)) {\n                  methodName = call.expression.text;\n                }\n\n                if (SYNC_FS_METHODS.includes(methodName)) {\n                  findings.push({\n                    message: `Synchronous \"${methodName}\" in async function \"${fn.name}\"`,\n                    file: context.file.path,\n                    line: callLine,\n                    column: pos.character + 1,\n                    fix: {\n                      suggestion: `Use the async version instead (e.g., fs.promises.${methodName.replace('Sync', '')}).`,\n                    },\n                  });\n                }\n              },\n            });\n          }\n\n          return findings;\n        },\n      });\n\n      // performance/memory-leak-risk\n      kernel.registerRule({\n        name: 'performance/memory-leak-risk',\n        severity: 'warning',\n        description: 'Detects addEventListener without removeEventListener, setInterval without clearInterval',\n        category: 'performance',\n        check(context: RuleContext): Finding[] {\n          if (!fullConfig.checkMemoryLeaks) return [];\n          const findings: Finding[] = [];\n          const fileText = context.ast.getFullText();\n\n          // Check for addEventListener without removeEventListener\n          if (fileText.includes('addEventListener') && !fileText.includes('removeEventListener')) {\n            context.walk(context.ast, {\n              CallExpression(node: ts.Node) {\n                const call = node as ts.CallExpression;\n\n                if (ts.isPropertyAccessExpression(call.expression) &&\n                    call.expression.name.text === 'addEventListener') {\n                  const pos = context.ast.getLineAndCharacterOfPosition(call.getStart(context.ast));\n                  findings.push({\n                    message: 'addEventListener without corresponding removeEventListener — potential memory leak',\n                    file: context.file.path,\n                    line: pos.line + 1,\n                    column: pos.character + 1,\n                    fix: {\n                      suggestion: 'Add a cleanup function that calls removeEventListener.',\n                    },\n                  });\n                }\n              },\n            });\n          }\n\n          // Check for setInterval without clearInterval\n          if (fileText.includes('setInterval') && !fileText.includes('clearInterval')) {\n            context.walk(context.ast, {\n              CallExpression(node: ts.Node) {\n                const call = node as ts.CallExpression;\n\n                if (ts.isIdentifier(call.expression) && call.expression.text === 'setInterval') {\n                  const pos = context.ast.getLineAndCharacterOfPosition(call.getStart(context.ast));\n                  findings.push({\n                    message: 'setInterval without clearInterval — potential memory leak',\n                    file: context.file.path,\n                    line: pos.line + 1,\n                    column: pos.character + 1,\n                    fix: {\n                      suggestion: 'Store the interval ID and clear it when no longer needed.',\n                    },\n                  });\n                }\n              },\n            });\n          }\n\n          return findings;\n        },\n      });\n\n      // performance/unbounded-query\n      kernel.registerRule({\n        name: 'performance/unbounded-query',\n        severity: 'warning',\n        description: 'Detects database queries without LIMIT or pagination',\n        category: 'performance',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n\n          context.walk(context.ast, {\n            CallExpression(node: ts.Node) {\n              const call = node as ts.CallExpression;\n\n              let methodName = '';\n              if (ts.isPropertyAccessExpression(call.expression)) {\n                methodName = call.expression.name.text;\n              }\n\n              if (methodName === 'findAll' || methodName === 'find') {\n                // Check if there's a limit/take in the arguments\n                const argText = call.arguments.map((a) => a.getText(context.ast)).join(' ');\n                if (!argText.includes('limit') && !argText.includes('take') && !argText.includes('LIMIT')) {\n                  const pos = context.ast.getLineAndCharacterOfPosition(call.getStart(context.ast));\n                  findings.push({\n                    message: `\"${methodName}\" without limit — could return unbounded results`,\n                    file: context.file.path,\n                    line: pos.line + 1,\n                    column: pos.character + 1,\n                    fix: {\n                      suggestion: 'Add a LIMIT clause or pagination to prevent loading too many records.',\n                    },\n                  });\n                }\n              }\n            },\n          });\n\n          return findings;\n        },\n      });\n\n      // performance/missing-index-hint\n      kernel.registerRule({\n        name: 'performance/missing-index-hint',\n        severity: 'info',\n        description: 'Detects queries that may need database indexes',\n        category: 'performance',\n        check(_context: RuleContext): Finding[] {\n          // This rule requires schema knowledge which we don't have\n          // Return empty for now — can be extended with schema plugin\n          return [];\n        },\n      });\n\n      // performance/heavy-import\n      kernel.registerRule({\n        name: 'performance/heavy-import',\n        severity: 'info',\n        description: 'Detects importing entire libraries when a smaller import is available',\n        category: 'performance',\n        check(context: RuleContext): Finding[] {\n          if (!fullConfig.checkBundleSize) return [];\n          const findings: Finding[] = [];\n          const heavyLibs = ['lodash', 'moment', 'rxjs'];\n\n          for (const imp of context.file.imports) {\n            for (const lib of heavyLibs) {\n              if (imp.source === lib && imp.specifiers.length <= 2) {\n                findings.push({\n                  /* v8 ignore next */\n                  message: `Importing from \"${lib}\" — consider using \"${lib}/${imp.specifiers[0] ?? ''}\" for smaller bundle`,\n                  file: context.file.path,\n                  line: 1,\n                  column: 1,\n                  fix: {\n                    suggestion: `Use deep imports (e.g., \"${lib}/functionName\") for tree-shaking.`,\n                  },\n                });\n              }\n            }\n          }\n\n          return findings;\n        },\n      });\n\n      // performance/blocking-operation\n      kernel.registerRule({\n        name: 'performance/blocking-operation',\n        severity: 'warning',\n        description: 'Detects CPU-intensive operations in request handlers',\n        category: 'performance',\n        check(context: RuleContext): Finding[] {\n          if (context.file.role !== 'controller') return [];\n          const findings: Finding[] = [];\n\n          context.walk(context.ast, {\n            CallExpression(node: ts.Node) {\n              const call = node as ts.CallExpression;\n\n              let methodName = '';\n              if (ts.isPropertyAccessExpression(call.expression)) {\n                methodName = call.expression.name.text;\n              } else if (ts.isIdentifier(call.expression)) {\n                methodName = call.expression.text;\n              }\n\n              // Large JSON.parse\n              if (methodName === 'parse' && ts.isPropertyAccessExpression(call.expression)) {\n                if (ts.isIdentifier(call.expression.expression) && call.expression.expression.text === 'JSON') {\n                  const pos = context.ast.getLineAndCharacterOfPosition(call.getStart(context.ast));\n                  findings.push({\n                    message: 'JSON.parse() in request handler may block event loop for large payloads',\n                    file: context.file.path,\n                    line: pos.line + 1,\n                    column: pos.character + 1,\n                    fix: {\n                      suggestion: 'Consider streaming JSON parsing or limiting request body size.',\n                    },\n                  });\n                }\n              }\n            },\n          });\n\n          return findings;\n        },\n      });\n    },\n  };\n}\n","import ts from 'typescript';\nimport type { Finding, GuardianPlugin, QualityPluginConfig, RuleContext } from '../../types.js';\n\n/**\n * Quality plugin — checks complexity, dead code, naming, and patterns.\n *\n * Rules:\n * - quality/cyclomatic-complexity\n * - quality/dead-code\n * - quality/any-type\n * - quality/no-error-handling\n * - quality/inconsistent-naming\n * - quality/magic-number\n * - quality/empty-catch\n * - quality/nested-callbacks\n *\n * @param config - Quality plugin configuration\n * @returns GuardianPlugin instance\n *\n * @example\n * ```typescript\n * guardian.use(qualityPlugin({ maxCyclomaticComplexity: 10 }));\n * ```\n */\nexport function qualityPlugin(\n  config: Partial<QualityPluginConfig> = {},\n): GuardianPlugin<QualityPluginConfig> {\n  const fullConfig: QualityPluginConfig = {\n    enabled: true,\n    checkDeadCode: true,\n    checkNaming: true,\n    checkComplexity: true,\n    maxCyclomaticComplexity: 15,\n    ...config,\n  };\n\n  return {\n    name: 'quality',\n    version: '1.0.0',\n    install(kernel) {\n      // quality/cyclomatic-complexity\n      kernel.registerRule({\n        name: 'quality/cyclomatic-complexity',\n        severity: 'warning',\n        description: 'Detects functions with high cyclomatic complexity',\n        category: 'quality',\n        check(context: RuleContext): Finding[] {\n          if (!fullConfig.checkComplexity) return [];\n          const findings: Finding[] = [];\n          const maxComplexity = fullConfig.maxCyclomaticComplexity ?? 15;\n\n          for (const fn of context.file.functions) {\n            if (fn.complexity > maxComplexity) {\n              findings.push({\n                message: `Function \"${fn.name}\" has cyclomatic complexity ${fn.complexity} (max: ${maxComplexity})`,\n                file: context.file.path,\n                line: fn.startLine,\n                column: 1,\n                fix: {\n                  suggestion: 'Simplify by extracting conditions into named functions or using early returns.',\n                },\n              });\n            }\n          }\n\n          return findings;\n        },\n      });\n\n      // quality/dead-code\n      kernel.registerRule({\n        name: 'quality/dead-code',\n        severity: 'warning',\n        description: 'Detects exported symbols never imported by other files',\n        category: 'quality',\n        check(context: RuleContext): Finding[] {\n          if (!fullConfig.checkDeadCode) return [];\n          if (context.file.role === 'test') return [];\n          const findings: Finding[] = [];\n\n          for (const exportName of context.file.exports) {\n            // Skip default exports and index files\n            if (exportName === 'default') continue;\n            /* v8 ignore next */\n            const fileName = context.file.path.split('/').pop() ?? '';\n            if (fileName === 'index.ts' || fileName === 'index.tsx') continue;\n\n            const isUsed = context.isExternallyUsed(exportName);\n            if (!isUsed) {\n              findings.push({\n                message: `Exported symbol \"${exportName}\" is never imported by other files`,\n                file: context.file.path,\n                line: 1,\n                column: 1,\n                fix: {\n                  suggestion: 'Remove unused export or add an import if intentional.',\n                },\n              });\n            }\n          }\n\n          return findings;\n        },\n      });\n\n      // quality/any-type\n      kernel.registerRule({\n        name: 'quality/any-type',\n        severity: 'warning',\n        description: 'Detects usage of `any` type annotation',\n        category: 'quality',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n\n          context.walk(context.ast, {\n            // TypeReference for explicit 'any' annotations\n            AnyKeyword(node: ts.Node) {\n              const pos = context.ast.getLineAndCharacterOfPosition(node.getStart(context.ast));\n              findings.push({\n                message: 'Usage of `any` type — use a specific type instead',\n                file: context.file.path,\n                line: pos.line + 1,\n                column: pos.character + 1,\n                fix: {\n                  suggestion: 'Replace `any` with a specific type or `unknown`.',\n                },\n              });\n            },\n          });\n\n          return findings;\n        },\n      });\n\n      // quality/no-error-handling\n      kernel.registerRule({\n        name: 'quality/no-error-handling',\n        severity: 'warning',\n        description: 'Detects async functions without error handling',\n        category: 'quality',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n\n          for (const fn of context.file.functions) {\n            if (!fn.isAsync) continue;\n\n            // Check if the function body has a try-catch or .catch()\n            const fileText = context.ast.getFullText();\n            const fnText = fileText.slice(\n              getLineOffset(fileText, fn.startLine),\n              getLineOffset(fileText, fn.endLine + 1),\n            );\n\n            const hasTryCatch = fnText.includes('try') && fnText.includes('catch');\n            const hasDotCatch = fnText.includes('.catch(');\n            const hasThrow = fnText.includes('throw ');\n\n            if (!hasTryCatch && !hasDotCatch && !hasThrow) {\n              findings.push({\n                message: `Async function \"${fn.name}\" has no error handling (try-catch or .catch())`,\n                file: context.file.path,\n                line: fn.startLine,\n                column: 1,\n                fix: {\n                  suggestion: 'Add try-catch around async operations or use .catch() on promises.',\n                },\n              });\n            }\n          }\n\n          return findings;\n        },\n      });\n\n      // quality/inconsistent-naming\n      kernel.registerRule({\n        name: 'quality/inconsistent-naming',\n        severity: 'info',\n        description: 'Detects naming that does not follow project conventions',\n        category: 'quality',\n        check(context: RuleContext): Finding[] {\n          if (!fullConfig.checkNaming) return [];\n          const findings: Finding[] = [];\n\n          for (const fn of context.file.functions) {\n            // Functions should be camelCase\n            if (fn.name && !/^[a-z_$]/.test(fn.name) && !/^[A-Z][A-Z_]+$/.test(fn.name)) {\n              // Allow PascalCase for component functions\n              if (context.file.role !== 'unknown') {\n                findings.push({\n                  message: `Function \"${fn.name}\" does not follow camelCase naming convention`,\n                  file: context.file.path,\n                  line: fn.startLine,\n                  column: 1,\n                  fix: {\n                    suggestion: 'Use camelCase for function names (e.g., getUser, handleRequest).',\n                  },\n                });\n              }\n            }\n          }\n\n          return findings;\n        },\n      });\n\n      // quality/magic-number\n      kernel.registerRule({\n        name: 'quality/magic-number',\n        severity: 'info',\n        description: 'Detects numeric literals used directly in logic',\n        category: 'quality',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n          const allowedNumbers = new Set([0, 1, -1, 2, 100, 200, 201, 204, 301, 302, 400, 401, 403, 404, 500]);\n\n          context.walk(context.ast, {\n            NumericLiteral(node: ts.Node) {\n              const num = node as ts.NumericLiteral;\n\n              const value = parseFloat(num.text);\n              if (allowedNumbers.has(value)) return;\n\n              // Skip if it's in a const declaration or enum\n              let parent: ts.Node = num.parent;\n              while (parent) {\n                if (ts.isVariableDeclaration(parent) || ts.isEnumMember(parent) || ts.isPropertyAssignment(parent)) {\n                  return;\n                }\n                parent = parent.parent;\n              }\n\n              const pos = context.ast.getLineAndCharacterOfPosition(num.getStart(context.ast));\n              findings.push({\n                message: `Magic number ${num.text} — extract to a named constant`,\n                file: context.file.path,\n                line: pos.line + 1,\n                column: pos.character + 1,\n                fix: {\n                  suggestion: 'Extract numeric literal to a named constant for clarity.',\n                },\n              });\n            },\n          });\n\n          return findings;\n        },\n      });\n\n      // quality/empty-catch\n      kernel.registerRule({\n        name: 'quality/empty-catch',\n        severity: 'warning',\n        description: 'Detects empty catch blocks',\n        category: 'quality',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n\n          context.walk(context.ast, {\n            CatchClause(node: ts.Node) {\n              const catchClause = node as ts.CatchClause;\n\n              const block = catchClause.block;\n              if (block.statements.length === 0) {\n                const pos = context.ast.getLineAndCharacterOfPosition(catchClause.getStart(context.ast));\n                findings.push({\n                  message: 'Empty catch block — errors are silently swallowed',\n                  file: context.file.path,\n                  line: pos.line + 1,\n                  column: pos.character + 1,\n                  fix: {\n                    suggestion: 'Handle the error, log it, or re-throw if appropriate.',\n                  },\n                });\n              }\n            },\n          });\n\n          return findings;\n        },\n      });\n\n      // quality/nested-callbacks\n      kernel.registerRule({\n        name: 'quality/nested-callbacks',\n        severity: 'warning',\n        description: 'Detects deeply nested callbacks (> 3 levels)',\n        category: 'quality',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n          const maxNesting = 3;\n\n          const checkNesting = (node: ts.Node, depth: number): void => {\n            if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {\n              if (depth > maxNesting) {\n                const pos = context.ast.getLineAndCharacterOfPosition(node.getStart(context.ast));\n                findings.push({\n                  message: `Callback nested ${depth} levels deep (max: ${maxNesting})`,\n                  file: context.file.path,\n                  line: pos.line + 1,\n                  column: pos.character + 1,\n                  fix: {\n                    suggestion: 'Use async/await or extract nested callbacks into named functions.',\n                  },\n                });\n                return; // Don't recurse further\n              }\n              ts.forEachChild(node, (child) => checkNesting(child, depth + 1));\n            } else {\n              ts.forEachChild(node, (child) => checkNesting(child, depth));\n            }\n          };\n\n          ts.forEachChild(context.ast, (child) => checkNesting(child, 0));\n\n          return findings;\n        },\n      });\n    },\n  };\n}\n\nfunction getLineOffset(text: string, line: number): number {\n  let offset = 0;\n  let currentLine = 1;\n  for (let i = 0; i < text.length; i++) {\n    if (currentLine === line) return offset;\n    if (text[i] === '\\n') {\n      currentLine++;\n    }\n    offset++;\n  }\n  return offset;\n}\n","import type { Finding, GuardianPlugin, NamingPluginConfig, RuleContext } from '../../types.js';\n\n/**\n * Naming convention plugin — enforces strict file naming patterns.\n *\n * @example\n * ```typescript\n * guardian.use(namingPlugin({ enabled: true }));\n * ```\n */\nexport function namingPlugin(\n  _config: Partial<NamingPluginConfig> = {},\n): GuardianPlugin<NamingPluginConfig> {\n  return {\n    name: 'naming-convention',\n    version: '1.0.0',\n    install(kernel) {\n      kernel.registerRule({\n        name: 'naming-convention/file-naming',\n        severity: 'warning',\n        description: 'Enforces consistent file naming patterns based on directory',\n        category: 'quality',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n          const path = context.file.path;\n          /* v8 ignore next */\n          const fileName = path.split('/').pop() ?? '';\n\n          // Check service files\n          if (path.includes('/services/') && !fileName.endsWith('.service.ts') && !fileName.endsWith('.test.ts')) {\n            findings.push({\n              message: `File in services/ should follow *.service.ts naming: \"${fileName}\"`,\n              file: context.file.path,\n              line: 1,\n              column: 1,\n              fix: { suggestion: 'Rename file to follow *.service.ts convention.' },\n            });\n          }\n\n          // Check controller files\n          if (path.includes('/controllers/') && !fileName.endsWith('.controller.ts') && !fileName.endsWith('.test.ts')) {\n            findings.push({\n              message: `File in controllers/ should follow *.controller.ts naming: \"${fileName}\"`,\n              file: context.file.path,\n              line: 1,\n              column: 1,\n              fix: { suggestion: 'Rename file to follow *.controller.ts convention.' },\n            });\n          }\n\n          // Check repository files\n          if (path.includes('/repositories/') && !fileName.endsWith('.repository.ts') && !fileName.endsWith('.test.ts')) {\n            findings.push({\n              message: `File in repositories/ should follow *.repository.ts naming: \"${fileName}\"`,\n              file: context.file.path,\n              line: 1,\n              column: 1,\n              fix: { suggestion: 'Rename file to follow *.repository.ts convention.' },\n            });\n          }\n\n          return findings;\n        },\n      });\n    },\n  };\n}\n","import ts from 'typescript';\nimport type { Finding, GuardianPlugin, ApiPluginConfig, RuleContext } from '../../types.js';\n\n/**\n * API consistency plugin — checks REST endpoint naming and response format consistency.\n *\n * @example\n * ```typescript\n * guardian.use(apiPlugin({ enabled: true }));\n * ```\n */\nexport function apiPlugin(\n  _config: Partial<ApiPluginConfig> = {},\n): GuardianPlugin<ApiPluginConfig> {\n  return {\n    name: 'api-consistency',\n    version: '1.0.0',\n    install(kernel) {\n      kernel.registerRule({\n        name: 'api-consistency/endpoint-naming',\n        severity: 'info',\n        description: 'Checks REST API endpoint naming conventions',\n        category: 'quality',\n        check(context: RuleContext): Finding[] {\n          if (context.file.role !== 'controller') return [];\n          const findings: Finding[] = [];\n\n          context.walk(context.ast, {\n            StringLiteral(node: ts.Node) {\n              const str = node as ts.StringLiteral;\n              const value = str.text;\n\n              // Check for route-like strings\n              if (value.startsWith('/') && value.length > 1) {\n                // Check for camelCase in paths (should be kebab-case)\n                if (/\\/[a-z]+[A-Z]/.test(value)) {\n                  const pos = context.ast.getLineAndCharacterOfPosition(str.getStart(context.ast));\n                  findings.push({\n                    message: `API endpoint \"${value}\" uses camelCase — prefer kebab-case`,\n                    file: context.file.path,\n                    line: pos.line + 1,\n                    column: pos.character + 1,\n                    fix: { suggestion: 'Use kebab-case for URL paths (e.g., /user-profiles instead of /userProfiles).' },\n                  });\n                }\n              }\n            },\n          });\n\n          return findings;\n        },\n      });\n    },\n  };\n}\n","import type { Finding, GuardianPlugin, TestGuardPluginConfig, RuleContext } from '../../types.js';\n\n/**\n * Test coverage guard plugin — ensures changed files have corresponding test files.\n *\n * @example\n * ```typescript\n * guardian.use(testGuardPlugin({ enabled: true }));\n * ```\n */\nexport function testGuardPlugin(\n  _config: Partial<TestGuardPluginConfig> = {},\n): GuardianPlugin<TestGuardPluginConfig> {\n  return {\n    name: 'test-coverage-guard',\n    version: '1.0.0',\n    install(kernel) {\n      kernel.registerRule({\n        name: 'test-coverage-guard/missing-tests',\n        severity: 'warning',\n        description: 'Ensures source files have corresponding test files',\n        category: 'quality',\n        check(context: RuleContext): Finding[] {\n          if (context.file.role === 'test' || context.file.role === 'type' || context.file.role === 'config') {\n            return [];\n          }\n\n          const findings: Finding[] = [];\n          const filePath = context.file.path;\n\n          // Generate expected test file paths\n          const testPaths = getExpectedTestPaths(filePath);\n\n          // Check if any test file exists in the graph\n          const hasTest = testPaths.some((tp) => context.graph.files.has(tp));\n\n          if (!hasTest) {\n            findings.push({\n              message: `No test file found for \"${filePath}\"`,\n              file: context.file.path,\n              line: 1,\n              column: 1,\n              fix: {\n                /* v8 ignore next */\n                suggestion: `Create a test file (e.g., ${testPaths[0] ?? filePath.replace('.ts', '.test.ts')}).`,\n              },\n            });\n          }\n\n          return findings;\n        },\n      });\n    },\n  };\n}\n\nfunction getExpectedTestPaths(filePath: string): string[] {\n  const base = filePath.replace(/\\.ts$/, '');\n  return [\n    `${base}.test.ts`,\n    `${base}.spec.ts`,\n    filePath.replace('src/', 'tests/').replace('.ts', '.test.ts'),\n    filePath.replace('src/', 'tests/unit/').replace('.ts', '.test.ts'),\n  ];\n}\n","import type { Finding, GuardianPlugin, DepAuditPluginConfig, RuleContext } from '../../types.js';\n\n/**\n * Dependency audit plugin — checks import depth and heavy transitive dependencies.\n *\n * @example\n * ```typescript\n * guardian.use(depAuditPlugin({ enabled: true, maxDepth: 5 }));\n * ```\n */\nexport function depAuditPlugin(\n  config: Partial<DepAuditPluginConfig> = {},\n): GuardianPlugin<DepAuditPluginConfig> {\n  const fullConfig: DepAuditPluginConfig = {\n    enabled: true,\n    maxDepth: 5,\n    ...config,\n  };\n\n  return {\n    name: 'dependency-audit',\n    version: '1.0.0',\n    install(kernel) {\n      kernel.registerRule({\n        name: 'dependency-audit/deep-imports',\n        severity: 'info',\n        description: 'Detects deeply nested import chains',\n        category: 'architecture',\n        check(context: RuleContext): Finding[] {\n          const findings: Finding[] = [];\n          const maxDepth = fullConfig.maxDepth ?? 5;\n\n          // Calculate import depth for this file\n          const depth = calculateImportDepth(\n            context.file.path,\n            context.graph.dependencies.adjacency,\n            new Set(),\n          );\n\n          if (depth > maxDepth) {\n            findings.push({\n              message: `File has import depth of ${depth} (max: ${maxDepth})`,\n              file: context.file.path,\n              line: 1,\n              column: 1,\n              fix: {\n                suggestion: 'Consider restructuring imports to reduce dependency depth.',\n              },\n            });\n          }\n\n          return findings;\n        },\n      });\n    },\n  };\n}\n\nfunction calculateImportDepth(\n  file: string,\n  adjacency: Map<string, Set<string>>,\n  visited: Set<string>,\n): number {\n  if (visited.has(file)) return 0;\n  visited.add(file);\n\n  const deps = adjacency.get(file);\n  if (!deps || deps.size === 0) return 0;\n\n  let maxDepth = 0;\n  for (const dep of deps) {\n    const depth = calculateImportDepth(dep, adjacency, visited);\n    maxDepth = Math.max(maxDepth, depth);\n  }\n\n  return maxDepth + 1;\n}\n","/**\n * @oxog/codeguardian — Zero-dependency TypeScript codebase guardian.\n *\n * @example\n * ```typescript\n * import { createGuardian, defineRule, definePlugin } from '@oxog/codeguardian';\n *\n * const guardian = createGuardian({ rootDir: process.cwd() });\n * const graph = await guardian.scan();\n * const result = await guardian.run({ staged: true });\n *\n * if (result.blocked) {\n *   console.error('Commit blocked!');\n *   process.exit(1);\n * }\n * ```\n */\n\nimport type {\n  CodebaseGraph,\n  GuardianConfig,\n  GuardianPlugin,\n  IncrementalResult,\n  Rule,\n  RunOptions,\n  RunResult,\n} from './types.js';\nimport { createKernel } from './kernel.js';\nimport { buildGraph } from './graph/builder.js';\nimport { loadGraphCache, saveGraphCache } from './graph/cache.js';\nimport { updateGraphIncremental } from './graph/incremental.js';\nimport { getFile, getSymbol, getDependencies, getDependents, findCircularDeps, getGraphStats } from './graph/query.js';\nimport { executeRules } from './rules/engine.js';\nimport { loadConfig } from './config/loader.js';\nimport { getStagedFiles } from './git/staged.js';\nimport { createTSProgram } from './ast/parser.js';\nimport { formatTerminal } from './reporter/terminal.js';\nimport { formatJSON } from './reporter/json.js';\nimport { formatSARIF } from './reporter/sarif.js';\nimport { discoverConventions } from './discovery/conventions.js';\nimport { architecturePlugin } from './plugins/core/architecture.js';\nimport { securityPlugin } from './plugins/core/security.js';\nimport { performancePlugin } from './plugins/core/performance.js';\nimport { qualityPlugin } from './plugins/core/quality.js';\nimport { namingPlugin } from './plugins/optional/naming.js';\nimport { apiPlugin } from './plugins/optional/api.js';\nimport { testGuardPlugin } from './plugins/optional/test-guard.js';\nimport { depAuditPlugin } from './plugins/optional/dep-audit.js';\n\n/**\n * Create a Guardian instance for analyzing a TypeScript project.\n *\n * @param config - Guardian configuration\n * @returns Guardian instance with scan, run, use methods\n *\n * @example\n * ```typescript\n * const guardian = createGuardian({\n *   rootDir: process.cwd(),\n *   tsconfig: './tsconfig.json',\n * });\n *\n * const graph = await guardian.scan();\n * console.log(`Scanned ${graph.files.size} files`);\n * ```\n */\nexport function createGuardian(config: GuardianConfig) {\n  const projectConfig = loadConfig(config.rootDir, config.config);\n  const kernel = createKernel();\n\n  let _graph: CodebaseGraph | null = null;\n  let _program: ReturnType<typeof createTSProgram> | null = null;\n\n  // Install default core plugins based on config\n  const pluginCfg = projectConfig.plugins;\n\n  if (pluginCfg.architecture?.enabled !== false) {\n    kernel.installPlugin(architecturePlugin(pluginCfg.architecture));\n  }\n  if (pluginCfg.security?.enabled !== false) {\n    kernel.installPlugin(securityPlugin(pluginCfg.security));\n  }\n  if (pluginCfg.performance?.enabled !== false) {\n    kernel.installPlugin(performancePlugin(pluginCfg.performance));\n  }\n  if (pluginCfg.quality?.enabled !== false) {\n    kernel.installPlugin(qualityPlugin(pluginCfg.quality));\n  }\n\n  // Install optional plugins if enabled\n  if (pluginCfg.naming?.enabled) {\n    kernel.installPlugin(namingPlugin(pluginCfg.naming));\n  }\n  if (pluginCfg.api?.enabled) {\n    kernel.installPlugin(apiPlugin(pluginCfg.api));\n  }\n  if (pluginCfg.testGuard?.enabled) {\n    kernel.installPlugin(testGuardPlugin(pluginCfg.testGuard));\n  }\n  if (pluginCfg.depAudit?.enabled) {\n    kernel.installPlugin(depAuditPlugin(pluginCfg.depAudit));\n  }\n\n  function getProgram() {\n    if (!_program) {\n      _program = createTSProgram(config.rootDir, projectConfig.tsconfig);\n    }\n    return _program;\n  }\n\n  const guardian = {\n    /** The project configuration. */\n    config: projectConfig,\n\n    /** The codebase knowledge graph (available after scan). */\n    get graph(): CodebaseGraph {\n      if (!_graph) {\n        throw new Error('Graph not available. Call scan() first.');\n      }\n      return _graph;\n    },\n\n    /**\n     * Perform a full codebase scan and build the knowledge graph.\n     *\n     * @returns The complete codebase graph\n     *\n     * @example\n     * ```typescript\n     * const graph = await guardian.scan();\n     * console.log(`${graph.files.size} files, ${graph.symbols.size} symbols`);\n     * ```\n     */\n    async scan(): Promise<CodebaseGraph> {\n      _graph = buildGraph(\n        config.rootDir,\n        projectConfig.tsconfig,\n        projectConfig.include,\n        projectConfig.exclude,\n        projectConfig.plugins.architecture?.layers,\n      );\n\n      // Init plugins with graph\n      await kernel.initPlugins(_graph);\n\n      // Save cache\n      saveGraphCache(config.rootDir, _graph);\n\n      return _graph;\n    },\n\n    /**\n     * Perform an incremental scan based on git staged files.\n     *\n     * @returns Incremental result with changed and affected files\n     *\n     * @example\n     * ```typescript\n     * const result = await guardian.scanIncremental();\n     * console.log(`Updated ${result.changedFiles.length} files`);\n     * ```\n     */\n    async scanIncremental(): Promise<IncrementalResult> {\n      // Try to load cached graph\n      if (!_graph) {\n        _graph = loadGraphCache(config.rootDir);\n      }\n\n      // If no cache, do full scan\n      if (!_graph) {\n        await guardian.scan();\n      }\n\n      const program = getProgram();\n      const stagedFiles = getStagedFiles(config.rootDir);\n      const tsFiles = stagedFiles.filter((f) => f.endsWith('.ts') || f.endsWith('.tsx'));\n\n      const result = updateGraphIncremental(_graph!, tsFiles, config.rootDir, program);\n\n      // Save updated cache\n      saveGraphCache(config.rootDir, _graph!);\n\n      return result;\n    },\n\n    /**\n     * Run analysis rules on the codebase.\n     *\n     * @param options - Run options (staged, verbose, plugins, format)\n     * @returns Run result with findings, stats, and blocked status\n     *\n     * @example\n     * ```typescript\n     * const result = await guardian.run({ staged: true });\n     * if (result.blocked) {\n     *   console.error('Commit blocked!');\n     *   process.exit(1);\n     * }\n     * ```\n     */\n    async run(options: RunOptions = {}): Promise<RunResult> {\n      // Ensure graph is built\n      if (!_graph) {\n        if (options.staged) {\n          await guardian.scanIncremental();\n        } else {\n          await guardian.scan();\n        }\n      }\n\n      const program = getProgram();\n\n      // Determine target files\n      let targetFiles: string[];\n      if (options.staged) {\n        const stagedFiles = getStagedFiles(config.rootDir);\n        targetFiles = stagedFiles.filter(\n          (f) => (f.endsWith('.ts') || f.endsWith('.tsx')) && _graph!.files.has(f),\n        );\n      } else {\n        targetFiles = Array.from(_graph!.files.keys());\n      }\n\n      // Filter rules by plugin\n      let rules = kernel.getRules();\n      if (options.plugins && options.plugins.length > 0) {\n        rules = rules.filter((r) => {\n          const pluginName = r.name.split('/')[0];\n          return pluginName && options.plugins!.includes(pluginName);\n        });\n      }\n\n      // Build plugin config map\n      const pluginConfigMap: Record<string, Record<string, unknown>> = {};\n      if (projectConfig.plugins.architecture) {\n        pluginConfigMap['architecture'] = projectConfig.plugins.architecture as unknown as Record<string, unknown>;\n      }\n      if (projectConfig.plugins.security) {\n        pluginConfigMap['security'] = projectConfig.plugins.security as unknown as Record<string, unknown>;\n      }\n      if (projectConfig.plugins.performance) {\n        pluginConfigMap['performance'] = projectConfig.plugins.performance as unknown as Record<string, unknown>;\n      }\n      if (projectConfig.plugins.quality) {\n        pluginConfigMap['quality'] = projectConfig.plugins.quality as unknown as Record<string, unknown>;\n      }\n\n      const result = await executeRules(\n        _graph!,\n        rules,\n        targetFiles,\n        program,\n        pluginConfigMap,\n        projectConfig.ignore.rules!,\n        projectConfig.ignore.files!,\n        projectConfig.severity.blockOn,\n        config.rootDir,\n      );\n\n      return result;\n    },\n\n    /**\n     * Register a plugin with the guardian.\n     *\n     * @param plugin - Plugin to register\n     *\n     * @example\n     * ```typescript\n     * import { definePlugin } from '@oxog/codeguardian';\n     * guardian.use(myPlugin);\n     * ```\n     */\n    use<TConfig>(plugin: GuardianPlugin<TConfig>): void {\n      kernel.installPlugin(plugin);\n    },\n\n    /**\n     * Auto-discover project conventions.\n     *\n     * @returns Detected patterns\n     *\n     * @example\n     * ```typescript\n     * const conventions = await guardian.discover();\n     * ```\n     */\n    async discover() {\n      if (!_graph) {\n        await guardian.scan();\n      }\n      return discoverConventions(_graph!);\n    },\n\n    /**\n     * Format run results for output.\n     *\n     * @param result - Run result\n     * @param format - Output format\n     * @param verbose - Include info-level findings\n     * @returns Formatted string\n     */\n    format(result: RunResult, format: 'terminal' | 'json' | 'sarif' = 'terminal', verbose = false): string {\n      switch (format) {\n        case 'json':\n          return formatJSON(result);\n        case 'sarif':\n          return formatSARIF(result);\n        default:\n          return formatTerminal(result, verbose);\n      }\n    },\n\n    /**\n     * Get graph query helpers.\n     */\n    query: {\n      getFile: (path: string) => _graph ? getFile(_graph, path) : undefined,\n      getSymbol: (name: string) => _graph ? getSymbol(_graph, name) : undefined,\n      getDependencies: (path: string) => _graph ? getDependencies(_graph, path) : [],\n      getDependents: (path: string) => _graph ? getDependents(_graph, path) : [],\n      findCircularDeps: () => _graph ? findCircularDeps(_graph) : [],\n      getStats: () => _graph ? getGraphStats(_graph) : null,\n    },\n\n    /**\n     * Get all registered rules.\n     */\n    getRules(): Rule[] {\n      return kernel.getRules();\n    },\n\n    /**\n     * Get all installed plugin names.\n     */\n    getPlugins(): string[] {\n      return kernel.getPluginNames();\n    },\n  };\n\n  return guardian;\n}\n\n/**\n * Define a custom analysis rule.\n *\n * @param rule - Rule definition\n * @returns The same rule (for type-safe chaining)\n *\n * @example\n * ```typescript\n * const noConsole = defineRule({\n *   name: 'custom/no-console',\n *   severity: 'warning',\n *   description: 'Disallow console.log',\n *   category: 'quality',\n *   check: (ctx) => {\n *     const findings: Finding[] = [];\n *     // ... analysis\n *     return findings;\n *   },\n * });\n * ```\n */\nexport function defineRule(rule: Rule): Rule {\n  return rule;\n}\n\n/**\n * Define a custom plugin.\n *\n * @param plugin - Plugin definition\n * @returns The same plugin (for type-safe chaining)\n *\n * @example\n * ```typescript\n * const myPlugin = definePlugin({\n *   name: 'my-plugin',\n *   version: '1.0.0',\n *   install: (kernel) => {\n *     kernel.registerRule(myRule);\n *   },\n * });\n * ```\n */\nexport function definePlugin<TConfig = unknown>(\n  plugin: GuardianPlugin<TConfig>,\n): GuardianPlugin<TConfig> {\n  return plugin;\n}\n\n// Re-export types\nexport type {\n  CodebaseGraph,\n  FileNode,\n  SymbolNode,\n  FunctionNode,\n  ImportEdge,\n  ImportInfo,\n  Finding,\n  Rule,\n  RuleContext,\n  RuleCategory,\n  Severity,\n  GuardianPlugin,\n  GuardianKernel,\n  GuardianConfig,\n  RunOptions,\n  RunResult,\n  RunStats,\n  IncrementalResult,\n  ProjectConfig,\n  SeverityConfig,\n  ASTVisitors,\n} from './types.js';\n"]}