{"version":3,"sources":["../../src/graph/query.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"],"names":["ts"],"mappings":"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","file":"index.cjs","sourcesContent":["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 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"]}