repolens-ai 2.0.0 → 2.0.1
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/cli.js +7 -6
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/paths.ts","../src/core/repoScanner.ts","../src/core/frameworkDetector.ts","../src/core/fileClassifier.ts","../src/core/architectureAnalyzer.ts","../src/core/riskDetector.ts","../src/core/contentReader.ts","../src/core/contextScorer.ts","../src/cli.ts","../src/commands/analyze.ts","../src/ai/aiClient.ts","../src/ai/promptBuilder.ts","../src/reporters/terminalReporter.ts","../src/utils/logger.ts","../src/reporters/markdownReporter.ts","../src/commands/architecture.ts","../src/commands/explain.ts","../src/commands/review.ts","../src/core/gitDiff.ts","../src/utils/masks.ts","../src/commands/risks.ts","../src/commands/onboarding.ts","../src/commands/generateAgents.ts","../src/templates/agentsTemplate.ts","../src/commands/init.ts","../src/templates/frameworkTemplates.ts","../src/commands/lint.ts","../src/commands/sync.ts","../src/core/contextSyncer.ts","../src/commands/doctor.ts","../src/commands/dashboard.ts","../src/commands/templates.ts","../src/commands/fix.ts","../src/commands/skills.ts","../src/commands/setup.ts","../src/core/smartContext.ts"],"sourcesContent":["/**\n * Default ignore patterns for repository scanning.\n * These directories/files are never sent to AI or included in analysis.\n */\nexport const DEFAULT_IGNORE_PATTERNS: string[] = [\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'vendor',\n 'storage',\n '.cache',\n '.next',\n '.nuxt',\n '.env',\n '.env.*',\n 'coverage',\n 'logs',\n '__pycache__',\n '.pytest_cache',\n '.mypy_cache',\n 'venv',\n '.venv',\n '.idea',\n '.vscode',\n '*.lock',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n 'composer.lock',\n];\n\n/**\n * Convert ignore patterns to fast-glob ignore format.\n */\nexport function getGlobIgnorePatterns(): string[] {\n return DEFAULT_IGNORE_PATTERNS.map((p) => `**/${p}/**`);\n}\n\n/**\n * Normalize a file path to use forward slashes and be relative to CWD.\n */\nexport function normalizePath(filePath: string, cwd: string): string {\n return filePath.replace(cwd, '').replace(/\\\\/g, '/').replace(/^\\//, '');\n}\n\n/**\n * Strip the user's home directory from paths for privacy.\n */\nexport function sanitizePath(filePath: string): string {\n const home = process.env.HOME || process.env.USERPROFILE || '';\n if (home) {\n return filePath.replace(home, '~');\n }\n return filePath;\n}\n","import fg from 'fast-glob';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { getGlobIgnorePatterns, normalizePath } from '../utils/paths.js';\n\nexport interface ScanResult {\n cwd: string;\n totalFiles: number;\n filesByExtension: Record<string, number>;\n fileTree: string[];\n importantFiles: string[];\n directories: string[];\n estimatedLinesOfCode: number;\n languages: string[];\n hasGit: boolean;\n hasReadme: boolean;\n hasTests: boolean;\n hasDocker: boolean;\n hasCiCd: boolean;\n}\n\nconst IMPORTANT_FILE_NAMES = [\n 'package.json',\n 'composer.json',\n 'requirements.txt',\n 'pyproject.toml',\n 'Cargo.toml',\n 'go.mod',\n 'Gemfile',\n 'Dockerfile',\n 'docker-compose.yml',\n 'docker-compose.yaml',\n 'README.md',\n 'readme.md',\n 'AGENTS.md',\n 'CONTRIBUTING.md',\n 'LICENSE',\n '.env.example',\n 'Makefile',\n 'Procfile',\n 'vercel.json',\n 'netlify.toml',\n 'next.config.js',\n 'next.config.ts',\n 'next.config.mjs',\n 'vite.config.ts',\n 'vite.config.js',\n 'nuxt.config.ts',\n 'tsconfig.json',\n 'webpack.config.js',\n 'tailwind.config.js',\n 'tailwind.config.ts',\n 'prisma/schema.prisma',\n '.github/workflows',\n '.gitlab-ci.yml',\n];\n\nconst EXTENSION_TO_LANGUAGE: Record<string, string> = {\n '.ts': 'TypeScript',\n '.tsx': 'TypeScript (React)',\n '.js': 'JavaScript',\n '.jsx': 'JavaScript (React)',\n '.mjs': 'JavaScript',\n '.py': 'Python',\n '.php': 'PHP',\n '.rb': 'Ruby',\n '.go': 'Go',\n '.rs': 'Rust',\n '.java': 'Java',\n '.kt': 'Kotlin',\n '.cs': 'C#',\n '.cpp': 'C++',\n '.c': 'C',\n '.swift': 'Swift',\n '.vue': 'Vue',\n '.svelte': 'Svelte',\n '.dart': 'Dart',\n '.sql': 'SQL',\n '.css': 'CSS',\n '.scss': 'SCSS',\n '.html': 'HTML',\n '.json': 'JSON',\n '.yaml': 'YAML',\n '.yml': 'YAML',\n '.md': 'Markdown',\n '.xml': 'XML',\n};\n\n/**\n * Scan a repository directory and collect file statistics.\n */\nexport async function scanRepository(cwd: string): Promise<ScanResult> {\n const ignorePatterns = getGlobIgnorePatterns();\n\n const files = await fg('**/*', {\n cwd,\n ignore: ignorePatterns,\n dot: false,\n onlyFiles: true,\n followSymbolicLinks: false,\n });\n\n const filesByExtension: Record<string, number> = {};\n const languagesSet = new Set<string>();\n const importantFiles: string[] = [];\n const directoriesSet = new Set<string>();\n let estimatedLines = 0;\n\n for (const file of files) {\n const ext = path.extname(file).toLowerCase();\n\n // Count by extension\n filesByExtension[ext || '(no ext)'] = (filesByExtension[ext || '(no ext)'] || 0) + 1;\n\n // Track language\n if (EXTENSION_TO_LANGUAGE[ext]) {\n languagesSet.add(EXTENSION_TO_LANGUAGE[ext]);\n }\n\n // Check important files\n const basename = path.basename(file);\n const relativePath = normalizePath(file, '');\n\n if (\n IMPORTANT_FILE_NAMES.includes(basename) ||\n IMPORTANT_FILE_NAMES.some((p) => relativePath.includes(p))\n ) {\n importantFiles.push(relativePath);\n }\n\n // Collect directories (top 2 levels)\n const parts = relativePath.split('/');\n if (parts.length > 1) {\n directoriesSet.add(parts[0]);\n if (parts.length > 2) {\n directoriesSet.add(`${parts[0]}/${parts[1]}`);\n }\n }\n\n // Estimate lines of code for code files\n const codeExtensions = ['.ts', '.tsx', '.js', '.jsx', '.py', '.php', '.rb', '.go', '.rs', '.java', '.kt', '.cs', '.vue', '.svelte'];\n if (codeExtensions.includes(ext)) {\n try {\n const fullPath = path.join(cwd, file);\n const stat = fs.statSync(fullPath);\n // Rough estimate: ~25 bytes per line of code\n estimatedLines += Math.round(stat.size / 25);\n } catch {\n // skip files that can't be read\n }\n }\n }\n\n // Check for special directories/features\n const hasGit = fs.existsSync(path.join(cwd, '.git'));\n const hasReadme = files.some((f) => f.toLowerCase().includes('readme'));\n const hasTests = files.some(\n (f) =>\n f.includes('test') ||\n f.includes('spec') ||\n f.includes('__tests__') ||\n f.includes('.test.') ||\n f.includes('.spec.')\n );\n const hasDocker = files.some(\n (f) => f.toLowerCase().includes('dockerfile') || f.toLowerCase().includes('docker-compose')\n );\n const hasCiCd = files.some(\n (f) => f.includes('.github/workflows') || f.includes('.gitlab-ci') || f.includes('Jenkinsfile')\n );\n\n return {\n cwd,\n totalFiles: files.length,\n filesByExtension,\n fileTree: files.slice(0, 200), // Cap at 200 for display\n importantFiles,\n directories: Array.from(directoriesSet).sort(),\n estimatedLinesOfCode: estimatedLines,\n languages: Array.from(languagesSet),\n hasGit,\n hasReadme,\n hasTests,\n hasDocker,\n hasCiCd,\n };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport interface FrameworkInfo {\n framework: string;\n language: string;\n packageManager: string;\n confidence: 'high' | 'medium' | 'low';\n version?: string;\n additionalFrameworks: string[];\n}\n\n/**\n * Detect the primary framework and tech stack of a project.\n */\nexport function detectFramework(cwd: string): FrameworkInfo {\n const result: FrameworkInfo = {\n framework: 'Unknown',\n language: 'Unknown',\n packageManager: 'Unknown',\n confidence: 'low',\n additionalFrameworks: [],\n };\n\n // Check for Node.js / JavaScript ecosystem\n const packageJsonPath = path.join(cwd, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n result.packageManager = 'npm';\n if (fs.existsSync(path.join(cwd, 'yarn.lock'))) result.packageManager = 'yarn';\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) result.packageManager = 'pnpm';\n if (fs.existsSync(path.join(cwd, 'bun.lockb'))) result.packageManager = 'bun';\n\n // Detect TypeScript\n const isTypeScript = allDeps?.typescript || fs.existsSync(path.join(cwd, 'tsconfig.json'));\n\n // Framework detection (order matters — most specific first)\n if (allDeps?.next) {\n result.framework = 'Next.js';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n result.version = allDeps.next;\n } else if (allDeps?.nuxt) {\n result.framework = 'Nuxt.js';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n result.version = allDeps.nuxt;\n } else if (allDeps?.['@nestjs/core']) {\n result.framework = 'NestJS';\n result.language = 'TypeScript';\n result.confidence = 'high';\n result.version = allDeps['@nestjs/core'];\n } else if (allDeps?.['@angular/core']) {\n result.framework = 'Angular';\n result.language = 'TypeScript';\n result.confidence = 'high';\n result.version = allDeps['@angular/core'];\n } else if (allDeps?.svelte || allDeps?.['@sveltejs/kit']) {\n result.framework = allDeps?.['@sveltejs/kit'] ? 'SvelteKit' : 'Svelte';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n } else if (allDeps?.vue) {\n result.framework = 'Vue.js';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n result.version = allDeps.vue;\n } else if (allDeps?.react) {\n result.framework = 'React';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n result.version = allDeps.react;\n } else if (allDeps?.express) {\n result.framework = 'Express.js';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n } else if (allDeps?.fastify) {\n result.framework = 'Fastify';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n } else if (allDeps?.hono) {\n result.framework = 'Hono';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n } else {\n result.framework = 'Node.js';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'medium';\n }\n\n // Detect additional libraries\n if (allDeps?.prisma || allDeps?.['@prisma/client']) result.additionalFrameworks.push('Prisma');\n if (allDeps?.drizzle) result.additionalFrameworks.push('Drizzle ORM');\n if (allDeps?.mongoose) result.additionalFrameworks.push('Mongoose');\n if (allDeps?.sequelize) result.additionalFrameworks.push('Sequelize');\n if (allDeps?.tailwindcss) result.additionalFrameworks.push('Tailwind CSS');\n if (allDeps?.['styled-components']) result.additionalFrameworks.push('Styled Components');\n if (allDeps?.jest) result.additionalFrameworks.push('Jest');\n if (allDeps?.vitest) result.additionalFrameworks.push('Vitest');\n if (allDeps?.playwright || allDeps?.['@playwright/test']) result.additionalFrameworks.push('Playwright');\n if (allDeps?.cypress) result.additionalFrameworks.push('Cypress');\n if (allDeps?.docker || fs.existsSync(path.join(cwd, 'Dockerfile'))) result.additionalFrameworks.push('Docker');\n if (allDeps?.supabase || allDeps?.['@supabase/supabase-js']) result.additionalFrameworks.push('Supabase');\n if (allDeps?.firebase) result.additionalFrameworks.push('Firebase');\n\n return result;\n } catch {\n // JSON parse failed, continue\n }\n }\n\n // Check for Laravel (PHP)\n const composerPath = path.join(cwd, 'composer.json');\n if (fs.existsSync(composerPath)) {\n try {\n const composer = JSON.parse(fs.readFileSync(composerPath, 'utf-8'));\n const require = composer.require || {};\n\n if (require['laravel/framework']) {\n result.framework = 'Laravel';\n result.language = 'PHP';\n result.packageManager = 'composer';\n result.confidence = 'high';\n result.version = require['laravel/framework'];\n return result;\n }\n\n result.framework = 'PHP';\n result.language = 'PHP';\n result.packageManager = 'composer';\n result.confidence = 'medium';\n return result;\n } catch {\n // continue\n }\n }\n\n // Check for Python\n const requirementsTxt = path.join(cwd, 'requirements.txt');\n const pyprojectToml = path.join(cwd, 'pyproject.toml');\n const setupPy = path.join(cwd, 'setup.py');\n\n if (fs.existsSync(pyprojectToml) || fs.existsSync(requirementsTxt) || fs.existsSync(setupPy)) {\n result.language = 'Python';\n result.packageManager = 'pip';\n result.confidence = 'medium';\n\n // Try to detect specific framework\n const reqFile = fs.existsSync(requirementsTxt)\n ? fs.readFileSync(requirementsTxt, 'utf-8')\n : '';\n\n if (reqFile.includes('fastapi') || reqFile.includes('FastAPI')) {\n result.framework = 'FastAPI';\n result.confidence = 'high';\n } else if (reqFile.includes('django') || reqFile.includes('Django')) {\n result.framework = 'Django';\n result.confidence = 'high';\n } else if (reqFile.includes('flask') || reqFile.includes('Flask')) {\n result.framework = 'Flask';\n result.confidence = 'high';\n } else {\n result.framework = 'Python';\n }\n\n return result;\n }\n\n // Check for Go\n if (fs.existsSync(path.join(cwd, 'go.mod'))) {\n result.framework = 'Go';\n result.language = 'Go';\n result.packageManager = 'go modules';\n result.confidence = 'high';\n return result;\n }\n\n // Check for Rust\n if (fs.existsSync(path.join(cwd, 'Cargo.toml'))) {\n result.framework = 'Rust';\n result.language = 'Rust';\n result.packageManager = 'cargo';\n result.confidence = 'high';\n return result;\n }\n\n // Check for Ruby / Rails\n if (fs.existsSync(path.join(cwd, 'Gemfile'))) {\n const gemfile = fs.readFileSync(path.join(cwd, 'Gemfile'), 'utf-8');\n result.language = 'Ruby';\n result.packageManager = 'bundler';\n\n if (gemfile.includes('rails')) {\n result.framework = 'Ruby on Rails';\n result.confidence = 'high';\n } else {\n result.framework = 'Ruby';\n result.confidence = 'medium';\n }\n return result;\n }\n\n // Check for Odoo\n const manifestPath = path.join(cwd, '__manifest__.py');\n if (fs.existsSync(manifestPath)) {\n result.framework = 'Odoo';\n result.language = 'Python';\n result.packageManager = 'pip';\n result.confidence = 'high';\n return result;\n }\n\n return result;\n}\n","export type FileCategory =\n | 'controller' | 'service' | 'model' | 'route' | 'view' | 'component'\n | 'test' | 'config' | 'migration' | 'middleware' | 'util' | 'type'\n | 'static' | 'documentation' | 'script' | 'command' | 'unknown';\n\nexport interface ClassifiedFile { path: string; category: FileCategory; }\n\nconst PATTERNS: [RegExp, FileCategory][] = [\n // Tests — highest priority\n [/\\.(test|spec)\\.(ts|tsx|js|jsx|py|rb|php)$/i, 'test'],\n [/__tests__\\//i, 'test'], [/\\/tests?\\//i, 'test'],\n\n // Commands / Handlers (CLI tools, bots, workers)\n [/commands?\\//i, 'command'],\n [/\\.command\\.(ts|js)$/i, 'command'],\n [/handlers?\\//i, 'command'],\n [/\\.handler\\.(ts|js)$/i, 'command'],\n\n // Controllers\n [/controllers?\\//i, 'controller'],\n [/\\.controller\\.(ts|js|py|rb|php)$/i, 'controller'],\n [/\\/Http\\/Controllers\\//i, 'controller'],\n\n // Routes / API endpoints\n [/routes?\\//i, 'route'], [/\\.routes?\\.(ts|js)$/i, 'route'],\n [/\\/app\\/api\\//i, 'route'], [/\\/pages\\/api\\//i, 'route'],\n\n // Services / Business logic\n [/services?\\//i, 'service'], [/\\.service\\.(ts|js)$/i, 'service'],\n [/\\/use-?cases?\\//i, 'service'],\n\n // Models / Entities / Schema\n [/models?\\//i, 'model'], [/\\.model\\.(ts|js)$/i, 'model'],\n [/\\/entities?\\//i, 'model'], [/prisma\\/schema\\.prisma$/i, 'model'],\n [/\\/schemas?\\//i, 'model'],\n\n // Migrations / Seeds\n [/migrations?\\//i, 'migration'], [/\\/seeds?\\//i, 'migration'],\n [/\\/seeders?\\//i, 'migration'],\n\n // Middleware\n [/middleware/i, 'middleware'],\n\n // Views / Pages\n [/views?\\//i, 'view'], [/\\/pages\\//i, 'view'],\n [/\\/app\\/.*page\\.(tsx|jsx)$/i, 'view'], [/\\.blade\\.php$/i, 'view'],\n [/\\/app\\/.*layout\\.(tsx|jsx)$/i, 'view'],\n\n // Components / UI\n [/components?\\//i, 'component'], [/\\/ui\\//i, 'component'],\n [/\\/widgets?\\//i, 'component'],\n\n // Types / Interfaces\n [/types?\\//i, 'type'], [/\\.d\\.ts$/i, 'type'],\n [/interfaces?\\//i, 'type'],\n\n // Utilities / Helpers / Lib\n [/utils?\\//i, 'util'], [/helpers?\\//i, 'util'], [/lib\\//i, 'util'],\n\n // Core modules (engines, analyzers, detectors)\n [/core\\//i, 'service'],\n [/engines?\\//i, 'service'],\n\n // AI / ML modules\n [/\\/ai\\//i, 'service'],\n [/\\/ml\\//i, 'service'],\n\n // Reporters / Output\n [/reporters?\\//i, 'util'],\n [/formatters?\\//i, 'util'],\n\n // Templates\n [/templates?\\//i, 'util'],\n\n // Config\n [/config\\//i, 'config'], [/\\.config\\.(ts|js|mjs|cjs|json)$/i, 'config'],\n [/tsconfig/i, 'config'], [/\\.eslintrc/i, 'config'], [/\\.prettierrc/i, 'config'],\n\n // Documentation\n [/\\.md$/i, 'documentation'], [/docs?\\//i, 'documentation'],\n\n // Scripts\n [/scripts?\\//i, 'script'], [/Makefile$/i, 'script'],\n\n // Static assets\n [/public\\//i, 'static'], [/static\\//i, 'static'],\n [/assets?\\//i, 'static'],\n [/\\.(png|jpg|jpeg|gif|svg|ico|webp|mp4|woff2?|ttf|eot)$/i, 'static'],\n];\n\nexport function classifyFile(filePath: string): FileCategory {\n const p = filePath.replace(/\\\\/g, '/');\n for (const [re, cat] of PATTERNS) { if (re.test(p)) return cat; }\n return 'unknown';\n}\n\nexport function classifyFiles(files: string[]) {\n const byCategory = Object.fromEntries(\n (['controller','service','model','route','view','component','test','config',\n 'migration','middleware','util','type','static','documentation','script',\n 'command','unknown'] as FileCategory[])\n .map(c => [c, [] as string[]])\n ) as Record<FileCategory, string[]>;\n const classified: ClassifiedFile[] = [];\n for (const f of files) {\n const cat = classifyFile(f);\n classified.push({ path: f, category: cat });\n byCategory[cat].push(f);\n }\n return { classified, byCategory };\n}\n","import type { FileCategory } from './fileClassifier.js';\n\nexport interface ArchitectureResult {\n style: string;\n layers: { name: string; files: number; examples: string[] }[];\n dataFlow: string[];\n weakPoints: string[];\n suggestions: string[];\n}\n\n/**\n * Infer architecture from classified file categories.\n */\nexport function analyzeArchitecture(\n byCategory: Record<FileCategory, string[]>,\n framework: string,\n): ArchitectureResult {\n const layers: ArchitectureResult['layers'] = [];\n\n const layerMap: [string, FileCategory[]][] = [\n ['Presentation / UI', ['view', 'component']],\n ['Routing', ['route']],\n ['Commands / Handlers', ['command']],\n ['Controllers / Handlers', ['controller']],\n ['Middleware', ['middleware']],\n ['Business Logic / Services', ['service']],\n ['Data / Models', ['model']],\n ['Database / Migrations', ['migration']],\n ['Utilities / Helpers', ['util', 'type']],\n ['Configuration', ['config']],\n ['Testing', ['test']],\n ['Static Assets', ['static']],\n ['Documentation', ['documentation']],\n ];\n\n for (const [name, categories] of layerMap) {\n const files = categories.flatMap((c) => byCategory[c] || []);\n if (files.length > 0) {\n layers.push({\n name,\n files: files.length,\n examples: files.slice(0, 3),\n });\n }\n }\n\n // Detect architecture style\n const style = detectStyle(byCategory, framework);\n const dataFlow = inferDataFlow(byCategory, framework);\n const weakPoints = findWeakPoints(byCategory);\n const suggestions = generateSuggestions(byCategory, framework);\n\n return { style, layers, dataFlow, weakPoints, suggestions };\n}\n\nfunction detectStyle(cats: Record<FileCategory, string[]>, fw: string): string {\n const hasControllers = cats.controller.length > 0;\n const hasCommands = (cats.command?.length || 0) > 0;\n const hasServices = cats.service.length > 0;\n const hasModels = cats.model.length > 0;\n const hasViews = cats.view.length > 0 || cats.component.length > 0;\n const hasRoutes = cats.route.length > 0;\n\n // CLI tool pattern\n if (hasCommands && hasServices && !hasControllers && !hasRoutes) {\n return 'Modular CLI Architecture (Commands → Core Services → Utilities)';\n }\n if (hasCommands && !hasControllers && !hasRoutes) {\n return 'Command-based Architecture';\n }\n\n // Web patterns\n if (hasControllers && hasModels && hasViews) {\n return hasServices ? 'MVC + Service Layer' : 'MVC (Model-View-Controller)';\n }\n if (hasRoutes && hasServices && hasModels) {\n return 'Layered Architecture (Route → Service → Model)';\n }\n if (hasViews && hasRoutes && !hasControllers) {\n if (fw.includes('Next') || fw.includes('Nuxt') || fw.includes('Svelte')) {\n return 'File-based Routing (Fullstack Framework)';\n }\n return 'Component-based Architecture';\n }\n if (hasControllers && hasServices) {\n return 'Layered Architecture';\n }\n if (cats.component.length > 5) {\n return 'Component-based Architecture';\n }\n\n // General modular structure\n if (hasServices && cats.util.length > 0) {\n return 'Modular Architecture (Services → Utilities)';\n }\n\n return 'Flat / Script-based Structure';\n}\n\nfunction inferDataFlow(cats: Record<FileCategory, string[]>, fw: string): string[] {\n const flow: string[] = [];\n\n // CLI flow\n const hasCommands = (cats.command?.length || 0) > 0;\n if (hasCommands) {\n flow.push('CLI Input → Commands');\n if (cats.service.length > 0) flow.push('Commands → Core Services');\n if (cats.util.length > 0) flow.push('Services → Utilities');\n flow.push('Output → Terminal / Report');\n return flow;\n }\n\n // Web flow\n if (cats.route.length > 0) flow.push('Client Request → Routes');\n if (cats.middleware.length > 0) flow.push('Routes → Middleware');\n if (cats.controller.length > 0) flow.push('Middleware → Controllers');\n else if (cats.route.length > 0) flow.push('Routes → Handlers');\n if (cats.service.length > 0) flow.push('Controllers → Services');\n if (cats.model.length > 0) flow.push('Services → Models → Database');\n if (cats.view.length > 0 || cats.component.length > 0) {\n flow.push('Data → Views/Components → UI');\n }\n if (flow.length === 0) flow.push('Simple file-based execution');\n return flow;\n}\n\nfunction findWeakPoints(cats: Record<FileCategory, string[]>): string[] {\n const points: string[] = [];\n if (cats.test.length === 0) points.push('No test files detected — code quality is unverified');\n if (cats.middleware.length === 0 && cats.controller.length > 0) {\n points.push('No middleware layer — auth/validation may be missing');\n }\n if (cats.service.length === 0 && cats.controller.length > 3) {\n points.push('Controllers without service layer — business logic may be coupled to HTTP layer');\n }\n if (cats.type.length === 0 && (cats.controller.length + cats.service.length + (cats.command?.length || 0)) > 5) {\n points.push('No type definitions — lack of type safety');\n }\n if (cats.config.length === 0) points.push('No explicit configuration files found');\n if (cats.documentation.length === 0) points.push('No documentation found');\n return points;\n}\n\nfunction generateSuggestions(cats: Record<FileCategory, string[]>, fw: string): string[] {\n const s: string[] = [];\n if (cats.test.length === 0) s.push('Add unit tests for critical business logic');\n if (cats.middleware.length === 0 && cats.controller.length > 0) {\n s.push('Consider adding auth and validation middleware');\n }\n if (cats.service.length === 0 && cats.controller.length > 2) {\n s.push('Extract business logic into service classes');\n }\n if (cats.type.length === 0) s.push('Add TypeScript interfaces or type definitions');\n if (cats.documentation.length < 2) s.push('Add README and API documentation');\n if (cats.migration.length === 0 && cats.model.length > 0) {\n s.push('Consider using database migrations for schema management');\n }\n return s;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport fg from 'fast-glob';\nimport { getGlobIgnorePatterns } from '../utils/paths.js';\n\nexport interface RiskItem {\n level: 'high' | 'medium' | 'low';\n category: 'security' | 'architecture' | 'maintainability' | 'testing';\n message: string;\n file?: string;\n line?: number;\n}\n\nexport interface RiskReport {\n risks: RiskItem[];\n summary: { high: number; medium: number; low: number };\n}\n\nconst DANGEROUS_PATTERNS: { pattern: RegExp; message: string; level: RiskItem['level']; category: RiskItem['category'] }[] = [\n { pattern: /(?:^|[;\\s])eval\\s*\\(/gm, message: 'eval() usage detected — potential code injection', level: 'high', category: 'security' },\n { pattern: /(?:^|[;\\s])(?:child_process|cp).*exec\\s*\\(/gm, message: 'exec() usage — possible command injection', level: 'medium', category: 'security' },\n { pattern: /(?:^|[;\\s])shell_exec\\s*\\(/gm, message: 'shell_exec() usage — command injection risk', level: 'high', category: 'security' },\n { pattern: /(?:SELECT|INSERT|UPDATE|DELETE|DROP)\\s+.*(?:FROM|INTO|TABLE)\\s/gi, message: 'Raw SQL detected — use parameterized queries', level: 'medium', category: 'security' },\n { pattern: /(?:api[_-]?key|secret[_-]?key|access[_-]?token)\\s*[:=]\\s*[\"'][a-zA-Z0-9]{8,}/gi, message: 'Hardcoded API key or secret', level: 'high', category: 'security' },\n { pattern: /sk-[a-zA-Z0-9]{20,}/g, message: 'OpenAI API key detected in source', level: 'high', category: 'security' },\n { pattern: /AKIA[0-9A-Z]{16}/g, message: 'AWS access key detected in source', level: 'high', category: 'security' },\n { pattern: /(?:TODO|FIXME|HACK|XXX|BUG)\\b/gi, message: 'TODO/FIXME marker found', level: 'low', category: 'maintainability' },\n { pattern: /(?:password|passwd)\\s*[:=]\\s*[\"'][^\"']+[\"']/gi, message: 'Hardcoded password detected', level: 'high', category: 'security' },\n];\n\n/** Files that are part of RepoLens itself — skip to avoid false positives */\nconst SELF_SKIP_PATTERNS = ['riskDetector', 'privacyFilter', 'masks', 'agentsTemplate', 'contextScorer', 'contentReader'];\n\nconst CODE_EXTENSIONS = ['.ts','.tsx','.js','.jsx','.py','.php','.rb','.go','.rs','.java','.kt','.cs','.vue','.svelte'];\n\n/**\n * Scan repository for risky patterns.\n */\nexport async function detectRisks(cwd: string): Promise<RiskReport> {\n const risks: RiskItem[] = [];\n const ignore = getGlobIgnorePatterns();\n\n // 1. Check for .env files\n const envFiles = await fg('**/.env*', { cwd, ignore, dot: true });\n for (const f of envFiles) {\n if (!f.endsWith('.example') && !f.endsWith('.sample')) {\n risks.push({ level: 'high', category: 'security', message: `.env file found — may contain secrets`, file: f });\n }\n }\n\n // 2. Check for missing README\n const readmes = await fg('**/README*', { cwd, ignore, caseSensitiveMatch: false });\n if (readmes.length === 0) {\n risks.push({ level: 'medium', category: 'maintainability', message: 'No README file found' });\n }\n\n // 3. Check for missing tests\n const tests = await fg('**/*.{test,spec}.{ts,tsx,js,jsx,py,rb,php}', { cwd, ignore });\n const testDirs = await fg('**/tests/**', { cwd, ignore });\n if (tests.length === 0 && testDirs.length === 0) {\n risks.push({ level: 'medium', category: 'testing', message: 'No test files found in project' });\n }\n\n // 4. Scan code files for dangerous patterns\n const codeFiles = await fg('**/*', { cwd, ignore, onlyFiles: true });\n for (const file of codeFiles) {\n const ext = path.extname(file).toLowerCase();\n if (!CODE_EXTENSIONS.includes(ext)) continue;\n\n // Skip RepoLens own files to avoid false positives from pattern definitions\n if (SELF_SKIP_PATTERNS.some(p => file.includes(p))) continue;\n\n try {\n const fullPath = path.join(cwd, file);\n const stat = fs.statSync(fullPath);\n\n // Large file check\n const lineEstimate = Math.round(stat.size / 25);\n if (lineEstimate > 500 && (file.includes('controller') || file.includes('Controller'))) {\n risks.push({ level: 'medium', category: 'architecture', message: `Large controller file (~${lineEstimate} lines)`, file });\n }\n\n // Only scan files under 100KB for patterns\n if (stat.size > 100_000) continue;\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n for (const { pattern, message, level, category } of DANGEROUS_PATTERNS) {\n pattern.lastIndex = 0;\n if (pattern.test(content)) {\n risks.push({ level, category, message, file });\n }\n }\n } catch {\n // skip unreadable files\n }\n }\n\n const summary = {\n high: risks.filter(r => r.level === 'high').length,\n medium: risks.filter(r => r.level === 'medium').length,\n low: risks.filter(r => r.level === 'low').length,\n };\n\n return { risks, summary };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport fg from 'fast-glob';\nimport { getGlobIgnorePatterns } from '../utils/paths.js';\n\n/**\n * Content-aware file reader.\n * Actually reads file contents to extract meaningful information,\n * instead of just relying on filenames.\n */\n\nexport interface FileContent {\n path: string;\n content: string;\n lines: number;\n imports: string[];\n exports: string[];\n functions: string[];\n classes: string[];\n comments: string[];\n todoFixmes: { line: number; text: string }[];\n}\n\nexport interface ContentSummary {\n totalLinesOfCode: number;\n totalComments: number;\n totalFunctions: number;\n totalClasses: number;\n totalImports: number;\n totalExports: number;\n totalTodoFixmes: number;\n averageFileSize: number;\n largestFiles: { path: string; lines: number }[];\n mostConnected: { path: string; imports: number }[];\n}\n\nconst CODE_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',\n '.py', '.php', '.rb', '.go', '.rs', '.java', '.kt',\n '.cs', '.cpp', '.c', '.swift', '.vue', '.svelte', '.dart',\n]);\n\nconst MAX_FILE_SIZE = 200_000; // 200KB max per file\nconst MAX_FILES_TO_READ = 500; // Cap for large repos\n\n/**\n * Read and analyze content of code files in a repository.\n */\nexport async function readCodeContents(cwd: string): Promise<FileContent[]> {\n const ignore = getGlobIgnorePatterns();\n const files = await fg('**/*', {\n cwd,\n ignore,\n onlyFiles: true,\n dot: false,\n followSymbolicLinks: false,\n });\n\n const codeFiles = files.filter((f) => {\n const ext = path.extname(f).toLowerCase();\n return CODE_EXTENSIONS.has(ext);\n });\n\n const results: FileContent[] = [];\n\n for (const file of codeFiles.slice(0, MAX_FILES_TO_READ)) {\n try {\n const fullPath = path.join(cwd, file);\n const stat = fs.statSync(fullPath);\n if (stat.size > MAX_FILE_SIZE) continue;\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n const parsed = parseFileContent(file, content);\n results.push(parsed);\n } catch {\n // Skip unreadable files\n }\n }\n\n return results;\n}\n\n/**\n * Parse a single file's content to extract structural information.\n */\nfunction parseFileContent(filePath: string, content: string): FileContent {\n const lines = content.split('\\n');\n const ext = path.extname(filePath).toLowerCase();\n\n const result: FileContent = {\n path: filePath,\n content: content.substring(0, 10_000), // Keep first 10KB for context\n lines: lines.length,\n imports: [],\n exports: [],\n functions: [],\n classes: [],\n comments: [],\n todoFixmes: [],\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n\n // Extract imports\n if (/^import\\s/.test(line) || /^from\\s/.test(line) || /require\\(/.test(line)) {\n result.imports.push(line);\n }\n\n // Extract exports\n if (/^export\\s/.test(line)) {\n result.exports.push(line.substring(0, 100));\n }\n\n // Extract function declarations\n const funcMatch = line.match(\n /(?:export\\s+)?(?:async\\s+)?(?:function\\s+(\\w+)|(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?(?:\\(|=>))/\n );\n if (funcMatch) {\n result.functions.push(funcMatch[1] || funcMatch[2]);\n }\n\n // Extract class declarations\n const classMatch = line.match(/(?:export\\s+)?class\\s+(\\w+)/);\n if (classMatch) {\n result.classes.push(classMatch[1]);\n }\n\n // Extract single-line comments\n if (/^\\/\\//.test(line) || /^#(?!!)/.test(line)) {\n result.comments.push(line);\n }\n\n // Extract TODO/FIXME — only match actual comment markers\n // Must be preceded by comment syntax (// or # or *) to avoid false positives\n if (/(?:\\/\\/|#|^\\s*\\*)\\s*/.test(line)) {\n const todoMatch = line.match(/(?:\\/\\/|#|\\*)\\s*(TODO|FIXME|HACK|XXX|BUG)[\\s:]+(.+)/i);\n if (todoMatch) {\n result.todoFixmes.push({ line: i + 1, text: `${todoMatch[1]}: ${todoMatch[2].trim()}` });\n }\n }\n\n // Python function/class detection\n if (ext === '.py') {\n const pyFuncMatch = line.match(/^(?:async\\s+)?def\\s+(\\w+)/);\n if (pyFuncMatch) result.functions.push(pyFuncMatch[1]);\n const pyClassMatch = line.match(/^class\\s+(\\w+)/);\n if (pyClassMatch) result.classes.push(pyClassMatch[1]);\n }\n\n // Go function detection\n if (ext === '.go') {\n const goFuncMatch = line.match(/^func\\s+(?:\\(.*?\\)\\s+)?(\\w+)/);\n if (goFuncMatch) result.functions.push(goFuncMatch[1]);\n }\n\n // Rust function detection\n if (ext === '.rs') {\n const rsFuncMatch = line.match(/^(?:pub\\s+)?(?:async\\s+)?fn\\s+(\\w+)/);\n if (rsFuncMatch) result.functions.push(rsFuncMatch[1]);\n }\n }\n\n return result;\n}\n\n/**\n * Summarize content analysis results.\n */\nexport function summarizeContents(files: FileContent[]): ContentSummary {\n const totalLinesOfCode = files.reduce((s, f) => s + f.lines, 0);\n const totalComments = files.reduce((s, f) => s + f.comments.length, 0);\n const totalFunctions = files.reduce((s, f) => s + f.functions.length, 0);\n const totalClasses = files.reduce((s, f) => s + f.classes.length, 0);\n const totalImports = files.reduce((s, f) => s + f.imports.length, 0);\n const totalExports = files.reduce((s, f) => s + f.exports.length, 0);\n const totalTodoFixmes = files.reduce((s, f) => s + f.todoFixmes.length, 0);\n\n const largestFiles = [...files]\n .sort((a, b) => b.lines - a.lines)\n .slice(0, 10)\n .map((f) => ({ path: f.path, lines: f.lines }));\n\n const mostConnected = [...files]\n .sort((a, b) => b.imports.length - a.imports.length)\n .slice(0, 10)\n .map((f) => ({ path: f.path, imports: f.imports.length }));\n\n return {\n totalLinesOfCode,\n totalComments,\n totalFunctions,\n totalClasses,\n totalImports,\n totalExports,\n totalTodoFixmes,\n averageFileSize: files.length > 0 ? Math.round(totalLinesOfCode / files.length) : 0,\n largestFiles,\n mostConnected,\n };\n}\n\n/**\n * Find files related to a topic by searching content, not just filenames.\n */\nexport function findRelatedByContent(\n files: FileContent[],\n topic: string,\n): FileContent[] {\n const topicLower = topic.toLowerCase();\n const scored = files.map((f) => {\n let score = 0;\n const pathLower = f.path.toLowerCase();\n\n // Path match (weight: 3)\n if (pathLower.includes(topicLower)) score += 3;\n\n // Function name match (weight: 2)\n if (f.functions.some((fn) => fn.toLowerCase().includes(topicLower))) score += 2;\n\n // Class name match (weight: 2)\n if (f.classes.some((cls) => cls.toLowerCase().includes(topicLower))) score += 2;\n\n // Import match (weight: 1)\n if (f.imports.some((imp) => imp.toLowerCase().includes(topicLower))) score += 1;\n\n // Content match (weight: 1)\n if (f.content.toLowerCase().includes(topicLower)) score += 1;\n\n return { file: f, score };\n });\n\n return scored\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .map((s) => s.file);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Context Quality Scorer — Evaluate the effectiveness of AI context files.\n * Based on research: auto-generated generic rules REDUCE agent performance.\n * Hand-curated tribal knowledge INCREASES performance.\n */\n\nexport interface ContextFile {\n type: 'agents' | 'claude' | 'cursorrules' | 'copilot' | 'skill' | 'unknown';\n path: string;\n content: string;\n exists: boolean;\n}\n\nexport interface ScoreResult {\n overall: number;\n breakdown: {\n specificity: number;\n coverage: number;\n conciseness: number;\n freshness: number;\n tribalKnowledge: number;\n };\n issues: ScoreIssue[];\n suggestions: string[];\n genericRulesCount: number;\n specificRulesCount: number;\n totalLines: number;\n}\n\nexport interface ScoreIssue {\n severity: 'error' | 'warning' | 'info';\n message: string;\n line?: number;\n fix?: string;\n}\n\nconst GENERIC_PATTERNS: { pattern: RegExp; description: string }[] = [\n { pattern: /never\\s+commit\\s+secrets?/i, description: 'Generic: \"Never commit secrets\"' },\n { pattern: /validate\\s+all\\s+input/i, description: 'Generic: \"Validate all input\"' },\n { pattern: /no\\s+eval\\(\\)/i, description: 'Generic: \"No eval()\"' },\n { pattern: /never\\s+trust\\s+user\\s+input/i, description: 'Generic: \"Never trust user input\"' },\n { pattern: /use\\s+parameterized\\s+queries/i, description: 'Generic: \"Use parameterized queries\"' },\n { pattern: /follow\\s+\\w+\\s+conventions/i, description: 'Generic: \"Follow X conventions\"' },\n { pattern: /keep\\s+files?\\s+focused/i, description: 'Generic: \"Keep files focused\"' },\n { pattern: /minimal\\s+safe\\s+changes/i, description: 'Generic: \"Minimal safe changes\"' },\n { pattern: /analyze\\s+before\\s+editing/i, description: 'Generic: \"Analyze before editing\"' },\n { pattern: /no\\s+unnecessary\\s+rewrites/i, description: 'Generic: \"No unnecessary rewrites\"' },\n { pattern: /protect\\s+\\.?env\\s+files?/i, description: 'Generic: \"Protect .env files\"' },\n { pattern: /preserve\\s+auth\\s+middleware/i, description: 'Generic: \"Preserve auth middleware\"' },\n { pattern: /summarize\\s+all\\s+changes/i, description: 'Generic: \"Summarize changes\"' },\n { pattern: /read\\s+relevant\\s+files?\\s+before/i, description: 'Generic: \"Read files before editing\"' },\n];\n\nconst TRIBAL_KNOWLEDGE_PATTERNS: { pattern: RegExp; description: string }[] = [\n { pattern: /(?:always|never|must)\\s+use\\s+`[^`]+`/i, description: 'Specific tool/command' },\n { pattern: /because\\s+.{10,}/i, description: 'Explains reasoning' },\n { pattern: /(?:gotcha|caveat|watch\\s+out|careful|beware|pitfall)/i, description: 'Gotcha/pitfall' },\n { pattern: /(?:instead\\s+of|don'?t\\s+use\\s+`[^`]+`.*use\\s+`[^`]+`)/i, description: 'Specific alternative' },\n { pattern: /(?:bug|workaround|hack)\\s+(?:in|for|with)\\s+/i, description: 'Known bug/workaround' },\n { pattern: /(?:we|this\\s+project)\\s+(?:chose|decided|prefer)/i, description: 'Architecture decision' },\n { pattern: /(?:npm|yarn|pnpm)\\s+run\\s+\\w+/i, description: 'Specific command' },\n { pattern: /\\b(?:port|timeout|limit|threshold)\\s*[:=]\\s*\\d+/i, description: 'Config value' },\n { pattern: /(?:breaking\\s+change|deprecated|legacy)\\s+/i, description: 'Migration note' },\n { pattern: /(?:file|module|directory)\\s+`[^`]+`/i, description: 'References specific file' },\n];\n\nconst COVERAGE_AREAS = [\n { area: 'Tech Stack', patterns: [/framework|stack|language|typescript|python|react|next/i] },\n { area: 'Build Commands', patterns: [/npm\\s+run|yarn|pnpm|build|dev|test|lint/i] },\n { area: 'Architecture', patterns: [/architecture|pattern|structure|layer|module/i] },\n { area: 'Testing', patterns: [/test|spec|jest|vitest|pytest/i] },\n { area: 'File Structure', patterns: [/directory|folder|src\\/|app\\//i] },\n { area: 'Gotchas', patterns: [/gotcha|caveat|pitfall|watch\\s+out|known\\s+issue/i] },\n { area: 'Conventions', patterns: [/convention|naming|style|format/i] },\n { area: 'Dependencies', patterns: [/dependency|package|library|import/i] },\n];\n\n/**\n * Detect all AI context files in a repository.\n */\nexport function detectContextFiles(cwd: string): ContextFile[] {\n const contextFileMap: { type: ContextFile['type']; paths: string[] }[] = [\n { type: 'agents', paths: ['AGENTS.md', 'agents.md'] },\n { type: 'claude', paths: ['CLAUDE.md', 'claude.md', 'CODEX.md'] },\n { type: 'cursorrules', paths: ['.cursorrules'] },\n { type: 'copilot', paths: ['.github/copilot-instructions.md'] },\n ];\n\n const results: ContextFile[] = [];\n\n for (const { type, paths: filePaths } of contextFileMap) {\n let found = false;\n for (const p of filePaths) {\n const fullPath = path.join(cwd, p);\n if (fs.existsSync(fullPath)) {\n try {\n const content = fs.readFileSync(fullPath, 'utf-8');\n results.push({ type, path: p, content, exists: true });\n found = true;\n break;\n } catch { /* skip */ }\n }\n }\n if (!found) {\n results.push({ type, path: filePaths[0], content: '', exists: false });\n }\n }\n\n // Check for .cursor/rules/*.mdc files\n const mdcDir = path.join(cwd, '.cursor', 'rules');\n if (fs.existsSync(mdcDir)) {\n try {\n const mdcFiles = fs.readdirSync(mdcDir).filter((f) => f.endsWith('.mdc'));\n for (const mf of mdcFiles) {\n const content = fs.readFileSync(path.join(mdcDir, mf), 'utf-8');\n results.push({ type: 'cursorrules', path: `.cursor/rules/${mf}`, content, exists: true });\n }\n } catch { /* skip */ }\n }\n\n // Check for .windsurfrules\n const windsurfPath = path.join(cwd, '.windsurfrules');\n if (fs.existsSync(windsurfPath)) {\n try {\n const content = fs.readFileSync(windsurfPath, 'utf-8');\n results.push({ type: 'cursorrules', path: '.windsurfrules', content, exists: true });\n } catch { /* skip */ }\n }\n\n // Check for SKILL.md files\n const skillPaths = ['.cursor/skills', '.skills', 'skills'];\n for (const sp of skillPaths) {\n const skillDir = path.join(cwd, sp);\n if (fs.existsSync(skillDir)) {\n try {\n const stat = fs.statSync(skillDir);\n if (stat.isDirectory()) {\n const skillFiles = fs.readdirSync(skillDir).filter((f) => f.endsWith('.md'));\n for (const sf of skillFiles) {\n const content = fs.readFileSync(path.join(skillDir, sf), 'utf-8');\n results.push({ type: 'skill', path: `${sp}/${sf}`, content, exists: true });\n }\n }\n } catch { /* skip */ }\n }\n }\n\n return results;\n}\n\n/**\n * Score the quality of a context file.\n */\nexport function scoreContextFile(content: string, projectFiles?: string[]): ScoreResult {\n const lines = content.split('\\n');\n const issues: ScoreIssue[] = [];\n const suggestions: string[] = [];\n let genericCount = 0;\n let specificCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n for (const { pattern, description } of GENERIC_PATTERNS) {\n pattern.lastIndex = 0;\n if (pattern.test(line)) {\n genericCount++;\n issues.push({ severity: 'warning', message: description, line: i + 1,\n fix: 'Replace with a project-specific version of this rule' });\n }\n }\n for (const { pattern } of TRIBAL_KNOWLEDGE_PATTERNS) {\n pattern.lastIndex = 0;\n if (pattern.test(line)) specificCount++;\n }\n }\n\n const totalRules = genericCount + specificCount;\n const specificityScore = totalRules > 0 ? Math.round((specificCount / totalRules) * 100) : 0;\n\n let coveredAreas = 0;\n for (const { area, patterns } of COVERAGE_AREAS) {\n const covered = patterns.some((p) => { p.lastIndex = 0; return p.test(content); });\n if (covered) coveredAreas++;\n else suggestions.push(`Add section about: ${area}`);\n }\n const coverageScore = Math.round((coveredAreas / COVERAGE_AREAS.length) * 100);\n\n const nonEmptyLines = lines.filter((l) => l.trim().length > 0).length;\n let concisenessScore: number;\n if (nonEmptyLines <= 150) concisenessScore = 100;\n else if (nonEmptyLines <= 300) concisenessScore = 80;\n else if (nonEmptyLines <= 500) { concisenessScore = 50;\n issues.push({ severity: 'warning', message: `File is ${nonEmptyLines} lines — trim to under 200` });\n } else { concisenessScore = 20;\n issues.push({ severity: 'error', message: `File is ${nonEmptyLines} lines — will overwhelm AI agents`,\n fix: 'Split into hierarchical context files' });\n }\n\n let freshnessScore = 50;\n if (projectFiles && projectFiles.length > 0) {\n const refed = projectFiles.filter((f) => content.includes(path.basename(f)));\n freshnessScore = Math.round((refed.length / Math.min(projectFiles.length, 20)) * 100);\n if (freshnessScore < 10) {\n issues.push({ severity: 'warning', message: 'Context file references very few project files — may be outdated' });\n }\n }\n\n let tribalCount = 0;\n for (const { pattern } of TRIBAL_KNOWLEDGE_PATTERNS) {\n const globalPattern = new RegExp(pattern.source, 'gi');\n const matches = content.match(globalPattern);\n if (matches) tribalCount += matches.length;\n }\n const tribalKnowledgeScore = Math.min(100, tribalCount * 15);\n if (tribalCount === 0) {\n issues.push({ severity: 'error', message: 'No tribal knowledge detected — only inferable info',\n fix: 'Add gotchas, architecture decisions, specific commands' });\n }\n\n if (content.length === 0) issues.push({ severity: 'error', message: 'Context file is empty' });\n if (genericCount > 5) suggestions.push(`Remove ${genericCount} generic rules that hurt agent performance`);\n\n const overall = Math.round(\n specificityScore * 0.30 + coverageScore * 0.20 + concisenessScore * 0.15 +\n freshnessScore * 0.15 + tribalKnowledgeScore * 0.20\n );\n\n return { overall, breakdown: { specificity: specificityScore, coverage: coverageScore,\n conciseness: concisenessScore, freshness: freshnessScore, tribalKnowledge: tribalKnowledgeScore },\n issues, suggestions, genericRulesCount: genericCount,\n specificRulesCount: specificCount, totalLines: nonEmptyLines };\n}\n\nexport function getGrade(score: number): string {\n if (score >= 90) return 'A+';\n if (score >= 80) return 'A';\n if (score >= 70) return 'B';\n if (score >= 60) return 'C';\n if (score >= 50) return 'D';\n return 'F';\n}\n\nexport function getScoreColor(score: number): 'green' | 'yellow' | 'red' {\n if (score >= 70) return 'green';\n if (score >= 40) return 'yellow';\n return 'red';\n}\n","import { Command } from 'commander';\nimport { analyzeCommand } from './commands/analyze.js';\nimport { architectureCommand } from './commands/architecture.js';\nimport { explainCommand } from './commands/explain.js';\nimport { reviewCommand } from './commands/review.js';\nimport { risksCommand } from './commands/risks.js';\nimport { onboardingCommand } from './commands/onboarding.js';\nimport { generateAgentsCommand } from './commands/generateAgents.js';\nimport { initCommand } from './commands/init.js';\nimport { lintCommand } from './commands/lint.js';\nimport { syncCommand } from './commands/sync.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { templatesCommand } from './commands/templates.js';\nimport { fixCommand } from './commands/fix.js';\nimport { skillsCommand } from './commands/skills.js';\nimport { setupCommand } from './commands/setup.js';\n\nconst program = new Command();\n\nprogram\n .name('repolens')\n .description('🔍 RepoLens AI — AI Context Intelligence for Vibe Coders\\n\\n Quick start: repolens setup\\n Score check: repolens lint\\n Dashboard: repolens dashboard')\n .version('2.0.0');\n\n// ─── THE ONE COMMAND ───────────────────────────────────\n// This is what 90% of users need. Everything else is optional.\n\nprogram\n .command('setup')\n .description('⭐ One-click setup — creates AGENTS.md + syncs to 6 AI tools + generates skills')\n .action(async () => {\n await setupCommand();\n });\n\n// ─── CORE COMMANDS ─────────────────────────────────────\n// For users who want more control.\n\nprogram\n .command('init')\n .description('Create AGENTS.md through interactive interview')\n .option('-y, --yes', 'Non-interactive mode')\n .action(async (options) => {\n await initCommand({ yes: options.yes });\n });\n\nprogram\n .command('lint')\n .alias('score')\n .description('Score your AI context files (0-100)')\n .action(async () => {\n await lintCommand();\n });\n\nprogram\n .command('sync')\n .description('Sync AGENTS.md → 6 AI tools (Cursor, Claude, Copilot, Windsurf, Codex)')\n .option('--force', 'Overwrite files with manual edits')\n .option('--dry-run', 'Preview without writing')\n .action(async (options) => {\n await syncCommand({ force: options.force, dryRun: options.dryRun });\n });\n\nprogram\n .command('fix')\n .description('Auto-fix issues in context files')\n .option('--dry-run', 'Preview fixes')\n .action(async (options) => {\n await fixCommand({ dryRun: options.dryRun });\n });\n\nprogram\n .command('templates')\n .alias('tpl')\n .description('Browse & apply framework templates (Next.js, React, Django, etc.)')\n .option('-s, --search <query>', 'Search templates')\n .option('-a, --apply <id>', 'Apply a template')\n .action(async (options) => {\n await templatesCommand({ search: options.search, apply: options.apply, list: !options.search && !options.apply });\n });\n\nprogram\n .command('skills')\n .description('Generate .cursor/skills/ for common tasks')\n .option('-l, --list', 'List available skills')\n .option('-a, --all', 'Generate all relevant skills')\n .action(async (options) => {\n await skillsCommand({ list: options.list, all: options.all });\n });\n\nprogram\n .command('doctor')\n .alias('check')\n .description('Health check for your AI dev setup')\n .action(async () => {\n await doctorCommand();\n });\n\nprogram\n .command('dashboard')\n .alias('ui')\n .description('Visual web dashboard (localhost)')\n .option('-p, --port <number>', 'Port', '3141')\n .action(async (options) => {\n await dashboardCommand({ port: parseInt(options.port, 10) });\n });\n\n// ─── ANALYSIS COMMANDS ─────────────────────────────────\n\nprogram\n .command('analyze')\n .description('Full repo analysis')\n .option('--format <type>', 'Output: terminal or md', 'terminal')\n .option('--no-ai', 'Disable AI')\n .action(async (options) => {\n await analyzeCommand({ format: options.format, ai: options.ai });\n });\n\nprogram\n .command('explain <topic>')\n .description('Explain any feature by searching code content')\n .option('--no-ai', 'Disable AI')\n .action(async (topic, options) => {\n await explainCommand(topic, { ai: options.ai });\n });\n\nprogram\n .command('review')\n .description('Review recent code changes')\n .option('--no-ai', 'Disable AI')\n .action(async (options) => {\n await reviewCommand({ ai: options.ai });\n });\n\nprogram\n .command('risks')\n .description('Security & risk scanner')\n .action(async () => {\n await risksCommand();\n });\n\nprogram\n .command('arch')\n .description('Architecture analysis')\n .option('--no-ai', 'Disable AI')\n .action(async (options) => {\n await architectureCommand({ ai: options.ai });\n });\n\nprogram\n .command('onboard')\n .description('Developer onboarding guide')\n .action(async () => {\n await onboardingCommand();\n });\n\nprogram\n .command('agents')\n .description('Generate AGENTS.md (legacy — use setup)')\n .action(async () => {\n await generateAgentsCommand();\n });\n\nprogram.parse();\n","import ora from 'ora';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { analyzeArchitecture } from '../core/architectureAnalyzer.js';\nimport { detectRisks } from '../core/riskDetector.js';\nimport { isAiAvailable, enhance } from '../ai/aiClient.js';\nimport { getSystemPrompt, buildAnalyzePrompt } from '../ai/promptBuilder.js';\nimport {\n reportBrand, reportSummary, reportFileStats, reportFolderStructure,\n reportImportantFiles, reportArchitecture, reportModules, reportRisks,\n reportWeakPoints, reportSuggestions, reportAiEnhancement,\n} from '../reporters/terminalReporter.js';\nimport { generateMarkdownReport } from '../reporters/markdownReporter.js';\nimport { logger } from '../utils/logger.js';\n\nexport async function analyzeCommand(options: { format?: string; ai?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Scanning repository...').start();\n\n try {\n // Step 1: Scan\n const scan = await scanRepository(cwd);\n spinner.text = 'Detecting framework...';\n\n // Step 2: Detect framework\n const framework = detectFramework(cwd);\n spinner.text = 'Classifying files...';\n\n // Step 3: Classify files\n const { byCategory } = classifyFiles(scan.fileTree);\n spinner.text = 'Analyzing architecture...';\n\n // Step 4: Architecture\n const architecture = analyzeArchitecture(byCategory, framework.framework);\n spinner.text = 'Scanning for risks...';\n\n // Step 5: Risk detection\n const risks = await detectRisks(cwd);\n spinner.succeed('Analysis complete');\n\n // Step 6: AI enhancement (optional)\n let aiText: string | null = null;\n if (options.ai !== false && isAiAvailable()) {\n const aiSpinner = ora('Enhancing with AI...').start();\n aiText = await enhance(\n getSystemPrompt(),\n buildAnalyzePrompt({\n framework: framework.framework,\n language: framework.language,\n totalFiles: scan.totalFiles,\n languages: scan.languages,\n directories: scan.directories,\n importantFiles: scan.importantFiles,\n architectureStyle: architecture.style,\n riskCount: risks.risks.length,\n }),\n );\n aiSpinner.succeed(aiText ? 'AI analysis complete' : 'AI unavailable, using static analysis');\n }\n\n // Output\n if (options.format === 'md') {\n const outputPath = generateMarkdownReport({\n scan, framework, architecture, risks, byCategory, aiText,\n });\n logger.success(`Report saved to ${outputPath}`);\n } else {\n reportSummary(scan, framework);\n reportFileStats(scan.filesByExtension);\n reportFolderStructure(scan.directories);\n reportImportantFiles(scan.importantFiles);\n reportArchitecture(architecture);\n reportModules(byCategory);\n reportRisks(risks);\n reportWeakPoints(architecture.weakPoints);\n reportSuggestions(architecture.suggestions);\n reportAiEnhancement(aiText);\n }\n } catch (error) {\n spinner.fail('Analysis failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import OpenAI from 'openai';\n\nlet client: OpenAI | null = null;\n\n/**\n * Check if AI is available (OPENAI_API_KEY is set).\n */\nexport function isAiAvailable(): boolean {\n return !!process.env.OPENAI_API_KEY;\n}\n\n/**\n * Get or create OpenAI client.\n */\nfunction getClient(): OpenAI {\n if (!client) {\n client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });\n }\n return client;\n}\n\n/**\n * Enhance a report with AI explanation.\n * Returns null if AI is unavailable or fails.\n */\nexport async function enhance(\n systemPrompt: string,\n userPrompt: string,\n): Promise<string | null> {\n if (!isAiAvailable()) return null;\n\n try {\n const ai = getClient();\n const response = await ai.chat.completions.create({\n model: process.env.REPOLENS_AI_MODEL || 'gpt-4o-mini',\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ],\n temperature: 0.3,\n max_tokens: 2000,\n });\n\n return response.choices[0]?.message?.content || null;\n } catch (error) {\n // Silently fail — AI is optional\n return null;\n }\n}\n","/**\n * Build prompts for AI enhancement.\n * Only sends scanned facts — never raw file contents.\n */\n\nconst SYSTEM_PROMPT = `You are a senior software engineer analyzing a codebase.\nYou provide clear, professional, actionable analysis.\nBase your analysis ONLY on the facts provided — do not invent files or features that don't exist.\nBe concise but thorough. Use bullet points.\nTone: professional, helpful, senior engineer style.`;\n\nexport function getSystemPrompt(): string {\n return SYSTEM_PROMPT;\n}\n\nexport function buildAnalyzePrompt(context: {\n framework: string;\n language: string;\n totalFiles: number;\n languages: string[];\n directories: string[];\n importantFiles: string[];\n architectureStyle: string;\n riskCount: number;\n}): string {\n return `Analyze this codebase and provide a senior-engineer-style summary.\n\nProject facts:\n- Framework: ${context.framework}\n- Language: ${context.language}\n- Total files: ${context.totalFiles}\n- Languages detected: ${context.languages.join(', ')}\n- Top-level directories: ${context.directories.join(', ')}\n- Important files: ${context.importantFiles.join(', ')}\n- Architecture style: ${context.architectureStyle}\n- Risk issues found: ${context.riskCount}\n\nProvide:\n1. A concise project summary (2-3 sentences)\n2. Architecture assessment\n3. Top 3 improvement recommendations\n4. Key risks to watch`;\n}\n\nexport function buildExplainPrompt(topic: string, relatedFiles: string[], framework: string): string {\n return `Explain the \"${topic}\" feature/module in this ${framework} project.\n\nRelated files found:\n${relatedFiles.map(f => `- ${f}`).join('\\n')}\n\nExplain:\n1. What this feature likely does\n2. How the files relate to each other\n3. The typical flow/lifecycle\n4. Potential risks or issues\n5. Improvement suggestions`;\n}\n\nexport function buildReviewPrompt(changedFiles: string[], diffStat: string, dangerCount: number): string {\n return `Review these recent code changes.\n\nChanged files:\n${changedFiles.map(f => `- ${f}`).join('\\n')}\n\nDiff stats:\n${diffStat}\n\nDangerous changes detected: ${dangerCount}\n\nProvide:\n1. Summary of what changed\n2. Risk assessment\n3. Specific concerns\n4. Recommended actions`;\n}\n","import chalk from 'chalk';\nimport { logger } from '../utils/logger.js';\nimport type { ScanResult } from '../core/repoScanner.js';\nimport type { FrameworkInfo } from '../core/frameworkDetector.js';\nimport type { ArchitectureResult } from '../core/architectureAnalyzer.js';\nimport type { RiskReport } from '../core/riskDetector.js';\nimport type { GitDiffResult } from '../core/gitDiff.js';\nimport type { FileCategory } from '../core/fileClassifier.js';\n\n/**\n * Terminal reporter — beautiful CLI output with icons and colors.\n */\n\nexport function reportBrand(): void {\n logger.brand();\n}\n\nexport function reportSummary(scan: ScanResult, fw: FrameworkInfo): void {\n logger.section('✨', 'Project Summary');\n logger.kv('Directory', scan.cwd);\n logger.kv('Framework', `${fw.framework} ${fw.version ? `(${fw.version})` : ''}`);\n logger.kv('Language', fw.language);\n logger.kv('Package Manager', fw.packageManager);\n logger.kv('Total Files', String(scan.totalFiles));\n logger.kv('Est. Lines of Code', String(scan.estimatedLinesOfCode.toLocaleString()));\n logger.kv('Languages', scan.languages.join(', ') || 'N/A');\n\n if (fw.additionalFrameworks.length > 0) {\n logger.kv('Libraries', fw.additionalFrameworks.join(', '));\n }\n\n const features: string[] = [];\n if (scan.hasGit) features.push('Git');\n if (scan.hasDocker) features.push('Docker');\n if (scan.hasCiCd) features.push('CI/CD');\n if (scan.hasTests) features.push('Tests');\n if (scan.hasReadme) features.push('README');\n logger.kv('Features', features.join(', ') || 'None detected');\n}\n\nexport function reportFileStats(filesByExt: Record<string, number>): void {\n logger.section('📊', 'File Statistics');\n const sorted = Object.entries(filesByExt)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 15);\n \n for (const [ext, count] of sorted) {\n const bar = chalk.cyan('█'.repeat(Math.min(count, 30)));\n logger.indent(`${ext.padEnd(12)} ${String(count).padStart(4)} ${bar}`);\n }\n}\n\nexport function reportFolderStructure(directories: string[]): void {\n logger.section('📁', 'Folder Structure');\n for (const dir of directories.slice(0, 20)) {\n logger.item(dir);\n }\n}\n\nexport function reportImportantFiles(files: string[]): void {\n logger.section('📌', 'Important Files');\n if (files.length === 0) {\n logger.warn('No important files detected');\n return;\n }\n for (const f of files) {\n logger.item(f);\n }\n}\n\nexport function reportArchitecture(arch: ArchitectureResult): void {\n logger.section('🧠', 'Architecture Overview');\n logger.kv('Style', arch.style);\n logger.blank();\n\n if (arch.layers.length > 0) {\n logger.indent(chalk.bold('Layers:'));\n for (const layer of arch.layers) {\n logger.indent(`${layer.name} (${layer.files} files)`, 2);\n for (const ex of layer.examples) {\n logger.indent(chalk.dim(ex), 3);\n }\n }\n }\n\n if (arch.dataFlow.length > 0) {\n logger.blank();\n logger.indent(chalk.bold('Data Flow:'));\n for (let i = 0; i < arch.dataFlow.length; i++) {\n logger.indent(chalk.cyan(`${i + 1}. ${arch.dataFlow[i]}`), 2);\n }\n }\n}\n\nexport function reportRisks(report: RiskReport): void {\n logger.section('⚠️', 'Risk Analysis');\n logger.indent(\n `${chalk.red.bold(String(report.summary.high))} high ` +\n `${chalk.yellow(String(report.summary.medium))} medium ` +\n `${chalk.green(String(report.summary.low))} low`\n );\n logger.blank();\n\n if (report.risks.length === 0) {\n logger.success('No significant risks detected');\n return;\n }\n\n const byCategory = new Map<string, typeof report.risks>();\n for (const r of report.risks) {\n const list = byCategory.get(r.category) || [];\n list.push(r);\n byCategory.set(r.category, list);\n }\n\n for (const [cat, risks] of byCategory) {\n logger.indent(chalk.bold(cat.charAt(0).toUpperCase() + cat.slice(1) + ':'));\n for (const r of risks) {\n logger.risk(r.level, `${r.message}${r.file ? chalk.dim(` — ${r.file}`) : ''}`);\n }\n logger.blank();\n }\n}\n\nexport function reportWeakPoints(points: string[]): void {\n if (points.length === 0) return;\n logger.section('🔍', 'Weak Points');\n for (const p of points) {\n logger.warn(p);\n }\n}\n\nexport function reportSuggestions(suggestions: string[]): void {\n if (suggestions.length === 0) return;\n logger.section('🚀', 'Recommended Next Steps');\n for (const s of suggestions) {\n logger.success(s);\n }\n}\n\nexport function reportReview(diff: GitDiffResult): void {\n logger.section('📝', 'Code Review');\n\n if (!diff.isGitRepo) {\n logger.warn('Not a git repository — cannot review changes');\n return;\n }\n\n if (diff.changedFiles.length === 0) {\n logger.success('No uncommitted changes');\n return;\n }\n\n logger.kv('Changed Files', String(diff.changedFiles.length));\n logger.blank();\n\n logger.indent(chalk.bold('Changed Files:'));\n for (const f of diff.changedFiles) {\n const isDangerous = diff.dangerousChanges.some(d => d.file === f);\n logger.indent(isDangerous ? chalk.red(`! ${f}`) : chalk.dim(` ${f}`), 2);\n }\n\n if (diff.dangerousChanges.length > 0) {\n logger.blank();\n logger.indent(chalk.bold.red('⚠ High Risk Changes:'));\n for (const d of diff.dangerousChanges) {\n logger.risk('high', `${d.message} — ${d.file}`);\n }\n }\n\n if (diff.diffStat) {\n logger.blank();\n logger.indent(chalk.bold('Diff Stats:'));\n logger.indent(chalk.dim(diff.diffStat), 2);\n }\n}\n\nexport function reportModules(byCategory: Record<FileCategory, string[]>): void {\n logger.section('📦', 'Main Modules');\n const display: [string, FileCategory][] = [\n ['Commands', 'command'], ['Controllers', 'controller'], ['Services', 'service'],\n ['Models', 'model'], ['Routes', 'route'], ['Views/Pages', 'view'],\n ['Components', 'component'], ['Middleware', 'middleware'], ['Tests', 'test'],\n ['Utilities', 'util'],\n ];\n\n for (const [label, cat] of display) {\n const files = byCategory[cat];\n if (files.length > 0) {\n logger.indent(`${chalk.bold(label)} (${files.length})`);\n for (const f of files.slice(0, 5)) {\n logger.indent(chalk.dim(f), 2);\n }\n if (files.length > 5) {\n logger.indent(chalk.dim(`... and ${files.length - 5} more`), 2);\n }\n }\n }\n}\n\nexport function reportAiEnhancement(text: string | null): void {\n if (!text) return;\n logger.section('🤖', 'AI Analysis');\n for (const line of text.split('\\n')) {\n logger.indent(line);\n }\n}\n\nexport function reportOnboarding(\n scan: ScanResult, fw: FrameworkInfo, arch: ArchitectureResult,\n byCategory: Record<FileCategory, string[]>\n): void {\n logger.section('👋', 'Welcome to this Project');\n logger.blank();\n\n logger.indent(chalk.bold('What is this project?'));\n logger.indent(`A ${fw.framework} (${fw.language}) project with ${scan.totalFiles} files.`, 2);\n if (fw.additionalFrameworks.length > 0) {\n logger.indent(`Uses: ${fw.additionalFrameworks.join(', ')}`, 2);\n }\n logger.blank();\n\n logger.indent(chalk.bold('Where to start:'));\n for (const f of scan.importantFiles.slice(0, 5)) {\n logger.indent(chalk.cyan(f), 2);\n }\n logger.blank();\n\n logger.indent(chalk.bold('Architecture:'));\n logger.indent(arch.style, 2);\n logger.blank();\n\n if (arch.dataFlow.length > 0) {\n logger.indent(chalk.bold('Main data flow:'));\n for (const step of arch.dataFlow) {\n logger.indent(` ${step}`, 2);\n }\n logger.blank();\n }\n\n logger.indent(chalk.bold('Things to be careful with:'));\n for (const wp of arch.weakPoints.slice(0, 5)) {\n logger.warn(wp);\n }\n logger.blank();\n\n logger.indent(chalk.bold('Recommended learning path:'));\n const order = ['config', 'command', 'model', 'route', 'controller', 'service', 'component', 'view', 'util', 'test'];\n let step = 1;\n for (const cat of order) {\n const files = byCategory[cat as FileCategory];\n if (files && files.length > 0) {\n logger.indent(`${step}. Explore ${cat} files (${files.length} files)`, 2);\n step++;\n }\n }\n}\n","import chalk from 'chalk';\n\n/**\n * Consistent logging utilities with colored output.\n */\nexport const logger = {\n /** Section header with icon */\n section(icon: string, title: string): void {\n console.log('');\n console.log(chalk.bold(`${icon} ${title}`));\n console.log(chalk.dim('─'.repeat(50)));\n },\n\n /** Success message */\n success(message: string): void {\n console.log(chalk.green(` ✓ ${message}`));\n },\n\n /** Warning message */\n warn(message: string): void {\n console.log(chalk.yellow(` ⚠ ${message}`));\n },\n\n /** Error message */\n error(message: string): void {\n console.log(chalk.red(` ✗ ${message}`));\n },\n\n /** Info message */\n info(message: string): void {\n console.log(chalk.blue(` ℹ ${message}`));\n },\n\n /** Key-value pair */\n kv(key: string, value: string): void {\n console.log(` ${chalk.dim(key + ':')} ${value}`);\n },\n\n /** List item */\n item(text: string): void {\n console.log(` ${chalk.dim('•')} ${text}`);\n },\n\n /** Indented text */\n indent(text: string, level: number = 1): void {\n console.log(' '.repeat(level) + text);\n },\n\n /** Blank line */\n blank(): void {\n console.log('');\n },\n\n /** Branded header */\n brand(): void {\n console.log('');\n console.log(chalk.bold.cyan(' 🔍 RepoLens AI') + chalk.dim(' v2.0'));\n console.log(chalk.dim(' The AI Context Intelligence Platform'));\n console.log(chalk.dim(' Your AI agents are only as good as the context you give them.'));\n console.log(chalk.dim('─'.repeat(58)));\n },\n\n /** Risk level colored */\n risk(level: 'high' | 'medium' | 'low', message: string): void {\n const colors = {\n high: chalk.red.bold,\n medium: chalk.yellow,\n low: chalk.green,\n };\n const icons = { high: '🔴', medium: '🟡', low: '🟢' };\n console.log(` ${icons[level]} ${colors[level](message)}`);\n },\n\n /** Table-like row */\n row(cols: string[], widths: number[]): void {\n const formatted = cols.map((col, i) => col.padEnd(widths[i] || 20)).join(' ');\n console.log(` ${formatted}`);\n },\n};\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { ScanResult } from '../core/repoScanner.js';\nimport type { FrameworkInfo } from '../core/frameworkDetector.js';\nimport type { ArchitectureResult } from '../core/architectureAnalyzer.js';\nimport type { RiskReport } from '../core/riskDetector.js';\nimport type { GitDiffResult } from '../core/gitDiff.js';\nimport type { FileCategory } from '../core/fileClassifier.js';\n\n/**\n * Generate a markdown report file.\n */\nexport function generateMarkdownReport(options: {\n scan: ScanResult;\n framework: FrameworkInfo;\n architecture: ArchitectureResult;\n risks: RiskReport;\n byCategory: Record<FileCategory, string[]>;\n diff?: GitDiffResult;\n aiText?: string | null;\n outputPath?: string;\n}): string {\n const { scan, framework, architecture, risks, byCategory, diff, aiText } = options;\n const lines: string[] = [];\n\n lines.push('# 🔍 RepoLens AI Report');\n lines.push('');\n lines.push(`> Generated on ${new Date().toISOString()}`);\n lines.push('');\n\n // Summary\n lines.push('## ✨ Project Summary');\n lines.push('');\n lines.push(`| Property | Value |`);\n lines.push(`|---|---|`);\n lines.push(`| Framework | ${framework.framework} ${framework.version || ''} |`);\n lines.push(`| Language | ${framework.language} |`);\n lines.push(`| Package Manager | ${framework.packageManager} |`);\n lines.push(`| Total Files | ${scan.totalFiles} |`);\n lines.push(`| Est. Lines of Code | ${scan.estimatedLinesOfCode.toLocaleString()} |`);\n lines.push(`| Languages | ${scan.languages.join(', ')} |`);\n if (framework.additionalFrameworks.length > 0) {\n lines.push(`| Libraries | ${framework.additionalFrameworks.join(', ')} |`);\n }\n lines.push('');\n\n // Architecture\n lines.push('## 🧠 Architecture');\n lines.push('');\n lines.push(`**Style:** ${architecture.style}`);\n lines.push('');\n if (architecture.layers.length > 0) {\n lines.push('### Layers');\n for (const l of architecture.layers) {\n lines.push(`- **${l.name}** (${l.files} files): ${l.examples.slice(0, 3).join(', ')}`);\n }\n lines.push('');\n }\n if (architecture.dataFlow.length > 0) {\n lines.push(`**Data Flow:** ${architecture.dataFlow.join(' → ')}`);\n lines.push('');\n }\n\n // Risks\n lines.push('## ⚠️ Risk Analysis');\n lines.push('');\n lines.push(`🔴 ${risks.summary.high} high | 🟡 ${risks.summary.medium} medium | 🟢 ${risks.summary.low} low`);\n lines.push('');\n if (risks.risks.length > 0) {\n lines.push('| Level | Category | Issue | File |');\n lines.push('|---|---|---|---|');\n for (const r of risks.risks) {\n const icon = r.level === 'high' ? '🔴' : r.level === 'medium' ? '🟡' : '🟢';\n lines.push(`| ${icon} ${r.level} | ${r.category} | ${r.message} | ${r.file || '-'} |`);\n }\n lines.push('');\n }\n\n // Modules\n lines.push('## 📦 Main Modules');\n lines.push('');\n const cats: [string, FileCategory][] = [\n ['Controllers', 'controller'], ['Services', 'service'], ['Models', 'model'],\n ['Routes', 'route'], ['Components', 'component'], ['Tests', 'test'],\n ];\n for (const [label, cat] of cats) {\n const files = byCategory[cat];\n if (files.length > 0) {\n lines.push(`### ${label} (${files.length})`);\n for (const f of files.slice(0, 10)) lines.push(`- ${f}`);\n lines.push('');\n }\n }\n\n // Suggestions\n if (architecture.suggestions.length > 0) {\n lines.push('## 🚀 Recommended Next Steps');\n lines.push('');\n for (const s of architecture.suggestions) lines.push(`- [ ] ${s}`);\n lines.push('');\n }\n\n // AI\n if (aiText) {\n lines.push('## 🤖 AI Analysis');\n lines.push('');\n lines.push(aiText);\n lines.push('');\n }\n\n lines.push('---');\n lines.push('*Generated by [RepoLens AI](https://github.com/repolens/repolens-ai)*');\n\n const content = lines.join('\\n');\n\n // Write to file if path specified\n const outputPath = options.outputPath || path.join(process.cwd(), 'repolens-report.md');\n fs.writeFileSync(outputPath, content, 'utf-8');\n\n return outputPath;\n}\n","import ora from 'ora';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { analyzeArchitecture } from '../core/architectureAnalyzer.js';\nimport { reportBrand, reportArchitecture, reportWeakPoints, reportSuggestions } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport { isAiAvailable, enhance } from '../ai/aiClient.js';\nimport { getSystemPrompt } from '../ai/promptBuilder.js';\nimport chalk from 'chalk';\n\nexport async function architectureCommand(options: { ai?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Analyzing architecture...').start();\n\n try {\n const scan = await scanRepository(cwd);\n const framework = detectFramework(cwd);\n const { byCategory } = classifyFiles(scan.fileTree);\n const arch = analyzeArchitecture(byCategory, framework.framework);\n spinner.succeed('Architecture analysis complete');\n\n // Report\n reportArchitecture(arch);\n\n // Dependencies\n logger.section('📦', 'Important Dependencies');\n if (framework.additionalFrameworks.length > 0) {\n for (const lib of framework.additionalFrameworks) {\n logger.item(lib);\n }\n } else {\n logger.info('No significant dependencies detected beyond the core framework');\n }\n\n // Data flow detail\n if (arch.dataFlow.length > 0) {\n logger.section('🔄', 'Data Flow');\n for (let i = 0; i < arch.dataFlow.length; i++) {\n logger.indent(`${i + 1}. ${arch.dataFlow[i]}`);\n }\n }\n\n reportWeakPoints(arch.weakPoints);\n reportSuggestions(arch.suggestions);\n\n // AI enhancement\n if (options.ai !== false && isAiAvailable()) {\n const aiSpinner = ora('Getting AI architecture insights...').start();\n const aiText = await enhance(\n getSystemPrompt(),\n `Explain this ${framework.framework} project's architecture in detail.\\n\\nArchitecture style: ${arch.style}\\nLayers: ${arch.layers.map(l => l.name).join(', ')}\\nData flow: ${arch.dataFlow.join(' → ')}\\nWeak points: ${arch.weakPoints.join('; ')}\\n\\nProvide a senior engineer assessment of this architecture.`,\n );\n if (aiText) {\n aiSpinner.succeed('AI insights ready');\n logger.section('🤖', 'AI Architecture Assessment');\n for (const line of aiText.split('\\n')) {\n logger.indent(line);\n }\n } else {\n aiSpinner.info('AI not available');\n }\n }\n } catch (error) {\n spinner.fail('Architecture analysis failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { readCodeContents, findRelatedByContent } from '../core/contentReader.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport { isAiAvailable, enhance } from '../ai/aiClient.js';\nimport { getSystemPrompt, buildExplainPrompt } from '../ai/promptBuilder.js';\nimport chalk from 'chalk';\n\nexport async function explainCommand(topic: string, options: { ai?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora(`Searching for \"${topic}\" in codebase...`).start();\n\n try {\n const scan = await scanRepository(cwd);\n const framework = detectFramework(cwd);\n const { classified } = classifyFiles(scan.fileTree);\n\n // NEW v2.0: Read actual file contents for deeper search\n spinner.text = `Reading code contents for \"${topic}\"...`;\n const codeContents = await readCodeContents(cwd);\n const contentMatches = findRelatedByContent(codeContents, topic);\n\n // Also keep legacy filename matching as fallback\n const topicLower = topic.toLowerCase();\n const fileNameMatches = classified.filter((f) => {\n const pathLower = f.path.toLowerCase();\n return pathLower.includes(topicLower);\n });\n\n // Expand with common aliases\n const aliases: Record<string, string[]> = {\n auth: ['auth', 'login', 'register', 'session', 'token', 'jwt', 'oauth', 'passport'],\n payment: ['payment', 'stripe', 'billing', 'invoice', 'checkout', 'subscription'],\n user: ['user', 'profile', 'account', 'member'],\n api: ['api', 'endpoint', 'route', 'controller', 'handler'],\n database: ['database', 'db', 'migration', 'schema', 'model', 'prisma', 'sequelize'],\n email: ['email', 'mail', 'notification', 'smtp'],\n upload: ['upload', 'file', 'storage', 'media', 's3'],\n cache: ['cache', 'redis', 'memcached'],\n queue: ['queue', 'job', 'worker', 'bull'],\n search: ['search', 'elastic', 'algolia', 'index'],\n context: ['context', 'agent', 'claude', 'cursor', 'copilot', 'skill'],\n score: ['score', 'lint', 'quality', 'grade'],\n sync: ['sync', 'syncer', 'convert'],\n };\n\n const expandedTerms = aliases[topicLower] || [topicLower];\n const expandedFiles = classified.filter((f) => {\n const pathLower = f.path.toLowerCase();\n return expandedTerms.some((term) => pathLower.includes(term));\n });\n\n // Merge all matches (content-based first, then filename)\n const allRelatedPaths = new Set<string>();\n const allRelated: typeof fileNameMatches = [];\n\n // Content matches are higher priority\n for (const cm of contentMatches) {\n if (!allRelatedPaths.has(cm.path)) {\n allRelatedPaths.add(cm.path);\n const classifiedMatch = classified.find((f) => f.path === cm.path);\n if (classifiedMatch) allRelated.push(classifiedMatch);\n else allRelated.push({ path: cm.path, category: 'unknown' });\n }\n }\n\n // Then filename matches\n for (const fm of [...fileNameMatches, ...expandedFiles]) {\n if (!allRelatedPaths.has(fm.path)) {\n allRelatedPaths.add(fm.path);\n allRelated.push(fm);\n }\n }\n\n spinner.succeed(`Found ${allRelated.length} related file(s) (${contentMatches.length} by content, ${fileNameMatches.length} by name)`);\n\n if (allRelated.length === 0) {\n logger.warn(`No files found related to \"${topic}\"`);\n logger.info('Try a different topic or check the folder structure with: repolens analyze');\n return;\n }\n\n // Report findings\n logger.section('🔍', `Explaining: ${topic}`);\n\n // NEW v2.0: Show functions and classes found by content reader\n const matchedContents = contentMatches.slice(0, 10);\n if (matchedContents.length > 0) {\n logger.blank();\n logger.indent(chalk.bold('📦 Related Functions & Classes:'));\n for (const mc of matchedContents) {\n const relFunctions = mc.functions.filter((fn) =>\n fn.toLowerCase().includes(topicLower)\n );\n const relClasses = mc.classes.filter((cls) =>\n cls.toLowerCase().includes(topicLower)\n );\n\n if (relFunctions.length > 0 || relClasses.length > 0) {\n logger.indent(chalk.cyan(mc.path), 2);\n for (const fn of relFunctions) {\n logger.indent(chalk.dim(` ƒ ${fn}()`), 3);\n }\n for (const cls of relClasses) {\n logger.indent(chalk.dim(` ◆ class ${cls}`), 3);\n }\n }\n }\n }\n\n logger.blank();\n logger.indent(chalk.bold('What this feature likely does:'));\n const categoryBreakdown = new Map<string, string[]>();\n for (const f of allRelated) {\n const list = categoryBreakdown.get(f.category) || [];\n list.push(f.path);\n categoryBreakdown.set(f.category, list);\n }\n\n // Infer purpose from file categories\n const hasCtrls = categoryBreakdown.has('controller') || categoryBreakdown.has('route');\n const hasSvc = categoryBreakdown.has('service');\n const hasModel = categoryBreakdown.has('model');\n const hasView = categoryBreakdown.has('view') || categoryBreakdown.has('component');\n const hasTest = categoryBreakdown.has('test');\n const hasCmd = categoryBreakdown.has('command');\n\n if (hasCmd && hasSvc) {\n logger.indent(`This is a CLI ${topic} feature with command handlers and core services.`, 2);\n } else if (hasCtrls && hasSvc && hasModel) {\n logger.indent(`This appears to be a full-stack ${topic} feature with API endpoints, business logic, and data models.`, 2);\n } else if (hasCtrls && hasModel) {\n logger.indent(`This is a ${topic} module with HTTP handling and database operations.`, 2);\n } else if (hasView) {\n logger.indent(`This is a ${topic} UI module with frontend components.`, 2);\n } else {\n logger.indent(`This contains ${topic}-related files across ${categoryBreakdown.size} layer(s).`, 2);\n }\n\n // Important files\n logger.blank();\n logger.indent(chalk.bold('Important Files:'));\n for (const f of allRelated.slice(0, 15)) {\n const icon = f.category === 'controller' ? '🎯' : f.category === 'service' ? '⚙️' :\n f.category === 'model' ? '📊' : f.category === 'test' ? '🧪' :\n f.category === 'command' ? '🖥️' :\n f.category === 'view' || f.category === 'component' ? '🖼️' : '📄';\n logger.indent(`${icon} ${chalk.cyan(f.path)} ${chalk.dim(`(${f.category})`)}`, 2);\n }\n if (allRelated.length > 15) {\n logger.indent(chalk.dim(`... and ${allRelated.length - 15} more files`), 2);\n }\n\n // Flow explanation\n logger.blank();\n logger.indent(chalk.bold('Flow:'));\n const flowParts: string[] = [];\n if (categoryBreakdown.has('route')) flowParts.push('Routes');\n if (categoryBreakdown.has('middleware')) flowParts.push('Middleware');\n if (categoryBreakdown.has('controller')) flowParts.push('Controllers');\n if (categoryBreakdown.has('command')) flowParts.push('Commands');\n if (categoryBreakdown.has('service')) flowParts.push('Services');\n if (categoryBreakdown.has('model')) flowParts.push('Models');\n if (categoryBreakdown.has('view') || categoryBreakdown.has('component')) flowParts.push('UI');\n if (flowParts.length > 0) {\n logger.indent(chalk.cyan(flowParts.join(' → ')), 2);\n } else {\n logger.indent('Unable to determine flow — files may not follow standard patterns', 2);\n }\n\n // Risks\n logger.blank();\n logger.indent(chalk.bold('Potential Risks:'));\n if (!hasTest) logger.warn(`No tests found for ${topic}`);\n if (!hasSvc && hasCtrls) logger.warn('Business logic may be coupled to HTTP layer (no service layer)');\n if (allRelated.length > 20) logger.warn(`Large module (${allRelated.length} files) — may need decomposition`);\n if (allRelated.length <= 2) logger.info('Small module — relatively easy to maintain');\n\n // TODOs in related files\n const relatedTodos = contentMatches.flatMap((mc) => mc.todoFixmes.map((t) => ({ file: mc.path, ...t })));\n if (relatedTodos.length > 0) {\n logger.blank();\n logger.indent(chalk.bold('TODOs in related files:'));\n for (const todo of relatedTodos.slice(0, 5)) {\n logger.indent(chalk.yellow(` 📝 ${todo.text}`) + chalk.dim(` — ${todo.file}:${todo.line}`), 1);\n }\n }\n\n // AI enhancement\n if (options.ai !== false && isAiAvailable()) {\n const aiSpinner = ora('Getting AI explanation...').start();\n const aiText = await enhance(\n getSystemPrompt(),\n buildExplainPrompt(topic, allRelated.map(f => f.path), framework.framework),\n );\n if (aiText) {\n aiSpinner.succeed('AI explanation ready');\n logger.section('🤖', 'AI Explanation');\n for (const line of aiText.split('\\n')) logger.indent(line);\n } else {\n aiSpinner.info('AI not available');\n }\n }\n } catch (error) {\n spinner.fail('Explain failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport { analyzeGitDiff } from '../core/gitDiff.js';\nimport { reportBrand, reportReview } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport { isAiAvailable, enhance } from '../ai/aiClient.js';\nimport { getSystemPrompt, buildReviewPrompt } from '../ai/promptBuilder.js';\nimport chalk from 'chalk';\n\nexport async function reviewCommand(options: { ai?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Analyzing git changes...').start();\n\n try {\n const diff = analyzeGitDiff(cwd);\n spinner.succeed('Git analysis complete');\n\n reportReview(diff);\n\n if (!diff.isGitRepo || diff.changedFiles.length === 0) return;\n\n // Categorize changes\n const safeChanges = diff.changedFiles.filter(\n (f) => !diff.dangerousChanges.some((d) => d.file === f)\n );\n\n if (safeChanges.length > 0) {\n logger.section('✅', 'Safe Changes');\n for (const f of safeChanges) {\n logger.success(f);\n }\n }\n\n // Suggested fix plan\n if (diff.dangerousChanges.length > 0) {\n logger.section('🔧', 'Suggested Fix Plan');\n let step = 1;\n for (const d of diff.dangerousChanges) {\n logger.indent(`${step}. Review ${chalk.bold(d.file)} — ${d.message}`);\n step++;\n }\n logger.indent(`${step}. Run tests after addressing the above`);\n }\n\n // AI enhancement\n if (options.ai !== false && isAiAvailable() && diff.changedFiles.length > 0) {\n const aiSpinner = ora('Getting AI review...').start();\n const aiText = await enhance(\n getSystemPrompt(),\n buildReviewPrompt(\n diff.changedFiles,\n diff.diffStat,\n diff.dangerousChanges.length,\n ),\n );\n if (aiText) {\n aiSpinner.succeed('AI review complete');\n logger.section('🤖', 'AI Code Review');\n for (const line of aiText.split('\\n')) logger.indent(line);\n } else {\n aiSpinner.info('AI not available');\n }\n }\n } catch (error) {\n spinner.fail('Review failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import { execSync } from 'node:child_process';\nimport { maskSecrets } from '../utils/masks.js';\n\nexport interface GitDiffResult {\n isGitRepo: boolean;\n changedFiles: string[];\n diffStat: string;\n fullDiff: string;\n dangerousChanges: DangerousChange[];\n summary: string;\n}\n\nexport interface DangerousChange {\n level: 'high' | 'medium';\n message: string;\n file: string;\n}\n\nconst DANGEROUS_FILE_PATTERNS = [\n { pattern: /auth/i, message: 'Auth-related file modified' },\n { pattern: /middleware/i, message: 'Middleware file modified' },\n { pattern: /\\.env/i, message: 'Environment file modified' },\n { pattern: /security/i, message: 'Security-related file modified' },\n { pattern: /secret/i, message: 'Secret-related file modified' },\n { pattern: /migration/i, message: 'Database migration modified' },\n { pattern: /password/i, message: 'Password-related file modified' },\n];\n\n/**\n * Analyze git diff for recent changes.\n */\nexport function analyzeGitDiff(cwd: string): GitDiffResult {\n const result: GitDiffResult = {\n isGitRepo: false,\n changedFiles: [],\n diffStat: '',\n fullDiff: '',\n dangerousChanges: [],\n summary: '',\n };\n\n try {\n // Check if git repo\n execSync('git rev-parse --is-inside-work-tree', { cwd, stdio: 'pipe' });\n result.isGitRepo = true;\n } catch {\n result.summary = 'Not a git repository';\n return result;\n }\n\n try {\n // Get changed files (staged + unstaged)\n const namesOutput = execSync('git diff --name-only HEAD 2>nul || git diff --name-only', {\n cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n result.changedFiles = namesOutput ? namesOutput.split('\\n').filter(Boolean) : [];\n\n // Also check staged\n const stagedOutput = execSync('git diff --cached --name-only', {\n cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n const stagedFiles = stagedOutput ? stagedOutput.split('\\n').filter(Boolean) : [];\n result.changedFiles = [...new Set([...result.changedFiles, ...stagedFiles])];\n\n if (result.changedFiles.length === 0) {\n result.summary = 'No uncommitted changes detected';\n return result;\n }\n\n // Get diff stat\n try {\n result.diffStat = maskSecrets(\n execSync('git diff --stat HEAD 2>nul || git diff --stat', {\n cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],\n }).trim()\n );\n } catch { /* stat not critical */ }\n\n // Get full diff (limited to 50KB)\n try {\n const rawDiff = execSync('git diff HEAD 2>nul || git diff', {\n cwd, encoding: 'utf-8', maxBuffer: 1024 * 1024, stdio: ['pipe', 'pipe', 'pipe'],\n });\n result.fullDiff = maskSecrets(rawDiff.substring(0, 50_000));\n } catch { /* diff not critical */ }\n\n // Detect dangerous changes\n for (const file of result.changedFiles) {\n for (const { pattern, message } of DANGEROUS_FILE_PATTERNS) {\n if (pattern.test(file)) {\n result.dangerousChanges.push({ level: 'high', message, file });\n }\n }\n }\n\n // Check for deleted test files\n try {\n const deletedOutput = execSync('git diff --diff-filter=D --name-only HEAD 2>nul || git diff --diff-filter=D --name-only', {\n cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n const deleted = deletedOutput ? deletedOutput.split('\\n').filter(Boolean) : [];\n for (const f of deleted) {\n if (/\\.(test|spec)\\./i.test(f)) {\n result.dangerousChanges.push({ level: 'high', message: 'Test file deleted', file: f });\n }\n }\n } catch { /* not critical */ }\n\n // Check diff content for dangerous patterns\n if (result.fullDiff) {\n if (/^\\+.*\\beval\\s*\\(/m.test(result.fullDiff)) {\n result.dangerousChanges.push({ level: 'high', message: 'eval() added in changes', file: '(in diff)' });\n }\n if (/^\\-.*middleware/im.test(result.fullDiff)) {\n result.dangerousChanges.push({ level: 'high', message: 'Middleware possibly removed', file: '(in diff)' });\n }\n }\n\n result.summary = `${result.changedFiles.length} file(s) changed, ${result.dangerousChanges.length} potential risk(s)`;\n } catch {\n result.summary = 'Unable to read git diff';\n }\n\n return result;\n}\n","/**\n * Secret masking utilities.\n * Ensures no API keys, tokens, or passwords are exposed in output.\n */\n\nconst SECRET_PATTERNS: RegExp[] = [\n // API keys & tokens\n /(?:api[_-]?key|apikey|secret[_-]?key|access[_-]?token|auth[_-]?token|bearer)\\s*[:=]\\s*[\"']?([a-zA-Z0-9_\\-]{8,})[\"']?/gi,\n // OpenAI keys\n /sk-[a-zA-Z0-9]{20,}/g,\n // AWS keys\n /AKIA[0-9A-Z]{16}/g,\n // Generic long hex/base64 secrets\n /(?:password|passwd|pwd|secret|token)\\s*[:=]\\s*[\"']?([^\\s\"']{8,})[\"']?/gi,\n // Connection strings\n /(?:mongodb|postgres|mysql|redis):\\/\\/[^\\s\"']+/gi,\n // .env style KEY=VALUE with sensitive names\n /(?:DATABASE_URL|OPENAI_API_KEY|STRIPE_SECRET|AWS_SECRET_ACCESS_KEY|JWT_SECRET|SESSION_SECRET)\\s*=\\s*(.+)/gi,\n];\n\n/**\n * Mask sensitive values in a string.\n * Replaces detected secrets with [MASKED].\n */\nexport function maskSecrets(text: string): string {\n let masked = text;\n for (const pattern of SECRET_PATTERNS) {\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n masked = masked.replace(pattern, (match) => {\n // Keep the key name, mask the value\n const eqIndex = match.indexOf('=');\n const colonIndex = match.indexOf(':');\n const sepIndex = eqIndex >= 0 ? eqIndex : colonIndex;\n\n if (sepIndex >= 0 && sepIndex < match.length - 1) {\n return match.substring(0, sepIndex + 1) + ' [MASKED]';\n }\n return '[MASKED]';\n });\n }\n return masked;\n}\n\n/**\n * Check if a string likely contains a secret value.\n */\nexport function containsSecret(text: string): boolean {\n for (const pattern of SECRET_PATTERNS) {\n pattern.lastIndex = 0;\n if (pattern.test(text)) return true;\n }\n return false;\n}\n\n/**\n * Mask a value, showing only first 4 chars.\n */\nexport function partialMask(value: string): string {\n if (value.length <= 4) return '****';\n return value.substring(0, 4) + '****' + value.substring(value.length - 2);\n}\n","import ora from 'ora';\nimport { detectRisks } from '../core/riskDetector.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\nexport async function risksCommand(): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Scanning for risks...').start();\n\n try {\n const report = await detectRisks(cwd);\n const total = report.risks.length;\n spinner.succeed(`Risk scan complete — found ${total} issue(s)`);\n\n // Report risks\n logger.section('⚠️', 'Risk Analysis');\n logger.indent(\n `${chalk.red.bold(String(report.summary.high))} high ` +\n `${chalk.yellow(String(report.summary.medium))} medium ` +\n `${chalk.green(String(report.summary.low))} low`\n );\n logger.blank();\n\n if (report.risks.length === 0) {\n logger.success('No significant risks detected');\n return;\n }\n\n const byCategory = new Map<string, typeof report.risks>();\n for (const r of report.risks) {\n const list = byCategory.get(r.category) || [];\n list.push(r);\n byCategory.set(r.category, list);\n }\n\n for (const [cat, risks] of byCategory) {\n logger.indent(chalk.bold(cat.charAt(0).toUpperCase() + cat.slice(1) + ':'));\n for (const r of risks) {\n logger.risk(r.level, `${r.message}${r.file ? chalk.dim(` — ${r.file}`) : ''}`);\n }\n logger.blank();\n }\n\n // Priority fixes\n logger.section('🎯', 'Priority Fixes');\n const highRisks = report.risks.filter((r) => r.level === 'high');\n const medRisks = report.risks.filter((r) => r.level === 'medium');\n\n if (highRisks.length > 0) {\n logger.indent(chalk.red.bold('Immediate (High Priority):'));\n for (const r of highRisks) {\n logger.indent(` • ${r.message}${r.file ? chalk.dim(` — ${r.file}`) : ''}`, 1);\n }\n logger.blank();\n }\n\n if (medRisks.length > 0) {\n logger.indent(chalk.yellow('Soon (Medium Priority):'));\n for (const r of medRisks) {\n logger.indent(` • ${r.message}${r.file ? chalk.dim(` — ${r.file}`) : ''}`, 1);\n }\n }\n\n } catch (error) {\n spinner.fail('Risk scan failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { analyzeArchitecture } from '../core/architectureAnalyzer.js';\nimport { reportBrand, reportOnboarding } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\n\nexport async function onboardingCommand(): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Generating onboarding guide...').start();\n\n try {\n const scan = await scanRepository(cwd);\n const framework = detectFramework(cwd);\n const { byCategory } = classifyFiles(scan.fileTree);\n const arch = analyzeArchitecture(byCategory, framework.framework);\n spinner.succeed('Onboarding guide ready');\n\n reportOnboarding(scan, framework, arch, byCategory);\n } catch (error) {\n spinner.fail('Onboarding generation failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { analyzeArchitecture } from '../core/architectureAnalyzer.js';\nimport { generateAgentsContent } from '../templates/agentsTemplate.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\n\nexport async function generateAgentsCommand(): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Generating AGENTS.md...').start();\n\n try {\n const scan = await scanRepository(cwd);\n const framework = detectFramework(cwd);\n const { byCategory } = classifyFiles(scan.fileTree);\n const arch = analyzeArchitecture(byCategory, framework.framework);\n\n const content = generateAgentsContent(scan, framework, arch, byCategory);\n const outputPath = path.join(cwd, 'AGENTS.md');\n\n // Check if file already exists\n if (fs.existsSync(outputPath)) {\n const backupPath = outputPath + '.backup';\n fs.copyFileSync(outputPath, backupPath);\n logger.info(`Existing AGENTS.md backed up to AGENTS.md.backup`);\n }\n\n fs.writeFileSync(outputPath, content, 'utf-8');\n spinner.succeed('AGENTS.md generated successfully');\n\n logger.blank();\n logger.success(`Created: ${outputPath}`);\n logger.info('This file instructs AI coding agents on how to work with your project.');\n logger.info('Commit it to your repo so tools like Codex, Claude, and Cursor can use it.');\n } catch (error) {\n spinner.fail('AGENTS.md generation failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import type { ScanResult } from '../core/repoScanner.js';\nimport type { FrameworkInfo } from '../core/frameworkDetector.js';\nimport type { ArchitectureResult } from '../core/architectureAnalyzer.js';\nimport type { FileCategory } from '../core/fileClassifier.js';\n\n/**\n * Generate AGENTS.md content from scanned project data.\n */\nexport function generateAgentsContent(\n scan: ScanResult,\n fw: FrameworkInfo,\n arch: ArchitectureResult,\n byCategory: Record<FileCategory, string[]>,\n): string {\n const sections: string[] = [];\n\n sections.push('# AGENTS.md');\n sections.push('');\n sections.push('> Instructions for AI coding agents working on this project.');\n sections.push('> Generated by RepoLens AI.');\n sections.push('');\n\n // Project Overview\n sections.push('## Project Overview');\n sections.push('');\n sections.push(`- **Framework:** ${fw.framework} ${fw.version || ''}`);\n sections.push(`- **Language:** ${fw.language}`);\n sections.push(`- **Package Manager:** ${fw.packageManager}`);\n sections.push(`- **Architecture:** ${arch.style}`);\n sections.push(`- **Total Files:** ${scan.totalFiles}`);\n sections.push('');\n\n // Tech Stack\n sections.push('## Tech Stack');\n sections.push('');\n sections.push(`- Primary: ${fw.framework} (${fw.language})`);\n if (fw.additionalFrameworks.length > 0) {\n for (const lib of fw.additionalFrameworks) {\n sections.push(`- ${lib}`);\n }\n }\n sections.push('');\n\n // Folder Structure\n sections.push('## Folder Structure');\n sections.push('');\n sections.push('```');\n for (const dir of scan.directories.slice(0, 20)) {\n sections.push(dir + '/');\n }\n sections.push('```');\n sections.push('');\n\n // Important Files\n sections.push('## Important Files');\n sections.push('');\n for (const f of scan.importantFiles) {\n sections.push(`- \\`${f}\\``);\n }\n sections.push('');\n\n // Coding Rules\n sections.push('## Coding Rules');\n sections.push('');\n sections.push('1. **Analyze before editing** — Understand the existing architecture before making changes.');\n sections.push('2. **Minimal safe changes** — Make the smallest change that solves the problem.');\n sections.push('3. **Preserve architecture** — Follow the existing patterns and conventions.');\n sections.push('4. **No unnecessary rewrites** — Do not rewrite files that work correctly.');\n sections.push(`5. **Follow ${fw.language} conventions** — Use idiomatic ${fw.language} code.`);\n sections.push('6. **Keep files focused** — Each file should have a single responsibility.');\n sections.push('');\n\n // Security Rules\n sections.push('## Security Rules');\n sections.push('');\n sections.push('1. **Never commit secrets** — No API keys, tokens, or passwords in source code.');\n sections.push('2. **Protect .env files** — Never read or expose .env file contents.');\n sections.push('3. **Validate all input** — Never trust user input.');\n sections.push('4. **Use parameterized queries** — Never use raw SQL string concatenation.');\n sections.push('5. **No eval()** — Never use eval, exec, or similar dynamic code execution.');\n sections.push('6. **Preserve auth middleware** — Never remove authentication or authorization checks.');\n sections.push('');\n\n // Testing\n sections.push('## Testing');\n sections.push('');\n if (scan.hasTests) {\n sections.push('This project has tests. Always:');\n sections.push('- Run existing tests before and after changes');\n sections.push('- Add tests for new functionality');\n sections.push('- Never delete existing tests without explanation');\n } else {\n sections.push('This project currently lacks tests. When possible:');\n sections.push('- Add tests for critical business logic');\n sections.push('- Add tests for security-sensitive code');\n }\n sections.push('');\n\n // Workflow\n sections.push('## Workflow Rules');\n sections.push('');\n sections.push('1. Read relevant files before editing');\n sections.push('2. Check for existing patterns before creating new ones');\n sections.push('3. Summarize all changes made');\n sections.push('4. Flag any potential breaking changes');\n sections.push('5. Do not modify configuration files without explicit instruction');\n sections.push('');\n\n // Definition of Done\n sections.push('## Definition of Done');\n sections.push('');\n sections.push('A change is complete when:');\n sections.push('- [ ] Code compiles without errors');\n sections.push('- [ ] Existing tests pass');\n sections.push('- [ ] New tests added for new functionality');\n sections.push('- [ ] No secrets in source code');\n sections.push('- [ ] Changes are minimal and focused');\n sections.push('- [ ] Architecture patterns are preserved');\n sections.push('- [ ] Changes are summarized clearly');\n sections.push('');\n\n return sections.join('\\n');\n}\n","import ora from 'ora';\nimport * as readline from 'node:readline';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { analyzeArchitecture } from '../core/architectureAnalyzer.js';\nimport { readCodeContents, summarizeContents } from '../core/contentReader.js';\nimport { detectBestTemplate } from '../templates/frameworkTemplates.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Interactive AGENTS.md creation through developer interview.\n * Extracts tribal knowledge that AI cannot infer on its own.\n */\n\ninterface InterviewAnswers {\n projectDescription: string;\n keyGotchas: string;\n architectureDecisions: string;\n buildCommands: string;\n testCommands: string;\n deployCommands: string;\n conventions: string;\n knownIssues: string;\n criticalFiles: string;\n doNotTouch: string;\n}\n\nfunction ask(rl: readline.Interface, question: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(chalk.cyan(' ? ') + chalk.bold(question) + '\\n ' + chalk.dim('> '), (answer) => {\n resolve(answer.trim());\n });\n });\n}\n\nexport async function initCommand(options: { yes?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n logger.section('🚀', 'Initialize AI Context');\n logger.blank();\n logger.indent(chalk.dim('This will create a high-quality AGENTS.md by combining'));\n logger.indent(chalk.dim('automated analysis with your tribal knowledge.'));\n logger.blank();\n\n // Step 1: Auto-scan\n const spinner = ora('Analyzing your codebase...').start();\n const scan = await scanRepository(cwd);\n const framework = detectFramework(cwd);\n const { byCategory } = classifyFiles(scan.fileTree);\n const architecture = analyzeArchitecture(byCategory, framework.framework);\n\n spinner.text = 'Reading code contents...';\n const codeContents = await readCodeContents(cwd);\n const contentSummary = summarizeContents(codeContents);\n spinner.succeed('Codebase analysis complete');\n\n // Show what was found\n logger.blank();\n logger.indent(chalk.bold('📊 What we found:'));\n logger.kv('Framework', `${framework.framework} (${framework.language})`);\n logger.kv('Architecture', architecture.style);\n logger.kv('Files', String(scan.totalFiles));\n logger.kv('Functions', String(contentSummary.totalFunctions));\n logger.kv('Classes', String(contentSummary.totalClasses));\n if (framework.additionalFrameworks.length > 0) {\n logger.kv('Libraries', framework.additionalFrameworks.join(', '));\n }\n logger.blank();\n\n let answers: InterviewAnswers;\n\n if (options.yes) {\n // Non-interactive mode — use empty answers\n answers = {\n projectDescription: '', keyGotchas: '', architectureDecisions: '',\n buildCommands: '', testCommands: '', deployCommands: '',\n conventions: '', knownIssues: '', criticalFiles: '', doNotTouch: '',\n };\n } else {\n // Step 2: Interactive interview\n logger.section('💬', 'Knowledge Interview');\n logger.indent(chalk.dim('Answer these questions to create a high-quality context file.'));\n logger.indent(chalk.dim('Press Enter to skip any question.'));\n logger.blank();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n\n answers = {\n projectDescription: await ask(rl, 'What does this project do? (1-2 sentences)'),\n keyGotchas: await ask(rl, 'Any gotchas or pitfalls a developer should know?'),\n architectureDecisions: await ask(rl, 'Key architecture decisions? (why you chose this stack/pattern)'),\n buildCommands: await ask(rl, 'Build command? (e.g., npm run build)'),\n testCommands: await ask(rl, 'Test command? (e.g., npm test)'),\n deployCommands: await ask(rl, 'Deploy command? (e.g., npm run deploy)'),\n conventions: await ask(rl, 'Any naming conventions or code style rules?'),\n knownIssues: await ask(rl, 'Known bugs or workarounds?'),\n criticalFiles: await ask(rl, 'Most important files to understand?'),\n doNotTouch: await ask(rl, 'Files or patterns that should NEVER be modified?'),\n };\n\n rl.close();\n }\n\n // Step 3: Generate smart AGENTS.md\n const spinner2 = ora('Generating AGENTS.md...').start();\n const content = generateSmartAgents(scan, framework, architecture, contentSummary, answers, codeContents);\n\n const outputPath = path.join(cwd, 'AGENTS.md');\n\n // Backup if exists\n if (fs.existsSync(outputPath)) {\n fs.copyFileSync(outputPath, outputPath + '.backup');\n logger.info('Existing AGENTS.md backed up to AGENTS.md.backup');\n }\n\n fs.writeFileSync(outputPath, content, 'utf-8');\n spinner2.succeed('AGENTS.md generated successfully');\n\n logger.blank();\n logger.success(`Created: ${outputPath}`);\n logger.blank();\n logger.indent(chalk.bold('Next steps:'));\n logger.indent(` ${chalk.cyan('repolens lint')} — Score your context quality`, 1);\n logger.indent(` ${chalk.cyan('repolens sync')} — Sync to CLAUDE.md & .cursorrules`, 1);\n logger.indent(` ${chalk.cyan('repolens dashboard')} — Visual context management`, 1);\n}\n\nfunction generateSmartAgents(\n scan: any, fw: any, arch: any, summary: any, answers: InterviewAnswers, contents: any[],\n): string {\n const s: string[] = [];\n\n s.push('# AGENTS.md');\n s.push('');\n s.push('> Instructions for AI coding agents working on this project.');\n s.push(`> Generated by RepoLens AI v2.0 on ${new Date().toISOString().split('T')[0]}.`);\n s.push('');\n\n // --- Project Overview (combines auto + manual) ---\n s.push('## Project Overview');\n s.push('');\n if (answers.projectDescription) {\n s.push(answers.projectDescription);\n s.push('');\n }\n s.push(`- **Framework:** ${fw.framework} ${fw.version || ''}`);\n s.push(`- **Language:** ${fw.language}`);\n s.push(`- **Package Manager:** ${fw.packageManager}`);\n s.push(`- **Architecture:** ${arch.style}`);\n if (fw.additionalFrameworks.length > 0) {\n s.push(`- **Key Libraries:** ${fw.additionalFrameworks.join(', ')}`);\n }\n s.push('');\n\n // --- Commands (specific, not generic) ---\n s.push('## Commands');\n s.push('');\n if (answers.buildCommands) s.push(`- **Build:** \\`${answers.buildCommands}\\``);\n else {\n // Auto-detect from package.json\n const pkgPath = path.join(process.cwd(), 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.scripts) {\n if (pkg.scripts.build) s.push(`- **Build:** \\`npm run build\\``);\n if (pkg.scripts.dev) s.push(`- **Dev:** \\`npm run dev\\``);\n if (pkg.scripts.lint) s.push(`- **Lint:** \\`npm run lint\\``);\n }\n } catch { /* skip */ }\n }\n }\n if (answers.testCommands) s.push(`- **Test:** \\`${answers.testCommands}\\``);\n else if (!scan.hasTests) s.push('- **Test:** No tests configured yet');\n if (answers.deployCommands) s.push(`- **Deploy:** \\`${answers.deployCommands}\\``);\n s.push('');\n\n // --- Architecture (auto-detected with data flow) ---\n s.push('## Architecture');\n s.push('');\n if (answers.architectureDecisions) {\n s.push(answers.architectureDecisions);\n s.push('');\n }\n s.push('### Data Flow');\n for (const flow of arch.dataFlow) {\n s.push(`- ${flow}`);\n }\n s.push('');\n\n // --- Key Structure ---\n s.push('## Key Structure');\n s.push('');\n s.push('```');\n for (const dir of scan.directories.slice(0, 15)) {\n s.push(dir + '/');\n }\n s.push('```');\n s.push('');\n\n // --- Critical Files ---\n s.push('## Critical Files');\n s.push('');\n if (answers.criticalFiles) {\n s.push(answers.criticalFiles);\n s.push('');\n }\n // Auto-detect top files by connectivity\n if (summary.mostConnected.length > 0) {\n s.push('Most interconnected files (modify carefully):');\n for (const f of summary.mostConnected.slice(0, 5)) {\n s.push(`- \\`${f.path}\\` (${f.imports} imports)`);\n }\n }\n s.push('');\n\n // --- Gotchas & Pitfalls (HIGH VALUE — tribal knowledge) ---\n if (answers.keyGotchas || answers.knownIssues) {\n s.push('## Gotchas & Known Issues');\n s.push('');\n if (answers.keyGotchas) s.push(answers.keyGotchas);\n if (answers.knownIssues) s.push(answers.knownIssues);\n s.push('');\n }\n\n // --- Conventions ---\n if (answers.conventions) {\n s.push('## Conventions');\n s.push('');\n s.push(answers.conventions);\n s.push('');\n }\n\n // --- Do Not Touch ---\n if (answers.doNotTouch) {\n s.push('## Do Not Modify');\n s.push('');\n s.push(answers.doNotTouch);\n s.push('');\n }\n\n // --- Framework-Specific Gotchas (from template library) ---\n const template = detectBestTemplate(fw.framework);\n if (template && !answers.keyGotchas) {\n // Extract gotchas section from the template\n const templateLines = template.content.split('\\n');\n let inGotchas = false;\n const gotchaLines: string[] = [];\n for (const line of templateLines) {\n if (line.startsWith('## Gotchas')) { inGotchas = true; continue; }\n if (inGotchas && line.startsWith('## ')) break;\n if (inGotchas) gotchaLines.push(line);\n }\n if (gotchaLines.length > 0) {\n s.push(`## Gotchas & Known Issues (${template.name})`);\n s.push('');\n for (const gl of gotchaLines) s.push(gl);\n s.push('');\n }\n }\n\n // --- Smart Rules (only project-specific ones) ---\n s.push('## Rules');\n s.push('');\n\n // Only add rules that are specific to this project\n if (arch.weakPoints.length > 0) {\n s.push('### Architecture Constraints');\n for (const wp of arch.weakPoints) {\n s.push(`- ${wp}`);\n }\n s.push('');\n }\n\n // Add testing rule only if relevant\n if (!scan.hasTests) {\n s.push('### Testing');\n s.push('- This project lacks tests — add tests for any new critical logic');\n s.push('');\n }\n\n s.push('---');\n s.push('*Generated by [RepoLens AI](https://github.com/repolens/repolens-ai)*');\n\n return s.join('\\n');\n}\n","/**\n * Framework-specific AGENTS.md templates library.\n * Curated templates with real tribal knowledge for 15+ popular frameworks.\n * These templates contain SPECIFIC, NON-INFERABLE information that actually helps AI agents.\n */\n\nexport interface FrameworkTemplate {\n id: string;\n name: string;\n description: string;\n tags: string[];\n content: string;\n}\n\nexport const FRAMEWORK_TEMPLATES: FrameworkTemplate[] = [\n // ─── JavaScript / TypeScript ────────────────────────────\n {\n id: 'nextjs',\n name: 'Next.js (App Router)',\n description: 'Next.js 14/15 with App Router, Server Components, and Server Actions',\n tags: ['react', 'nextjs', 'typescript', 'fullstack', 'ssr'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** Next.js (App Router)\n- **Language:** TypeScript\n- **Styling:** Tailwind CSS\n- **Package Manager:** npm / pnpm\n\n## Commands\n\n- **Dev:** \\`npm run dev\\` (starts at http://localhost:3000)\n- **Build:** \\`npm run build\\`\n- **Lint:** \\`npm run lint\\`\n\n## Architecture Decisions\n\n- We use **App Router** (not Pages Router). All routes are in \\`app/\\` directory.\n- Server Components are the default. Only add \\`\"use client\"\\` when you need interactivity.\n- Server Actions replace traditional API routes for mutations.\n- We use \\`next/image\\` for all images — never use raw \\`<img>\\` tags.\n\n## Gotchas & Known Issues\n\n- \\`\"use client\"\\` must be the FIRST line in client component files, before any imports.\n- Do NOT import server-only modules (like \\`fs\\`, database clients) in client components.\n- \\`cookies()\\` and \\`headers()\\` make a route dynamic — avoid in static pages.\n- Middleware runs on Edge Runtime — no Node.js APIs like \\`fs\\` or \\`path\\`.\n- \\`revalidatePath()\\` only works in Server Actions and Route Handlers.\n- \\`metadata\\` export only works in Server Components (layout.tsx, page.tsx).\n- Next.js caches aggressively — use \\`revalidateTag()\\` or \\`revalidatePath()\\` to bust cache.\n\n## Key Structure\n\n\\`\\`\\`\napp/ # Routes (App Router)\n layout.tsx # Root layout (wraps all pages)\n page.tsx # Homepage\n [slug]/page.tsx # Dynamic routes\n api/ # API Route Handlers\ncomponents/ # Shared React components\nlib/ # Utilities, database, auth\npublic/ # Static assets\n\\`\\`\\`\n\n## Conventions\n\n- File naming: \\`kebab-case.tsx\\` for components, \\`camelCase.ts\\` for utilities\n- All API responses use \\`NextResponse.json()\\`\n- Use \\`notFound()\\` from \\`next/navigation\\` for 404s (never throw errors)\n- Loading states go in \\`loading.tsx\\`, error boundaries in \\`error.tsx\\`\n\n## Rules\n\n### Do Not\n- Do not use Pages Router patterns (\\`getServerSideProps\\`, \\`getStaticProps\\`)\n- Do not use \\`useEffect\\` for data fetching — use Server Components or SWR\n- Do not put secrets in \\`NEXT_PUBLIC_\\` env vars (they are exposed to browser)\n- Do not modify \\`next.config.js\\` without explicit instruction\n\n### Performance\n- Use \\`Suspense\\` boundaries for streaming\n- Prefer \\`generateStaticParams\\` for static generation of dynamic routes\n- Use \\`loading.tsx\\` files for route-level loading states`,\n },\n {\n id: 'react-vite',\n name: 'React + Vite',\n description: 'React SPA with Vite bundler, React Router, and modern tooling',\n tags: ['react', 'vite', 'typescript', 'spa', 'frontend'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** React + Vite\n- **Language:** TypeScript\n- **Styling:** CSS Modules / Tailwind CSS\n- **Package Manager:** npm\n\n## Commands\n\n- **Dev:** \\`npm run dev\\` (starts at http://localhost:5173)\n- **Build:** \\`npm run build\\`\n- **Preview:** \\`npm run preview\\`\n\n## Architecture Decisions\n\n- This is a **Single Page Application** (SPA), not SSR.\n- We use React Router for client-side routing.\n- State management: React Context + useReducer (no Redux unless explicitly needed).\n- API calls go through \\`src/api/\\` module — never call fetch directly in components.\n\n## Gotchas & Known Issues\n\n- Vite uses \\`import.meta.env\\` NOT \\`process.env\\` for environment variables.\n- Only env vars prefixed with \\`VITE_\\` are exposed to the browser.\n- \\`.env.local\\` is gitignored by default — use \\`.env.example\\` for documentation.\n- Hot Module Replacement (HMR) breaks if you export non-component values from .tsx files.\n- Vite requires explicit file extensions in some import paths.\n\n## Key Structure\n\n\\`\\`\\`\nsrc/\n components/ # Reusable UI components\n pages/ # Route-level components\n hooks/ # Custom React hooks\n api/ # API client and endpoints\n utils/ # Helper functions\n types/ # TypeScript type definitions\n assets/ # Images, fonts, etc.\n\\`\\`\\`\n\n## Conventions\n\n- Components: PascalCase (\\`UserCard.tsx\\`)\n- Hooks: \\`useXxx.ts\\` pattern\n- One component per file\n- Props interface named \\`XxxProps\\`\n\n## Rules\n\n### Do Not\n- Do not use \\`process.env\\` — use \\`import.meta.env\\`\n- Do not install heavy libraries without discussion\n- Do not put API keys in frontend code`,\n },\n {\n id: 'vue-nuxt',\n name: 'Vue / Nuxt.js',\n description: 'Vue 3 or Nuxt 3 with Composition API and auto-imports',\n tags: ['vue', 'nuxt', 'typescript', 'ssr', 'fullstack'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** Nuxt 3 / Vue 3\n- **Language:** TypeScript\n- **Styling:** Tailwind CSS / UnoCSS\n\n## Commands\n\n- **Dev:** \\`npm run dev\\`\n- **Build:** \\`npm run build\\`\n- **Generate:** \\`npm run generate\\` (static site generation)\n\n## Gotchas & Known Issues\n\n- Nuxt 3 **auto-imports** Vue APIs (ref, computed, watch) — do NOT manually import them.\n- Nuxt 3 auto-imports components from \\`components/\\` — no need for import statements.\n- \\`useFetch\\` and \\`useAsyncData\\` only work in \\`setup()\\` or \\`<script setup>\\` context.\n- \\`useState\\` is Nuxt's SSR-safe alternative to \\`ref\\` for shared state — not React's useState.\n- Server-only code goes in \\`server/\\` directory — it's never sent to the client.\n- \\`definePageMeta\\` must be called at the top level of \\`<script setup>\\`, not inside functions.\n\n## Key Structure\n\n\\`\\`\\`\npages/ # File-based routing\ncomponents/ # Auto-imported components\ncomposables/ # Auto-imported composables (useXxx)\nserver/ # Server-only code (API routes, middleware)\n api/ # Server API routes\nlayouts/ # Page layouts\nmiddleware/ # Route middleware\nplugins/ # Nuxt plugins\n\\`\\`\\`\n\n## Conventions\n\n- Use Composition API with \\`<script setup>\\` (never Options API)\n- Composables: \\`useXxx.ts\\` in \\`composables/\\`\n- API routes: \\`server/api/[name].ts\\``,\n },\n // ─── Backend Frameworks ────────────────────────────\n {\n id: 'express',\n name: 'Express.js / Node.js API',\n description: 'Express.js REST API with middleware pattern',\n tags: ['express', 'nodejs', 'api', 'backend', 'rest'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** Express.js\n- **Language:** TypeScript / JavaScript\n- **Database:** PostgreSQL / MongoDB\n- **Package Manager:** npm\n\n## Commands\n\n- **Dev:** \\`npm run dev\\`\n- **Build:** \\`npm run build\\`\n- **Test:** \\`npm test\\`\n\n## Gotchas & Known Issues\n\n- Middleware order matters — auth middleware must come BEFORE route handlers.\n- Always call \\`next()\\` in middleware or the request will hang forever.\n- Error-handling middleware must have exactly 4 parameters: \\`(err, req, res, next)\\`.\n- \\`async\\` route handlers need \\`try/catch\\` or \\`express-async-errors\\` — unhandled rejections crash the server.\n- \\`req.body\\` is undefined without \\`express.json()\\` middleware.\n\n## Key Structure\n\n\\`\\`\\`\nsrc/\n routes/ # Route definitions\n controllers/ # Request handlers\n middleware/ # Auth, validation, error handling\n services/ # Business logic\n models/ # Database models\n utils/ # Helper functions\n config/ # App configuration\n\\`\\`\\`\n\n## Conventions\n\n- Routes: \\`/api/v1/[resource]\\`\n- Controllers: thin — delegate to services\n- Services: contain all business logic\n- Always return consistent JSON: \\`{ success, data, error }\\`\n- Use HTTP status codes correctly (201 for create, 204 for delete)\n\n## Rules\n\n### Do Not\n- Do not put business logic in controllers\n- Do not use \\`res.send()\\` for API responses — use \\`res.json()\\`\n- Do not remove auth middleware from protected routes`,\n },\n {\n id: 'nestjs',\n name: 'NestJS',\n description: 'NestJS with decorators, DI, modules, and TypeORM/Prisma',\n tags: ['nestjs', 'typescript', 'api', 'backend', 'enterprise'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** NestJS\n- **Language:** TypeScript (strict)\n- **ORM:** Prisma / TypeORM\n\n## Commands\n\n- **Dev:** \\`npm run start:dev\\`\n- **Build:** \\`npm run build\\`\n- **Test:** \\`npm run test\\`\n- **E2E:** \\`npm run test:e2e\\`\n\n## Gotchas & Known Issues\n\n- Every service/controller MUST be registered in a Module's \\`providers\\`/\\`controllers\\`.\n- Circular dependencies crash silently — use \\`forwardRef()\\` to resolve them.\n- Guards execute BEFORE interceptors and pipes — order: Guards → Interceptors → Pipes → Handler.\n- \\`@Injectable()\\` decorator is required on ALL service classes.\n- DTOs must use \\`class-validator\\` decorators AND \\`ValidationPipe\\` in main.ts.\n- \\`ConfigService.get()\\` returns \\`string | undefined\\` — always provide a default.\n\n## Conventions\n\n- One module per feature (\\`users/users.module.ts\\`)\n- DTOs: \\`create-user.dto.ts\\`, \\`update-user.dto.ts\\`\n- Use \\`@ApiTags()\\` and \\`@ApiOperation()\\` for Swagger docs\n- Global exception filter handles all unhandled errors`,\n },\n // ─── Python ────────────────────────────────────────\n {\n id: 'django',\n name: 'Django / Django REST',\n description: 'Django with DRF, models, views, and migrations',\n tags: ['django', 'python', 'api', 'backend', 'fullstack'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** Django + Django REST Framework\n- **Language:** Python 3.11+\n- **Database:** PostgreSQL\n\n## Commands\n\n- **Dev:** \\`python manage.py runserver\\`\n- **Migrate:** \\`python manage.py makemigrations && python manage.py migrate\\`\n- **Test:** \\`python manage.py test\\`\n- **Shell:** \\`python manage.py shell\\`\n\n## Gotchas & Known Issues\n\n- Always run \\`makemigrations\\` after changing models — Django won't auto-detect.\n- Migration files are version-controlled — never delete them manually.\n- \\`ForeignKey\\` requires \\`on_delete\\` parameter (usually \\`CASCADE\\` or \\`PROTECT\\`).\n- \\`@login_required\\` redirects to LOGIN_URL — use \\`@permission_classes\\` for DRF.\n- QuerySets are lazy — they don't hit the database until evaluated.\n- \\`select_related()\\` for ForeignKey, \\`prefetch_related()\\` for ManyToMany.\n- Never use \\`Model.objects.all()\\` in templates — creates N+1 queries.\n\n## Key Structure\n\n\\`\\`\\`\nproject_name/\n settings.py # Configuration (NEVER commit secrets here)\n urls.py # Root URL configuration\napp_name/\n models.py # Database models\n views.py # View functions / ViewSets\n serializers.py # DRF serializers\n urls.py # App-level URLs\n admin.py # Admin configuration\n tests.py # Tests\n migrations/ # Database migrations (auto-generated)\n\\`\\`\\``,\n },\n {\n id: 'fastapi',\n name: 'FastAPI',\n description: 'FastAPI with Pydantic, async/await, and SQLAlchemy',\n tags: ['fastapi', 'python', 'api', 'backend', 'async'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** FastAPI\n- **Language:** Python 3.11+\n- **ORM:** SQLAlchemy / Tortoise ORM\n\n## Commands\n\n- **Dev:** \\`uvicorn main:app --reload\\`\n- **Test:** \\`pytest\\`\n- **Docs:** http://localhost:8000/docs (Swagger UI auto-generated)\n\n## Gotchas & Known Issues\n\n- Path parameters must match function parameter names exactly.\n- \\`Depends()\\` creates a new instance per request — use \\`yield\\` for cleanup.\n- Pydantic v2 uses \\`model_validate()\\` not \\`from_orm()\\` for ORM models.\n- \\`async def\\` endpoints run in the event loop — blocking code freezes the server.\n- Use \\`BackgroundTasks\\` for fire-and-forget work, not \\`asyncio.create_task()\\`.\n- Response model fields must be JSON-serializable — datetime needs custom encoder.\n\n## Conventions\n\n- Routers: one file per resource (\\`routers/users.py\\`)\n- Schemas: Pydantic models for request/response (\\`schemas/user.py\\`)\n- CRUD: database operations in \\`crud/\\` module\n- Dependencies: shared logic in \\`dependencies.py\\``,\n },\n // ─── PHP ───────────────────────────────────────────\n {\n id: 'laravel',\n name: 'Laravel',\n description: 'Laravel with Eloquent, Blade, and Artisan commands',\n tags: ['laravel', 'php', 'fullstack', 'backend', 'mvc'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** Laravel\n- **Language:** PHP 8.2+\n- **Database:** MySQL / PostgreSQL\n\n## Commands\n\n- **Dev:** \\`php artisan serve\\`\n- **Migrate:** \\`php artisan migrate\\`\n- **Test:** \\`php artisan test\\`\n- **Generate:** \\`php artisan make:model ModelName -mcr\\` (model + migration + controller + resource)\n\n## Gotchas & Known Issues\n\n- Always run \\`composer dump-autoload\\` after adding new classes manually.\n- \\`$fillable\\` or \\`$guarded\\` MUST be set on models — mass assignment is blocked by default.\n- Route model binding only works with \\`{model}\\` parameter name matching the variable name.\n- \\`php artisan config:cache\\` caches config — env() calls outside config files will return null.\n- Eloquent \\`delete()\\` fires events, \\`DB::table()->delete()\\` does NOT.\n- Middleware order in \\`Kernel.php\\` matters — auth before API throttle.\n\n## Key Structure\n\n\\`\\`\\`\napp/\n Http/Controllers/ # Request handlers\n Models/ # Eloquent models\n Services/ # Business logic\nroutes/\n web.php # Web routes (sessions, CSRF)\n api.php # API routes (stateless)\ndatabase/\n migrations/ # Schema changes\n seeders/ # Test data\nresources/views/ # Blade templates\n\\`\\`\\``,\n },\n // ─── Mobile ────────────────────────────────────────\n {\n id: 'react-native',\n name: 'React Native / Expo',\n description: 'React Native with Expo, navigation, and native modules',\n tags: ['react-native', 'expo', 'mobile', 'typescript', 'ios', 'android'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** React Native / Expo\n- **Language:** TypeScript\n- **Navigation:** React Navigation\n\n## Commands\n\n- **Dev:** \\`npx expo start\\`\n- **iOS:** \\`npx expo run:ios\\`\n- **Android:** \\`npx expo run:android\\`\n\n## Gotchas & Known Issues\n\n- There is NO DOM — \\`div\\`, \\`span\\`, \\`p\\` don't exist. Use \\`View\\`, \\`Text\\`, \\`Pressable\\`.\n- CSS doesn't exist — use \\`StyleSheet.create()\\` or NativeWind for Tailwind-like syntax.\n- \\`flexDirection\\` defaults to \\`column\\` (not \\`row\\` like web).\n- \\`onClick\\` doesn't exist — use \\`onPress\\` on \\`Pressable\\` or \\`TouchableOpacity\\`.\n- Platform-specific code: \\`Platform.OS === 'ios'\\` or \\`.ios.tsx\\` / \\`.android.tsx\\` file extensions.\n- Expo Go has limitations — some native modules require development builds.\n- \\`SafeAreaView\\` is required to avoid content under the notch/status bar.\n\n## Conventions\n\n- Screens in \\`screens/\\` or \\`app/\\` (Expo Router)\n- Components in \\`components/\\`\n- Use \\`expo-constants\\` for env vars, not \\`process.env\\``,\n },\n // ─── Static / JAMstack ─────────────────────────────\n {\n id: 'html-css-js',\n name: 'HTML + CSS + JavaScript',\n description: 'Static website or vanilla JS app without frameworks',\n tags: ['html', 'css', 'javascript', 'static', 'vanilla', 'beginner'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Type:** Static website / Vanilla JavaScript\n- **Language:** HTML, CSS, JavaScript\n- **No build tools** — files are served directly\n\n## Architecture Decisions\n\n- This project intentionally uses NO frameworks — keep it simple.\n- All JavaScript is vanilla — no jQuery, React, or other libraries.\n- CSS is vanilla — no Tailwind, SCSS, or CSS-in-JS.\n\n## Gotchas & Known Issues\n\n- No module bundler — use \\`<script>\\` tags in HTML, not \\`import\\` statements.\n- If using ES modules, add \\`type=\"module\"\\` to the script tag.\n- CSS files must be linked in HTML \\`<head>\\` — they don't auto-load.\n- \\`fetch()\\` requires a server for local files — use Live Server extension.\n- No hot reload — refresh the browser manually or use Live Server.\n\n## Key Structure\n\n\\`\\`\\`\nindex.html # Main page\nstyles/ # CSS files\n style.css\nscripts/ # JavaScript files\n app.js\nassets/ # Images, fonts\n images/\n fonts/\n\\`\\`\\`\n\n## Conventions\n\n- Semantic HTML5 elements (\\`header\\`, \\`main\\`, \\`section\\`, \\`footer\\`)\n- BEM naming for CSS (\\`.block__element--modifier\\`)\n- All interactive elements must have \\`id\\` attributes\n- Mobile-first responsive design\n- Accessible: alt text on images, proper heading hierarchy`,\n },\n // ─── Fullstack / Meta ──────────────────────────────\n {\n id: 't3-stack',\n name: 'T3 Stack',\n description: 'Next.js + tRPC + Prisma + NextAuth + Tailwind (create-t3-app)',\n tags: ['t3', 'nextjs', 'trpc', 'prisma', 'typescript', 'fullstack'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Stack:** T3 (Next.js + tRPC + Prisma + NextAuth + Tailwind)\n- **Language:** TypeScript (strict)\n\n## Commands\n\n- **Dev:** \\`npm run dev\\`\n- **DB Push:** \\`npx prisma db push\\`\n- **DB Studio:** \\`npx prisma studio\\`\n- **Generate:** \\`npx prisma generate\\` (after schema changes)\n\n## Gotchas & Known Issues\n\n- After changing \\`schema.prisma\\`, always run \\`npx prisma generate\\`.\n- tRPC procedures are type-safe end-to-end — do NOT create separate API routes.\n- \\`useSession()\\` requires \\`SessionProvider\\` wrapper in the layout.\n- Prisma Client is singleton — import from \\`src/server/db.ts\\`, never create new instances.\n- tRPC context has access to session — use \\`protectedProcedure\\` for auth-required endpoints.\n- Tailwind classes: check \\`tailwind.config.ts\\` for custom theme values.\n\n## Key Structure\n\n\\`\\`\\`\nsrc/\n app/ # Next.js App Router\n server/\n api/ # tRPC routers\n db.ts # Prisma client singleton\n auth.ts # NextAuth configuration\n trpc/ # tRPC client setup\nprisma/\n schema.prisma # Database schema\n\\`\\`\\``,\n },\n {\n id: 'supabase',\n name: 'Supabase + Next.js',\n description: 'Next.js with Supabase for auth, database, and storage',\n tags: ['supabase', 'nextjs', 'postgres', 'auth', 'baas'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Frontend:** Next.js (App Router)\n- **Backend:** Supabase (PostgreSQL + Auth + Storage)\n- **Language:** TypeScript\n\n## Commands\n\n- **Dev:** \\`npm run dev\\`\n- **Supabase Local:** \\`npx supabase start\\`\n- **Types:** \\`npx supabase gen types typescript --local > src/types/database.ts\\`\n- **Migration:** \\`npx supabase migration new [name]\\`\n\n## Gotchas & Known Issues\n\n- Use \\`createServerClient()\\` in Server Components, \\`createBrowserClient()\\` in Client Components.\n- Row Level Security (RLS) is enabled by default — queries return empty without proper policies.\n- Always regenerate types after changing database schema.\n- \\`supabase.auth.getSession()\\` is deprecated on server — use \\`supabase.auth.getUser()\\`.\n- Storage buckets need explicit policies for upload/download access.\n- Realtime subscriptions require the table to have \\`REPLICA IDENTITY FULL\\` set.`,\n },\n];\n\n/**\n * Get all available templates.\n */\nexport function getAllTemplates(): FrameworkTemplate[] {\n return FRAMEWORK_TEMPLATES;\n}\n\n/**\n * Find template by ID.\n */\nexport function getTemplateById(id: string): FrameworkTemplate | undefined {\n return FRAMEWORK_TEMPLATES.find((t) => t.id === id);\n}\n\n/**\n * Search templates by query (matches name, description, tags).\n */\nexport function searchTemplates(query: string): FrameworkTemplate[] {\n const q = query.toLowerCase();\n return FRAMEWORK_TEMPLATES.filter((t) =>\n t.name.toLowerCase().includes(q) ||\n t.description.toLowerCase().includes(q) ||\n t.tags.some((tag) => tag.includes(q))\n );\n}\n\n/**\n * Auto-detect the best template for a project based on its framework.\n */\nexport function detectBestTemplate(framework: string): FrameworkTemplate | undefined {\n const fwLower = framework.toLowerCase();\n\n const mapping: Record<string, string> = {\n 'next.js': 'nextjs',\n 'nextjs': 'nextjs',\n 'react': 'react-vite',\n 'react + vite': 'react-vite',\n 'vue': 'vue-nuxt',\n 'vue.js': 'vue-nuxt',\n 'nuxt': 'vue-nuxt',\n 'nuxt.js': 'vue-nuxt',\n 'express': 'express',\n 'express.js': 'express',\n 'nestjs': 'nestjs',\n 'nest.js': 'nestjs',\n 'django': 'django',\n 'fastapi': 'fastapi',\n 'flask': 'fastapi', // Close enough\n 'laravel': 'laravel',\n 'react native': 'react-native',\n 'expo': 'react-native',\n 'html': 'html-css-js',\n 'static': 'html-css-js',\n 't3': 't3-stack',\n 'supabase': 'supabase',\n };\n\n for (const [key, templateId] of Object.entries(mapping)) {\n if (fwLower.includes(key)) {\n return getTemplateById(templateId);\n }\n }\n\n return undefined;\n}\n","import ora from 'ora';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectContextFiles, scoreContextFile, getGrade, getScoreColor } from '../core/contextScorer.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Lint command — Score and analyze quality of AI context files.\n * Detects generic rules, missing tribal knowledge, and suggests improvements.\n */\n\nexport async function lintCommand(): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Scanning for AI context files...').start();\n\n try {\n const scan = await scanRepository(cwd);\n const contextFiles = detectContextFiles(cwd);\n const existingFiles = contextFiles.filter((f) => f.exists);\n\n if (existingFiles.length === 0) {\n spinner.fail('No AI context files found');\n logger.blank();\n logger.warn('No AGENTS.md, CLAUDE.md, or .cursorrules found');\n logger.blank();\n logger.indent(chalk.bold('Create one with:'));\n logger.indent(` ${chalk.cyan('repolens init')} — Interactive context creation`, 1);\n return;\n }\n\n spinner.succeed(`Found ${existingFiles.length} context file(s)`);\n\n // Score each file\n for (const file of existingFiles) {\n const score = scoreContextFile(file.content, scan.fileTree);\n const grade = getGrade(score.overall);\n const color = getScoreColor(score.overall);\n\n logger.section('📋', `${file.path}`);\n logger.blank();\n\n // Overall score with visual bar\n const scoreBar = '█'.repeat(Math.round(score.overall / 5)) + '░'.repeat(20 - Math.round(score.overall / 5));\n const colorFn = color === 'green' ? chalk.green : color === 'yellow' ? chalk.yellow : chalk.red;\n\n logger.indent(chalk.bold(`Overall: ${colorFn(`${score.overall}/100`)} ${colorFn(grade)} ${colorFn(scoreBar)}`));\n logger.blank();\n\n // Breakdown\n logger.indent(chalk.bold('Breakdown:'));\n const metrics = [\n { name: 'Specificity', value: score.breakdown.specificity, desc: 'Project-specific vs generic rules' },\n { name: 'Coverage', value: score.breakdown.coverage, desc: 'Important areas covered' },\n { name: 'Conciseness', value: score.breakdown.conciseness, desc: 'Not too long, not too short' },\n { name: 'Freshness', value: score.breakdown.freshness, desc: 'References actual project files' },\n { name: 'Tribal Knowledge', value: score.breakdown.tribalKnowledge, desc: 'Non-inferable information' },\n ];\n\n for (const m of metrics) {\n const mColor = getScoreColor(m.value);\n const mFn = mColor === 'green' ? chalk.green : mColor === 'yellow' ? chalk.yellow : chalk.red;\n const bar = '█'.repeat(Math.round(m.value / 10)) + '░'.repeat(10 - Math.round(m.value / 10));\n logger.indent(` ${m.name.padEnd(18)} ${mFn(`${String(m.value).padStart(3)}/100`)} ${mFn(bar)} ${chalk.dim(m.desc)}`, 1);\n }\n\n logger.blank();\n\n // Stats\n logger.indent(chalk.bold('Stats:'));\n logger.kv('Total Lines', String(score.totalLines));\n logger.kv('Generic Rules', chalk.red(String(score.genericRulesCount)));\n logger.kv('Specific Rules', chalk.green(String(score.specificRulesCount)));\n\n // Issues\n if (score.issues.length > 0) {\n logger.blank();\n logger.indent(chalk.bold('Issues:'));\n for (const issue of score.issues) {\n const icon = issue.severity === 'error' ? '🔴' : issue.severity === 'warning' ? '🟡' : '🔵';\n const issueFn = issue.severity === 'error' ? chalk.red : issue.severity === 'warning' ? chalk.yellow : chalk.blue;\n let msg = `${icon} ${issueFn(issue.message)}`;\n if (issue.line) msg += chalk.dim(` (line ${issue.line})`);\n logger.indent(msg, 1);\n if (issue.fix) {\n logger.indent(chalk.dim(` Fix: ${issue.fix}`), 2);\n }\n }\n }\n\n // Suggestions\n if (score.suggestions.length > 0) {\n logger.blank();\n logger.indent(chalk.bold('Suggestions:'));\n for (const s of score.suggestions) {\n logger.indent(chalk.cyan(` 💡 ${s}`), 1);\n }\n }\n }\n\n // Missing files\n const missingFiles = contextFiles.filter((f) => !f.exists);\n if (missingFiles.length > 0) {\n logger.blank();\n logger.section('📭', 'Missing Context Files');\n for (const f of missingFiles) {\n const typeLabels: Record<string, string> = {\n agents: 'AGENTS.md (Universal standard)',\n claude: 'CLAUDE.md (Claude Code)',\n cursorrules: '.cursorrules (Cursor IDE)',\n copilot: 'copilot-instructions.md (GitHub Copilot)',\n };\n logger.indent(chalk.dim(` ✗ ${typeLabels[f.type] || f.path}`));\n }\n logger.blank();\n logger.indent(`Sync all from AGENTS.md: ${chalk.cyan('repolens sync')}`);\n }\n\n } catch (error) {\n spinner.fail('Lint failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport { detectContextFiles } from '../core/contextScorer.js';\nimport { createSyncPlan, executeSyncPlan } from '../core/contextSyncer.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Sync command — Sync AGENTS.md to CLAUDE.md, .cursorrules, and copilot-instructions.\n * Solves the fragmentation problem.\n */\n\nexport async function syncCommand(options: { force?: boolean; dryRun?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Detecting context files...').start();\n\n try {\n const contextFiles = detectContextFiles(cwd);\n const agentsFile = contextFiles.find((f) => f.type === 'agents' && f.exists);\n\n if (!agentsFile) {\n spinner.fail('No AGENTS.md found');\n logger.blank();\n logger.warn('AGENTS.md is the source of truth for syncing.');\n logger.indent(`Create one with: ${chalk.cyan('repolens init')}`);\n return;\n }\n\n spinner.succeed('Found AGENTS.md as source');\n\n // Create sync plan\n const plan = createSyncPlan(agentsFile, contextFiles, cwd);\n\n // Show plan\n logger.section('📋', 'Sync Plan');\n logger.indent(chalk.bold(`Source: ${chalk.cyan(agentsFile.path)}`));\n logger.blank();\n\n for (const target of plan.targets) {\n const icon = target.action === 'create' ? '🆕' : target.action === 'update' ? '♻️' : '⏭️';\n const actionLabel = target.action === 'create' ? chalk.green('CREATE') :\n target.action === 'update' ? chalk.yellow('UPDATE') : chalk.dim('SKIP');\n logger.indent(`${icon} ${actionLabel} ${target.path} ${chalk.dim(`— ${target.label}`)}`);\n }\n\n if (plan.conflicts.length > 0) {\n logger.blank();\n logger.indent(chalk.bold.yellow('⚠ Conflicts:'));\n for (const conflict of plan.conflicts) {\n logger.indent(chalk.yellow(` ${conflict.file}: ${conflict.reason}`));\n if (options.force) {\n logger.indent(chalk.dim(' → Will overwrite (--force flag set)'));\n } else {\n logger.indent(chalk.dim(' → Skipping. Use --force to overwrite'));\n }\n }\n }\n\n // Execute if not dry-run\n if (options.dryRun) {\n logger.blank();\n logger.info('Dry run — no files were written');\n return;\n }\n\n // If force mode, change skip targets to update\n if (options.force) {\n for (const target of plan.targets) {\n if (target.action === 'skip') target.action = 'update';\n }\n }\n\n logger.blank();\n const syncSpinner = ora('Syncing files...').start();\n const result = executeSyncPlan(plan, cwd);\n syncSpinner.succeed('Sync complete');\n\n logger.blank();\n if (result.written.length > 0) {\n logger.indent(chalk.bold('Written:'));\n for (const f of result.written) {\n logger.success(f);\n }\n }\n if (result.skipped.length > 0) {\n logger.indent(chalk.bold('Skipped (has manual edits):'));\n for (const f of result.skipped) {\n logger.warn(`${f} — use --force to overwrite`);\n }\n }\n\n logger.blank();\n logger.indent(chalk.dim('Tip: Commit these files to your repo so all AI tools use the same context.'));\n\n } catch (error) {\n spinner.fail('Sync failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { ContextFile } from './contextScorer.js';\n\n/**\n * Cross-tool Context Syncer v2.\n * Syncs AGENTS.md to ALL major AI coding tools:\n * - CLAUDE.md (Claude Code / Codex)\n * - .cursorrules (Cursor legacy)\n * - .cursor/rules/project.mdc (Cursor modern — MDC format with YAML frontmatter)\n * - .github/copilot-instructions.md (GitHub Copilot)\n * - .windsurfrules (Windsurf / Codeium)\n * - CODEX.md (OpenAI Codex)\n */\n\nexport interface SyncPlan {\n source: ContextFile;\n targets: SyncTarget[];\n conflicts: SyncConflict[];\n}\n\nexport interface SyncTarget {\n type: ContextFile['type'] | 'mdc' | 'windsurf' | 'codex';\n path: string;\n action: 'create' | 'update' | 'skip';\n exists: boolean;\n content: string;\n label: string;\n}\n\nexport interface SyncConflict {\n file: string;\n reason: string;\n sourceSnippet: string;\n targetSnippet: string;\n}\n\n// ─── Converters ─────────────────────────────────────────\n\n/**\n * Convert AGENTS.md content to CLAUDE.md format.\n */\nfunction toClaudeMd(agentsContent: string): string {\n const sections: string[] = [];\n sections.push(`# CLAUDE.md`);\n sections.push('');\n sections.push(`> Project-specific instructions for Claude Code.`);\n sections.push(`> Synced from AGENTS.md by RepoLens AI.`);\n sections.push('');\n\n const lines = agentsContent.split('\\n');\n let skipHeader = true;\n\n for (const line of lines) {\n if (skipHeader && (line.startsWith('# AGENTS') || line.startsWith('> '))) continue;\n if (skipHeader && line.trim() === '') continue;\n skipHeader = false;\n sections.push(line);\n }\n\n sections.push('');\n sections.push('---');\n sections.push(`*Synced from AGENTS.md by [RepoLens AI](https://github.com/repolens/repolens-ai) on ${new Date().toISOString().split('T')[0]}*`);\n\n return sections.join('\\n');\n}\n\n/**\n * Convert AGENTS.md content to .cursorrules format (legacy).\n */\nfunction toCursorRules(agentsContent: string): string {\n const sections: string[] = [];\n const lines = agentsContent.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('# AGENTS')) {\n sections.push('# Cursor Rules');\n sections.push('');\n sections.push('> Auto-synced from AGENTS.md by RepoLens AI.');\n } else {\n sections.push(line);\n }\n }\n\n sections.push('');\n sections.push(`# Synced: ${new Date().toISOString().split('T')[0]}`);\n\n return sections.join('\\n');\n}\n\n/**\n * Convert AGENTS.md content to .cursor/rules/project.mdc format.\n * MDC = Markdown Cursor — modern format with YAML frontmatter.\n * This is the current standard for Cursor IDE (2026+).\n */\nfunction toMdcRules(agentsContent: string, projectName: string): string {\n const sections: string[] = [];\n\n // YAML frontmatter — this is what makes .mdc special\n sections.push('---');\n sections.push(`description: Project rules for ${projectName} — auto-synced from AGENTS.md`);\n sections.push('globs:');\n sections.push('alwaysApply: true');\n sections.push('---');\n sections.push('');\n\n // Extract content, skipping AGENTS.md header\n const lines = agentsContent.split('\\n');\n let skipHeader = true;\n\n for (const line of lines) {\n if (skipHeader && (line.startsWith('# AGENTS') || line.startsWith('> '))) continue;\n if (skipHeader && line.trim() === '') continue;\n skipHeader = false;\n\n // Convert ## headers to # (MDC uses flatter hierarchy)\n if (line.startsWith('## ')) {\n sections.push(line.replace('## ', '# '));\n } else if (line.startsWith('### ')) {\n sections.push(line.replace('### ', '## '));\n } else {\n sections.push(line);\n }\n }\n\n // Remove trailing generator line if present\n const lastIdx = sections.length - 1;\n if (sections[lastIdx]?.includes('RepoLens AI') || sections[lastIdx]?.includes('---')) {\n sections.pop();\n if (sections[lastIdx - 1]?.trim() === '') sections.pop();\n }\n\n return sections.join('\\n');\n}\n\n/**\n * Convert AGENTS.md to GitHub Copilot instructions format.\n */\nfunction toCopilotInstructions(agentsContent: string): string {\n const sections: string[] = [];\n sections.push('# Copilot Instructions');\n sections.push('');\n sections.push('> Auto-synced from AGENTS.md by RepoLens AI.');\n sections.push('');\n\n const lines = agentsContent.split('\\n');\n let skipHeader = true;\n\n for (const line of lines) {\n if (skipHeader && (line.startsWith('# ') || line.startsWith('> ') || line.trim() === '')) continue;\n skipHeader = false;\n sections.push(line);\n }\n\n sections.push('');\n sections.push(`<!-- Synced: ${new Date().toISOString().split('T')[0]} -->`);\n\n return sections.join('\\n');\n}\n\n/**\n * Convert AGENTS.md to .windsurfrules format (Windsurf / Codeium).\n */\nfunction toWindsurfRules(agentsContent: string): string {\n const sections: string[] = [];\n const lines = agentsContent.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('# AGENTS')) {\n sections.push('# Windsurf Rules');\n sections.push('');\n sections.push('> Auto-synced from AGENTS.md by RepoLens AI.');\n } else {\n sections.push(line);\n }\n }\n\n sections.push('');\n sections.push(`# Synced: ${new Date().toISOString().split('T')[0]}`);\n\n return sections.join('\\n');\n}\n\n/**\n * Convert AGENTS.md to CODEX.md format (OpenAI Codex).\n */\nfunction toCodexMd(agentsContent: string): string {\n const sections: string[] = [];\n sections.push(`# CODEX.md`);\n sections.push('');\n sections.push(`> Instructions for OpenAI Codex agent.`);\n sections.push(`> Synced from AGENTS.md by RepoLens AI.`);\n sections.push('');\n\n const lines = agentsContent.split('\\n');\n let skipHeader = true;\n\n for (const line of lines) {\n if (skipHeader && (line.startsWith('# AGENTS') || line.startsWith('> '))) continue;\n if (skipHeader && line.trim() === '') continue;\n skipHeader = false;\n sections.push(line);\n }\n\n sections.push('');\n sections.push('---');\n sections.push(`*Synced from AGENTS.md by [RepoLens AI](https://github.com/repolens/repolens-ai) on ${new Date().toISOString().split('T')[0]}*`);\n\n return sections.join('\\n');\n}\n\n// ─── Sync Engine ────────────────────────────────────────\n\n/**\n * Create a sync plan from AGENTS.md to all AI tools.\n */\nexport function createSyncPlan(\n source: ContextFile,\n allContextFiles: ContextFile[],\n cwd: string,\n): SyncPlan {\n const projectName = path.basename(cwd);\n const targets: SyncTarget[] = [];\n const conflicts: SyncConflict[] = [];\n\n if (source.type !== 'agents') {\n return { source, targets: [], conflicts: [{ file: source.path, reason: 'Only AGENTS.md can be used as sync source', sourceSnippet: '', targetSnippet: '' }] };\n }\n\n const targetDefs: { type: SyncTarget['type']; converter: (c: string) => string; filePath: string; label: string }[] = [\n { type: 'claude', converter: (c) => toClaudeMd(c), filePath: 'CLAUDE.md', label: 'Claude Code / Codex CLI' },\n { type: 'mdc', converter: (c) => toMdcRules(c, projectName), filePath: '.cursor/rules/project.mdc', label: 'Cursor IDE (modern .mdc)' },\n { type: 'cursorrules', converter: toCursorRules, filePath: '.cursorrules', label: 'Cursor IDE (legacy)' },\n { type: 'copilot', converter: toCopilotInstructions, filePath: '.github/copilot-instructions.md', label: 'GitHub Copilot' },\n { type: 'windsurf', converter: toWindsurfRules, filePath: '.windsurfrules', label: 'Windsurf / Codeium' },\n { type: 'codex', converter: (c) => toCodexMd(c), filePath: 'CODEX.md', label: 'OpenAI Codex' },\n ];\n\n for (const { type, converter, filePath, label } of targetDefs) {\n const fullPath = path.join(cwd, filePath);\n const exists = fs.existsSync(fullPath);\n const newContent = converter(source.content);\n\n if (exists) {\n const existingContent = fs.readFileSync(fullPath, 'utf-8');\n const hasManualEdits = !existingContent.includes('RepoLens AI') &&\n !existingContent.includes('Synced from AGENTS.md');\n\n if (hasManualEdits) {\n conflicts.push({\n file: filePath,\n reason: `${label}: File contains manual edits`,\n sourceSnippet: source.content.substring(0, 200),\n targetSnippet: existingContent.substring(0, 200),\n });\n targets.push({ type, path: filePath, action: 'skip', exists: true, content: newContent, label });\n } else {\n targets.push({ type, path: filePath, action: 'update', exists: true, content: newContent, label });\n }\n } else {\n targets.push({ type, path: filePath, action: 'create', exists: false, content: newContent, label });\n }\n }\n\n return { source, targets, conflicts };\n}\n\n/**\n * Execute a sync plan — write target files.\n */\nexport function executeSyncPlan(plan: SyncPlan, cwd: string): { written: string[]; skipped: string[] } {\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const target of plan.targets) {\n if (target.action === 'skip') {\n skipped.push(target.path);\n continue;\n }\n\n const fullPath = path.join(cwd, target.path);\n const dir = path.dirname(fullPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Backup existing file\n if (target.exists && fs.existsSync(fullPath)) {\n fs.copyFileSync(fullPath, fullPath + '.backup');\n }\n\n fs.writeFileSync(fullPath, target.content, 'utf-8');\n written.push(target.path);\n }\n\n return { written, skipped };\n}\n","import ora from 'ora';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { detectContextFiles } from '../core/contextScorer.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Doctor command — Health check for your AI development setup.\n * Like `brew doctor` but for AI coding environments.\n */\n\ninterface CheckResult {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n message: string;\n fix?: string;\n}\n\nexport async function doctorCommand(): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n logger.section('🩺', 'AI Development Health Check');\n logger.blank();\n\n const checks: CheckResult[] = [];\n\n // 1. Check context files\n const contextFiles = detectContextFiles(cwd);\n const hasAgents = contextFiles.some((f) => f.type === 'agents' && f.exists);\n const hasClaude = contextFiles.some((f) => f.type === 'claude' && f.exists);\n const hasCursor = contextFiles.some((f) => f.type === 'cursorrules' && f.exists);\n const hasCopilot = contextFiles.some((f) => f.type === 'copilot' && f.exists);\n const hasSkills = contextFiles.some((f) => f.type === 'skill' && f.exists);\n\n checks.push({\n name: 'AGENTS.md',\n status: hasAgents ? 'pass' : 'fail',\n message: hasAgents ? 'Found — universal AI context file' : 'Missing — no universal context file',\n fix: hasAgents ? undefined : 'Run: repolens init',\n });\n\n checks.push({\n name: 'CLAUDE.md',\n status: hasClaude ? 'pass' : 'warn',\n message: hasClaude ? 'Found — Claude Code instructions' : 'Missing — Claude Code will use defaults',\n fix: hasClaude ? undefined : 'Run: repolens sync',\n });\n\n checks.push({\n name: '.cursorrules',\n status: hasCursor ? 'pass' : 'warn',\n message: hasCursor ? 'Found — Cursor IDE rules' : 'Missing — Cursor will use defaults',\n fix: hasCursor ? undefined : 'Run: repolens sync',\n });\n\n checks.push({\n name: 'Copilot Instructions',\n status: hasCopilot ? 'pass' : 'warn',\n message: hasCopilot ? 'Found — GitHub Copilot instructions' : 'Missing — Copilot will use defaults',\n fix: hasCopilot ? undefined : 'Run: repolens sync',\n });\n\n // 2. Check Git\n const hasGit = fs.existsSync(path.join(cwd, '.git'));\n checks.push({\n name: 'Git Repository',\n status: hasGit ? 'pass' : 'warn',\n message: hasGit ? 'Initialized' : 'Not a git repository',\n fix: hasGit ? undefined : 'Run: git init',\n });\n\n // 3. Check .gitignore\n const hasGitignore = fs.existsSync(path.join(cwd, '.gitignore'));\n let gitignoreHasEnv = false;\n if (hasGitignore) {\n const content = fs.readFileSync(path.join(cwd, '.gitignore'), 'utf-8');\n gitignoreHasEnv = content.includes('.env');\n }\n checks.push({\n name: '.gitignore',\n status: hasGitignore ? (gitignoreHasEnv ? 'pass' : 'warn') : 'warn',\n message: hasGitignore\n ? (gitignoreHasEnv ? 'Found — .env is excluded' : 'Found but .env not in ignore list')\n : 'Missing',\n fix: gitignoreHasEnv ? undefined : 'Add .env to .gitignore',\n });\n\n // 4. Check for .env files\n const envFiles = fs.readdirSync(cwd).filter((f) => f.startsWith('.env') && !f.endsWith('.example'));\n checks.push({\n name: 'Environment Files',\n status: envFiles.length === 0 ? 'pass' : 'warn',\n message: envFiles.length === 0 ? 'No .env files in root (good)' : `${envFiles.length} .env file(s) found — ensure they are gitignored`,\n });\n\n // 5. Check for README\n const hasReadme = fs.existsSync(path.join(cwd, 'README.md')) || fs.existsSync(path.join(cwd, 'readme.md'));\n checks.push({\n name: 'README.md',\n status: hasReadme ? 'pass' : 'warn',\n message: hasReadme ? 'Found' : 'Missing — add project documentation',\n });\n\n // 6. Check package.json scripts\n const pkgPath = path.join(cwd, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const hasTest = pkg.scripts?.test && pkg.scripts.test !== 'echo \"Error: no test specified\" && exit 1';\n const hasLint = pkg.scripts?.lint;\n checks.push({\n name: 'Test Script',\n status: hasTest ? 'pass' : 'warn',\n message: hasTest ? `Configured: ${pkg.scripts.test}` : 'No test script configured',\n });\n checks.push({\n name: 'Lint Script',\n status: hasLint ? 'pass' : 'warn',\n message: hasLint ? `Configured: ${pkg.scripts.lint}` : 'No lint script configured',\n });\n } catch { /* skip */ }\n }\n\n // 7. Check for context file sync status\n if (hasAgents && (hasClaude || hasCursor)) {\n const agentsFile = contextFiles.find((f) => f.type === 'agents' && f.exists);\n const claudeFile = contextFiles.find((f) => f.type === 'claude' && f.exists);\n const cursorFile = contextFiles.find((f) => f.type === 'cursorrules' && f.exists);\n\n let inSync = true;\n if (claudeFile?.exists && !claudeFile.content.includes('Synced from AGENTS.md')) {\n inSync = false;\n }\n if (cursorFile?.exists && !cursorFile.content.includes('Synced from AGENTS.md')) {\n inSync = false;\n }\n\n checks.push({\n name: 'Context Sync',\n status: inSync ? 'pass' : 'warn',\n message: inSync ? 'Context files appear to be in sync' : 'Context files may be out of sync',\n fix: inSync ? undefined : 'Run: repolens sync',\n });\n }\n\n // Display results\n let passCount = 0;\n let warnCount = 0;\n let failCount = 0;\n\n for (const check of checks) {\n const icon = check.status === 'pass' ? chalk.green('✓') : check.status === 'warn' ? chalk.yellow('⚠') : chalk.red('✗');\n const statusFn = check.status === 'pass' ? chalk.green : check.status === 'warn' ? chalk.yellow : chalk.red;\n\n logger.indent(`${icon} ${chalk.bold(check.name.padEnd(22))} ${statusFn(check.message)}`);\n if (check.fix) {\n logger.indent(chalk.dim(` Fix: ${check.fix}`), 2);\n }\n\n if (check.status === 'pass') passCount++;\n else if (check.status === 'warn') warnCount++;\n else failCount++;\n }\n\n // Summary\n logger.blank();\n logger.indent(chalk.bold('Summary:'));\n logger.indent(` ${chalk.green(`${passCount} passed`)} ${chalk.yellow(`${warnCount} warnings`)} ${chalk.red(`${failCount} failed`)}`);\n\n const healthScore = Math.round((passCount / checks.length) * 100);\n const healthBar = chalk.green('█'.repeat(Math.round(healthScore / 5))) +\n chalk.dim('░'.repeat(20 - Math.round(healthScore / 5)));\n logger.indent(` Health: ${healthBar} ${healthScore}%`);\n\n if (failCount > 0) {\n logger.blank();\n logger.indent(chalk.bold('Quick fix:'));\n logger.indent(` ${chalk.cyan('repolens init')} — Create AGENTS.md with tribal knowledge`);\n logger.indent(` ${chalk.cyan('repolens sync')} — Sync to all AI tools`);\n }\n}\n","import * as http from 'node:http';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Dashboard command — Launch a beautiful local web dashboard.\n * Provides visual context management, quality scores, and sync status.\n */\n\nexport async function dashboardCommand(options: { port?: number }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const port = options.port || 3141;\n\n logger.section('🎨', 'RepoLens Dashboard');\n logger.blank();\n\n // Build API handler\n const apiHandler = await createApiHandler(cwd);\n\n const server = http.createServer(async (req, res) => {\n const url = new URL(req.url || '/', `http://localhost:${port}`);\n\n // CORS\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(200);\n res.end();\n return;\n }\n\n // API routes\n if (url.pathname.startsWith('/api/')) {\n res.setHeader('Content-Type', 'application/json');\n try {\n const data = await apiHandler(url.pathname, cwd);\n res.writeHead(200);\n res.end(JSON.stringify(data));\n } catch (err: any) {\n res.writeHead(500);\n res.end(JSON.stringify({ error: err.message }));\n }\n return;\n }\n\n // Serve dashboard HTML\n res.setHeader('Content-Type', 'text/html');\n res.writeHead(200);\n res.end(getDashboardHTML(cwd));\n });\n\n server.listen(port, () => {\n logger.success(`Dashboard running at ${chalk.cyan(`http://localhost:${port}`)}`);\n logger.blank();\n logger.indent(chalk.dim('Press Ctrl+C to stop'));\n });\n\n server.on('error', (err: any) => {\n if (err.code === 'EADDRINUSE') {\n logger.error(`Port ${port} is in use. Try: repolens dashboard --port ${port + 1}`);\n } else {\n logger.error(err.message);\n }\n process.exit(1);\n });\n}\n\nasync function createApiHandler(cwd: string) {\n // Lazy imports to avoid loading everything on startup\n const { scanRepository } = await import('../core/repoScanner.js');\n const { detectFramework } = await import('../core/frameworkDetector.js');\n const { classifyFiles } = await import('../core/fileClassifier.js');\n const { analyzeArchitecture } = await import('../core/architectureAnalyzer.js');\n const { detectRisks } = await import('../core/riskDetector.js');\n const { detectContextFiles, scoreContextFile } = await import('../core/contextScorer.js');\n const { readCodeContents, summarizeContents } = await import('../core/contentReader.js');\n\n // Cache results\n let cache: Record<string, { data: any; time: number }> = {};\n const CACHE_TTL = 30_000; // 30s cache\n\n return async (pathname: string, projectCwd: string) => {\n const now = Date.now();\n if (cache[pathname] && (now - cache[pathname].time) < CACHE_TTL) {\n return cache[pathname].data;\n }\n\n let data: any;\n\n switch (pathname) {\n case '/api/overview': {\n const scan = await scanRepository(projectCwd);\n const fw = detectFramework(projectCwd);\n const { byCategory } = classifyFiles(scan.fileTree);\n const arch = analyzeArchitecture(byCategory, fw.framework);\n data = { scan: { ...scan, fileTree: scan.fileTree.slice(0, 50) }, framework: fw, architecture: arch };\n break;\n }\n case '/api/context': {\n const scan = await scanRepository(projectCwd);\n const contextFiles = detectContextFiles(projectCwd);\n const scored = contextFiles\n .filter((f) => f.exists)\n .map((f) => ({\n ...f,\n content: f.content.substring(0, 5000),\n score: scoreContextFile(f.content, scan.fileTree),\n }));\n const missing = contextFiles.filter((f) => !f.exists).map((f) => ({ type: f.type, path: f.path }));\n data = { files: scored, missing };\n break;\n }\n case '/api/risks': {\n const risks = await detectRisks(projectCwd);\n data = risks;\n break;\n }\n case '/api/content': {\n const contents = await readCodeContents(projectCwd);\n data = summarizeContents(contents);\n break;\n }\n default:\n data = { error: 'Unknown endpoint' };\n }\n\n cache[pathname] = { data, time: now };\n return data;\n };\n}\n\nfunction getDashboardHTML(cwd: string): string {\n const projectName = path.basename(cwd);\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>RepoLens AI — ${projectName}</title>\n<link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap\" rel=\"stylesheet\">\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\n:root{--bg:#0a0a0f;--surface:#12121a;--surface2:#1a1a28;--surface3:#222236;--border:#2a2a44;--text:#e8e8f0;--text2:#9898b0;--text3:#606080;--accent:#6366f1;--accent2:#818cf8;--green:#22c55e;--yellow:#eab308;--red:#ef4444;--cyan:#06b6d4;--gradient:linear-gradient(135deg,#6366f1,#8b5cf6,#06b6d4)}\nbody{font-family:'Inter',system-ui,sans-serif;background:var(--bg);color:var(--text);min-height:100vh;overflow-x:hidden}\n.header{position:sticky;top:0;z-index:100;background:rgba(10,10,15,0.85);backdrop-filter:blur(20px);border-bottom:1px solid var(--border);padding:12px 32px;display:flex;align-items:center;justify-content:space-between}\n.logo{font-size:20px;font-weight:800;background:var(--gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent;display:flex;align-items:center;gap:10px}\n.logo span{font-size:24px;-webkit-text-fill-color:initial}\n.project-name{font-size:14px;color:var(--text2);font-weight:400}\n.main{max-width:1400px;margin:0 auto;padding:24px 32px}\n.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:20px;margin-bottom:24px}\n.card{background:var(--surface);border:1px solid var(--border);border-radius:16px;padding:24px;transition:all 0.3s ease}\n.card:hover{border-color:var(--accent);box-shadow:0 0 30px rgba(99,102,241,0.1)}\n.card-title{font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:1.5px;color:var(--text3);margin-bottom:16px;display:flex;align-items:center;gap:8px}\n.stat{font-size:42px;font-weight:800;background:var(--gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent;line-height:1}\n.stat-label{font-size:13px;color:var(--text2);margin-top:6px}\n.score-ring{width:120px;height:120px;position:relative;margin:0 auto}\n.score-ring svg{transform:rotate(-90deg)}\n.score-ring circle{fill:none;stroke-width:8;stroke-linecap:round}\n.score-ring .bg{stroke:var(--surface3)}\n.score-ring .fg{transition:stroke-dashoffset 1s ease}\n.score-value{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:28px;font-weight:800}\n.score-grade{font-size:14px;color:var(--text2);text-align:center;margin-top:8px}\n.bar-chart{display:flex;flex-direction:column;gap:10px}\n.bar-item{display:flex;align-items:center;gap:12px}\n.bar-label{font-size:12px;color:var(--text2);width:120px;text-align:right;flex-shrink:0}\n.bar-track{flex:1;height:8px;background:var(--surface3);border-radius:4px;overflow:hidden}\n.bar-fill{height:100%;border-radius:4px;transition:width 1s ease}\n.bar-value{font-size:12px;font-weight:600;width:40px;flex-shrink:0}\n.file-list{list-style:none;max-height:300px;overflow-y:auto}\n.file-list li{padding:8px 12px;font-size:13px;color:var(--text2);border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px}\n.file-list li:hover{background:var(--surface2)}\n.tag{display:inline-block;padding:2px 8px;border-radius:6px;font-size:11px;font-weight:600}\n.tag.pass{background:rgba(34,197,94,0.15);color:var(--green)}\n.tag.warn{background:rgba(234,179,8,0.15);color:var(--yellow)}\n.tag.fail{background:rgba(239,68,68,0.15);color:var(--red)}\n.tag.missing{background:rgba(96,96,128,0.15);color:var(--text3)}\n.issues-list{list-style:none;max-height:250px;overflow-y:auto}\n.issues-list li{padding:10px 12px;font-size:13px;border-bottom:1px solid var(--border);display:flex;gap:8px;align-items:flex-start}\n.issue-icon{flex-shrink:0;margin-top:2px}\n.section-title{font-size:18px;font-weight:700;margin:32px 0 16px;display:flex;align-items:center;gap:10px}\n.context-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px}\n.context-card{background:var(--surface2);border:1px solid var(--border);border-radius:12px;padding:16px;text-align:center;transition:all 0.3s}\n.context-card:hover{border-color:var(--accent)}\n.context-card .type{font-size:14px;font-weight:700;margin-bottom:4px}\n.context-card .status{font-size:12px;color:var(--text3)}\n.loading{display:flex;align-items:center;justify-content:center;padding:40px;color:var(--text3)}\n.spinner{width:24px;height:24px;border:3px solid var(--surface3);border-top-color:var(--accent);border-radius:50%;animation:spin 0.8s linear infinite;margin-right:12px}\n@keyframes spin{to{transform:rotate(360deg)}}\n.fade-in{animation:fadeIn 0.5s ease}\n@keyframes fadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n.empty{text-align:center;padding:32px;color:var(--text3)}\n.footer{text-align:center;padding:24px;color:var(--text3);font-size:12px;border-top:1px solid var(--border);margin-top:40px}\n</style>\n</head>\n<body>\n<div class=\"header\">\n <div class=\"logo\"><span>🔍</span> RepoLens AI <span class=\"project-name\">— ${projectName}</span></div>\n <div style=\"color:var(--text3);font-size:12px\">v2.0 · Context Intelligence Platform</div>\n</div>\n<div class=\"main\" id=\"app\">\n <div class=\"loading\" id=\"loading\"><div class=\"spinner\"></div>Analyzing your codebase...</div>\n</div>\n<script>\nconst API = '';\nlet data = {};\n\nasync function fetchAll() {\n try {\n const [overview, context, risks, content] = await Promise.all([\n fetch(API+'/api/overview').then(r=>r.json()),\n fetch(API+'/api/context').then(r=>r.json()),\n fetch(API+'/api/risks').then(r=>r.json()),\n fetch(API+'/api/content').then(r=>r.json()),\n ]);\n data = { overview, context, risks, content };\n render();\n } catch(e) {\n document.getElementById('app').innerHTML = '<div class=\"empty\">Failed to load data. Check terminal for errors.</div>';\n }\n}\n\nfunction scoreColor(s) { return s>=70?'var(--green)':s>=40?'var(--yellow)':'var(--red)'; }\nfunction gradeLabel(s) { return s>=90?'A+':s>=80?'A':s>=70?'B':s>=60?'C':s>=50?'D':'F'; }\nfunction ringSVG(score, size=120) {\n const r=48, c=2*Math.PI*r, off=c-(score/100)*c;\n return '<div class=\"score-ring\" style=\"width:'+size+'px;height:'+size+'px\">'+\n '<svg width=\"'+size+'\" height=\"'+size+'\" viewBox=\"0 0 '+size+' '+size+'\">'+\n '<circle class=\"bg\" cx=\"'+(size/2)+'\" cy=\"'+(size/2)+'\" r=\"'+r+'\"/>'+\n '<circle class=\"fg\" cx=\"'+(size/2)+'\" cy=\"'+(size/2)+'\" r=\"'+r+'\" stroke=\"'+scoreColor(score)+'\" stroke-dasharray=\"'+c+'\" stroke-dashoffset=\"'+off+'\"/>'+\n '</svg><div class=\"score-value\" style=\"color:'+scoreColor(score)+'\">'+score+'</div></div>'+\n '<div class=\"score-grade\">Grade: '+gradeLabel(score)+'</div>';\n}\n\nfunction render() {\n const { overview, context, risks, content } = data;\n const fw = overview.framework;\n const scan = overview.scan;\n const arch = overview.architecture;\n const bestScore = context.files.length > 0 ? Math.max(...context.files.map(f=>f.score.overall)) : 0;\n\n let html = '<div class=\"fade-in\">';\n\n // Stats row\n html += '<div class=\"grid\">';\n html += '<div class=\"card\"><div class=\"card-title\">📊 Project</div>';\n html += '<div class=\"stat\">'+scan.totalFiles+'</div><div class=\"stat-label\">files · '+fw.framework+' ('+fw.language+')</div>';\n html += '<div style=\"margin-top:12px;font-size:13px;color:var(--text2)\">'+arch.style+'</div></div>';\n\n html += '<div class=\"card\"><div class=\"card-title\">🧠 Code Intelligence</div>';\n html += '<div class=\"stat\">'+content.totalFunctions+'</div><div class=\"stat-label\">functions · '+content.totalClasses+' classes · '+content.totalLinesOfCode+' LOC</div>';\n html += '<div style=\"margin-top:12px;font-size:13px;color:var(--text2)\">'+content.totalImports+' imports · '+content.totalTodoFixmes+' TODOs</div></div>';\n\n html += '<div class=\"card\"><div class=\"card-title\">⚠️ Risks</div>';\n const riskTotal = risks.summary.high + risks.summary.medium + risks.summary.low;\n html += '<div class=\"stat\" style=\"-webkit-text-fill-color:'+(risks.summary.high>0?'var(--red)':'var(--green)')+'\">'+riskTotal+'</div>';\n html += '<div class=\"stat-label\"><span style=\"color:var(--red)\">'+risks.summary.high+' high</span> · <span style=\"color:var(--yellow)\">'+risks.summary.medium+' medium</span> · <span style=\"color:var(--green)\">'+risks.summary.low+' low</span></div></div>';\n html += '</div>';\n\n // Context Quality Section\n html += '<div class=\"section-title\">🎯 AI Context Quality</div>';\n html += '<div class=\"grid\">';\n\n if (context.files.length > 0) {\n for (const f of context.files) {\n const s = f.score;\n html += '<div class=\"card\">';\n html += '<div class=\"card-title\">'+f.path+'</div>';\n html += ringSVG(s.overall);\n html += '<div class=\"bar-chart\" style=\"margin-top:16px\">';\n const metrics = [\n ['Specificity', s.breakdown.specificity],\n ['Coverage', s.breakdown.coverage],\n ['Conciseness', s.breakdown.conciseness],\n ['Freshness', s.breakdown.freshness],\n ['Tribal Knowledge', s.breakdown.tribalKnowledge]\n ];\n for (const [label, val] of metrics) {\n html += '<div class=\"bar-item\"><div class=\"bar-label\">'+label+'</div>';\n html += '<div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:'+val+'%;background:'+scoreColor(val)+'\"></div></div>';\n html += '<div class=\"bar-value\" style=\"color:'+scoreColor(val)+'\">'+val+'</div></div>';\n }\n html += '</div>';\n // Issues\n if (s.issues.length > 0) {\n html += '<div style=\"margin-top:16px;font-size:13px;font-weight:600;color:var(--text3)\">Issues ('+s.issues.length+')</div>';\n html += '<ul class=\"issues-list\">';\n for (const issue of s.issues.slice(0,8)) {\n const ic = issue.severity==='error'?'🔴':issue.severity==='warning'?'🟡':'🔵';\n html += '<li><span class=\"issue-icon\">'+ic+'</span><span>'+issue.message+'</span></li>';\n }\n html += '</ul>';\n }\n html += '</div>';\n }\n } else {\n html += '<div class=\"card\" style=\"grid-column:1/-1\"><div class=\"empty\">No context files found. Run <code>repolens init</code> to create one.</div></div>';\n }\n html += '</div>';\n\n // Context Files Overview\n html += '<div class=\"section-title\">📁 Context Files Status</div>';\n html += '<div class=\"context-grid\">';\n const allTypes = [{type:'agents',label:'AGENTS.md',desc:'Universal'},{type:'claude',label:'CLAUDE.md',desc:'Claude Code'},{type:'cursorrules',label:'.cursorrules',desc:'Cursor IDE'},{type:'copilot',label:'copilot-instructions',desc:'GitHub Copilot'}];\n for (const t of allTypes) {\n const f = context.files.find(x=>x.type===t.type);\n const m = context.missing.find(x=>x.type===t.type);\n const exists = !!f;\n html += '<div class=\"context-card\">';\n html += '<div class=\"type\">'+t.label+'</div>';\n html += '<div class=\"status\">'+t.desc+'</div>';\n html += '<div style=\"margin-top:8px\"><span class=\"tag '+(exists?'pass':'missing')+'\">'+(exists?'✓ Active':'✗ Missing')+'</span></div>';\n if (f) html += '<div style=\"margin-top:6px;font-size:12px;color:var(--text3)\">Score: '+f.score.overall+'/100</div>';\n html += '</div>';\n }\n html += '</div>';\n\n // Risks\n if (risks.risks.length > 0) {\n html += '<div class=\"section-title\">🛡️ Risk Details</div>';\n html += '<div class=\"card\"><ul class=\"issues-list\">';\n for (const r of risks.risks.slice(0,15)) {\n const ic = r.level==='high'?'🔴':r.level==='medium'?'🟡':'🟢';\n html += '<li><span class=\"issue-icon\">'+ic+'</span><span>'+r.message+(r.file?' <span style=\"color:var(--text3)\">— '+r.file+'</span>':'')+'</span></li>';\n }\n html += '</ul></div>';\n }\n\n // Largest Files\n if (content.largestFiles.length > 0) {\n html += '<div class=\"section-title\">📏 Largest Files</div>';\n html += '<div class=\"card\"><div class=\"bar-chart\">';\n const maxLines = content.largestFiles[0]?.lines || 1;\n for (const f of content.largestFiles.slice(0,8)) {\n const pct = Math.round((f.lines/maxLines)*100);\n html += '<div class=\"bar-item\"><div class=\"bar-label\" style=\"width:200px;font-size:11px\" title=\"'+f.path+'\">'+f.path.split('/').pop()+'</div>';\n html += '<div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:'+pct+'%;background:var(--accent2)\"></div></div>';\n html += '<div class=\"bar-value\" style=\"color:var(--text2)\">'+f.lines+'</div></div>';\n }\n html += '</div></div>';\n }\n\n html += '<div class=\"footer\">RepoLens AI v2.0 · The AI Context Intelligence Platform · <a href=\"https://github.com/repolens/repolens-ai\" style=\"color:var(--accent)\">GitHub</a></div>';\n html += '</div>';\n\n document.getElementById('app').innerHTML = html;\n}\n\nfetchAll();\n</script>\n</body>\n</html>`;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as readline from 'node:readline';\nimport { getAllTemplates, getTemplateById, searchTemplates, detectBestTemplate } from '../templates/frameworkTemplates.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Templates command — Browse and apply curated AGENTS.md templates.\n * Pre-built templates with real tribal knowledge for 15+ frameworks.\n */\n\nexport async function templatesCommand(options: { search?: string; apply?: string; list?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const allTemplates = getAllTemplates();\n\n // Mode 1: Apply a specific template\n if (options.apply) {\n const template = getTemplateById(options.apply);\n if (!template) {\n logger.error(`Template \"${options.apply}\" not found`);\n logger.blank();\n logger.indent('Available templates:');\n for (const t of allTemplates) {\n logger.indent(` ${chalk.cyan(t.id.padEnd(18))} ${t.name}`, 1);\n }\n return;\n }\n\n const outputPath = path.join(cwd, 'AGENTS.md');\n if (fs.existsSync(outputPath)) {\n fs.copyFileSync(outputPath, outputPath + '.backup');\n logger.info('Existing AGENTS.md backed up to AGENTS.md.backup');\n }\n\n fs.writeFileSync(outputPath, template.content, 'utf-8');\n logger.success(`Applied template: ${chalk.bold(template.name)}`);\n logger.blank();\n logger.indent(chalk.bold('Next steps:'));\n logger.indent(` ${chalk.cyan('repolens lint')} — Check quality score`, 1);\n logger.indent(` ${chalk.cyan('repolens sync')} — Sync to CLAUDE.md & .cursorrules`, 1);\n logger.indent(chalk.dim(' Edit AGENTS.md to add your project-specific gotchas and decisions.'));\n return;\n }\n\n // Mode 2: Search templates\n if (options.search) {\n const results = searchTemplates(options.search);\n if (results.length === 0) {\n logger.warn(`No templates found for \"${options.search}\"`);\n logger.indent(chalk.dim(`Try: repolens templates --list`));\n return;\n }\n\n logger.section('🔎', `Search Results for \"${options.search}\"`);\n for (const t of results) {\n logger.blank();\n logger.indent(`${chalk.bold.cyan(t.id)} — ${chalk.bold(t.name)}`);\n logger.indent(chalk.dim(t.description), 2);\n logger.indent(chalk.dim(`Tags: ${t.tags.join(', ')}`), 2);\n logger.indent(chalk.dim(`Apply: repolens templates --apply ${t.id}`), 2);\n }\n return;\n }\n\n // Mode 3: List all (default) + auto-detect recommendation\n logger.section('📚', `Template Library (${allTemplates.length} templates)`);\n logger.indent(chalk.dim('Curated AGENTS.md templates with real tribal knowledge for popular frameworks.'));\n logger.blank();\n\n // Auto-detect framework and recommend\n const fw = detectFramework(cwd);\n const recommended = detectBestTemplate(fw.framework);\n\n if (recommended) {\n logger.indent(chalk.bold.green(`⭐ Recommended for your project (${fw.framework}):`));\n logger.indent(` ${chalk.bold.cyan(recommended.id)} — ${recommended.name}`, 1);\n logger.indent(` ${chalk.dim(`Apply: repolens templates --apply ${recommended.id}`)}`, 1);\n logger.blank();\n logger.indent(chalk.dim('─'.repeat(50)));\n logger.blank();\n }\n\n // List all\n const categories: Record<string, typeof allTemplates> = {};\n for (const t of allTemplates) {\n const cat = t.tags.includes('fullstack') ? '🌐 Fullstack' :\n t.tags.includes('frontend') || t.tags.includes('spa') ? '🎨 Frontend' :\n t.tags.includes('backend') || t.tags.includes('api') ? '⚙️ Backend' :\n t.tags.includes('mobile') ? '📱 Mobile' :\n t.tags.includes('static') || t.tags.includes('beginner') ? '📄 Static / Beginner' :\n '🔧 Other';\n if (!categories[cat]) categories[cat] = [];\n categories[cat].push(t);\n }\n\n for (const [cat, templates] of Object.entries(categories)) {\n logger.indent(chalk.bold(cat));\n for (const t of templates) {\n const isRecommended = recommended && t.id === recommended.id;\n const prefix = isRecommended ? chalk.green('⭐') : ' ';\n logger.indent(` ${prefix} ${chalk.cyan(t.id.padEnd(18))} ${t.name}`, 1);\n logger.indent(` ${chalk.dim(t.description)}`, 2);\n }\n logger.blank();\n }\n\n logger.indent(chalk.bold('Usage:'));\n logger.indent(` ${chalk.cyan('repolens templates --apply nextjs')} Apply a template`, 1);\n logger.indent(` ${chalk.cyan('repolens templates --search react')} Search templates`, 1);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport { detectContextFiles, scoreContextFile } from '../core/contextScorer.js';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Fix command — Auto-fix detected issues in AI context files.\n * Removes generic rules, adds missing sections, and improves quality.\n */\n\n// Generic rules patterns to remove (exact line removals)\nconst GENERIC_LINE_PATTERNS: RegExp[] = [\n /^\\d+\\.\\s*\\*\\*Analyze before editing\\*\\*/,\n /^\\d+\\.\\s*\\*\\*Minimal safe changes\\*\\*/,\n /^\\d+\\.\\s*\\*\\*No unnecessary rewrites\\*\\*/,\n /^\\d+\\.\\s*\\*\\*Preserve architecture\\*\\*/,\n /^\\d+\\.\\s*\\*\\*Keep files focused\\*\\*/,\n /^\\d+\\.\\s*\\*\\*Follow \\w+ conventions\\*\\*/,\n /^-\\s*Never commit secrets/i,\n /^-\\s*Protect \\.?env files/i,\n /^-\\s*Validate all input/i,\n /^-\\s*Never trust user input/i,\n /^-\\s*Use parameterized queries/i,\n /^-\\s*No eval\\(\\)/i,\n /^-\\s*Preserve auth middleware/i,\n /^\\d+\\.\\s*Read relevant files before editing/,\n /^\\d+\\.\\s*Check for existing patterns before/,\n /^\\d+\\.\\s*Summarize all changes made/,\n /^\\d+\\.\\s*Flag any potential breaking changes/,\n /^\\d+\\.\\s*Do not modify configuration files/,\n /^-\\s*\\[\\s*[x ]?\\s*\\]\\s*Code compiles without errors/,\n /^-\\s*\\[\\s*[x ]?\\s*\\]\\s*Existing tests pass/,\n /^-\\s*\\[\\s*[x ]?\\s*\\]\\s*No secrets in source code/,\n /^-\\s*\\[\\s*[x ]?\\s*\\]\\s*Changes are minimal/,\n /^-\\s*\\[\\s*[x ]?\\s*\\]\\s*Architecture patterns are preserved/,\n /^-\\s*\\[\\s*[x ]?\\s*\\]\\s*Changes are summarized/,\n /^\\d+\\.\\s*\\*\\*Never commit secrets\\*\\*/,\n /^\\d+\\.\\s*\\*\\*Protect \\.?env\\*\\*/i,\n /^\\d+\\.\\s*\\*\\*Validate all input\\*\\*/i,\n /^\\d+\\.\\s*\\*\\*No eval\\(\\)\\*\\*/i,\n /^\\d+\\.\\s*\\*\\*Preserve auth middleware\\*\\*/i,\n /^\\d+\\.\\s*\\*\\*Use parameterized queries\\*\\*/i,\n];\n\n// Sections to remove entirely (generic boilerplate)\nconst GENERIC_SECTIONS = [\n 'Coding Rules',\n 'Security Rules',\n 'Workflow Rules',\n 'Definition of Done',\n];\n\nexport async function fixCommand(options: { dryRun?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Analyzing context files...').start();\n\n try {\n const scan = await scanRepository(cwd);\n const contextFiles = detectContextFiles(cwd);\n const existing = contextFiles.filter((f) => f.exists);\n\n if (existing.length === 0) {\n spinner.fail('No context files found');\n logger.indent(`Create one: ${chalk.cyan('repolens init')}`);\n return;\n }\n\n spinner.succeed(`Found ${existing.length} context file(s)`);\n\n let totalFixes = 0;\n\n for (const file of existing) {\n const scoreBefore = scoreContextFile(file.content, scan.fileTree);\n\n // Skip if already good\n if (scoreBefore.overall >= 80 && scoreBefore.genericRulesCount === 0) {\n logger.success(`${file.path} — Score ${scoreBefore.overall}/100 — No fixes needed`);\n continue;\n }\n\n logger.section('🔧', `Fixing: ${file.path}`);\n logger.indent(chalk.dim(`Current score: ${scoreBefore.overall}/100`));\n\n let lines = file.content.split('\\n');\n let removedLines = 0;\n let removedSections = 0;\n\n // Step 1: Remove generic lines\n const filteredLines: string[] = [];\n let skipSection = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Check if this starts a generic section to remove\n if (line.startsWith('## ')) {\n const sectionName = line.replace('## ', '').trim();\n if (GENERIC_SECTIONS.includes(sectionName)) {\n skipSection = true;\n removedSections++;\n continue;\n } else {\n skipSection = false;\n }\n }\n\n // Skip lines in generic sections\n if (skipSection && !line.startsWith('## ')) continue;\n if (skipSection && line.startsWith('## ')) skipSection = false;\n\n // Check if line is a generic rule\n let isGeneric = false;\n for (const pattern of GENERIC_LINE_PATTERNS) {\n if (pattern.test(trimmed)) {\n isGeneric = true;\n removedLines++;\n break;\n }\n }\n\n if (!isGeneric) {\n filteredLines.push(line);\n }\n }\n\n // Step 2: Clean up empty sections (## Header with nothing after it)\n const cleanedLines: string[] = [];\n for (let i = 0; i < filteredLines.length; i++) {\n const line = filteredLines[i];\n // If this is a section header and next non-empty line is another header, skip\n if (line.startsWith('## ')) {\n let nextContentIndex = i + 1;\n while (nextContentIndex < filteredLines.length && filteredLines[nextContentIndex].trim() === '') {\n nextContentIndex++;\n }\n if (nextContentIndex < filteredLines.length && filteredLines[nextContentIndex].startsWith('## ')) {\n // Empty section — skip it\n removedSections++;\n continue;\n }\n if (nextContentIndex >= filteredLines.length) {\n // Section at end of file with no content — skip\n removedSections++;\n continue;\n }\n }\n cleanedLines.push(line);\n }\n\n // Step 3: Remove consecutive blank lines (more than 2)\n const finalLines: string[] = [];\n let blankCount = 0;\n for (const line of cleanedLines) {\n if (line.trim() === '') {\n blankCount++;\n if (blankCount <= 2) finalLines.push(line);\n } else {\n blankCount = 0;\n finalLines.push(line);\n }\n }\n\n const newContent = finalLines.join('\\n');\n const scoreAfter = scoreContextFile(newContent, scan.fileTree);\n const fixes = removedLines + removedSections;\n totalFixes += fixes;\n\n if (fixes === 0) {\n logger.indent(chalk.dim('No auto-fixable issues found'));\n continue;\n }\n\n // Report\n logger.indent(`${chalk.green('✓')} Removed ${chalk.bold(String(removedLines))} generic rule lines`);\n logger.indent(`${chalk.green('✓')} Removed ${chalk.bold(String(removedSections))} boilerplate sections`);\n logger.indent(`Score: ${chalk.red(String(scoreBefore.overall))} → ${chalk.green(String(scoreAfter.overall))}/100`);\n\n // Write\n if (!options.dryRun) {\n const fullPath = path.join(cwd, file.path);\n fs.copyFileSync(fullPath, fullPath + '.backup');\n fs.writeFileSync(fullPath, newContent, 'utf-8');\n logger.success('Fixed and saved (backup created)');\n } else {\n logger.info('Dry run — no files changed');\n }\n }\n\n logger.blank();\n if (totalFixes > 0) {\n logger.indent(chalk.bold(`Total fixes: ${totalFixes}`));\n logger.blank();\n logger.indent(chalk.bold('Next steps:'));\n logger.indent(` ${chalk.cyan('repolens lint')} — Verify improved scores`, 1);\n logger.indent(` ${chalk.cyan('repolens sync')} — Sync fixes to all context files`, 1);\n logger.indent(chalk.dim(' Add gotchas and tribal knowledge to boost your score further.'));\n } else {\n logger.success('All context files are clean — no fixes needed');\n }\n\n } catch (error) {\n spinner.fail('Fix failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Skills command — Generate .cursor/skills/ files for common vibe coding tasks.\n * Skills are task-specific instructions that help AI agents perform complex tasks correctly.\n */\n\ninterface Skill {\n id: string;\n filename: string;\n name: string;\n description: string;\n frameworks: string[]; // Empty = universal\n content: string;\n}\n\nconst SKILLS: Skill[] = [\n {\n id: 'new-page',\n filename: 'create-new-page.md',\n name: 'Create New Page',\n description: 'Instructions for creating a new page/route with proper structure',\n frameworks: ['nextjs', 'react', 'vue', 'nuxt'],\n content: `# Skill: Create New Page\n\nWhen asked to create a new page or route:\n\n1. **Check routing pattern:** Look at existing pages in \\`app/\\` or \\`pages/\\` to match the convention.\n2. **Copy closest existing page** as a starting point — don't write from scratch.\n3. **Include:** SEO metadata (title, description), loading state, error boundary.\n4. **Use existing components** from \\`components/\\` — don't create new ones if similar exist.\n5. **Add to navigation** if the page should be accessible from the menu.\n6. **Mobile-responsive** by default — test at 375px width mentally.\n7. **Keep server components** where possible (Next.js/Nuxt) — only add \"use client\" when needed.\n\n## Checklist\n- [ ] Page renders without errors\n- [ ] SEO metadata is set\n- [ ] Page is responsive\n- [ ] Loading state exists\n- [ ] Navigation is updated (if needed)`,\n },\n {\n id: 'new-api',\n filename: 'create-api-endpoint.md',\n name: 'Create API Endpoint',\n description: 'Instructions for creating a proper REST API endpoint',\n frameworks: ['express', 'nextjs', 'nestjs', 'fastapi', 'django'],\n content: `# Skill: Create API Endpoint\n\nWhen asked to create a new API endpoint:\n\n1. **Follow existing pattern:** Check other endpoints for the naming and structure convention.\n2. **Input validation:** Always validate request body/params before processing.\n3. **Error handling:** Wrap in try/catch, return proper HTTP status codes.\n4. **Response format:** Match existing response format (usually \\`{ success, data, error }\\`).\n5. **Authentication:** Apply auth middleware if the endpoint needs protection.\n6. **HTTP methods:** GET for reads, POST for creates, PUT/PATCH for updates, DELETE for deletes.\n\n## Status Codes\n- 200: Success (GET, PUT)\n- 201: Created (POST)\n- 204: No Content (DELETE)\n- 400: Bad Request (validation error)\n- 401: Unauthorized (not logged in)\n- 403: Forbidden (no permission)\n- 404: Not Found\n- 500: Server Error (never expose details)\n\n## Checklist\n- [ ] Input is validated\n- [ ] Proper HTTP method and status codes\n- [ ] Auth middleware applied if needed\n- [ ] Error responses are user-friendly\n- [ ] No sensitive data in response`,\n },\n {\n id: 'add-auth',\n filename: 'add-authentication.md',\n name: 'Add Authentication',\n description: 'Instructions for implementing user authentication safely',\n frameworks: [],\n content: `# Skill: Add Authentication\n\nWhen asked to add or modify authentication:\n\n## Critical Rules (NEVER break these)\n1. **NEVER store passwords in plain text** — always hash with bcrypt/argon2.\n2. **NEVER put secrets in frontend code** — API keys go in .env, not in source.\n3. **NEVER disable CSRF protection** without understanding the implications.\n4. **NEVER trust client-side auth state** — always verify on the server.\n\n## Implementation Steps\n1. Check if an auth library is already installed (NextAuth, Passport, etc.).\n2. If yes — extend the existing setup, don't create a parallel system.\n3. If no — recommend a battle-tested library, don't roll your own.\n4. Store session/JWT secrets in environment variables.\n5. Add auth middleware to ALL protected routes.\n6. Implement proper logout (clear session/token on BOTH client and server).\n\n## Checklist\n- [ ] Passwords are hashed (never plain text)\n- [ ] Secrets are in .env (not in code)\n- [ ] Protected routes require authentication\n- [ ] Login/logout flows are complete\n- [ ] Session expiration is configured`,\n },\n {\n id: 'add-db',\n filename: 'add-database.md',\n name: 'Add Database Integration',\n description: 'Instructions for adding database with proper ORM setup',\n frameworks: [],\n content: `# Skill: Add Database Integration\n\nWhen asked to add or modify database integration:\n\n1. **Check existing ORM/driver:** Is Prisma, TypeORM, Sequelize, Mongoose, or Drizzle already installed?\n2. **Don't mix ORMs** — use the one already in the project.\n3. **Migrations:** Always create a migration for schema changes (never modify DB manually).\n4. **Connection pooling:** Use a connection pool, not individual connections.\n5. **Environment variables:** Database URL goes in .env, never hardcoded.\n\n## SQL Injection Prevention\n- ALWAYS use parameterized queries or ORM methods\n- NEVER concatenate user input into SQL strings\n- NEVER use \\`raw()\\` or \\`execute()\\` with user-provided values\n\n## Checklist\n- [ ] Using existing ORM (not adding a new one)\n- [ ] Migration created for schema changes\n- [ ] Connection string in .env\n- [ ] No raw SQL with user input\n- [ ] Proper indexes on frequently queried columns`,\n },\n {\n id: 'responsive-ui',\n filename: 'responsive-design.md',\n name: 'Responsive UI Design',\n description: 'Instructions for building mobile-friendly responsive interfaces',\n frameworks: [],\n content: `# Skill: Responsive UI Design\n\nWhen building or modifying UI components:\n\n## Mobile-First Approach\n1. **Design for mobile first** (375px), then expand for tablet (768px) and desktop (1024px+).\n2. **Test at these breakpoints:** 375px, 768px, 1024px, 1440px.\n3. **Touch targets:** Minimum 44x44px for buttons and links on mobile.\n4. **Font sizes:** Minimum 16px body text (prevents iOS zoom on input focus).\n\n## Layout Rules\n- Use **flexbox** or **CSS Grid** — never use float for layout.\n- Use **relative units** (rem, %, vh/vw) — avoid fixed pixel widths for containers.\n- **Images:** Always set \\`max-width: 100%\\` and use proper aspect ratios.\n- **Navigation:** Hamburger menu on mobile, horizontal nav on desktop.\n\n## Common Mistakes to Avoid\n- ❌ Fixed widths on containers (\\`width: 500px\\`)\n- ❌ Horizontal scrolling on mobile\n- ❌ Text too small to read on mobile\n- ❌ Buttons too small to tap\n- ❌ Hiding critical content on mobile\n- ✅ Fluid widths (\\`max-width: 500px; width: 100%\\`)\n- ✅ Stack columns on mobile, side-by-side on desktop\n- ✅ Readable text at every breakpoint`,\n },\n {\n id: 'deploy',\n filename: 'deployment-guide.md',\n name: 'Deployment Guide',\n description: 'Instructions for deploying to production safely',\n frameworks: [],\n content: `# Skill: Deployment\n\nWhen preparing for deployment or asked to deploy:\n\n## Pre-Deploy Checklist\n1. **Environment variables:** All secrets set in production env (not in code).\n2. **Build succeeds:** \\`npm run build\\` completes without errors.\n3. **No console.log:** Remove debug logs from production code.\n4. **Error handling:** All API routes have proper error responses.\n5. **HTTPS:** Ensure production uses HTTPS, not HTTP.\n\n## Platform-Specific\n- **Vercel:** Runs \\`npm run build\\` automatically. Set env vars in dashboard.\n- **Railway/Render:** Set \\`PORT\\` env var. Add \\`start\\` script to package.json.\n- **Docker:** Use multi-stage builds. Don't include node_modules in image.\n- **VPS:** Use PM2 or systemd for process management. Set up Nginx reverse proxy.\n\n## Things That Break in Production\n- Hardcoded \\`localhost\\` URLs\n- Missing environment variables\n- CORS not configured for production domain\n- Database connection limits exceeded\n- Large file uploads without size limits\n- Missing rate limiting on public APIs`,\n },\n {\n id: 'debug',\n filename: 'debugging-guide.md',\n name: 'Debugging Guide',\n description: 'Systematic approach to debugging issues in vibe-coded projects',\n frameworks: [],\n content: `# Skill: Debugging\n\nWhen something doesn't work:\n\n## Step-by-Step Debug Process\n1. **Read the error message** — it usually tells you exactly what's wrong.\n2. **Check the terminal/console** — errors appear in the terminal (backend) or browser console (frontend).\n3. **Check recent changes** — what did you change last? That's likely the cause.\n4. **Check environment variables** — missing .env values cause 90% of \"works locally, fails in production\" issues.\n5. **Check imports** — wrong import paths are the #1 cause of \"module not found\" errors.\n6. **Google the exact error message** — someone else has had this problem.\n\n## Common Fixes\n| Symptom | Likely Fix |\n|---|---|\n| \"Module not found\" | Check import path, run \\`npm install\\` |\n| \"Cannot read property of undefined\" | The variable is null — add a null check |\n| \"CORS error\" | Add CORS middleware to your backend |\n| \"Connection refused\" | Backend server isn't running, or wrong port |\n| \"401 Unauthorized\" | Auth token expired or missing |\n| Blank page | Check browser console for errors |\n| \"Hydration mismatch\" | Server and client render different HTML |\n\n## When AI Made a Mistake\n1. Don't ask AI to \"fix it\" without context — describe WHAT went wrong.\n2. Share the EXACT error message.\n3. Tell AI what you EXPECTED to happen vs what ACTUALLY happened.\n4. If AI keeps making the same mistake, revert and try a different approach.`,\n },\n];\n\n/**\n * Generate skill files for the project.\n */\nexport async function skillsCommand(options: { list?: boolean; all?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const fw = detectFramework(cwd);\n const fwLower = fw.framework.toLowerCase();\n\n // Filter skills relevant to this project\n const relevant = SKILLS.filter((s) =>\n s.frameworks.length === 0 || // Universal skills\n s.frameworks.some((f) => fwLower.includes(f))\n );\n\n if (options.list) {\n logger.section('📝', `Available Skills (${relevant.length}/${SKILLS.length} relevant to your project)`);\n logger.blank();\n for (const skill of relevant) {\n const universal = skill.frameworks.length === 0;\n logger.indent(` ${chalk.cyan(skill.id.padEnd(20))} ${skill.name} ${universal ? chalk.dim('(universal)') : chalk.dim(`(${skill.frameworks.join(', ')})`)}`);\n logger.indent(` ${chalk.dim(' '.repeat(20) + skill.description)}`, 1);\n }\n logger.blank();\n logger.indent(`Generate all: ${chalk.cyan('repolens skills --all')}`);\n return;\n }\n\n // Generate skills\n const spinner = ora('Generating skill files...').start();\n\n const skillsDir = path.join(cwd, '.cursor', 'skills');\n if (!fs.existsSync(skillsDir)) {\n fs.mkdirSync(skillsDir, { recursive: true });\n }\n\n const toGenerate = options.all ? relevant : relevant.filter((s) => s.frameworks.length === 0); // Default: universal only\n let created = 0;\n\n for (const skill of toGenerate) {\n const filePath = path.join(skillsDir, skill.filename);\n if (!fs.existsSync(filePath)) {\n fs.writeFileSync(filePath, skill.content, 'utf-8');\n created++;\n }\n }\n\n spinner.succeed(`Generated ${created} skill file(s) in .cursor/skills/`);\n logger.blank();\n\n for (const skill of toGenerate) {\n const filePath = path.join(skillsDir, skill.filename);\n const exists = fs.existsSync(filePath);\n const icon = exists ? chalk.green('✓') : chalk.yellow('⊘');\n logger.indent(`${icon} ${skill.filename.padEnd(30)} ${chalk.dim(skill.name)}`);\n }\n\n logger.blank();\n logger.indent(chalk.bold('How skills work:'));\n logger.indent(chalk.dim(' Cursor IDE reads .cursor/skills/ files to learn task-specific instructions.'), 1);\n logger.indent(chalk.dim(' AI agents use these skills when performing matching tasks.'), 1);\n logger.blank();\n logger.indent(`See all available: ${chalk.cyan('repolens skills --list')}`);\n logger.indent(`Generate all: ${chalk.cyan('repolens skills --all')}`);\n}\n","import ora from 'ora';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { analyzeArchitecture } from '../core/architectureAnalyzer.js';\nimport { readCodeContents, summarizeContents } from '../core/contentReader.js';\nimport { detectContextFiles, scoreContextFile } from '../core/contextScorer.js';\nimport { createSyncPlan, executeSyncPlan } from '../core/contextSyncer.js';\nimport { extractSmartContext, generateSmartAgentsMd } from '../core/smartContext.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Setup command — THE ONE COMMAND for vibe coders.\n *\n * What makes this 9/10 effective:\n * 1. READS actual code (not just filenames) — functions, imports, conventions\n * 2. Extracts REAL commands from package.json scripts\n * 3. Extracts REAL env vars from .env.example\n * 4. Extracts REAL known issues from TODO/FIXME comments\n * 5. Detects REAL naming conventions from function/class names\n * 6. Finds REAL critical files by import-graph connectivity\n * 7. Merges framework-specific gotchas when available\n * 8. Syncs to 6 AI tools simultaneously\n * 9. Generates task-specific skill files\n * 10. Scores quality and shows gaps\n */\n\nexport async function setupCommand(): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n logger.section('🚀', 'One-Click AI Context Setup');\n logger.indent(chalk.dim('Setting up AI context for all your coding tools in one step.'));\n logger.blank();\n\n // ─── Step 1: Deep Analyze ─────────────────────────────\n const spinner = ora('Step 1/5 — Analyzing your project...').start();\n\n const scan = await scanRepository(cwd);\n const fw = detectFramework(cwd);\n const { byCategory } = classifyFiles(scan.fileTree);\n const arch = analyzeArchitecture(byCategory, fw.framework);\n\n spinner.text = 'Reading code contents...';\n const codeContents = await readCodeContents(cwd);\n const summary = summarizeContents(codeContents);\n\n spinner.text = 'Extracting smart context...';\n const smartCtx = extractSmartContext(cwd, scan, fw, arch, codeContents, summary);\n\n spinner.succeed(`Step 1/5 — ${chalk.bold(fw.framework)} project (${scan.totalFiles} files, ${summary.totalFunctions} functions, ${smartCtx.envVars.length} env vars, ${smartCtx.knownIssues.length} TODOs)`);\n\n // ─── Step 2: Smart AGENTS.md ──────────────────────────\n const spinner2 = ora('Step 2/5 — Generating smart AGENTS.md...').start();\n\n const agentsPath = path.join(cwd, 'AGENTS.md');\n\n if (fs.existsSync(agentsPath)) {\n const existing = fs.readFileSync(agentsPath, 'utf-8');\n const existingScore = scoreContextFile(existing, scan.fileTree);\n\n // Generate what a smart version would look like\n const smartContent = generateSmartAgentsMd(fw, arch, scan, summary, smartCtx);\n const smartScore = scoreContextFile(smartContent, scan.fileTree);\n\n if (smartScore.overall > existingScore.overall) {\n // Smart version is better — offer upgrade\n fs.copyFileSync(agentsPath, agentsPath + '.backup');\n fs.writeFileSync(agentsPath, smartContent, 'utf-8');\n spinner2.succeed(`Step 2/5 — Upgraded AGENTS.md (${chalk.red(`${existingScore.overall}`)} → ${chalk.green(`${smartScore.overall}/100`)} ${getGrade(smartScore.overall)})`);\n } else {\n spinner2.succeed(`Step 2/5 — AGENTS.md already high quality (${chalk.green(`${existingScore.overall}/100`)} — keeping it)`);\n }\n } else {\n const smartContent = generateSmartAgentsMd(fw, arch, scan, summary, smartCtx);\n fs.writeFileSync(agentsPath, smartContent, 'utf-8');\n const newScore = scoreContextFile(smartContent, scan.fileTree);\n spinner2.succeed(`Step 2/5 — Created smart AGENTS.md (${chalk.green(`${newScore.overall}/100`)} ${getGrade(newScore.overall)})`);\n }\n\n // Show what was extracted\n const insights: string[] = [];\n if (smartCtx.commands.length > 0) insights.push(`${smartCtx.commands.length} commands`);\n if (smartCtx.envVars.length > 0) insights.push(`${smartCtx.envVars.length} env vars`);\n if (smartCtx.gotchas.length > 0) insights.push(`${smartCtx.gotchas.length} gotchas`);\n if (smartCtx.criticalFiles.length > 0) insights.push(`${smartCtx.criticalFiles.length} critical files`);\n if (smartCtx.conventions.length > 0) insights.push(`${smartCtx.conventions.length} conventions`);\n if (smartCtx.knownIssues.length > 0) insights.push(`${smartCtx.knownIssues.length} TODOs`);\n if (insights.length > 0) {\n logger.indent(chalk.dim(` Extracted: ${insights.join(' · ')}`));\n }\n\n // ─── Step 3: Sync to all AI tools ────────────────────\n const spinner3 = ora('Step 3/5 — Syncing to 6 AI tools...').start();\n\n const agentsContent = fs.readFileSync(agentsPath, 'utf-8');\n const contextFiles = detectContextFiles(cwd);\n const agentsFile = contextFiles.find(f => f.type === 'agents');\n if (agentsFile) {\n agentsFile.content = agentsContent;\n agentsFile.exists = true;\n }\n\n const plan = createSyncPlan(\n agentsFile || { path: 'AGENTS.md', type: 'agents' as const, exists: true, content: agentsContent },\n contextFiles,\n cwd,\n );\n\n for (const target of plan.targets) {\n if (target.action === 'skip') target.action = 'update';\n }\n\n const syncResult = executeSyncPlan(plan, cwd);\n spinner3.succeed(`Step 3/5 — Synced to ${chalk.bold(String(syncResult.written.length))} AI tools`);\n\n // ─── Step 4: Generate skill files ────────────────────\n const spinner4 = ora('Step 4/5 — Creating skill files...').start();\n\n const skillsDir = path.join(cwd, '.cursor', 'skills');\n if (!fs.existsSync(skillsDir)) {\n fs.mkdirSync(skillsDir, { recursive: true });\n }\n\n let skillCount = 0;\n const skillDefs = getSmartSkills(fw.framework, smartCtx);\n for (const skill of skillDefs) {\n const skillPath = path.join(skillsDir, skill.filename);\n if (!fs.existsSync(skillPath)) {\n fs.writeFileSync(skillPath, skill.content, 'utf-8');\n skillCount++;\n }\n }\n\n spinner4.succeed(`Step 4/5 — ${skillCount > 0 ? `${skillCount} skill files created` : 'Skill files ready'} in .cursor/skills/`);\n\n // ─── Step 5: Score & Report ──────────────────────────\n const spinner5 = ora('Step 5/5 — Final scoring...').start();\n\n const finalContent = fs.readFileSync(agentsPath, 'utf-8');\n const finalScore = scoreContextFile(finalContent, scan.fileTree);\n spinner5.succeed(`Step 5/5 — Quality score: ${chalk.bold(getGradeColor(finalScore.overall, `${finalScore.overall}/100 ${getGrade(finalScore.overall)}`))}`);\n\n // ─── Final Report ────────────────────────────────────\n logger.blank();\n logger.section('✅', 'Setup Complete');\n logger.blank();\n\n // Show files\n logger.indent(chalk.bold('Files created/updated:'));\n logger.indent(` ${chalk.green('✓')} AGENTS.md ${chalk.dim('— source of truth (edit this one)')}`);\n for (const written of syncResult.written) {\n const target = plan.targets.find(t => t.path === written);\n logger.indent(` ${chalk.green('✓')} ${written} ${chalk.dim(`— ${target?.label || ''}`)}`);\n }\n logger.blank();\n\n // Show AI tools status\n logger.indent(chalk.bold('Your AI tools are now configured:'));\n const tools = [\n { name: 'Cursor IDE', file: '.cursor/rules/project.mdc', icon: '🖥️' },\n { name: 'Claude Code', file: 'CLAUDE.md', icon: '🤖' },\n { name: 'GitHub Copilot', file: '.github/copilot-instructions.md', icon: '🐙' },\n { name: 'OpenAI Codex', file: 'CODEX.md', icon: '⚡' },\n { name: 'Windsurf', file: '.windsurfrules', icon: '🏄' },\n { name: 'Antigravity', file: 'AGENTS.md', icon: '🔍' },\n ];\n\n for (const tool of tools) {\n const exists = fs.existsSync(path.join(cwd, tool.file));\n logger.indent(` ${tool.icon} ${exists ? chalk.green('✓') : chalk.red('✗')} ${tool.name}`);\n }\n\n // Show score breakdown for transparency\n logger.blank();\n logger.indent(chalk.bold('Score Breakdown:'));\n const bd = finalScore.breakdown;\n logger.indent(` Specificity ${scoreBar(bd.specificity)} ${chalk.dim('Project-specific rules')}`);\n logger.indent(` Coverage ${scoreBar(bd.coverage)} ${chalk.dim('Important areas covered')}`);\n logger.indent(` Conciseness ${scoreBar(bd.conciseness)} ${chalk.dim('Optimal length for AI')}`);\n logger.indent(` Freshness ${scoreBar(bd.freshness)} ${chalk.dim('References real files')}`);\n logger.indent(` Tribal Knowledge ${scoreBar(bd.tribalKnowledge)} ${chalk.dim('Info AI cannot infer')}`);\n\n // Next steps\n logger.blank();\n logger.indent(chalk.bold('Next steps:'));\n if (finalScore.overall < 80) {\n logger.indent(` ${chalk.yellow('→')} Run ${chalk.cyan('repolens lint')} to see specific improvements`);\n logger.indent(` ${chalk.yellow('→')} Run ${chalk.cyan('repolens fix')} to auto-fix issues`);\n }\n logger.indent(` ${chalk.dim('1.')} Edit AGENTS.md to add your team's gotchas & decisions`);\n logger.indent(` ${chalk.dim('2.')} Run ${chalk.cyan('repolens sync')} after editing to update all tools`);\n logger.indent(` ${chalk.dim('3.')} Commit all generated files to git`);\n}\n\n// ─── Helpers ──────────────────────────────────────────\n\nfunction getGrade(score: number): string {\n if (score >= 90) return 'A+';\n if (score >= 80) return 'A';\n if (score >= 70) return 'B';\n if (score >= 60) return 'C';\n if (score >= 50) return 'D';\n return 'F';\n}\n\nfunction getGradeColor(score: number, text: string): string {\n if (score >= 80) return chalk.green(text);\n if (score >= 60) return chalk.yellow(text);\n return chalk.red(text);\n}\n\nfunction scoreBar(score: number): string {\n const filled = Math.round(score / 10);\n const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);\n const color = score >= 80 ? chalk.green : score >= 50 ? chalk.yellow : chalk.red;\n return `${color(`${String(score).padStart(3)}/100`)} ${color(bar)}`;\n}\n\n/**\n * Generate smart, framework-aware skill files.\n */\nfunction getSmartSkills(framework: string, ctx: SmartContext): { filename: string; content: string }[] {\n const skills: { filename: string; content: string }[] = [];\n\n // Universal: debugging (everyone needs this)\n skills.push({\n filename: 'debugging-guide.md',\n content: `# Skill: Debugging\n\nWhen something doesn't work, follow this systematic process:\n\n1. **Read the full error message** — the answer is usually in the stack trace.\n2. **Check recent changes** — what did you change last? That's likely the cause.\n3. **Check the terminal/console** — browser console AND server terminal.\n4. **Check imports** — wrong paths are the #1 cause of \"module not found\".\n5. **Check environment variables** — missing .env values cause most failures.\n\n## Common Fixes\n| Error | Fix |\n|---|---|\n| \"Module not found\" | Check import path, run \\`npm install\\` |\n| \"Cannot read property of undefined\" | Add null/undefined check |\n| \"CORS error\" | Add CORS middleware to backend |\n| Blank page | Check browser console (F12) |\n| \"Hydration mismatch\" | Server and client rendered different HTML |\n| \"EADDRINUSE\" | Another process using the port, kill it or use different port |\n\n## When AI Made a Mistake\n1. Describe WHAT went wrong (not just \"fix it\").\n2. Copy the EXACT error message.\n3. If AI repeats the same mistake 3 times, revert and try a completely different approach.\n4. Break the task into smaller steps.`,\n });\n\n // Universal: deployment\n skills.push({\n filename: 'deployment-checklist.md',\n content: `# Skill: Deployment Checklist\n\nBefore deploying, verify ALL of these:\n\n## Pre-Deploy\n- [ ] \\`${ctx.commands.find(c => c.name === 'build')?.command || 'npm run build'}\\` completes without errors\n- [ ] All environment variables are set in production\n- [ ] No \\`console.log\\` debug statements in production code\n- [ ] No hardcoded \\`localhost\\` or \\`127.0.0.1\\` — use environment variables\n- [ ] HTTPS is configured\n${ctx.testingInfo.hasTests ? `- [ ] All tests pass: \\`${ctx.testingInfo.command || 'npm test'}\\`` : '- [ ] Critical paths manually tested'}\n\n## Platform-Specific\n- **Vercel:** Set env vars in dashboard, auto-builds on push\n- **Railway/Render:** Set PORT env var, add start script in package.json\n- **Docker:** Use multi-stage builds, don't copy node_modules\n- **VPS (nginx):** Configure reverse proxy, enable gzip, set up SSL`,\n });\n\n // Framework-specific skills\n const fwLower = framework.toLowerCase();\n if (fwLower.includes('next') || fwLower.includes('react')) {\n skills.push({\n filename: 'create-new-page.md',\n content: `# Skill: Create a New Page\n\nWhen creating a new page/route, always include:\n\n1. **SEO metadata** — title, description, og:image\n2. **Loading state** — show skeleton or spinner while data loads\n3. **Error boundary** — graceful error handling, not blank screen\n4. **Responsive design** — test on mobile (375px) AND desktop (1440px)\n5. **Accessibility** — semantic HTML, alt text, keyboard navigation\n\n## Template${fwLower.includes('next') ? ` (Next.js App Router)\n\\`\\`\\`tsx\n// app/my-page/page.tsx\nimport type { Metadata } from 'next';\n\nexport const metadata: Metadata = {\n title: 'Page Title — My App',\n description: 'Clear description of this page',\n};\n\nexport default function MyPage() {\n return (\n <main>\n <h1>Page Title</h1>\n {/* Content here */}\n </main>\n );\n}\n\\`\\`\\`` : `\n\\`\\`\\`tsx\nexport default function MyPage() {\n return (\n <main>\n <h1>Page Title</h1>\n </main>\n );\n}\n\\`\\`\\``}`,\n });\n }\n\n if (fwLower.includes('express') || fwLower.includes('nest') || fwLower.includes('fastapi') || fwLower.includes('django')) {\n skills.push({\n filename: 'create-api-endpoint.md',\n content: `# Skill: Create an API Endpoint\n\nEvery API endpoint MUST have:\n\n1. **Input validation** — validate ALL user input before processing\n2. **Error handling** — return proper HTTP status codes\n3. **Authentication check** — verify user is authorized (if needed)\n4. **Response format** — consistent JSON structure\n\n## HTTP Status Codes\n| Code | When to Use |\n|---|---|\n| 200 | Success |\n| 201 | Created (POST success) |\n| 400 | Bad request (validation error) |\n| 401 | Unauthorized (not logged in) |\n| 403 | Forbidden (logged in but no permission) |\n| 404 | Not found |\n| 500 | Server error (never expose details to client) |\n\n## Security Rules\n- NEVER trust user input\n- NEVER expose internal error details\n- ALWAYS use parameterized queries (prevent SQL injection)\n- ALWAYS rate-limit sensitive endpoints`,\n });\n }\n\n return skills;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { FileContent, ContentSummary } from './contentReader.js';\nimport type { ScanResult } from './repoScanner.js';\nimport type { FrameworkInfo } from './frameworkDetector.js';\nimport type { ArchitectureResult } from './architectureAnalyzer.js';\nimport { detectBestTemplate } from '../templates/frameworkTemplates.js';\n\n/**\n * Smart Context Engine — The brain of RepoLens AI.\n *\n * Instead of generating generic AGENTS.md from templates,\n * this engine READS YOUR ACTUAL CODE and generates\n * project-specific context that AI agents can't infer.\n *\n * What makes this different:\n * 1. Reads package.json scripts → exact build/dev/test commands\n * 2. Reads .env.example → exact env vars needed\n * 3. Reads TODO/FIXME → real known issues\n * 4. Detects import patterns → actual conventions\n * 5. Finds largest/most-connected files → real critical files\n * 6. Detects actual naming conventions from code\n * 7. Merges framework template gotchas when available\n */\n\nexport interface SmartContext {\n commands: { name: string; command: string; description?: string }[];\n envVars: { name: string; description: string; required: boolean }[];\n conventions: string[];\n knownIssues: string[];\n criticalFiles: { path: string; reason: string }[];\n gotchas: string[];\n dependencies: { name: string; version: string; purpose?: string }[];\n importPattern: 'esm' | 'commonjs' | 'mixed' | 'unknown';\n namingConventions: string[];\n testingInfo: { hasTests: boolean; framework?: string; command?: string };\n}\n\n/**\n * Extract smart context by actually reading the project's code.\n */\nexport function extractSmartContext(\n cwd: string,\n scan: ScanResult,\n fw: FrameworkInfo,\n arch: ArchitectureResult,\n files: FileContent[],\n summary: ContentSummary,\n): SmartContext {\n const ctx: SmartContext = {\n commands: [],\n envVars: [],\n conventions: [],\n knownIssues: [],\n criticalFiles: [],\n gotchas: [],\n dependencies: [],\n importPattern: 'unknown',\n namingConventions: [],\n testingInfo: { hasTests: scan.hasTests },\n };\n\n // ─── 1. Extract REAL commands from package.json ────────\n const pkgPath = path.join(cwd, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.scripts) {\n for (const [name, cmd] of Object.entries(pkg.scripts)) {\n ctx.commands.push({\n name,\n command: `npm run ${name}`,\n description: describeScript(name, cmd as string),\n });\n }\n }\n // Extract dependencies for awareness\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n for (const [name, version] of Object.entries(allDeps)) {\n ctx.dependencies.push({\n name,\n version: String(version),\n purpose: describeDependency(name),\n });\n }\n // Detect test framework\n if (allDeps['vitest']) ctx.testingInfo = { hasTests: true, framework: 'vitest', command: 'npx vitest' };\n else if (allDeps['jest']) ctx.testingInfo = { hasTests: true, framework: 'jest', command: 'npm test' };\n else if (allDeps['mocha']) ctx.testingInfo = { hasTests: true, framework: 'mocha', command: 'npm test' };\n else if (allDeps['pytest'] || allDeps['python']) ctx.testingInfo = { hasTests: scan.hasTests, framework: 'pytest', command: 'pytest' };\n } catch { /* skip */ }\n }\n\n // Python projects\n const reqPath = path.join(cwd, 'requirements.txt');\n if (fs.existsSync(reqPath)) {\n try {\n const reqs = fs.readFileSync(reqPath, 'utf-8').split('\\n').filter(l => l.trim() && !l.startsWith('#'));\n for (const req of reqs.slice(0, 20)) {\n const [name] = req.split(/[=<>!]/);\n ctx.dependencies.push({ name: name.trim(), version: '', purpose: describeDependency(name.trim()) });\n }\n } catch { /* skip */ }\n }\n\n // ─── 2. Extract REAL env vars from .env.example ────────\n const envFiles = ['.env.example', '.env.sample', '.env.template', '.env.local.example'];\n for (const envFile of envFiles) {\n const envPath = path.join(cwd, envFile);\n if (fs.existsSync(envPath)) {\n try {\n const content = fs.readFileSync(envPath, 'utf-8');\n for (const line of content.split('\\n')) {\n const match = line.match(/^([A-Z][A-Z0-9_]+)\\s*=\\s*(.*?)(?:\\s*#\\s*(.*))?$/);\n if (match) {\n ctx.envVars.push({\n name: match[1],\n description: match[3] || describeEnvVar(match[1]),\n required: !match[2] || match[2] === '',\n });\n }\n }\n } catch { /* skip */ }\n break;\n }\n }\n\n // ─── 3. Extract TODO/FIXME as known issues ─────────────\n const allTodos: { file: string; line: number; text: string }[] = [];\n for (const f of files) {\n for (const todo of f.todoFixmes) {\n allTodos.push({ file: f.path, line: todo.line, text: todo.text });\n }\n }\n if (allTodos.length > 0) {\n for (const todo of allTodos.slice(0, 8)) {\n ctx.knownIssues.push(`\\`${todo.file}:${todo.line}\\` — ${todo.text}`);\n }\n }\n\n // ─── 4. Detect import pattern ──────────────────────────\n let esmCount = 0;\n let cjsCount = 0;\n for (const f of files) {\n for (const imp of f.imports) {\n if (imp.includes('import ') || imp.includes('from ')) esmCount++;\n if (imp.includes('require(')) cjsCount++;\n }\n }\n if (esmCount > 0 && cjsCount > 0) ctx.importPattern = 'mixed';\n else if (esmCount > cjsCount) ctx.importPattern = 'esm';\n else if (cjsCount > 0) ctx.importPattern = 'commonjs';\n\n // ─── 5. Detect naming conventions from actual code ─────\n const funcNames = files.flatMap(f => f.functions);\n let camelCase = 0, snake_case = 0, PascalCase = 0;\n for (const name of funcNames.slice(0, 100)) {\n if (/^[a-z][a-zA-Z0-9]*$/.test(name) && /[A-Z]/.test(name)) camelCase++;\n else if (/^[a-z][a-z0-9_]*$/.test(name) && name.includes('_')) snake_case++;\n else if (/^[A-Z][a-zA-Z0-9]*$/.test(name)) PascalCase++;\n }\n if (camelCase > snake_case && camelCase > PascalCase) {\n ctx.namingConventions.push('Functions use **camelCase** (e.g., `getUserById`)');\n } else if (snake_case > camelCase) {\n ctx.namingConventions.push('Functions use **snake_case** (e.g., `get_user_by_id`)');\n }\n if (PascalCase > 3) {\n ctx.namingConventions.push('Classes/Components use **PascalCase** (e.g., `UserProfile`)');\n }\n\n // Detect file extension conventions\n const tsFiles = files.filter(f => f.path.endsWith('.ts') || f.path.endsWith('.tsx'));\n const jsFiles = files.filter(f => f.path.endsWith('.js') || f.path.endsWith('.jsx'));\n if (tsFiles.length > jsFiles.length * 2) {\n ctx.namingConventions.push('Project uses **TypeScript** — all new files must be `.ts`/`.tsx`');\n }\n\n // Detect import extension pattern (.js extension in TS = ESM)\n if (ctx.importPattern === 'esm') {\n const hasJsExtensions = files.some(f =>\n f.imports.some(imp => /from\\s+['\"].*\\.js['\"]/.test(imp))\n );\n if (hasJsExtensions) {\n ctx.conventions.push('All imports use `.js` extension (ESM requirement with TypeScript)');\n }\n }\n\n // ─── 6. Find critical files by actual connectivity ─────\n for (const f of summary.mostConnected.slice(0, 5)) {\n if (f.imports > 3) {\n ctx.criticalFiles.push({\n path: f.path,\n reason: `${f.imports} imports — modify carefully, changes cascade widely`,\n });\n }\n }\n // Entry points are critical\n const entryFiles = ['src/cli.ts', 'src/index.ts', 'src/main.ts', 'src/app.ts', 'app.ts', 'index.ts',\n 'src/main.py', 'manage.py', 'app.py', 'main.go', 'src/main.rs'];\n for (const entry of entryFiles) {\n if (files.some(f => f.path === entry)) {\n ctx.criticalFiles.push({ path: entry, reason: 'Entry point — changes affect entire application' });\n }\n }\n\n // ─── 7. Merge framework template gotchas ───────────────\n const template = detectBestTemplate(fw.framework);\n if (template) {\n const templateLines = template.content.split('\\n');\n let inGotchas = false;\n for (const line of templateLines) {\n if (line.startsWith('## Gotchas')) { inGotchas = true; continue; }\n if (inGotchas && line.startsWith('## ')) break;\n if (inGotchas && line.startsWith('- ')) {\n ctx.gotchas.push(line.substring(2));\n }\n }\n }\n\n // ─── 8. Detect project-specific conventions ────────────\n // Detect if project uses strict TypeScript\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n try {\n const tsconfig = JSON.parse(fs.readFileSync(tsconfigPath, 'utf-8'));\n if (tsconfig.compilerOptions?.strict) {\n ctx.conventions.push('TypeScript strict mode is enabled — no `any` types');\n }\n if (tsconfig.compilerOptions?.noEmit) {\n ctx.conventions.push('TypeScript is used for type-checking only (`noEmit: true`)');\n }\n } catch { /* skip */ }\n }\n\n // Detect if project has ESLint/Prettier\n const lintConfigs = ['.eslintrc.js', '.eslintrc.json', '.eslintrc.yml', 'eslint.config.js', 'eslint.config.mjs'];\n for (const lc of lintConfigs) {\n if (fs.existsSync(path.join(cwd, lc))) {\n ctx.conventions.push(`ESLint is configured (\\`${lc}\\`) — run \\`npm run lint\\` before committing`);\n break;\n }\n }\n if (fs.existsSync(path.join(cwd, '.prettierrc')) || fs.existsSync(path.join(cwd, '.prettierrc.json'))) {\n ctx.conventions.push('Prettier is configured — code formatting is enforced');\n }\n\n return ctx;\n}\n\n/**\n * Generate a high-quality AGENTS.md from smart context.\n * This is the KEY DIFFERENTIATOR — every line is project-specific.\n */\nexport function generateSmartAgentsMd(\n fw: FrameworkInfo,\n arch: ArchitectureResult,\n scan: ScanResult,\n summary: ContentSummary,\n ctx: SmartContext,\n): string {\n const s: string[] = [];\n\n s.push('# AGENTS.md');\n s.push('');\n s.push('> Instructions for AI coding agents working on this project.');\n s.push(`> Auto-generated by RepoLens AI on ${new Date().toISOString().split('T')[0]}.`);\n s.push('');\n\n // ─── Project Overview ──────────────────────────────────\n s.push('## Project Overview');\n s.push('');\n s.push(`- **Framework:** ${fw.framework}${fw.version ? ` (${fw.version})` : ''}`);\n s.push(`- **Language:** ${fw.language}`);\n s.push(`- **Package Manager:** ${fw.packageManager}`);\n s.push(`- **Architecture:** ${arch.style}`);\n if (ctx.importPattern !== 'unknown') {\n s.push(`- **Module System:** ${ctx.importPattern === 'esm' ? 'ES Modules (import/export)' : ctx.importPattern === 'commonjs' ? 'CommonJS (require)' : 'Mixed'}`);\n }\n if (fw.additionalFrameworks.length > 0) {\n s.push(`- **Key Libraries:** ${fw.additionalFrameworks.join(', ')}`);\n }\n s.push('');\n\n // ─── Commands (REAL, from package.json) ────────────────\n if (ctx.commands.length > 0) {\n s.push('## Commands');\n s.push('');\n const important = ['dev', 'build', 'start', 'test', 'lint', 'format', 'deploy', 'preview', 'generate', 'migrate'];\n const shown = ctx.commands.filter(c => important.some(i => c.name.includes(i)));\n const rest = ctx.commands.filter(c => !shown.includes(c));\n for (const cmd of shown) {\n s.push(`- **${capitalize(cmd.name)}:** \\`${cmd.command}\\`${cmd.description ? ` — ${cmd.description}` : ''}`);\n }\n if (rest.length > 0) {\n s.push(`- Other scripts: ${rest.map(c => `\\`${c.name}\\``).join(', ')}`);\n }\n s.push('');\n }\n\n // ─── Architecture ──────────────────────────────────────\n s.push('## Architecture');\n s.push('');\n if (arch.dataFlow.length > 0) {\n for (const flow of arch.dataFlow) s.push(`- ${flow}`);\n s.push('');\n }\n\n // ─── Key Structure ─────────────────────────────────────\n s.push('## Key Structure');\n s.push('');\n s.push('```');\n for (const dir of scan.directories.slice(0, 15)) s.push(dir + '/');\n s.push('```');\n s.push('');\n\n // ─── Critical Files (from REAL analysis) ───────────────\n if (ctx.criticalFiles.length > 0) {\n s.push('## Critical Files (modify carefully)');\n s.push('');\n for (const f of ctx.criticalFiles) {\n s.push(`- \\`${f.path}\\` — ${f.reason}`);\n }\n s.push('');\n }\n\n // ─── Environment Variables (from .env.example) ─────────\n if (ctx.envVars.length > 0) {\n s.push('## Environment Variables');\n s.push('');\n for (const v of ctx.envVars) {\n const req = v.required ? '**required**' : 'optional';\n s.push(`- \\`${v.name}\\` — ${v.description} (${req})`);\n }\n s.push('');\n }\n\n // ─── Gotchas (framework-specific + project-specific) ───\n if (ctx.gotchas.length > 0 || ctx.knownIssues.length > 0) {\n s.push('## Gotchas & Known Issues');\n s.push('');\n for (const g of ctx.gotchas) s.push(`- ${g}`);\n if (ctx.knownIssues.length > 0) {\n s.push('');\n s.push('### Active TODOs in code:');\n for (const issue of ctx.knownIssues) s.push(`- ${issue}`);\n }\n s.push('');\n }\n\n // ─── Conventions (from REAL code analysis) ─────────────\n if (ctx.conventions.length > 0 || ctx.namingConventions.length > 0) {\n s.push('## Conventions');\n s.push('');\n for (const c of ctx.namingConventions) s.push(`- ${c}`);\n for (const c of ctx.conventions) s.push(`- ${c}`);\n s.push('');\n }\n\n // ─── Testing ───────────────────────────────────────────\n s.push('## Testing');\n s.push('');\n if (ctx.testingInfo.hasTests && ctx.testingInfo.framework) {\n s.push(`- Framework: **${ctx.testingInfo.framework}**`);\n s.push(`- Run: \\`${ctx.testingInfo.command}\\``);\n s.push('- Always run tests before and after changes');\n s.push('- Add tests for new functionality');\n } else {\n s.push('- This project currently lacks tests');\n s.push('- Add tests for critical business logic when possible');\n }\n s.push('');\n\n // ─── Do Not ────────────────────────────────────────────\n if (arch.weakPoints.length > 0) {\n s.push('## Rules');\n s.push('');\n for (const wp of arch.weakPoints) s.push(`- ${wp}`);\n s.push('');\n }\n\n s.push('---');\n s.push('*Generated by [RepoLens AI](https://github.com/repolens/repolens-ai)*');\n return s.join('\\n');\n}\n\n// ─── Helper functions ────────────────────────────────────\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction describeScript(name: string, cmd: string): string {\n if (name === 'dev') return cmd.includes('--watch') ? 'Development mode with hot reload' : 'Development server';\n if (name === 'build') return 'Production build';\n if (name === 'start') return 'Production server';\n if (name === 'test') return 'Run tests';\n if (name === 'lint') return 'Type/lint checking';\n if (name === 'format') return 'Code formatting';\n if (name === 'preview') return 'Preview production build';\n if (name.includes('migrate')) return 'Database migrations';\n if (name.includes('seed')) return 'Database seeding';\n if (name.includes('generate')) return 'Code generation';\n return '';\n}\n\nfunction describeDependency(name: string): string {\n const known: Record<string, string> = {\n 'react': 'UI library', 'next': 'Fullstack framework', 'vue': 'UI framework',\n 'express': 'HTTP server', 'fastify': 'HTTP server', 'prisma': 'ORM',\n 'drizzle-orm': 'ORM', 'typeorm': 'ORM', 'mongoose': 'MongoDB ODM',\n 'tailwindcss': 'CSS utility framework', 'zod': 'Schema validation',\n 'axios': 'HTTP client', 'commander': 'CLI framework', 'chalk': 'Terminal colors',\n 'vitest': 'Test runner', 'jest': 'Test runner', 'eslint': 'Linter',\n 'prettier': 'Code formatter', 'typescript': 'Type system',\n 'tsup': 'Bundler', 'vite': 'Bundler/Dev server', 'webpack': 'Bundler',\n };\n return known[name] || '';\n}\n\nfunction describeEnvVar(name: string): string {\n if (name.includes('DATABASE') || name.includes('DB_')) return 'Database connection';\n if (name.includes('API_KEY') || name.includes('SECRET')) return 'API key (keep secret)';\n if (name.includes('PORT')) return 'Server port';\n if (name.includes('URL') || name.includes('HOST')) return 'Service URL';\n if (name.includes('JWT') || name.includes('AUTH')) return 'Authentication config';\n if (name.includes('REDIS')) return 'Redis connection';\n if (name.includes('SMTP') || name.includes('MAIL')) return 'Email service config';\n if (name.includes('AWS') || name.includes('S3')) return 'AWS config';\n if (name.includes('STRIPE')) return 'Payment provider';\n return 'Configuration value';\n}\n"],"mappings":"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","names":["basename","fs","path","require","fs","path","fg","fs","path","fg","CODE_EXTENSIONS","fs","path","chalk","chalk","step","fs","path","ora","ora","ora","chalk","ora","ora","chalk","ora","ora","chalk","ora","ora","ora","ora","fs","path","ora","ora","fs","path","chalk","ora","ora","chalk","ora","scoreBar","ora","fs","path","chalk","ora","fs","path","chalk","path","chalk","scanRepository","detectFramework","classifyFiles","analyzeArchitecture","detectRisks","detectContextFiles","scoreContextFile","readCodeContents","summarizeContents","fs","path","chalk","fs","path","ora","chalk","ora","fs","path","ora","chalk","ora","ora","fs","path","fs","path","chalk","ora","getGrade"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/paths.ts","../src/core/repoScanner.ts","../src/core/frameworkDetector.ts","../src/core/fileClassifier.ts","../src/core/architectureAnalyzer.ts","../src/core/riskDetector.ts","../src/core/contentReader.ts","../src/core/contextScorer.ts","../src/cli.ts","../src/commands/analyze.ts","../src/ai/aiClient.ts","../src/ai/promptBuilder.ts","../src/reporters/terminalReporter.ts","../src/utils/logger.ts","../src/reporters/markdownReporter.ts","../src/commands/architecture.ts","../src/commands/explain.ts","../src/commands/review.ts","../src/core/gitDiff.ts","../src/utils/masks.ts","../src/commands/risks.ts","../src/commands/onboarding.ts","../src/commands/generateAgents.ts","../src/templates/agentsTemplate.ts","../src/commands/init.ts","../src/templates/frameworkTemplates.ts","../src/commands/lint.ts","../src/commands/sync.ts","../src/core/contextSyncer.ts","../src/commands/doctor.ts","../src/commands/dashboard.ts","../src/commands/templates.ts","../src/commands/fix.ts","../src/commands/skills.ts","../src/commands/setup.ts","../src/core/smartContext.ts"],"sourcesContent":["/**\n * Default ignore patterns for repository scanning.\n * These directories/files are never sent to AI or included in analysis.\n */\nexport const DEFAULT_IGNORE_PATTERNS: string[] = [\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'vendor',\n 'storage',\n '.cache',\n '.next',\n '.nuxt',\n '.env',\n '.env.*',\n 'coverage',\n 'logs',\n '__pycache__',\n '.pytest_cache',\n '.mypy_cache',\n 'venv',\n '.venv',\n '.idea',\n '.vscode',\n '*.lock',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n 'composer.lock',\n];\n\n/**\n * Convert ignore patterns to fast-glob ignore format.\n */\nexport function getGlobIgnorePatterns(): string[] {\n return DEFAULT_IGNORE_PATTERNS.map((p) => `**/${p}/**`);\n}\n\n/**\n * Normalize a file path to use forward slashes and be relative to CWD.\n */\nexport function normalizePath(filePath: string, cwd: string): string {\n return filePath.replace(cwd, '').replace(/\\\\/g, '/').replace(/^\\//, '');\n}\n\n/**\n * Strip the user's home directory from paths for privacy.\n */\nexport function sanitizePath(filePath: string): string {\n const home = process.env.HOME || process.env.USERPROFILE || '';\n if (home) {\n return filePath.replace(home, '~');\n }\n return filePath;\n}\n","import fg from 'fast-glob';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { getGlobIgnorePatterns, normalizePath } from '../utils/paths.js';\n\nexport interface ScanResult {\n cwd: string;\n totalFiles: number;\n filesByExtension: Record<string, number>;\n fileTree: string[];\n importantFiles: string[];\n directories: string[];\n estimatedLinesOfCode: number;\n languages: string[];\n hasGit: boolean;\n hasReadme: boolean;\n hasTests: boolean;\n hasDocker: boolean;\n hasCiCd: boolean;\n}\n\nconst IMPORTANT_FILE_NAMES = [\n 'package.json',\n 'composer.json',\n 'requirements.txt',\n 'pyproject.toml',\n 'Cargo.toml',\n 'go.mod',\n 'Gemfile',\n 'Dockerfile',\n 'docker-compose.yml',\n 'docker-compose.yaml',\n 'README.md',\n 'readme.md',\n 'AGENTS.md',\n 'CONTRIBUTING.md',\n 'LICENSE',\n '.env.example',\n 'Makefile',\n 'Procfile',\n 'vercel.json',\n 'netlify.toml',\n 'next.config.js',\n 'next.config.ts',\n 'next.config.mjs',\n 'vite.config.ts',\n 'vite.config.js',\n 'nuxt.config.ts',\n 'tsconfig.json',\n 'webpack.config.js',\n 'tailwind.config.js',\n 'tailwind.config.ts',\n 'prisma/schema.prisma',\n '.github/workflows',\n '.gitlab-ci.yml',\n];\n\nconst EXTENSION_TO_LANGUAGE: Record<string, string> = {\n '.ts': 'TypeScript',\n '.tsx': 'TypeScript (React)',\n '.js': 'JavaScript',\n '.jsx': 'JavaScript (React)',\n '.mjs': 'JavaScript',\n '.py': 'Python',\n '.php': 'PHP',\n '.rb': 'Ruby',\n '.go': 'Go',\n '.rs': 'Rust',\n '.java': 'Java',\n '.kt': 'Kotlin',\n '.cs': 'C#',\n '.cpp': 'C++',\n '.c': 'C',\n '.swift': 'Swift',\n '.vue': 'Vue',\n '.svelte': 'Svelte',\n '.dart': 'Dart',\n '.sql': 'SQL',\n '.css': 'CSS',\n '.scss': 'SCSS',\n '.html': 'HTML',\n '.json': 'JSON',\n '.yaml': 'YAML',\n '.yml': 'YAML',\n '.md': 'Markdown',\n '.xml': 'XML',\n};\n\n/**\n * Scan a repository directory and collect file statistics.\n */\nexport async function scanRepository(cwd: string): Promise<ScanResult> {\n const ignorePatterns = getGlobIgnorePatterns();\n\n const files = await fg('**/*', {\n cwd,\n ignore: ignorePatterns,\n dot: false,\n onlyFiles: true,\n followSymbolicLinks: false,\n });\n\n const filesByExtension: Record<string, number> = {};\n const languagesSet = new Set<string>();\n const importantFiles: string[] = [];\n const directoriesSet = new Set<string>();\n let estimatedLines = 0;\n\n for (const file of files) {\n const ext = path.extname(file).toLowerCase();\n\n // Count by extension\n filesByExtension[ext || '(no ext)'] = (filesByExtension[ext || '(no ext)'] || 0) + 1;\n\n // Track language\n if (EXTENSION_TO_LANGUAGE[ext]) {\n languagesSet.add(EXTENSION_TO_LANGUAGE[ext]);\n }\n\n // Check important files\n const basename = path.basename(file);\n const relativePath = normalizePath(file, '');\n\n if (\n IMPORTANT_FILE_NAMES.includes(basename) ||\n IMPORTANT_FILE_NAMES.some((p) => relativePath.includes(p))\n ) {\n importantFiles.push(relativePath);\n }\n\n // Collect directories (top 2 levels)\n const parts = relativePath.split('/');\n if (parts.length > 1) {\n directoriesSet.add(parts[0]);\n if (parts.length > 2) {\n directoriesSet.add(`${parts[0]}/${parts[1]}`);\n }\n }\n\n // Estimate lines of code for code files\n const codeExtensions = ['.ts', '.tsx', '.js', '.jsx', '.py', '.php', '.rb', '.go', '.rs', '.java', '.kt', '.cs', '.vue', '.svelte'];\n if (codeExtensions.includes(ext)) {\n try {\n const fullPath = path.join(cwd, file);\n const stat = fs.statSync(fullPath);\n // Rough estimate: ~25 bytes per line of code\n estimatedLines += Math.round(stat.size / 25);\n } catch {\n // skip files that can't be read\n }\n }\n }\n\n // Check for special directories/features\n const hasGit = fs.existsSync(path.join(cwd, '.git'));\n const hasReadme = files.some((f) => f.toLowerCase().includes('readme'));\n const hasTests = files.some(\n (f) =>\n f.includes('test') ||\n f.includes('spec') ||\n f.includes('__tests__') ||\n f.includes('.test.') ||\n f.includes('.spec.')\n );\n const hasDocker = files.some(\n (f) => f.toLowerCase().includes('dockerfile') || f.toLowerCase().includes('docker-compose')\n );\n const hasCiCd = files.some(\n (f) => f.includes('.github/workflows') || f.includes('.gitlab-ci') || f.includes('Jenkinsfile')\n );\n\n return {\n cwd,\n totalFiles: files.length,\n filesByExtension,\n fileTree: files.slice(0, 200), // Cap at 200 for display\n importantFiles,\n directories: Array.from(directoriesSet).sort(),\n estimatedLinesOfCode: estimatedLines,\n languages: Array.from(languagesSet),\n hasGit,\n hasReadme,\n hasTests,\n hasDocker,\n hasCiCd,\n };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport interface FrameworkInfo {\n framework: string;\n language: string;\n packageManager: string;\n confidence: 'high' | 'medium' | 'low';\n version?: string;\n additionalFrameworks: string[];\n}\n\n/**\n * Detect the primary framework and tech stack of a project.\n */\nexport function detectFramework(cwd: string): FrameworkInfo {\n const result: FrameworkInfo = {\n framework: 'Unknown',\n language: 'Unknown',\n packageManager: 'Unknown',\n confidence: 'low',\n additionalFrameworks: [],\n };\n\n // Check for Node.js / JavaScript ecosystem\n const packageJsonPath = path.join(cwd, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n result.packageManager = 'npm';\n if (fs.existsSync(path.join(cwd, 'yarn.lock'))) result.packageManager = 'yarn';\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) result.packageManager = 'pnpm';\n if (fs.existsSync(path.join(cwd, 'bun.lockb'))) result.packageManager = 'bun';\n\n // Detect TypeScript\n const isTypeScript = allDeps?.typescript || fs.existsSync(path.join(cwd, 'tsconfig.json'));\n\n // Framework detection (order matters — most specific first)\n if (allDeps?.next) {\n result.framework = 'Next.js';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n result.version = allDeps.next;\n } else if (allDeps?.nuxt) {\n result.framework = 'Nuxt.js';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n result.version = allDeps.nuxt;\n } else if (allDeps?.['@nestjs/core']) {\n result.framework = 'NestJS';\n result.language = 'TypeScript';\n result.confidence = 'high';\n result.version = allDeps['@nestjs/core'];\n } else if (allDeps?.['@angular/core']) {\n result.framework = 'Angular';\n result.language = 'TypeScript';\n result.confidence = 'high';\n result.version = allDeps['@angular/core'];\n } else if (allDeps?.svelte || allDeps?.['@sveltejs/kit']) {\n result.framework = allDeps?.['@sveltejs/kit'] ? 'SvelteKit' : 'Svelte';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n } else if (allDeps?.vue) {\n result.framework = 'Vue.js';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n result.version = allDeps.vue;\n } else if (allDeps?.react) {\n result.framework = 'React';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n result.version = allDeps.react;\n } else if (allDeps?.express) {\n result.framework = 'Express.js';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n } else if (allDeps?.fastify) {\n result.framework = 'Fastify';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n } else if (allDeps?.hono) {\n result.framework = 'Hono';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'high';\n } else {\n result.framework = 'Node.js';\n result.language = isTypeScript ? 'TypeScript' : 'JavaScript';\n result.confidence = 'medium';\n }\n\n // Detect additional libraries\n if (allDeps?.prisma || allDeps?.['@prisma/client']) result.additionalFrameworks.push('Prisma');\n if (allDeps?.drizzle) result.additionalFrameworks.push('Drizzle ORM');\n if (allDeps?.mongoose) result.additionalFrameworks.push('Mongoose');\n if (allDeps?.sequelize) result.additionalFrameworks.push('Sequelize');\n if (allDeps?.tailwindcss) result.additionalFrameworks.push('Tailwind CSS');\n if (allDeps?.['styled-components']) result.additionalFrameworks.push('Styled Components');\n if (allDeps?.jest) result.additionalFrameworks.push('Jest');\n if (allDeps?.vitest) result.additionalFrameworks.push('Vitest');\n if (allDeps?.playwright || allDeps?.['@playwright/test']) result.additionalFrameworks.push('Playwright');\n if (allDeps?.cypress) result.additionalFrameworks.push('Cypress');\n if (allDeps?.docker || fs.existsSync(path.join(cwd, 'Dockerfile'))) result.additionalFrameworks.push('Docker');\n if (allDeps?.supabase || allDeps?.['@supabase/supabase-js']) result.additionalFrameworks.push('Supabase');\n if (allDeps?.firebase) result.additionalFrameworks.push('Firebase');\n\n return result;\n } catch {\n // JSON parse failed, continue\n }\n }\n\n // Check for Laravel (PHP)\n const composerPath = path.join(cwd, 'composer.json');\n if (fs.existsSync(composerPath)) {\n try {\n const composer = JSON.parse(fs.readFileSync(composerPath, 'utf-8'));\n const require = composer.require || {};\n\n if (require['laravel/framework']) {\n result.framework = 'Laravel';\n result.language = 'PHP';\n result.packageManager = 'composer';\n result.confidence = 'high';\n result.version = require['laravel/framework'];\n return result;\n }\n\n result.framework = 'PHP';\n result.language = 'PHP';\n result.packageManager = 'composer';\n result.confidence = 'medium';\n return result;\n } catch {\n // continue\n }\n }\n\n // Check for Python\n const requirementsTxt = path.join(cwd, 'requirements.txt');\n const pyprojectToml = path.join(cwd, 'pyproject.toml');\n const setupPy = path.join(cwd, 'setup.py');\n\n if (fs.existsSync(pyprojectToml) || fs.existsSync(requirementsTxt) || fs.existsSync(setupPy)) {\n result.language = 'Python';\n result.packageManager = 'pip';\n result.confidence = 'medium';\n\n // Try to detect specific framework\n const reqFile = fs.existsSync(requirementsTxt)\n ? fs.readFileSync(requirementsTxt, 'utf-8')\n : '';\n\n if (reqFile.includes('fastapi') || reqFile.includes('FastAPI')) {\n result.framework = 'FastAPI';\n result.confidence = 'high';\n } else if (reqFile.includes('django') || reqFile.includes('Django')) {\n result.framework = 'Django';\n result.confidence = 'high';\n } else if (reqFile.includes('flask') || reqFile.includes('Flask')) {\n result.framework = 'Flask';\n result.confidence = 'high';\n } else {\n result.framework = 'Python';\n }\n\n return result;\n }\n\n // Check for Go\n if (fs.existsSync(path.join(cwd, 'go.mod'))) {\n result.framework = 'Go';\n result.language = 'Go';\n result.packageManager = 'go modules';\n result.confidence = 'high';\n return result;\n }\n\n // Check for Rust\n if (fs.existsSync(path.join(cwd, 'Cargo.toml'))) {\n result.framework = 'Rust';\n result.language = 'Rust';\n result.packageManager = 'cargo';\n result.confidence = 'high';\n return result;\n }\n\n // Check for Ruby / Rails\n if (fs.existsSync(path.join(cwd, 'Gemfile'))) {\n const gemfile = fs.readFileSync(path.join(cwd, 'Gemfile'), 'utf-8');\n result.language = 'Ruby';\n result.packageManager = 'bundler';\n\n if (gemfile.includes('rails')) {\n result.framework = 'Ruby on Rails';\n result.confidence = 'high';\n } else {\n result.framework = 'Ruby';\n result.confidence = 'medium';\n }\n return result;\n }\n\n // Check for Odoo\n const manifestPath = path.join(cwd, '__manifest__.py');\n if (fs.existsSync(manifestPath)) {\n result.framework = 'Odoo';\n result.language = 'Python';\n result.packageManager = 'pip';\n result.confidence = 'high';\n return result;\n }\n\n return result;\n}\n","export type FileCategory =\n | 'controller' | 'service' | 'model' | 'route' | 'view' | 'component'\n | 'test' | 'config' | 'migration' | 'middleware' | 'util' | 'type'\n | 'static' | 'documentation' | 'script' | 'command' | 'unknown';\n\nexport interface ClassifiedFile { path: string; category: FileCategory; }\n\nconst PATTERNS: [RegExp, FileCategory][] = [\n // Tests — highest priority\n [/\\.(test|spec)\\.(ts|tsx|js|jsx|py|rb|php)$/i, 'test'],\n [/__tests__\\//i, 'test'], [/\\/tests?\\//i, 'test'],\n\n // Commands / Handlers (CLI tools, bots, workers)\n [/commands?\\//i, 'command'],\n [/\\.command\\.(ts|js)$/i, 'command'],\n [/handlers?\\//i, 'command'],\n [/\\.handler\\.(ts|js)$/i, 'command'],\n\n // Controllers\n [/controllers?\\//i, 'controller'],\n [/\\.controller\\.(ts|js|py|rb|php)$/i, 'controller'],\n [/\\/Http\\/Controllers\\//i, 'controller'],\n\n // Routes / API endpoints\n [/routes?\\//i, 'route'], [/\\.routes?\\.(ts|js)$/i, 'route'],\n [/\\/app\\/api\\//i, 'route'], [/\\/pages\\/api\\//i, 'route'],\n\n // Services / Business logic\n [/services?\\//i, 'service'], [/\\.service\\.(ts|js)$/i, 'service'],\n [/\\/use-?cases?\\//i, 'service'],\n\n // Models / Entities / Schema\n [/models?\\//i, 'model'], [/\\.model\\.(ts|js)$/i, 'model'],\n [/\\/entities?\\//i, 'model'], [/prisma\\/schema\\.prisma$/i, 'model'],\n [/\\/schemas?\\//i, 'model'],\n\n // Migrations / Seeds\n [/migrations?\\//i, 'migration'], [/\\/seeds?\\//i, 'migration'],\n [/\\/seeders?\\//i, 'migration'],\n\n // Middleware\n [/middleware/i, 'middleware'],\n\n // Views / Pages\n [/views?\\//i, 'view'], [/\\/pages\\//i, 'view'],\n [/\\/app\\/.*page\\.(tsx|jsx)$/i, 'view'], [/\\.blade\\.php$/i, 'view'],\n [/\\/app\\/.*layout\\.(tsx|jsx)$/i, 'view'],\n\n // Components / UI\n [/components?\\//i, 'component'], [/\\/ui\\//i, 'component'],\n [/\\/widgets?\\//i, 'component'],\n\n // Types / Interfaces\n [/types?\\//i, 'type'], [/\\.d\\.ts$/i, 'type'],\n [/interfaces?\\//i, 'type'],\n\n // Utilities / Helpers / Lib\n [/utils?\\//i, 'util'], [/helpers?\\//i, 'util'], [/lib\\//i, 'util'],\n\n // Core modules (engines, analyzers, detectors)\n [/core\\//i, 'service'],\n [/engines?\\//i, 'service'],\n\n // AI / ML modules\n [/\\/ai\\//i, 'service'],\n [/\\/ml\\//i, 'service'],\n\n // Reporters / Output\n [/reporters?\\//i, 'util'],\n [/formatters?\\//i, 'util'],\n\n // Templates\n [/templates?\\//i, 'util'],\n\n // Config\n [/config\\//i, 'config'], [/\\.config\\.(ts|js|mjs|cjs|json)$/i, 'config'],\n [/tsconfig/i, 'config'], [/\\.eslintrc/i, 'config'], [/\\.prettierrc/i, 'config'],\n\n // Documentation\n [/\\.md$/i, 'documentation'], [/docs?\\//i, 'documentation'],\n\n // Scripts\n [/scripts?\\//i, 'script'], [/Makefile$/i, 'script'],\n\n // Static assets\n [/public\\//i, 'static'], [/static\\//i, 'static'],\n [/assets?\\//i, 'static'],\n [/\\.(png|jpg|jpeg|gif|svg|ico|webp|mp4|woff2?|ttf|eot)$/i, 'static'],\n];\n\nexport function classifyFile(filePath: string): FileCategory {\n const p = filePath.replace(/\\\\/g, '/');\n for (const [re, cat] of PATTERNS) { if (re.test(p)) return cat; }\n return 'unknown';\n}\n\nexport function classifyFiles(files: string[]) {\n const byCategory = Object.fromEntries(\n (['controller','service','model','route','view','component','test','config',\n 'migration','middleware','util','type','static','documentation','script',\n 'command','unknown'] as FileCategory[])\n .map(c => [c, [] as string[]])\n ) as Record<FileCategory, string[]>;\n const classified: ClassifiedFile[] = [];\n for (const f of files) {\n const cat = classifyFile(f);\n classified.push({ path: f, category: cat });\n byCategory[cat].push(f);\n }\n return { classified, byCategory };\n}\n","import type { FileCategory } from './fileClassifier.js';\n\nexport interface ArchitectureResult {\n style: string;\n layers: { name: string; files: number; examples: string[] }[];\n dataFlow: string[];\n weakPoints: string[];\n suggestions: string[];\n}\n\n/**\n * Infer architecture from classified file categories.\n */\nexport function analyzeArchitecture(\n byCategory: Record<FileCategory, string[]>,\n framework: string,\n): ArchitectureResult {\n const layers: ArchitectureResult['layers'] = [];\n\n const layerMap: [string, FileCategory[]][] = [\n ['Presentation / UI', ['view', 'component']],\n ['Routing', ['route']],\n ['Commands / Handlers', ['command']],\n ['Controllers / Handlers', ['controller']],\n ['Middleware', ['middleware']],\n ['Business Logic / Services', ['service']],\n ['Data / Models', ['model']],\n ['Database / Migrations', ['migration']],\n ['Utilities / Helpers', ['util', 'type']],\n ['Configuration', ['config']],\n ['Testing', ['test']],\n ['Static Assets', ['static']],\n ['Documentation', ['documentation']],\n ];\n\n for (const [name, categories] of layerMap) {\n const files = categories.flatMap((c) => byCategory[c] || []);\n if (files.length > 0) {\n layers.push({\n name,\n files: files.length,\n examples: files.slice(0, 3),\n });\n }\n }\n\n // Detect architecture style\n const style = detectStyle(byCategory, framework);\n const dataFlow = inferDataFlow(byCategory, framework);\n const weakPoints = findWeakPoints(byCategory);\n const suggestions = generateSuggestions(byCategory, framework);\n\n return { style, layers, dataFlow, weakPoints, suggestions };\n}\n\nfunction detectStyle(cats: Record<FileCategory, string[]>, fw: string): string {\n const hasControllers = cats.controller.length > 0;\n const hasCommands = (cats.command?.length || 0) > 0;\n const hasServices = cats.service.length > 0;\n const hasModels = cats.model.length > 0;\n const hasViews = cats.view.length > 0 || cats.component.length > 0;\n const hasRoutes = cats.route.length > 0;\n\n // CLI tool pattern\n if (hasCommands && hasServices && !hasControllers && !hasRoutes) {\n return 'Modular CLI Architecture (Commands → Core Services → Utilities)';\n }\n if (hasCommands && !hasControllers && !hasRoutes) {\n return 'Command-based Architecture';\n }\n\n // Web patterns\n if (hasControllers && hasModels && hasViews) {\n return hasServices ? 'MVC + Service Layer' : 'MVC (Model-View-Controller)';\n }\n if (hasRoutes && hasServices && hasModels) {\n return 'Layered Architecture (Route → Service → Model)';\n }\n if (hasViews && hasRoutes && !hasControllers) {\n if (fw.includes('Next') || fw.includes('Nuxt') || fw.includes('Svelte')) {\n return 'File-based Routing (Fullstack Framework)';\n }\n return 'Component-based Architecture';\n }\n if (hasControllers && hasServices) {\n return 'Layered Architecture';\n }\n if (cats.component.length > 5) {\n return 'Component-based Architecture';\n }\n\n // General modular structure\n if (hasServices && cats.util.length > 0) {\n return 'Modular Architecture (Services → Utilities)';\n }\n\n return 'Flat / Script-based Structure';\n}\n\nfunction inferDataFlow(cats: Record<FileCategory, string[]>, fw: string): string[] {\n const flow: string[] = [];\n\n // CLI flow\n const hasCommands = (cats.command?.length || 0) > 0;\n if (hasCommands) {\n flow.push('CLI Input → Commands');\n if (cats.service.length > 0) flow.push('Commands → Core Services');\n if (cats.util.length > 0) flow.push('Services → Utilities');\n flow.push('Output → Terminal / Report');\n return flow;\n }\n\n // Web flow\n if (cats.route.length > 0) flow.push('Client Request → Routes');\n if (cats.middleware.length > 0) flow.push('Routes → Middleware');\n if (cats.controller.length > 0) flow.push('Middleware → Controllers');\n else if (cats.route.length > 0) flow.push('Routes → Handlers');\n if (cats.service.length > 0) flow.push('Controllers → Services');\n if (cats.model.length > 0) flow.push('Services → Models → Database');\n if (cats.view.length > 0 || cats.component.length > 0) {\n flow.push('Data → Views/Components → UI');\n }\n if (flow.length === 0) flow.push('Simple file-based execution');\n return flow;\n}\n\nfunction findWeakPoints(cats: Record<FileCategory, string[]>): string[] {\n const points: string[] = [];\n if (cats.test.length === 0) points.push('No test files detected — code quality is unverified');\n if (cats.middleware.length === 0 && cats.controller.length > 0) {\n points.push('No middleware layer — auth/validation may be missing');\n }\n if (cats.service.length === 0 && cats.controller.length > 3) {\n points.push('Controllers without service layer — business logic may be coupled to HTTP layer');\n }\n if (cats.type.length === 0 && (cats.controller.length + cats.service.length + (cats.command?.length || 0)) > 5) {\n points.push('No type definitions — lack of type safety');\n }\n if (cats.config.length === 0) points.push('No explicit configuration files found');\n if (cats.documentation.length === 0) points.push('No documentation found');\n return points;\n}\n\nfunction generateSuggestions(cats: Record<FileCategory, string[]>, fw: string): string[] {\n const s: string[] = [];\n if (cats.test.length === 0) s.push('Add unit tests for critical business logic');\n if (cats.middleware.length === 0 && cats.controller.length > 0) {\n s.push('Consider adding auth and validation middleware');\n }\n if (cats.service.length === 0 && cats.controller.length > 2) {\n s.push('Extract business logic into service classes');\n }\n if (cats.type.length === 0) s.push('Add TypeScript interfaces or type definitions');\n if (cats.documentation.length < 2) s.push('Add README and API documentation');\n if (cats.migration.length === 0 && cats.model.length > 0) {\n s.push('Consider using database migrations for schema management');\n }\n return s;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport fg from 'fast-glob';\nimport { getGlobIgnorePatterns } from '../utils/paths.js';\n\nexport interface RiskItem {\n level: 'high' | 'medium' | 'low';\n category: 'security' | 'architecture' | 'maintainability' | 'testing';\n message: string;\n file?: string;\n line?: number;\n}\n\nexport interface RiskReport {\n risks: RiskItem[];\n summary: { high: number; medium: number; low: number };\n}\n\nconst DANGEROUS_PATTERNS: { pattern: RegExp; message: string; level: RiskItem['level']; category: RiskItem['category'] }[] = [\n { pattern: /(?:^|[;\\s])eval\\s*\\(/gm, message: 'eval() usage detected — potential code injection', level: 'high', category: 'security' },\n { pattern: /(?:^|[;\\s])(?:child_process|cp).*exec\\s*\\(/gm, message: 'exec() usage — possible command injection', level: 'medium', category: 'security' },\n { pattern: /(?:^|[;\\s])shell_exec\\s*\\(/gm, message: 'shell_exec() usage — command injection risk', level: 'high', category: 'security' },\n { pattern: /(?:SELECT|INSERT|UPDATE|DELETE|DROP)\\s+.*(?:FROM|INTO|TABLE)\\s/gi, message: 'Raw SQL detected — use parameterized queries', level: 'medium', category: 'security' },\n { pattern: /(?:api[_-]?key|secret[_-]?key|access[_-]?token)\\s*[:=]\\s*[\"'][a-zA-Z0-9]{8,}/gi, message: 'Hardcoded API key or secret', level: 'high', category: 'security' },\n { pattern: /sk-[a-zA-Z0-9]{20,}/g, message: 'OpenAI API key detected in source', level: 'high', category: 'security' },\n { pattern: /AKIA[0-9A-Z]{16}/g, message: 'AWS access key detected in source', level: 'high', category: 'security' },\n { pattern: /(?:TODO|FIXME|HACK|XXX|BUG)\\b/gi, message: 'TODO/FIXME marker found', level: 'low', category: 'maintainability' },\n { pattern: /(?:password|passwd)\\s*[:=]\\s*[\"'][^\"']+[\"']/gi, message: 'Hardcoded password detected', level: 'high', category: 'security' },\n];\n\n/** Files that are part of RepoLens itself — skip to avoid false positives */\nconst SELF_SKIP_PATTERNS = ['riskDetector', 'privacyFilter', 'masks', 'agentsTemplate', 'contextScorer', 'contentReader'];\n\nconst CODE_EXTENSIONS = ['.ts','.tsx','.js','.jsx','.py','.php','.rb','.go','.rs','.java','.kt','.cs','.vue','.svelte'];\n\n/**\n * Scan repository for risky patterns.\n */\nexport async function detectRisks(cwd: string): Promise<RiskReport> {\n const risks: RiskItem[] = [];\n const ignore = getGlobIgnorePatterns();\n\n // 1. Check for .env files\n const envFiles = await fg('**/.env*', { cwd, ignore, dot: true });\n for (const f of envFiles) {\n if (!f.endsWith('.example') && !f.endsWith('.sample')) {\n risks.push({ level: 'high', category: 'security', message: `.env file found — may contain secrets`, file: f });\n }\n }\n\n // 2. Check for missing README\n const readmes = await fg('**/README*', { cwd, ignore, caseSensitiveMatch: false });\n if (readmes.length === 0) {\n risks.push({ level: 'medium', category: 'maintainability', message: 'No README file found' });\n }\n\n // 3. Check for missing tests\n const tests = await fg('**/*.{test,spec}.{ts,tsx,js,jsx,py,rb,php}', { cwd, ignore });\n const testDirs = await fg('**/tests/**', { cwd, ignore });\n if (tests.length === 0 && testDirs.length === 0) {\n risks.push({ level: 'medium', category: 'testing', message: 'No test files found in project' });\n }\n\n // 4. Scan code files for dangerous patterns\n const codeFiles = await fg('**/*', { cwd, ignore, onlyFiles: true });\n for (const file of codeFiles) {\n const ext = path.extname(file).toLowerCase();\n if (!CODE_EXTENSIONS.includes(ext)) continue;\n\n // Skip RepoLens own files to avoid false positives from pattern definitions\n if (SELF_SKIP_PATTERNS.some(p => file.includes(p))) continue;\n\n try {\n const fullPath = path.join(cwd, file);\n const stat = fs.statSync(fullPath);\n\n // Large file check\n const lineEstimate = Math.round(stat.size / 25);\n if (lineEstimate > 500 && (file.includes('controller') || file.includes('Controller'))) {\n risks.push({ level: 'medium', category: 'architecture', message: `Large controller file (~${lineEstimate} lines)`, file });\n }\n\n // Only scan files under 100KB for patterns\n if (stat.size > 100_000) continue;\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n for (const { pattern, message, level, category } of DANGEROUS_PATTERNS) {\n pattern.lastIndex = 0;\n if (pattern.test(content)) {\n risks.push({ level, category, message, file });\n }\n }\n } catch {\n // skip unreadable files\n }\n }\n\n const summary = {\n high: risks.filter(r => r.level === 'high').length,\n medium: risks.filter(r => r.level === 'medium').length,\n low: risks.filter(r => r.level === 'low').length,\n };\n\n return { risks, summary };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport fg from 'fast-glob';\nimport { getGlobIgnorePatterns } from '../utils/paths.js';\n\n/**\n * Content-aware file reader.\n * Actually reads file contents to extract meaningful information,\n * instead of just relying on filenames.\n */\n\nexport interface FileContent {\n path: string;\n content: string;\n lines: number;\n imports: string[];\n exports: string[];\n functions: string[];\n classes: string[];\n comments: string[];\n todoFixmes: { line: number; text: string }[];\n}\n\nexport interface ContentSummary {\n totalLinesOfCode: number;\n totalComments: number;\n totalFunctions: number;\n totalClasses: number;\n totalImports: number;\n totalExports: number;\n totalTodoFixmes: number;\n averageFileSize: number;\n largestFiles: { path: string; lines: number }[];\n mostConnected: { path: string; imports: number }[];\n}\n\nconst CODE_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',\n '.py', '.php', '.rb', '.go', '.rs', '.java', '.kt',\n '.cs', '.cpp', '.c', '.swift', '.vue', '.svelte', '.dart',\n]);\n\nconst MAX_FILE_SIZE = 200_000; // 200KB max per file\nconst MAX_FILES_TO_READ = 500; // Cap for large repos\n\n/**\n * Read and analyze content of code files in a repository.\n */\nexport async function readCodeContents(cwd: string): Promise<FileContent[]> {\n const ignore = getGlobIgnorePatterns();\n const files = await fg('**/*', {\n cwd,\n ignore,\n onlyFiles: true,\n dot: false,\n followSymbolicLinks: false,\n });\n\n const codeFiles = files.filter((f) => {\n const ext = path.extname(f).toLowerCase();\n return CODE_EXTENSIONS.has(ext);\n });\n\n const results: FileContent[] = [];\n\n for (const file of codeFiles.slice(0, MAX_FILES_TO_READ)) {\n try {\n const fullPath = path.join(cwd, file);\n const stat = fs.statSync(fullPath);\n if (stat.size > MAX_FILE_SIZE) continue;\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n const parsed = parseFileContent(file, content);\n results.push(parsed);\n } catch {\n // Skip unreadable files\n }\n }\n\n return results;\n}\n\n/**\n * Parse a single file's content to extract structural information.\n */\nfunction parseFileContent(filePath: string, content: string): FileContent {\n const lines = content.split('\\n');\n const ext = path.extname(filePath).toLowerCase();\n\n const result: FileContent = {\n path: filePath,\n content: content.substring(0, 10_000), // Keep first 10KB for context\n lines: lines.length,\n imports: [],\n exports: [],\n functions: [],\n classes: [],\n comments: [],\n todoFixmes: [],\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n\n // Extract imports\n if (/^import\\s/.test(line) || /^from\\s/.test(line) || /require\\(/.test(line)) {\n result.imports.push(line);\n }\n\n // Extract exports\n if (/^export\\s/.test(line)) {\n result.exports.push(line.substring(0, 100));\n }\n\n // Extract function declarations\n const funcMatch = line.match(\n /(?:export\\s+)?(?:async\\s+)?(?:function\\s+(\\w+)|(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?(?:\\(|=>))/\n );\n if (funcMatch) {\n result.functions.push(funcMatch[1] || funcMatch[2]);\n }\n\n // Extract class declarations\n const classMatch = line.match(/(?:export\\s+)?class\\s+(\\w+)/);\n if (classMatch) {\n result.classes.push(classMatch[1]);\n }\n\n // Extract single-line comments\n if (/^\\/\\//.test(line) || /^#(?!!)/.test(line)) {\n result.comments.push(line);\n }\n\n // Extract TODO/FIXME — only match actual comment markers\n // Must be preceded by comment syntax (// or # or *) to avoid false positives\n if (/(?:\\/\\/|#|^\\s*\\*)\\s*/.test(line)) {\n const todoMatch = line.match(/(?:\\/\\/|#|\\*)\\s*(TODO|FIXME|HACK|XXX|BUG)[\\s:]+(.+)/i);\n if (todoMatch) {\n result.todoFixmes.push({ line: i + 1, text: `${todoMatch[1]}: ${todoMatch[2].trim()}` });\n }\n }\n\n // Python function/class detection\n if (ext === '.py') {\n const pyFuncMatch = line.match(/^(?:async\\s+)?def\\s+(\\w+)/);\n if (pyFuncMatch) result.functions.push(pyFuncMatch[1]);\n const pyClassMatch = line.match(/^class\\s+(\\w+)/);\n if (pyClassMatch) result.classes.push(pyClassMatch[1]);\n }\n\n // Go function detection\n if (ext === '.go') {\n const goFuncMatch = line.match(/^func\\s+(?:\\(.*?\\)\\s+)?(\\w+)/);\n if (goFuncMatch) result.functions.push(goFuncMatch[1]);\n }\n\n // Rust function detection\n if (ext === '.rs') {\n const rsFuncMatch = line.match(/^(?:pub\\s+)?(?:async\\s+)?fn\\s+(\\w+)/);\n if (rsFuncMatch) result.functions.push(rsFuncMatch[1]);\n }\n }\n\n return result;\n}\n\n/**\n * Summarize content analysis results.\n */\nexport function summarizeContents(files: FileContent[]): ContentSummary {\n const totalLinesOfCode = files.reduce((s, f) => s + f.lines, 0);\n const totalComments = files.reduce((s, f) => s + f.comments.length, 0);\n const totalFunctions = files.reduce((s, f) => s + f.functions.length, 0);\n const totalClasses = files.reduce((s, f) => s + f.classes.length, 0);\n const totalImports = files.reduce((s, f) => s + f.imports.length, 0);\n const totalExports = files.reduce((s, f) => s + f.exports.length, 0);\n const totalTodoFixmes = files.reduce((s, f) => s + f.todoFixmes.length, 0);\n\n const largestFiles = [...files]\n .sort((a, b) => b.lines - a.lines)\n .slice(0, 10)\n .map((f) => ({ path: f.path, lines: f.lines }));\n\n const mostConnected = [...files]\n .sort((a, b) => b.imports.length - a.imports.length)\n .slice(0, 10)\n .map((f) => ({ path: f.path, imports: f.imports.length }));\n\n return {\n totalLinesOfCode,\n totalComments,\n totalFunctions,\n totalClasses,\n totalImports,\n totalExports,\n totalTodoFixmes,\n averageFileSize: files.length > 0 ? Math.round(totalLinesOfCode / files.length) : 0,\n largestFiles,\n mostConnected,\n };\n}\n\n/**\n * Find files related to a topic by searching content, not just filenames.\n */\nexport function findRelatedByContent(\n files: FileContent[],\n topic: string,\n): FileContent[] {\n const topicLower = topic.toLowerCase();\n const scored = files.map((f) => {\n let score = 0;\n const pathLower = f.path.toLowerCase();\n\n // Path match (weight: 3)\n if (pathLower.includes(topicLower)) score += 3;\n\n // Function name match (weight: 2)\n if (f.functions.some((fn) => fn.toLowerCase().includes(topicLower))) score += 2;\n\n // Class name match (weight: 2)\n if (f.classes.some((cls) => cls.toLowerCase().includes(topicLower))) score += 2;\n\n // Import match (weight: 1)\n if (f.imports.some((imp) => imp.toLowerCase().includes(topicLower))) score += 1;\n\n // Content match (weight: 1)\n if (f.content.toLowerCase().includes(topicLower)) score += 1;\n\n return { file: f, score };\n });\n\n return scored\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .map((s) => s.file);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Context Quality Scorer — Evaluate the effectiveness of AI context files.\n * Based on research: auto-generated generic rules REDUCE agent performance.\n * Hand-curated tribal knowledge INCREASES performance.\n */\n\nexport interface ContextFile {\n type: 'agents' | 'claude' | 'cursorrules' | 'copilot' | 'skill' | 'unknown';\n path: string;\n content: string;\n exists: boolean;\n}\n\nexport interface ScoreResult {\n overall: number;\n breakdown: {\n specificity: number;\n coverage: number;\n conciseness: number;\n freshness: number;\n tribalKnowledge: number;\n };\n issues: ScoreIssue[];\n suggestions: string[];\n genericRulesCount: number;\n specificRulesCount: number;\n totalLines: number;\n}\n\nexport interface ScoreIssue {\n severity: 'error' | 'warning' | 'info';\n message: string;\n line?: number;\n fix?: string;\n}\n\nconst GENERIC_PATTERNS: { pattern: RegExp; description: string }[] = [\n { pattern: /never\\s+commit\\s+secrets?/i, description: 'Generic: \"Never commit secrets\"' },\n { pattern: /validate\\s+all\\s+input/i, description: 'Generic: \"Validate all input\"' },\n { pattern: /no\\s+eval\\(\\)/i, description: 'Generic: \"No eval()\"' },\n { pattern: /never\\s+trust\\s+user\\s+input/i, description: 'Generic: \"Never trust user input\"' },\n { pattern: /use\\s+parameterized\\s+queries/i, description: 'Generic: \"Use parameterized queries\"' },\n { pattern: /follow\\s+\\w+\\s+conventions/i, description: 'Generic: \"Follow X conventions\"' },\n { pattern: /keep\\s+files?\\s+focused/i, description: 'Generic: \"Keep files focused\"' },\n { pattern: /minimal\\s+safe\\s+changes/i, description: 'Generic: \"Minimal safe changes\"' },\n { pattern: /analyze\\s+before\\s+editing/i, description: 'Generic: \"Analyze before editing\"' },\n { pattern: /no\\s+unnecessary\\s+rewrites/i, description: 'Generic: \"No unnecessary rewrites\"' },\n { pattern: /protect\\s+\\.?env\\s+files?/i, description: 'Generic: \"Protect .env files\"' },\n { pattern: /preserve\\s+auth\\s+middleware/i, description: 'Generic: \"Preserve auth middleware\"' },\n { pattern: /summarize\\s+all\\s+changes/i, description: 'Generic: \"Summarize changes\"' },\n { pattern: /read\\s+relevant\\s+files?\\s+before/i, description: 'Generic: \"Read files before editing\"' },\n];\n\nconst TRIBAL_KNOWLEDGE_PATTERNS: { pattern: RegExp; description: string }[] = [\n { pattern: /(?:always|never|must)\\s+use\\s+`[^`]+`/i, description: 'Specific tool/command' },\n { pattern: /because\\s+.{10,}/i, description: 'Explains reasoning' },\n { pattern: /(?:gotcha|caveat|watch\\s+out|careful|beware|pitfall)/i, description: 'Gotcha/pitfall' },\n { pattern: /(?:instead\\s+of|don'?t\\s+use\\s+`[^`]+`.*use\\s+`[^`]+`)/i, description: 'Specific alternative' },\n { pattern: /(?:bug|workaround|hack)\\s+(?:in|for|with)\\s+/i, description: 'Known bug/workaround' },\n { pattern: /(?:we|this\\s+project)\\s+(?:chose|decided|prefer)/i, description: 'Architecture decision' },\n { pattern: /(?:npm|yarn|pnpm)\\s+run\\s+\\w+/i, description: 'Specific command' },\n { pattern: /\\b(?:port|timeout|limit|threshold)\\s*[:=]\\s*\\d+/i, description: 'Config value' },\n { pattern: /(?:breaking\\s+change|deprecated|legacy)\\s+/i, description: 'Migration note' },\n { pattern: /(?:file|module|directory)\\s+`[^`]+`/i, description: 'References specific file' },\n];\n\nconst COVERAGE_AREAS = [\n { area: 'Tech Stack', patterns: [/framework|stack|language|typescript|python|react|next/i] },\n { area: 'Build Commands', patterns: [/npm\\s+run|yarn|pnpm|build|dev|test|lint/i] },\n { area: 'Architecture', patterns: [/architecture|pattern|structure|layer|module/i] },\n { area: 'Testing', patterns: [/test|spec|jest|vitest|pytest/i] },\n { area: 'File Structure', patterns: [/directory|folder|src\\/|app\\//i] },\n { area: 'Gotchas', patterns: [/gotcha|caveat|pitfall|watch\\s+out|known\\s+issue/i] },\n { area: 'Conventions', patterns: [/convention|naming|style|format/i] },\n { area: 'Dependencies', patterns: [/dependency|package|library|import/i] },\n];\n\n/**\n * Detect all AI context files in a repository.\n */\nexport function detectContextFiles(cwd: string): ContextFile[] {\n const contextFileMap: { type: ContextFile['type']; paths: string[] }[] = [\n { type: 'agents', paths: ['AGENTS.md', 'agents.md'] },\n { type: 'claude', paths: ['CLAUDE.md', 'claude.md', 'CODEX.md'] },\n { type: 'cursorrules', paths: ['.cursorrules'] },\n { type: 'copilot', paths: ['.github/copilot-instructions.md'] },\n ];\n\n const results: ContextFile[] = [];\n\n for (const { type, paths: filePaths } of contextFileMap) {\n let found = false;\n for (const p of filePaths) {\n const fullPath = path.join(cwd, p);\n if (fs.existsSync(fullPath)) {\n try {\n const content = fs.readFileSync(fullPath, 'utf-8');\n results.push({ type, path: p, content, exists: true });\n found = true;\n break;\n } catch { /* skip */ }\n }\n }\n if (!found) {\n results.push({ type, path: filePaths[0], content: '', exists: false });\n }\n }\n\n // Check for .cursor/rules/*.mdc files\n const mdcDir = path.join(cwd, '.cursor', 'rules');\n if (fs.existsSync(mdcDir)) {\n try {\n const mdcFiles = fs.readdirSync(mdcDir).filter((f) => f.endsWith('.mdc'));\n for (const mf of mdcFiles) {\n const content = fs.readFileSync(path.join(mdcDir, mf), 'utf-8');\n results.push({ type: 'cursorrules', path: `.cursor/rules/${mf}`, content, exists: true });\n }\n } catch { /* skip */ }\n }\n\n // Check for .windsurfrules\n const windsurfPath = path.join(cwd, '.windsurfrules');\n if (fs.existsSync(windsurfPath)) {\n try {\n const content = fs.readFileSync(windsurfPath, 'utf-8');\n results.push({ type: 'cursorrules', path: '.windsurfrules', content, exists: true });\n } catch { /* skip */ }\n }\n\n // Check for SKILL.md files\n const skillPaths = ['.cursor/skills', '.skills', 'skills'];\n for (const sp of skillPaths) {\n const skillDir = path.join(cwd, sp);\n if (fs.existsSync(skillDir)) {\n try {\n const stat = fs.statSync(skillDir);\n if (stat.isDirectory()) {\n const skillFiles = fs.readdirSync(skillDir).filter((f) => f.endsWith('.md'));\n for (const sf of skillFiles) {\n const content = fs.readFileSync(path.join(skillDir, sf), 'utf-8');\n results.push({ type: 'skill', path: `${sp}/${sf}`, content, exists: true });\n }\n }\n } catch { /* skip */ }\n }\n }\n\n return results;\n}\n\n/**\n * Score the quality of a context file.\n */\nexport function scoreContextFile(content: string, projectFiles?: string[]): ScoreResult {\n const lines = content.split('\\n');\n const issues: ScoreIssue[] = [];\n const suggestions: string[] = [];\n let genericCount = 0;\n let specificCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n for (const { pattern, description } of GENERIC_PATTERNS) {\n pattern.lastIndex = 0;\n if (pattern.test(line)) {\n genericCount++;\n issues.push({ severity: 'warning', message: description, line: i + 1,\n fix: 'Replace with a project-specific version of this rule' });\n }\n }\n for (const { pattern } of TRIBAL_KNOWLEDGE_PATTERNS) {\n pattern.lastIndex = 0;\n if (pattern.test(line)) specificCount++;\n }\n }\n\n const totalRules = genericCount + specificCount;\n const specificityScore = totalRules > 0 ? Math.round((specificCount / totalRules) * 100) : 0;\n\n let coveredAreas = 0;\n for (const { area, patterns } of COVERAGE_AREAS) {\n const covered = patterns.some((p) => { p.lastIndex = 0; return p.test(content); });\n if (covered) coveredAreas++;\n else suggestions.push(`Add section about: ${area}`);\n }\n const coverageScore = Math.round((coveredAreas / COVERAGE_AREAS.length) * 100);\n\n const nonEmptyLines = lines.filter((l) => l.trim().length > 0).length;\n let concisenessScore: number;\n if (nonEmptyLines <= 150) concisenessScore = 100;\n else if (nonEmptyLines <= 300) concisenessScore = 80;\n else if (nonEmptyLines <= 500) { concisenessScore = 50;\n issues.push({ severity: 'warning', message: `File is ${nonEmptyLines} lines — trim to under 200` });\n } else { concisenessScore = 20;\n issues.push({ severity: 'error', message: `File is ${nonEmptyLines} lines — will overwhelm AI agents`,\n fix: 'Split into hierarchical context files' });\n }\n\n let freshnessScore = 50;\n if (projectFiles && projectFiles.length > 0) {\n const refed = projectFiles.filter((f) => content.includes(path.basename(f)));\n freshnessScore = Math.min(100, Math.round((refed.length / Math.min(projectFiles.length, 20)) * 100));\n if (freshnessScore < 10) {\n issues.push({ severity: 'warning', message: 'Context file references very few project files — may be outdated' });\n }\n }\n\n let tribalCount = 0;\n for (const { pattern } of TRIBAL_KNOWLEDGE_PATTERNS) {\n const globalPattern = new RegExp(pattern.source, 'gi');\n const matches = content.match(globalPattern);\n if (matches) tribalCount += matches.length;\n }\n const tribalKnowledgeScore = Math.min(100, tribalCount * 15);\n if (tribalCount === 0) {\n issues.push({ severity: 'error', message: 'No tribal knowledge detected — only inferable info',\n fix: 'Add gotchas, architecture decisions, specific commands' });\n }\n\n if (content.length === 0) issues.push({ severity: 'error', message: 'Context file is empty' });\n if (genericCount > 5) suggestions.push(`Remove ${genericCount} generic rules that hurt agent performance`);\n\n const overall = Math.min(100, Math.round(\n specificityScore * 0.30 + coverageScore * 0.20 + concisenessScore * 0.15 +\n freshnessScore * 0.15 + tribalKnowledgeScore * 0.20\n ));\n\n return { overall, breakdown: { specificity: specificityScore, coverage: coverageScore,\n conciseness: concisenessScore, freshness: freshnessScore, tribalKnowledge: tribalKnowledgeScore },\n issues, suggestions, genericRulesCount: genericCount,\n specificRulesCount: specificCount, totalLines: nonEmptyLines };\n}\n\nexport function getGrade(score: number): string {\n if (score >= 90) return 'A+';\n if (score >= 80) return 'A';\n if (score >= 70) return 'B';\n if (score >= 60) return 'C';\n if (score >= 50) return 'D';\n return 'F';\n}\n\nexport function getScoreColor(score: number): 'green' | 'yellow' | 'red' {\n if (score >= 70) return 'green';\n if (score >= 40) return 'yellow';\n return 'red';\n}\n","import { Command } from 'commander';\nimport { analyzeCommand } from './commands/analyze.js';\nimport { architectureCommand } from './commands/architecture.js';\nimport { explainCommand } from './commands/explain.js';\nimport { reviewCommand } from './commands/review.js';\nimport { risksCommand } from './commands/risks.js';\nimport { onboardingCommand } from './commands/onboarding.js';\nimport { generateAgentsCommand } from './commands/generateAgents.js';\nimport { initCommand } from './commands/init.js';\nimport { lintCommand } from './commands/lint.js';\nimport { syncCommand } from './commands/sync.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { templatesCommand } from './commands/templates.js';\nimport { fixCommand } from './commands/fix.js';\nimport { skillsCommand } from './commands/skills.js';\nimport { setupCommand } from './commands/setup.js';\n\nconst program = new Command();\n\nprogram\n .name('repolens')\n .description('🔍 RepoLens AI — AI Context Intelligence for Vibe Coders\\n\\n Quick start: repolens setup\\n Score check: repolens lint\\n Dashboard: repolens dashboard')\n .version('2.0.0');\n\n// ─── THE ONE COMMAND ───────────────────────────────────\n// This is what 90% of users need. Everything else is optional.\n\nprogram\n .command('setup')\n .description('⭐ One-click setup — creates AGENTS.md + syncs to 6 AI tools + generates skills')\n .action(async () => {\n await setupCommand();\n });\n\n// ─── CORE COMMANDS ─────────────────────────────────────\n// For users who want more control.\n\nprogram\n .command('init')\n .description('Create AGENTS.md through interactive interview')\n .option('-y, --yes', 'Non-interactive mode')\n .action(async (options) => {\n await initCommand({ yes: options.yes });\n });\n\nprogram\n .command('lint')\n .alias('score')\n .description('Score your AI context files (0-100)')\n .action(async () => {\n await lintCommand();\n });\n\nprogram\n .command('sync')\n .description('Sync AGENTS.md → 6 AI tools (Cursor, Claude, Copilot, Windsurf, Codex)')\n .option('--force', 'Overwrite files with manual edits')\n .option('--dry-run', 'Preview without writing')\n .action(async (options) => {\n await syncCommand({ force: options.force, dryRun: options.dryRun });\n });\n\nprogram\n .command('fix')\n .description('Auto-fix issues in context files')\n .option('--dry-run', 'Preview fixes')\n .action(async (options) => {\n await fixCommand({ dryRun: options.dryRun });\n });\n\nprogram\n .command('templates')\n .alias('tpl')\n .description('Browse & apply framework templates (Next.js, React, Django, etc.)')\n .option('-s, --search <query>', 'Search templates')\n .option('-a, --apply <id>', 'Apply a template')\n .action(async (options) => {\n await templatesCommand({ search: options.search, apply: options.apply, list: !options.search && !options.apply });\n });\n\nprogram\n .command('skills')\n .description('Generate .cursor/skills/ for common tasks')\n .option('-l, --list', 'List available skills')\n .option('-a, --all', 'Generate all relevant skills')\n .action(async (options) => {\n await skillsCommand({ list: options.list, all: options.all });\n });\n\nprogram\n .command('doctor')\n .alias('check')\n .description('Health check for your AI dev setup')\n .action(async () => {\n await doctorCommand();\n });\n\nprogram\n .command('dashboard')\n .alias('ui')\n .description('Visual web dashboard (localhost)')\n .option('-p, --port <number>', 'Port', '3141')\n .action(async (options) => {\n await dashboardCommand({ port: parseInt(options.port, 10) });\n });\n\n// ─── ANALYSIS COMMANDS ─────────────────────────────────\n\nprogram\n .command('analyze')\n .description('Full repo analysis')\n .option('--format <type>', 'Output: terminal or md', 'terminal')\n .option('--no-ai', 'Disable AI')\n .action(async (options) => {\n await analyzeCommand({ format: options.format, ai: options.ai });\n });\n\nprogram\n .command('explain <topic>')\n .description('Explain any feature by searching code content')\n .option('--no-ai', 'Disable AI')\n .action(async (topic, options) => {\n await explainCommand(topic, { ai: options.ai });\n });\n\nprogram\n .command('review')\n .description('Review recent code changes')\n .option('--no-ai', 'Disable AI')\n .action(async (options) => {\n await reviewCommand({ ai: options.ai });\n });\n\nprogram\n .command('risks')\n .description('Security & risk scanner')\n .action(async () => {\n await risksCommand();\n });\n\nprogram\n .command('arch')\n .description('Architecture analysis')\n .option('--no-ai', 'Disable AI')\n .action(async (options) => {\n await architectureCommand({ ai: options.ai });\n });\n\nprogram\n .command('onboard')\n .description('Developer onboarding guide')\n .action(async () => {\n await onboardingCommand();\n });\n\nprogram\n .command('agents')\n .description('Generate AGENTS.md (legacy — use setup)')\n .action(async () => {\n await generateAgentsCommand();\n });\n\nprogram.parse();\n","import ora from 'ora';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { analyzeArchitecture } from '../core/architectureAnalyzer.js';\nimport { detectRisks } from '../core/riskDetector.js';\nimport { isAiAvailable, enhance } from '../ai/aiClient.js';\nimport { getSystemPrompt, buildAnalyzePrompt } from '../ai/promptBuilder.js';\nimport {\n reportBrand, reportSummary, reportFileStats, reportFolderStructure,\n reportImportantFiles, reportArchitecture, reportModules, reportRisks,\n reportWeakPoints, reportSuggestions, reportAiEnhancement,\n} from '../reporters/terminalReporter.js';\nimport { generateMarkdownReport } from '../reporters/markdownReporter.js';\nimport { logger } from '../utils/logger.js';\n\nexport async function analyzeCommand(options: { format?: string; ai?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Scanning repository...').start();\n\n try {\n // Step 1: Scan\n const scan = await scanRepository(cwd);\n spinner.text = 'Detecting framework...';\n\n // Step 2: Detect framework\n const framework = detectFramework(cwd);\n spinner.text = 'Classifying files...';\n\n // Step 3: Classify files\n const { byCategory } = classifyFiles(scan.fileTree);\n spinner.text = 'Analyzing architecture...';\n\n // Step 4: Architecture\n const architecture = analyzeArchitecture(byCategory, framework.framework);\n spinner.text = 'Scanning for risks...';\n\n // Step 5: Risk detection\n const risks = await detectRisks(cwd);\n spinner.succeed('Analysis complete');\n\n // Step 6: AI enhancement (optional)\n let aiText: string | null = null;\n if (options.ai !== false && isAiAvailable()) {\n const aiSpinner = ora('Enhancing with AI...').start();\n aiText = await enhance(\n getSystemPrompt(),\n buildAnalyzePrompt({\n framework: framework.framework,\n language: framework.language,\n totalFiles: scan.totalFiles,\n languages: scan.languages,\n directories: scan.directories,\n importantFiles: scan.importantFiles,\n architectureStyle: architecture.style,\n riskCount: risks.risks.length,\n }),\n );\n aiSpinner.succeed(aiText ? 'AI analysis complete' : 'AI unavailable, using static analysis');\n }\n\n // Output\n if (options.format === 'md') {\n const outputPath = generateMarkdownReport({\n scan, framework, architecture, risks, byCategory, aiText,\n });\n logger.success(`Report saved to ${outputPath}`);\n } else {\n reportSummary(scan, framework);\n reportFileStats(scan.filesByExtension);\n reportFolderStructure(scan.directories);\n reportImportantFiles(scan.importantFiles);\n reportArchitecture(architecture);\n reportModules(byCategory);\n reportRisks(risks);\n reportWeakPoints(architecture.weakPoints);\n reportSuggestions(architecture.suggestions);\n reportAiEnhancement(aiText);\n }\n } catch (error) {\n spinner.fail('Analysis failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import OpenAI from 'openai';\n\nlet client: OpenAI | null = null;\n\n/**\n * Check if AI is available (OPENAI_API_KEY is set).\n */\nexport function isAiAvailable(): boolean {\n return !!process.env.OPENAI_API_KEY;\n}\n\n/**\n * Get or create OpenAI client.\n */\nfunction getClient(): OpenAI {\n if (!client) {\n client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });\n }\n return client;\n}\n\n/**\n * Enhance a report with AI explanation.\n * Returns null if AI is unavailable or fails.\n */\nexport async function enhance(\n systemPrompt: string,\n userPrompt: string,\n): Promise<string | null> {\n if (!isAiAvailable()) return null;\n\n try {\n const ai = getClient();\n const response = await ai.chat.completions.create({\n model: process.env.REPOLENS_AI_MODEL || 'gpt-4o-mini',\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ],\n temperature: 0.3,\n max_tokens: 2000,\n });\n\n return response.choices[0]?.message?.content || null;\n } catch (error) {\n // Silently fail — AI is optional\n return null;\n }\n}\n","/**\n * Build prompts for AI enhancement.\n * Only sends scanned facts — never raw file contents.\n */\n\nconst SYSTEM_PROMPT = `You are a senior software engineer analyzing a codebase.\nYou provide clear, professional, actionable analysis.\nBase your analysis ONLY on the facts provided — do not invent files or features that don't exist.\nBe concise but thorough. Use bullet points.\nTone: professional, helpful, senior engineer style.`;\n\nexport function getSystemPrompt(): string {\n return SYSTEM_PROMPT;\n}\n\nexport function buildAnalyzePrompt(context: {\n framework: string;\n language: string;\n totalFiles: number;\n languages: string[];\n directories: string[];\n importantFiles: string[];\n architectureStyle: string;\n riskCount: number;\n}): string {\n return `Analyze this codebase and provide a senior-engineer-style summary.\n\nProject facts:\n- Framework: ${context.framework}\n- Language: ${context.language}\n- Total files: ${context.totalFiles}\n- Languages detected: ${context.languages.join(', ')}\n- Top-level directories: ${context.directories.join(', ')}\n- Important files: ${context.importantFiles.join(', ')}\n- Architecture style: ${context.architectureStyle}\n- Risk issues found: ${context.riskCount}\n\nProvide:\n1. A concise project summary (2-3 sentences)\n2. Architecture assessment\n3. Top 3 improvement recommendations\n4. Key risks to watch`;\n}\n\nexport function buildExplainPrompt(topic: string, relatedFiles: string[], framework: string): string {\n return `Explain the \"${topic}\" feature/module in this ${framework} project.\n\nRelated files found:\n${relatedFiles.map(f => `- ${f}`).join('\\n')}\n\nExplain:\n1. What this feature likely does\n2. How the files relate to each other\n3. The typical flow/lifecycle\n4. Potential risks or issues\n5. Improvement suggestions`;\n}\n\nexport function buildReviewPrompt(changedFiles: string[], diffStat: string, dangerCount: number): string {\n return `Review these recent code changes.\n\nChanged files:\n${changedFiles.map(f => `- ${f}`).join('\\n')}\n\nDiff stats:\n${diffStat}\n\nDangerous changes detected: ${dangerCount}\n\nProvide:\n1. Summary of what changed\n2. Risk assessment\n3. Specific concerns\n4. Recommended actions`;\n}\n","import chalk from 'chalk';\nimport { logger } from '../utils/logger.js';\nimport type { ScanResult } from '../core/repoScanner.js';\nimport type { FrameworkInfo } from '../core/frameworkDetector.js';\nimport type { ArchitectureResult } from '../core/architectureAnalyzer.js';\nimport type { RiskReport } from '../core/riskDetector.js';\nimport type { GitDiffResult } from '../core/gitDiff.js';\nimport type { FileCategory } from '../core/fileClassifier.js';\n\n/**\n * Terminal reporter — beautiful CLI output with icons and colors.\n */\n\nexport function reportBrand(): void {\n logger.brand();\n}\n\nexport function reportSummary(scan: ScanResult, fw: FrameworkInfo): void {\n logger.section('✨', 'Project Summary');\n logger.kv('Directory', scan.cwd);\n logger.kv('Framework', `${fw.framework} ${fw.version ? `(${fw.version})` : ''}`);\n logger.kv('Language', fw.language);\n logger.kv('Package Manager', fw.packageManager);\n logger.kv('Total Files', String(scan.totalFiles));\n logger.kv('Est. Lines of Code', String(scan.estimatedLinesOfCode.toLocaleString()));\n logger.kv('Languages', scan.languages.join(', ') || 'N/A');\n\n if (fw.additionalFrameworks.length > 0) {\n logger.kv('Libraries', fw.additionalFrameworks.join(', '));\n }\n\n const features: string[] = [];\n if (scan.hasGit) features.push('Git');\n if (scan.hasDocker) features.push('Docker');\n if (scan.hasCiCd) features.push('CI/CD');\n if (scan.hasTests) features.push('Tests');\n if (scan.hasReadme) features.push('README');\n logger.kv('Features', features.join(', ') || 'None detected');\n}\n\nexport function reportFileStats(filesByExt: Record<string, number>): void {\n logger.section('📊', 'File Statistics');\n const sorted = Object.entries(filesByExt)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 15);\n \n for (const [ext, count] of sorted) {\n const bar = chalk.cyan('█'.repeat(Math.min(count, 30)));\n logger.indent(`${ext.padEnd(12)} ${String(count).padStart(4)} ${bar}`);\n }\n}\n\nexport function reportFolderStructure(directories: string[]): void {\n logger.section('📁', 'Folder Structure');\n for (const dir of directories.slice(0, 20)) {\n logger.item(dir);\n }\n}\n\nexport function reportImportantFiles(files: string[]): void {\n logger.section('📌', 'Important Files');\n if (files.length === 0) {\n logger.warn('No important files detected');\n return;\n }\n for (const f of files) {\n logger.item(f);\n }\n}\n\nexport function reportArchitecture(arch: ArchitectureResult): void {\n logger.section('🧠', 'Architecture Overview');\n logger.kv('Style', arch.style);\n logger.blank();\n\n if (arch.layers.length > 0) {\n logger.indent(chalk.bold('Layers:'));\n for (const layer of arch.layers) {\n logger.indent(`${layer.name} (${layer.files} files)`, 2);\n for (const ex of layer.examples) {\n logger.indent(chalk.dim(ex), 3);\n }\n }\n }\n\n if (arch.dataFlow.length > 0) {\n logger.blank();\n logger.indent(chalk.bold('Data Flow:'));\n for (let i = 0; i < arch.dataFlow.length; i++) {\n logger.indent(chalk.cyan(`${i + 1}. ${arch.dataFlow[i]}`), 2);\n }\n }\n}\n\nexport function reportRisks(report: RiskReport): void {\n logger.section('⚠️', 'Risk Analysis');\n logger.indent(\n `${chalk.red.bold(String(report.summary.high))} high ` +\n `${chalk.yellow(String(report.summary.medium))} medium ` +\n `${chalk.green(String(report.summary.low))} low`\n );\n logger.blank();\n\n if (report.risks.length === 0) {\n logger.success('No significant risks detected');\n return;\n }\n\n const byCategory = new Map<string, typeof report.risks>();\n for (const r of report.risks) {\n const list = byCategory.get(r.category) || [];\n list.push(r);\n byCategory.set(r.category, list);\n }\n\n for (const [cat, risks] of byCategory) {\n logger.indent(chalk.bold(cat.charAt(0).toUpperCase() + cat.slice(1) + ':'));\n for (const r of risks) {\n logger.risk(r.level, `${r.message}${r.file ? chalk.dim(` — ${r.file}`) : ''}`);\n }\n logger.blank();\n }\n}\n\nexport function reportWeakPoints(points: string[]): void {\n if (points.length === 0) return;\n logger.section('🔍', 'Weak Points');\n for (const p of points) {\n logger.warn(p);\n }\n}\n\nexport function reportSuggestions(suggestions: string[]): void {\n if (suggestions.length === 0) return;\n logger.section('🚀', 'Recommended Next Steps');\n for (const s of suggestions) {\n logger.success(s);\n }\n}\n\nexport function reportReview(diff: GitDiffResult): void {\n logger.section('📝', 'Code Review');\n\n if (!diff.isGitRepo) {\n logger.warn('Not a git repository — cannot review changes');\n return;\n }\n\n if (diff.changedFiles.length === 0) {\n logger.success('No uncommitted changes');\n return;\n }\n\n logger.kv('Changed Files', String(diff.changedFiles.length));\n logger.blank();\n\n logger.indent(chalk.bold('Changed Files:'));\n for (const f of diff.changedFiles) {\n const isDangerous = diff.dangerousChanges.some(d => d.file === f);\n logger.indent(isDangerous ? chalk.red(`! ${f}`) : chalk.dim(` ${f}`), 2);\n }\n\n if (diff.dangerousChanges.length > 0) {\n logger.blank();\n logger.indent(chalk.bold.red('⚠ High Risk Changes:'));\n for (const d of diff.dangerousChanges) {\n logger.risk('high', `${d.message} — ${d.file}`);\n }\n }\n\n if (diff.diffStat) {\n logger.blank();\n logger.indent(chalk.bold('Diff Stats:'));\n logger.indent(chalk.dim(diff.diffStat), 2);\n }\n}\n\nexport function reportModules(byCategory: Record<FileCategory, string[]>): void {\n logger.section('📦', 'Main Modules');\n const display: [string, FileCategory][] = [\n ['Commands', 'command'], ['Controllers', 'controller'], ['Services', 'service'],\n ['Models', 'model'], ['Routes', 'route'], ['Views/Pages', 'view'],\n ['Components', 'component'], ['Middleware', 'middleware'], ['Tests', 'test'],\n ['Utilities', 'util'],\n ];\n\n for (const [label, cat] of display) {\n const files = byCategory[cat];\n if (files.length > 0) {\n logger.indent(`${chalk.bold(label)} (${files.length})`);\n for (const f of files.slice(0, 5)) {\n logger.indent(chalk.dim(f), 2);\n }\n if (files.length > 5) {\n logger.indent(chalk.dim(`... and ${files.length - 5} more`), 2);\n }\n }\n }\n}\n\nexport function reportAiEnhancement(text: string | null): void {\n if (!text) return;\n logger.section('🤖', 'AI Analysis');\n for (const line of text.split('\\n')) {\n logger.indent(line);\n }\n}\n\nexport function reportOnboarding(\n scan: ScanResult, fw: FrameworkInfo, arch: ArchitectureResult,\n byCategory: Record<FileCategory, string[]>\n): void {\n logger.section('👋', 'Welcome to this Project');\n logger.blank();\n\n logger.indent(chalk.bold('What is this project?'));\n logger.indent(`A ${fw.framework} (${fw.language}) project with ${scan.totalFiles} files.`, 2);\n if (fw.additionalFrameworks.length > 0) {\n logger.indent(`Uses: ${fw.additionalFrameworks.join(', ')}`, 2);\n }\n logger.blank();\n\n logger.indent(chalk.bold('Where to start:'));\n for (const f of scan.importantFiles.slice(0, 5)) {\n logger.indent(chalk.cyan(f), 2);\n }\n logger.blank();\n\n logger.indent(chalk.bold('Architecture:'));\n logger.indent(arch.style, 2);\n logger.blank();\n\n if (arch.dataFlow.length > 0) {\n logger.indent(chalk.bold('Main data flow:'));\n for (const step of arch.dataFlow) {\n logger.indent(` ${step}`, 2);\n }\n logger.blank();\n }\n\n logger.indent(chalk.bold('Things to be careful with:'));\n for (const wp of arch.weakPoints.slice(0, 5)) {\n logger.warn(wp);\n }\n logger.blank();\n\n logger.indent(chalk.bold('Recommended learning path:'));\n const order = ['config', 'command', 'model', 'route', 'controller', 'service', 'component', 'view', 'util', 'test'];\n let step = 1;\n for (const cat of order) {\n const files = byCategory[cat as FileCategory];\n if (files && files.length > 0) {\n logger.indent(`${step}. Explore ${cat} files (${files.length} files)`, 2);\n step++;\n }\n }\n}\n","import chalk from 'chalk';\n\n/**\n * Consistent logging utilities with colored output.\n */\nexport const logger = {\n /** Section header with icon */\n section(icon: string, title: string): void {\n console.log('');\n console.log(chalk.bold(`${icon} ${title}`));\n console.log(chalk.dim('─'.repeat(50)));\n },\n\n /** Success message */\n success(message: string): void {\n console.log(chalk.green(` ✓ ${message}`));\n },\n\n /** Warning message */\n warn(message: string): void {\n console.log(chalk.yellow(` ⚠ ${message}`));\n },\n\n /** Error message */\n error(message: string): void {\n console.log(chalk.red(` ✗ ${message}`));\n },\n\n /** Info message */\n info(message: string): void {\n console.log(chalk.blue(` ℹ ${message}`));\n },\n\n /** Key-value pair */\n kv(key: string, value: string): void {\n console.log(` ${chalk.dim(key + ':')} ${value}`);\n },\n\n /** List item */\n item(text: string): void {\n console.log(` ${chalk.dim('•')} ${text}`);\n },\n\n /** Indented text */\n indent(text: string, level: number = 1): void {\n console.log(' '.repeat(level) + text);\n },\n\n /** Blank line */\n blank(): void {\n console.log('');\n },\n\n /** Branded header */\n brand(): void {\n console.log('');\n console.log(chalk.bold.cyan(' 🔍 RepoLens AI') + chalk.dim(' v2.0'));\n console.log(chalk.dim(' The AI Context Intelligence Platform'));\n console.log(chalk.dim(' Your AI agents are only as good as the context you give them.'));\n console.log(chalk.dim('─'.repeat(58)));\n },\n\n /** Risk level colored */\n risk(level: 'high' | 'medium' | 'low', message: string): void {\n const colors = {\n high: chalk.red.bold,\n medium: chalk.yellow,\n low: chalk.green,\n };\n const icons = { high: '🔴', medium: '🟡', low: '🟢' };\n console.log(` ${icons[level]} ${colors[level](message)}`);\n },\n\n /** Table-like row */\n row(cols: string[], widths: number[]): void {\n const formatted = cols.map((col, i) => col.padEnd(widths[i] || 20)).join(' ');\n console.log(` ${formatted}`);\n },\n};\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { ScanResult } from '../core/repoScanner.js';\nimport type { FrameworkInfo } from '../core/frameworkDetector.js';\nimport type { ArchitectureResult } from '../core/architectureAnalyzer.js';\nimport type { RiskReport } from '../core/riskDetector.js';\nimport type { GitDiffResult } from '../core/gitDiff.js';\nimport type { FileCategory } from '../core/fileClassifier.js';\n\n/**\n * Generate a markdown report file.\n */\nexport function generateMarkdownReport(options: {\n scan: ScanResult;\n framework: FrameworkInfo;\n architecture: ArchitectureResult;\n risks: RiskReport;\n byCategory: Record<FileCategory, string[]>;\n diff?: GitDiffResult;\n aiText?: string | null;\n outputPath?: string;\n}): string {\n const { scan, framework, architecture, risks, byCategory, diff, aiText } = options;\n const lines: string[] = [];\n\n lines.push('# 🔍 RepoLens AI Report');\n lines.push('');\n lines.push(`> Generated on ${new Date().toISOString()}`);\n lines.push('');\n\n // Summary\n lines.push('## ✨ Project Summary');\n lines.push('');\n lines.push(`| Property | Value |`);\n lines.push(`|---|---|`);\n lines.push(`| Framework | ${framework.framework} ${framework.version || ''} |`);\n lines.push(`| Language | ${framework.language} |`);\n lines.push(`| Package Manager | ${framework.packageManager} |`);\n lines.push(`| Total Files | ${scan.totalFiles} |`);\n lines.push(`| Est. Lines of Code | ${scan.estimatedLinesOfCode.toLocaleString()} |`);\n lines.push(`| Languages | ${scan.languages.join(', ')} |`);\n if (framework.additionalFrameworks.length > 0) {\n lines.push(`| Libraries | ${framework.additionalFrameworks.join(', ')} |`);\n }\n lines.push('');\n\n // Architecture\n lines.push('## 🧠 Architecture');\n lines.push('');\n lines.push(`**Style:** ${architecture.style}`);\n lines.push('');\n if (architecture.layers.length > 0) {\n lines.push('### Layers');\n for (const l of architecture.layers) {\n lines.push(`- **${l.name}** (${l.files} files): ${l.examples.slice(0, 3).join(', ')}`);\n }\n lines.push('');\n }\n if (architecture.dataFlow.length > 0) {\n lines.push(`**Data Flow:** ${architecture.dataFlow.join(' → ')}`);\n lines.push('');\n }\n\n // Risks\n lines.push('## ⚠️ Risk Analysis');\n lines.push('');\n lines.push(`🔴 ${risks.summary.high} high | 🟡 ${risks.summary.medium} medium | 🟢 ${risks.summary.low} low`);\n lines.push('');\n if (risks.risks.length > 0) {\n lines.push('| Level | Category | Issue | File |');\n lines.push('|---|---|---|---|');\n for (const r of risks.risks) {\n const icon = r.level === 'high' ? '🔴' : r.level === 'medium' ? '🟡' : '🟢';\n lines.push(`| ${icon} ${r.level} | ${r.category} | ${r.message} | ${r.file || '-'} |`);\n }\n lines.push('');\n }\n\n // Modules\n lines.push('## 📦 Main Modules');\n lines.push('');\n const cats: [string, FileCategory][] = [\n ['Controllers', 'controller'], ['Services', 'service'], ['Models', 'model'],\n ['Routes', 'route'], ['Components', 'component'], ['Tests', 'test'],\n ];\n for (const [label, cat] of cats) {\n const files = byCategory[cat];\n if (files.length > 0) {\n lines.push(`### ${label} (${files.length})`);\n for (const f of files.slice(0, 10)) lines.push(`- ${f}`);\n lines.push('');\n }\n }\n\n // Suggestions\n if (architecture.suggestions.length > 0) {\n lines.push('## 🚀 Recommended Next Steps');\n lines.push('');\n for (const s of architecture.suggestions) lines.push(`- [ ] ${s}`);\n lines.push('');\n }\n\n // AI\n if (aiText) {\n lines.push('## 🤖 AI Analysis');\n lines.push('');\n lines.push(aiText);\n lines.push('');\n }\n\n lines.push('---');\n lines.push('*Generated by [RepoLens AI](https://github.com/repolens/repolens-ai)*');\n\n const content = lines.join('\\n');\n\n // Write to file if path specified\n const outputPath = options.outputPath || path.join(process.cwd(), 'repolens-report.md');\n fs.writeFileSync(outputPath, content, 'utf-8');\n\n return outputPath;\n}\n","import ora from 'ora';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { analyzeArchitecture } from '../core/architectureAnalyzer.js';\nimport { reportBrand, reportArchitecture, reportWeakPoints, reportSuggestions } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport { isAiAvailable, enhance } from '../ai/aiClient.js';\nimport { getSystemPrompt } from '../ai/promptBuilder.js';\nimport chalk from 'chalk';\n\nexport async function architectureCommand(options: { ai?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Analyzing architecture...').start();\n\n try {\n const scan = await scanRepository(cwd);\n const framework = detectFramework(cwd);\n const { byCategory } = classifyFiles(scan.fileTree);\n const arch = analyzeArchitecture(byCategory, framework.framework);\n spinner.succeed('Architecture analysis complete');\n\n // Report\n reportArchitecture(arch);\n\n // Dependencies\n logger.section('📦', 'Important Dependencies');\n if (framework.additionalFrameworks.length > 0) {\n for (const lib of framework.additionalFrameworks) {\n logger.item(lib);\n }\n } else {\n logger.info('No significant dependencies detected beyond the core framework');\n }\n\n // Data flow detail\n if (arch.dataFlow.length > 0) {\n logger.section('🔄', 'Data Flow');\n for (let i = 0; i < arch.dataFlow.length; i++) {\n logger.indent(`${i + 1}. ${arch.dataFlow[i]}`);\n }\n }\n\n reportWeakPoints(arch.weakPoints);\n reportSuggestions(arch.suggestions);\n\n // AI enhancement\n if (options.ai !== false && isAiAvailable()) {\n const aiSpinner = ora('Getting AI architecture insights...').start();\n const aiText = await enhance(\n getSystemPrompt(),\n `Explain this ${framework.framework} project's architecture in detail.\\n\\nArchitecture style: ${arch.style}\\nLayers: ${arch.layers.map(l => l.name).join(', ')}\\nData flow: ${arch.dataFlow.join(' → ')}\\nWeak points: ${arch.weakPoints.join('; ')}\\n\\nProvide a senior engineer assessment of this architecture.`,\n );\n if (aiText) {\n aiSpinner.succeed('AI insights ready');\n logger.section('🤖', 'AI Architecture Assessment');\n for (const line of aiText.split('\\n')) {\n logger.indent(line);\n }\n } else {\n aiSpinner.info('AI not available');\n }\n }\n } catch (error) {\n spinner.fail('Architecture analysis failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { readCodeContents, findRelatedByContent } from '../core/contentReader.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport { isAiAvailable, enhance } from '../ai/aiClient.js';\nimport { getSystemPrompt, buildExplainPrompt } from '../ai/promptBuilder.js';\nimport chalk from 'chalk';\n\nexport async function explainCommand(topic: string, options: { ai?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora(`Searching for \"${topic}\" in codebase...`).start();\n\n try {\n const scan = await scanRepository(cwd);\n const framework = detectFramework(cwd);\n const { classified } = classifyFiles(scan.fileTree);\n\n // NEW v2.0: Read actual file contents for deeper search\n spinner.text = `Reading code contents for \"${topic}\"...`;\n const codeContents = await readCodeContents(cwd);\n const contentMatches = findRelatedByContent(codeContents, topic);\n\n // Also keep legacy filename matching as fallback\n const topicLower = topic.toLowerCase();\n const fileNameMatches = classified.filter((f) => {\n const pathLower = f.path.toLowerCase();\n return pathLower.includes(topicLower);\n });\n\n // Expand with common aliases\n const aliases: Record<string, string[]> = {\n auth: ['auth', 'login', 'register', 'session', 'token', 'jwt', 'oauth', 'passport'],\n payment: ['payment', 'stripe', 'billing', 'invoice', 'checkout', 'subscription'],\n user: ['user', 'profile', 'account', 'member'],\n api: ['api', 'endpoint', 'route', 'controller', 'handler'],\n database: ['database', 'db', 'migration', 'schema', 'model', 'prisma', 'sequelize'],\n email: ['email', 'mail', 'notification', 'smtp'],\n upload: ['upload', 'file', 'storage', 'media', 's3'],\n cache: ['cache', 'redis', 'memcached'],\n queue: ['queue', 'job', 'worker', 'bull'],\n search: ['search', 'elastic', 'algolia', 'index'],\n context: ['context', 'agent', 'claude', 'cursor', 'copilot', 'skill'],\n score: ['score', 'lint', 'quality', 'grade'],\n sync: ['sync', 'syncer', 'convert'],\n };\n\n const expandedTerms = aliases[topicLower] || [topicLower];\n const expandedFiles = classified.filter((f) => {\n const pathLower = f.path.toLowerCase();\n return expandedTerms.some((term) => pathLower.includes(term));\n });\n\n // Merge all matches (content-based first, then filename)\n const allRelatedPaths = new Set<string>();\n const allRelated: typeof fileNameMatches = [];\n\n // Content matches are higher priority\n for (const cm of contentMatches) {\n if (!allRelatedPaths.has(cm.path)) {\n allRelatedPaths.add(cm.path);\n const classifiedMatch = classified.find((f) => f.path === cm.path);\n if (classifiedMatch) allRelated.push(classifiedMatch);\n else allRelated.push({ path: cm.path, category: 'unknown' });\n }\n }\n\n // Then filename matches\n for (const fm of [...fileNameMatches, ...expandedFiles]) {\n if (!allRelatedPaths.has(fm.path)) {\n allRelatedPaths.add(fm.path);\n allRelated.push(fm);\n }\n }\n\n spinner.succeed(`Found ${allRelated.length} related file(s) (${contentMatches.length} by content, ${fileNameMatches.length} by name)`);\n\n if (allRelated.length === 0) {\n logger.warn(`No files found related to \"${topic}\"`);\n logger.info('Try a different topic or check the folder structure with: repolens analyze');\n return;\n }\n\n // Report findings\n logger.section('🔍', `Explaining: ${topic}`);\n\n // NEW v2.0: Show functions and classes found by content reader\n const matchedContents = contentMatches.slice(0, 10);\n if (matchedContents.length > 0) {\n logger.blank();\n logger.indent(chalk.bold('📦 Related Functions & Classes:'));\n for (const mc of matchedContents) {\n const relFunctions = mc.functions.filter((fn) =>\n fn.toLowerCase().includes(topicLower)\n );\n const relClasses = mc.classes.filter((cls) =>\n cls.toLowerCase().includes(topicLower)\n );\n\n if (relFunctions.length > 0 || relClasses.length > 0) {\n logger.indent(chalk.cyan(mc.path), 2);\n for (const fn of relFunctions) {\n logger.indent(chalk.dim(` ƒ ${fn}()`), 3);\n }\n for (const cls of relClasses) {\n logger.indent(chalk.dim(` ◆ class ${cls}`), 3);\n }\n }\n }\n }\n\n logger.blank();\n logger.indent(chalk.bold('What this feature likely does:'));\n const categoryBreakdown = new Map<string, string[]>();\n for (const f of allRelated) {\n const list = categoryBreakdown.get(f.category) || [];\n list.push(f.path);\n categoryBreakdown.set(f.category, list);\n }\n\n // Infer purpose from file categories\n const hasCtrls = categoryBreakdown.has('controller') || categoryBreakdown.has('route');\n const hasSvc = categoryBreakdown.has('service');\n const hasModel = categoryBreakdown.has('model');\n const hasView = categoryBreakdown.has('view') || categoryBreakdown.has('component');\n const hasTest = categoryBreakdown.has('test');\n const hasCmd = categoryBreakdown.has('command');\n\n if (hasCmd && hasSvc) {\n logger.indent(`This is a CLI ${topic} feature with command handlers and core services.`, 2);\n } else if (hasCtrls && hasSvc && hasModel) {\n logger.indent(`This appears to be a full-stack ${topic} feature with API endpoints, business logic, and data models.`, 2);\n } else if (hasCtrls && hasModel) {\n logger.indent(`This is a ${topic} module with HTTP handling and database operations.`, 2);\n } else if (hasView) {\n logger.indent(`This is a ${topic} UI module with frontend components.`, 2);\n } else {\n logger.indent(`This contains ${topic}-related files across ${categoryBreakdown.size} layer(s).`, 2);\n }\n\n // Important files\n logger.blank();\n logger.indent(chalk.bold('Important Files:'));\n for (const f of allRelated.slice(0, 15)) {\n const icon = f.category === 'controller' ? '🎯' : f.category === 'service' ? '⚙️' :\n f.category === 'model' ? '📊' : f.category === 'test' ? '🧪' :\n f.category === 'command' ? '🖥️' :\n f.category === 'view' || f.category === 'component' ? '🖼️' : '📄';\n logger.indent(`${icon} ${chalk.cyan(f.path)} ${chalk.dim(`(${f.category})`)}`, 2);\n }\n if (allRelated.length > 15) {\n logger.indent(chalk.dim(`... and ${allRelated.length - 15} more files`), 2);\n }\n\n // Flow explanation\n logger.blank();\n logger.indent(chalk.bold('Flow:'));\n const flowParts: string[] = [];\n if (categoryBreakdown.has('route')) flowParts.push('Routes');\n if (categoryBreakdown.has('middleware')) flowParts.push('Middleware');\n if (categoryBreakdown.has('controller')) flowParts.push('Controllers');\n if (categoryBreakdown.has('command')) flowParts.push('Commands');\n if (categoryBreakdown.has('service')) flowParts.push('Services');\n if (categoryBreakdown.has('model')) flowParts.push('Models');\n if (categoryBreakdown.has('view') || categoryBreakdown.has('component')) flowParts.push('UI');\n if (flowParts.length > 0) {\n logger.indent(chalk.cyan(flowParts.join(' → ')), 2);\n } else {\n logger.indent('Unable to determine flow — files may not follow standard patterns', 2);\n }\n\n // Risks\n logger.blank();\n logger.indent(chalk.bold('Potential Risks:'));\n if (!hasTest) logger.warn(`No tests found for ${topic}`);\n if (!hasSvc && hasCtrls) logger.warn('Business logic may be coupled to HTTP layer (no service layer)');\n if (allRelated.length > 20) logger.warn(`Large module (${allRelated.length} files) — may need decomposition`);\n if (allRelated.length <= 2) logger.info('Small module — relatively easy to maintain');\n\n // TODOs in related files\n const relatedTodos = contentMatches.flatMap((mc) => mc.todoFixmes.map((t) => ({ file: mc.path, ...t })));\n if (relatedTodos.length > 0) {\n logger.blank();\n logger.indent(chalk.bold('TODOs in related files:'));\n for (const todo of relatedTodos.slice(0, 5)) {\n logger.indent(chalk.yellow(` 📝 ${todo.text}`) + chalk.dim(` — ${todo.file}:${todo.line}`), 1);\n }\n }\n\n // AI enhancement\n if (options.ai !== false && isAiAvailable()) {\n const aiSpinner = ora('Getting AI explanation...').start();\n const aiText = await enhance(\n getSystemPrompt(),\n buildExplainPrompt(topic, allRelated.map(f => f.path), framework.framework),\n );\n if (aiText) {\n aiSpinner.succeed('AI explanation ready');\n logger.section('🤖', 'AI Explanation');\n for (const line of aiText.split('\\n')) logger.indent(line);\n } else {\n aiSpinner.info('AI not available');\n }\n }\n } catch (error) {\n spinner.fail('Explain failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport { analyzeGitDiff } from '../core/gitDiff.js';\nimport { reportBrand, reportReview } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport { isAiAvailable, enhance } from '../ai/aiClient.js';\nimport { getSystemPrompt, buildReviewPrompt } from '../ai/promptBuilder.js';\nimport chalk from 'chalk';\n\nexport async function reviewCommand(options: { ai?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Analyzing git changes...').start();\n\n try {\n const diff = analyzeGitDiff(cwd);\n spinner.succeed('Git analysis complete');\n\n reportReview(diff);\n\n if (!diff.isGitRepo || diff.changedFiles.length === 0) return;\n\n // Categorize changes\n const safeChanges = diff.changedFiles.filter(\n (f) => !diff.dangerousChanges.some((d) => d.file === f)\n );\n\n if (safeChanges.length > 0) {\n logger.section('✅', 'Safe Changes');\n for (const f of safeChanges) {\n logger.success(f);\n }\n }\n\n // Suggested fix plan\n if (diff.dangerousChanges.length > 0) {\n logger.section('🔧', 'Suggested Fix Plan');\n let step = 1;\n for (const d of diff.dangerousChanges) {\n logger.indent(`${step}. Review ${chalk.bold(d.file)} — ${d.message}`);\n step++;\n }\n logger.indent(`${step}. Run tests after addressing the above`);\n }\n\n // AI enhancement\n if (options.ai !== false && isAiAvailable() && diff.changedFiles.length > 0) {\n const aiSpinner = ora('Getting AI review...').start();\n const aiText = await enhance(\n getSystemPrompt(),\n buildReviewPrompt(\n diff.changedFiles,\n diff.diffStat,\n diff.dangerousChanges.length,\n ),\n );\n if (aiText) {\n aiSpinner.succeed('AI review complete');\n logger.section('🤖', 'AI Code Review');\n for (const line of aiText.split('\\n')) logger.indent(line);\n } else {\n aiSpinner.info('AI not available');\n }\n }\n } catch (error) {\n spinner.fail('Review failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import { execSync } from 'node:child_process';\nimport { maskSecrets } from '../utils/masks.js';\n\nexport interface GitDiffResult {\n isGitRepo: boolean;\n changedFiles: string[];\n diffStat: string;\n fullDiff: string;\n dangerousChanges: DangerousChange[];\n summary: string;\n}\n\nexport interface DangerousChange {\n level: 'high' | 'medium';\n message: string;\n file: string;\n}\n\nconst DANGEROUS_FILE_PATTERNS = [\n { pattern: /auth/i, message: 'Auth-related file modified' },\n { pattern: /middleware/i, message: 'Middleware file modified' },\n { pattern: /\\.env/i, message: 'Environment file modified' },\n { pattern: /security/i, message: 'Security-related file modified' },\n { pattern: /secret/i, message: 'Secret-related file modified' },\n { pattern: /migration/i, message: 'Database migration modified' },\n { pattern: /password/i, message: 'Password-related file modified' },\n];\n\n/**\n * Analyze git diff for recent changes.\n */\nexport function analyzeGitDiff(cwd: string): GitDiffResult {\n const result: GitDiffResult = {\n isGitRepo: false,\n changedFiles: [],\n diffStat: '',\n fullDiff: '',\n dangerousChanges: [],\n summary: '',\n };\n\n try {\n // Check if git repo\n execSync('git rev-parse --is-inside-work-tree', { cwd, stdio: 'pipe' });\n result.isGitRepo = true;\n } catch {\n result.summary = 'Not a git repository';\n return result;\n }\n\n try {\n // Get changed files (staged + unstaged)\n const namesOutput = execSync('git diff --name-only HEAD 2>nul || git diff --name-only', {\n cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n result.changedFiles = namesOutput ? namesOutput.split('\\n').filter(Boolean) : [];\n\n // Also check staged\n const stagedOutput = execSync('git diff --cached --name-only', {\n cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n const stagedFiles = stagedOutput ? stagedOutput.split('\\n').filter(Boolean) : [];\n result.changedFiles = [...new Set([...result.changedFiles, ...stagedFiles])];\n\n if (result.changedFiles.length === 0) {\n result.summary = 'No uncommitted changes detected';\n return result;\n }\n\n // Get diff stat\n try {\n result.diffStat = maskSecrets(\n execSync('git diff --stat HEAD 2>nul || git diff --stat', {\n cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],\n }).trim()\n );\n } catch { /* stat not critical */ }\n\n // Get full diff (limited to 50KB)\n try {\n const rawDiff = execSync('git diff HEAD 2>nul || git diff', {\n cwd, encoding: 'utf-8', maxBuffer: 1024 * 1024, stdio: ['pipe', 'pipe', 'pipe'],\n });\n result.fullDiff = maskSecrets(rawDiff.substring(0, 50_000));\n } catch { /* diff not critical */ }\n\n // Detect dangerous changes\n for (const file of result.changedFiles) {\n for (const { pattern, message } of DANGEROUS_FILE_PATTERNS) {\n if (pattern.test(file)) {\n result.dangerousChanges.push({ level: 'high', message, file });\n }\n }\n }\n\n // Check for deleted test files\n try {\n const deletedOutput = execSync('git diff --diff-filter=D --name-only HEAD 2>nul || git diff --diff-filter=D --name-only', {\n cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n const deleted = deletedOutput ? deletedOutput.split('\\n').filter(Boolean) : [];\n for (const f of deleted) {\n if (/\\.(test|spec)\\./i.test(f)) {\n result.dangerousChanges.push({ level: 'high', message: 'Test file deleted', file: f });\n }\n }\n } catch { /* not critical */ }\n\n // Check diff content for dangerous patterns\n if (result.fullDiff) {\n if (/^\\+.*\\beval\\s*\\(/m.test(result.fullDiff)) {\n result.dangerousChanges.push({ level: 'high', message: 'eval() added in changes', file: '(in diff)' });\n }\n if (/^\\-.*middleware/im.test(result.fullDiff)) {\n result.dangerousChanges.push({ level: 'high', message: 'Middleware possibly removed', file: '(in diff)' });\n }\n }\n\n result.summary = `${result.changedFiles.length} file(s) changed, ${result.dangerousChanges.length} potential risk(s)`;\n } catch {\n result.summary = 'Unable to read git diff';\n }\n\n return result;\n}\n","/**\n * Secret masking utilities.\n * Ensures no API keys, tokens, or passwords are exposed in output.\n */\n\nconst SECRET_PATTERNS: RegExp[] = [\n // API keys & tokens\n /(?:api[_-]?key|apikey|secret[_-]?key|access[_-]?token|auth[_-]?token|bearer)\\s*[:=]\\s*[\"']?([a-zA-Z0-9_\\-]{8,})[\"']?/gi,\n // OpenAI keys\n /sk-[a-zA-Z0-9]{20,}/g,\n // AWS keys\n /AKIA[0-9A-Z]{16}/g,\n // Generic long hex/base64 secrets\n /(?:password|passwd|pwd|secret|token)\\s*[:=]\\s*[\"']?([^\\s\"']{8,})[\"']?/gi,\n // Connection strings\n /(?:mongodb|postgres|mysql|redis):\\/\\/[^\\s\"']+/gi,\n // .env style KEY=VALUE with sensitive names\n /(?:DATABASE_URL|OPENAI_API_KEY|STRIPE_SECRET|AWS_SECRET_ACCESS_KEY|JWT_SECRET|SESSION_SECRET)\\s*=\\s*(.+)/gi,\n];\n\n/**\n * Mask sensitive values in a string.\n * Replaces detected secrets with [MASKED].\n */\nexport function maskSecrets(text: string): string {\n let masked = text;\n for (const pattern of SECRET_PATTERNS) {\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n masked = masked.replace(pattern, (match) => {\n // Keep the key name, mask the value\n const eqIndex = match.indexOf('=');\n const colonIndex = match.indexOf(':');\n const sepIndex = eqIndex >= 0 ? eqIndex : colonIndex;\n\n if (sepIndex >= 0 && sepIndex < match.length - 1) {\n return match.substring(0, sepIndex + 1) + ' [MASKED]';\n }\n return '[MASKED]';\n });\n }\n return masked;\n}\n\n/**\n * Check if a string likely contains a secret value.\n */\nexport function containsSecret(text: string): boolean {\n for (const pattern of SECRET_PATTERNS) {\n pattern.lastIndex = 0;\n if (pattern.test(text)) return true;\n }\n return false;\n}\n\n/**\n * Mask a value, showing only first 4 chars.\n */\nexport function partialMask(value: string): string {\n if (value.length <= 4) return '****';\n return value.substring(0, 4) + '****' + value.substring(value.length - 2);\n}\n","import ora from 'ora';\nimport { detectRisks } from '../core/riskDetector.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\nexport async function risksCommand(): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Scanning for risks...').start();\n\n try {\n const report = await detectRisks(cwd);\n const total = report.risks.length;\n spinner.succeed(`Risk scan complete — found ${total} issue(s)`);\n\n // Report risks\n logger.section('⚠️', 'Risk Analysis');\n logger.indent(\n `${chalk.red.bold(String(report.summary.high))} high ` +\n `${chalk.yellow(String(report.summary.medium))} medium ` +\n `${chalk.green(String(report.summary.low))} low`\n );\n logger.blank();\n\n if (report.risks.length === 0) {\n logger.success('No significant risks detected');\n return;\n }\n\n const byCategory = new Map<string, typeof report.risks>();\n for (const r of report.risks) {\n const list = byCategory.get(r.category) || [];\n list.push(r);\n byCategory.set(r.category, list);\n }\n\n for (const [cat, risks] of byCategory) {\n logger.indent(chalk.bold(cat.charAt(0).toUpperCase() + cat.slice(1) + ':'));\n for (const r of risks) {\n logger.risk(r.level, `${r.message}${r.file ? chalk.dim(` — ${r.file}`) : ''}`);\n }\n logger.blank();\n }\n\n // Priority fixes\n logger.section('🎯', 'Priority Fixes');\n const highRisks = report.risks.filter((r) => r.level === 'high');\n const medRisks = report.risks.filter((r) => r.level === 'medium');\n\n if (highRisks.length > 0) {\n logger.indent(chalk.red.bold('Immediate (High Priority):'));\n for (const r of highRisks) {\n logger.indent(` • ${r.message}${r.file ? chalk.dim(` — ${r.file}`) : ''}`, 1);\n }\n logger.blank();\n }\n\n if (medRisks.length > 0) {\n logger.indent(chalk.yellow('Soon (Medium Priority):'));\n for (const r of medRisks) {\n logger.indent(` • ${r.message}${r.file ? chalk.dim(` — ${r.file}`) : ''}`, 1);\n }\n }\n\n } catch (error) {\n spinner.fail('Risk scan failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { analyzeArchitecture } from '../core/architectureAnalyzer.js';\nimport { reportBrand, reportOnboarding } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\n\nexport async function onboardingCommand(): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Generating onboarding guide...').start();\n\n try {\n const scan = await scanRepository(cwd);\n const framework = detectFramework(cwd);\n const { byCategory } = classifyFiles(scan.fileTree);\n const arch = analyzeArchitecture(byCategory, framework.framework);\n spinner.succeed('Onboarding guide ready');\n\n reportOnboarding(scan, framework, arch, byCategory);\n } catch (error) {\n spinner.fail('Onboarding generation failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { analyzeArchitecture } from '../core/architectureAnalyzer.js';\nimport { generateAgentsContent } from '../templates/agentsTemplate.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\n\nexport async function generateAgentsCommand(): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Generating AGENTS.md...').start();\n\n try {\n const scan = await scanRepository(cwd);\n const framework = detectFramework(cwd);\n const { byCategory } = classifyFiles(scan.fileTree);\n const arch = analyzeArchitecture(byCategory, framework.framework);\n\n const content = generateAgentsContent(scan, framework, arch, byCategory);\n const outputPath = path.join(cwd, 'AGENTS.md');\n\n // Check if file already exists\n if (fs.existsSync(outputPath)) {\n const backupPath = outputPath + '.backup';\n fs.copyFileSync(outputPath, backupPath);\n logger.info(`Existing AGENTS.md backed up to AGENTS.md.backup`);\n }\n\n fs.writeFileSync(outputPath, content, 'utf-8');\n spinner.succeed('AGENTS.md generated successfully');\n\n logger.blank();\n logger.success(`Created: ${outputPath}`);\n logger.info('This file instructs AI coding agents on how to work with your project.');\n logger.info('Commit it to your repo so tools like Codex, Claude, and Cursor can use it.');\n } catch (error) {\n spinner.fail('AGENTS.md generation failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import type { ScanResult } from '../core/repoScanner.js';\nimport type { FrameworkInfo } from '../core/frameworkDetector.js';\nimport type { ArchitectureResult } from '../core/architectureAnalyzer.js';\nimport type { FileCategory } from '../core/fileClassifier.js';\n\n/**\n * Generate AGENTS.md content from scanned project data.\n */\nexport function generateAgentsContent(\n scan: ScanResult,\n fw: FrameworkInfo,\n arch: ArchitectureResult,\n byCategory: Record<FileCategory, string[]>,\n): string {\n const sections: string[] = [];\n\n sections.push('# AGENTS.md');\n sections.push('');\n sections.push('> Instructions for AI coding agents working on this project.');\n sections.push('> Generated by RepoLens AI.');\n sections.push('');\n\n // Project Overview\n sections.push('## Project Overview');\n sections.push('');\n sections.push(`- **Framework:** ${fw.framework} ${fw.version || ''}`);\n sections.push(`- **Language:** ${fw.language}`);\n sections.push(`- **Package Manager:** ${fw.packageManager}`);\n sections.push(`- **Architecture:** ${arch.style}`);\n sections.push(`- **Total Files:** ${scan.totalFiles}`);\n sections.push('');\n\n // Tech Stack\n sections.push('## Tech Stack');\n sections.push('');\n sections.push(`- Primary: ${fw.framework} (${fw.language})`);\n if (fw.additionalFrameworks.length > 0) {\n for (const lib of fw.additionalFrameworks) {\n sections.push(`- ${lib}`);\n }\n }\n sections.push('');\n\n // Folder Structure\n sections.push('## Folder Structure');\n sections.push('');\n sections.push('```');\n for (const dir of scan.directories.slice(0, 20)) {\n sections.push(dir + '/');\n }\n sections.push('```');\n sections.push('');\n\n // Important Files\n sections.push('## Important Files');\n sections.push('');\n for (const f of scan.importantFiles) {\n sections.push(`- \\`${f}\\``);\n }\n sections.push('');\n\n // Coding Rules\n sections.push('## Coding Rules');\n sections.push('');\n sections.push('1. **Analyze before editing** — Understand the existing architecture before making changes.');\n sections.push('2. **Minimal safe changes** — Make the smallest change that solves the problem.');\n sections.push('3. **Preserve architecture** — Follow the existing patterns and conventions.');\n sections.push('4. **No unnecessary rewrites** — Do not rewrite files that work correctly.');\n sections.push(`5. **Follow ${fw.language} conventions** — Use idiomatic ${fw.language} code.`);\n sections.push('6. **Keep files focused** — Each file should have a single responsibility.');\n sections.push('');\n\n // Security Rules\n sections.push('## Security Rules');\n sections.push('');\n sections.push('1. **Never commit secrets** — No API keys, tokens, or passwords in source code.');\n sections.push('2. **Protect .env files** — Never read or expose .env file contents.');\n sections.push('3. **Validate all input** — Never trust user input.');\n sections.push('4. **Use parameterized queries** — Never use raw SQL string concatenation.');\n sections.push('5. **No eval()** — Never use eval, exec, or similar dynamic code execution.');\n sections.push('6. **Preserve auth middleware** — Never remove authentication or authorization checks.');\n sections.push('');\n\n // Testing\n sections.push('## Testing');\n sections.push('');\n if (scan.hasTests) {\n sections.push('This project has tests. Always:');\n sections.push('- Run existing tests before and after changes');\n sections.push('- Add tests for new functionality');\n sections.push('- Never delete existing tests without explanation');\n } else {\n sections.push('This project currently lacks tests. When possible:');\n sections.push('- Add tests for critical business logic');\n sections.push('- Add tests for security-sensitive code');\n }\n sections.push('');\n\n // Workflow\n sections.push('## Workflow Rules');\n sections.push('');\n sections.push('1. Read relevant files before editing');\n sections.push('2. Check for existing patterns before creating new ones');\n sections.push('3. Summarize all changes made');\n sections.push('4. Flag any potential breaking changes');\n sections.push('5. Do not modify configuration files without explicit instruction');\n sections.push('');\n\n // Definition of Done\n sections.push('## Definition of Done');\n sections.push('');\n sections.push('A change is complete when:');\n sections.push('- [ ] Code compiles without errors');\n sections.push('- [ ] Existing tests pass');\n sections.push('- [ ] New tests added for new functionality');\n sections.push('- [ ] No secrets in source code');\n sections.push('- [ ] Changes are minimal and focused');\n sections.push('- [ ] Architecture patterns are preserved');\n sections.push('- [ ] Changes are summarized clearly');\n sections.push('');\n\n return sections.join('\\n');\n}\n","import ora from 'ora';\nimport * as readline from 'node:readline';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { analyzeArchitecture } from '../core/architectureAnalyzer.js';\nimport { readCodeContents, summarizeContents } from '../core/contentReader.js';\nimport { detectBestTemplate } from '../templates/frameworkTemplates.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Interactive AGENTS.md creation through developer interview.\n * Extracts tribal knowledge that AI cannot infer on its own.\n */\n\ninterface InterviewAnswers {\n projectDescription: string;\n keyGotchas: string;\n architectureDecisions: string;\n buildCommands: string;\n testCommands: string;\n deployCommands: string;\n conventions: string;\n knownIssues: string;\n criticalFiles: string;\n doNotTouch: string;\n}\n\nfunction ask(rl: readline.Interface, question: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(chalk.cyan(' ? ') + chalk.bold(question) + '\\n ' + chalk.dim('> '), (answer) => {\n resolve(answer.trim());\n });\n });\n}\n\nexport async function initCommand(options: { yes?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n logger.section('🚀', 'Initialize AI Context');\n logger.blank();\n logger.indent(chalk.dim('This will create a high-quality AGENTS.md by combining'));\n logger.indent(chalk.dim('automated analysis with your tribal knowledge.'));\n logger.blank();\n\n // Step 1: Auto-scan\n const spinner = ora('Analyzing your codebase...').start();\n const scan = await scanRepository(cwd);\n const framework = detectFramework(cwd);\n const { byCategory } = classifyFiles(scan.fileTree);\n const architecture = analyzeArchitecture(byCategory, framework.framework);\n\n spinner.text = 'Reading code contents...';\n const codeContents = await readCodeContents(cwd);\n const contentSummary = summarizeContents(codeContents);\n spinner.succeed('Codebase analysis complete');\n\n // Show what was found\n logger.blank();\n logger.indent(chalk.bold('📊 What we found:'));\n logger.kv('Framework', `${framework.framework} (${framework.language})`);\n logger.kv('Architecture', architecture.style);\n logger.kv('Files', String(scan.totalFiles));\n logger.kv('Functions', String(contentSummary.totalFunctions));\n logger.kv('Classes', String(contentSummary.totalClasses));\n if (framework.additionalFrameworks.length > 0) {\n logger.kv('Libraries', framework.additionalFrameworks.join(', '));\n }\n logger.blank();\n\n let answers: InterviewAnswers;\n\n if (options.yes) {\n // Non-interactive mode — use empty answers\n answers = {\n projectDescription: '', keyGotchas: '', architectureDecisions: '',\n buildCommands: '', testCommands: '', deployCommands: '',\n conventions: '', knownIssues: '', criticalFiles: '', doNotTouch: '',\n };\n } else {\n // Step 2: Interactive interview\n logger.section('💬', 'Knowledge Interview');\n logger.indent(chalk.dim('Answer these questions to create a high-quality context file.'));\n logger.indent(chalk.dim('Press Enter to skip any question.'));\n logger.blank();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n\n answers = {\n projectDescription: await ask(rl, 'What does this project do? (1-2 sentences)'),\n keyGotchas: await ask(rl, 'Any gotchas or pitfalls a developer should know?'),\n architectureDecisions: await ask(rl, 'Key architecture decisions? (why you chose this stack/pattern)'),\n buildCommands: await ask(rl, 'Build command? (e.g., npm run build)'),\n testCommands: await ask(rl, 'Test command? (e.g., npm test)'),\n deployCommands: await ask(rl, 'Deploy command? (e.g., npm run deploy)'),\n conventions: await ask(rl, 'Any naming conventions or code style rules?'),\n knownIssues: await ask(rl, 'Known bugs or workarounds?'),\n criticalFiles: await ask(rl, 'Most important files to understand?'),\n doNotTouch: await ask(rl, 'Files or patterns that should NEVER be modified?'),\n };\n\n rl.close();\n }\n\n // Step 3: Generate smart AGENTS.md\n const spinner2 = ora('Generating AGENTS.md...').start();\n const content = generateSmartAgents(scan, framework, architecture, contentSummary, answers, codeContents);\n\n const outputPath = path.join(cwd, 'AGENTS.md');\n\n // Backup if exists\n if (fs.existsSync(outputPath)) {\n fs.copyFileSync(outputPath, outputPath + '.backup');\n logger.info('Existing AGENTS.md backed up to AGENTS.md.backup');\n }\n\n fs.writeFileSync(outputPath, content, 'utf-8');\n spinner2.succeed('AGENTS.md generated successfully');\n\n logger.blank();\n logger.success(`Created: ${outputPath}`);\n logger.blank();\n logger.indent(chalk.bold('Next steps:'));\n logger.indent(` ${chalk.cyan('repolens lint')} — Score your context quality`, 1);\n logger.indent(` ${chalk.cyan('repolens sync')} — Sync to CLAUDE.md & .cursorrules`, 1);\n logger.indent(` ${chalk.cyan('repolens dashboard')} — Visual context management`, 1);\n}\n\nfunction generateSmartAgents(\n scan: any, fw: any, arch: any, summary: any, answers: InterviewAnswers, contents: any[],\n): string {\n const s: string[] = [];\n\n s.push('# AGENTS.md');\n s.push('');\n s.push('> Instructions for AI coding agents working on this project.');\n s.push(`> Generated by RepoLens AI v2.0 on ${new Date().toISOString().split('T')[0]}.`);\n s.push('');\n\n // --- Project Overview (combines auto + manual) ---\n s.push('## Project Overview');\n s.push('');\n if (answers.projectDescription) {\n s.push(answers.projectDescription);\n s.push('');\n }\n s.push(`- **Framework:** ${fw.framework} ${fw.version || ''}`);\n s.push(`- **Language:** ${fw.language}`);\n s.push(`- **Package Manager:** ${fw.packageManager}`);\n s.push(`- **Architecture:** ${arch.style}`);\n if (fw.additionalFrameworks.length > 0) {\n s.push(`- **Key Libraries:** ${fw.additionalFrameworks.join(', ')}`);\n }\n s.push('');\n\n // --- Commands (specific, not generic) ---\n s.push('## Commands');\n s.push('');\n if (answers.buildCommands) s.push(`- **Build:** \\`${answers.buildCommands}\\``);\n else {\n // Auto-detect from package.json\n const pkgPath = path.join(process.cwd(), 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.scripts) {\n if (pkg.scripts.build) s.push(`- **Build:** \\`npm run build\\``);\n if (pkg.scripts.dev) s.push(`- **Dev:** \\`npm run dev\\``);\n if (pkg.scripts.lint) s.push(`- **Lint:** \\`npm run lint\\``);\n }\n } catch { /* skip */ }\n }\n }\n if (answers.testCommands) s.push(`- **Test:** \\`${answers.testCommands}\\``);\n else if (!scan.hasTests) s.push('- **Test:** No tests configured yet');\n if (answers.deployCommands) s.push(`- **Deploy:** \\`${answers.deployCommands}\\``);\n s.push('');\n\n // --- Architecture (auto-detected with data flow) ---\n s.push('## Architecture');\n s.push('');\n if (answers.architectureDecisions) {\n s.push(answers.architectureDecisions);\n s.push('');\n }\n s.push('### Data Flow');\n for (const flow of arch.dataFlow) {\n s.push(`- ${flow}`);\n }\n s.push('');\n\n // --- Key Structure ---\n s.push('## Key Structure');\n s.push('');\n s.push('```');\n for (const dir of scan.directories.slice(0, 15)) {\n s.push(dir + '/');\n }\n s.push('```');\n s.push('');\n\n // --- Critical Files ---\n s.push('## Critical Files');\n s.push('');\n if (answers.criticalFiles) {\n s.push(answers.criticalFiles);\n s.push('');\n }\n // Auto-detect top files by connectivity\n if (summary.mostConnected.length > 0) {\n s.push('Most interconnected files (modify carefully):');\n for (const f of summary.mostConnected.slice(0, 5)) {\n s.push(`- \\`${f.path}\\` (${f.imports} imports)`);\n }\n }\n s.push('');\n\n // --- Gotchas & Pitfalls (HIGH VALUE — tribal knowledge) ---\n if (answers.keyGotchas || answers.knownIssues) {\n s.push('## Gotchas & Known Issues');\n s.push('');\n if (answers.keyGotchas) s.push(answers.keyGotchas);\n if (answers.knownIssues) s.push(answers.knownIssues);\n s.push('');\n }\n\n // --- Conventions ---\n if (answers.conventions) {\n s.push('## Conventions');\n s.push('');\n s.push(answers.conventions);\n s.push('');\n }\n\n // --- Do Not Touch ---\n if (answers.doNotTouch) {\n s.push('## Do Not Modify');\n s.push('');\n s.push(answers.doNotTouch);\n s.push('');\n }\n\n // --- Framework-Specific Gotchas (from template library) ---\n const template = detectBestTemplate(fw.framework);\n if (template && !answers.keyGotchas) {\n // Extract gotchas section from the template\n const templateLines = template.content.split('\\n');\n let inGotchas = false;\n const gotchaLines: string[] = [];\n for (const line of templateLines) {\n if (line.startsWith('## Gotchas')) { inGotchas = true; continue; }\n if (inGotchas && line.startsWith('## ')) break;\n if (inGotchas) gotchaLines.push(line);\n }\n if (gotchaLines.length > 0) {\n s.push(`## Gotchas & Known Issues (${template.name})`);\n s.push('');\n for (const gl of gotchaLines) s.push(gl);\n s.push('');\n }\n }\n\n // --- Smart Rules (only project-specific ones) ---\n s.push('## Rules');\n s.push('');\n\n // Only add rules that are specific to this project\n if (arch.weakPoints.length > 0) {\n s.push('### Architecture Constraints');\n for (const wp of arch.weakPoints) {\n s.push(`- ${wp}`);\n }\n s.push('');\n }\n\n // Add testing rule only if relevant\n if (!scan.hasTests) {\n s.push('### Testing');\n s.push('- This project lacks tests — add tests for any new critical logic');\n s.push('');\n }\n\n s.push('---');\n s.push('*Generated by [RepoLens AI](https://github.com/repolens/repolens-ai)*');\n\n return s.join('\\n');\n}\n","/**\n * Framework-specific AGENTS.md templates library.\n * Curated templates with real tribal knowledge for 15+ popular frameworks.\n * These templates contain SPECIFIC, NON-INFERABLE information that actually helps AI agents.\n */\n\nexport interface FrameworkTemplate {\n id: string;\n name: string;\n description: string;\n tags: string[];\n content: string;\n}\n\nexport const FRAMEWORK_TEMPLATES: FrameworkTemplate[] = [\n // ─── JavaScript / TypeScript ────────────────────────────\n {\n id: 'nextjs',\n name: 'Next.js (App Router)',\n description: 'Next.js 14/15 with App Router, Server Components, and Server Actions',\n tags: ['react', 'nextjs', 'typescript', 'fullstack', 'ssr'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** Next.js (App Router)\n- **Language:** TypeScript\n- **Styling:** Tailwind CSS\n- **Package Manager:** npm / pnpm\n\n## Commands\n\n- **Dev:** \\`npm run dev\\` (starts at http://localhost:3000)\n- **Build:** \\`npm run build\\`\n- **Lint:** \\`npm run lint\\`\n\n## Architecture Decisions\n\n- We use **App Router** (not Pages Router). All routes are in \\`app/\\` directory.\n- Server Components are the default. Only add \\`\"use client\"\\` when you need interactivity.\n- Server Actions replace traditional API routes for mutations.\n- We use \\`next/image\\` for all images — never use raw \\`<img>\\` tags.\n\n## Gotchas & Known Issues\n\n- \\`\"use client\"\\` must be the FIRST line in client component files, before any imports.\n- Do NOT import server-only modules (like \\`fs\\`, database clients) in client components.\n- \\`cookies()\\` and \\`headers()\\` make a route dynamic — avoid in static pages.\n- Middleware runs on Edge Runtime — no Node.js APIs like \\`fs\\` or \\`path\\`.\n- \\`revalidatePath()\\` only works in Server Actions and Route Handlers.\n- \\`metadata\\` export only works in Server Components (layout.tsx, page.tsx).\n- Next.js caches aggressively — use \\`revalidateTag()\\` or \\`revalidatePath()\\` to bust cache.\n\n## Key Structure\n\n\\`\\`\\`\napp/ # Routes (App Router)\n layout.tsx # Root layout (wraps all pages)\n page.tsx # Homepage\n [slug]/page.tsx # Dynamic routes\n api/ # API Route Handlers\ncomponents/ # Shared React components\nlib/ # Utilities, database, auth\npublic/ # Static assets\n\\`\\`\\`\n\n## Conventions\n\n- File naming: \\`kebab-case.tsx\\` for components, \\`camelCase.ts\\` for utilities\n- All API responses use \\`NextResponse.json()\\`\n- Use \\`notFound()\\` from \\`next/navigation\\` for 404s (never throw errors)\n- Loading states go in \\`loading.tsx\\`, error boundaries in \\`error.tsx\\`\n\n## Rules\n\n### Do Not\n- Do not use Pages Router patterns (\\`getServerSideProps\\`, \\`getStaticProps\\`)\n- Do not use \\`useEffect\\` for data fetching — use Server Components or SWR\n- Do not put secrets in \\`NEXT_PUBLIC_\\` env vars (they are exposed to browser)\n- Do not modify \\`next.config.js\\` without explicit instruction\n\n### Performance\n- Use \\`Suspense\\` boundaries for streaming\n- Prefer \\`generateStaticParams\\` for static generation of dynamic routes\n- Use \\`loading.tsx\\` files for route-level loading states`,\n },\n {\n id: 'react-vite',\n name: 'React + Vite',\n description: 'React SPA with Vite bundler, React Router, and modern tooling',\n tags: ['react', 'vite', 'typescript', 'spa', 'frontend'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** React + Vite\n- **Language:** TypeScript\n- **Styling:** CSS Modules / Tailwind CSS\n- **Package Manager:** npm\n\n## Commands\n\n- **Dev:** \\`npm run dev\\` (starts at http://localhost:5173)\n- **Build:** \\`npm run build\\`\n- **Preview:** \\`npm run preview\\`\n\n## Architecture Decisions\n\n- This is a **Single Page Application** (SPA), not SSR.\n- We use React Router for client-side routing.\n- State management: React Context + useReducer (no Redux unless explicitly needed).\n- API calls go through \\`src/api/\\` module — never call fetch directly in components.\n\n## Gotchas & Known Issues\n\n- Vite uses \\`import.meta.env\\` NOT \\`process.env\\` for environment variables.\n- Only env vars prefixed with \\`VITE_\\` are exposed to the browser.\n- \\`.env.local\\` is gitignored by default — use \\`.env.example\\` for documentation.\n- Hot Module Replacement (HMR) breaks if you export non-component values from .tsx files.\n- Vite requires explicit file extensions in some import paths.\n\n## Key Structure\n\n\\`\\`\\`\nsrc/\n components/ # Reusable UI components\n pages/ # Route-level components\n hooks/ # Custom React hooks\n api/ # API client and endpoints\n utils/ # Helper functions\n types/ # TypeScript type definitions\n assets/ # Images, fonts, etc.\n\\`\\`\\`\n\n## Conventions\n\n- Components: PascalCase (\\`UserCard.tsx\\`)\n- Hooks: \\`useXxx.ts\\` pattern\n- One component per file\n- Props interface named \\`XxxProps\\`\n\n## Rules\n\n### Do Not\n- Do not use \\`process.env\\` — use \\`import.meta.env\\`\n- Do not install heavy libraries without discussion\n- Do not put API keys in frontend code`,\n },\n {\n id: 'vue-nuxt',\n name: 'Vue / Nuxt.js',\n description: 'Vue 3 or Nuxt 3 with Composition API and auto-imports',\n tags: ['vue', 'nuxt', 'typescript', 'ssr', 'fullstack'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** Nuxt 3 / Vue 3\n- **Language:** TypeScript\n- **Styling:** Tailwind CSS / UnoCSS\n\n## Commands\n\n- **Dev:** \\`npm run dev\\`\n- **Build:** \\`npm run build\\`\n- **Generate:** \\`npm run generate\\` (static site generation)\n\n## Gotchas & Known Issues\n\n- Nuxt 3 **auto-imports** Vue APIs (ref, computed, watch) — do NOT manually import them.\n- Nuxt 3 auto-imports components from \\`components/\\` — no need for import statements.\n- \\`useFetch\\` and \\`useAsyncData\\` only work in \\`setup()\\` or \\`<script setup>\\` context.\n- \\`useState\\` is Nuxt's SSR-safe alternative to \\`ref\\` for shared state — not React's useState.\n- Server-only code goes in \\`server/\\` directory — it's never sent to the client.\n- \\`definePageMeta\\` must be called at the top level of \\`<script setup>\\`, not inside functions.\n\n## Key Structure\n\n\\`\\`\\`\npages/ # File-based routing\ncomponents/ # Auto-imported components\ncomposables/ # Auto-imported composables (useXxx)\nserver/ # Server-only code (API routes, middleware)\n api/ # Server API routes\nlayouts/ # Page layouts\nmiddleware/ # Route middleware\nplugins/ # Nuxt plugins\n\\`\\`\\`\n\n## Conventions\n\n- Use Composition API with \\`<script setup>\\` (never Options API)\n- Composables: \\`useXxx.ts\\` in \\`composables/\\`\n- API routes: \\`server/api/[name].ts\\``,\n },\n // ─── Backend Frameworks ────────────────────────────\n {\n id: 'express',\n name: 'Express.js / Node.js API',\n description: 'Express.js REST API with middleware pattern',\n tags: ['express', 'nodejs', 'api', 'backend', 'rest'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** Express.js\n- **Language:** TypeScript / JavaScript\n- **Database:** PostgreSQL / MongoDB\n- **Package Manager:** npm\n\n## Commands\n\n- **Dev:** \\`npm run dev\\`\n- **Build:** \\`npm run build\\`\n- **Test:** \\`npm test\\`\n\n## Gotchas & Known Issues\n\n- Middleware order matters — auth middleware must come BEFORE route handlers.\n- Always call \\`next()\\` in middleware or the request will hang forever.\n- Error-handling middleware must have exactly 4 parameters: \\`(err, req, res, next)\\`.\n- \\`async\\` route handlers need \\`try/catch\\` or \\`express-async-errors\\` — unhandled rejections crash the server.\n- \\`req.body\\` is undefined without \\`express.json()\\` middleware.\n\n## Key Structure\n\n\\`\\`\\`\nsrc/\n routes/ # Route definitions\n controllers/ # Request handlers\n middleware/ # Auth, validation, error handling\n services/ # Business logic\n models/ # Database models\n utils/ # Helper functions\n config/ # App configuration\n\\`\\`\\`\n\n## Conventions\n\n- Routes: \\`/api/v1/[resource]\\`\n- Controllers: thin — delegate to services\n- Services: contain all business logic\n- Always return consistent JSON: \\`{ success, data, error }\\`\n- Use HTTP status codes correctly (201 for create, 204 for delete)\n\n## Rules\n\n### Do Not\n- Do not put business logic in controllers\n- Do not use \\`res.send()\\` for API responses — use \\`res.json()\\`\n- Do not remove auth middleware from protected routes`,\n },\n {\n id: 'nestjs',\n name: 'NestJS',\n description: 'NestJS with decorators, DI, modules, and TypeORM/Prisma',\n tags: ['nestjs', 'typescript', 'api', 'backend', 'enterprise'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** NestJS\n- **Language:** TypeScript (strict)\n- **ORM:** Prisma / TypeORM\n\n## Commands\n\n- **Dev:** \\`npm run start:dev\\`\n- **Build:** \\`npm run build\\`\n- **Test:** \\`npm run test\\`\n- **E2E:** \\`npm run test:e2e\\`\n\n## Gotchas & Known Issues\n\n- Every service/controller MUST be registered in a Module's \\`providers\\`/\\`controllers\\`.\n- Circular dependencies crash silently — use \\`forwardRef()\\` to resolve them.\n- Guards execute BEFORE interceptors and pipes — order: Guards → Interceptors → Pipes → Handler.\n- \\`@Injectable()\\` decorator is required on ALL service classes.\n- DTOs must use \\`class-validator\\` decorators AND \\`ValidationPipe\\` in main.ts.\n- \\`ConfigService.get()\\` returns \\`string | undefined\\` — always provide a default.\n\n## Conventions\n\n- One module per feature (\\`users/users.module.ts\\`)\n- DTOs: \\`create-user.dto.ts\\`, \\`update-user.dto.ts\\`\n- Use \\`@ApiTags()\\` and \\`@ApiOperation()\\` for Swagger docs\n- Global exception filter handles all unhandled errors`,\n },\n // ─── Python ────────────────────────────────────────\n {\n id: 'django',\n name: 'Django / Django REST',\n description: 'Django with DRF, models, views, and migrations',\n tags: ['django', 'python', 'api', 'backend', 'fullstack'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** Django + Django REST Framework\n- **Language:** Python 3.11+\n- **Database:** PostgreSQL\n\n## Commands\n\n- **Dev:** \\`python manage.py runserver\\`\n- **Migrate:** \\`python manage.py makemigrations && python manage.py migrate\\`\n- **Test:** \\`python manage.py test\\`\n- **Shell:** \\`python manage.py shell\\`\n\n## Gotchas & Known Issues\n\n- Always run \\`makemigrations\\` after changing models — Django won't auto-detect.\n- Migration files are version-controlled — never delete them manually.\n- \\`ForeignKey\\` requires \\`on_delete\\` parameter (usually \\`CASCADE\\` or \\`PROTECT\\`).\n- \\`@login_required\\` redirects to LOGIN_URL — use \\`@permission_classes\\` for DRF.\n- QuerySets are lazy — they don't hit the database until evaluated.\n- \\`select_related()\\` for ForeignKey, \\`prefetch_related()\\` for ManyToMany.\n- Never use \\`Model.objects.all()\\` in templates — creates N+1 queries.\n\n## Key Structure\n\n\\`\\`\\`\nproject_name/\n settings.py # Configuration (NEVER commit secrets here)\n urls.py # Root URL configuration\napp_name/\n models.py # Database models\n views.py # View functions / ViewSets\n serializers.py # DRF serializers\n urls.py # App-level URLs\n admin.py # Admin configuration\n tests.py # Tests\n migrations/ # Database migrations (auto-generated)\n\\`\\`\\``,\n },\n {\n id: 'fastapi',\n name: 'FastAPI',\n description: 'FastAPI with Pydantic, async/await, and SQLAlchemy',\n tags: ['fastapi', 'python', 'api', 'backend', 'async'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** FastAPI\n- **Language:** Python 3.11+\n- **ORM:** SQLAlchemy / Tortoise ORM\n\n## Commands\n\n- **Dev:** \\`uvicorn main:app --reload\\`\n- **Test:** \\`pytest\\`\n- **Docs:** http://localhost:8000/docs (Swagger UI auto-generated)\n\n## Gotchas & Known Issues\n\n- Path parameters must match function parameter names exactly.\n- \\`Depends()\\` creates a new instance per request — use \\`yield\\` for cleanup.\n- Pydantic v2 uses \\`model_validate()\\` not \\`from_orm()\\` for ORM models.\n- \\`async def\\` endpoints run in the event loop — blocking code freezes the server.\n- Use \\`BackgroundTasks\\` for fire-and-forget work, not \\`asyncio.create_task()\\`.\n- Response model fields must be JSON-serializable — datetime needs custom encoder.\n\n## Conventions\n\n- Routers: one file per resource (\\`routers/users.py\\`)\n- Schemas: Pydantic models for request/response (\\`schemas/user.py\\`)\n- CRUD: database operations in \\`crud/\\` module\n- Dependencies: shared logic in \\`dependencies.py\\``,\n },\n // ─── PHP ───────────────────────────────────────────\n {\n id: 'laravel',\n name: 'Laravel',\n description: 'Laravel with Eloquent, Blade, and Artisan commands',\n tags: ['laravel', 'php', 'fullstack', 'backend', 'mvc'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** Laravel\n- **Language:** PHP 8.2+\n- **Database:** MySQL / PostgreSQL\n\n## Commands\n\n- **Dev:** \\`php artisan serve\\`\n- **Migrate:** \\`php artisan migrate\\`\n- **Test:** \\`php artisan test\\`\n- **Generate:** \\`php artisan make:model ModelName -mcr\\` (model + migration + controller + resource)\n\n## Gotchas & Known Issues\n\n- Always run \\`composer dump-autoload\\` after adding new classes manually.\n- \\`$fillable\\` or \\`$guarded\\` MUST be set on models — mass assignment is blocked by default.\n- Route model binding only works with \\`{model}\\` parameter name matching the variable name.\n- \\`php artisan config:cache\\` caches config — env() calls outside config files will return null.\n- Eloquent \\`delete()\\` fires events, \\`DB::table()->delete()\\` does NOT.\n- Middleware order in \\`Kernel.php\\` matters — auth before API throttle.\n\n## Key Structure\n\n\\`\\`\\`\napp/\n Http/Controllers/ # Request handlers\n Models/ # Eloquent models\n Services/ # Business logic\nroutes/\n web.php # Web routes (sessions, CSRF)\n api.php # API routes (stateless)\ndatabase/\n migrations/ # Schema changes\n seeders/ # Test data\nresources/views/ # Blade templates\n\\`\\`\\``,\n },\n // ─── Mobile ────────────────────────────────────────\n {\n id: 'react-native',\n name: 'React Native / Expo',\n description: 'React Native with Expo, navigation, and native modules',\n tags: ['react-native', 'expo', 'mobile', 'typescript', 'ios', 'android'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Framework:** React Native / Expo\n- **Language:** TypeScript\n- **Navigation:** React Navigation\n\n## Commands\n\n- **Dev:** \\`npx expo start\\`\n- **iOS:** \\`npx expo run:ios\\`\n- **Android:** \\`npx expo run:android\\`\n\n## Gotchas & Known Issues\n\n- There is NO DOM — \\`div\\`, \\`span\\`, \\`p\\` don't exist. Use \\`View\\`, \\`Text\\`, \\`Pressable\\`.\n- CSS doesn't exist — use \\`StyleSheet.create()\\` or NativeWind for Tailwind-like syntax.\n- \\`flexDirection\\` defaults to \\`column\\` (not \\`row\\` like web).\n- \\`onClick\\` doesn't exist — use \\`onPress\\` on \\`Pressable\\` or \\`TouchableOpacity\\`.\n- Platform-specific code: \\`Platform.OS === 'ios'\\` or \\`.ios.tsx\\` / \\`.android.tsx\\` file extensions.\n- Expo Go has limitations — some native modules require development builds.\n- \\`SafeAreaView\\` is required to avoid content under the notch/status bar.\n\n## Conventions\n\n- Screens in \\`screens/\\` or \\`app/\\` (Expo Router)\n- Components in \\`components/\\`\n- Use \\`expo-constants\\` for env vars, not \\`process.env\\``,\n },\n // ─── Static / JAMstack ─────────────────────────────\n {\n id: 'html-css-js',\n name: 'HTML + CSS + JavaScript',\n description: 'Static website or vanilla JS app without frameworks',\n tags: ['html', 'css', 'javascript', 'static', 'vanilla', 'beginner'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Type:** Static website / Vanilla JavaScript\n- **Language:** HTML, CSS, JavaScript\n- **No build tools** — files are served directly\n\n## Architecture Decisions\n\n- This project intentionally uses NO frameworks — keep it simple.\n- All JavaScript is vanilla — no jQuery, React, or other libraries.\n- CSS is vanilla — no Tailwind, SCSS, or CSS-in-JS.\n\n## Gotchas & Known Issues\n\n- No module bundler — use \\`<script>\\` tags in HTML, not \\`import\\` statements.\n- If using ES modules, add \\`type=\"module\"\\` to the script tag.\n- CSS files must be linked in HTML \\`<head>\\` — they don't auto-load.\n- \\`fetch()\\` requires a server for local files — use Live Server extension.\n- No hot reload — refresh the browser manually or use Live Server.\n\n## Key Structure\n\n\\`\\`\\`\nindex.html # Main page\nstyles/ # CSS files\n style.css\nscripts/ # JavaScript files\n app.js\nassets/ # Images, fonts\n images/\n fonts/\n\\`\\`\\`\n\n## Conventions\n\n- Semantic HTML5 elements (\\`header\\`, \\`main\\`, \\`section\\`, \\`footer\\`)\n- BEM naming for CSS (\\`.block__element--modifier\\`)\n- All interactive elements must have \\`id\\` attributes\n- Mobile-first responsive design\n- Accessible: alt text on images, proper heading hierarchy`,\n },\n // ─── Fullstack / Meta ──────────────────────────────\n {\n id: 't3-stack',\n name: 'T3 Stack',\n description: 'Next.js + tRPC + Prisma + NextAuth + Tailwind (create-t3-app)',\n tags: ['t3', 'nextjs', 'trpc', 'prisma', 'typescript', 'fullstack'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Stack:** T3 (Next.js + tRPC + Prisma + NextAuth + Tailwind)\n- **Language:** TypeScript (strict)\n\n## Commands\n\n- **Dev:** \\`npm run dev\\`\n- **DB Push:** \\`npx prisma db push\\`\n- **DB Studio:** \\`npx prisma studio\\`\n- **Generate:** \\`npx prisma generate\\` (after schema changes)\n\n## Gotchas & Known Issues\n\n- After changing \\`schema.prisma\\`, always run \\`npx prisma generate\\`.\n- tRPC procedures are type-safe end-to-end — do NOT create separate API routes.\n- \\`useSession()\\` requires \\`SessionProvider\\` wrapper in the layout.\n- Prisma Client is singleton — import from \\`src/server/db.ts\\`, never create new instances.\n- tRPC context has access to session — use \\`protectedProcedure\\` for auth-required endpoints.\n- Tailwind classes: check \\`tailwind.config.ts\\` for custom theme values.\n\n## Key Structure\n\n\\`\\`\\`\nsrc/\n app/ # Next.js App Router\n server/\n api/ # tRPC routers\n db.ts # Prisma client singleton\n auth.ts # NextAuth configuration\n trpc/ # tRPC client setup\nprisma/\n schema.prisma # Database schema\n\\`\\`\\``,\n },\n {\n id: 'supabase',\n name: 'Supabase + Next.js',\n description: 'Next.js with Supabase for auth, database, and storage',\n tags: ['supabase', 'nextjs', 'postgres', 'auth', 'baas'],\n content: `# AGENTS.md\n\n> Instructions for AI coding agents working on this project.\n\n## Project Overview\n\n- **Frontend:** Next.js (App Router)\n- **Backend:** Supabase (PostgreSQL + Auth + Storage)\n- **Language:** TypeScript\n\n## Commands\n\n- **Dev:** \\`npm run dev\\`\n- **Supabase Local:** \\`npx supabase start\\`\n- **Types:** \\`npx supabase gen types typescript --local > src/types/database.ts\\`\n- **Migration:** \\`npx supabase migration new [name]\\`\n\n## Gotchas & Known Issues\n\n- Use \\`createServerClient()\\` in Server Components, \\`createBrowserClient()\\` in Client Components.\n- Row Level Security (RLS) is enabled by default — queries return empty without proper policies.\n- Always regenerate types after changing database schema.\n- \\`supabase.auth.getSession()\\` is deprecated on server — use \\`supabase.auth.getUser()\\`.\n- Storage buckets need explicit policies for upload/download access.\n- Realtime subscriptions require the table to have \\`REPLICA IDENTITY FULL\\` set.`,\n },\n];\n\n/**\n * Get all available templates.\n */\nexport function getAllTemplates(): FrameworkTemplate[] {\n return FRAMEWORK_TEMPLATES;\n}\n\n/**\n * Find template by ID.\n */\nexport function getTemplateById(id: string): FrameworkTemplate | undefined {\n return FRAMEWORK_TEMPLATES.find((t) => t.id === id);\n}\n\n/**\n * Search templates by query (matches name, description, tags).\n */\nexport function searchTemplates(query: string): FrameworkTemplate[] {\n const q = query.toLowerCase();\n return FRAMEWORK_TEMPLATES.filter((t) =>\n t.name.toLowerCase().includes(q) ||\n t.description.toLowerCase().includes(q) ||\n t.tags.some((tag) => tag.includes(q))\n );\n}\n\n/**\n * Auto-detect the best template for a project based on its framework.\n */\nexport function detectBestTemplate(framework: string): FrameworkTemplate | undefined {\n const fwLower = framework.toLowerCase();\n\n const mapping: Record<string, string> = {\n 'next.js': 'nextjs',\n 'nextjs': 'nextjs',\n 'react': 'react-vite',\n 'react + vite': 'react-vite',\n 'vue': 'vue-nuxt',\n 'vue.js': 'vue-nuxt',\n 'nuxt': 'vue-nuxt',\n 'nuxt.js': 'vue-nuxt',\n 'express': 'express',\n 'express.js': 'express',\n 'nestjs': 'nestjs',\n 'nest.js': 'nestjs',\n 'django': 'django',\n 'fastapi': 'fastapi',\n 'flask': 'fastapi', // Close enough\n 'laravel': 'laravel',\n 'react native': 'react-native',\n 'expo': 'react-native',\n 'html': 'html-css-js',\n 'static': 'html-css-js',\n 't3': 't3-stack',\n 'supabase': 'supabase',\n };\n\n for (const [key, templateId] of Object.entries(mapping)) {\n if (fwLower.includes(key)) {\n return getTemplateById(templateId);\n }\n }\n\n return undefined;\n}\n","import ora from 'ora';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectContextFiles, scoreContextFile, getGrade, getScoreColor } from '../core/contextScorer.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Lint command — Score and analyze quality of AI context files.\n * Detects generic rules, missing tribal knowledge, and suggests improvements.\n */\n\nexport async function lintCommand(): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Scanning for AI context files...').start();\n\n try {\n const scan = await scanRepository(cwd);\n const contextFiles = detectContextFiles(cwd);\n const existingFiles = contextFiles.filter((f) => f.exists);\n\n if (existingFiles.length === 0) {\n spinner.fail('No AI context files found');\n logger.blank();\n logger.warn('No AGENTS.md, CLAUDE.md, or .cursorrules found');\n logger.blank();\n logger.indent(chalk.bold('Create one with:'));\n logger.indent(` ${chalk.cyan('repolens init')} — Interactive context creation`, 1);\n return;\n }\n\n spinner.succeed(`Found ${existingFiles.length} context file(s)`);\n\n // Score each file\n for (const file of existingFiles) {\n const score = scoreContextFile(file.content, scan.fileTree);\n const grade = getGrade(score.overall);\n const color = getScoreColor(score.overall);\n\n logger.section('📋', `${file.path}`);\n logger.blank();\n\n // Overall score with visual bar\n const scoreBar = '█'.repeat(Math.round(score.overall / 5)) + '░'.repeat(20 - Math.round(score.overall / 5));\n const colorFn = color === 'green' ? chalk.green : color === 'yellow' ? chalk.yellow : chalk.red;\n\n logger.indent(chalk.bold(`Overall: ${colorFn(`${score.overall}/100`)} ${colorFn(grade)} ${colorFn(scoreBar)}`));\n logger.blank();\n\n // Breakdown\n logger.indent(chalk.bold('Breakdown:'));\n const metrics = [\n { name: 'Specificity', value: score.breakdown.specificity, desc: 'Project-specific vs generic rules' },\n { name: 'Coverage', value: score.breakdown.coverage, desc: 'Important areas covered' },\n { name: 'Conciseness', value: score.breakdown.conciseness, desc: 'Not too long, not too short' },\n { name: 'Freshness', value: score.breakdown.freshness, desc: 'References actual project files' },\n { name: 'Tribal Knowledge', value: score.breakdown.tribalKnowledge, desc: 'Non-inferable information' },\n ];\n\n for (const m of metrics) {\n const mColor = getScoreColor(m.value);\n const mFn = mColor === 'green' ? chalk.green : mColor === 'yellow' ? chalk.yellow : chalk.red;\n const bar = '█'.repeat(Math.round(m.value / 10)) + '░'.repeat(10 - Math.round(m.value / 10));\n logger.indent(` ${m.name.padEnd(18)} ${mFn(`${String(m.value).padStart(3)}/100`)} ${mFn(bar)} ${chalk.dim(m.desc)}`, 1);\n }\n\n logger.blank();\n\n // Stats\n logger.indent(chalk.bold('Stats:'));\n logger.kv('Total Lines', String(score.totalLines));\n logger.kv('Generic Rules', chalk.red(String(score.genericRulesCount)));\n logger.kv('Specific Rules', chalk.green(String(score.specificRulesCount)));\n\n // Issues\n if (score.issues.length > 0) {\n logger.blank();\n logger.indent(chalk.bold('Issues:'));\n for (const issue of score.issues) {\n const icon = issue.severity === 'error' ? '🔴' : issue.severity === 'warning' ? '🟡' : '🔵';\n const issueFn = issue.severity === 'error' ? chalk.red : issue.severity === 'warning' ? chalk.yellow : chalk.blue;\n let msg = `${icon} ${issueFn(issue.message)}`;\n if (issue.line) msg += chalk.dim(` (line ${issue.line})`);\n logger.indent(msg, 1);\n if (issue.fix) {\n logger.indent(chalk.dim(` Fix: ${issue.fix}`), 2);\n }\n }\n }\n\n // Suggestions\n if (score.suggestions.length > 0) {\n logger.blank();\n logger.indent(chalk.bold('Suggestions:'));\n for (const s of score.suggestions) {\n logger.indent(chalk.cyan(` 💡 ${s}`), 1);\n }\n }\n }\n\n // Missing files\n const missingFiles = contextFiles.filter((f) => !f.exists);\n if (missingFiles.length > 0) {\n logger.blank();\n logger.section('📭', 'Missing Context Files');\n for (const f of missingFiles) {\n const typeLabels: Record<string, string> = {\n agents: 'AGENTS.md (Universal standard)',\n claude: 'CLAUDE.md (Claude Code)',\n cursorrules: '.cursorrules (Cursor IDE)',\n copilot: 'copilot-instructions.md (GitHub Copilot)',\n };\n logger.indent(chalk.dim(` ✗ ${typeLabels[f.type] || f.path}`));\n }\n logger.blank();\n logger.indent(`Sync all from AGENTS.md: ${chalk.cyan('repolens sync')}`);\n }\n\n } catch (error) {\n spinner.fail('Lint failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport { detectContextFiles } from '../core/contextScorer.js';\nimport { createSyncPlan, executeSyncPlan } from '../core/contextSyncer.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Sync command — Sync AGENTS.md to CLAUDE.md, .cursorrules, and copilot-instructions.\n * Solves the fragmentation problem.\n */\n\nexport async function syncCommand(options: { force?: boolean; dryRun?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Detecting context files...').start();\n\n try {\n const contextFiles = detectContextFiles(cwd);\n const agentsFile = contextFiles.find((f) => f.type === 'agents' && f.exists);\n\n if (!agentsFile) {\n spinner.fail('No AGENTS.md found');\n logger.blank();\n logger.warn('AGENTS.md is the source of truth for syncing.');\n logger.indent(`Create one with: ${chalk.cyan('repolens init')}`);\n return;\n }\n\n spinner.succeed('Found AGENTS.md as source');\n\n // Create sync plan\n const plan = createSyncPlan(agentsFile, contextFiles, cwd);\n\n // Show plan\n logger.section('📋', 'Sync Plan');\n logger.indent(chalk.bold(`Source: ${chalk.cyan(agentsFile.path)}`));\n logger.blank();\n\n for (const target of plan.targets) {\n const icon = target.action === 'create' ? '🆕' : target.action === 'update' ? '♻️' : '⏭️';\n const actionLabel = target.action === 'create' ? chalk.green('CREATE') :\n target.action === 'update' ? chalk.yellow('UPDATE') : chalk.dim('SKIP');\n logger.indent(`${icon} ${actionLabel} ${target.path} ${chalk.dim(`— ${target.label}`)}`);\n }\n\n if (plan.conflicts.length > 0) {\n logger.blank();\n logger.indent(chalk.bold.yellow('⚠ Conflicts:'));\n for (const conflict of plan.conflicts) {\n logger.indent(chalk.yellow(` ${conflict.file}: ${conflict.reason}`));\n if (options.force) {\n logger.indent(chalk.dim(' → Will overwrite (--force flag set)'));\n } else {\n logger.indent(chalk.dim(' → Skipping. Use --force to overwrite'));\n }\n }\n }\n\n // Execute if not dry-run\n if (options.dryRun) {\n logger.blank();\n logger.info('Dry run — no files were written');\n return;\n }\n\n // If force mode, change skip targets to update\n if (options.force) {\n for (const target of plan.targets) {\n if (target.action === 'skip') target.action = 'update';\n }\n }\n\n logger.blank();\n const syncSpinner = ora('Syncing files...').start();\n const result = executeSyncPlan(plan, cwd);\n syncSpinner.succeed('Sync complete');\n\n logger.blank();\n if (result.written.length > 0) {\n logger.indent(chalk.bold('Written:'));\n for (const f of result.written) {\n logger.success(f);\n }\n }\n if (result.skipped.length > 0) {\n logger.indent(chalk.bold('Skipped (has manual edits):'));\n for (const f of result.skipped) {\n logger.warn(`${f} — use --force to overwrite`);\n }\n }\n\n logger.blank();\n logger.indent(chalk.dim('Tip: Commit these files to your repo so all AI tools use the same context.'));\n\n } catch (error) {\n spinner.fail('Sync failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { ContextFile } from './contextScorer.js';\n\n/**\n * Cross-tool Context Syncer v2.\n * Syncs AGENTS.md to ALL major AI coding tools:\n * - CLAUDE.md (Claude Code / Codex)\n * - .cursorrules (Cursor legacy)\n * - .cursor/rules/project.mdc (Cursor modern — MDC format with YAML frontmatter)\n * - .github/copilot-instructions.md (GitHub Copilot)\n * - .windsurfrules (Windsurf / Codeium)\n * - CODEX.md (OpenAI Codex)\n */\n\nexport interface SyncPlan {\n source: ContextFile;\n targets: SyncTarget[];\n conflicts: SyncConflict[];\n}\n\nexport interface SyncTarget {\n type: ContextFile['type'] | 'mdc' | 'windsurf' | 'codex';\n path: string;\n action: 'create' | 'update' | 'skip';\n exists: boolean;\n content: string;\n label: string;\n}\n\nexport interface SyncConflict {\n file: string;\n reason: string;\n sourceSnippet: string;\n targetSnippet: string;\n}\n\n// ─── Converters ─────────────────────────────────────────\n\n/**\n * Convert AGENTS.md content to CLAUDE.md format.\n */\nfunction toClaudeMd(agentsContent: string): string {\n const sections: string[] = [];\n sections.push(`# CLAUDE.md`);\n sections.push('');\n sections.push(`> Project-specific instructions for Claude Code.`);\n sections.push(`> Synced from AGENTS.md by RepoLens AI.`);\n sections.push('');\n\n const lines = agentsContent.split('\\n');\n let skipHeader = true;\n\n for (const line of lines) {\n if (skipHeader && (line.startsWith('# AGENTS') || line.startsWith('> '))) continue;\n if (skipHeader && line.trim() === '') continue;\n skipHeader = false;\n sections.push(line);\n }\n\n sections.push('');\n sections.push('---');\n sections.push(`*Synced from AGENTS.md by [RepoLens AI](https://github.com/repolens/repolens-ai) on ${new Date().toISOString().split('T')[0]}*`);\n\n return sections.join('\\n');\n}\n\n/**\n * Convert AGENTS.md content to .cursorrules format (legacy).\n */\nfunction toCursorRules(agentsContent: string): string {\n const sections: string[] = [];\n const lines = agentsContent.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('# AGENTS')) {\n sections.push('# Cursor Rules');\n sections.push('');\n sections.push('> Auto-synced from AGENTS.md by RepoLens AI.');\n } else {\n sections.push(line);\n }\n }\n\n sections.push('');\n sections.push(`# Synced: ${new Date().toISOString().split('T')[0]}`);\n\n return sections.join('\\n');\n}\n\n/**\n * Convert AGENTS.md content to .cursor/rules/project.mdc format.\n * MDC = Markdown Cursor — modern format with YAML frontmatter.\n * This is the current standard for Cursor IDE (2026+).\n */\nfunction toMdcRules(agentsContent: string, projectName: string): string {\n const sections: string[] = [];\n\n // YAML frontmatter — this is what makes .mdc special\n sections.push('---');\n sections.push(`description: Project rules for ${projectName} — auto-synced from AGENTS.md`);\n sections.push('globs:');\n sections.push('alwaysApply: true');\n sections.push('---');\n sections.push('');\n\n // Extract content, skipping AGENTS.md header\n const lines = agentsContent.split('\\n');\n let skipHeader = true;\n\n for (const line of lines) {\n if (skipHeader && (line.startsWith('# AGENTS') || line.startsWith('> '))) continue;\n if (skipHeader && line.trim() === '') continue;\n skipHeader = false;\n\n // Convert ## headers to # (MDC uses flatter hierarchy)\n if (line.startsWith('## ')) {\n sections.push(line.replace('## ', '# '));\n } else if (line.startsWith('### ')) {\n sections.push(line.replace('### ', '## '));\n } else {\n sections.push(line);\n }\n }\n\n // Remove trailing generator line if present\n const lastIdx = sections.length - 1;\n if (sections[lastIdx]?.includes('RepoLens AI') || sections[lastIdx]?.includes('---')) {\n sections.pop();\n if (sections[lastIdx - 1]?.trim() === '') sections.pop();\n }\n\n return sections.join('\\n');\n}\n\n/**\n * Convert AGENTS.md to GitHub Copilot instructions format.\n */\nfunction toCopilotInstructions(agentsContent: string): string {\n const sections: string[] = [];\n sections.push('# Copilot Instructions');\n sections.push('');\n sections.push('> Auto-synced from AGENTS.md by RepoLens AI.');\n sections.push('');\n\n const lines = agentsContent.split('\\n');\n let skipHeader = true;\n\n for (const line of lines) {\n if (skipHeader && (line.startsWith('# ') || line.startsWith('> ') || line.trim() === '')) continue;\n skipHeader = false;\n sections.push(line);\n }\n\n sections.push('');\n sections.push(`<!-- Synced: ${new Date().toISOString().split('T')[0]} -->`);\n\n return sections.join('\\n');\n}\n\n/**\n * Convert AGENTS.md to .windsurfrules format (Windsurf / Codeium).\n */\nfunction toWindsurfRules(agentsContent: string): string {\n const sections: string[] = [];\n const lines = agentsContent.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('# AGENTS')) {\n sections.push('# Windsurf Rules');\n sections.push('');\n sections.push('> Auto-synced from AGENTS.md by RepoLens AI.');\n } else {\n sections.push(line);\n }\n }\n\n sections.push('');\n sections.push(`# Synced: ${new Date().toISOString().split('T')[0]}`);\n\n return sections.join('\\n');\n}\n\n/**\n * Convert AGENTS.md to CODEX.md format (OpenAI Codex).\n */\nfunction toCodexMd(agentsContent: string): string {\n const sections: string[] = [];\n sections.push(`# CODEX.md`);\n sections.push('');\n sections.push(`> Instructions for OpenAI Codex agent.`);\n sections.push(`> Synced from AGENTS.md by RepoLens AI.`);\n sections.push('');\n\n const lines = agentsContent.split('\\n');\n let skipHeader = true;\n\n for (const line of lines) {\n if (skipHeader && (line.startsWith('# AGENTS') || line.startsWith('> '))) continue;\n if (skipHeader && line.trim() === '') continue;\n skipHeader = false;\n sections.push(line);\n }\n\n sections.push('');\n sections.push('---');\n sections.push(`*Synced from AGENTS.md by [RepoLens AI](https://github.com/repolens/repolens-ai) on ${new Date().toISOString().split('T')[0]}*`);\n\n return sections.join('\\n');\n}\n\n// ─── Sync Engine ────────────────────────────────────────\n\n/**\n * Create a sync plan from AGENTS.md to all AI tools.\n */\nexport function createSyncPlan(\n source: ContextFile,\n allContextFiles: ContextFile[],\n cwd: string,\n): SyncPlan {\n const projectName = path.basename(cwd);\n const targets: SyncTarget[] = [];\n const conflicts: SyncConflict[] = [];\n\n if (source.type !== 'agents') {\n return { source, targets: [], conflicts: [{ file: source.path, reason: 'Only AGENTS.md can be used as sync source', sourceSnippet: '', targetSnippet: '' }] };\n }\n\n const targetDefs: { type: SyncTarget['type']; converter: (c: string) => string; filePath: string; label: string }[] = [\n { type: 'claude', converter: (c) => toClaudeMd(c), filePath: 'CLAUDE.md', label: 'Claude Code / Codex CLI' },\n { type: 'mdc', converter: (c) => toMdcRules(c, projectName), filePath: '.cursor/rules/project.mdc', label: 'Cursor IDE (modern .mdc)' },\n { type: 'cursorrules', converter: toCursorRules, filePath: '.cursorrules', label: 'Cursor IDE (legacy)' },\n { type: 'copilot', converter: toCopilotInstructions, filePath: '.github/copilot-instructions.md', label: 'GitHub Copilot' },\n { type: 'windsurf', converter: toWindsurfRules, filePath: '.windsurfrules', label: 'Windsurf / Codeium' },\n { type: 'codex', converter: (c) => toCodexMd(c), filePath: 'CODEX.md', label: 'OpenAI Codex' },\n ];\n\n for (const { type, converter, filePath, label } of targetDefs) {\n const fullPath = path.join(cwd, filePath);\n const exists = fs.existsSync(fullPath);\n const newContent = converter(source.content);\n\n if (exists) {\n const existingContent = fs.readFileSync(fullPath, 'utf-8');\n const hasManualEdits = !existingContent.includes('RepoLens AI') &&\n !existingContent.includes('Synced from AGENTS.md');\n\n if (hasManualEdits) {\n conflicts.push({\n file: filePath,\n reason: `${label}: File contains manual edits`,\n sourceSnippet: source.content.substring(0, 200),\n targetSnippet: existingContent.substring(0, 200),\n });\n targets.push({ type, path: filePath, action: 'skip', exists: true, content: newContent, label });\n } else {\n targets.push({ type, path: filePath, action: 'update', exists: true, content: newContent, label });\n }\n } else {\n targets.push({ type, path: filePath, action: 'create', exists: false, content: newContent, label });\n }\n }\n\n return { source, targets, conflicts };\n}\n\n/**\n * Execute a sync plan — write target files.\n */\nexport function executeSyncPlan(plan: SyncPlan, cwd: string): { written: string[]; skipped: string[] } {\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const target of plan.targets) {\n if (target.action === 'skip') {\n skipped.push(target.path);\n continue;\n }\n\n const fullPath = path.join(cwd, target.path);\n const dir = path.dirname(fullPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Backup existing file\n if (target.exists && fs.existsSync(fullPath)) {\n fs.copyFileSync(fullPath, fullPath + '.backup');\n }\n\n fs.writeFileSync(fullPath, target.content, 'utf-8');\n written.push(target.path);\n }\n\n return { written, skipped };\n}\n","import ora from 'ora';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { detectContextFiles } from '../core/contextScorer.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Doctor command — Health check for your AI development setup.\n * Like `brew doctor` but for AI coding environments.\n */\n\ninterface CheckResult {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n message: string;\n fix?: string;\n}\n\nexport async function doctorCommand(): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n logger.section('🩺', 'AI Development Health Check');\n logger.blank();\n\n const checks: CheckResult[] = [];\n\n // 1. Check context files\n const contextFiles = detectContextFiles(cwd);\n const hasAgents = contextFiles.some((f) => f.type === 'agents' && f.exists);\n const hasClaude = contextFiles.some((f) => f.type === 'claude' && f.exists);\n const hasCursor = contextFiles.some((f) => f.type === 'cursorrules' && f.exists);\n const hasCopilot = contextFiles.some((f) => f.type === 'copilot' && f.exists);\n const hasSkills = contextFiles.some((f) => f.type === 'skill' && f.exists);\n\n checks.push({\n name: 'AGENTS.md',\n status: hasAgents ? 'pass' : 'fail',\n message: hasAgents ? 'Found — universal AI context file' : 'Missing — no universal context file',\n fix: hasAgents ? undefined : 'Run: repolens init',\n });\n\n checks.push({\n name: 'CLAUDE.md',\n status: hasClaude ? 'pass' : 'warn',\n message: hasClaude ? 'Found — Claude Code instructions' : 'Missing — Claude Code will use defaults',\n fix: hasClaude ? undefined : 'Run: repolens sync',\n });\n\n checks.push({\n name: '.cursorrules',\n status: hasCursor ? 'pass' : 'warn',\n message: hasCursor ? 'Found — Cursor IDE rules' : 'Missing — Cursor will use defaults',\n fix: hasCursor ? undefined : 'Run: repolens sync',\n });\n\n checks.push({\n name: 'Copilot Instructions',\n status: hasCopilot ? 'pass' : 'warn',\n message: hasCopilot ? 'Found — GitHub Copilot instructions' : 'Missing — Copilot will use defaults',\n fix: hasCopilot ? undefined : 'Run: repolens sync',\n });\n\n // 2. Check Git\n const hasGit = fs.existsSync(path.join(cwd, '.git'));\n checks.push({\n name: 'Git Repository',\n status: hasGit ? 'pass' : 'warn',\n message: hasGit ? 'Initialized' : 'Not a git repository',\n fix: hasGit ? undefined : 'Run: git init',\n });\n\n // 3. Check .gitignore\n const hasGitignore = fs.existsSync(path.join(cwd, '.gitignore'));\n let gitignoreHasEnv = false;\n if (hasGitignore) {\n const content = fs.readFileSync(path.join(cwd, '.gitignore'), 'utf-8');\n gitignoreHasEnv = content.includes('.env');\n }\n checks.push({\n name: '.gitignore',\n status: hasGitignore ? (gitignoreHasEnv ? 'pass' : 'warn') : 'warn',\n message: hasGitignore\n ? (gitignoreHasEnv ? 'Found — .env is excluded' : 'Found but .env not in ignore list')\n : 'Missing',\n fix: gitignoreHasEnv ? undefined : 'Add .env to .gitignore',\n });\n\n // 4. Check for .env files\n const envFiles = fs.readdirSync(cwd).filter((f) => f.startsWith('.env') && !f.endsWith('.example'));\n checks.push({\n name: 'Environment Files',\n status: envFiles.length === 0 ? 'pass' : 'warn',\n message: envFiles.length === 0 ? 'No .env files in root (good)' : `${envFiles.length} .env file(s) found — ensure they are gitignored`,\n });\n\n // 5. Check for README\n const hasReadme = fs.existsSync(path.join(cwd, 'README.md')) || fs.existsSync(path.join(cwd, 'readme.md'));\n checks.push({\n name: 'README.md',\n status: hasReadme ? 'pass' : 'warn',\n message: hasReadme ? 'Found' : 'Missing — add project documentation',\n });\n\n // 6. Check package.json scripts\n const pkgPath = path.join(cwd, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const hasTest = pkg.scripts?.test && pkg.scripts.test !== 'echo \"Error: no test specified\" && exit 1';\n const hasLint = pkg.scripts?.lint;\n checks.push({\n name: 'Test Script',\n status: hasTest ? 'pass' : 'warn',\n message: hasTest ? `Configured: ${pkg.scripts.test}` : 'No test script configured',\n });\n checks.push({\n name: 'Lint Script',\n status: hasLint ? 'pass' : 'warn',\n message: hasLint ? `Configured: ${pkg.scripts.lint}` : 'No lint script configured',\n });\n } catch { /* skip */ }\n }\n\n // 7. Check for context file sync status\n if (hasAgents && (hasClaude || hasCursor)) {\n const agentsFile = contextFiles.find((f) => f.type === 'agents' && f.exists);\n const claudeFile = contextFiles.find((f) => f.type === 'claude' && f.exists);\n const cursorFile = contextFiles.find((f) => f.type === 'cursorrules' && f.exists);\n\n let inSync = true;\n if (claudeFile?.exists && !claudeFile.content.includes('Synced from AGENTS.md')) {\n inSync = false;\n }\n if (cursorFile?.exists && !cursorFile.content.includes('Synced from AGENTS.md')) {\n inSync = false;\n }\n\n checks.push({\n name: 'Context Sync',\n status: inSync ? 'pass' : 'warn',\n message: inSync ? 'Context files appear to be in sync' : 'Context files may be out of sync',\n fix: inSync ? undefined : 'Run: repolens sync',\n });\n }\n\n // Display results\n let passCount = 0;\n let warnCount = 0;\n let failCount = 0;\n\n for (const check of checks) {\n const icon = check.status === 'pass' ? chalk.green('✓') : check.status === 'warn' ? chalk.yellow('⚠') : chalk.red('✗');\n const statusFn = check.status === 'pass' ? chalk.green : check.status === 'warn' ? chalk.yellow : chalk.red;\n\n logger.indent(`${icon} ${chalk.bold(check.name.padEnd(22))} ${statusFn(check.message)}`);\n if (check.fix) {\n logger.indent(chalk.dim(` Fix: ${check.fix}`), 2);\n }\n\n if (check.status === 'pass') passCount++;\n else if (check.status === 'warn') warnCount++;\n else failCount++;\n }\n\n // Summary\n logger.blank();\n logger.indent(chalk.bold('Summary:'));\n logger.indent(` ${chalk.green(`${passCount} passed`)} ${chalk.yellow(`${warnCount} warnings`)} ${chalk.red(`${failCount} failed`)}`);\n\n const healthScore = Math.round((passCount / checks.length) * 100);\n const healthBar = chalk.green('█'.repeat(Math.round(healthScore / 5))) +\n chalk.dim('░'.repeat(20 - Math.round(healthScore / 5)));\n logger.indent(` Health: ${healthBar} ${healthScore}%`);\n\n if (failCount > 0) {\n logger.blank();\n logger.indent(chalk.bold('Quick fix:'));\n logger.indent(` ${chalk.cyan('repolens init')} — Create AGENTS.md with tribal knowledge`);\n logger.indent(` ${chalk.cyan('repolens sync')} — Sync to all AI tools`);\n }\n}\n","import * as http from 'node:http';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Dashboard command — Launch a beautiful local web dashboard.\n * Provides visual context management, quality scores, and sync status.\n */\n\nexport async function dashboardCommand(options: { port?: number }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const port = options.port || 3141;\n\n logger.section('🎨', 'RepoLens Dashboard');\n logger.blank();\n\n // Build API handler\n const apiHandler = await createApiHandler(cwd);\n\n const server = http.createServer(async (req, res) => {\n const url = new URL(req.url || '/', `http://localhost:${port}`);\n\n // CORS\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(200);\n res.end();\n return;\n }\n\n // API routes\n if (url.pathname.startsWith('/api/')) {\n res.setHeader('Content-Type', 'application/json');\n try {\n const data = await apiHandler(url.pathname, cwd);\n res.writeHead(200);\n res.end(JSON.stringify(data));\n } catch (err: any) {\n res.writeHead(500);\n res.end(JSON.stringify({ error: err.message }));\n }\n return;\n }\n\n // Serve dashboard HTML\n res.setHeader('Content-Type', 'text/html');\n res.writeHead(200);\n res.end(getDashboardHTML(cwd));\n });\n\n server.listen(port, () => {\n logger.success(`Dashboard running at ${chalk.cyan(`http://localhost:${port}`)}`);\n logger.blank();\n logger.indent(chalk.dim('Press Ctrl+C to stop'));\n });\n\n server.on('error', (err: any) => {\n if (err.code === 'EADDRINUSE') {\n logger.error(`Port ${port} is in use. Try: repolens dashboard --port ${port + 1}`);\n } else {\n logger.error(err.message);\n }\n process.exit(1);\n });\n}\n\nasync function createApiHandler(cwd: string) {\n // Lazy imports to avoid loading everything on startup\n const { scanRepository } = await import('../core/repoScanner.js');\n const { detectFramework } = await import('../core/frameworkDetector.js');\n const { classifyFiles } = await import('../core/fileClassifier.js');\n const { analyzeArchitecture } = await import('../core/architectureAnalyzer.js');\n const { detectRisks } = await import('../core/riskDetector.js');\n const { detectContextFiles, scoreContextFile } = await import('../core/contextScorer.js');\n const { readCodeContents, summarizeContents } = await import('../core/contentReader.js');\n\n // Cache results\n let cache: Record<string, { data: any; time: number }> = {};\n const CACHE_TTL = 30_000; // 30s cache\n\n return async (pathname: string, projectCwd: string) => {\n const now = Date.now();\n if (cache[pathname] && (now - cache[pathname].time) < CACHE_TTL) {\n return cache[pathname].data;\n }\n\n let data: any;\n\n switch (pathname) {\n case '/api/overview': {\n const scan = await scanRepository(projectCwd);\n const fw = detectFramework(projectCwd);\n const { byCategory } = classifyFiles(scan.fileTree);\n const arch = analyzeArchitecture(byCategory, fw.framework);\n data = { scan: { ...scan, fileTree: scan.fileTree.slice(0, 50) }, framework: fw, architecture: arch };\n break;\n }\n case '/api/context': {\n const scan = await scanRepository(projectCwd);\n const contextFiles = detectContextFiles(projectCwd);\n const scored = contextFiles\n .filter((f) => f.exists)\n .map((f) => ({\n ...f,\n content: f.content.substring(0, 5000),\n score: scoreContextFile(f.content, scan.fileTree),\n }));\n const missing = contextFiles.filter((f) => !f.exists).map((f) => ({ type: f.type, path: f.path }));\n data = { files: scored, missing };\n break;\n }\n case '/api/risks': {\n const risks = await detectRisks(projectCwd);\n data = risks;\n break;\n }\n case '/api/content': {\n const contents = await readCodeContents(projectCwd);\n data = summarizeContents(contents);\n break;\n }\n default:\n data = { error: 'Unknown endpoint' };\n }\n\n cache[pathname] = { data, time: now };\n return data;\n };\n}\n\nfunction getDashboardHTML(cwd: string): string {\n const projectName = path.basename(cwd);\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>RepoLens AI — ${projectName}</title>\n<link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap\" rel=\"stylesheet\">\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\n:root{--bg:#0a0a0f;--surface:#12121a;--surface2:#1a1a28;--surface3:#222236;--border:#2a2a44;--text:#e8e8f0;--text2:#9898b0;--text3:#606080;--accent:#6366f1;--accent2:#818cf8;--green:#22c55e;--yellow:#eab308;--red:#ef4444;--cyan:#06b6d4;--gradient:linear-gradient(135deg,#6366f1,#8b5cf6,#06b6d4)}\nbody{font-family:'Inter',system-ui,sans-serif;background:var(--bg);color:var(--text);min-height:100vh;overflow-x:hidden}\n.header{position:sticky;top:0;z-index:100;background:rgba(10,10,15,0.85);backdrop-filter:blur(20px);border-bottom:1px solid var(--border);padding:12px 32px;display:flex;align-items:center;justify-content:space-between}\n.logo{font-size:20px;font-weight:800;background:var(--gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent;display:flex;align-items:center;gap:10px}\n.logo span{font-size:24px;-webkit-text-fill-color:initial}\n.project-name{font-size:14px;color:var(--text2);font-weight:400}\n.main{max-width:1400px;margin:0 auto;padding:24px 32px}\n.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:20px;margin-bottom:24px}\n.card{background:var(--surface);border:1px solid var(--border);border-radius:16px;padding:24px;transition:all 0.3s ease}\n.card:hover{border-color:var(--accent);box-shadow:0 0 30px rgba(99,102,241,0.1)}\n.card-title{font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:1.5px;color:var(--text3);margin-bottom:16px;display:flex;align-items:center;gap:8px}\n.stat{font-size:42px;font-weight:800;background:var(--gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent;line-height:1}\n.stat-label{font-size:13px;color:var(--text2);margin-top:6px}\n.score-ring{width:120px;height:120px;position:relative;margin:0 auto}\n.score-ring svg{transform:rotate(-90deg)}\n.score-ring circle{fill:none;stroke-width:8;stroke-linecap:round}\n.score-ring .bg{stroke:var(--surface3)}\n.score-ring .fg{transition:stroke-dashoffset 1s ease}\n.score-value{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:28px;font-weight:800}\n.score-grade{font-size:14px;color:var(--text2);text-align:center;margin-top:8px}\n.bar-chart{display:flex;flex-direction:column;gap:10px}\n.bar-item{display:flex;align-items:center;gap:12px}\n.bar-label{font-size:12px;color:var(--text2);width:120px;text-align:right;flex-shrink:0}\n.bar-track{flex:1;height:8px;background:var(--surface3);border-radius:4px;overflow:hidden}\n.bar-fill{height:100%;border-radius:4px;transition:width 1s ease}\n.bar-value{font-size:12px;font-weight:600;width:40px;flex-shrink:0}\n.file-list{list-style:none;max-height:300px;overflow-y:auto}\n.file-list li{padding:8px 12px;font-size:13px;color:var(--text2);border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px}\n.file-list li:hover{background:var(--surface2)}\n.tag{display:inline-block;padding:2px 8px;border-radius:6px;font-size:11px;font-weight:600}\n.tag.pass{background:rgba(34,197,94,0.15);color:var(--green)}\n.tag.warn{background:rgba(234,179,8,0.15);color:var(--yellow)}\n.tag.fail{background:rgba(239,68,68,0.15);color:var(--red)}\n.tag.missing{background:rgba(96,96,128,0.15);color:var(--text3)}\n.issues-list{list-style:none;max-height:250px;overflow-y:auto}\n.issues-list li{padding:10px 12px;font-size:13px;border-bottom:1px solid var(--border);display:flex;gap:8px;align-items:flex-start}\n.issue-icon{flex-shrink:0;margin-top:2px}\n.section-title{font-size:18px;font-weight:700;margin:32px 0 16px;display:flex;align-items:center;gap:10px}\n.context-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px}\n.context-card{background:var(--surface2);border:1px solid var(--border);border-radius:12px;padding:16px;text-align:center;transition:all 0.3s}\n.context-card:hover{border-color:var(--accent)}\n.context-card .type{font-size:14px;font-weight:700;margin-bottom:4px}\n.context-card .status{font-size:12px;color:var(--text3)}\n.loading{display:flex;align-items:center;justify-content:center;padding:40px;color:var(--text3)}\n.spinner{width:24px;height:24px;border:3px solid var(--surface3);border-top-color:var(--accent);border-radius:50%;animation:spin 0.8s linear infinite;margin-right:12px}\n@keyframes spin{to{transform:rotate(360deg)}}\n.fade-in{animation:fadeIn 0.5s ease}\n@keyframes fadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n.empty{text-align:center;padding:32px;color:var(--text3)}\n.footer{text-align:center;padding:24px;color:var(--text3);font-size:12px;border-top:1px solid var(--border);margin-top:40px}\n</style>\n</head>\n<body>\n<div class=\"header\">\n <div class=\"logo\"><span>🔍</span> RepoLens AI <span class=\"project-name\">— ${projectName}</span></div>\n <div style=\"color:var(--text3);font-size:12px\">v2.0 · Context Intelligence Platform</div>\n</div>\n<div class=\"main\" id=\"app\">\n <div class=\"loading\" id=\"loading\"><div class=\"spinner\"></div>Analyzing your codebase...</div>\n</div>\n<script>\nconst API = '';\nlet data = {};\n\nasync function fetchAll() {\n try {\n const [overview, context, risks, content] = await Promise.all([\n fetch(API+'/api/overview').then(r=>r.json()),\n fetch(API+'/api/context').then(r=>r.json()),\n fetch(API+'/api/risks').then(r=>r.json()),\n fetch(API+'/api/content').then(r=>r.json()),\n ]);\n data = { overview, context, risks, content };\n render();\n } catch(e) {\n document.getElementById('app').innerHTML = '<div class=\"empty\">Failed to load data. Check terminal for errors.</div>';\n }\n}\n\nfunction scoreColor(s) { return s>=70?'var(--green)':s>=40?'var(--yellow)':'var(--red)'; }\nfunction gradeLabel(s) { return s>=90?'A+':s>=80?'A':s>=70?'B':s>=60?'C':s>=50?'D':'F'; }\nfunction ringSVG(score, size=120) {\n const r=48, c=2*Math.PI*r, off=c-(score/100)*c;\n return '<div class=\"score-ring\" style=\"width:'+size+'px;height:'+size+'px\">'+\n '<svg width=\"'+size+'\" height=\"'+size+'\" viewBox=\"0 0 '+size+' '+size+'\">'+\n '<circle class=\"bg\" cx=\"'+(size/2)+'\" cy=\"'+(size/2)+'\" r=\"'+r+'\"/>'+\n '<circle class=\"fg\" cx=\"'+(size/2)+'\" cy=\"'+(size/2)+'\" r=\"'+r+'\" stroke=\"'+scoreColor(score)+'\" stroke-dasharray=\"'+c+'\" stroke-dashoffset=\"'+off+'\"/>'+\n '</svg><div class=\"score-value\" style=\"color:'+scoreColor(score)+'\">'+score+'</div></div>'+\n '<div class=\"score-grade\">Grade: '+gradeLabel(score)+'</div>';\n}\n\nfunction render() {\n const { overview, context, risks, content } = data;\n const fw = overview.framework;\n const scan = overview.scan;\n const arch = overview.architecture;\n const bestScore = context.files.length > 0 ? Math.max(...context.files.map(f=>f.score.overall)) : 0;\n\n let html = '<div class=\"fade-in\">';\n\n // Stats row\n html += '<div class=\"grid\">';\n html += '<div class=\"card\"><div class=\"card-title\">📊 Project</div>';\n html += '<div class=\"stat\">'+scan.totalFiles+'</div><div class=\"stat-label\">files · '+fw.framework+' ('+fw.language+')</div>';\n html += '<div style=\"margin-top:12px;font-size:13px;color:var(--text2)\">'+arch.style+'</div></div>';\n\n html += '<div class=\"card\"><div class=\"card-title\">🧠 Code Intelligence</div>';\n html += '<div class=\"stat\">'+content.totalFunctions+'</div><div class=\"stat-label\">functions · '+content.totalClasses+' classes · '+content.totalLinesOfCode+' LOC</div>';\n html += '<div style=\"margin-top:12px;font-size:13px;color:var(--text2)\">'+content.totalImports+' imports · '+content.totalTodoFixmes+' TODOs</div></div>';\n\n html += '<div class=\"card\"><div class=\"card-title\">⚠️ Risks</div>';\n const riskTotal = risks.summary.high + risks.summary.medium + risks.summary.low;\n html += '<div class=\"stat\" style=\"-webkit-text-fill-color:'+(risks.summary.high>0?'var(--red)':'var(--green)')+'\">'+riskTotal+'</div>';\n html += '<div class=\"stat-label\"><span style=\"color:var(--red)\">'+risks.summary.high+' high</span> · <span style=\"color:var(--yellow)\">'+risks.summary.medium+' medium</span> · <span style=\"color:var(--green)\">'+risks.summary.low+' low</span></div></div>';\n html += '</div>';\n\n // Context Quality Section\n html += '<div class=\"section-title\">🎯 AI Context Quality</div>';\n html += '<div class=\"grid\">';\n\n if (context.files.length > 0) {\n for (const f of context.files) {\n const s = f.score;\n html += '<div class=\"card\">';\n html += '<div class=\"card-title\">'+f.path+'</div>';\n html += ringSVG(s.overall);\n html += '<div class=\"bar-chart\" style=\"margin-top:16px\">';\n const metrics = [\n ['Specificity', s.breakdown.specificity],\n ['Coverage', s.breakdown.coverage],\n ['Conciseness', s.breakdown.conciseness],\n ['Freshness', s.breakdown.freshness],\n ['Tribal Knowledge', s.breakdown.tribalKnowledge]\n ];\n for (const [label, val] of metrics) {\n html += '<div class=\"bar-item\"><div class=\"bar-label\">'+label+'</div>';\n html += '<div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:'+val+'%;background:'+scoreColor(val)+'\"></div></div>';\n html += '<div class=\"bar-value\" style=\"color:'+scoreColor(val)+'\">'+val+'</div></div>';\n }\n html += '</div>';\n // Issues\n if (s.issues.length > 0) {\n html += '<div style=\"margin-top:16px;font-size:13px;font-weight:600;color:var(--text3)\">Issues ('+s.issues.length+')</div>';\n html += '<ul class=\"issues-list\">';\n for (const issue of s.issues.slice(0,8)) {\n const ic = issue.severity==='error'?'🔴':issue.severity==='warning'?'🟡':'🔵';\n html += '<li><span class=\"issue-icon\">'+ic+'</span><span>'+issue.message+'</span></li>';\n }\n html += '</ul>';\n }\n html += '</div>';\n }\n } else {\n html += '<div class=\"card\" style=\"grid-column:1/-1\"><div class=\"empty\">No context files found. Run <code>repolens init</code> to create one.</div></div>';\n }\n html += '</div>';\n\n // Context Files Overview\n html += '<div class=\"section-title\">📁 Context Files Status</div>';\n html += '<div class=\"context-grid\">';\n const allTypes = [{type:'agents',label:'AGENTS.md',desc:'Universal'},{type:'claude',label:'CLAUDE.md',desc:'Claude Code'},{type:'cursorrules',label:'.cursorrules',desc:'Cursor IDE'},{type:'copilot',label:'copilot-instructions',desc:'GitHub Copilot'}];\n for (const t of allTypes) {\n const f = context.files.find(x=>x.type===t.type);\n const m = context.missing.find(x=>x.type===t.type);\n const exists = !!f;\n html += '<div class=\"context-card\">';\n html += '<div class=\"type\">'+t.label+'</div>';\n html += '<div class=\"status\">'+t.desc+'</div>';\n html += '<div style=\"margin-top:8px\"><span class=\"tag '+(exists?'pass':'missing')+'\">'+(exists?'✓ Active':'✗ Missing')+'</span></div>';\n if (f) html += '<div style=\"margin-top:6px;font-size:12px;color:var(--text3)\">Score: '+f.score.overall+'/100</div>';\n html += '</div>';\n }\n html += '</div>';\n\n // Risks\n if (risks.risks.length > 0) {\n html += '<div class=\"section-title\">🛡️ Risk Details</div>';\n html += '<div class=\"card\"><ul class=\"issues-list\">';\n for (const r of risks.risks.slice(0,15)) {\n const ic = r.level==='high'?'🔴':r.level==='medium'?'🟡':'🟢';\n html += '<li><span class=\"issue-icon\">'+ic+'</span><span>'+r.message+(r.file?' <span style=\"color:var(--text3)\">— '+r.file+'</span>':'')+'</span></li>';\n }\n html += '</ul></div>';\n }\n\n // Largest Files\n if (content.largestFiles.length > 0) {\n html += '<div class=\"section-title\">📏 Largest Files</div>';\n html += '<div class=\"card\"><div class=\"bar-chart\">';\n const maxLines = content.largestFiles[0]?.lines || 1;\n for (const f of content.largestFiles.slice(0,8)) {\n const pct = Math.round((f.lines/maxLines)*100);\n html += '<div class=\"bar-item\"><div class=\"bar-label\" style=\"width:200px;font-size:11px\" title=\"'+f.path+'\">'+f.path.split('/').pop()+'</div>';\n html += '<div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:'+pct+'%;background:var(--accent2)\"></div></div>';\n html += '<div class=\"bar-value\" style=\"color:var(--text2)\">'+f.lines+'</div></div>';\n }\n html += '</div></div>';\n }\n\n html += '<div class=\"footer\">RepoLens AI v2.0 · The AI Context Intelligence Platform · <a href=\"https://github.com/repolens/repolens-ai\" style=\"color:var(--accent)\">GitHub</a></div>';\n html += '</div>';\n\n document.getElementById('app').innerHTML = html;\n}\n\nfetchAll();\n</script>\n</body>\n</html>`;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as readline from 'node:readline';\nimport { getAllTemplates, getTemplateById, searchTemplates, detectBestTemplate } from '../templates/frameworkTemplates.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Templates command — Browse and apply curated AGENTS.md templates.\n * Pre-built templates with real tribal knowledge for 15+ frameworks.\n */\n\nexport async function templatesCommand(options: { search?: string; apply?: string; list?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const allTemplates = getAllTemplates();\n\n // Mode 1: Apply a specific template\n if (options.apply) {\n const template = getTemplateById(options.apply);\n if (!template) {\n logger.error(`Template \"${options.apply}\" not found`);\n logger.blank();\n logger.indent('Available templates:');\n for (const t of allTemplates) {\n logger.indent(` ${chalk.cyan(t.id.padEnd(18))} ${t.name}`, 1);\n }\n return;\n }\n\n const outputPath = path.join(cwd, 'AGENTS.md');\n if (fs.existsSync(outputPath)) {\n fs.copyFileSync(outputPath, outputPath + '.backup');\n logger.info('Existing AGENTS.md backed up to AGENTS.md.backup');\n }\n\n fs.writeFileSync(outputPath, template.content, 'utf-8');\n logger.success(`Applied template: ${chalk.bold(template.name)}`);\n logger.blank();\n logger.indent(chalk.bold('Next steps:'));\n logger.indent(` ${chalk.cyan('repolens lint')} — Check quality score`, 1);\n logger.indent(` ${chalk.cyan('repolens sync')} — Sync to CLAUDE.md & .cursorrules`, 1);\n logger.indent(chalk.dim(' Edit AGENTS.md to add your project-specific gotchas and decisions.'));\n return;\n }\n\n // Mode 2: Search templates\n if (options.search) {\n const results = searchTemplates(options.search);\n if (results.length === 0) {\n logger.warn(`No templates found for \"${options.search}\"`);\n logger.indent(chalk.dim(`Try: repolens templates --list`));\n return;\n }\n\n logger.section('🔎', `Search Results for \"${options.search}\"`);\n for (const t of results) {\n logger.blank();\n logger.indent(`${chalk.bold.cyan(t.id)} — ${chalk.bold(t.name)}`);\n logger.indent(chalk.dim(t.description), 2);\n logger.indent(chalk.dim(`Tags: ${t.tags.join(', ')}`), 2);\n logger.indent(chalk.dim(`Apply: repolens templates --apply ${t.id}`), 2);\n }\n return;\n }\n\n // Mode 3: List all (default) + auto-detect recommendation\n logger.section('📚', `Template Library (${allTemplates.length} templates)`);\n logger.indent(chalk.dim('Curated AGENTS.md templates with real tribal knowledge for popular frameworks.'));\n logger.blank();\n\n // Auto-detect framework and recommend\n const fw = detectFramework(cwd);\n const recommended = detectBestTemplate(fw.framework);\n\n if (recommended) {\n logger.indent(chalk.bold.green(`⭐ Recommended for your project (${fw.framework}):`));\n logger.indent(` ${chalk.bold.cyan(recommended.id)} — ${recommended.name}`, 1);\n logger.indent(` ${chalk.dim(`Apply: repolens templates --apply ${recommended.id}`)}`, 1);\n logger.blank();\n logger.indent(chalk.dim('─'.repeat(50)));\n logger.blank();\n }\n\n // List all\n const categories: Record<string, typeof allTemplates> = {};\n for (const t of allTemplates) {\n const cat = t.tags.includes('fullstack') ? '🌐 Fullstack' :\n t.tags.includes('frontend') || t.tags.includes('spa') ? '🎨 Frontend' :\n t.tags.includes('backend') || t.tags.includes('api') ? '⚙️ Backend' :\n t.tags.includes('mobile') ? '📱 Mobile' :\n t.tags.includes('static') || t.tags.includes('beginner') ? '📄 Static / Beginner' :\n '🔧 Other';\n if (!categories[cat]) categories[cat] = [];\n categories[cat].push(t);\n }\n\n for (const [cat, templates] of Object.entries(categories)) {\n logger.indent(chalk.bold(cat));\n for (const t of templates) {\n const isRecommended = recommended && t.id === recommended.id;\n const prefix = isRecommended ? chalk.green('⭐') : ' ';\n logger.indent(` ${prefix} ${chalk.cyan(t.id.padEnd(18))} ${t.name}`, 1);\n logger.indent(` ${chalk.dim(t.description)}`, 2);\n }\n logger.blank();\n }\n\n logger.indent(chalk.bold('Usage:'));\n logger.indent(` ${chalk.cyan('repolens templates --apply nextjs')} Apply a template`, 1);\n logger.indent(` ${chalk.cyan('repolens templates --search react')} Search templates`, 1);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport { detectContextFiles, scoreContextFile } from '../core/contextScorer.js';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Fix command — Auto-fix detected issues in AI context files.\n * Removes generic rules, adds missing sections, and improves quality.\n */\n\n// Generic rules patterns to remove (exact line removals)\nconst GENERIC_LINE_PATTERNS: RegExp[] = [\n /^\\d+\\.\\s*\\*\\*Analyze before editing\\*\\*/,\n /^\\d+\\.\\s*\\*\\*Minimal safe changes\\*\\*/,\n /^\\d+\\.\\s*\\*\\*No unnecessary rewrites\\*\\*/,\n /^\\d+\\.\\s*\\*\\*Preserve architecture\\*\\*/,\n /^\\d+\\.\\s*\\*\\*Keep files focused\\*\\*/,\n /^\\d+\\.\\s*\\*\\*Follow \\w+ conventions\\*\\*/,\n /^-\\s*Never commit secrets/i,\n /^-\\s*Protect \\.?env files/i,\n /^-\\s*Validate all input/i,\n /^-\\s*Never trust user input/i,\n /^-\\s*Use parameterized queries/i,\n /^-\\s*No eval\\(\\)/i,\n /^-\\s*Preserve auth middleware/i,\n /^\\d+\\.\\s*Read relevant files before editing/,\n /^\\d+\\.\\s*Check for existing patterns before/,\n /^\\d+\\.\\s*Summarize all changes made/,\n /^\\d+\\.\\s*Flag any potential breaking changes/,\n /^\\d+\\.\\s*Do not modify configuration files/,\n /^-\\s*\\[\\s*[x ]?\\s*\\]\\s*Code compiles without errors/,\n /^-\\s*\\[\\s*[x ]?\\s*\\]\\s*Existing tests pass/,\n /^-\\s*\\[\\s*[x ]?\\s*\\]\\s*No secrets in source code/,\n /^-\\s*\\[\\s*[x ]?\\s*\\]\\s*Changes are minimal/,\n /^-\\s*\\[\\s*[x ]?\\s*\\]\\s*Architecture patterns are preserved/,\n /^-\\s*\\[\\s*[x ]?\\s*\\]\\s*Changes are summarized/,\n /^\\d+\\.\\s*\\*\\*Never commit secrets\\*\\*/,\n /^\\d+\\.\\s*\\*\\*Protect \\.?env\\*\\*/i,\n /^\\d+\\.\\s*\\*\\*Validate all input\\*\\*/i,\n /^\\d+\\.\\s*\\*\\*No eval\\(\\)\\*\\*/i,\n /^\\d+\\.\\s*\\*\\*Preserve auth middleware\\*\\*/i,\n /^\\d+\\.\\s*\\*\\*Use parameterized queries\\*\\*/i,\n];\n\n// Sections to remove entirely (generic boilerplate)\nconst GENERIC_SECTIONS = [\n 'Coding Rules',\n 'Security Rules',\n 'Workflow Rules',\n 'Definition of Done',\n];\n\nexport async function fixCommand(options: { dryRun?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const spinner = ora('Analyzing context files...').start();\n\n try {\n const scan = await scanRepository(cwd);\n const contextFiles = detectContextFiles(cwd);\n const existing = contextFiles.filter((f) => f.exists);\n\n if (existing.length === 0) {\n spinner.fail('No context files found');\n logger.indent(`Create one: ${chalk.cyan('repolens init')}`);\n return;\n }\n\n spinner.succeed(`Found ${existing.length} context file(s)`);\n\n let totalFixes = 0;\n\n for (const file of existing) {\n const scoreBefore = scoreContextFile(file.content, scan.fileTree);\n\n // Skip if already good\n if (scoreBefore.overall >= 80 && scoreBefore.genericRulesCount === 0) {\n logger.success(`${file.path} — Score ${scoreBefore.overall}/100 — No fixes needed`);\n continue;\n }\n\n logger.section('🔧', `Fixing: ${file.path}`);\n logger.indent(chalk.dim(`Current score: ${scoreBefore.overall}/100`));\n\n let lines = file.content.split('\\n');\n let removedLines = 0;\n let removedSections = 0;\n\n // Step 1: Remove generic lines\n const filteredLines: string[] = [];\n let skipSection = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Check if this starts a generic section to remove\n if (line.startsWith('## ')) {\n const sectionName = line.replace('## ', '').trim();\n if (GENERIC_SECTIONS.includes(sectionName)) {\n skipSection = true;\n removedSections++;\n continue;\n } else {\n skipSection = false;\n }\n }\n\n // Skip lines in generic sections\n if (skipSection && !line.startsWith('## ')) continue;\n if (skipSection && line.startsWith('## ')) skipSection = false;\n\n // Check if line is a generic rule\n let isGeneric = false;\n for (const pattern of GENERIC_LINE_PATTERNS) {\n if (pattern.test(trimmed)) {\n isGeneric = true;\n removedLines++;\n break;\n }\n }\n\n if (!isGeneric) {\n filteredLines.push(line);\n }\n }\n\n // Step 2: Clean up empty sections (## Header with nothing after it)\n const cleanedLines: string[] = [];\n for (let i = 0; i < filteredLines.length; i++) {\n const line = filteredLines[i];\n // If this is a section header and next non-empty line is another header, skip\n if (line.startsWith('## ')) {\n let nextContentIndex = i + 1;\n while (nextContentIndex < filteredLines.length && filteredLines[nextContentIndex].trim() === '') {\n nextContentIndex++;\n }\n if (nextContentIndex < filteredLines.length && filteredLines[nextContentIndex].startsWith('## ')) {\n // Empty section — skip it\n removedSections++;\n continue;\n }\n if (nextContentIndex >= filteredLines.length) {\n // Section at end of file with no content — skip\n removedSections++;\n continue;\n }\n }\n cleanedLines.push(line);\n }\n\n // Step 3: Remove consecutive blank lines (more than 2)\n const finalLines: string[] = [];\n let blankCount = 0;\n for (const line of cleanedLines) {\n if (line.trim() === '') {\n blankCount++;\n if (blankCount <= 2) finalLines.push(line);\n } else {\n blankCount = 0;\n finalLines.push(line);\n }\n }\n\n const newContent = finalLines.join('\\n');\n const scoreAfter = scoreContextFile(newContent, scan.fileTree);\n const fixes = removedLines + removedSections;\n totalFixes += fixes;\n\n if (fixes === 0) {\n logger.indent(chalk.dim('No auto-fixable issues found'));\n continue;\n }\n\n // Report\n logger.indent(`${chalk.green('✓')} Removed ${chalk.bold(String(removedLines))} generic rule lines`);\n logger.indent(`${chalk.green('✓')} Removed ${chalk.bold(String(removedSections))} boilerplate sections`);\n logger.indent(`Score: ${chalk.red(String(scoreBefore.overall))} → ${chalk.green(String(scoreAfter.overall))}/100`);\n\n // Write\n if (!options.dryRun) {\n const fullPath = path.join(cwd, file.path);\n fs.copyFileSync(fullPath, fullPath + '.backup');\n fs.writeFileSync(fullPath, newContent, 'utf-8');\n logger.success('Fixed and saved (backup created)');\n } else {\n logger.info('Dry run — no files changed');\n }\n }\n\n logger.blank();\n if (totalFixes > 0) {\n logger.indent(chalk.bold(`Total fixes: ${totalFixes}`));\n logger.blank();\n logger.indent(chalk.bold('Next steps:'));\n logger.indent(` ${chalk.cyan('repolens lint')} — Verify improved scores`, 1);\n logger.indent(` ${chalk.cyan('repolens sync')} — Sync fixes to all context files`, 1);\n logger.indent(chalk.dim(' Add gotchas and tribal knowledge to boost your score further.'));\n } else {\n logger.success('All context files are clean — no fixes needed');\n }\n\n } catch (error) {\n spinner.fail('Fix failed');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Skills command — Generate .cursor/skills/ files for common vibe coding tasks.\n * Skills are task-specific instructions that help AI agents perform complex tasks correctly.\n */\n\ninterface Skill {\n id: string;\n filename: string;\n name: string;\n description: string;\n frameworks: string[]; // Empty = universal\n content: string;\n}\n\nconst SKILLS: Skill[] = [\n {\n id: 'new-page',\n filename: 'create-new-page.md',\n name: 'Create New Page',\n description: 'Instructions for creating a new page/route with proper structure',\n frameworks: ['nextjs', 'react', 'vue', 'nuxt'],\n content: `# Skill: Create New Page\n\nWhen asked to create a new page or route:\n\n1. **Check routing pattern:** Look at existing pages in \\`app/\\` or \\`pages/\\` to match the convention.\n2. **Copy closest existing page** as a starting point — don't write from scratch.\n3. **Include:** SEO metadata (title, description), loading state, error boundary.\n4. **Use existing components** from \\`components/\\` — don't create new ones if similar exist.\n5. **Add to navigation** if the page should be accessible from the menu.\n6. **Mobile-responsive** by default — test at 375px width mentally.\n7. **Keep server components** where possible (Next.js/Nuxt) — only add \"use client\" when needed.\n\n## Checklist\n- [ ] Page renders without errors\n- [ ] SEO metadata is set\n- [ ] Page is responsive\n- [ ] Loading state exists\n- [ ] Navigation is updated (if needed)`,\n },\n {\n id: 'new-api',\n filename: 'create-api-endpoint.md',\n name: 'Create API Endpoint',\n description: 'Instructions for creating a proper REST API endpoint',\n frameworks: ['express', 'nextjs', 'nestjs', 'fastapi', 'django'],\n content: `# Skill: Create API Endpoint\n\nWhen asked to create a new API endpoint:\n\n1. **Follow existing pattern:** Check other endpoints for the naming and structure convention.\n2. **Input validation:** Always validate request body/params before processing.\n3. **Error handling:** Wrap in try/catch, return proper HTTP status codes.\n4. **Response format:** Match existing response format (usually \\`{ success, data, error }\\`).\n5. **Authentication:** Apply auth middleware if the endpoint needs protection.\n6. **HTTP methods:** GET for reads, POST for creates, PUT/PATCH for updates, DELETE for deletes.\n\n## Status Codes\n- 200: Success (GET, PUT)\n- 201: Created (POST)\n- 204: No Content (DELETE)\n- 400: Bad Request (validation error)\n- 401: Unauthorized (not logged in)\n- 403: Forbidden (no permission)\n- 404: Not Found\n- 500: Server Error (never expose details)\n\n## Checklist\n- [ ] Input is validated\n- [ ] Proper HTTP method and status codes\n- [ ] Auth middleware applied if needed\n- [ ] Error responses are user-friendly\n- [ ] No sensitive data in response`,\n },\n {\n id: 'add-auth',\n filename: 'add-authentication.md',\n name: 'Add Authentication',\n description: 'Instructions for implementing user authentication safely',\n frameworks: [],\n content: `# Skill: Add Authentication\n\nWhen asked to add or modify authentication:\n\n## Critical Rules (NEVER break these)\n1. **NEVER store passwords in plain text** — always hash with bcrypt/argon2.\n2. **NEVER put secrets in frontend code** — API keys go in .env, not in source.\n3. **NEVER disable CSRF protection** without understanding the implications.\n4. **NEVER trust client-side auth state** — always verify on the server.\n\n## Implementation Steps\n1. Check if an auth library is already installed (NextAuth, Passport, etc.).\n2. If yes — extend the existing setup, don't create a parallel system.\n3. If no — recommend a battle-tested library, don't roll your own.\n4. Store session/JWT secrets in environment variables.\n5. Add auth middleware to ALL protected routes.\n6. Implement proper logout (clear session/token on BOTH client and server).\n\n## Checklist\n- [ ] Passwords are hashed (never plain text)\n- [ ] Secrets are in .env (not in code)\n- [ ] Protected routes require authentication\n- [ ] Login/logout flows are complete\n- [ ] Session expiration is configured`,\n },\n {\n id: 'add-db',\n filename: 'add-database.md',\n name: 'Add Database Integration',\n description: 'Instructions for adding database with proper ORM setup',\n frameworks: [],\n content: `# Skill: Add Database Integration\n\nWhen asked to add or modify database integration:\n\n1. **Check existing ORM/driver:** Is Prisma, TypeORM, Sequelize, Mongoose, or Drizzle already installed?\n2. **Don't mix ORMs** — use the one already in the project.\n3. **Migrations:** Always create a migration for schema changes (never modify DB manually).\n4. **Connection pooling:** Use a connection pool, not individual connections.\n5. **Environment variables:** Database URL goes in .env, never hardcoded.\n\n## SQL Injection Prevention\n- ALWAYS use parameterized queries or ORM methods\n- NEVER concatenate user input into SQL strings\n- NEVER use \\`raw()\\` or \\`execute()\\` with user-provided values\n\n## Checklist\n- [ ] Using existing ORM (not adding a new one)\n- [ ] Migration created for schema changes\n- [ ] Connection string in .env\n- [ ] No raw SQL with user input\n- [ ] Proper indexes on frequently queried columns`,\n },\n {\n id: 'responsive-ui',\n filename: 'responsive-design.md',\n name: 'Responsive UI Design',\n description: 'Instructions for building mobile-friendly responsive interfaces',\n frameworks: [],\n content: `# Skill: Responsive UI Design\n\nWhen building or modifying UI components:\n\n## Mobile-First Approach\n1. **Design for mobile first** (375px), then expand for tablet (768px) and desktop (1024px+).\n2. **Test at these breakpoints:** 375px, 768px, 1024px, 1440px.\n3. **Touch targets:** Minimum 44x44px for buttons and links on mobile.\n4. **Font sizes:** Minimum 16px body text (prevents iOS zoom on input focus).\n\n## Layout Rules\n- Use **flexbox** or **CSS Grid** — never use float for layout.\n- Use **relative units** (rem, %, vh/vw) — avoid fixed pixel widths for containers.\n- **Images:** Always set \\`max-width: 100%\\` and use proper aspect ratios.\n- **Navigation:** Hamburger menu on mobile, horizontal nav on desktop.\n\n## Common Mistakes to Avoid\n- ❌ Fixed widths on containers (\\`width: 500px\\`)\n- ❌ Horizontal scrolling on mobile\n- ❌ Text too small to read on mobile\n- ❌ Buttons too small to tap\n- ❌ Hiding critical content on mobile\n- ✅ Fluid widths (\\`max-width: 500px; width: 100%\\`)\n- ✅ Stack columns on mobile, side-by-side on desktop\n- ✅ Readable text at every breakpoint`,\n },\n {\n id: 'deploy',\n filename: 'deployment-guide.md',\n name: 'Deployment Guide',\n description: 'Instructions for deploying to production safely',\n frameworks: [],\n content: `# Skill: Deployment\n\nWhen preparing for deployment or asked to deploy:\n\n## Pre-Deploy Checklist\n1. **Environment variables:** All secrets set in production env (not in code).\n2. **Build succeeds:** \\`npm run build\\` completes without errors.\n3. **No console.log:** Remove debug logs from production code.\n4. **Error handling:** All API routes have proper error responses.\n5. **HTTPS:** Ensure production uses HTTPS, not HTTP.\n\n## Platform-Specific\n- **Vercel:** Runs \\`npm run build\\` automatically. Set env vars in dashboard.\n- **Railway/Render:** Set \\`PORT\\` env var. Add \\`start\\` script to package.json.\n- **Docker:** Use multi-stage builds. Don't include node_modules in image.\n- **VPS:** Use PM2 or systemd for process management. Set up Nginx reverse proxy.\n\n## Things That Break in Production\n- Hardcoded \\`localhost\\` URLs\n- Missing environment variables\n- CORS not configured for production domain\n- Database connection limits exceeded\n- Large file uploads without size limits\n- Missing rate limiting on public APIs`,\n },\n {\n id: 'debug',\n filename: 'debugging-guide.md',\n name: 'Debugging Guide',\n description: 'Systematic approach to debugging issues in vibe-coded projects',\n frameworks: [],\n content: `# Skill: Debugging\n\nWhen something doesn't work:\n\n## Step-by-Step Debug Process\n1. **Read the error message** — it usually tells you exactly what's wrong.\n2. **Check the terminal/console** — errors appear in the terminal (backend) or browser console (frontend).\n3. **Check recent changes** — what did you change last? That's likely the cause.\n4. **Check environment variables** — missing .env values cause 90% of \"works locally, fails in production\" issues.\n5. **Check imports** — wrong import paths are the #1 cause of \"module not found\" errors.\n6. **Google the exact error message** — someone else has had this problem.\n\n## Common Fixes\n| Symptom | Likely Fix |\n|---|---|\n| \"Module not found\" | Check import path, run \\`npm install\\` |\n| \"Cannot read property of undefined\" | The variable is null — add a null check |\n| \"CORS error\" | Add CORS middleware to your backend |\n| \"Connection refused\" | Backend server isn't running, or wrong port |\n| \"401 Unauthorized\" | Auth token expired or missing |\n| Blank page | Check browser console for errors |\n| \"Hydration mismatch\" | Server and client render different HTML |\n\n## When AI Made a Mistake\n1. Don't ask AI to \"fix it\" without context — describe WHAT went wrong.\n2. Share the EXACT error message.\n3. Tell AI what you EXPECTED to happen vs what ACTUALLY happened.\n4. If AI keeps making the same mistake, revert and try a different approach.`,\n },\n];\n\n/**\n * Generate skill files for the project.\n */\nexport async function skillsCommand(options: { list?: boolean; all?: boolean }): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n const fw = detectFramework(cwd);\n const fwLower = fw.framework.toLowerCase();\n\n // Filter skills relevant to this project\n const relevant = SKILLS.filter((s) =>\n s.frameworks.length === 0 || // Universal skills\n s.frameworks.some((f) => fwLower.includes(f))\n );\n\n if (options.list) {\n logger.section('📝', `Available Skills (${relevant.length}/${SKILLS.length} relevant to your project)`);\n logger.blank();\n for (const skill of relevant) {\n const universal = skill.frameworks.length === 0;\n logger.indent(` ${chalk.cyan(skill.id.padEnd(20))} ${skill.name} ${universal ? chalk.dim('(universal)') : chalk.dim(`(${skill.frameworks.join(', ')})`)}`);\n logger.indent(` ${chalk.dim(' '.repeat(20) + skill.description)}`, 1);\n }\n logger.blank();\n logger.indent(`Generate all: ${chalk.cyan('repolens skills --all')}`);\n return;\n }\n\n // Generate skills\n const spinner = ora('Generating skill files...').start();\n\n const skillsDir = path.join(cwd, '.cursor', 'skills');\n if (!fs.existsSync(skillsDir)) {\n fs.mkdirSync(skillsDir, { recursive: true });\n }\n\n const toGenerate = options.all ? relevant : relevant.filter((s) => s.frameworks.length === 0); // Default: universal only\n let created = 0;\n\n for (const skill of toGenerate) {\n const filePath = path.join(skillsDir, skill.filename);\n if (!fs.existsSync(filePath)) {\n fs.writeFileSync(filePath, skill.content, 'utf-8');\n created++;\n }\n }\n\n spinner.succeed(`Generated ${created} skill file(s) in .cursor/skills/`);\n logger.blank();\n\n for (const skill of toGenerate) {\n const filePath = path.join(skillsDir, skill.filename);\n const exists = fs.existsSync(filePath);\n const icon = exists ? chalk.green('✓') : chalk.yellow('⊘');\n logger.indent(`${icon} ${skill.filename.padEnd(30)} ${chalk.dim(skill.name)}`);\n }\n\n logger.blank();\n logger.indent(chalk.bold('How skills work:'));\n logger.indent(chalk.dim(' Cursor IDE reads .cursor/skills/ files to learn task-specific instructions.'), 1);\n logger.indent(chalk.dim(' AI agents use these skills when performing matching tasks.'), 1);\n logger.blank();\n logger.indent(`See all available: ${chalk.cyan('repolens skills --list')}`);\n logger.indent(`Generate all: ${chalk.cyan('repolens skills --all')}`);\n}\n","import ora from 'ora';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { scanRepository } from '../core/repoScanner.js';\nimport { detectFramework } from '../core/frameworkDetector.js';\nimport { classifyFiles } from '../core/fileClassifier.js';\nimport { analyzeArchitecture } from '../core/architectureAnalyzer.js';\nimport { readCodeContents, summarizeContents } from '../core/contentReader.js';\nimport { detectContextFiles, scoreContextFile } from '../core/contextScorer.js';\nimport { createSyncPlan, executeSyncPlan } from '../core/contextSyncer.js';\nimport { extractSmartContext, generateSmartAgentsMd } from '../core/smartContext.js';\nimport { reportBrand } from '../reporters/terminalReporter.js';\nimport { logger } from '../utils/logger.js';\nimport chalk from 'chalk';\n\n/**\n * Setup command — THE ONE COMMAND for vibe coders.\n *\n * What makes this 9/10 effective:\n * 1. READS actual code (not just filenames) — functions, imports, conventions\n * 2. Extracts REAL commands from package.json scripts\n * 3. Extracts REAL env vars from .env.example\n * 4. Extracts REAL known issues from TODO/FIXME comments\n * 5. Detects REAL naming conventions from function/class names\n * 6. Finds REAL critical files by import-graph connectivity\n * 7. Merges framework-specific gotchas when available\n * 8. Syncs to 6 AI tools simultaneously\n * 9. Generates task-specific skill files\n * 10. Scores quality and shows gaps\n */\n\nexport async function setupCommand(): Promise<void> {\n const cwd = process.cwd();\n reportBrand();\n\n logger.section('🚀', 'One-Click AI Context Setup');\n logger.indent(chalk.dim('Setting up AI context for all your coding tools in one step.'));\n logger.blank();\n\n // ─── Step 1: Deep Analyze ─────────────────────────────\n const spinner = ora('Step 1/5 — Analyzing your project...').start();\n\n const scan = await scanRepository(cwd);\n const fw = detectFramework(cwd);\n const { byCategory } = classifyFiles(scan.fileTree);\n const arch = analyzeArchitecture(byCategory, fw.framework);\n\n spinner.text = 'Reading code contents...';\n const codeContents = await readCodeContents(cwd);\n const summary = summarizeContents(codeContents);\n\n spinner.text = 'Extracting smart context...';\n const smartCtx = extractSmartContext(cwd, scan, fw, arch, codeContents, summary);\n\n spinner.succeed(`Step 1/5 — ${chalk.bold(fw.framework)} project (${scan.totalFiles} files, ${summary.totalFunctions} functions, ${smartCtx.envVars.length} env vars, ${smartCtx.knownIssues.length} TODOs)`);\n\n // ─── Step 2: Smart AGENTS.md ──────────────────────────\n const spinner2 = ora('Step 2/5 — Generating smart AGENTS.md...').start();\n\n const agentsPath = path.join(cwd, 'AGENTS.md');\n\n if (fs.existsSync(agentsPath)) {\n const existing = fs.readFileSync(agentsPath, 'utf-8');\n const existingScore = scoreContextFile(existing, scan.fileTree);\n\n // Generate what a smart version would look like\n const smartContent = generateSmartAgentsMd(fw, arch, scan, summary, smartCtx);\n const smartScore = scoreContextFile(smartContent, scan.fileTree);\n\n if (smartScore.overall > existingScore.overall) {\n // Smart version is better — offer upgrade\n fs.copyFileSync(agentsPath, agentsPath + '.backup');\n fs.writeFileSync(agentsPath, smartContent, 'utf-8');\n spinner2.succeed(`Step 2/5 — Upgraded AGENTS.md (${chalk.red(`${existingScore.overall}`)} → ${chalk.green(`${smartScore.overall}/100`)} ${getGrade(smartScore.overall)})`);\n } else {\n spinner2.succeed(`Step 2/5 — AGENTS.md already high quality (${chalk.green(`${existingScore.overall}/100`)} — keeping it)`);\n }\n } else {\n const smartContent = generateSmartAgentsMd(fw, arch, scan, summary, smartCtx);\n fs.writeFileSync(agentsPath, smartContent, 'utf-8');\n const newScore = scoreContextFile(smartContent, scan.fileTree);\n spinner2.succeed(`Step 2/5 — Created smart AGENTS.md (${chalk.green(`${newScore.overall}/100`)} ${getGrade(newScore.overall)})`);\n }\n\n // Show what was extracted\n const insights: string[] = [];\n if (smartCtx.commands.length > 0) insights.push(`${smartCtx.commands.length} commands`);\n if (smartCtx.envVars.length > 0) insights.push(`${smartCtx.envVars.length} env vars`);\n if (smartCtx.gotchas.length > 0) insights.push(`${smartCtx.gotchas.length} gotchas`);\n if (smartCtx.criticalFiles.length > 0) insights.push(`${smartCtx.criticalFiles.length} critical files`);\n if (smartCtx.conventions.length > 0) insights.push(`${smartCtx.conventions.length} conventions`);\n if (smartCtx.knownIssues.length > 0) insights.push(`${smartCtx.knownIssues.length} TODOs`);\n if (insights.length > 0) {\n logger.indent(chalk.dim(` Extracted: ${insights.join(' · ')}`));\n }\n\n // ─── Step 3: Sync to all AI tools ────────────────────\n const spinner3 = ora('Step 3/5 — Syncing to 6 AI tools...').start();\n\n const agentsContent = fs.readFileSync(agentsPath, 'utf-8');\n const contextFiles = detectContextFiles(cwd);\n const agentsFile = contextFiles.find(f => f.type === 'agents');\n if (agentsFile) {\n agentsFile.content = agentsContent;\n agentsFile.exists = true;\n }\n\n const plan = createSyncPlan(\n agentsFile || { path: 'AGENTS.md', type: 'agents' as const, exists: true, content: agentsContent },\n contextFiles,\n cwd,\n );\n\n for (const target of plan.targets) {\n if (target.action === 'skip') target.action = 'update';\n }\n\n const syncResult = executeSyncPlan(plan, cwd);\n spinner3.succeed(`Step 3/5 — Synced to ${chalk.bold(String(syncResult.written.length))} AI tools`);\n\n // ─── Step 4: Generate skill files ────────────────────\n const spinner4 = ora('Step 4/5 — Creating skill files...').start();\n\n const skillsDir = path.join(cwd, '.cursor', 'skills');\n if (!fs.existsSync(skillsDir)) {\n fs.mkdirSync(skillsDir, { recursive: true });\n }\n\n let skillCount = 0;\n const skillDefs = getSmartSkills(fw.framework, smartCtx);\n for (const skill of skillDefs) {\n const skillPath = path.join(skillsDir, skill.filename);\n if (!fs.existsSync(skillPath)) {\n fs.writeFileSync(skillPath, skill.content, 'utf-8');\n skillCount++;\n }\n }\n\n spinner4.succeed(`Step 4/5 — ${skillCount > 0 ? `${skillCount} skill files created` : 'Skill files ready'} in .cursor/skills/`);\n\n // ─── Step 5: Score & Report ──────────────────────────\n const spinner5 = ora('Step 5/5 — Final scoring...').start();\n\n const finalContent = fs.readFileSync(agentsPath, 'utf-8');\n const finalScore = scoreContextFile(finalContent, scan.fileTree);\n spinner5.succeed(`Step 5/5 — Quality score: ${chalk.bold(getGradeColor(finalScore.overall, `${finalScore.overall}/100 ${getGrade(finalScore.overall)}`))}`);\n\n // ─── Final Report ────────────────────────────────────\n logger.blank();\n logger.section('✅', 'Setup Complete');\n logger.blank();\n\n // Show files\n logger.indent(chalk.bold('Files created/updated:'));\n logger.indent(` ${chalk.green('✓')} AGENTS.md ${chalk.dim('— source of truth (edit this one)')}`);\n for (const written of syncResult.written) {\n const target = plan.targets.find(t => t.path === written);\n logger.indent(` ${chalk.green('✓')} ${written} ${chalk.dim(`— ${target?.label || ''}`)}`);\n }\n logger.blank();\n\n // Show AI tools status\n logger.indent(chalk.bold('Your AI tools are now configured:'));\n const tools = [\n { name: 'Cursor IDE', file: '.cursor/rules/project.mdc', icon: '🖥️' },\n { name: 'Claude Code', file: 'CLAUDE.md', icon: '🤖' },\n { name: 'GitHub Copilot', file: '.github/copilot-instructions.md', icon: '🐙' },\n { name: 'OpenAI Codex', file: 'CODEX.md', icon: '⚡' },\n { name: 'Windsurf', file: '.windsurfrules', icon: '🏄' },\n { name: 'Antigravity', file: 'AGENTS.md', icon: '🔍' },\n ];\n\n for (const tool of tools) {\n const exists = fs.existsSync(path.join(cwd, tool.file));\n logger.indent(` ${tool.icon} ${exists ? chalk.green('✓') : chalk.red('✗')} ${tool.name}`);\n }\n\n // Show score breakdown for transparency\n logger.blank();\n logger.indent(chalk.bold('Score Breakdown:'));\n const bd = finalScore.breakdown;\n logger.indent(` Specificity ${scoreBar(bd.specificity)} ${chalk.dim('Project-specific rules')}`);\n logger.indent(` Coverage ${scoreBar(bd.coverage)} ${chalk.dim('Important areas covered')}`);\n logger.indent(` Conciseness ${scoreBar(bd.conciseness)} ${chalk.dim('Optimal length for AI')}`);\n logger.indent(` Freshness ${scoreBar(bd.freshness)} ${chalk.dim('References real files')}`);\n logger.indent(` Tribal Knowledge ${scoreBar(bd.tribalKnowledge)} ${chalk.dim('Info AI cannot infer')}`);\n\n // Next steps\n logger.blank();\n logger.indent(chalk.bold('Next steps:'));\n if (finalScore.overall < 80) {\n logger.indent(` ${chalk.yellow('→')} Run ${chalk.cyan('repolens lint')} to see specific improvements`);\n logger.indent(` ${chalk.yellow('→')} Run ${chalk.cyan('repolens fix')} to auto-fix issues`);\n }\n logger.indent(` ${chalk.dim('1.')} Edit AGENTS.md to add your team's gotchas & decisions`);\n logger.indent(` ${chalk.dim('2.')} Run ${chalk.cyan('repolens sync')} after editing to update all tools`);\n logger.indent(` ${chalk.dim('3.')} Commit all generated files to git`);\n}\n\n// ─── Helpers ──────────────────────────────────────────\n\nfunction getGrade(score: number): string {\n if (score >= 90) return 'A+';\n if (score >= 80) return 'A';\n if (score >= 70) return 'B';\n if (score >= 60) return 'C';\n if (score >= 50) return 'D';\n return 'F';\n}\n\nfunction getGradeColor(score: number, text: string): string {\n if (score >= 80) return chalk.green(text);\n if (score >= 60) return chalk.yellow(text);\n return chalk.red(text);\n}\n\nfunction scoreBar(score: number): string {\n const clamped = Math.min(100, Math.max(0, score));\n const filled = Math.min(10, Math.round(clamped / 10));\n const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);\n const color = clamped >= 80 ? chalk.green : clamped >= 50 ? chalk.yellow : chalk.red;\n return `${color(`${String(clamped).padStart(3)}/100`)} ${color(bar)}`;\n}\n\n/**\n * Generate smart, framework-aware skill files.\n */\nfunction getSmartSkills(framework: string, ctx: SmartContext): { filename: string; content: string }[] {\n const skills: { filename: string; content: string }[] = [];\n\n // Universal: debugging (everyone needs this)\n skills.push({\n filename: 'debugging-guide.md',\n content: `# Skill: Debugging\n\nWhen something doesn't work, follow this systematic process:\n\n1. **Read the full error message** — the answer is usually in the stack trace.\n2. **Check recent changes** — what did you change last? That's likely the cause.\n3. **Check the terminal/console** — browser console AND server terminal.\n4. **Check imports** — wrong paths are the #1 cause of \"module not found\".\n5. **Check environment variables** — missing .env values cause most failures.\n\n## Common Fixes\n| Error | Fix |\n|---|---|\n| \"Module not found\" | Check import path, run \\`npm install\\` |\n| \"Cannot read property of undefined\" | Add null/undefined check |\n| \"CORS error\" | Add CORS middleware to backend |\n| Blank page | Check browser console (F12) |\n| \"Hydration mismatch\" | Server and client rendered different HTML |\n| \"EADDRINUSE\" | Another process using the port, kill it or use different port |\n\n## When AI Made a Mistake\n1. Describe WHAT went wrong (not just \"fix it\").\n2. Copy the EXACT error message.\n3. If AI repeats the same mistake 3 times, revert and try a completely different approach.\n4. Break the task into smaller steps.`,\n });\n\n // Universal: deployment\n skills.push({\n filename: 'deployment-checklist.md',\n content: `# Skill: Deployment Checklist\n\nBefore deploying, verify ALL of these:\n\n## Pre-Deploy\n- [ ] \\`${ctx.commands.find(c => c.name === 'build')?.command || 'npm run build'}\\` completes without errors\n- [ ] All environment variables are set in production\n- [ ] No \\`console.log\\` debug statements in production code\n- [ ] No hardcoded \\`localhost\\` or \\`127.0.0.1\\` — use environment variables\n- [ ] HTTPS is configured\n${ctx.testingInfo.hasTests ? `- [ ] All tests pass: \\`${ctx.testingInfo.command || 'npm test'}\\`` : '- [ ] Critical paths manually tested'}\n\n## Platform-Specific\n- **Vercel:** Set env vars in dashboard, auto-builds on push\n- **Railway/Render:** Set PORT env var, add start script in package.json\n- **Docker:** Use multi-stage builds, don't copy node_modules\n- **VPS (nginx):** Configure reverse proxy, enable gzip, set up SSL`,\n });\n\n // Framework-specific skills\n const fwLower = framework.toLowerCase();\n if (fwLower.includes('next') || fwLower.includes('react')) {\n skills.push({\n filename: 'create-new-page.md',\n content: `# Skill: Create a New Page\n\nWhen creating a new page/route, always include:\n\n1. **SEO metadata** — title, description, og:image\n2. **Loading state** — show skeleton or spinner while data loads\n3. **Error boundary** — graceful error handling, not blank screen\n4. **Responsive design** — test on mobile (375px) AND desktop (1440px)\n5. **Accessibility** — semantic HTML, alt text, keyboard navigation\n\n## Template${fwLower.includes('next') ? ` (Next.js App Router)\n\\`\\`\\`tsx\n// app/my-page/page.tsx\nimport type { Metadata } from 'next';\n\nexport const metadata: Metadata = {\n title: 'Page Title — My App',\n description: 'Clear description of this page',\n};\n\nexport default function MyPage() {\n return (\n <main>\n <h1>Page Title</h1>\n {/* Content here */}\n </main>\n );\n}\n\\`\\`\\`` : `\n\\`\\`\\`tsx\nexport default function MyPage() {\n return (\n <main>\n <h1>Page Title</h1>\n </main>\n );\n}\n\\`\\`\\``}`,\n });\n }\n\n if (fwLower.includes('express') || fwLower.includes('nest') || fwLower.includes('fastapi') || fwLower.includes('django')) {\n skills.push({\n filename: 'create-api-endpoint.md',\n content: `# Skill: Create an API Endpoint\n\nEvery API endpoint MUST have:\n\n1. **Input validation** — validate ALL user input before processing\n2. **Error handling** — return proper HTTP status codes\n3. **Authentication check** — verify user is authorized (if needed)\n4. **Response format** — consistent JSON structure\n\n## HTTP Status Codes\n| Code | When to Use |\n|---|---|\n| 200 | Success |\n| 201 | Created (POST success) |\n| 400 | Bad request (validation error) |\n| 401 | Unauthorized (not logged in) |\n| 403 | Forbidden (logged in but no permission) |\n| 404 | Not found |\n| 500 | Server error (never expose details to client) |\n\n## Security Rules\n- NEVER trust user input\n- NEVER expose internal error details\n- ALWAYS use parameterized queries (prevent SQL injection)\n- ALWAYS rate-limit sensitive endpoints`,\n });\n }\n\n return skills;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { FileContent, ContentSummary } from './contentReader.js';\nimport type { ScanResult } from './repoScanner.js';\nimport type { FrameworkInfo } from './frameworkDetector.js';\nimport type { ArchitectureResult } from './architectureAnalyzer.js';\nimport { detectBestTemplate } from '../templates/frameworkTemplates.js';\n\n/**\n * Smart Context Engine — The brain of RepoLens AI.\n *\n * Instead of generating generic AGENTS.md from templates,\n * this engine READS YOUR ACTUAL CODE and generates\n * project-specific context that AI agents can't infer.\n *\n * What makes this different:\n * 1. Reads package.json scripts → exact build/dev/test commands\n * 2. Reads .env.example → exact env vars needed\n * 3. Reads TODO/FIXME → real known issues\n * 4. Detects import patterns → actual conventions\n * 5. Finds largest/most-connected files → real critical files\n * 6. Detects actual naming conventions from code\n * 7. Merges framework template gotchas when available\n */\n\nexport interface SmartContext {\n commands: { name: string; command: string; description?: string }[];\n envVars: { name: string; description: string; required: boolean }[];\n conventions: string[];\n knownIssues: string[];\n criticalFiles: { path: string; reason: string }[];\n gotchas: string[];\n dependencies: { name: string; version: string; purpose?: string }[];\n importPattern: 'esm' | 'commonjs' | 'mixed' | 'unknown';\n namingConventions: string[];\n testingInfo: { hasTests: boolean; framework?: string; command?: string };\n}\n\n/**\n * Extract smart context by actually reading the project's code.\n */\nexport function extractSmartContext(\n cwd: string,\n scan: ScanResult,\n fw: FrameworkInfo,\n arch: ArchitectureResult,\n files: FileContent[],\n summary: ContentSummary,\n): SmartContext {\n const ctx: SmartContext = {\n commands: [],\n envVars: [],\n conventions: [],\n knownIssues: [],\n criticalFiles: [],\n gotchas: [],\n dependencies: [],\n importPattern: 'unknown',\n namingConventions: [],\n testingInfo: { hasTests: scan.hasTests },\n };\n\n // ─── 1. Extract REAL commands from package.json ────────\n const pkgPath = path.join(cwd, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.scripts) {\n for (const [name, cmd] of Object.entries(pkg.scripts)) {\n ctx.commands.push({\n name,\n command: `npm run ${name}`,\n description: describeScript(name, cmd as string),\n });\n }\n }\n // Extract dependencies for awareness\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n for (const [name, version] of Object.entries(allDeps)) {\n ctx.dependencies.push({\n name,\n version: String(version),\n purpose: describeDependency(name),\n });\n }\n // Detect test framework\n if (allDeps['vitest']) ctx.testingInfo = { hasTests: true, framework: 'vitest', command: 'npx vitest' };\n else if (allDeps['jest']) ctx.testingInfo = { hasTests: true, framework: 'jest', command: 'npm test' };\n else if (allDeps['mocha']) ctx.testingInfo = { hasTests: true, framework: 'mocha', command: 'npm test' };\n else if (allDeps['pytest'] || allDeps['python']) ctx.testingInfo = { hasTests: scan.hasTests, framework: 'pytest', command: 'pytest' };\n } catch { /* skip */ }\n }\n\n // Python projects\n const reqPath = path.join(cwd, 'requirements.txt');\n if (fs.existsSync(reqPath)) {\n try {\n const reqs = fs.readFileSync(reqPath, 'utf-8').split('\\n').filter(l => l.trim() && !l.startsWith('#'));\n for (const req of reqs.slice(0, 20)) {\n const [name] = req.split(/[=<>!]/);\n ctx.dependencies.push({ name: name.trim(), version: '', purpose: describeDependency(name.trim()) });\n }\n } catch { /* skip */ }\n }\n\n // ─── 2. Extract REAL env vars from .env.example ────────\n const envFiles = ['.env.example', '.env.sample', '.env.template', '.env.local.example'];\n for (const envFile of envFiles) {\n const envPath = path.join(cwd, envFile);\n if (fs.existsSync(envPath)) {\n try {\n const content = fs.readFileSync(envPath, 'utf-8');\n for (const line of content.split('\\n')) {\n const match = line.match(/^([A-Z][A-Z0-9_]+)\\s*=\\s*(.*?)(?:\\s*#\\s*(.*))?$/);\n if (match) {\n ctx.envVars.push({\n name: match[1],\n description: match[3] || describeEnvVar(match[1]),\n required: !match[2] || match[2] === '',\n });\n }\n }\n } catch { /* skip */ }\n break;\n }\n }\n\n // ─── 3. Extract TODO/FIXME as known issues ─────────────\n const allTodos: { file: string; line: number; text: string }[] = [];\n for (const f of files) {\n for (const todo of f.todoFixmes) {\n allTodos.push({ file: f.path, line: todo.line, text: todo.text });\n }\n }\n if (allTodos.length > 0) {\n for (const todo of allTodos.slice(0, 8)) {\n ctx.knownIssues.push(`\\`${todo.file}:${todo.line}\\` — ${todo.text}`);\n }\n }\n\n // ─── 4. Detect import pattern ──────────────────────────\n let esmCount = 0;\n let cjsCount = 0;\n for (const f of files) {\n for (const imp of f.imports) {\n if (imp.includes('import ') || imp.includes('from ')) esmCount++;\n if (imp.includes('require(')) cjsCount++;\n }\n }\n if (esmCount > 0 && cjsCount > 0) ctx.importPattern = 'mixed';\n else if (esmCount > cjsCount) ctx.importPattern = 'esm';\n else if (cjsCount > 0) ctx.importPattern = 'commonjs';\n\n // ─── 5. Detect naming conventions from actual code ─────\n const funcNames = files.flatMap(f => f.functions);\n let camelCase = 0, snake_case = 0, PascalCase = 0;\n for (const name of funcNames.slice(0, 100)) {\n if (/^[a-z][a-zA-Z0-9]*$/.test(name) && /[A-Z]/.test(name)) camelCase++;\n else if (/^[a-z][a-z0-9_]*$/.test(name) && name.includes('_')) snake_case++;\n else if (/^[A-Z][a-zA-Z0-9]*$/.test(name)) PascalCase++;\n }\n if (camelCase > snake_case && camelCase > PascalCase) {\n ctx.namingConventions.push('Functions use **camelCase** (e.g., `getUserById`)');\n } else if (snake_case > camelCase) {\n ctx.namingConventions.push('Functions use **snake_case** (e.g., `get_user_by_id`)');\n }\n if (PascalCase > 3) {\n ctx.namingConventions.push('Classes/Components use **PascalCase** (e.g., `UserProfile`)');\n }\n\n // Detect file extension conventions\n const tsFiles = files.filter(f => f.path.endsWith('.ts') || f.path.endsWith('.tsx'));\n const jsFiles = files.filter(f => f.path.endsWith('.js') || f.path.endsWith('.jsx'));\n if (tsFiles.length > jsFiles.length * 2) {\n ctx.namingConventions.push('Project uses **TypeScript** — all new files must be `.ts`/`.tsx`');\n }\n\n // Detect import extension pattern (.js extension in TS = ESM)\n if (ctx.importPattern === 'esm') {\n const hasJsExtensions = files.some(f =>\n f.imports.some(imp => /from\\s+['\"].*\\.js['\"]/.test(imp))\n );\n if (hasJsExtensions) {\n ctx.conventions.push('All imports use `.js` extension (ESM requirement with TypeScript)');\n }\n }\n\n // ─── 6. Find critical files by actual connectivity ─────\n for (const f of summary.mostConnected.slice(0, 5)) {\n if (f.imports > 3) {\n ctx.criticalFiles.push({\n path: f.path,\n reason: `${f.imports} imports — modify carefully, changes cascade widely`,\n });\n }\n }\n // Entry points are critical\n const entryFiles = ['src/cli.ts', 'src/index.ts', 'src/main.ts', 'src/app.ts', 'app.ts', 'index.ts',\n 'src/main.py', 'manage.py', 'app.py', 'main.go', 'src/main.rs'];\n for (const entry of entryFiles) {\n if (files.some(f => f.path === entry)) {\n ctx.criticalFiles.push({ path: entry, reason: 'Entry point — changes affect entire application' });\n }\n }\n\n // ─── 7. Merge framework template gotchas ───────────────\n const template = detectBestTemplate(fw.framework);\n if (template) {\n const templateLines = template.content.split('\\n');\n let inGotchas = false;\n for (const line of templateLines) {\n if (line.startsWith('## Gotchas')) { inGotchas = true; continue; }\n if (inGotchas && line.startsWith('## ')) break;\n if (inGotchas && line.startsWith('- ')) {\n ctx.gotchas.push(line.substring(2));\n }\n }\n }\n\n // ─── 8. Detect project-specific conventions ────────────\n // Detect if project uses strict TypeScript\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n try {\n const tsconfig = JSON.parse(fs.readFileSync(tsconfigPath, 'utf-8'));\n if (tsconfig.compilerOptions?.strict) {\n ctx.conventions.push('TypeScript strict mode is enabled — no `any` types');\n }\n if (tsconfig.compilerOptions?.noEmit) {\n ctx.conventions.push('TypeScript is used for type-checking only (`noEmit: true`)');\n }\n } catch { /* skip */ }\n }\n\n // Detect if project has ESLint/Prettier\n const lintConfigs = ['.eslintrc.js', '.eslintrc.json', '.eslintrc.yml', 'eslint.config.js', 'eslint.config.mjs'];\n for (const lc of lintConfigs) {\n if (fs.existsSync(path.join(cwd, lc))) {\n ctx.conventions.push(`ESLint is configured (\\`${lc}\\`) — run \\`npm run lint\\` before committing`);\n break;\n }\n }\n if (fs.existsSync(path.join(cwd, '.prettierrc')) || fs.existsSync(path.join(cwd, '.prettierrc.json'))) {\n ctx.conventions.push('Prettier is configured — code formatting is enforced');\n }\n\n return ctx;\n}\n\n/**\n * Generate a high-quality AGENTS.md from smart context.\n * This is the KEY DIFFERENTIATOR — every line is project-specific.\n */\nexport function generateSmartAgentsMd(\n fw: FrameworkInfo,\n arch: ArchitectureResult,\n scan: ScanResult,\n summary: ContentSummary,\n ctx: SmartContext,\n): string {\n const s: string[] = [];\n\n s.push('# AGENTS.md');\n s.push('');\n s.push('> Instructions for AI coding agents working on this project.');\n s.push(`> Auto-generated by RepoLens AI on ${new Date().toISOString().split('T')[0]}.`);\n s.push('');\n\n // ─── Project Overview ──────────────────────────────────\n s.push('## Project Overview');\n s.push('');\n s.push(`- **Framework:** ${fw.framework}${fw.version ? ` (${fw.version})` : ''}`);\n s.push(`- **Language:** ${fw.language}`);\n s.push(`- **Package Manager:** ${fw.packageManager}`);\n s.push(`- **Architecture:** ${arch.style}`);\n if (ctx.importPattern !== 'unknown') {\n s.push(`- **Module System:** ${ctx.importPattern === 'esm' ? 'ES Modules (import/export)' : ctx.importPattern === 'commonjs' ? 'CommonJS (require)' : 'Mixed'}`);\n }\n if (fw.additionalFrameworks.length > 0) {\n s.push(`- **Key Libraries:** ${fw.additionalFrameworks.join(', ')}`);\n }\n s.push('');\n\n // ─── Commands (REAL, from package.json) ────────────────\n if (ctx.commands.length > 0) {\n s.push('## Commands');\n s.push('');\n const important = ['dev', 'build', 'start', 'test', 'lint', 'format', 'deploy', 'preview', 'generate', 'migrate'];\n const shown = ctx.commands.filter(c => important.some(i => c.name.includes(i)));\n const rest = ctx.commands.filter(c => !shown.includes(c));\n for (const cmd of shown) {\n s.push(`- **${capitalize(cmd.name)}:** \\`${cmd.command}\\`${cmd.description ? ` — ${cmd.description}` : ''}`);\n }\n if (rest.length > 0) {\n s.push(`- Other scripts: ${rest.map(c => `\\`${c.name}\\``).join(', ')}`);\n }\n s.push('');\n }\n\n // ─── Architecture ──────────────────────────────────────\n s.push('## Architecture');\n s.push('');\n if (arch.dataFlow.length > 0) {\n for (const flow of arch.dataFlow) s.push(`- ${flow}`);\n s.push('');\n }\n\n // ─── Key Structure ─────────────────────────────────────\n s.push('## Key Structure');\n s.push('');\n s.push('```');\n for (const dir of scan.directories.slice(0, 15)) s.push(dir + '/');\n s.push('```');\n s.push('');\n\n // ─── Critical Files (from REAL analysis) ───────────────\n if (ctx.criticalFiles.length > 0) {\n s.push('## Critical Files (modify carefully)');\n s.push('');\n for (const f of ctx.criticalFiles) {\n s.push(`- \\`${f.path}\\` — ${f.reason}`);\n }\n s.push('');\n }\n\n // ─── Environment Variables (from .env.example) ─────────\n if (ctx.envVars.length > 0) {\n s.push('## Environment Variables');\n s.push('');\n for (const v of ctx.envVars) {\n const req = v.required ? '**required**' : 'optional';\n s.push(`- \\`${v.name}\\` — ${v.description} (${req})`);\n }\n s.push('');\n }\n\n // ─── Gotchas (framework-specific + project-specific) ───\n if (ctx.gotchas.length > 0 || ctx.knownIssues.length > 0) {\n s.push('## Gotchas & Known Issues');\n s.push('');\n for (const g of ctx.gotchas) s.push(`- ${g}`);\n if (ctx.knownIssues.length > 0) {\n s.push('');\n s.push('### Active TODOs in code:');\n for (const issue of ctx.knownIssues) s.push(`- ${issue}`);\n }\n s.push('');\n }\n\n // ─── Conventions (from REAL code analysis) ─────────────\n if (ctx.conventions.length > 0 || ctx.namingConventions.length > 0) {\n s.push('## Conventions');\n s.push('');\n for (const c of ctx.namingConventions) s.push(`- ${c}`);\n for (const c of ctx.conventions) s.push(`- ${c}`);\n s.push('');\n }\n\n // ─── Testing ───────────────────────────────────────────\n s.push('## Testing');\n s.push('');\n if (ctx.testingInfo.hasTests && ctx.testingInfo.framework) {\n s.push(`- Framework: **${ctx.testingInfo.framework}**`);\n s.push(`- Run: \\`${ctx.testingInfo.command}\\``);\n s.push('- Always run tests before and after changes');\n s.push('- Add tests for new functionality');\n } else {\n s.push('- This project currently lacks tests');\n s.push('- Add tests for critical business logic when possible');\n }\n s.push('');\n\n // ─── Do Not ────────────────────────────────────────────\n if (arch.weakPoints.length > 0) {\n s.push('## Rules');\n s.push('');\n for (const wp of arch.weakPoints) s.push(`- ${wp}`);\n s.push('');\n }\n\n s.push('---');\n s.push('*Generated by [RepoLens AI](https://github.com/repolens/repolens-ai)*');\n return s.join('\\n');\n}\n\n// ─── Helper functions ────────────────────────────────────\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction describeScript(name: string, cmd: string): string {\n if (name === 'dev') return cmd.includes('--watch') ? 'Development mode with hot reload' : 'Development server';\n if (name === 'build') return 'Production build';\n if (name === 'start') return 'Production server';\n if (name === 'test') return 'Run tests';\n if (name === 'lint') return 'Type/lint checking';\n if (name === 'format') return 'Code formatting';\n if (name === 'preview') return 'Preview production build';\n if (name.includes('migrate')) return 'Database migrations';\n if (name.includes('seed')) return 'Database seeding';\n if (name.includes('generate')) return 'Code generation';\n return '';\n}\n\nfunction describeDependency(name: string): string {\n const known: Record<string, string> = {\n 'react': 'UI library', 'next': 'Fullstack framework', 'vue': 'UI framework',\n 'express': 'HTTP server', 'fastify': 'HTTP server', 'prisma': 'ORM',\n 'drizzle-orm': 'ORM', 'typeorm': 'ORM', 'mongoose': 'MongoDB ODM',\n 'tailwindcss': 'CSS utility framework', 'zod': 'Schema validation',\n 'axios': 'HTTP client', 'commander': 'CLI framework', 'chalk': 'Terminal colors',\n 'vitest': 'Test runner', 'jest': 'Test runner', 'eslint': 'Linter',\n 'prettier': 'Code formatter', 'typescript': 'Type system',\n 'tsup': 'Bundler', 'vite': 'Bundler/Dev server', 'webpack': 'Bundler',\n };\n return known[name] || '';\n}\n\nfunction describeEnvVar(name: string): string {\n if (name.includes('DATABASE') || name.includes('DB_')) return 'Database connection';\n if (name.includes('API_KEY') || name.includes('SECRET')) return 'API key (keep secret)';\n if (name.includes('PORT')) return 'Server port';\n if (name.includes('URL') || name.includes('HOST')) return 'Service URL';\n if (name.includes('JWT') || name.includes('AUTH')) return 'Authentication config';\n if (name.includes('REDIS')) return 'Redis connection';\n if (name.includes('SMTP') || name.includes('MAIL')) return 'Email service config';\n if (name.includes('AWS') || name.includes('S3')) return 'AWS config';\n if (name.includes('STRIPE')) return 'Payment provider';\n return 'Configuration value';\n}\n"],"mappings":"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","names":["basename","fs","path","require","fs","path","fg","fs","path","fg","CODE_EXTENSIONS","fs","path","chalk","chalk","step","fs","path","ora","ora","ora","chalk","ora","ora","chalk","ora","ora","chalk","ora","ora","ora","ora","fs","path","ora","ora","fs","path","chalk","ora","ora","chalk","ora","scoreBar","ora","fs","path","chalk","ora","fs","path","chalk","path","chalk","scanRepository","detectFramework","classifyFiles","analyzeArchitecture","detectRisks","detectContextFiles","scoreContextFile","readCodeContents","summarizeContents","fs","path","chalk","fs","path","ora","chalk","ora","fs","path","ora","chalk","ora","ora","fs","path","fs","path","chalk","ora","getGrade"]}
|