@oxog/codeguardian 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +242 -0
- package/dist/cli.cjs +3498 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +3472 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +3158 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +169 -0
- package/dist/index.d.ts +169 -0
- package/dist/index.js +3130 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/index.cjs +1329 -0
- package/dist/plugins/index.cjs.map +1 -0
- package/dist/plugins/index.d.cts +138 -0
- package/dist/plugins/index.d.ts +138 -0
- package/dist/plugins/index.js +1316 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/types-CQZEdzEa.d.cts +487 -0
- package/dist/types-CQZEdzEa.d.ts +487 -0
- package/package.json +88 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/args.ts","../src/utils/color.ts","../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/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","../src/git/hooks.ts","../src/cli.ts"],"names":["readFileSync","fs","writeFileSync","path","path2","ts","exports","path3","path4","path5","path6","path7","path9"],"mappings":"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","file":"cli.js","sourcesContent":["import type { ParsedArgs } from '../types.js';\n\n/**\n * Parse CLI arguments (zero dependencies — no commander, no yargs).\n *\n * @param argv - Process argv (typically process.argv.slice(2))\n * @returns Parsed command, flags, and positional args\n *\n * @example\n * ```typescript\n * const args = parseArgs(['run', '--staged', '--format', 'json']);\n * // { command: 'run', flags: { staged: true, format: 'json' }, positional: [] }\n * ```\n */\nexport function parseArgs(argv: string[]): ParsedArgs {\n const result: ParsedArgs = {\n command: '',\n flags: {},\n positional: [],\n };\n\n let i = 0;\n\n // First non-flag argument is the command\n while (i < argv.length) {\n const arg = argv[i]!;\n if (!arg.startsWith('-')) {\n result.command = arg;\n i++;\n break;\n }\n i++;\n }\n\n // Parse remaining args\n while (i < argv.length) {\n const arg = argv[i]!;\n\n if (arg.startsWith('--')) {\n const key = arg.slice(2);\n const eqIndex = key.indexOf('=');\n\n if (eqIndex !== -1) {\n // --key=value\n const name = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n if (name) {\n result.flags[name] = value;\n }\n } else {\n // --key or --key value\n const next = argv[i + 1];\n if (next !== undefined && !next.startsWith('-')) {\n result.flags[key] = next;\n i++;\n } else {\n result.flags[key] = true;\n }\n }\n } else if (arg.startsWith('-')) {\n // Short flag: -v, -f value\n const key = arg.slice(1);\n const next = argv[i + 1];\n if (next !== undefined && !next.startsWith('-')) {\n result.flags[key] = next;\n i++;\n } else {\n result.flags[key] = true;\n }\n } else {\n result.positional.push(arg);\n }\n\n i++;\n }\n\n return result;\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","/**\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 // Try common extensions\n if (!resolved.endsWith('.ts') && !resolved.endsWith('.tsx') && !resolved.endsWith('.js')) {\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","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('.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 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', 'get', '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","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { GitError } from '../errors.js';\n\nconst HOOK_CONTENT = `#!/bin/sh\n# codeguardian pre-commit hook\nnpx codeguardian run --staged\n`;\n\n/**\n * Install the codeguardian pre-commit hook.\n *\n * @param rootDir - Project root directory\n * @returns true if hook was installed successfully\n *\n * @example\n * ```typescript\n * installHook('/my-project');\n * // Creates .git/hooks/pre-commit\n * ```\n */\nexport function installHook(rootDir: string): boolean {\n const gitDir = path.join(rootDir, '.git');\n if (!fs.existsSync(gitDir)) {\n throw new GitError('Not a git repository. Run `git init` first.', { rootDir });\n }\n\n const hooksDir = path.join(gitDir, 'hooks');\n if (!fs.existsSync(hooksDir)) {\n fs.mkdirSync(hooksDir, { recursive: true });\n }\n\n const hookPath = path.join(hooksDir, 'pre-commit');\n\n // Check if there's an existing hook that's NOT ours\n if (fs.existsSync(hookPath)) {\n const existing = fs.readFileSync(hookPath, 'utf-8');\n if (!existing.includes('codeguardian')) {\n // Backup existing hook\n const backupPath = path.join(hooksDir, 'pre-commit.backup');\n fs.writeFileSync(backupPath, existing, 'utf-8');\n }\n }\n\n fs.writeFileSync(hookPath, HOOK_CONTENT, { mode: 0o755, encoding: 'utf-8' });\n return true;\n}\n\n/**\n * Uninstall the codeguardian pre-commit hook.\n *\n * @param rootDir - Project root directory\n * @returns true if hook was removed\n *\n * @example\n * ```typescript\n * uninstallHook('/my-project');\n * ```\n */\nexport function uninstallHook(rootDir: string): boolean {\n const hookPath = path.join(rootDir, '.git', 'hooks', 'pre-commit');\n\n if (!fs.existsSync(hookPath)) {\n return false;\n }\n\n const content = fs.readFileSync(hookPath, 'utf-8');\n if (!content.includes('codeguardian')) {\n return false; // Not our hook\n }\n\n // Check for backup\n const backupPath = path.join(rootDir, '.git', 'hooks', 'pre-commit.backup');\n if (fs.existsSync(backupPath)) {\n // Restore backup\n const backup = fs.readFileSync(backupPath, 'utf-8');\n fs.writeFileSync(hookPath, backup, { mode: 0o755, encoding: 'utf-8' });\n fs.unlinkSync(backupPath);\n } else {\n fs.unlinkSync(hookPath);\n }\n\n return true;\n}\n\n/**\n * Check if the codeguardian pre-commit hook is installed.\n *\n * @param rootDir - Project root directory\n * @returns true if our hook is installed\n *\n * @example\n * ```typescript\n * if (isHookInstalled('/my-project')) {\n * console.log('Hook is active');\n * }\n * ```\n */\nexport function isHookInstalled(rootDir: string): boolean {\n const hookPath = path.join(rootDir, '.git', 'hooks', 'pre-commit');\n\n if (!fs.existsSync(hookPath)) {\n return false;\n }\n\n const content = fs.readFileSync(hookPath, 'utf-8');\n return content.includes('codeguardian');\n}\n","#!/usr/bin/env node\n\n/**\n * @oxog/codeguardian CLI entry point.\n *\n * Commands:\n * - init — Initialize codeguardian in a project\n * - run — Run analysis\n * - stats — Show graph statistics\n * - rules — List all rules\n * - conventions — List detected conventions\n * - scan — Rebuild the full graph\n * - uninstall — Remove pre-commit hook\n */\n\nimport { parseArgs } from './utils/args.js';\nimport { color } from './utils/color.js';\nimport { createGuardian } from './index.js';\nimport { installHook, uninstallHook } from './git/hooks.js';\nimport { isGitRepo } from './git/staged.js';\nimport { writeFileSync } from './utils/fs.js';\nimport { getDefaultConfigJSON } from './config/defaults.js';\nimport * as path from 'node:path';\n\nconst VERSION = '1.0.0';\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n\n if (args.flags['version'] || args.flags['v']) {\n console.log(`@oxog/codeguardian v${VERSION}`);\n return;\n }\n\n if (args.flags['help'] || args.flags['h'] || !args.command) {\n printHelp();\n return;\n }\n\n const rootDir = process.cwd();\n\n switch (args.command) {\n case 'init':\n await runInit(rootDir);\n break;\n case 'run':\n await runAnalysis(rootDir, args.flags);\n break;\n case 'stats':\n await runStats(rootDir);\n break;\n case 'rules':\n await runRules(rootDir);\n break;\n case 'conventions':\n await runConventions(rootDir);\n break;\n case 'scan':\n await runScan(rootDir, args.flags);\n break;\n case 'uninstall':\n runUninstall(rootDir);\n break;\n default:\n console.error(color.red(`Unknown command: ${args.command}`));\n printHelp();\n process.exit(1);\n }\n}\n\nfunction printHelp(): void {\n console.log(`\n${color.bold('@oxog/codeguardian')} v${VERSION}\nZero-dependency TypeScript codebase guardian\n\n${color.bold('Usage:')}\n codeguardian <command> [options]\n\n${color.bold('Commands:')}\n init Initialize codeguardian in a project\n run Run analysis on all or staged files\n stats Show codebase graph statistics\n rules List all registered rules\n conventions List detected project conventions\n scan Rebuild the full codebase graph\n uninstall Remove pre-commit hook\n\n${color.bold('Run Options:')}\n --staged Analyze staged files only (pre-commit mode)\n --verbose Include info-level findings\n --format Output format: terminal (default), json, sarif\n --plugin Run specific plugin(s) only\n\n${color.bold('Global Options:')}\n --version, -v Show version\n --help, -h Show help\n`);\n}\n\nasync function runInit(rootDir: string): Promise<void> {\n console.log(color.bold('\\n @oxog/codeguardian — Init\\n'));\n\n // Check git repo\n if (!isGitRepo(rootDir)) {\n console.log(color.yellow(' ⚠ Not a git repository. Pre-commit hook will not be installed.'));\n console.log(color.dim(' Run `git init` first if you want hook integration.\\n'));\n } else {\n // Install hook\n try {\n installHook(rootDir);\n console.log(color.green(' ✓ Pre-commit hook installed'));\n } catch (err) {\n console.log(color.yellow(` ⚠ Could not install hook: ${err instanceof Error ? err.message : String(err)}`));\n }\n }\n\n // Create config file\n const configPath = path.join(rootDir, '.codeguardian.json');\n try {\n writeFileSync(configPath, getDefaultConfigJSON());\n console.log(color.green(' ✓ Configuration file created (.codeguardian.json)'));\n } catch (err) {\n console.log(color.yellow(` ⚠ Could not create config: ${err instanceof Error ? err.message : String(err)}`));\n }\n\n // Run first scan\n try {\n console.log(color.dim(' Scanning project...'));\n const guardian = createGuardian({ rootDir });\n const graph = await guardian.scan();\n console.log(color.green(` ✓ Scanned ${graph.files.size} files, ${graph.symbols.size} symbols`));\n console.log(color.green(' ✓ Graph cached to .codeguardian/graph.json'));\n } catch (err) {\n console.log(color.yellow(` ⚠ Scan failed: ${err instanceof Error ? err.message : String(err)}`));\n console.log(color.dim(' You can try running `codeguardian scan --full` later.'));\n }\n\n console.log(color.bold('\\n Done! codeguardian is ready.\\n'));\n}\n\nasync function runAnalysis(rootDir: string, flags: Record<string, string | boolean>): Promise<void> {\n const staged = flags['staged'] === true;\n const verbose = flags['verbose'] === true;\n const format = (typeof flags['format'] === 'string' ? flags['format'] : 'terminal') as 'terminal' | 'json' | 'sarif';\n const pluginFilter = typeof flags['plugin'] === 'string' ? [flags['plugin']] : undefined;\n\n try {\n const guardian = createGuardian({ rootDir });\n\n const result = await guardian.run({\n staged,\n verbose,\n plugins: pluginFilter,\n format,\n });\n\n const output = guardian.format(result, format, verbose);\n console.log(output);\n\n if (result.blocked) {\n process.exit(1);\n }\n } catch (err) {\n console.error(color.red(`\\n Error: ${err instanceof Error ? err.message : String(err)}\\n`));\n process.exit(1);\n }\n}\n\nasync function runStats(rootDir: string): Promise<void> {\n try {\n const guardian = createGuardian({ rootDir });\n await guardian.scan();\n const stats = guardian.query.getStats();\n\n if (!stats) {\n console.log(color.yellow(' No graph available. Run scan first.'));\n return;\n }\n\n console.log(`\n${color.bold(' @oxog/codeguardian — Stats')}\n\n Files: ${stats.totalFiles}\n Symbols: ${stats.totalSymbols}\n Edges: ${stats.totalEdges}\n Functions: ${stats.totalFunctions}\n Total LOC: ${stats.totalLOC}\n Avg Complexity: ${stats.avgComplexity.toFixed(1)}\n\n ${color.bold('By Role:')}\n${Object.entries(stats.filesByRole).map(([role, count]) => ` ${role}: ${count}`).join('\\n')}\n\n ${color.bold('By Layer:')}\n${Object.entries(stats.filesByLayer).map(([layer, count]) => ` ${layer}: ${count}`).join('\\n')}\n`);\n } catch (err) {\n console.error(color.red(` Error: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\nasync function runRules(rootDir: string): Promise<void> {\n try {\n const guardian = createGuardian({ rootDir });\n const rules = guardian.getRules();\n\n console.log(`\\n${color.bold(' @oxog/codeguardian — Rules')} (${rules.length} total)\\n`);\n\n const byCategory = new Map<string, typeof rules>();\n for (const rule of rules) {\n if (!byCategory.has(rule.category)) {\n byCategory.set(rule.category, []);\n }\n byCategory.get(rule.category)!.push(rule);\n }\n\n for (const [category, categoryRules] of byCategory) {\n console.log(` ${color.bold(category.toUpperCase())}`);\n for (const rule of categoryRules) {\n const sevColor = rule.severity === 'critical' || rule.severity === 'error' ? color.red : rule.severity === 'warning' ? color.yellow : color.dim;\n console.log(` ${sevColor(rule.severity.padEnd(8))} ${rule.name}`);\n console.log(` ${color.dim(rule.description)}`);\n }\n console.log('');\n }\n } catch (err) {\n console.error(color.red(` Error: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\nasync function runConventions(rootDir: string): Promise<void> {\n try {\n const guardian = createGuardian({ rootDir });\n const conventions = await guardian.discover();\n\n console.log(`\\n${color.bold(' @oxog/codeguardian — Conventions')} (${conventions.length} detected)\\n`);\n\n for (const conv of conventions) {\n console.log(` ${color.bold(conv.type)} (${conv.confidence}% confidence)`);\n console.log(` ${conv.description}`);\n if (conv.files.length > 0) {\n console.log(` Files: ${conv.files.slice(0, 3).join(', ')}${conv.files.length > 3 ? ` +${conv.files.length - 3} more` : ''}`);\n }\n console.log('');\n }\n } catch (err) {\n console.error(color.red(` Error: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\nasync function runScan(rootDir: string, flags: Record<string, string | boolean>): Promise<void> {\n const full = flags['full'] === true;\n console.log(color.dim(`\\n ${full ? 'Full' : 'Incremental'} scan...\\n`));\n\n try {\n const guardian = createGuardian({ rootDir });\n const graph = await guardian.scan();\n console.log(color.green(` ✓ Scanned ${graph.files.size} files, ${graph.symbols.size} symbols`));\n console.log(color.green(' ✓ Graph cached to .codeguardian/graph.json\\n'));\n } catch (err) {\n console.error(color.red(` Error: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\nfunction runUninstall(rootDir: string): void {\n try {\n const removed = uninstallHook(rootDir);\n if (removed) {\n console.log(color.green('\\n ✓ Pre-commit hook removed\\n'));\n } else {\n console.log(color.yellow('\\n ⚠ No codeguardian hook found\\n'));\n }\n } catch (err) {\n console.error(color.red(` Error: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(color.red(`Fatal error: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n});\n"]}
|