@kb-labs/review-core 2.25.0 → 2.29.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/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js
CHANGED
|
@@ -1429,7 +1429,7 @@ async function resolveGitScope(options) {
|
|
|
1429
1429
|
try {
|
|
1430
1430
|
const absolutePath = join(gitCwd, filePath);
|
|
1431
1431
|
const content = await readFile(absolutePath, "utf-8");
|
|
1432
|
-
const relativePath = isNestedRepo ? `${repoRelative}/${filePath}` : filePath;
|
|
1432
|
+
const relativePath = isNestedRepo && repoRelative !== "." ? `${repoRelative}/${filePath}` : filePath;
|
|
1433
1433
|
allFiles.push({
|
|
1434
1434
|
path: relativePath,
|
|
1435
1435
|
content
|
|
@@ -1481,6 +1481,18 @@ async function discoverRepos(cwd) {
|
|
|
1481
1481
|
}
|
|
1482
1482
|
async function getReposWithChanges(cwd) {
|
|
1483
1483
|
const allRepos = await discoverRepos(cwd);
|
|
1484
|
+
if (allRepos.length === 0 && existsSync(join(cwd, ".git"))) {
|
|
1485
|
+
try {
|
|
1486
|
+
const git = simpleGit(cwd);
|
|
1487
|
+
const status = await git.status();
|
|
1488
|
+
const hasChanges = status.staged.length > 0 || status.modified.length > 0 || status.deleted.length > 0 || status.not_added.length > 0;
|
|
1489
|
+
if (hasChanges) {
|
|
1490
|
+
return ["."];
|
|
1491
|
+
}
|
|
1492
|
+
} catch {
|
|
1493
|
+
}
|
|
1494
|
+
return [];
|
|
1495
|
+
}
|
|
1484
1496
|
const reposWithChanges = [];
|
|
1485
1497
|
for (const repo of allRepos) {
|
|
1486
1498
|
const repoPath = join(cwd, repo);
|
|
@@ -1508,6 +1520,10 @@ function shouldIgnoreFile(file) {
|
|
|
1508
1520
|
".cache/",
|
|
1509
1521
|
".temp/",
|
|
1510
1522
|
"tmp/",
|
|
1523
|
+
".kb/analytics/",
|
|
1524
|
+
".kb/cache/",
|
|
1525
|
+
".kb/storage/",
|
|
1526
|
+
".kb/database/",
|
|
1511
1527
|
"pnpm-lock.yaml",
|
|
1512
1528
|
"package-lock.json",
|
|
1513
1529
|
"yarn.lock"
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/presets/builtin-presets.ts","../src/presets/preset-loader.ts","../src/diff-provider.ts","../src/findings-cache.ts","../src/orchestrator.ts","../src/git-scope.ts"],"names":["path","useLogger","readFile","join","simpleGit"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/review-core/presets/builtin-presets\n * Built-in preset definitions\n */\n\n/* eslint-disable sonarjs/no-duplicate-string -- Preset definitions intentionally share common patterns (eslint:recommended, node_modules, dist, build) across multiple presets */\n\nimport type { PresetDefinition } from '@kb-labs/review-contracts';\n\n/**\n * Default preset - balanced rules for most projects\n */\nconst defaultPreset: PresetDefinition = {\n id: 'default',\n name: 'Default',\n description: 'Balanced rules for most TypeScript/JavaScript projects',\n\n rules: [\n 'eslint:recommended',\n '@typescript-eslint/recommended',\n ],\n\n excludeRules: [],\n\n engines: {\n eslint: {\n enabled: true,\n config: {\n parser: '@typescript-eslint/parser',\n parserOptions: {\n ecmaVersion: 2022,\n sourceType: 'module',\n },\n plugins: ['@typescript-eslint'],\n rules: {\n // Warnings for common issues\n '@typescript-eslint/no-explicit-any': 'warn',\n '@typescript-eslint/no-unused-vars': ['warn', {\n argsIgnorePattern: '^_',\n varsIgnorePattern: '^_',\n }],\n 'no-console': 'warn',\n 'no-debugger': 'error',\n },\n },\n },\n },\n\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: ['**/node_modules/**', '**/dist/**', '**/build/**'],\n};\n\n/**\n * TypeScript Strict preset - strict type checking and best practices\n */\nconst typescriptStrictPreset: PresetDefinition = {\n id: 'typescript-strict',\n name: 'TypeScript Strict',\n description: 'Strict TypeScript rules with @typescript-eslint/recommended',\n\n rules: [\n 'eslint:recommended',\n '@typescript-eslint/recommended',\n '@typescript-eslint/recommended-requiring-type-checking',\n ],\n\n excludeRules: [],\n\n engines: {\n eslint: {\n enabled: true,\n config: {\n parser: '@typescript-eslint/parser',\n parserOptions: {\n ecmaVersion: 'latest',\n sourceType: 'module',\n project: true,\n },\n extends: [\n 'eslint:recommended',\n 'plugin:@typescript-eslint/recommended',\n 'plugin:@typescript-eslint/recommended-requiring-type-checking',\n ],\n rules: {\n '@typescript-eslint/no-explicit-any': 'error',\n '@typescript-eslint/explicit-function-return-type': 'warn',\n '@typescript-eslint/no-unused-vars': 'error',\n '@typescript-eslint/strict-boolean-expressions': 'warn',\n },\n },\n },\n },\n\n include: ['**/*.ts', '**/*.tsx'],\n exclude: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/*.test.ts', '**/*.spec.ts'],\n\n severity: {\n failOn: 'high',\n },\n};\n\n/**\n * React preset - React-specific rules\n */\nconst reactPreset: PresetDefinition = {\n id: 'react',\n name: 'React',\n description: 'React best practices with hooks rules',\n\n rules: [\n 'eslint:recommended',\n 'plugin:react/recommended',\n 'plugin:react-hooks/recommended',\n ],\n\n excludeRules: [],\n\n engines: {\n eslint: {\n enabled: true,\n config: {\n parserOptions: {\n ecmaVersion: 'latest',\n sourceType: 'module',\n ecmaFeatures: {\n jsx: true,\n },\n },\n extends: [\n 'eslint:recommended',\n 'plugin:react/recommended',\n 'plugin:react-hooks/recommended',\n ],\n settings: {\n react: {\n version: 'detect',\n },\n },\n rules: {\n 'react/react-in-jsx-scope': 'off', // Not needed in React 17+\n 'react-hooks/rules-of-hooks': 'error',\n 'react-hooks/exhaustive-deps': 'warn',\n },\n },\n },\n },\n\n include: ['**/*.tsx', '**/*.jsx'],\n exclude: ['**/node_modules/**', '**/dist/**', '**/build/**'],\n};\n\n/**\n * Security preset - security-focused rules\n */\nconst securityPreset: PresetDefinition = {\n id: 'security',\n name: 'Security',\n description: 'Security-focused rules to detect vulnerabilities',\n\n rules: [\n 'eslint:recommended',\n 'plugin:security/recommended',\n ],\n\n excludeRules: [],\n\n engines: {\n eslint: {\n enabled: true,\n config: {\n extends: [\n 'eslint:recommended',\n 'plugin:security/recommended',\n ],\n rules: {\n 'no-eval': 'error',\n 'no-implied-eval': 'error',\n 'no-new-func': 'error',\n 'security/detect-eval-with-expression': 'error',\n 'security/detect-non-literal-regexp': 'warn',\n 'security/detect-unsafe-regex': 'error',\n },\n },\n },\n },\n\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: ['**/node_modules/**', '**/dist/**', '**/build/**'],\n\n severity: {\n failOn: 'medium',\n },\n};\n\n/**\n * KB Labs preset - comprehensive rules for KB Labs monorepo\n */\nconst kbLabsPreset: PresetDefinition = {\n id: 'kb-labs',\n name: 'KB Labs',\n description: 'Comprehensive architectural and security rules for KB Labs platform',\n\n rules: [\n 'eslint:recommended',\n '@typescript-eslint/recommended',\n ],\n\n excludeRules: [],\n\n engines: {\n eslint: {\n enabled: true,\n config: {\n parser: '@typescript-eslint/parser',\n parserOptions: {\n ecmaVersion: 'latest',\n sourceType: 'module',\n project: true,\n },\n plugins: ['@typescript-eslint', 'security'],\n rules: {\n // Type Safety\n '@typescript-eslint/no-explicit-any': 'error',\n '@typescript-eslint/no-unsafe-assignment': 'warn',\n '@typescript-eslint/no-unsafe-member-access': 'warn',\n '@typescript-eslint/no-unsafe-call': 'warn',\n '@typescript-eslint/no-unsafe-return': 'warn',\n\n // Naming Conventions\n '@typescript-eslint/naming-convention': [\n 'error',\n {\n selector: 'interface',\n format: ['PascalCase'],\n prefix: ['I'],\n },\n {\n selector: 'typeAlias',\n format: ['PascalCase'],\n },\n {\n selector: 'class',\n format: ['PascalCase'],\n },\n {\n selector: 'function',\n format: ['camelCase', 'PascalCase'],\n },\n {\n selector: 'variable',\n format: ['camelCase', 'UPPER_CASE', 'PascalCase'],\n leadingUnderscore: 'allow',\n },\n ],\n\n // Code Quality\n '@typescript-eslint/no-unused-vars': ['error', {\n argsIgnorePattern: '^_',\n varsIgnorePattern: '^_',\n caughtErrors: 'all',\n }],\n '@typescript-eslint/explicit-function-return-type': ['warn', {\n allowExpressions: true,\n allowTypedFunctionExpressions: true,\n allowHigherOrderFunctions: true,\n }],\n '@typescript-eslint/no-floating-promises': 'error',\n '@typescript-eslint/await-thenable': 'error',\n '@typescript-eslint/no-misused-promises': 'error',\n\n // Security\n 'no-eval': 'error',\n 'no-implied-eval': 'error',\n 'no-new-func': 'error',\n 'security/detect-eval-with-expression': 'error',\n 'security/detect-non-literal-regexp': 'warn',\n 'security/detect-unsafe-regex': 'error',\n 'security/detect-buffer-noassert': 'error',\n 'security/detect-child-process': 'warn',\n 'security/detect-disable-mustache-escape': 'error',\n 'security/detect-no-csrf-before-method-override': 'error',\n 'security/detect-non-literal-fs-filename': 'warn',\n 'security/detect-non-literal-require': 'warn',\n 'security/detect-object-injection': 'warn',\n 'security/detect-possible-timing-attacks': 'warn',\n 'security/detect-pseudoRandomBytes': 'error',\n\n // Best Practices\n 'no-console': ['warn', { allow: ['warn', 'error'] }],\n 'no-debugger': 'error',\n 'no-alert': 'error',\n 'prefer-const': 'error',\n 'no-var': 'error',\n 'eqeqeq': ['error', 'always', { null: 'ignore' }],\n },\n },\n },\n },\n\n // LLM Analyzers context\n context: {\n projectType: 'monorepo',\n framework: 'nodejs',\n language: 'typescript',\n conventions: {\n naming: 'Interfaces must be prefixed with I (e.g., ILLM, ICache). Classes use PascalCase. Functions and variables use camelCase.',\n architecture: 'Follow V3 plugin system patterns. Use adapter pattern for external services. Implement proper error handling with typed errors.',\n security: 'Never use eval() or Function(). Validate all external inputs. Use parameterized queries. Sanitize file paths.',\n },\n adrs: [\n 'ADR-0046: LLM Router for tier-based model selection',\n 'ADR-0048: Metadata-based routing with wrapper chain',\n 'ADR-0047: Multi-adapter architecture',\n ],\n },\n\n include: ['**/packages/*/src/**/*.ts', '**/packages/*/src/**/*.tsx'],\n exclude: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/*.test.ts',\n '**/*.spec.ts',\n '**/__tests__/**',\n ],\n\n severity: {\n failOn: 'high',\n },\n};\n\n/**\n * KB Labs Strict preset - maximum strictness for critical packages\n */\nconst kbLabsStrictPreset: PresetDefinition = {\n id: 'kb-labs-strict',\n name: 'KB Labs Strict',\n description: 'Maximum strictness for security-critical packages (core, runtime, plugin-runtime)',\n\n rules: [\n 'eslint:recommended',\n '@typescript-eslint/recommended',\n '@typescript-eslint/recommended-requiring-type-checking',\n ],\n\n excludeRules: [],\n\n engines: {\n eslint: {\n enabled: true,\n config: {\n parser: '@typescript-eslint/parser',\n parserOptions: {\n ecmaVersion: 'latest',\n sourceType: 'module',\n project: true,\n },\n plugins: ['@typescript-eslint', 'security'],\n rules: {\n // Type Safety - STRICT\n '@typescript-eslint/no-explicit-any': 'error',\n '@typescript-eslint/no-unsafe-assignment': 'error',\n '@typescript-eslint/no-unsafe-member-access': 'error',\n '@typescript-eslint/no-unsafe-call': 'error',\n '@typescript-eslint/no-unsafe-return': 'error',\n '@typescript-eslint/explicit-function-return-type': 'error',\n '@typescript-eslint/explicit-module-boundary-types': 'error',\n '@typescript-eslint/strict-boolean-expressions': 'error',\n '@typescript-eslint/no-non-null-assertion': 'error',\n\n // Naming Conventions - STRICT\n '@typescript-eslint/naming-convention': [\n 'error',\n {\n selector: 'interface',\n format: ['PascalCase'],\n prefix: ['I'],\n },\n {\n selector: 'typeAlias',\n format: ['PascalCase'],\n },\n {\n selector: 'class',\n format: ['PascalCase'],\n },\n {\n selector: 'function',\n format: ['camelCase'],\n },\n {\n selector: 'variable',\n format: ['camelCase', 'UPPER_CASE'],\n leadingUnderscore: 'forbid',\n },\n ],\n\n // Code Quality - STRICT\n '@typescript-eslint/no-unused-vars': ['error', {\n argsIgnorePattern: '^_',\n varsIgnorePattern: '^_',\n caughtErrors: 'all',\n ignoreRestSiblings: false,\n }],\n '@typescript-eslint/no-floating-promises': 'error',\n '@typescript-eslint/await-thenable': 'error',\n '@typescript-eslint/no-misused-promises': 'error',\n '@typescript-eslint/require-await': 'error',\n '@typescript-eslint/no-unnecessary-type-assertion': 'error',\n\n // Security - MAXIMUM\n 'no-eval': 'error',\n 'no-implied-eval': 'error',\n 'no-new-func': 'error',\n 'security/detect-eval-with-expression': 'error',\n 'security/detect-non-literal-regexp': 'error',\n 'security/detect-unsafe-regex': 'error',\n 'security/detect-buffer-noassert': 'error',\n 'security/detect-child-process': 'error',\n 'security/detect-disable-mustache-escape': 'error',\n 'security/detect-no-csrf-before-method-override': 'error',\n 'security/detect-non-literal-fs-filename': 'error',\n 'security/detect-non-literal-require': 'error',\n 'security/detect-object-injection': 'error',\n 'security/detect-possible-timing-attacks': 'error',\n 'security/detect-pseudoRandomBytes': 'error',\n\n // Best Practices - STRICT\n 'no-console': 'error',\n 'no-debugger': 'error',\n 'no-alert': 'error',\n 'prefer-const': 'error',\n 'no-var': 'error',\n 'eqeqeq': ['error', 'always'],\n 'no-param-reassign': 'error',\n },\n },\n },\n },\n\n // LLM Analyzers context - STRICT\n context: {\n projectType: 'monorepo',\n framework: 'nodejs',\n language: 'typescript',\n conventions: {\n naming: 'Strict naming: Interfaces MUST have I prefix. NO leading underscores. Constants MUST be UPPER_CASE.',\n architecture: 'V3 plugin system with strict separation of concerns. ALL functions must have explicit return types. NO any types allowed.',\n security: 'Zero tolerance for security issues. ALL inputs must be validated. ALL promises must be awaited or explicitly handled. NO eval/Function/console allowed.',\n },\n adrs: [\n 'ADR-0046: LLM Router',\n 'ADR-0048: Metadata-based routing',\n 'ADR-0047: Multi-adapter architecture',\n 'Security: Sandbox isolation with hardcoded deny patterns',\n 'Security: Permission-based file system access',\n ],\n },\n\n include: [\n '**/packages/core-*/src/**/*.ts',\n '**/packages/plugin-runtime/src/**/*.ts',\n '**/packages/state-*/src/**/*.ts',\n ],\n exclude: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/*.test.ts',\n '**/*.spec.ts',\n '**/__tests__/**',\n ],\n\n severity: {\n failOn: 'medium',\n },\n};\n\n/**\n * All built-in presets\n */\nexport const builtinPresets: PresetDefinition[] = [\n defaultPreset,\n typescriptStrictPreset,\n reactPreset,\n securityPreset,\n kbLabsPreset,\n kbLabsStrictPreset,\n];\n","/**\n * @module @kb-labs/review-core/presets/preset-loader\n * Preset loading and resolution logic\n */\n\nimport type { PresetDefinition, ReviewConfig } from '@kb-labs/review-contracts';\nimport { builtinPresets } from './builtin-presets.js';\nimport { useConfig, useLogger } from '@kb-labs/sdk';\n\n/**\n * Deep merge two objects\n */\n \nfunction deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\n const result = { ...target } as T;\n\n for (const key in source) {\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (sourceValue === undefined) {\n continue;\n }\n\n if (\n typeof sourceValue === 'object' &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === 'object' &&\n targetValue !== null &&\n !Array.isArray(targetValue)\n ) {\n // Deep merge objects\n result[key] = deepMerge(targetValue, sourceValue) as T[Extract<keyof T, string>];\n } else if (Array.isArray(sourceValue) && Array.isArray(targetValue)) {\n // Concatenate arrays (no duplicates)\n result[key] = [...new Set([...targetValue, ...sourceValue])] as T[Extract<keyof T, string>];\n } else {\n // Override primitives and non-matching types\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n\n return result;\n}\n\n/**\n * Preset loader\n * Resolves presets from builtin definitions and kb.config.json\n */\nexport class PresetLoader {\n private presets: Map<string, PresetDefinition>;\n private configLoaded: boolean = false;\n\n constructor() {\n this.presets = new Map();\n this.loadBuiltinPresets();\n }\n\n /**\n * Load builtin presets\n */\n private loadBuiltinPresets(): void {\n for (const preset of builtinPresets) {\n this.presets.set(preset.id, preset);\n }\n }\n\n /**\n * Resolve preset inheritance (extends) with cycle detection\n */\n private resolveInheritance(preset: PresetDefinition, visited: Set<string> = new Set()): PresetDefinition {\n if (!preset.extends) {\n return preset;\n }\n\n // Cycle detection: check if we've seen this preset before\n if (visited.has(preset.id)) {\n const chain = Array.from(visited).join(' -> ') + ' -> ' + preset.id;\n throw new Error(\n `Circular inheritance detected in presets: ${chain}`\n );\n }\n\n // Add current preset to visited set\n visited.add(preset.id);\n\n // Find parent preset\n const parent = this.presets.get(preset.extends);\n\n if (!parent) {\n throw new Error(\n `Preset '${preset.id}' extends '${preset.extends}', but parent preset not found`\n );\n }\n\n // Recursively resolve parent (in case parent also extends)\n const resolvedParent = this.resolveInheritance(parent, visited);\n\n // Merge parent into child (child overrides parent)\n const merged = deepMerge(resolvedParent, preset);\n\n // Remove extends field from final preset\n delete merged.extends;\n\n return merged;\n }\n\n /**\n * Load custom presets from kb.config.json and preset files\n * Called lazily on first preset access\n */\n private async loadConfigPresets(): Promise<void> {\n if (this.configLoaded) {\n return;\n }\n\n try {\n // 1. Load presets from kb.config.json\n const config = await useConfig<ReviewConfig>();\n\n if (config?.presets) {\n // Load presets from file paths or inline definitions\n for (const presetOrPath of config.presets) {\n if (typeof presetOrPath === 'string') {\n // It's a file path - load preset from file\n \n await this.loadPresetFromFile(presetOrPath);\n } else {\n // It's an inline preset definition\n this.presets.set(presetOrPath.id, presetOrPath);\n }\n }\n }\n\n // 2. Auto-scan .kb/ai-review/presets/ directory\n await this.scanPresetsDirectory();\n\n this.configLoaded = true;\n } catch {\n // Silently fail if config not available\n this.configLoaded = true;\n }\n }\n\n /**\n * Auto-scan .kb/ai-review/presets/ directory for preset files\n */\n private async scanPresetsDirectory(): Promise<void> {\n try {\n const fs = await import('fs/promises');\n const pathModule = await import('path');\n\n const presetsDir = pathModule.join(process.cwd(), '.kb', 'ai-review', 'presets');\n\n // Check if directory exists\n try {\n await fs.access(presetsDir);\n } catch {\n // Directory doesn't exist, skip\n return;\n }\n\n // Read all JSON files\n const entries = await fs.readdir(presetsDir, { withFileTypes: true });\n const jsonFiles = entries.filter(e => e.isFile() && e.name.endsWith('.json'));\n\n for (const file of jsonFiles) {\n // Path traversal protection\n if (file.name.includes('..') || file.name.includes(pathModule.sep)) {\n continue;\n }\n\n const filePath = pathModule.join(presetsDir, file.name);\n\n try {\n \n const content = await fs.readFile(filePath, 'utf-8');\n const preset = JSON.parse(content) as PresetDefinition;\n\n if (preset.id) {\n this.presets.set(preset.id, preset);\n }\n } catch {\n // Skip invalid files\n }\n }\n } catch {\n // Directory scan failed, continue without custom presets\n }\n }\n\n /**\n * Load preset from JSON file\n */\n private async loadPresetFromFile(relativePath: string): Promise<void> {\n try {\n // Resolve path relative to .kb/ directory\n const fs = await import('fs/promises');\n const path = await import('path');\n\n const configDir = path.join(process.cwd(), '.kb');\n const presetPath = path.join(configDir, relativePath);\n\n const content = await fs.readFile(presetPath, 'utf-8');\n const preset = JSON.parse(content) as PresetDefinition;\n\n this.presets.set(preset.id, preset);\n } catch (error) {\n useLogger()?.debug(`[PresetLoader] Failed to load preset from ${relativePath}:`, { error });\n }\n }\n\n /**\n * Load atomic rule from .md file\n */\n private async loadAtomicRule(category: string, ruleName: string): Promise<string | undefined> {\n try {\n const fs = await import('fs/promises');\n const path = await import('path');\n\n const configDir = path.join(process.cwd(), '.kb');\n const rulePath = path.join(configDir, 'ai-review', 'rules', category, `${ruleName}.md`);\n\n const content = await fs.readFile(rulePath, 'utf-8');\n return content.trim();\n } catch (error) {\n useLogger()?.debug(`[PresetLoader] Failed to load atomic rule ${category}/${ruleName}:`, { error });\n return undefined;\n }\n }\n\n /**\n * Compose atomic rules into convention text\n */\n private async composeRules(\n category: string,\n include?: string[],\n exclude?: string[]\n ): Promise<string> {\n if (!include || include.length === 0) {\n return '';\n }\n\n const rules: string[] = [];\n\n for (const ruleName of include) {\n // Skip if excluded\n if (exclude?.includes(ruleName)) {\n continue;\n }\n\n \n const ruleContent = await this.loadAtomicRule(category, ruleName);\n if (ruleContent) {\n rules.push(ruleContent);\n }\n }\n\n // Join with double newline separator\n return rules.join('\\n\\n');\n }\n\n /**\n * Apply atomic rules composition to preset\n * Supports dynamic categories - any category name defined in atomicRules\n */\n private async applyAtomicRules(preset: PresetDefinition): Promise<PresetDefinition> {\n if (!preset.atomicRules) {\n return preset;\n }\n\n // Ensure context.conventions exists\n if (!preset.context) {\n preset.context = {};\n }\n if (!preset.context.conventions) {\n preset.context.conventions = {};\n }\n\n // Iterate over all categories defined in atomicRules\n // This allows users to create custom categories without modifying code\n for (const category in preset.atomicRules) {\n const ruleConfig = preset.atomicRules[category];\n if (!ruleConfig) {\n continue;\n }\n\n \n const composedRules = await this.composeRules(\n category,\n ruleConfig.include,\n ruleConfig.exclude\n );\n\n if (composedRules) {\n // Append to existing conventions (or replace)\n const existingConventions = preset.context.conventions[category] || '';\n\n // If atomic rules exist, they take priority over inline conventions\n // But we can append inline conventions at the end\n if (existingConventions) {\n preset.context.conventions[category] = `${composedRules}\\n\\n${existingConventions}`;\n } else {\n preset.context.conventions[category] = composedRules;\n }\n }\n }\n\n return preset;\n }\n\n /**\n * Get preset by ID (with inheritance resolved)\n */\n async getPreset(id: string): Promise<PresetDefinition | undefined> {\n await this.loadConfigPresets();\n const preset = this.presets.get(id);\n\n if (!preset) {\n return undefined;\n }\n\n // Resolve inheritance\n const resolved = this.resolveInheritance(preset);\n\n // Apply atomic rules composition\n return this.applyAtomicRules(resolved);\n }\n\n /**\n * Get preset by ID or throw error\n */\n async getPresetOrThrow(id: string): Promise<PresetDefinition> {\n const preset = await this.getPreset(id);\n if (!preset) {\n const available = Array.from(this.presets.keys()).join(', ');\n throw new Error(\n `Preset not found: \"${id}\"\\n` +\n `Available presets: ${available}`\n );\n }\n return preset;\n }\n\n /**\n * List all available presets\n */\n async listPresets(): Promise<PresetDefinition[]> {\n await this.loadConfigPresets();\n return Array.from(this.presets.values());\n }\n\n /**\n * Register custom preset\n */\n registerPreset(preset: PresetDefinition): void {\n this.presets.set(preset.id, preset);\n }\n}\n\n/**\n * Global preset loader instance\n */\nlet globalLoader: PresetLoader | undefined;\n\n/**\n * Get global preset loader\n */\nexport function getPresetLoader(): PresetLoader {\n if (!globalLoader) {\n globalLoader = new PresetLoader();\n }\n return globalLoader;\n}\n\n/**\n * Load preset by ID\n */\nexport async function loadPreset(id: string): Promise<PresetDefinition> {\n return getPresetLoader().getPresetOrThrow(id);\n}\n","/**\n * @module @kb-labs/review-core/diff-provider\n * Git diff fetching and parsing for LLM-lite review mode.\n *\n * Provides diff-based context instead of full file content.\n */\n\nimport { simpleGit, type SimpleGit } from 'simple-git';\nimport type {\n IDiffProvider,\n DiffHunk,\n FileDiff,\n BatchDiffRequest,\n BatchDiffResult,\n} from '@kb-labs/review-contracts';\nimport * as path from 'node:path';\nimport { useLogger } from '@kb-labs/sdk';\n\n// Re-export types from contracts for backward compatibility\nexport type { DiffHunk, FileDiff, BatchDiffRequest, BatchDiffResult, IDiffProvider };\n\n/**\n * DiffProvider - fetches and parses git diffs\n */\nexport class DiffProvider implements IDiffProvider {\n private git: SimpleGit;\n private cwd: string;\n\n constructor(cwd: string) {\n // Validate cwd to prevent path traversal and ensure it's absolute\n if (!cwd || typeof cwd !== 'string') {\n throw new Error('DiffProvider: cwd must be a non-empty string');\n }\n\n // Resolve to absolute path and validate\n const resolvedCwd = path.resolve(cwd);\n\n // Ensure cwd doesn't contain path traversal sequences\n if (cwd.includes('..') && resolvedCwd !== path.resolve(process.cwd(), cwd)) {\n useLogger()?.debug('[DiffProvider] Potential path traversal detected in cwd:', { cwd, resolvedCwd });\n }\n\n this.cwd = resolvedCwd;\n this.git = simpleGit(resolvedCwd);\n }\n\n /**\n * Get diffs for multiple files in one call (batch operation)\n */\n async getDiffs(request: BatchDiffRequest): Promise<BatchDiffResult> {\n const { files, staged = true, unstaged = true, maxLinesPerFile = 500 } = request;\n\n const diffs: FileDiff[] = [];\n const errors: Array<{ file: string; error: string }> = [];\n let totalLines = 0;\n\n // Process files in parallel (but limit concurrency)\n const BATCH_SIZE = 10;\n for (let i = 0; i < files.length; i += BATCH_SIZE) {\n const batch = files.slice(i, i + BATCH_SIZE);\n \n const results = await Promise.allSettled(\n batch.map(file => this.getFileDiff(file, staged, unstaged, maxLinesPerFile))\n );\n\n for (let j = 0; j < results.length; j++) {\n const result = results[j]!;\n const file = batch[j]!;\n\n if (result.status === 'fulfilled' && result.value) {\n diffs.push(result.value);\n totalLines += result.value.diff.split('\\n').length;\n } else if (result.status === 'rejected') {\n errors.push({ file, error: (result as PromiseRejectedResult).reason?.message ?? 'Unknown error' });\n }\n }\n }\n\n return { diffs, errors, totalLines };\n }\n\n /**\n * Get diff for a single file\n */\n async getFileDiff(\n file: string,\n staged: boolean = true,\n unstaged: boolean = true,\n maxLines: number = 500\n ): Promise<FileDiff | null> {\n try {\n let diff = '';\n\n // Get staged diff\n if (staged) {\n const stagedDiff = await this.git.diff(['--cached', '--', file]);\n if (stagedDiff) {\n diff = stagedDiff;\n }\n }\n\n // Get unstaged diff (if not already have staged)\n if (unstaged && !diff) {\n const unstagedDiff = await this.git.diff(['--', file]);\n if (unstagedDiff) {\n diff = unstagedDiff;\n }\n }\n\n // If still no diff, try against HEAD for new files\n if (!diff) {\n try {\n const headDiff = await this.git.diff(['HEAD', '--', file]);\n if (headDiff) {\n diff = headDiff;\n }\n } catch {\n // File might be untracked - generate \"new file\" diff\n // This is a simplification - in practice we'd read the file\n return null;\n }\n }\n\n if (!diff) {\n return null;\n }\n\n // Truncate large diffs\n const lines = diff.split('\\n');\n if (lines.length > maxLines) {\n diff = lines.slice(0, maxLines).join('\\n') + `\\n... (truncated, ${lines.length - maxLines} more lines)`;\n }\n\n // Parse the diff\n return this.parseDiff(file, diff);\n } catch (error) {\n useLogger()?.debug(`[DiffProvider] Error getting diff for ${file}:`, { error });\n return null;\n }\n }\n\n /**\n * Parse unified diff into structured format\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Diff parsing logic: detects file modes (new/deleted/renamed), parses hunks, tracks line numbers, counts additions/deletions\n private parseDiff(file: string, diff: string): FileDiff {\n const hunks: DiffHunk[] = [];\n const changedLines = new Set<number>();\n\n let additions = 0;\n let deletions = 0;\n let isNewFile = false;\n let isDeleted = false;\n let isRenamed = false;\n\n // Check for special cases\n if (diff.includes('new file mode')) {\n isNewFile = true;\n }\n if (diff.includes('deleted file mode')) {\n isDeleted = true;\n }\n if (diff.includes('rename from') || diff.includes('rename to')) {\n isRenamed = true;\n }\n\n // Parse hunks\n\n const lines = diff.split('\\n');\n let currentHunkStart = -1;\n let currentHunk: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n\n // Check for hunk header\n const hunkMatch = line.match(/^@@\\s+-(\\d+)(?:,(\\d+))?\\s+\\+(\\d+)(?:,(\\d+))?\\s+@@/);\n if (hunkMatch) {\n // Save previous hunk if exists\n if (currentHunkStart >= 0 && currentHunk.length > 0) {\n const parsed = this.parseHunkContent(currentHunk, currentHunkStart);\n hunks.push(parsed);\n parsed.addedLines.forEach(l => changedLines.add(l));\n }\n\n // Start new hunk\n currentHunkStart = parseInt(hunkMatch[3]!, 10);\n currentHunk = [line];\n } else if (currentHunkStart >= 0) {\n currentHunk.push(line);\n }\n\n // Count additions/deletions\n if (line.startsWith('+') && !line.startsWith('+++')) {\n additions++;\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n deletions++;\n }\n }\n\n // Don't forget last hunk\n if (currentHunkStart >= 0 && currentHunk.length > 0) {\n const parsed = this.parseHunkContent(currentHunk, currentHunkStart);\n hunks.push(parsed);\n parsed.addedLines.forEach(l => changedLines.add(l));\n }\n\n return {\n file,\n diff,\n additions,\n deletions,\n isNewFile,\n isDeleted,\n isRenamed,\n hunks,\n changedLines,\n };\n }\n\n /**\n * Parse hunk content to extract line numbers\n */\n private parseHunkContent(lines: string[], newStart: number): DiffHunk {\n const addedLines: number[] = [];\n const deletedLines: number[] = [];\n\n // Parse header\n const header = lines[0]!;\n const headerMatch = header.match(/^@@\\s+-(\\d+)(?:,(\\d+))?\\s+\\+(\\d+)(?:,(\\d+))?\\s+@@/);\n\n const oldStart = headerMatch ? parseInt(headerMatch[1]!, 10) : 0;\n const oldLines = headerMatch && headerMatch[2] ? parseInt(headerMatch[2], 10) : 1;\n const newLines = headerMatch && headerMatch[4] ? parseInt(headerMatch[4], 10) : 1;\n\n // Track line numbers\n let newLineNum = newStart;\n let oldLineNum = oldStart;\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i]!;\n\n if (line.startsWith('+') && !line.startsWith('+++')) {\n addedLines.push(newLineNum);\n newLineNum++;\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n deletedLines.push(oldLineNum);\n oldLineNum++;\n } else if (line.startsWith(' ') || line === '') {\n // Context line\n newLineNum++;\n oldLineNum++;\n }\n }\n\n return {\n newStart,\n newLines,\n oldStart,\n oldLines,\n content: lines.join('\\n'),\n addedLines,\n deletedLines,\n };\n }\n\n /**\n * Check if a line number is in the diff (was changed)\n */\n isLineInDiff(fileDiff: FileDiff, lineNumber: number): boolean {\n return fileDiff.changedLines.has(lineNumber);\n }\n\n /**\n * Get context around a specific line (for verification)\n */\n async getLineContext(\n file: string,\n lineNumber: number,\n contextLines: number = 3\n ): Promise<{ lines: string[]; startLine: number } | null> {\n try {\n const fullPath = path.join(this.cwd, file);\n const { readFile } = await import('node:fs/promises');\n const content = await readFile(fullPath, 'utf-8');\n const lines = content.split('\\n');\n\n const start = Math.max(0, lineNumber - contextLines - 1);\n const end = Math.min(lines.length, lineNumber + contextLines);\n\n return {\n lines: lines.slice(start, end),\n startLine: start + 1,\n };\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Create a DiffProvider instance\n */\nexport function createDiffProvider(cwd: string): DiffProvider {\n return new DiffProvider(cwd);\n}\n","/**\n * @module @kb-labs/review-core/findings-cache\n * Cache for LLM review findings based on file content hash.\n *\n * Enables incremental review:\n * - Skip unchanged files (return cached findings)\n * - Track \"known issues\" vs \"new issues\" for changed files\n */\n\nimport { createHash } from 'node:crypto';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport type { ReviewFinding, InputFile } from '@kb-labs/review-contracts';\n\n/**\n * Cached finding with file hash\n */\nexport interface CachedFinding extends ReviewFinding {\n /** Hash of file content when finding was created */\n contentHash: string;\n /** Timestamp when finding was cached */\n cachedAt: number;\n}\n\n/**\n * Cache entry for a single file\n */\nexport interface FileCacheEntry {\n /** File path */\n path: string;\n /** Content hash */\n contentHash: string;\n /** Findings for this file */\n findings: CachedFinding[];\n /** When this entry was created */\n createdAt: number;\n /** When this entry was last accessed */\n lastAccessedAt: number;\n}\n\n/**\n * Full cache structure\n */\nexport interface FindingsCacheData {\n /** Version for cache format migrations */\n version: number;\n /** Cache entries by file path */\n entries: Record<string, FileCacheEntry>;\n /** Cache metadata */\n metadata: {\n createdAt: number;\n lastUpdatedAt: number;\n totalFindings: number;\n totalFiles: number;\n };\n}\n\n/**\n * Result of cache lookup\n */\nexport interface CacheLookupResult {\n /** Files that have valid cache (unchanged) */\n cached: {\n file: InputFile;\n findings: ReviewFinding[];\n }[];\n /** Files that need fresh analysis (changed or not cached) */\n uncached: InputFile[];\n /** Statistics */\n stats: {\n cachedFiles: number;\n uncachedFiles: number;\n cachedFindings: number;\n };\n}\n\n/**\n * Result of incremental comparison\n */\nexport interface IncrementalResult {\n /** New findings (not seen before) */\n newFindings: ReviewFinding[];\n /** Known findings (seen in previous review) */\n knownFindings: ReviewFinding[];\n /** Findings from unchanged (cached) files */\n cachedFindings: ReviewFinding[];\n /** Statistics */\n stats: {\n new: number;\n known: number;\n cached: number;\n total: number;\n };\n}\n\nconst CACHE_VERSION = 1;\nconst CACHE_FILENAME = 'llm-findings-cache.json';\n\n/**\n * Generate content hash for a file.\n *\n * Uses SHA-256 for cryptographic strength, truncated to 16 hex chars (64 bits).\n * This provides sufficient collision resistance for cache invalidation while\n * keeping cache keys reasonably short.\n *\n * @param content - File content to hash\n * @returns 16-character hex string (first 64 bits of SHA-256)\n */\nexport function hashFileContent(content: string): string {\n return createHash('sha256').update(content).digest('hex').slice(0, 16);\n}\n\n/**\n * Generate finding signature for deduplication\n * Two findings are \"same\" if they have same file, line range, and category\n */\nexport function findingSignature(finding: ReviewFinding): string {\n return `${finding.file}:${finding.line}:${finding.endLine ?? finding.line}:${finding.type}`;\n}\n\n/**\n * Findings cache manager\n */\nexport class FindingsCache {\n private cwd: string;\n private cachePath: string;\n private data: FindingsCacheData | null = null;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n this.cachePath = join(cwd, '.kb', 'ai-review', 'cache', CACHE_FILENAME);\n }\n\n /**\n * Load cache from disk\n */\n async load(): Promise<void> {\n try {\n const content = await readFile(this.cachePath, 'utf-8');\n const parsed = JSON.parse(content) as FindingsCacheData;\n\n // Version check\n if (parsed.version !== CACHE_VERSION) {\n // Cache format changed, start fresh\n this.data = this.createEmptyCache();\n return;\n }\n\n this.data = parsed;\n } catch {\n // No cache or invalid, start fresh\n this.data = this.createEmptyCache();\n }\n }\n\n /**\n * Save cache to disk\n */\n async save(): Promise<void> {\n if (!this.data) {\n return;\n }\n\n this.data.metadata.lastUpdatedAt = Date.now();\n\n // Ensure directory exists\n await mkdir(dirname(this.cachePath), { recursive: true });\n\n await writeFile(this.cachePath, JSON.stringify(this.data, null, 2));\n }\n\n /**\n * Look up files in cache\n * Returns which files can use cached findings vs need fresh analysis\n */\n lookup(files: InputFile[]): CacheLookupResult {\n if (!this.data) {\n return {\n cached: [],\n uncached: files,\n stats: { cachedFiles: 0, uncachedFiles: files.length, cachedFindings: 0 },\n };\n }\n\n const cached: CacheLookupResult['cached'] = [];\n const uncached: InputFile[] = [];\n let cachedFindings = 0;\n\n for (const file of files) {\n const hash = hashFileContent(file.content);\n const entry = this.data.entries[file.path];\n\n if (entry && entry.contentHash === hash) {\n // File unchanged, use cached findings\n cached.push({\n file,\n findings: entry.findings.map(f => this.stripCacheFields(f)),\n });\n cachedFindings += entry.findings.length;\n\n // Update last accessed\n entry.lastAccessedAt = Date.now();\n } else {\n // File changed or not cached\n uncached.push(file);\n }\n }\n\n return {\n cached,\n uncached,\n stats: {\n cachedFiles: cached.length,\n uncachedFiles: uncached.length,\n cachedFindings,\n },\n };\n }\n\n /**\n * Update cache with new findings\n */\n update(files: InputFile[], findings: ReviewFinding[]): void {\n if (!this.data) {\n this.data = this.createEmptyCache();\n }\n\n // Group findings by file\n const findingsByFile = new Map<string, ReviewFinding[]>();\n for (const finding of findings) {\n const existing = findingsByFile.get(finding.file) ?? [];\n existing.push(finding);\n findingsByFile.set(finding.file, existing);\n }\n\n // Update cache entries\n for (const file of files) {\n const hash = hashFileContent(file.content);\n const fileFindings = findingsByFile.get(file.path) ?? [];\n\n const cachedFindings: CachedFinding[] = fileFindings.map(f => ({\n ...f,\n contentHash: hash,\n cachedAt: Date.now(),\n }));\n\n this.data.entries[file.path] = {\n path: file.path,\n contentHash: hash,\n findings: cachedFindings,\n createdAt: Date.now(),\n lastAccessedAt: Date.now(),\n };\n }\n\n // Update metadata\n this.data.metadata.totalFiles = Object.keys(this.data.entries).length;\n this.data.metadata.totalFindings = Object.values(this.data.entries)\n .reduce((sum, entry) => sum + entry.findings.length, 0);\n }\n\n /**\n * Compare new findings with cached to find new vs known issues\n */\n compareIncremental(\n newFindings: ReviewFinding[],\n cachedFindings: ReviewFinding[]\n ): IncrementalResult {\n // Build set of known finding signatures\n const knownSignatures = new Set<string>();\n\n // Add signatures from cache\n if (this.data) {\n for (const entry of Object.values(this.data.entries)) {\n for (const finding of entry.findings) {\n knownSignatures.add(findingSignature(finding));\n }\n }\n }\n\n // Separate new vs known\n const newIssues: ReviewFinding[] = [];\n const knownIssues: ReviewFinding[] = [];\n\n for (const finding of newFindings) {\n const sig = findingSignature(finding);\n if (knownSignatures.has(sig)) {\n knownIssues.push(finding);\n } else {\n newIssues.push(finding);\n }\n }\n\n return {\n newFindings: newIssues,\n knownFindings: knownIssues,\n cachedFindings,\n stats: {\n new: newIssues.length,\n known: knownIssues.length,\n cached: cachedFindings.length,\n total: newIssues.length + knownIssues.length + cachedFindings.length,\n },\n };\n }\n\n /**\n * Clear cache for specific files or all\n */\n clear(files?: string[]): void {\n if (!this.data) {\n return;\n }\n\n if (files) {\n for (const file of files) {\n delete this.data.entries[file];\n }\n } else {\n this.data = this.createEmptyCache();\n }\n }\n\n /**\n * Get cache statistics\n */\n getStats(): { totalFiles: number; totalFindings: number; cacheAge: number } {\n if (!this.data) {\n return { totalFiles: 0, totalFindings: 0, cacheAge: 0 };\n }\n return {\n totalFiles: this.data.metadata.totalFiles,\n totalFindings: this.data.metadata.totalFindings,\n cacheAge: Date.now() - this.data.metadata.createdAt,\n };\n }\n\n private createEmptyCache(): FindingsCacheData {\n return {\n version: CACHE_VERSION,\n entries: {},\n metadata: {\n createdAt: Date.now(),\n lastUpdatedAt: Date.now(),\n totalFindings: 0,\n totalFiles: 0,\n },\n };\n }\n\n private stripCacheFields(finding: CachedFinding): ReviewFinding {\n const { contentHash: _contentHash, cachedAt: _cachedAt, ...rest } = finding;\n return rest;\n }\n}\n\n/**\n * Create findings cache instance\n */\nexport function createFindingsCache(cwd: string): FindingsCache {\n return new FindingsCache(cwd);\n}\n","/**\n * @module @kb-labs/review-core/orchestrator\n * Main orchestrator for code review operations.\n *\n * Coordinates heuristic engines, LLM analysis, caching, and deduplication.\n */\n\nimport type {\n ReviewRequest,\n ReviewResult,\n ReviewFinding,\n PresetDefinition,\n IncrementalMetadata,\n} from '@kb-labs/review-contracts';\nimport { LinterRunner, deduplicateFindings } from '@kb-labs/review-heuristic';\nimport { runLLMLiteAnalysis, type LLMLiteResult } from '@kb-labs/review-llm';\nimport { useLLM, useAnalytics, useLogger } from '@kb-labs/sdk';\nimport { loadPreset } from './presets/index.js';\nimport { createDiffProvider } from './diff-provider.js';\nimport {\n createFindingsCache,\n type CacheLookupResult,\n type IncrementalResult,\n} from './findings-cache.js';\n\n/**\n * Internal context for tracking review state within a single review() call.\n *\n * ## Thread-Safety Design\n *\n * This context is passed through function parameters instead of being stored\n * as instance variables on ReviewOrchestrator. This ensures thread-safety:\n *\n * - Each `review()` call creates its own ReviewRunContext\n * - Multiple concurrent `review()` calls don't share state\n * - No race conditions between parallel reviews\n *\n * This pattern allows a single ReviewOrchestrator instance to safely handle\n * multiple concurrent review requests (e.g., in a server environment).\n *\n * @internal\n */\ninterface ReviewRunContext {\n /** LLM-Lite result (if run) */\n llmLiteResult?: LLMLiteResult;\n /** Incremental analysis result */\n incrementalResult?: IncrementalResult;\n /** Cache lookup result */\n cacheLookup?: CacheLookupResult;\n}\n\n/**\n * Review orchestrator.\n *\n * Main entry point for running code reviews.\n * Thread-safe: all state is passed through parameters, not instance variables.\n */\nexport class ReviewOrchestrator {\n /**\n * Run code review.\n *\n * @param request - Review request\n * @returns Review result with findings\n */\n async review(request: ReviewRequest): Promise<ReviewResult> {\n const startTime = Date.now();\n\n // Load preset\n const preset = await loadPreset(request.presetId);\n\n // Track analytics\n const analytics = useAnalytics();\n analytics?.track('review:started', {\n mode: request.mode,\n repoScope: request.repoScope,\n presetId: request.presetId,\n });\n\n // Create run context (thread-safe: local to this call)\n const runCtx: ReviewRunContext = {};\n\n try {\n // Run analysis based on mode\n const findings = await this.runAnalysis(request, preset, runCtx);\n\n // Build result\n const analyzedFiles = await this.countFiles(request, preset);\n\n // Base metadata\n const metadata: ReviewResult['metadata'] = {\n preset: request.presetId,\n mode: request.mode,\n filesReviewed: analyzedFiles,\n analyzedFiles: analyzedFiles,\n heuristicFindings: findings.filter((f) => f.source === 'heuristic').length,\n llmFindings: findings.filter((f) => f.source !== 'heuristic').length,\n totalFindings: findings.length,\n durationMs: Date.now() - startTime,\n engines: this.getEnginesUsed(findings),\n };\n\n // Add LLM-Lite specific metadata if available\n if (runCtx.llmLiteResult) {\n const llmMeta = runCtx.llmLiteResult.metadata;\n Object.assign(metadata, {\n llmLite: {\n llmCalls: llmMeta.llmCalls,\n toolCalls: llmMeta.toolCalls,\n tokens: llmMeta.tokens,\n estimatedCost: llmMeta.estimatedCost,\n verification: llmMeta.verification,\n timing: llmMeta.timing,\n },\n });\n }\n\n // Add incremental review metadata if available\n if (runCtx.incrementalResult || runCtx.cacheLookup) {\n const incr = runCtx.incrementalResult;\n const cache = runCtx.cacheLookup;\n\n const incrementalMeta: IncrementalMetadata = {\n cachedFiles: cache?.stats.cachedFiles ?? 0,\n analyzedFiles: cache?.stats.uncachedFiles ?? analyzedFiles,\n newFindings: incr?.stats.new ?? findings.length,\n knownFindings: incr?.stats.known ?? 0,\n cachedFindings: incr?.stats.cached ?? 0,\n };\n\n Object.assign(metadata, { incremental: incrementalMeta });\n }\n\n const result: ReviewResult = {\n findings,\n summary: {\n total: findings.length,\n bySeverity: {\n error: findings.filter((f) => f.severity === 'blocker' || f.severity === 'high').length,\n warning: findings.filter((f) => f.severity === 'medium').length,\n info: findings.filter((f) => f.severity === 'low' || f.severity === 'info').length,\n },\n byType: this.groupByType(findings),\n },\n metadata,\n };\n\n // Track success\n analytics?.track('review:completed', {\n mode: request.mode,\n findingsCount: findings.length,\n duration: result.metadata.durationMs,\n });\n\n return result;\n } catch (error) {\n // Track error\n analytics?.track('review:failed', {\n mode: request.mode,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n }\n\n /**\n * Run analysis based on review mode.\n */\n private async runAnalysis(\n request: ReviewRequest,\n preset: PresetDefinition,\n runCtx: ReviewRunContext\n ): Promise<ReviewFinding[]> {\n const mode = request.mode ?? 'heuristic';\n\n switch (mode) {\n case 'heuristic':\n return this.runHeuristicAnalysis(request, preset);\n\n case 'full':\n return this.runFullAnalysis(request, preset, runCtx);\n\n case 'llm':\n return this.runLLMAnalysis(request, preset, runCtx);\n\n default:\n throw new Error(`Unknown review mode: ${mode}`);\n }\n }\n\n /**\n * Run heuristic-only analysis (CI mode).\n *\n * Fast, deterministic analysis using linters via CLI.\n * No LLM calls.\n */\n private async runHeuristicAnalysis(\n request: ReviewRequest,\n _preset: PresetDefinition\n ): Promise<ReviewFinding[]> {\n // Get file paths\n const files = request.files?.map(f => f.path) ?? [];\n if (files.length === 0) {\n return [];\n }\n\n // Run all applicable linters via CLI\n const runner = new LinterRunner();\n const results = await runner.runAll(files);\n\n // Log any errors\n const logger = useLogger();\n for (const result of results) {\n if (result.error) {\n logger?.warn(`[${result.engineId}] ${result.error}`);\n }\n }\n\n // Collect and deduplicate findings\n const findings = LinterRunner.collectFindings(results);\n return deduplicateFindings(findings);\n }\n\n /**\n * Run full analysis (heuristic + LLM-Lite).\n *\n * Runs heuristic analysis (ESLint, etc.) and LLM-Lite in parallel.\n * Combines deterministic linting with intelligent code review.\n * Both use caching for incremental analysis.\n */\n private async runFullAnalysis(\n request: ReviewRequest,\n preset: PresetDefinition,\n runCtx: ReviewRunContext\n ): Promise<ReviewFinding[]> {\n // Run heuristic and LLM-Lite in parallel for speed\n const llm = useLLM({ tier: 'medium' });\n\n const [heuristicFindings, llmFindings] = await Promise.all([\n // Heuristic analysis (ESLint, etc.)\n this.runHeuristicAnalysis(request, preset),\n // LLM-Lite analysis with caching (if LLM available and files provided)\n llm && request.files?.length\n ? this.runLLMAnalysis(request, preset, runCtx)\n : Promise.resolve([]),\n ]);\n\n // Combine and deduplicate (ESLint and LLM may find same issues)\n return deduplicateFindings([...heuristicFindings, ...llmFindings]);\n }\n\n /**\n * Run LLM-Lite analysis (v2) with incremental caching.\n *\n * Uses batch tools, diff-based context, and anti-hallucination verification.\n * Caches findings by file content hash to skip unchanged files.\n */\n private async runLLMAnalysis(\n request: ReviewRequest,\n _preset: PresetDefinition,\n runCtx: ReviewRunContext\n ): Promise<ReviewFinding[]> {\n if (!request.files || request.files.length === 0) {\n return [];\n }\n\n const cwd = request.cwd ?? process.cwd();\n\n // Initialize findings cache\n const findingsCache = createFindingsCache(cwd);\n await findingsCache.load();\n\n // Check cache - skip unchanged files\n const cacheLookup = findingsCache.lookup(request.files);\n runCtx.cacheLookup = cacheLookup;\n\n // Collect cached findings\n const cachedFindings: ReviewFinding[] = [];\n for (const cached of cacheLookup.cached) {\n cachedFindings.push(...cached.findings);\n }\n\n // If all files are cached, return early\n if (cacheLookup.uncached.length === 0) {\n // All files unchanged - use cache\n runCtx.incrementalResult = {\n newFindings: [],\n knownFindings: [],\n cachedFindings,\n stats: {\n new: 0,\n known: 0,\n cached: cachedFindings.length,\n total: cachedFindings.length,\n },\n };\n return cachedFindings;\n }\n\n // Create DiffProvider for this analysis\n const diffProvider = createDiffProvider(cwd);\n\n // Run LLM-Lite analysis only on uncached (changed) files\n const result: LLMLiteResult = await runLLMLiteAnalysis({\n cwd,\n files: cacheLookup.uncached,\n taskContext: request.taskContext,\n repoScope: request.repoScope,\n diffProvider,\n });\n\n // Store LLM-Lite metadata for later (will be merged into result)\n runCtx.llmLiteResult = result;\n\n // Compare with known issues (incremental)\n const incrementalResult = findingsCache.compareIncremental(\n result.findings,\n cachedFindings\n );\n runCtx.incrementalResult = incrementalResult;\n\n // Update cache with new findings\n findingsCache.update(cacheLookup.uncached, result.findings);\n await findingsCache.save();\n\n // Return all findings (new + known + cached)\n const allFindings = [\n ...incrementalResult.newFindings,\n ...incrementalResult.knownFindings,\n ...incrementalResult.cachedFindings,\n ];\n\n return deduplicateFindings(allFindings);\n }\n\n /**\n * Resolve file patterns to absolute paths.\n *\n * Note: Files must be provided in request.files.\n * Pattern resolution should happen at CLI layer using ctx.runtime.fs.glob()\n */\n private async resolvePatterns(request: ReviewRequest, _preset: PresetDefinition): Promise<string[]> {\n // Files must be provided by caller (CLI layer handles glob resolution)\n if (!request.files || request.files.length === 0) {\n throw new Error('No files provided for review. Use ctx.runtime.fs.glob() at CLI layer to resolve patterns.');\n }\n\n return request.files.map((f) => f.path);\n }\n\n /**\n * Count files to be analyzed.\n */\n private async countFiles(request: ReviewRequest, preset: PresetDefinition): Promise<number> {\n const files = await this.resolvePatterns(request, preset);\n return files.length;\n }\n\n /**\n * Get list of engines that produced findings.\n */\n private getEnginesUsed(findings: ReviewFinding[]): string[] {\n const engines = new Set(findings.map((f) => f.engine));\n return [...engines];\n }\n\n /**\n * Group findings by type.\n */\n private groupByType(findings: ReviewFinding[]): Record<string, number> {\n const groups: Record<string, number> = {};\n for (const finding of findings) {\n const type = finding.type;\n groups[type] = (groups[type] ?? 0) + 1;\n }\n return groups;\n }\n\n /**\n * Generate cache key for heuristic analysis.\n */\n private generateCacheKey(engine: string, request: ReviewRequest): string {\n // TODO: Include file content hashes for more precise caching\n const filePaths = request.files ? request.files.map((f) => f.path).sort().join(',') : 'default';\n\n // Normalize repoScope (may come as string from CLI in some edge cases)\n const repoScopeKey = request.repoScope\n ? (Array.isArray(request.repoScope) ? request.repoScope.join(',') : String(request.repoScope))\n : 'default';\n\n const parts = [\n 'review',\n engine,\n repoScopeKey,\n request.presetId ?? 'default',\n filePaths,\n ];\n\n return parts.join(':');\n }\n\n}\n\n/**\n * Quick helper to run code review.\n */\nexport async function runReview(request: ReviewRequest): Promise<ReviewResult> {\n const orchestrator = new ReviewOrchestrator();\n return orchestrator.review(request);\n}\n","/**\n * @module @kb-labs/review-core/git-scope\n * Git scope resolver for diff-based reviews.\n *\n * Supports nested git repositories (submodules) common in monorepos.\n */\n\nimport { existsSync, readdirSync, statSync, readFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { simpleGit, type SimpleGit, type StatusResult } from 'simple-git';\nimport type { InputFile } from '@kb-labs/review-contracts';\nimport { useLogger } from '@kb-labs/sdk';\n\n/**\n * Parse .gitmodules to get all known submodule paths.\n * Returns a map of: repo name → relative path from workspace root.\n * e.g. \"kb-labs-core\" → \"platform/kb-labs-core\"\n */\nfunction parseGitmodules(cwd: string): Map<string, string> {\n const result = new Map<string, string>();\n const gitmodulesPath = join(cwd, '.gitmodules');\n if (!existsSync(gitmodulesPath)) {return result;}\n\n try {\n const content = readFileSync(gitmodulesPath, 'utf-8');\n const pathMatches = content.matchAll(/^\\s*path\\s*=\\s*(.+)$/gm);\n for (const match of pathMatches) {\n const relPath = (match[1] ?? '').trim();\n if (!relPath) {continue;}\n const name = relPath.split('/').pop() ?? relPath;\n result.set(name, relPath);\n }\n } catch {\n // ignore parse errors\n }\n return result;\n}\n\n/**\n * Resolve a repo name to its actual path.\n * Supports both flat layout (kb-labs-core) and nested layout (platform/kb-labs-core).\n * Uses .gitmodules for discovery — no hardcoded category dirs.\n */\nfunction resolveRepoPath(cwd: string, repo: string, submodules: Map<string, string>): string | null {\n // 1. Already a nested/direct path\n const direct = join(cwd, repo);\n if (existsSync(direct)) {return direct;}\n\n // 2. Look up in .gitmodules\n const relPath = submodules.get(repo);\n if (relPath) {\n const full = join(cwd, relPath);\n if (existsSync(full)) {return full;}\n }\n\n return null;\n}\n\n/**\n * Get the relative path of a repo from cwd (e.g. \"platform/kb-labs-core\").\n * Uses .gitmodules for discovery — no hardcoded category dirs.\n */\nfunction resolveRepoRelative(cwd: string, repo: string, submodules: Map<string, string>): string | null {\n // Already a valid path\n if (existsSync(join(cwd, repo))) {return repo;}\n\n // Look up in .gitmodules\n const relPath = submodules.get(repo);\n if (relPath && existsSync(join(cwd, relPath))) {return relPath;}\n\n return null;\n}\n\nexport interface GitScopeOptions {\n /** Working directory (root of monorepo) */\n cwd: string;\n /** Repository names to include (e.g., ['kb-labs-core', 'kb-labs-cli']) */\n repos: string[];\n /** Include staged files */\n includeStaged?: boolean;\n /** Include unstaged files */\n includeUnstaged?: boolean;\n /** Include untracked files */\n includeUntracked?: boolean;\n}\n\nexport interface ScopedFiles {\n /** Files with content ready for review */\n files: InputFile[];\n /** Summary of what was found */\n summary: {\n repos: string[];\n staged: number;\n unstaged: number;\n untracked: number;\n total: number;\n };\n}\n\n/**\n * Resolve git scope to list of changed files.\n *\n * For each repo in scope:\n * 1. Detect if it's a nested git repo (has .git)\n * 2. Get git status from that repo\n * 3. Read file contents\n * 4. Return as InputFile[] with paths relative to root\n */\n// eslint-disable-next-line sonarjs/cognitive-complexity -- Git scope resolution: iterates repos, checks nested git, parses status, filters by include flags (staged/unstaged/untracked), reads files, tracks counts\nexport async function resolveGitScope(options: GitScopeOptions): Promise<ScopedFiles> {\n const {\n cwd,\n repos,\n includeStaged = true,\n includeUnstaged = true,\n includeUntracked = false,\n } = options;\n\n const allFiles: InputFile[] = [];\n let stagedCount = 0;\n let unstagedCount = 0;\n let untrackedCount = 0;\n\n const submodules = parseGitmodules(cwd);\n\n for (const repo of repos) {\n const repoPath = resolveRepoPath(cwd, repo, submodules);\n const repoRelative = resolveRepoRelative(cwd, repo, submodules) ?? repo;\n\n // Check if repo exists and has .git\n if (!repoPath) {\n useLogger()?.debug(`[git-scope] Repo not found: ${repo}`);\n continue;\n }\n\n const gitPath = join(repoPath, '.git');\n const isNestedRepo = existsSync(gitPath);\n const gitCwd = isNestedRepo ? repoPath : cwd;\n\n try {\n const git: SimpleGit = simpleGit(gitCwd);\n \n const status: StatusResult = await git.status();\n\n // Collect file paths based on options\n const filePaths: string[] = [];\n\n if (includeStaged) {\n // Exclude deleted files from staged (can't read them)\n const stagedNotDeleted = status.staged.filter((f) => !status.deleted.includes(f));\n stagedCount += stagedNotDeleted.length;\n filePaths.push(...stagedNotDeleted);\n }\n\n if (includeUnstaged) {\n // Only include modified files, not deleted (can't read deleted files)\n const unstaged = status.modified\n .filter((f) => !status.staged.includes(f));\n unstagedCount += unstaged.length;\n filePaths.push(...unstaged);\n }\n\n if (includeUntracked) {\n untrackedCount += status.not_added.length;\n filePaths.push(...status.not_added);\n }\n\n // Dedupe and filter\n const uniquePaths = [...new Set(filePaths)]\n .filter((f) => !shouldIgnoreFile(f))\n .filter((f) => isReviewableFile(f));\n\n // Read file contents\n for (const filePath of uniquePaths) {\n try {\n const absolutePath = join(gitCwd, filePath);\n \n const content = await readFile(absolutePath, 'utf-8');\n\n // Path relative to root cwd\n const relativePath = isNestedRepo\n ? `${repoRelative}/${filePath}`\n : filePath;\n\n allFiles.push({\n path: relativePath,\n content,\n });\n } catch {\n useLogger()?.debug(`[git-scope] Could not read file: ${filePath}`);\n }\n }\n } catch (error) {\n useLogger()?.debug(`[git-scope] Git error in ${repo}:`, { error });\n }\n }\n\n return {\n files: allFiles,\n summary: {\n repos,\n staged: stagedCount,\n unstaged: unstagedCount,\n untracked: untrackedCount,\n total: allFiles.length,\n },\n };\n}\n\n/**\n * Detect all submodules/nested repos in cwd.\n * Reads paths from .gitmodules — no hardcoded category directories.\n * Returns relative paths as they appear in .gitmodules (e.g. \"platform/kb-labs-core\").\n */\nexport async function discoverRepos(cwd: string): Promise<string[]> {\n const submodules = parseGitmodules(cwd);\n\n if (submodules.size > 0) {\n // Filter to only those that actually exist on disk\n return [...submodules.values()].filter((relPath) =>\n existsSync(join(cwd, relPath, '.git'))\n );\n }\n\n // Fallback: scan top-level dirs for .git (flat layout)\n const repos: string[] = [];\n try {\n const entries = readdirSync(cwd);\n for (const entry of entries) {\n if (entry.startsWith('.') || entry === 'node_modules') {continue;}\n try {\n const entryPath = join(cwd, entry);\n if (statSync(entryPath).isDirectory() && existsSync(join(entryPath, '.git'))) {\n repos.push(entry);\n }\n } catch {\n // skip\n }\n }\n } catch {\n // return empty\n }\n return repos;\n}\n\n/**\n * Get all repos with uncommitted changes\n */\nexport async function getReposWithChanges(cwd: string): Promise<string[]> {\n const allRepos = await discoverRepos(cwd);\n const reposWithChanges: string[] = [];\n\n for (const repo of allRepos) {\n const repoPath = join(cwd, repo);\n\n try {\n const git: SimpleGit = simpleGit(repoPath);\n \n const status: StatusResult = await git.status();\n\n const hasChanges =\n status.staged.length > 0 ||\n status.modified.length > 0 ||\n status.deleted.length > 0 ||\n status.not_added.length > 0;\n\n if (hasChanges) {\n reposWithChanges.push(repo);\n }\n } catch {\n // Skip repos with git errors\n }\n }\n\n return reposWithChanges;\n}\n\n/**\n * Files to ignore\n */\nfunction shouldIgnoreFile(file: string): boolean {\n const ignoredPaths = [\n 'node_modules/',\n '.git/',\n 'dist/',\n 'build/',\n '.next/',\n '.turbo/',\n 'coverage/',\n '.cache/',\n '.temp/',\n 'tmp/',\n 'pnpm-lock.yaml',\n 'package-lock.json',\n 'yarn.lock',\n ];\n\n return ignoredPaths.some((path) => file.includes(path));\n}\n\n/**\n * Only review code files\n */\nfunction isReviewableFile(file: string): boolean {\n const reviewableExtensions = [\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.py',\n '.go',\n '.rs',\n '.java',\n '.kt',\n '.swift',\n '.rb',\n '.php',\n '.c',\n '.cpp',\n '.h',\n '.hpp',\n '.cs',\n ];\n\n return reviewableExtensions.some((ext) => file.endsWith(ext));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/presets/builtin-presets.ts","../src/presets/preset-loader.ts","../src/diff-provider.ts","../src/findings-cache.ts","../src/orchestrator.ts","../src/git-scope.ts"],"names":["path","useLogger","readFile","join","simpleGit"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/review-core/presets/builtin-presets\n * Built-in preset definitions\n */\n\n/* eslint-disable sonarjs/no-duplicate-string -- Preset definitions intentionally share common patterns (eslint:recommended, node_modules, dist, build) across multiple presets */\n\nimport type { PresetDefinition } from '@kb-labs/review-contracts';\n\n/**\n * Default preset - balanced rules for most projects\n */\nconst defaultPreset: PresetDefinition = {\n id: 'default',\n name: 'Default',\n description: 'Balanced rules for most TypeScript/JavaScript projects',\n\n rules: [\n 'eslint:recommended',\n '@typescript-eslint/recommended',\n ],\n\n excludeRules: [],\n\n engines: {\n eslint: {\n enabled: true,\n config: {\n parser: '@typescript-eslint/parser',\n parserOptions: {\n ecmaVersion: 2022,\n sourceType: 'module',\n },\n plugins: ['@typescript-eslint'],\n rules: {\n // Warnings for common issues\n '@typescript-eslint/no-explicit-any': 'warn',\n '@typescript-eslint/no-unused-vars': ['warn', {\n argsIgnorePattern: '^_',\n varsIgnorePattern: '^_',\n }],\n 'no-console': 'warn',\n 'no-debugger': 'error',\n },\n },\n },\n },\n\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: ['**/node_modules/**', '**/dist/**', '**/build/**'],\n};\n\n/**\n * TypeScript Strict preset - strict type checking and best practices\n */\nconst typescriptStrictPreset: PresetDefinition = {\n id: 'typescript-strict',\n name: 'TypeScript Strict',\n description: 'Strict TypeScript rules with @typescript-eslint/recommended',\n\n rules: [\n 'eslint:recommended',\n '@typescript-eslint/recommended',\n '@typescript-eslint/recommended-requiring-type-checking',\n ],\n\n excludeRules: [],\n\n engines: {\n eslint: {\n enabled: true,\n config: {\n parser: '@typescript-eslint/parser',\n parserOptions: {\n ecmaVersion: 'latest',\n sourceType: 'module',\n project: true,\n },\n extends: [\n 'eslint:recommended',\n 'plugin:@typescript-eslint/recommended',\n 'plugin:@typescript-eslint/recommended-requiring-type-checking',\n ],\n rules: {\n '@typescript-eslint/no-explicit-any': 'error',\n '@typescript-eslint/explicit-function-return-type': 'warn',\n '@typescript-eslint/no-unused-vars': 'error',\n '@typescript-eslint/strict-boolean-expressions': 'warn',\n },\n },\n },\n },\n\n include: ['**/*.ts', '**/*.tsx'],\n exclude: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/*.test.ts', '**/*.spec.ts'],\n\n severity: {\n failOn: 'high',\n },\n};\n\n/**\n * React preset - React-specific rules\n */\nconst reactPreset: PresetDefinition = {\n id: 'react',\n name: 'React',\n description: 'React best practices with hooks rules',\n\n rules: [\n 'eslint:recommended',\n 'plugin:react/recommended',\n 'plugin:react-hooks/recommended',\n ],\n\n excludeRules: [],\n\n engines: {\n eslint: {\n enabled: true,\n config: {\n parserOptions: {\n ecmaVersion: 'latest',\n sourceType: 'module',\n ecmaFeatures: {\n jsx: true,\n },\n },\n extends: [\n 'eslint:recommended',\n 'plugin:react/recommended',\n 'plugin:react-hooks/recommended',\n ],\n settings: {\n react: {\n version: 'detect',\n },\n },\n rules: {\n 'react/react-in-jsx-scope': 'off', // Not needed in React 17+\n 'react-hooks/rules-of-hooks': 'error',\n 'react-hooks/exhaustive-deps': 'warn',\n },\n },\n },\n },\n\n include: ['**/*.tsx', '**/*.jsx'],\n exclude: ['**/node_modules/**', '**/dist/**', '**/build/**'],\n};\n\n/**\n * Security preset - security-focused rules\n */\nconst securityPreset: PresetDefinition = {\n id: 'security',\n name: 'Security',\n description: 'Security-focused rules to detect vulnerabilities',\n\n rules: [\n 'eslint:recommended',\n 'plugin:security/recommended',\n ],\n\n excludeRules: [],\n\n engines: {\n eslint: {\n enabled: true,\n config: {\n extends: [\n 'eslint:recommended',\n 'plugin:security/recommended',\n ],\n rules: {\n 'no-eval': 'error',\n 'no-implied-eval': 'error',\n 'no-new-func': 'error',\n 'security/detect-eval-with-expression': 'error',\n 'security/detect-non-literal-regexp': 'warn',\n 'security/detect-unsafe-regex': 'error',\n },\n },\n },\n },\n\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: ['**/node_modules/**', '**/dist/**', '**/build/**'],\n\n severity: {\n failOn: 'medium',\n },\n};\n\n/**\n * KB Labs preset - comprehensive rules for KB Labs monorepo\n */\nconst kbLabsPreset: PresetDefinition = {\n id: 'kb-labs',\n name: 'KB Labs',\n description: 'Comprehensive architectural and security rules for KB Labs platform',\n\n rules: [\n 'eslint:recommended',\n '@typescript-eslint/recommended',\n ],\n\n excludeRules: [],\n\n engines: {\n eslint: {\n enabled: true,\n config: {\n parser: '@typescript-eslint/parser',\n parserOptions: {\n ecmaVersion: 'latest',\n sourceType: 'module',\n project: true,\n },\n plugins: ['@typescript-eslint', 'security'],\n rules: {\n // Type Safety\n '@typescript-eslint/no-explicit-any': 'error',\n '@typescript-eslint/no-unsafe-assignment': 'warn',\n '@typescript-eslint/no-unsafe-member-access': 'warn',\n '@typescript-eslint/no-unsafe-call': 'warn',\n '@typescript-eslint/no-unsafe-return': 'warn',\n\n // Naming Conventions\n '@typescript-eslint/naming-convention': [\n 'error',\n {\n selector: 'interface',\n format: ['PascalCase'],\n prefix: ['I'],\n },\n {\n selector: 'typeAlias',\n format: ['PascalCase'],\n },\n {\n selector: 'class',\n format: ['PascalCase'],\n },\n {\n selector: 'function',\n format: ['camelCase', 'PascalCase'],\n },\n {\n selector: 'variable',\n format: ['camelCase', 'UPPER_CASE', 'PascalCase'],\n leadingUnderscore: 'allow',\n },\n ],\n\n // Code Quality\n '@typescript-eslint/no-unused-vars': ['error', {\n argsIgnorePattern: '^_',\n varsIgnorePattern: '^_',\n caughtErrors: 'all',\n }],\n '@typescript-eslint/explicit-function-return-type': ['warn', {\n allowExpressions: true,\n allowTypedFunctionExpressions: true,\n allowHigherOrderFunctions: true,\n }],\n '@typescript-eslint/no-floating-promises': 'error',\n '@typescript-eslint/await-thenable': 'error',\n '@typescript-eslint/no-misused-promises': 'error',\n\n // Security\n 'no-eval': 'error',\n 'no-implied-eval': 'error',\n 'no-new-func': 'error',\n 'security/detect-eval-with-expression': 'error',\n 'security/detect-non-literal-regexp': 'warn',\n 'security/detect-unsafe-regex': 'error',\n 'security/detect-buffer-noassert': 'error',\n 'security/detect-child-process': 'warn',\n 'security/detect-disable-mustache-escape': 'error',\n 'security/detect-no-csrf-before-method-override': 'error',\n 'security/detect-non-literal-fs-filename': 'warn',\n 'security/detect-non-literal-require': 'warn',\n 'security/detect-object-injection': 'warn',\n 'security/detect-possible-timing-attacks': 'warn',\n 'security/detect-pseudoRandomBytes': 'error',\n\n // Best Practices\n 'no-console': ['warn', { allow: ['warn', 'error'] }],\n 'no-debugger': 'error',\n 'no-alert': 'error',\n 'prefer-const': 'error',\n 'no-var': 'error',\n 'eqeqeq': ['error', 'always', { null: 'ignore' }],\n },\n },\n },\n },\n\n // LLM Analyzers context\n context: {\n projectType: 'monorepo',\n framework: 'nodejs',\n language: 'typescript',\n conventions: {\n naming: 'Interfaces must be prefixed with I (e.g., ILLM, ICache). Classes use PascalCase. Functions and variables use camelCase.',\n architecture: 'Follow V3 plugin system patterns. Use adapter pattern for external services. Implement proper error handling with typed errors.',\n security: 'Never use eval() or Function(). Validate all external inputs. Use parameterized queries. Sanitize file paths.',\n },\n adrs: [\n 'ADR-0046: LLM Router for tier-based model selection',\n 'ADR-0048: Metadata-based routing with wrapper chain',\n 'ADR-0047: Multi-adapter architecture',\n ],\n },\n\n include: ['**/packages/*/src/**/*.ts', '**/packages/*/src/**/*.tsx'],\n exclude: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/*.test.ts',\n '**/*.spec.ts',\n '**/__tests__/**',\n ],\n\n severity: {\n failOn: 'high',\n },\n};\n\n/**\n * KB Labs Strict preset - maximum strictness for critical packages\n */\nconst kbLabsStrictPreset: PresetDefinition = {\n id: 'kb-labs-strict',\n name: 'KB Labs Strict',\n description: 'Maximum strictness for security-critical packages (core, runtime, plugin-runtime)',\n\n rules: [\n 'eslint:recommended',\n '@typescript-eslint/recommended',\n '@typescript-eslint/recommended-requiring-type-checking',\n ],\n\n excludeRules: [],\n\n engines: {\n eslint: {\n enabled: true,\n config: {\n parser: '@typescript-eslint/parser',\n parserOptions: {\n ecmaVersion: 'latest',\n sourceType: 'module',\n project: true,\n },\n plugins: ['@typescript-eslint', 'security'],\n rules: {\n // Type Safety - STRICT\n '@typescript-eslint/no-explicit-any': 'error',\n '@typescript-eslint/no-unsafe-assignment': 'error',\n '@typescript-eslint/no-unsafe-member-access': 'error',\n '@typescript-eslint/no-unsafe-call': 'error',\n '@typescript-eslint/no-unsafe-return': 'error',\n '@typescript-eslint/explicit-function-return-type': 'error',\n '@typescript-eslint/explicit-module-boundary-types': 'error',\n '@typescript-eslint/strict-boolean-expressions': 'error',\n '@typescript-eslint/no-non-null-assertion': 'error',\n\n // Naming Conventions - STRICT\n '@typescript-eslint/naming-convention': [\n 'error',\n {\n selector: 'interface',\n format: ['PascalCase'],\n prefix: ['I'],\n },\n {\n selector: 'typeAlias',\n format: ['PascalCase'],\n },\n {\n selector: 'class',\n format: ['PascalCase'],\n },\n {\n selector: 'function',\n format: ['camelCase'],\n },\n {\n selector: 'variable',\n format: ['camelCase', 'UPPER_CASE'],\n leadingUnderscore: 'forbid',\n },\n ],\n\n // Code Quality - STRICT\n '@typescript-eslint/no-unused-vars': ['error', {\n argsIgnorePattern: '^_',\n varsIgnorePattern: '^_',\n caughtErrors: 'all',\n ignoreRestSiblings: false,\n }],\n '@typescript-eslint/no-floating-promises': 'error',\n '@typescript-eslint/await-thenable': 'error',\n '@typescript-eslint/no-misused-promises': 'error',\n '@typescript-eslint/require-await': 'error',\n '@typescript-eslint/no-unnecessary-type-assertion': 'error',\n\n // Security - MAXIMUM\n 'no-eval': 'error',\n 'no-implied-eval': 'error',\n 'no-new-func': 'error',\n 'security/detect-eval-with-expression': 'error',\n 'security/detect-non-literal-regexp': 'error',\n 'security/detect-unsafe-regex': 'error',\n 'security/detect-buffer-noassert': 'error',\n 'security/detect-child-process': 'error',\n 'security/detect-disable-mustache-escape': 'error',\n 'security/detect-no-csrf-before-method-override': 'error',\n 'security/detect-non-literal-fs-filename': 'error',\n 'security/detect-non-literal-require': 'error',\n 'security/detect-object-injection': 'error',\n 'security/detect-possible-timing-attacks': 'error',\n 'security/detect-pseudoRandomBytes': 'error',\n\n // Best Practices - STRICT\n 'no-console': 'error',\n 'no-debugger': 'error',\n 'no-alert': 'error',\n 'prefer-const': 'error',\n 'no-var': 'error',\n 'eqeqeq': ['error', 'always'],\n 'no-param-reassign': 'error',\n },\n },\n },\n },\n\n // LLM Analyzers context - STRICT\n context: {\n projectType: 'monorepo',\n framework: 'nodejs',\n language: 'typescript',\n conventions: {\n naming: 'Strict naming: Interfaces MUST have I prefix. NO leading underscores. Constants MUST be UPPER_CASE.',\n architecture: 'V3 plugin system with strict separation of concerns. ALL functions must have explicit return types. NO any types allowed.',\n security: 'Zero tolerance for security issues. ALL inputs must be validated. ALL promises must be awaited or explicitly handled. NO eval/Function/console allowed.',\n },\n adrs: [\n 'ADR-0046: LLM Router',\n 'ADR-0048: Metadata-based routing',\n 'ADR-0047: Multi-adapter architecture',\n 'Security: Sandbox isolation with hardcoded deny patterns',\n 'Security: Permission-based file system access',\n ],\n },\n\n include: [\n '**/packages/core-*/src/**/*.ts',\n '**/packages/plugin-runtime/src/**/*.ts',\n '**/packages/state-*/src/**/*.ts',\n ],\n exclude: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/*.test.ts',\n '**/*.spec.ts',\n '**/__tests__/**',\n ],\n\n severity: {\n failOn: 'medium',\n },\n};\n\n/**\n * All built-in presets\n */\nexport const builtinPresets: PresetDefinition[] = [\n defaultPreset,\n typescriptStrictPreset,\n reactPreset,\n securityPreset,\n kbLabsPreset,\n kbLabsStrictPreset,\n];\n","/**\n * @module @kb-labs/review-core/presets/preset-loader\n * Preset loading and resolution logic\n */\n\nimport type { PresetDefinition, ReviewConfig } from '@kb-labs/review-contracts';\nimport { builtinPresets } from './builtin-presets.js';\nimport { useConfig, useLogger } from '@kb-labs/sdk';\n\n/**\n * Deep merge two objects\n */\n \nfunction deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\n const result = { ...target } as T;\n\n for (const key in source) {\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (sourceValue === undefined) {\n continue;\n }\n\n if (\n typeof sourceValue === 'object' &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === 'object' &&\n targetValue !== null &&\n !Array.isArray(targetValue)\n ) {\n // Deep merge objects\n result[key] = deepMerge(targetValue, sourceValue) as T[Extract<keyof T, string>];\n } else if (Array.isArray(sourceValue) && Array.isArray(targetValue)) {\n // Concatenate arrays (no duplicates)\n result[key] = [...new Set([...targetValue, ...sourceValue])] as T[Extract<keyof T, string>];\n } else {\n // Override primitives and non-matching types\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n\n return result;\n}\n\n/**\n * Preset loader\n * Resolves presets from builtin definitions and kb.config.json\n */\nexport class PresetLoader {\n private presets: Map<string, PresetDefinition>;\n private configLoaded: boolean = false;\n\n constructor() {\n this.presets = new Map();\n this.loadBuiltinPresets();\n }\n\n /**\n * Load builtin presets\n */\n private loadBuiltinPresets(): void {\n for (const preset of builtinPresets) {\n this.presets.set(preset.id, preset);\n }\n }\n\n /**\n * Resolve preset inheritance (extends) with cycle detection\n */\n private resolveInheritance(preset: PresetDefinition, visited: Set<string> = new Set()): PresetDefinition {\n if (!preset.extends) {\n return preset;\n }\n\n // Cycle detection: check if we've seen this preset before\n if (visited.has(preset.id)) {\n const chain = Array.from(visited).join(' -> ') + ' -> ' + preset.id;\n throw new Error(\n `Circular inheritance detected in presets: ${chain}`\n );\n }\n\n // Add current preset to visited set\n visited.add(preset.id);\n\n // Find parent preset\n const parent = this.presets.get(preset.extends);\n\n if (!parent) {\n throw new Error(\n `Preset '${preset.id}' extends '${preset.extends}', but parent preset not found`\n );\n }\n\n // Recursively resolve parent (in case parent also extends)\n const resolvedParent = this.resolveInheritance(parent, visited);\n\n // Merge parent into child (child overrides parent)\n const merged = deepMerge(resolvedParent, preset);\n\n // Remove extends field from final preset\n delete merged.extends;\n\n return merged;\n }\n\n /**\n * Load custom presets from kb.config.json and preset files\n * Called lazily on first preset access\n */\n private async loadConfigPresets(): Promise<void> {\n if (this.configLoaded) {\n return;\n }\n\n try {\n // 1. Load presets from kb.config.json\n const config = await useConfig<ReviewConfig>();\n\n if (config?.presets) {\n // Load presets from file paths or inline definitions\n for (const presetOrPath of config.presets) {\n if (typeof presetOrPath === 'string') {\n // It's a file path - load preset from file\n \n await this.loadPresetFromFile(presetOrPath);\n } else {\n // It's an inline preset definition\n this.presets.set(presetOrPath.id, presetOrPath);\n }\n }\n }\n\n // 2. Auto-scan .kb/ai-review/presets/ directory\n await this.scanPresetsDirectory();\n\n this.configLoaded = true;\n } catch {\n // Silently fail if config not available\n this.configLoaded = true;\n }\n }\n\n /**\n * Auto-scan .kb/ai-review/presets/ directory for preset files\n */\n private async scanPresetsDirectory(): Promise<void> {\n try {\n const fs = await import('fs/promises');\n const pathModule = await import('path');\n\n const presetsDir = pathModule.join(process.cwd(), '.kb', 'ai-review', 'presets');\n\n // Check if directory exists\n try {\n await fs.access(presetsDir);\n } catch {\n // Directory doesn't exist, skip\n return;\n }\n\n // Read all JSON files\n const entries = await fs.readdir(presetsDir, { withFileTypes: true });\n const jsonFiles = entries.filter(e => e.isFile() && e.name.endsWith('.json'));\n\n for (const file of jsonFiles) {\n // Path traversal protection\n if (file.name.includes('..') || file.name.includes(pathModule.sep)) {\n continue;\n }\n\n const filePath = pathModule.join(presetsDir, file.name);\n\n try {\n \n const content = await fs.readFile(filePath, 'utf-8');\n const preset = JSON.parse(content) as PresetDefinition;\n\n if (preset.id) {\n this.presets.set(preset.id, preset);\n }\n } catch {\n // Skip invalid files\n }\n }\n } catch {\n // Directory scan failed, continue without custom presets\n }\n }\n\n /**\n * Load preset from JSON file\n */\n private async loadPresetFromFile(relativePath: string): Promise<void> {\n try {\n // Resolve path relative to .kb/ directory\n const fs = await import('fs/promises');\n const path = await import('path');\n\n const configDir = path.join(process.cwd(), '.kb');\n const presetPath = path.join(configDir, relativePath);\n\n const content = await fs.readFile(presetPath, 'utf-8');\n const preset = JSON.parse(content) as PresetDefinition;\n\n this.presets.set(preset.id, preset);\n } catch (error) {\n useLogger()?.debug(`[PresetLoader] Failed to load preset from ${relativePath}:`, { error });\n }\n }\n\n /**\n * Load atomic rule from .md file\n */\n private async loadAtomicRule(category: string, ruleName: string): Promise<string | undefined> {\n try {\n const fs = await import('fs/promises');\n const path = await import('path');\n\n const configDir = path.join(process.cwd(), '.kb');\n const rulePath = path.join(configDir, 'ai-review', 'rules', category, `${ruleName}.md`);\n\n const content = await fs.readFile(rulePath, 'utf-8');\n return content.trim();\n } catch (error) {\n useLogger()?.debug(`[PresetLoader] Failed to load atomic rule ${category}/${ruleName}:`, { error });\n return undefined;\n }\n }\n\n /**\n * Compose atomic rules into convention text\n */\n private async composeRules(\n category: string,\n include?: string[],\n exclude?: string[]\n ): Promise<string> {\n if (!include || include.length === 0) {\n return '';\n }\n\n const rules: string[] = [];\n\n for (const ruleName of include) {\n // Skip if excluded\n if (exclude?.includes(ruleName)) {\n continue;\n }\n\n \n const ruleContent = await this.loadAtomicRule(category, ruleName);\n if (ruleContent) {\n rules.push(ruleContent);\n }\n }\n\n // Join with double newline separator\n return rules.join('\\n\\n');\n }\n\n /**\n * Apply atomic rules composition to preset\n * Supports dynamic categories - any category name defined in atomicRules\n */\n private async applyAtomicRules(preset: PresetDefinition): Promise<PresetDefinition> {\n if (!preset.atomicRules) {\n return preset;\n }\n\n // Ensure context.conventions exists\n if (!preset.context) {\n preset.context = {};\n }\n if (!preset.context.conventions) {\n preset.context.conventions = {};\n }\n\n // Iterate over all categories defined in atomicRules\n // This allows users to create custom categories without modifying code\n for (const category in preset.atomicRules) {\n const ruleConfig = preset.atomicRules[category];\n if (!ruleConfig) {\n continue;\n }\n\n \n const composedRules = await this.composeRules(\n category,\n ruleConfig.include,\n ruleConfig.exclude\n );\n\n if (composedRules) {\n // Append to existing conventions (or replace)\n const existingConventions = preset.context.conventions[category] || '';\n\n // If atomic rules exist, they take priority over inline conventions\n // But we can append inline conventions at the end\n if (existingConventions) {\n preset.context.conventions[category] = `${composedRules}\\n\\n${existingConventions}`;\n } else {\n preset.context.conventions[category] = composedRules;\n }\n }\n }\n\n return preset;\n }\n\n /**\n * Get preset by ID (with inheritance resolved)\n */\n async getPreset(id: string): Promise<PresetDefinition | undefined> {\n await this.loadConfigPresets();\n const preset = this.presets.get(id);\n\n if (!preset) {\n return undefined;\n }\n\n // Resolve inheritance\n const resolved = this.resolveInheritance(preset);\n\n // Apply atomic rules composition\n return this.applyAtomicRules(resolved);\n }\n\n /**\n * Get preset by ID or throw error\n */\n async getPresetOrThrow(id: string): Promise<PresetDefinition> {\n const preset = await this.getPreset(id);\n if (!preset) {\n const available = Array.from(this.presets.keys()).join(', ');\n throw new Error(\n `Preset not found: \"${id}\"\\n` +\n `Available presets: ${available}`\n );\n }\n return preset;\n }\n\n /**\n * List all available presets\n */\n async listPresets(): Promise<PresetDefinition[]> {\n await this.loadConfigPresets();\n return Array.from(this.presets.values());\n }\n\n /**\n * Register custom preset\n */\n registerPreset(preset: PresetDefinition): void {\n this.presets.set(preset.id, preset);\n }\n}\n\n/**\n * Global preset loader instance\n */\nlet globalLoader: PresetLoader | undefined;\n\n/**\n * Get global preset loader\n */\nexport function getPresetLoader(): PresetLoader {\n if (!globalLoader) {\n globalLoader = new PresetLoader();\n }\n return globalLoader;\n}\n\n/**\n * Load preset by ID\n */\nexport async function loadPreset(id: string): Promise<PresetDefinition> {\n return getPresetLoader().getPresetOrThrow(id);\n}\n","/**\n * @module @kb-labs/review-core/diff-provider\n * Git diff fetching and parsing for LLM-lite review mode.\n *\n * Provides diff-based context instead of full file content.\n */\n\nimport { simpleGit, type SimpleGit } from 'simple-git';\nimport type {\n IDiffProvider,\n DiffHunk,\n FileDiff,\n BatchDiffRequest,\n BatchDiffResult,\n} from '@kb-labs/review-contracts';\nimport * as path from 'node:path';\nimport { useLogger } from '@kb-labs/sdk';\n\n// Re-export types from contracts for backward compatibility\nexport type { DiffHunk, FileDiff, BatchDiffRequest, BatchDiffResult, IDiffProvider };\n\n/**\n * DiffProvider - fetches and parses git diffs\n */\nexport class DiffProvider implements IDiffProvider {\n private git: SimpleGit;\n private cwd: string;\n\n constructor(cwd: string) {\n // Validate cwd to prevent path traversal and ensure it's absolute\n if (!cwd || typeof cwd !== 'string') {\n throw new Error('DiffProvider: cwd must be a non-empty string');\n }\n\n // Resolve to absolute path and validate\n const resolvedCwd = path.resolve(cwd);\n\n // Ensure cwd doesn't contain path traversal sequences\n if (cwd.includes('..') && resolvedCwd !== path.resolve(process.cwd(), cwd)) {\n useLogger()?.debug('[DiffProvider] Potential path traversal detected in cwd:', { cwd, resolvedCwd });\n }\n\n this.cwd = resolvedCwd;\n this.git = simpleGit(resolvedCwd);\n }\n\n /**\n * Get diffs for multiple files in one call (batch operation)\n */\n async getDiffs(request: BatchDiffRequest): Promise<BatchDiffResult> {\n const { files, staged = true, unstaged = true, maxLinesPerFile = 500 } = request;\n\n const diffs: FileDiff[] = [];\n const errors: Array<{ file: string; error: string }> = [];\n let totalLines = 0;\n\n // Process files in parallel (but limit concurrency)\n const BATCH_SIZE = 10;\n for (let i = 0; i < files.length; i += BATCH_SIZE) {\n const batch = files.slice(i, i + BATCH_SIZE);\n \n const results = await Promise.allSettled(\n batch.map(file => this.getFileDiff(file, staged, unstaged, maxLinesPerFile))\n );\n\n for (let j = 0; j < results.length; j++) {\n const result = results[j]!;\n const file = batch[j]!;\n\n if (result.status === 'fulfilled' && result.value) {\n diffs.push(result.value);\n totalLines += result.value.diff.split('\\n').length;\n } else if (result.status === 'rejected') {\n errors.push({ file, error: (result as PromiseRejectedResult).reason?.message ?? 'Unknown error' });\n }\n }\n }\n\n return { diffs, errors, totalLines };\n }\n\n /**\n * Get diff for a single file\n */\n async getFileDiff(\n file: string,\n staged: boolean = true,\n unstaged: boolean = true,\n maxLines: number = 500\n ): Promise<FileDiff | null> {\n try {\n let diff = '';\n\n // Get staged diff\n if (staged) {\n const stagedDiff = await this.git.diff(['--cached', '--', file]);\n if (stagedDiff) {\n diff = stagedDiff;\n }\n }\n\n // Get unstaged diff (if not already have staged)\n if (unstaged && !diff) {\n const unstagedDiff = await this.git.diff(['--', file]);\n if (unstagedDiff) {\n diff = unstagedDiff;\n }\n }\n\n // If still no diff, try against HEAD for new files\n if (!diff) {\n try {\n const headDiff = await this.git.diff(['HEAD', '--', file]);\n if (headDiff) {\n diff = headDiff;\n }\n } catch {\n // File might be untracked - generate \"new file\" diff\n // This is a simplification - in practice we'd read the file\n return null;\n }\n }\n\n if (!diff) {\n return null;\n }\n\n // Truncate large diffs\n const lines = diff.split('\\n');\n if (lines.length > maxLines) {\n diff = lines.slice(0, maxLines).join('\\n') + `\\n... (truncated, ${lines.length - maxLines} more lines)`;\n }\n\n // Parse the diff\n return this.parseDiff(file, diff);\n } catch (error) {\n useLogger()?.debug(`[DiffProvider] Error getting diff for ${file}:`, { error });\n return null;\n }\n }\n\n /**\n * Parse unified diff into structured format\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Diff parsing logic: detects file modes (new/deleted/renamed), parses hunks, tracks line numbers, counts additions/deletions\n private parseDiff(file: string, diff: string): FileDiff {\n const hunks: DiffHunk[] = [];\n const changedLines = new Set<number>();\n\n let additions = 0;\n let deletions = 0;\n let isNewFile = false;\n let isDeleted = false;\n let isRenamed = false;\n\n // Check for special cases\n if (diff.includes('new file mode')) {\n isNewFile = true;\n }\n if (diff.includes('deleted file mode')) {\n isDeleted = true;\n }\n if (diff.includes('rename from') || diff.includes('rename to')) {\n isRenamed = true;\n }\n\n // Parse hunks\n\n const lines = diff.split('\\n');\n let currentHunkStart = -1;\n let currentHunk: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n\n // Check for hunk header\n const hunkMatch = line.match(/^@@\\s+-(\\d+)(?:,(\\d+))?\\s+\\+(\\d+)(?:,(\\d+))?\\s+@@/);\n if (hunkMatch) {\n // Save previous hunk if exists\n if (currentHunkStart >= 0 && currentHunk.length > 0) {\n const parsed = this.parseHunkContent(currentHunk, currentHunkStart);\n hunks.push(parsed);\n parsed.addedLines.forEach(l => changedLines.add(l));\n }\n\n // Start new hunk\n currentHunkStart = parseInt(hunkMatch[3]!, 10);\n currentHunk = [line];\n } else if (currentHunkStart >= 0) {\n currentHunk.push(line);\n }\n\n // Count additions/deletions\n if (line.startsWith('+') && !line.startsWith('+++')) {\n additions++;\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n deletions++;\n }\n }\n\n // Don't forget last hunk\n if (currentHunkStart >= 0 && currentHunk.length > 0) {\n const parsed = this.parseHunkContent(currentHunk, currentHunkStart);\n hunks.push(parsed);\n parsed.addedLines.forEach(l => changedLines.add(l));\n }\n\n return {\n file,\n diff,\n additions,\n deletions,\n isNewFile,\n isDeleted,\n isRenamed,\n hunks,\n changedLines,\n };\n }\n\n /**\n * Parse hunk content to extract line numbers\n */\n private parseHunkContent(lines: string[], newStart: number): DiffHunk {\n const addedLines: number[] = [];\n const deletedLines: number[] = [];\n\n // Parse header\n const header = lines[0]!;\n const headerMatch = header.match(/^@@\\s+-(\\d+)(?:,(\\d+))?\\s+\\+(\\d+)(?:,(\\d+))?\\s+@@/);\n\n const oldStart = headerMatch ? parseInt(headerMatch[1]!, 10) : 0;\n const oldLines = headerMatch && headerMatch[2] ? parseInt(headerMatch[2], 10) : 1;\n const newLines = headerMatch && headerMatch[4] ? parseInt(headerMatch[4], 10) : 1;\n\n // Track line numbers\n let newLineNum = newStart;\n let oldLineNum = oldStart;\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i]!;\n\n if (line.startsWith('+') && !line.startsWith('+++')) {\n addedLines.push(newLineNum);\n newLineNum++;\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n deletedLines.push(oldLineNum);\n oldLineNum++;\n } else if (line.startsWith(' ') || line === '') {\n // Context line\n newLineNum++;\n oldLineNum++;\n }\n }\n\n return {\n newStart,\n newLines,\n oldStart,\n oldLines,\n content: lines.join('\\n'),\n addedLines,\n deletedLines,\n };\n }\n\n /**\n * Check if a line number is in the diff (was changed)\n */\n isLineInDiff(fileDiff: FileDiff, lineNumber: number): boolean {\n return fileDiff.changedLines.has(lineNumber);\n }\n\n /**\n * Get context around a specific line (for verification)\n */\n async getLineContext(\n file: string,\n lineNumber: number,\n contextLines: number = 3\n ): Promise<{ lines: string[]; startLine: number } | null> {\n try {\n const fullPath = path.join(this.cwd, file);\n const { readFile } = await import('node:fs/promises');\n const content = await readFile(fullPath, 'utf-8');\n const lines = content.split('\\n');\n\n const start = Math.max(0, lineNumber - contextLines - 1);\n const end = Math.min(lines.length, lineNumber + contextLines);\n\n return {\n lines: lines.slice(start, end),\n startLine: start + 1,\n };\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Create a DiffProvider instance\n */\nexport function createDiffProvider(cwd: string): DiffProvider {\n return new DiffProvider(cwd);\n}\n","/**\n * @module @kb-labs/review-core/findings-cache\n * Cache for LLM review findings based on file content hash.\n *\n * Enables incremental review:\n * - Skip unchanged files (return cached findings)\n * - Track \"known issues\" vs \"new issues\" for changed files\n */\n\nimport { createHash } from 'node:crypto';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport type { ReviewFinding, InputFile } from '@kb-labs/review-contracts';\n\n/**\n * Cached finding with file hash\n */\nexport interface CachedFinding extends ReviewFinding {\n /** Hash of file content when finding was created */\n contentHash: string;\n /** Timestamp when finding was cached */\n cachedAt: number;\n}\n\n/**\n * Cache entry for a single file\n */\nexport interface FileCacheEntry {\n /** File path */\n path: string;\n /** Content hash */\n contentHash: string;\n /** Findings for this file */\n findings: CachedFinding[];\n /** When this entry was created */\n createdAt: number;\n /** When this entry was last accessed */\n lastAccessedAt: number;\n}\n\n/**\n * Full cache structure\n */\nexport interface FindingsCacheData {\n /** Version for cache format migrations */\n version: number;\n /** Cache entries by file path */\n entries: Record<string, FileCacheEntry>;\n /** Cache metadata */\n metadata: {\n createdAt: number;\n lastUpdatedAt: number;\n totalFindings: number;\n totalFiles: number;\n };\n}\n\n/**\n * Result of cache lookup\n */\nexport interface CacheLookupResult {\n /** Files that have valid cache (unchanged) */\n cached: {\n file: InputFile;\n findings: ReviewFinding[];\n }[];\n /** Files that need fresh analysis (changed or not cached) */\n uncached: InputFile[];\n /** Statistics */\n stats: {\n cachedFiles: number;\n uncachedFiles: number;\n cachedFindings: number;\n };\n}\n\n/**\n * Result of incremental comparison\n */\nexport interface IncrementalResult {\n /** New findings (not seen before) */\n newFindings: ReviewFinding[];\n /** Known findings (seen in previous review) */\n knownFindings: ReviewFinding[];\n /** Findings from unchanged (cached) files */\n cachedFindings: ReviewFinding[];\n /** Statistics */\n stats: {\n new: number;\n known: number;\n cached: number;\n total: number;\n };\n}\n\nconst CACHE_VERSION = 1;\nconst CACHE_FILENAME = 'llm-findings-cache.json';\n\n/**\n * Generate content hash for a file.\n *\n * Uses SHA-256 for cryptographic strength, truncated to 16 hex chars (64 bits).\n * This provides sufficient collision resistance for cache invalidation while\n * keeping cache keys reasonably short.\n *\n * @param content - File content to hash\n * @returns 16-character hex string (first 64 bits of SHA-256)\n */\nexport function hashFileContent(content: string): string {\n return createHash('sha256').update(content).digest('hex').slice(0, 16);\n}\n\n/**\n * Generate finding signature for deduplication\n * Two findings are \"same\" if they have same file, line range, and category\n */\nexport function findingSignature(finding: ReviewFinding): string {\n return `${finding.file}:${finding.line}:${finding.endLine ?? finding.line}:${finding.type}`;\n}\n\n/**\n * Findings cache manager\n */\nexport class FindingsCache {\n private cwd: string;\n private cachePath: string;\n private data: FindingsCacheData | null = null;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n this.cachePath = join(cwd, '.kb', 'ai-review', 'cache', CACHE_FILENAME);\n }\n\n /**\n * Load cache from disk\n */\n async load(): Promise<void> {\n try {\n const content = await readFile(this.cachePath, 'utf-8');\n const parsed = JSON.parse(content) as FindingsCacheData;\n\n // Version check\n if (parsed.version !== CACHE_VERSION) {\n // Cache format changed, start fresh\n this.data = this.createEmptyCache();\n return;\n }\n\n this.data = parsed;\n } catch {\n // No cache or invalid, start fresh\n this.data = this.createEmptyCache();\n }\n }\n\n /**\n * Save cache to disk\n */\n async save(): Promise<void> {\n if (!this.data) {\n return;\n }\n\n this.data.metadata.lastUpdatedAt = Date.now();\n\n // Ensure directory exists\n await mkdir(dirname(this.cachePath), { recursive: true });\n\n await writeFile(this.cachePath, JSON.stringify(this.data, null, 2));\n }\n\n /**\n * Look up files in cache\n * Returns which files can use cached findings vs need fresh analysis\n */\n lookup(files: InputFile[]): CacheLookupResult {\n if (!this.data) {\n return {\n cached: [],\n uncached: files,\n stats: { cachedFiles: 0, uncachedFiles: files.length, cachedFindings: 0 },\n };\n }\n\n const cached: CacheLookupResult['cached'] = [];\n const uncached: InputFile[] = [];\n let cachedFindings = 0;\n\n for (const file of files) {\n const hash = hashFileContent(file.content);\n const entry = this.data.entries[file.path];\n\n if (entry && entry.contentHash === hash) {\n // File unchanged, use cached findings\n cached.push({\n file,\n findings: entry.findings.map(f => this.stripCacheFields(f)),\n });\n cachedFindings += entry.findings.length;\n\n // Update last accessed\n entry.lastAccessedAt = Date.now();\n } else {\n // File changed or not cached\n uncached.push(file);\n }\n }\n\n return {\n cached,\n uncached,\n stats: {\n cachedFiles: cached.length,\n uncachedFiles: uncached.length,\n cachedFindings,\n },\n };\n }\n\n /**\n * Update cache with new findings\n */\n update(files: InputFile[], findings: ReviewFinding[]): void {\n if (!this.data) {\n this.data = this.createEmptyCache();\n }\n\n // Group findings by file\n const findingsByFile = new Map<string, ReviewFinding[]>();\n for (const finding of findings) {\n const existing = findingsByFile.get(finding.file) ?? [];\n existing.push(finding);\n findingsByFile.set(finding.file, existing);\n }\n\n // Update cache entries\n for (const file of files) {\n const hash = hashFileContent(file.content);\n const fileFindings = findingsByFile.get(file.path) ?? [];\n\n const cachedFindings: CachedFinding[] = fileFindings.map(f => ({\n ...f,\n contentHash: hash,\n cachedAt: Date.now(),\n }));\n\n this.data.entries[file.path] = {\n path: file.path,\n contentHash: hash,\n findings: cachedFindings,\n createdAt: Date.now(),\n lastAccessedAt: Date.now(),\n };\n }\n\n // Update metadata\n this.data.metadata.totalFiles = Object.keys(this.data.entries).length;\n this.data.metadata.totalFindings = Object.values(this.data.entries)\n .reduce((sum, entry) => sum + entry.findings.length, 0);\n }\n\n /**\n * Compare new findings with cached to find new vs known issues\n */\n compareIncremental(\n newFindings: ReviewFinding[],\n cachedFindings: ReviewFinding[]\n ): IncrementalResult {\n // Build set of known finding signatures\n const knownSignatures = new Set<string>();\n\n // Add signatures from cache\n if (this.data) {\n for (const entry of Object.values(this.data.entries)) {\n for (const finding of entry.findings) {\n knownSignatures.add(findingSignature(finding));\n }\n }\n }\n\n // Separate new vs known\n const newIssues: ReviewFinding[] = [];\n const knownIssues: ReviewFinding[] = [];\n\n for (const finding of newFindings) {\n const sig = findingSignature(finding);\n if (knownSignatures.has(sig)) {\n knownIssues.push(finding);\n } else {\n newIssues.push(finding);\n }\n }\n\n return {\n newFindings: newIssues,\n knownFindings: knownIssues,\n cachedFindings,\n stats: {\n new: newIssues.length,\n known: knownIssues.length,\n cached: cachedFindings.length,\n total: newIssues.length + knownIssues.length + cachedFindings.length,\n },\n };\n }\n\n /**\n * Clear cache for specific files or all\n */\n clear(files?: string[]): void {\n if (!this.data) {\n return;\n }\n\n if (files) {\n for (const file of files) {\n delete this.data.entries[file];\n }\n } else {\n this.data = this.createEmptyCache();\n }\n }\n\n /**\n * Get cache statistics\n */\n getStats(): { totalFiles: number; totalFindings: number; cacheAge: number } {\n if (!this.data) {\n return { totalFiles: 0, totalFindings: 0, cacheAge: 0 };\n }\n return {\n totalFiles: this.data.metadata.totalFiles,\n totalFindings: this.data.metadata.totalFindings,\n cacheAge: Date.now() - this.data.metadata.createdAt,\n };\n }\n\n private createEmptyCache(): FindingsCacheData {\n return {\n version: CACHE_VERSION,\n entries: {},\n metadata: {\n createdAt: Date.now(),\n lastUpdatedAt: Date.now(),\n totalFindings: 0,\n totalFiles: 0,\n },\n };\n }\n\n private stripCacheFields(finding: CachedFinding): ReviewFinding {\n const { contentHash: _contentHash, cachedAt: _cachedAt, ...rest } = finding;\n return rest;\n }\n}\n\n/**\n * Create findings cache instance\n */\nexport function createFindingsCache(cwd: string): FindingsCache {\n return new FindingsCache(cwd);\n}\n","/**\n * @module @kb-labs/review-core/orchestrator\n * Main orchestrator for code review operations.\n *\n * Coordinates heuristic engines, LLM analysis, caching, and deduplication.\n */\n\nimport type {\n ReviewRequest,\n ReviewResult,\n ReviewFinding,\n PresetDefinition,\n IncrementalMetadata,\n} from '@kb-labs/review-contracts';\nimport { LinterRunner, deduplicateFindings } from '@kb-labs/review-heuristic';\nimport { runLLMLiteAnalysis, type LLMLiteResult } from '@kb-labs/review-llm';\nimport { useLLM, useAnalytics, useLogger } from '@kb-labs/sdk';\nimport { loadPreset } from './presets/index.js';\nimport { createDiffProvider } from './diff-provider.js';\nimport {\n createFindingsCache,\n type CacheLookupResult,\n type IncrementalResult,\n} from './findings-cache.js';\n\n/**\n * Internal context for tracking review state within a single review() call.\n *\n * ## Thread-Safety Design\n *\n * This context is passed through function parameters instead of being stored\n * as instance variables on ReviewOrchestrator. This ensures thread-safety:\n *\n * - Each `review()` call creates its own ReviewRunContext\n * - Multiple concurrent `review()` calls don't share state\n * - No race conditions between parallel reviews\n *\n * This pattern allows a single ReviewOrchestrator instance to safely handle\n * multiple concurrent review requests (e.g., in a server environment).\n *\n * @internal\n */\ninterface ReviewRunContext {\n /** LLM-Lite result (if run) */\n llmLiteResult?: LLMLiteResult;\n /** Incremental analysis result */\n incrementalResult?: IncrementalResult;\n /** Cache lookup result */\n cacheLookup?: CacheLookupResult;\n}\n\n/**\n * Review orchestrator.\n *\n * Main entry point for running code reviews.\n * Thread-safe: all state is passed through parameters, not instance variables.\n */\nexport class ReviewOrchestrator {\n /**\n * Run code review.\n *\n * @param request - Review request\n * @returns Review result with findings\n */\n async review(request: ReviewRequest): Promise<ReviewResult> {\n const startTime = Date.now();\n\n // Load preset\n const preset = await loadPreset(request.presetId);\n\n // Track analytics\n const analytics = useAnalytics();\n analytics?.track('review:started', {\n mode: request.mode,\n repoScope: request.repoScope,\n presetId: request.presetId,\n });\n\n // Create run context (thread-safe: local to this call)\n const runCtx: ReviewRunContext = {};\n\n try {\n // Run analysis based on mode\n const findings = await this.runAnalysis(request, preset, runCtx);\n\n // Build result\n const analyzedFiles = await this.countFiles(request, preset);\n\n // Base metadata\n const metadata: ReviewResult['metadata'] = {\n preset: request.presetId,\n mode: request.mode,\n filesReviewed: analyzedFiles,\n analyzedFiles: analyzedFiles,\n heuristicFindings: findings.filter((f) => f.source === 'heuristic').length,\n llmFindings: findings.filter((f) => f.source !== 'heuristic').length,\n totalFindings: findings.length,\n durationMs: Date.now() - startTime,\n engines: this.getEnginesUsed(findings),\n };\n\n // Add LLM-Lite specific metadata if available\n if (runCtx.llmLiteResult) {\n const llmMeta = runCtx.llmLiteResult.metadata;\n Object.assign(metadata, {\n llmLite: {\n llmCalls: llmMeta.llmCalls,\n toolCalls: llmMeta.toolCalls,\n tokens: llmMeta.tokens,\n estimatedCost: llmMeta.estimatedCost,\n verification: llmMeta.verification,\n timing: llmMeta.timing,\n },\n });\n }\n\n // Add incremental review metadata if available\n if (runCtx.incrementalResult || runCtx.cacheLookup) {\n const incr = runCtx.incrementalResult;\n const cache = runCtx.cacheLookup;\n\n const incrementalMeta: IncrementalMetadata = {\n cachedFiles: cache?.stats.cachedFiles ?? 0,\n analyzedFiles: cache?.stats.uncachedFiles ?? analyzedFiles,\n newFindings: incr?.stats.new ?? findings.length,\n knownFindings: incr?.stats.known ?? 0,\n cachedFindings: incr?.stats.cached ?? 0,\n };\n\n Object.assign(metadata, { incremental: incrementalMeta });\n }\n\n const result: ReviewResult = {\n findings,\n summary: {\n total: findings.length,\n bySeverity: {\n error: findings.filter((f) => f.severity === 'blocker' || f.severity === 'high').length,\n warning: findings.filter((f) => f.severity === 'medium').length,\n info: findings.filter((f) => f.severity === 'low' || f.severity === 'info').length,\n },\n byType: this.groupByType(findings),\n },\n metadata,\n };\n\n // Track success\n analytics?.track('review:completed', {\n mode: request.mode,\n findingsCount: findings.length,\n duration: result.metadata.durationMs,\n });\n\n return result;\n } catch (error) {\n // Track error\n analytics?.track('review:failed', {\n mode: request.mode,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n }\n\n /**\n * Run analysis based on review mode.\n */\n private async runAnalysis(\n request: ReviewRequest,\n preset: PresetDefinition,\n runCtx: ReviewRunContext\n ): Promise<ReviewFinding[]> {\n const mode = request.mode ?? 'heuristic';\n\n switch (mode) {\n case 'heuristic':\n return this.runHeuristicAnalysis(request, preset);\n\n case 'full':\n return this.runFullAnalysis(request, preset, runCtx);\n\n case 'llm':\n return this.runLLMAnalysis(request, preset, runCtx);\n\n default:\n throw new Error(`Unknown review mode: ${mode}`);\n }\n }\n\n /**\n * Run heuristic-only analysis (CI mode).\n *\n * Fast, deterministic analysis using linters via CLI.\n * No LLM calls.\n */\n private async runHeuristicAnalysis(\n request: ReviewRequest,\n _preset: PresetDefinition\n ): Promise<ReviewFinding[]> {\n // Get file paths\n const files = request.files?.map(f => f.path) ?? [];\n if (files.length === 0) {\n return [];\n }\n\n // Run all applicable linters via CLI\n const runner = new LinterRunner();\n const results = await runner.runAll(files);\n\n // Log any errors\n const logger = useLogger();\n for (const result of results) {\n if (result.error) {\n logger?.warn(`[${result.engineId}] ${result.error}`);\n }\n }\n\n // Collect and deduplicate findings\n const findings = LinterRunner.collectFindings(results);\n return deduplicateFindings(findings);\n }\n\n /**\n * Run full analysis (heuristic + LLM-Lite).\n *\n * Runs heuristic analysis (ESLint, etc.) and LLM-Lite in parallel.\n * Combines deterministic linting with intelligent code review.\n * Both use caching for incremental analysis.\n */\n private async runFullAnalysis(\n request: ReviewRequest,\n preset: PresetDefinition,\n runCtx: ReviewRunContext\n ): Promise<ReviewFinding[]> {\n // Run heuristic and LLM-Lite in parallel for speed\n const llm = useLLM({ tier: 'medium' });\n\n const [heuristicFindings, llmFindings] = await Promise.all([\n // Heuristic analysis (ESLint, etc.)\n this.runHeuristicAnalysis(request, preset),\n // LLM-Lite analysis with caching (if LLM available and files provided)\n llm && request.files?.length\n ? this.runLLMAnalysis(request, preset, runCtx)\n : Promise.resolve([]),\n ]);\n\n // Combine and deduplicate (ESLint and LLM may find same issues)\n return deduplicateFindings([...heuristicFindings, ...llmFindings]);\n }\n\n /**\n * Run LLM-Lite analysis (v2) with incremental caching.\n *\n * Uses batch tools, diff-based context, and anti-hallucination verification.\n * Caches findings by file content hash to skip unchanged files.\n */\n private async runLLMAnalysis(\n request: ReviewRequest,\n _preset: PresetDefinition,\n runCtx: ReviewRunContext\n ): Promise<ReviewFinding[]> {\n if (!request.files || request.files.length === 0) {\n return [];\n }\n\n const cwd = request.cwd ?? process.cwd();\n\n // Initialize findings cache\n const findingsCache = createFindingsCache(cwd);\n await findingsCache.load();\n\n // Check cache - skip unchanged files\n const cacheLookup = findingsCache.lookup(request.files);\n runCtx.cacheLookup = cacheLookup;\n\n // Collect cached findings\n const cachedFindings: ReviewFinding[] = [];\n for (const cached of cacheLookup.cached) {\n cachedFindings.push(...cached.findings);\n }\n\n // If all files are cached, return early\n if (cacheLookup.uncached.length === 0) {\n // All files unchanged - use cache\n runCtx.incrementalResult = {\n newFindings: [],\n knownFindings: [],\n cachedFindings,\n stats: {\n new: 0,\n known: 0,\n cached: cachedFindings.length,\n total: cachedFindings.length,\n },\n };\n return cachedFindings;\n }\n\n // Create DiffProvider for this analysis\n const diffProvider = createDiffProvider(cwd);\n\n // Run LLM-Lite analysis only on uncached (changed) files\n const result: LLMLiteResult = await runLLMLiteAnalysis({\n cwd,\n files: cacheLookup.uncached,\n taskContext: request.taskContext,\n repoScope: request.repoScope,\n diffProvider,\n });\n\n // Store LLM-Lite metadata for later (will be merged into result)\n runCtx.llmLiteResult = result;\n\n // Compare with known issues (incremental)\n const incrementalResult = findingsCache.compareIncremental(\n result.findings,\n cachedFindings\n );\n runCtx.incrementalResult = incrementalResult;\n\n // Update cache with new findings\n findingsCache.update(cacheLookup.uncached, result.findings);\n await findingsCache.save();\n\n // Return all findings (new + known + cached)\n const allFindings = [\n ...incrementalResult.newFindings,\n ...incrementalResult.knownFindings,\n ...incrementalResult.cachedFindings,\n ];\n\n return deduplicateFindings(allFindings);\n }\n\n /**\n * Resolve file patterns to absolute paths.\n *\n * Note: Files must be provided in request.files.\n * Pattern resolution should happen at CLI layer using ctx.runtime.fs.glob()\n */\n private async resolvePatterns(request: ReviewRequest, _preset: PresetDefinition): Promise<string[]> {\n // Files must be provided by caller (CLI layer handles glob resolution)\n if (!request.files || request.files.length === 0) {\n throw new Error('No files provided for review. Use ctx.runtime.fs.glob() at CLI layer to resolve patterns.');\n }\n\n return request.files.map((f) => f.path);\n }\n\n /**\n * Count files to be analyzed.\n */\n private async countFiles(request: ReviewRequest, preset: PresetDefinition): Promise<number> {\n const files = await this.resolvePatterns(request, preset);\n return files.length;\n }\n\n /**\n * Get list of engines that produced findings.\n */\n private getEnginesUsed(findings: ReviewFinding[]): string[] {\n const engines = new Set(findings.map((f) => f.engine));\n return [...engines];\n }\n\n /**\n * Group findings by type.\n */\n private groupByType(findings: ReviewFinding[]): Record<string, number> {\n const groups: Record<string, number> = {};\n for (const finding of findings) {\n const type = finding.type;\n groups[type] = (groups[type] ?? 0) + 1;\n }\n return groups;\n }\n\n /**\n * Generate cache key for heuristic analysis.\n */\n private generateCacheKey(engine: string, request: ReviewRequest): string {\n // TODO: Include file content hashes for more precise caching\n const filePaths = request.files ? request.files.map((f) => f.path).sort().join(',') : 'default';\n\n // Normalize repoScope (may come as string from CLI in some edge cases)\n const repoScopeKey = request.repoScope\n ? (Array.isArray(request.repoScope) ? request.repoScope.join(',') : String(request.repoScope))\n : 'default';\n\n const parts = [\n 'review',\n engine,\n repoScopeKey,\n request.presetId ?? 'default',\n filePaths,\n ];\n\n return parts.join(':');\n }\n\n}\n\n/**\n * Quick helper to run code review.\n */\nexport async function runReview(request: ReviewRequest): Promise<ReviewResult> {\n const orchestrator = new ReviewOrchestrator();\n return orchestrator.review(request);\n}\n","/**\n * @module @kb-labs/review-core/git-scope\n * Git scope resolver for diff-based reviews.\n *\n * Supports nested git repositories (submodules) common in monorepos.\n */\n\nimport { existsSync, readdirSync, statSync, readFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { simpleGit, type SimpleGit, type StatusResult } from 'simple-git';\nimport type { InputFile } from '@kb-labs/review-contracts';\nimport { useLogger } from '@kb-labs/sdk';\n\n/**\n * Parse .gitmodules to get all known submodule paths.\n * Returns a map of: repo name → relative path from workspace root.\n * e.g. \"kb-labs-core\" → \"platform/kb-labs-core\"\n */\nfunction parseGitmodules(cwd: string): Map<string, string> {\n const result = new Map<string, string>();\n const gitmodulesPath = join(cwd, '.gitmodules');\n if (!existsSync(gitmodulesPath)) {return result;}\n\n try {\n const content = readFileSync(gitmodulesPath, 'utf-8');\n const pathMatches = content.matchAll(/^\\s*path\\s*=\\s*(.+)$/gm);\n for (const match of pathMatches) {\n const relPath = (match[1] ?? '').trim();\n if (!relPath) {continue;}\n const name = relPath.split('/').pop() ?? relPath;\n result.set(name, relPath);\n }\n } catch {\n // ignore parse errors\n }\n return result;\n}\n\n/**\n * Resolve a repo name to its actual path.\n * Supports both flat layout (kb-labs-core) and nested layout (platform/kb-labs-core).\n * Uses .gitmodules for discovery — no hardcoded category dirs.\n */\nfunction resolveRepoPath(cwd: string, repo: string, submodules: Map<string, string>): string | null {\n // 1. Already a nested/direct path\n const direct = join(cwd, repo);\n if (existsSync(direct)) {return direct;}\n\n // 2. Look up in .gitmodules\n const relPath = submodules.get(repo);\n if (relPath) {\n const full = join(cwd, relPath);\n if (existsSync(full)) {return full;}\n }\n\n return null;\n}\n\n/**\n * Get the relative path of a repo from cwd (e.g. \"platform/kb-labs-core\").\n * Uses .gitmodules for discovery — no hardcoded category dirs.\n */\nfunction resolveRepoRelative(cwd: string, repo: string, submodules: Map<string, string>): string | null {\n // Already a valid path\n if (existsSync(join(cwd, repo))) {return repo;}\n\n // Look up in .gitmodules\n const relPath = submodules.get(repo);\n if (relPath && existsSync(join(cwd, relPath))) {return relPath;}\n\n return null;\n}\n\nexport interface GitScopeOptions {\n /** Working directory (root of monorepo) */\n cwd: string;\n /** Repository names to include (e.g., ['kb-labs-core', 'kb-labs-cli']) */\n repos: string[];\n /** Include staged files */\n includeStaged?: boolean;\n /** Include unstaged files */\n includeUnstaged?: boolean;\n /** Include untracked files */\n includeUntracked?: boolean;\n}\n\nexport interface ScopedFiles {\n /** Files with content ready for review */\n files: InputFile[];\n /** Summary of what was found */\n summary: {\n repos: string[];\n staged: number;\n unstaged: number;\n untracked: number;\n total: number;\n };\n}\n\n/**\n * Resolve git scope to list of changed files.\n *\n * For each repo in scope:\n * 1. Detect if it's a nested git repo (has .git)\n * 2. Get git status from that repo\n * 3. Read file contents\n * 4. Return as InputFile[] with paths relative to root\n */\n// eslint-disable-next-line sonarjs/cognitive-complexity -- Git scope resolution: iterates repos, checks nested git, parses status, filters by include flags (staged/unstaged/untracked), reads files, tracks counts\nexport async function resolveGitScope(options: GitScopeOptions): Promise<ScopedFiles> {\n const {\n cwd,\n repos,\n includeStaged = true,\n includeUnstaged = true,\n includeUntracked = false,\n } = options;\n\n const allFiles: InputFile[] = [];\n let stagedCount = 0;\n let unstagedCount = 0;\n let untrackedCount = 0;\n\n const submodules = parseGitmodules(cwd);\n\n for (const repo of repos) {\n const repoPath = resolveRepoPath(cwd, repo, submodules);\n const repoRelative = resolveRepoRelative(cwd, repo, submodules) ?? repo;\n\n // Check if repo exists and has .git\n if (!repoPath) {\n useLogger()?.debug(`[git-scope] Repo not found: ${repo}`);\n continue;\n }\n\n const gitPath = join(repoPath, '.git');\n const isNestedRepo = existsSync(gitPath);\n const gitCwd = isNestedRepo ? repoPath : cwd;\n\n try {\n const git: SimpleGit = simpleGit(gitCwd);\n \n const status: StatusResult = await git.status();\n\n // Collect file paths based on options\n const filePaths: string[] = [];\n\n if (includeStaged) {\n // Exclude deleted files from staged (can't read them)\n const stagedNotDeleted = status.staged.filter((f) => !status.deleted.includes(f));\n stagedCount += stagedNotDeleted.length;\n filePaths.push(...stagedNotDeleted);\n }\n\n if (includeUnstaged) {\n // Only include modified files, not deleted (can't read deleted files)\n const unstaged = status.modified\n .filter((f) => !status.staged.includes(f));\n unstagedCount += unstaged.length;\n filePaths.push(...unstaged);\n }\n\n if (includeUntracked) {\n untrackedCount += status.not_added.length;\n filePaths.push(...status.not_added);\n }\n\n // Dedupe and filter\n const uniquePaths = [...new Set(filePaths)]\n .filter((f) => !shouldIgnoreFile(f))\n .filter((f) => isReviewableFile(f));\n\n // Read file contents\n for (const filePath of uniquePaths) {\n try {\n const absolutePath = join(gitCwd, filePath);\n \n const content = await readFile(absolutePath, 'utf-8');\n\n // Path relative to root cwd\n const relativePath = isNestedRepo && repoRelative !== '.'\n ? `${repoRelative}/${filePath}`\n : filePath;\n\n allFiles.push({\n path: relativePath,\n content,\n });\n } catch {\n useLogger()?.debug(`[git-scope] Could not read file: ${filePath}`);\n }\n }\n } catch (error) {\n useLogger()?.debug(`[git-scope] Git error in ${repo}:`, { error });\n }\n }\n\n return {\n files: allFiles,\n summary: {\n repos,\n staged: stagedCount,\n unstaged: unstagedCount,\n untracked: untrackedCount,\n total: allFiles.length,\n },\n };\n}\n\n/**\n * Detect all submodules/nested repos in cwd.\n * Reads paths from .gitmodules — no hardcoded category directories.\n * Returns relative paths as they appear in .gitmodules (e.g. \"platform/kb-labs-core\").\n */\nexport async function discoverRepos(cwd: string): Promise<string[]> {\n const submodules = parseGitmodules(cwd);\n\n if (submodules.size > 0) {\n // Filter to only those that actually exist on disk\n return [...submodules.values()].filter((relPath) =>\n existsSync(join(cwd, relPath, '.git'))\n );\n }\n\n // Fallback: scan top-level dirs for .git (flat layout)\n const repos: string[] = [];\n try {\n const entries = readdirSync(cwd);\n for (const entry of entries) {\n if (entry.startsWith('.') || entry === 'node_modules') {continue;}\n try {\n const entryPath = join(cwd, entry);\n if (statSync(entryPath).isDirectory() && existsSync(join(entryPath, '.git'))) {\n repos.push(entry);\n }\n } catch {\n // skip\n }\n }\n } catch {\n // return empty\n }\n return repos;\n}\n\n/**\n * Get all repos with uncommitted changes\n */\nexport async function getReposWithChanges(cwd: string): Promise<string[]> {\n const allRepos = await discoverRepos(cwd);\n\n // Single-repo project: cwd itself is a git repo with no submodules.\n // Return '.' so callers can use resolveGitScope({ repos: ['.'] }).\n if (allRepos.length === 0 && existsSync(join(cwd, '.git'))) {\n try {\n const git: SimpleGit = simpleGit(cwd);\n const status: StatusResult = await git.status();\n const hasChanges =\n status.staged.length > 0 ||\n status.modified.length > 0 ||\n status.deleted.length > 0 ||\n status.not_added.length > 0;\n if (hasChanges) {return ['.'];}\n } catch {\n // ignore\n }\n return [];\n }\n\n const reposWithChanges: string[] = [];\n\n for (const repo of allRepos) {\n const repoPath = join(cwd, repo);\n\n try {\n const git: SimpleGit = simpleGit(repoPath);\n\n const status: StatusResult = await git.status();\n\n const hasChanges =\n status.staged.length > 0 ||\n status.modified.length > 0 ||\n status.deleted.length > 0 ||\n status.not_added.length > 0;\n\n if (hasChanges) {\n reposWithChanges.push(repo);\n }\n } catch {\n // Skip repos with git errors\n }\n }\n\n return reposWithChanges;\n}\n\n/**\n * Files to ignore\n */\nfunction shouldIgnoreFile(file: string): boolean {\n const ignoredPaths = [\n 'node_modules/',\n '.git/',\n 'dist/',\n 'build/',\n '.next/',\n '.turbo/',\n 'coverage/',\n '.cache/',\n '.temp/',\n 'tmp/',\n '.kb/analytics/',\n '.kb/cache/',\n '.kb/storage/',\n '.kb/database/',\n 'pnpm-lock.yaml',\n 'package-lock.json',\n 'yarn.lock',\n ];\n\n return ignoredPaths.some((path) => file.includes(path));\n}\n\n/**\n * Only review code files\n */\nfunction isReviewableFile(file: string): boolean {\n const reviewableExtensions = [\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.py',\n '.go',\n '.rs',\n '.java',\n '.kt',\n '.swift',\n '.rb',\n '.php',\n '.c',\n '.cpp',\n '.h',\n '.hpp',\n '.cs',\n ];\n\n return reviewableExtensions.some((ext) => file.endsWith(ext));\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kb-labs/review-core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.29.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"simple-git": "^3.25.0",
|
|
13
|
-
"@kb-labs/review-contracts": "2.
|
|
14
|
-
"@kb-labs/
|
|
15
|
-
"@kb-labs/review-
|
|
16
|
-
"@kb-labs/
|
|
13
|
+
"@kb-labs/review-contracts": "2.29.0",
|
|
14
|
+
"@kb-labs/review-heuristic": "2.29.0",
|
|
15
|
+
"@kb-labs/review-llm": "2.29.0",
|
|
16
|
+
"@kb-labs/sdk": "2.18.1"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/node": "^24.3.3",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"tsup": "^8.5.0",
|
|
22
22
|
"typescript": "^5.6.3",
|
|
23
23
|
"vitest": "^3.2.4",
|
|
24
|
-
"@kb-labs/devkit": "2.
|
|
24
|
+
"@kb-labs/devkit": "2.29.0"
|
|
25
25
|
},
|
|
26
26
|
"engines": {
|
|
27
27
|
"node": ">=20.0.0",
|