@anatolykoptev/krolik-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +479 -0
- package/dist/bin/cli.js +32586 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/chunk-DTDOBWO6.js +2061 -0
- package/dist/chunk-DTDOBWO6.js.map +1 -0
- package/dist/config/index.d.ts +115 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +417 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/loader-_tD59b9E.d.ts +157 -0
- package/package.json +118 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/defaults.ts","../src/lib/@cache/file-cache.ts","../src/mcp/tools/core/projects.ts","../src/mcp/tools/core/registry.ts","../src/mcp/tools/core/shared.ts","../src/mcp/tools/core/utils.ts","../src/mcp/tools/agent/index.ts","../src/mcp/tools/core/flag-builder.ts","../src/mcp/tools/audit/index.ts","../src/mcp/tools/context/index.ts","../src/mcp/tools/docs/index.ts","../src/mcp/tools/fix/index.ts","../src/mcp/tools/issue/index.ts","../src/mcp/tools/memory/index.ts","../src/mcp/tools/refactor/index.ts","../src/mcp/tools/review/index.ts","../src/mcp/tools/routes/index.ts","../src/mcp/tools/schema/index.ts","../src/mcp/tools/status/index.ts","../src/lib/@fs/fs.ts","../src/lib/@shell/shell.ts","../src/lib/@git/local.ts","../src/lib/@log/logger.ts","../src/lib/@patterns/complexity.ts","../src/config/detect.ts","../src/config/domains.ts","../src/config/loader.ts"],"names":["path3","fs2","path7","__filename","__dirname","path8","fs7","path9","execSync","SyntaxKind","fs10","findProjectRoot","path13","fs"],"mappings":"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","file":"chunk-DTDOBWO6.js","sourcesContent":["/**\n * @module config/defaults\n * @description Default configuration values\n */\n\nimport type {\n FeatureConfig,\n PathConfig,\n PrismaConfig,\n ResolvedConfig,\n TemplateConfig,\n TrpcConfig,\n} from '../types';\n\n/**\n * Default path configuration\n */\nexport const DEFAULT_PATHS: Required<PathConfig> = {\n web: 'src',\n api: 'src/api',\n db: 'prisma',\n shared: 'src/shared',\n components: 'src/components',\n hooks: 'src/hooks',\n lib: 'src/lib',\n};\n\n/**\n * Default feature configuration\n */\nexport const DEFAULT_FEATURES: Required<FeatureConfig> = {\n prisma: false,\n trpc: false,\n nextjs: false,\n react: true,\n monorepo: false,\n typescript: true,\n};\n\n/**\n * Default Prisma configuration\n */\nexport const DEFAULT_PRISMA: Required<PrismaConfig> = {\n schemaDir: 'prisma',\n migrationsDir: 'prisma/migrations',\n};\n\n/**\n * Default tRPC configuration\n */\nexport const DEFAULT_TRPC: Required<TrpcConfig> = {\n routersDir: 'src/server/routers',\n appRouter: 'src/server/routers/index.ts',\n};\n\n/**\n * Default template configuration\n */\nexport const DEFAULT_TEMPLATES: Required<TemplateConfig> = {\n hook: '',\n component: '',\n test: '',\n schema: '',\n};\n\n/**\n * Default exclude patterns\n */\nexport const DEFAULT_EXCLUDE = [\n 'node_modules',\n '.next',\n 'dist',\n 'build',\n '.git',\n '.turbo',\n 'coverage',\n '.cache',\n];\n\n/**\n * Default file extensions\n */\nexport const DEFAULT_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'];\n\n/**\n * Create default resolved config\n */\nexport function createDefaultConfig(projectRoot: string): ResolvedConfig {\n return {\n name: 'project',\n projectRoot,\n paths: { ...DEFAULT_PATHS },\n features: { ...DEFAULT_FEATURES },\n prisma: { ...DEFAULT_PRISMA },\n trpc: { ...DEFAULT_TRPC },\n templates: { ...DEFAULT_TEMPLATES },\n exclude: [...DEFAULT_EXCLUDE],\n extensions: [...DEFAULT_EXTENSIONS],\n };\n}\n","/**\n * @module lib/@cache/file-cache\n * @description Unified file content cache with mtime tracking and statistics\n *\n * Combines features from:\n * - refactor/core/file-cache.ts: mtime-based invalidation\n * - fix/core/file-cache.ts: statistics tracking, warmup, singleton pattern\n *\n * Performance benefits:\n * - Eliminates repeated file reads (4x+ reduction per file)\n * - Automatic mtime-based invalidation for file changes\n * - Statistics for cache hit rate analysis\n * - Memory usage tracking\n * - Session-scoped (cleared between command runs)\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Cached file content with modification time\n */\ninterface CachedContent {\n content: string;\n mtime: number;\n}\n\n/**\n * Cache statistics\n */\nexport interface FileCacheStats {\n hits: number;\n misses: number;\n size: number;\n memoryBytes: number;\n}\n\n/**\n * File cache configuration options\n */\nexport interface FileCacheOptions {\n /**\n * Track file modification times for automatic invalidation\n * @default true\n */\n trackMtime?: boolean;\n\n /**\n * Collect hit/miss statistics\n * @default true\n */\n collectStats?: boolean;\n}\n\n/**\n * Unified file content cache\n *\n * Features:\n * - Automatic mtime-based invalidation\n * - Hit/miss statistics tracking\n * - Memory usage estimation\n * - Warmup for batch pre-loading\n * - Thread-safe within Node.js single-threaded context\n */\nexport class FileCache {\n private cache = new Map<string, CachedContent>();\n private stats = { hits: 0, misses: 0 };\n private options: Required<FileCacheOptions>;\n\n constructor(options: FileCacheOptions = {}) {\n this.options = {\n trackMtime: options.trackMtime ?? true,\n collectStats: options.collectStats ?? true,\n };\n }\n\n /**\n * Get file content, reading from disk if not cached\n *\n * Automatically invalidates cache if file modification time changed.\n *\n * @param filepath - Absolute or relative file path\n * @returns File content\n * @throws Error if file cannot be read\n */\n get(filepath: string): string {\n const absolute = path.resolve(filepath);\n\n // Check cache and validate mtime if tracking enabled\n const cached = this.cache.get(absolute);\n if (cached) {\n if (this.options.trackMtime) {\n try {\n const stat = fs.statSync(absolute);\n const currentMtime = stat.mtime.getTime();\n\n if (currentMtime === cached.mtime) {\n if (this.options.collectStats) {\n this.stats.hits++;\n }\n return cached.content;\n }\n\n // File modified, invalidate cache entry\n this.cache.delete(absolute);\n } catch {\n // File no longer exists, remove from cache\n this.cache.delete(absolute);\n }\n } else {\n // No mtime tracking, trust cache\n if (this.options.collectStats) {\n this.stats.hits++;\n }\n return cached.content;\n }\n }\n\n // Cache miss or invalidated - read from disk\n if (this.options.collectStats) {\n this.stats.misses++;\n }\n\n const content = fs.readFileSync(absolute, 'utf-8');\n\n // Store in cache with mtime if tracking enabled\n if (this.options.trackMtime) {\n try {\n const stat = fs.statSync(absolute);\n this.cache.set(absolute, {\n content,\n mtime: stat.mtime.getTime(),\n });\n } catch {\n // Failed to stat, cache without mtime (mtime: 0)\n this.cache.set(absolute, {\n content,\n mtime: 0,\n });\n }\n } else {\n this.cache.set(absolute, {\n content,\n mtime: 0,\n });\n }\n\n return content;\n }\n\n /**\n * Update cached content (e.g., after fix applied)\n *\n * This keeps the cache consistent with disk state when you\n * write to a file and want to avoid re-reading it.\n *\n * @param filepath - Absolute or relative file path\n * @param content - New file content\n */\n set(filepath: string, content: string): void {\n const absolute = path.resolve(filepath);\n\n if (this.options.trackMtime) {\n try {\n const stat = fs.statSync(absolute);\n this.cache.set(absolute, {\n content,\n mtime: stat.mtime.getTime(),\n });\n } catch {\n // File doesn't exist yet or can't be stat'd\n this.cache.set(absolute, {\n content,\n mtime: 0,\n });\n }\n } else {\n this.cache.set(absolute, {\n content,\n mtime: 0,\n });\n }\n }\n\n /**\n * Check if file is cached (and valid if mtime tracking enabled)\n *\n * @param filepath - Absolute or relative file path\n * @returns true if file is cached and valid\n */\n has(filepath: string): boolean {\n const absolute = path.resolve(filepath);\n const cached = this.cache.has(absolute);\n\n if (!cached || !this.options.trackMtime) {\n return cached;\n }\n\n // Validate mtime if tracking enabled\n const entry = this.cache.get(absolute);\n if (!entry) return false;\n\n try {\n const stat = fs.statSync(absolute);\n if (stat.mtime.getTime() !== entry.mtime) {\n this.cache.delete(absolute);\n return false;\n }\n return true;\n } catch {\n this.cache.delete(absolute);\n return false;\n }\n }\n\n /**\n * Invalidate cache for a specific file\n *\n * Use when file is modified externally and you want to force\n * a fresh read on next get().\n *\n * @param filepath - Absolute or relative file path\n */\n invalidate(filepath: string): void {\n const absolute = path.resolve(filepath);\n this.cache.delete(absolute);\n }\n\n /**\n * Clear entire cache and reset statistics\n *\n * Call at end of command execution to free memory.\n */\n clear(): void {\n this.cache.clear();\n this.stats = { hits: 0, misses: 0 };\n }\n\n /**\n * Get cache statistics\n *\n * @returns Statistics object with hits, misses, size, and memory usage\n */\n getStats(): FileCacheStats {\n // Estimate memory usage (rough approximation)\n let memoryBytes = 0;\n for (const entry of this.cache.values()) {\n // UTF-16 string encoding (2 bytes per character in JavaScript)\n memoryBytes += entry.content.length * 2;\n // Add overhead for mtime number (8 bytes)\n memoryBytes += 8;\n }\n\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n size: this.cache.size,\n memoryBytes,\n };\n }\n\n /**\n * Pre-warm cache with multiple files\n *\n * Useful when you know which files will be accessed and want to\n * batch-load them for better performance.\n *\n * @param filepaths - Array of file paths to pre-load\n */\n warmup(filepaths: string[]): void {\n for (const filepath of filepaths) {\n try {\n this.get(filepath); // Triggers cache population\n } catch {\n // Skip files that can't be read\n }\n }\n }\n}\n\n/**\n * Singleton cache instance for session\n *\n * Shared across all operations in a single command run.\n * This is the recommended way to use FileCache for most commands.\n */\nexport const fileCache = new FileCache();\n\n/**\n * Helper function to format cache stats for display\n *\n * @param stats - Cache statistics from getStats()\n * @returns Formatted multi-line string\n */\nexport function formatCacheStats(stats: FileCacheStats): string {\n const hitRate =\n stats.hits + stats.misses > 0\n ? ((stats.hits / (stats.hits + stats.misses)) * 100).toFixed(1)\n : '0.0';\n\n const memoryMB = (stats.memoryBytes / (1024 * 1024)).toFixed(2);\n\n return [\n 'Cache stats:',\n ` Files cached: ${stats.size}`,\n ` Cache hits: ${stats.hits}`,\n ` Cache misses: ${stats.misses}`,\n ` Hit rate: ${hitRate}%`,\n ` Memory usage: ${memoryMB} MB`,\n ].join('\\n');\n}\n","/**\n * @module mcp/tools/projects\n * @description Project detection utilities for MCP tools\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Project info\n */\nexport interface ProjectInfo {\n name: string;\n path: string;\n hasPackageJson: boolean;\n hasGit: boolean;\n hasTsConfig: boolean;\n description?: string;\n}\n\n/**\n * Project detection result\n */\nexport interface DetectionResult {\n status: 'single' | 'multiple' | 'none';\n project?: ProjectInfo;\n projects?: ProjectInfo[];\n message?: string;\n}\n\n/**\n * Folders to skip when scanning for projects\n */\nconst SKIP_FOLDERS = new Set([\n 'node_modules',\n '.git',\n '.next',\n '.turbo',\n 'dist',\n 'build',\n '.krolik',\n '.claude',\n]);\n\n/**\n * Check if a directory is a project (has package.json or .git)\n */\nfunction isProject(dir: string): ProjectInfo | null {\n const hasPackageJson = fs.existsSync(path.join(dir, 'package.json'));\n const hasGit = fs.existsSync(path.join(dir, '.git'));\n const hasTsConfig = fs.existsSync(path.join(dir, 'tsconfig.json'));\n\n if (!hasPackageJson && !hasGit) {\n return null;\n }\n\n let description: string | undefined;\n if (hasPackageJson) {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf-8'));\n description = pkg.description || pkg.name;\n } catch {\n // Ignore parse errors\n }\n }\n\n return {\n name: path.basename(dir),\n path: dir,\n hasPackageJson,\n hasGit,\n hasTsConfig,\n ...(description ? { description } : {}),\n };\n}\n\n/**\n * Scan directory for projects (one level deep)\n */\nfunction scanForProjects(workspaceRoot: string): ProjectInfo[] {\n const projects: ProjectInfo[] = [];\n\n try {\n const entries = fs.readdirSync(workspaceRoot, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory() || SKIP_FOLDERS.has(entry.name) || entry.name.startsWith('.')) {\n continue;\n }\n\n const projectPath = path.join(workspaceRoot, entry.name);\n const project = isProject(projectPath);\n if (project) {\n projects.push(project);\n }\n }\n } catch {\n // Ignore scan errors\n }\n\n return projects;\n}\n\n/**\n * Detect projects in workspace\n */\nexport function detectProjects(workspaceRoot: string, requestedProject?: string): DetectionResult {\n // Check if workspace root itself is a project\n const rootProject = isProject(workspaceRoot);\n\n // If a specific project is requested, find it\n if (requestedProject) {\n const projectPath = path.join(workspaceRoot, requestedProject);\n if (fs.existsSync(projectPath)) {\n const project = isProject(projectPath);\n if (project) {\n return { status: 'single', project };\n }\n }\n // Maybe it's an absolute path or the workspace root name\n if (requestedProject === path.basename(workspaceRoot) && rootProject) {\n return { status: 'single', project: rootProject };\n }\n return {\n status: 'none',\n message: `Project \"${requestedProject}\" not found. Use the tool without project parameter to see available projects.`,\n };\n }\n\n // If workspace root is a project (has package.json), use it\n if (rootProject) {\n return { status: 'single', project: rootProject };\n }\n\n // Scan for projects in workspace\n const projects = scanForProjects(workspaceRoot);\n\n if (projects.length === 0) {\n return {\n status: 'none',\n message:\n 'No projects found. Make sure you are in a directory with package.json or subdirectories containing projects.',\n };\n }\n\n if (projects.length === 1 && projects[0]) {\n return { status: 'single', project: projects[0] };\n }\n\n // Multiple projects found - return list for selection\n return {\n status: 'multiple',\n projects,\n message: 'Multiple projects found. Please specify which project to analyze.',\n };\n}\n\n/**\n * Format project list as XML for AI agent\n */\nexport function formatProjectList(projects: ProjectInfo[]): string {\n const lines: string[] = [\n '<available-projects>',\n ' <instruction>Multiple projects detected. Please call the tool again with the \"project\" parameter set to one of these:</instruction>',\n '',\n ];\n\n for (const p of projects) {\n lines.push(` <project name=\"${p.name}\">`);\n if (p.description) {\n lines.push(` <description>${p.description}</description>`);\n }\n lines.push(` <path>${p.path}</path>`);\n const features: string[] = [];\n if (p.hasPackageJson) features.push('npm');\n if (p.hasGit) features.push('git');\n if (p.hasTsConfig) features.push('typescript');\n lines.push(` <features>${features.join(', ')}</features>`);\n lines.push(' </project>');\n }\n\n lines.push('</available-projects>');\n return lines.join('\\n');\n}\n\n/**\n * Resolve project path from detection result\n */\nexport function resolveProjectPath(\n workspaceRoot: string,\n requestedProject?: string,\n): { path: string } | { error: string } {\n const result = detectProjects(workspaceRoot, requestedProject);\n\n switch (result.status) {\n case 'single':\n if (!result.project) {\n return { error: 'Project not found' };\n }\n return { path: result.project.path };\n case 'multiple':\n if (!result.projects) {\n return { error: 'No projects found' };\n }\n return { error: formatProjectList(result.projects) };\n case 'none':\n return { error: result.message || 'No projects found' };\n }\n}\n\n/**\n * Handler wrapper with project detection\n * Single source of truth for project resolution in all tools\n */\nexport function withProjectDetection(\n args: Record<string, unknown>,\n workspaceRoot: string,\n handler: (projectPath: string) => string,\n): string {\n const projectArg = typeof args.project === 'string' ? args.project : undefined;\n const resolved = resolveProjectPath(workspaceRoot, projectArg);\n\n if ('error' in resolved) {\n return resolved.error;\n }\n\n return handler(resolved.path);\n}\n","/**\n * @module mcp/tools/registry\n * @description Auto-discovering tool registry - zero-config tool registration!\n *\n * How it works:\n * 1. Create a new tool file: src/mcp/tools/my-tool.ts\n * 2. Export MCPToolDefinition and call registerTool()\n * 3. Run: pnpm generate:tools (or happens automatically on build)\n * 4. Your tool is automatically discovered and registered!\n *\n * Benefits:\n * - Adding a new tool requires ONLY creating the file\n * - NO manual imports needed\n * - NO registration calls in index.ts\n * - Type-safe and explicit\n * - Automatic discovery at build time\n */\n\nimport type { MCPTool, MCPToolDefinition } from './types';\n\n/**\n * Internal registry of all tools\n */\nconst toolRegistry: MCPToolDefinition[] = [];\n\n/**\n * Register a tool (called by each tool file on import)\n */\nexport function registerTool(tool: MCPToolDefinition): void {\n // Validate tool name is unique\n if (toolRegistry.some((t) => t.name === tool.name)) {\n throw new Error(`Tool \"${tool.name}\" is already registered`);\n }\n toolRegistry.push(tool);\n}\n\n/**\n * Get all registered tools (Single Source of Truth)\n */\nexport function getAllTools(): readonly MCPToolDefinition[] {\n return [...toolRegistry] as const;\n}\n\n/**\n * Get tool definitions for MCP protocol (without handlers)\n */\nexport function getToolDefinitions(): MCPTool[] {\n return toolRegistry.map(({ name, description, inputSchema }) => ({\n name,\n description,\n inputSchema,\n }));\n}\n\n/**\n * Build handler registry from tools\n */\nexport function buildHandlerRegistry(): Record<string, MCPToolDefinition['handler']> {\n const registry: Record<string, MCPToolDefinition['handler']> = {};\n for (const tool of toolRegistry) {\n registry[tool.name] = tool.handler;\n }\n return registry;\n}\n\n/**\n * Run a tool by name\n */\nexport function runTool(name: string, args: Record<string, unknown>, projectRoot: string): string {\n const tool = toolRegistry.find((t) => t.name === name);\n if (!tool) {\n throw new Error(`Unknown tool: ${name}`);\n }\n return tool.handler(args, projectRoot);\n}\n\n/**\n * Check if a tool name is valid\n */\nexport function isValidTool(name: string): boolean {\n return toolRegistry.some((t) => t.name === name);\n}\n\n/**\n * Get list of all tool names\n */\nexport function getToolNames(): string[] {\n return toolRegistry.map((t) => t.name);\n}\n","/**\n * @module mcp/tools/shared\n * @description Shared constants and utilities for MCP tools\n */\n\nimport type { FlagDef } from './flag-builder';\nimport type { SchemaProperty } from './types';\n\n/**\n * Common project property for tools that support project detection\n */\nexport const PROJECT_PROPERTY: Record<string, SchemaProperty> = {\n project: {\n type: 'string',\n description:\n 'Project folder name to analyze (e.g., \"my-app\", \"my-project\"). If not specified, auto-detects or returns list of available projects.',\n },\n};\n\n/**\n * Valid fix categories for the krolik fix command\n */\nexport const FIX_CATEGORIES = ['lint', 'type-safety', 'complexity', 'hardcoded', 'srp'] as const;\n\n/**\n * Type for fix categories derived from FIX_CATEGORIES constant\n */\nexport type FixCategory = (typeof FIX_CATEGORIES)[number];\n\n/**\n * Common flag definitions for use with buildFlags()\n */\nexport const COMMON_FLAGS = {\n path: { flag: '--path', sanitize: 'feature' } as const,\n feature: { flag: '--feature', sanitize: 'feature' } as const,\n issue: { flag: '--issue', sanitize: 'issue' } as const,\n pr: { flag: '--pr', sanitize: 'issue' } as const,\n staged: { flag: '--staged' } as const,\n dryRun: { flag: '--dry-run' } as const,\n json: { flag: '--json' } as const,\n verbose: { flag: '--verbose' } as const,\n apply: { flag: '--apply' } as const,\n safe: { flag: '--safe' } as const,\n} satisfies Record<string, FlagDef>;\n","/**\n * @module mcp/tools/utils\n * @description Shared utilities for tool handlers\n */\n\nimport { spawnSync } from 'node:child_process';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// Get the path to the CLI script\n// After bundling, all code runs from dist/bin/cli.js, so __dirname is dist/bin\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n// The CLI is the same bundle we're running from\nconst CLI_PATH = path.resolve(__dirname, 'cli.js');\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nexport const TIMEOUT_60S = 60000;\nexport const TIMEOUT_120S = 120000;\n\n// ============================================================================\n// INPUT SANITIZATION (Security: prevent command injection)\n// ============================================================================\n\n/**\n * Validate and sanitize a feature/task name\n * Only allows alphanumeric, hyphens, underscores, and dots\n */\nexport function sanitizeFeatureName(input: unknown): string | null {\n if (typeof input !== 'string') return null;\n const sanitized = input.trim();\n if (sanitized.length === 0 || sanitized.length > 100) return null;\n // Only allow safe characters: alphanumeric, hyphen, underscore, dot, space\n if (!/^[a-zA-Z0-9_\\-.\\s]+$/.test(sanitized)) return null;\n return sanitized;\n}\n\n/**\n * Validate and sanitize an issue/PR number\n * Only allows positive integers\n */\nexport function sanitizeIssueNumber(input: unknown): number | null {\n if (typeof input === 'number') {\n if (Number.isInteger(input) && input > 0 && input < 1000000) return input;\n return null;\n }\n if (typeof input === 'string') {\n const num = parseInt(input, 10);\n if (Number.isNaN(num) || num <= 0 || num >= 1000000) return null;\n // Ensure string only contained digits\n if (!/^\\d+$/.test(input.trim())) return null;\n return num;\n }\n return null;\n}\n\n/**\n * Escape shell argument for safe use in commands\n */\nexport function escapeShellArg(arg: string): string {\n // Replace single quotes with escaped version and wrap in single quotes\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n// ============================================================================\n// TOOL EXECUTION\n// ============================================================================\n\n/**\n * Parse command string into array of arguments\n * Handles quoted strings and escaped characters properly\n */\nfunction parseCommandArgs(command: string): string[] {\n const args: string[] = [];\n let current = '';\n let inQuotes = false;\n let quoteChar = '';\n\n for (let i = 0; i < command.length; i++) {\n const char = command[i];\n const nextChar = command[i + 1];\n\n if (char === '\\\\' && nextChar) {\n // Escaped character\n current += nextChar;\n i++; // Skip next character\n } else if ((char === '\"' || char === \"'\") && !inQuotes) {\n // Start of quoted string\n inQuotes = true;\n quoteChar = char;\n } else if (char === quoteChar && inQuotes) {\n // End of quoted string\n inQuotes = false;\n quoteChar = '';\n } else if (char === ' ' && !inQuotes) {\n // Space outside quotes - argument separator\n if (current.length > 0) {\n args.push(current);\n current = '';\n }\n } else {\n // Regular character\n current += char;\n }\n }\n\n // Add final argument if any\n if (current.length > 0) {\n args.push(current);\n }\n\n return args;\n}\n\n/**\n * Execute krolik CLI command using spawnSync for better security\n * @param args - Command arguments as a string (e.g., \"status --fast\")\n * @param projectRoot - Working directory for the command\n * @param timeout - Maximum execution time in milliseconds\n * @returns Command output or error message\n */\nexport function runKrolik(args: string, projectRoot: string, timeout = 30000): string {\n // Parse command string into array of arguments\n const argArray = parseCommandArgs(args);\n\n // Use node with absolute path to CLI instead of npx (package not published)\n const result = spawnSync('node', [CLI_PATH, ...argArray], {\n cwd: projectRoot,\n encoding: 'utf-8',\n timeout,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // Handle spawn errors (e.g., node executable not found)\n if (result.error) {\n return `Error: ${result.error.message}`;\n }\n\n // Handle timeout\n if (result.signal === 'SIGTERM') {\n return `Error: Command timed out after ${timeout}ms`;\n }\n\n // If command failed, return stderr or stdout with error info\n if (result.status !== 0) {\n const errorOutput = result.stderr || result.stdout || `Exit code: ${result.status}`;\n return errorOutput;\n }\n\n // Success - return stdout\n return result.stdout || '';\n}\n","/**\n * @module mcp/tools/agent\n * @description krolik_agent tool - Run specialized AI agents with orchestration support\n *\n * This tool provides two modes:\n * 1. Direct agent execution: Run a specific agent by name\n * 2. Orchestration mode: Analyze task and coordinate multiple agents\n *\n * When orchestrate=true, the tool acts as a multi-agent coordinator,\n * analyzing the user's task and creating an execution plan for multiple\n * specialized agents.\n */\n\nimport type { FlagSchema } from '../core/flag-builder';\nimport { withProjectDetection } from '../core/projects';\nimport { registerTool } from '../core/registry';\nimport { PROJECT_PROPERTY } from '../core/shared';\nimport type { MCPToolDefinition, SchemaProperty } from '../core/types';\nimport { runKrolik, TIMEOUT_60S, TIMEOUT_120S } from '../core/utils';\n\n/**\n * Schema for agent tool\n */\nconst _agentSchema: FlagSchema = {\n name: { flag: '', sanitize: 'feature' }, // Positional argument\n category: { flag: '--category', sanitize: 'feature' },\n file: { flag: '--file', sanitize: 'path' },\n feature: { flag: '--feature', sanitize: 'feature' },\n list: { flag: '--list' },\n orchestrate: { flag: '--orchestrate' },\n task: { flag: '--task', sanitize: 'text' },\n maxAgents: { flag: '--max-agents', sanitize: 'number' },\n parallel: { flag: '--parallel' },\n dryRun: { flag: '--dry-run' },\n};\n\n/**\n * Agent tool input schema\n */\nconst inputSchema: Record<string, SchemaProperty> = {\n ...PROJECT_PROPERTY,\n name: {\n type: 'string',\n description:\n 'Agent name to run (e.g., \"security-auditor\", \"backend-architect\") or category name (e.g., \"security\", \"quality\")',\n },\n orchestrate: {\n type: 'boolean',\n description:\n 'Enable orchestration mode. Analyzes the task and coordinates multiple specialized agents. Use when user says \"use multi-agents\" or \"мультиагенты\".',\n },\n task: {\n type: 'string',\n description:\n 'Task description for orchestration mode (e.g., \"analyze security and performance\", \"review code quality\")',\n },\n category: {\n type: 'string',\n description:\n 'Filter agents by category: security, performance, architecture, quality, debugging, docs, etc.',\n },\n file: {\n type: 'string',\n description: 'Target file for agent analysis',\n },\n feature: {\n type: 'string',\n description: 'Feature or domain to focus on (e.g., \"booking\", \"auth\", \"CRM\")',\n },\n list: {\n type: 'boolean',\n description: 'List all available agents',\n },\n maxAgents: {\n type: 'number',\n description: 'Maximum number of agents to run in orchestration mode (default: 5)',\n },\n parallel: {\n type: 'boolean',\n description: 'Prefer parallel execution of agents in orchestration mode',\n },\n dryRun: {\n type: 'boolean',\n description: 'Show orchestration plan without executing agents',\n },\n};\n\n/**\n * Build agent command with proper arguments\n */\nfunction buildAgentCommand(args: Record<string, unknown>): string {\n const parts: string[] = ['agent'];\n\n // Add agent name as positional argument if provided and not orchestrating\n if (args.name && !args.orchestrate) {\n const name = String(args.name).replace(/[^a-zA-Z0-9_-]/g, '');\n parts.push(name);\n }\n\n // Add flags\n if (args.orchestrate) {\n parts.push('--orchestrate');\n if (args.task) {\n // Escape and quote the task\n const task = String(args.task).replace(/\"/g, '\\\\\"');\n parts.push(`--task \"${task}\"`);\n }\n if (args.maxAgents) {\n parts.push(`--max-agents ${Number(args.maxAgents)}`);\n }\n if (args.parallel) {\n parts.push('--parallel');\n }\n }\n\n if (args.category) {\n const category = String(args.category).replace(/[^a-zA-Z0-9_-]/g, '');\n parts.push(`--category ${category}`);\n }\n\n if (args.file) {\n const file = String(args.file).replace(/[^a-zA-Z0-9_./-]/g, '');\n parts.push(`--file ${file}`);\n }\n\n if (args.feature) {\n const feature = String(args.feature).replace(/[^a-zA-Z0-9_-]/g, '');\n parts.push(`--feature ${feature}`);\n }\n\n if (args.list) {\n parts.push('--list');\n }\n\n if (args.dryRun) {\n parts.push('--dry-run');\n }\n\n return parts.join(' ');\n}\n\n/**\n * Agent tool definition\n */\nexport const agentTool: MCPToolDefinition = {\n name: 'krolik_agent',\n description: `Run specialized AI agents with project context. Supports orchestration mode for multi-agent coordination.\n\nORCHESTRATION MODE (orchestrate=true):\nWhen user says \"use multi-agents\", \"мультиагенты\", or needs multiple expert analyses:\n1. Set orchestrate=true and provide task description\n2. The orchestrator analyzes the task and identifies needed agents\n3. Creates execution plan (parallel/sequential)\n4. Returns XML for Claude to execute with Task tool\n\nDIRECT MODE (default):\nRun a specific agent by name or category.\n\nExamples:\n- { \"name\": \"security-auditor\" } → Run security agent\n- { \"category\": \"quality\" } → Run all quality agents\n- { \"orchestrate\": true, \"task\": \"analyze security and performance\" } → Multi-agent orchestration\n- { \"list\": true } → List all available agents`,\n\n inputSchema: {\n type: 'object',\n properties: inputSchema,\n },\n template: { when: 'Multi-agent orchestration', params: '`orchestrate: true, task: \"...\"`' },\n category: 'advanced',\n\n handler: (args, workspaceRoot) => {\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n const command = buildAgentCommand(args);\n const timeout = args.orchestrate ? TIMEOUT_120S : TIMEOUT_60S;\n return runKrolik(command, projectPath, timeout);\n });\n },\n};\n\n// Register the tool\nregisterTool(agentTool);\n","/**\n * @module mcp/tools/flag-builder\n * @description Type-safe flag building for CLI commands\n */\n\nimport { escapeShellArg, sanitizeFeatureName, sanitizeIssueNumber } from './utils';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type SanitizeType = 'feature' | 'issue' | 'none';\n\nexport interface FlagDef {\n flag: string;\n sanitize?: SanitizeType;\n required?: boolean;\n transform?: (val: unknown) => string | null;\n validate?: (val: unknown) => boolean;\n}\n\nexport type FlagSchema = Record<string, FlagDef>;\n\nexport type BuildResult = { ok: true; flags: string } | { ok: false; error: string };\n\n// ============================================================================\n// BUILDER\n// ============================================================================\n\n/**\n * Build CLI flags from arguments using a schema\n *\n * @param args - Arguments to build flags from\n * @param schema - Flag schema definition\n * @returns Result with flags string or error\n *\n * @example\n * ```ts\n * const schema = {\n * dryRun: { flag: '--dry-run' },\n * path: { flag: '--path', sanitize: 'feature' },\n * category: {\n * flag: '--category',\n * validate: (val) => ['lint', 'type-safety'].includes(String(val))\n * }\n * };\n *\n * const result = buildFlags(args, schema);\n * if (!result.ok) return result.error;\n * return runKrolik(`fix ${result.flags}`, projectPath);\n * ```\n */\nexport function buildFlags(args: Record<string, unknown>, schema: FlagSchema): BuildResult {\n const parts: string[] = [];\n\n for (const [key, def] of Object.entries(schema)) {\n const val = args[key];\n\n // Skip undefined/null/false\n if (val === undefined || val === null || val === false) {\n if (def.required) {\n return { ok: false, error: `Missing required argument: ${key}` };\n }\n continue;\n }\n\n // Boolean flags (true -> --flag)\n if (val === true) {\n parts.push(def.flag);\n continue;\n }\n\n // String/number values\n let strVal = String(val);\n\n // Sanitization\n if (def.sanitize === 'feature') {\n const sanitized = sanitizeFeatureName(val);\n if (!sanitized) {\n return {\n ok: false,\n error: `Invalid ${key}: Only alphanumeric, hyphens, underscores, dots allowed.`,\n };\n }\n strVal = sanitized;\n } else if (def.sanitize === 'issue') {\n const sanitized = sanitizeIssueNumber(val);\n if (!sanitized) {\n return { ok: false, error: `Invalid ${key}: Must be a positive number.` };\n }\n strVal = String(sanitized);\n }\n\n // Custom transform\n if (def.transform) {\n const transformed = def.transform(val);\n if (transformed === null) {\n return { ok: false, error: `Invalid ${key}` };\n }\n strVal = transformed;\n }\n\n // Custom validation\n if (def.validate && !def.validate(val)) {\n return { ok: false, error: `Invalid ${key}` };\n }\n\n // Handle positional arguments (empty flag name)\n if (def.flag === '') {\n parts.push(escapeShellArg(strVal));\n } else {\n parts.push(`${def.flag}=${escapeShellArg(strVal)}`);\n }\n }\n\n return { ok: true, flags: parts.join(' ') };\n}\n","/**\n * @module mcp/tools/audit\n * @description krolik_audit tool - Code quality audit\n */\n\nimport {\n buildFlags,\n COMMON_FLAGS,\n type FlagSchema,\n type MCPToolDefinition,\n PROJECT_PROPERTY,\n registerTool,\n runKrolik,\n TIMEOUT_60S,\n withProjectDetection,\n} from '../core';\n\nconst auditSchema: FlagSchema = {\n path: COMMON_FLAGS.path,\n};\n\nexport const auditTool: MCPToolDefinition = {\n name: 'krolik_audit',\n description:\n 'Audit code quality. Analyzes codebase for issues: console.log, any types, complexity, magic numbers, etc. Returns AI-friendly report.',\n inputSchema: {\n type: 'object',\n properties: {\n ...PROJECT_PROPERTY,\n path: {\n type: 'string',\n description: 'Specific subdirectory within project to audit (optional)',\n },\n },\n },\n template: { when: 'Code quality audit', params: '—' },\n workflow: { trigger: 'on_refactor', order: 2 },\n category: 'code',\n handler: (args, workspaceRoot) => {\n const result = buildFlags(args, auditSchema);\n if (!result.ok) return result.error;\n\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n return runKrolik(`audit ${result.flags}`, projectPath, TIMEOUT_60S);\n });\n },\n};\n\nregisterTool(auditTool);\n","/**\n * @module mcp/tools/context\n * @description krolik_context tool - AI-friendly context generation\n */\n\nimport {\n buildFlags,\n COMMON_FLAGS,\n type FlagSchema,\n type MCPToolDefinition,\n PROJECT_PROPERTY,\n registerTool,\n runKrolik,\n TIMEOUT_60S,\n withProjectDetection,\n} from '../core';\n\nconst contextSchema: FlagSchema = {\n feature: COMMON_FLAGS.feature,\n issue: COMMON_FLAGS.issue,\n quick: { flag: '--quick' },\n deep: { flag: '--deep' },\n full: { flag: '--full' },\n};\n\nexport const contextTool: MCPToolDefinition = {\n name: 'krolik_context',\n description:\n 'Generate AI-friendly context for a specific task or feature. Returns structured XML with schema, routes, git info, and approach steps.',\n inputSchema: {\n type: 'object',\n properties: {\n ...PROJECT_PROPERTY,\n feature: {\n type: 'string',\n description: 'The feature or task to analyze (e.g., \"booking\", \"auth\", \"CRM\")',\n },\n issue: {\n type: 'string',\n description: 'GitHub issue number to get context for',\n },\n quick: {\n type: 'boolean',\n description: 'Quick mode: architecture, git, tree, schema, routes only (faster)',\n },\n deep: {\n type: 'boolean',\n description: 'Deep mode: imports, types, env, contracts (complements quick)',\n },\n full: {\n type: 'boolean',\n description:\n 'Full mode: all enrichment (--include-code --domain-history --show-deps --with-audit)',\n },\n },\n },\n template: { when: 'Before feature/issue work', params: '`feature: \"...\"` or `issue: \"123\"`' },\n workflow: { trigger: 'before_task', order: 1 },\n category: 'context',\n handler: (args, workspaceRoot) => {\n const result = buildFlags(args, contextSchema);\n if (!result.ok) return result.error;\n\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n return runKrolik(`context ${result.flags}`, projectPath, TIMEOUT_60S);\n });\n },\n};\n\nregisterTool(contextTool);\n","/**\n * @module mcp/tools/docs\n * @description krolik_docs tool - Documentation cache management\n */\n\nimport {\n buildFlags,\n type MCPToolDefinition,\n PROJECT_PROPERTY,\n registerTool,\n runKrolik,\n TIMEOUT_120S,\n withProjectDetection,\n} from '../core';\n\nconst docsSchema = {\n library: { flag: '--library', sanitize: 'none' } as const,\n topic: { flag: '--topic', sanitize: 'none' } as const,\n limit: { flag: '--limit', sanitize: 'none' } as const,\n force: { flag: '--force' } as const,\n expired: { flag: '--expired' } as const,\n};\n\nexport const docsTool: MCPToolDefinition = {\n name: 'krolik_docs',\n description: `Query and manage cached library documentation.\n\nActions:\n- search: Full-text search across cached docs (FTS5)\n- list: List all cached libraries with expiry status\n- fetch: Fetch/refresh docs for a library from Context7\n- detect: Auto-detect libraries from package.json\n- clear: Clear cache (all or specific library)\n\nUse this tool to:\n- Find code examples and API documentation\n- Check which libraries are cached\n- Refresh outdated documentation\n- Discover project dependencies that have docs available\n\nExamples:\n- Search: { action: \"search\", query: \"app router server components\" }\n- List: { action: \"list\" }\n- Fetch: { action: \"fetch\", library: \"next.js\", topic: \"app-router\" }\n- Detect: { action: \"detect\" }`,\n\n inputSchema: {\n type: 'object',\n properties: {\n ...PROJECT_PROPERTY,\n action: {\n type: 'string',\n enum: ['search', 'list', 'fetch', 'detect', 'clear'],\n description: 'Action to perform',\n },\n query: {\n type: 'string',\n description: 'Search query (for action: search)',\n },\n library: {\n type: 'string',\n description: 'Library name (e.g., \"next.js\", \"prisma\", \"trpc\")',\n },\n topic: {\n type: 'string',\n description: 'Topic to focus on (e.g., \"app-router\", \"transactions\")',\n },\n limit: {\n type: 'number',\n description: 'Max results for search (default: 10)',\n },\n force: {\n type: 'boolean',\n description: 'Force refresh even if cache is valid',\n },\n expired: {\n type: 'boolean',\n description: 'For list/clear: only show/clear expired entries',\n },\n },\n required: ['action'],\n },\n\n template: { when: 'Need library API docs', params: '`action: \"search\", query: \"...\"`' },\n category: 'context',\n handler: (args, workspaceRoot) => {\n const action = args.action as string;\n\n // Validate action-specific requirements\n if (action === 'search' && !args.query) {\n return 'Error: query is required for search action';\n }\n if (action === 'fetch' && !args.library) {\n return 'Error: library is required for fetch action';\n }\n\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n switch (action) {\n case 'search': {\n const query = args.query as string;\n const result = buildFlags(args, {\n library: docsSchema.library,\n topic: docsSchema.topic,\n limit: docsSchema.limit,\n });\n if (!result.ok) return result.error;\n // Query is positional argument, must be quoted\n return runKrolik(`docs search \"${query}\" ${result.flags}`, projectPath, TIMEOUT_120S);\n }\n\n case 'list': {\n const result = buildFlags(args, {\n expired: docsSchema.expired,\n });\n if (!result.ok) return result.error;\n return runKrolik(`docs list ${result.flags}`, projectPath, TIMEOUT_120S);\n }\n\n case 'fetch': {\n const library = args.library as string;\n const result = buildFlags(args, {\n topic: docsSchema.topic,\n force: docsSchema.force,\n });\n if (!result.ok) return result.error;\n // Library is positional argument\n return runKrolik(`docs fetch \"${library}\" ${result.flags}`, projectPath, TIMEOUT_120S);\n }\n\n case 'detect': {\n return runKrolik('docs detect', projectPath, TIMEOUT_120S);\n }\n\n case 'clear': {\n const result = buildFlags(args, {\n library: docsSchema.library,\n expired: docsSchema.expired,\n });\n if (!result.ok) return result.error;\n return runKrolik(`docs clear ${result.flags}`, projectPath, TIMEOUT_120S);\n }\n\n default:\n return `Error: Unknown action: ${action}. Valid actions: search, list, fetch, detect, clear`;\n }\n });\n },\n};\n\nregisterTool(docsTool);\n","/**\n * @module mcp/tools/fix\n * @description krolik_fix tool - Auto-fix code quality issues\n */\n\nimport {\n buildFlags,\n COMMON_FLAGS,\n FIX_CATEGORIES,\n type FlagSchema,\n type MCPToolDefinition,\n PROJECT_PROPERTY,\n registerTool,\n runKrolik,\n TIMEOUT_60S,\n withProjectDetection,\n} from '../core';\n\nconst fixSchema: FlagSchema = {\n dryRun: COMMON_FLAGS.dryRun,\n safe: COMMON_FLAGS.safe,\n path: COMMON_FLAGS.path,\n category: {\n flag: '--category',\n validate: (val) =>\n typeof val === 'string' && FIX_CATEGORIES.includes(val as (typeof FIX_CATEGORIES)[number]),\n },\n};\n\nexport const fixTool: MCPToolDefinition = {\n name: 'krolik_fix',\n description:\n 'Auto-fix code quality issues. Removes console.log, debugger, replaces any with unknown, etc. Use --dry-run to preview.',\n inputSchema: {\n type: 'object',\n properties: {\n ...PROJECT_PROPERTY,\n dryRun: {\n type: 'boolean',\n description: 'Preview changes without applying (recommended first)',\n },\n path: {\n type: 'string',\n description: 'Specific directory to fix (optional)',\n },\n category: {\n type: 'string',\n description: 'Fix category: lint, type-safety, complexity, hardcoded, srp',\n enum: [...FIX_CATEGORIES],\n },\n safe: {\n type: 'boolean',\n description: 'Only apply safe fixes (no risky changes)',\n },\n },\n },\n template: { when: 'Quality issues found', params: '`dryRun: true` first' },\n workflow: { trigger: 'after_code', order: 1 },\n category: 'code',\n handler: (args, workspaceRoot) => {\n const result = buildFlags(args, fixSchema);\n if (!result.ok) {\n // Provide better error message for category validation\n if (\n args.category &&\n !FIX_CATEGORIES.includes(args.category as (typeof FIX_CATEGORIES)[number])\n ) {\n return `Error: Invalid category. Must be one of: ${FIX_CATEGORIES.join(', ')}`;\n }\n return result.error;\n }\n\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n return runKrolik(`fix ${result.flags}`, projectPath, TIMEOUT_60S);\n });\n },\n};\n\nregisterTool(fixTool);\n","/**\n * @module mcp/tools/issue\n * @description krolik_issue tool - GitHub issue parsing\n */\n\nimport {\n buildFlags,\n type FlagSchema,\n type MCPToolDefinition,\n registerTool,\n runKrolik,\n} from '../core';\n\nconst issueSchema: FlagSchema = {\n number: { flag: '', sanitize: 'issue', required: true },\n};\n\nexport const issueTool: MCPToolDefinition = {\n name: 'krolik_issue',\n description: 'Parse a GitHub issue and extract context: checklist, mentioned files, priority.',\n inputSchema: {\n type: 'object',\n properties: {\n number: {\n type: 'string',\n description: 'GitHub issue number',\n },\n },\n required: ['number'],\n },\n template: { when: 'Parse GitHub issue details', params: '`number: \"123\"`' },\n workflow: { trigger: 'before_task', order: 2 },\n category: 'context',\n handler: (args, projectRoot) => {\n const result = buildFlags(args, issueSchema);\n if (!result.ok) return result.error;\n\n // For issue command, the number is a positional argument, not a flag\n return runKrolik(`issue ${result.flags}`, projectRoot);\n },\n};\n\nregisterTool(issueTool);\n","/**\n * @module mcp/tools/memory\n * @description krolik_mem_* tools - Memory system for observations, decisions, patterns\n */\n\nimport {\n type MCPToolDefinition,\n PROJECT_PROPERTY,\n registerTool,\n runKrolik,\n TIMEOUT_60S,\n withProjectDetection,\n} from '../core';\n\n/**\n * krolik_mem_save - Save a memory entry\n */\nexport const memSaveTool: MCPToolDefinition = {\n name: 'krolik_mem_save',\n description: `Save memory: observation, decision, pattern, bugfix, or feature.\n\nExamples:\n- \"Decided to use tRPC for type safety\" (decision)\n- \"Fixed race condition with mutex\" (bugfix)\n- \"All routes use validate -> execute -> audit pattern\" (pattern)\n- \"Users prefer dark mode toggle in header\" (observation)\n- \"Implemented real-time notifications with WebSockets\" (feature)`,\n template: { when: 'Save decision/pattern/bugfix', params: '`type: \"decision\", title: \"...\"`' },\n workflow: { trigger: 'on_decision', order: 1 },\n category: 'memory',\n inputSchema: {\n type: 'object',\n properties: {\n ...PROJECT_PROPERTY,\n type: {\n type: 'string',\n enum: ['observation', 'decision', 'pattern', 'bugfix', 'feature'],\n description: 'Type of memory entry',\n },\n title: {\n type: 'string',\n description: 'Short summary (e.g., \"Use tRPC for type safety\")',\n },\n description: {\n type: 'string',\n description: 'Detailed description of the memory entry',\n },\n importance: {\n type: 'string',\n enum: ['low', 'medium', 'high', 'critical'],\n description: 'Importance level (default: medium)',\n },\n tags: {\n type: 'string',\n description: 'Comma-separated tags (e.g., \"api, typescript, performance\")',\n },\n files: {\n type: 'string',\n description: 'Comma-separated file paths related to this memory',\n },\n features: {\n type: 'string',\n description: 'Comma-separated features/domains (e.g., \"booking, auth\")',\n },\n },\n required: ['type', 'title', 'description'],\n },\n handler: (args, workspaceRoot) => {\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n const flags: string[] = [];\n\n if (args.type) flags.push(`--type \"${args.type}\"`);\n if (args.title) flags.push(`--title \"${String(args.title).replace(/\"/g, '\\\\\"')}\"`);\n if (args.description)\n flags.push(`--description \"${String(args.description).replace(/\"/g, '\\\\\"')}\"`);\n if (args.importance) flags.push(`--importance \"${args.importance}\"`);\n if (args.tags) flags.push(`--tags \"${args.tags}\"`);\n if (args.files) flags.push(`--files \"${args.files}\"`);\n if (args.features) flags.push(`--features \"${args.features}\"`);\n\n return runKrolik(`mem save ${flags.join(' ')}`, projectPath, TIMEOUT_60S);\n });\n },\n};\n\n/**\n * krolik_mem_search - Search memory entries\n */\nexport const memSearchTool: MCPToolDefinition = {\n name: 'krolik_mem_search',\n description: `Search memory entries by query, type, tags, or feature.\n\nExamples:\n- Search for \"tRPC\" decisions\n- Find all \"performance\" related entries\n- Search patterns for \"authentication\"`,\n template: { when: 'Search memories by query', params: '`query: \"authentication\"`' },\n category: 'memory',\n inputSchema: {\n type: 'object',\n properties: {\n ...PROJECT_PROPERTY,\n query: {\n type: 'string',\n description: 'Search query (searches in title and description)',\n },\n type: {\n type: 'string',\n enum: ['observation', 'decision', 'pattern', 'bugfix', 'feature'],\n description: 'Filter by memory type',\n },\n tags: {\n type: 'string',\n description: 'Filter by tags (comma-separated)',\n },\n features: {\n type: 'string',\n description: 'Filter by feature/domain (comma-separated)',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results (default: 10)',\n },\n },\n },\n handler: (args, workspaceRoot) => {\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n const flags: string[] = [];\n\n if (args.query) flags.push(`--query \"${String(args.query).replace(/\"/g, '\\\\\"')}\"`);\n if (args.type) flags.push(`--type \"${args.type}\"`);\n if (args.tags) flags.push(`--tags \"${args.tags}\"`);\n if (args.features) flags.push(`--features \"${args.features}\"`);\n if (args.limit) flags.push(`--limit ${args.limit}`);\n\n return runKrolik(`mem search ${flags.join(' ')}`, projectPath, TIMEOUT_60S);\n });\n },\n};\n\n/**\n * krolik_mem_recent - Get recent memory entries\n */\nexport const memRecentTool: MCPToolDefinition = {\n name: 'krolik_mem_recent',\n description: `Get recent memory entries, optionally filtered by type.\n\nUseful for:\n- Reviewing recent decisions\n- Checking latest bugfixes\n- Seeing recent patterns added`,\n template: { when: 'Get recent memories', params: '`limit: 5`' },\n workflow: { trigger: 'session_start', order: 2 },\n category: 'memory',\n inputSchema: {\n type: 'object',\n properties: {\n ...PROJECT_PROPERTY,\n limit: {\n type: 'number',\n description: 'Maximum number of entries to return (default: 10)',\n },\n type: {\n type: 'string',\n enum: ['observation', 'decision', 'pattern', 'bugfix', 'feature'],\n description: 'Filter by memory type',\n },\n },\n },\n handler: (args, workspaceRoot) => {\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n const flags: string[] = [];\n\n if (args.limit) flags.push(`--limit ${args.limit}`);\n if (args.type) flags.push(`--type \"${args.type}\"`);\n\n return runKrolik(`mem recent ${flags.join(' ')}`, projectPath, TIMEOUT_60S);\n });\n },\n};\n\n// Register all tools\nregisterTool(memSaveTool);\nregisterTool(memSearchTool);\nregisterTool(memRecentTool);\n","/**\n * @module mcp/tools/refactor\n * @description krolik_refactor tool - Module structure analysis and refactoring\n */\n\nimport {\n buildFlags,\n COMMON_FLAGS,\n type FlagSchema,\n type MCPToolDefinition,\n PROJECT_PROPERTY,\n registerTool,\n runKrolik,\n TIMEOUT_60S,\n withProjectDetection,\n} from '../core';\n\nconst refactorSchema: FlagSchema = {\n path: COMMON_FLAGS.path,\n package: { flag: '--package', sanitize: 'feature' },\n allPackages: { flag: '--all-packages' },\n duplicatesOnly: { flag: '--duplicates-only' },\n typesOnly: { flag: '--types-only' },\n includeTypes: { flag: '--include-types' },\n structureOnly: { flag: '--structure-only' },\n dryRun: COMMON_FLAGS.dryRun,\n apply: COMMON_FLAGS.apply,\n fixTypes: { flag: '--fix-types' },\n};\n\nexport const refactorTool: MCPToolDefinition = {\n name: 'krolik_refactor',\n description:\n 'Analyze and refactor module structure. Finds duplicate functions/types, analyzes structure, suggests migrations.',\n inputSchema: {\n type: 'object',\n properties: {\n ...PROJECT_PROPERTY,\n path: {\n type: 'string',\n description: 'Path to analyze (default: auto-detect for monorepo)',\n },\n package: {\n type: 'string',\n description: 'Monorepo package to analyze (e.g., web, api)',\n },\n allPackages: {\n type: 'boolean',\n description: 'Analyze all packages in monorepo',\n },\n duplicatesOnly: {\n type: 'boolean',\n description: 'Only analyze duplicate functions',\n },\n typesOnly: {\n type: 'boolean',\n description: 'Only analyze duplicate types/interfaces',\n },\n includeTypes: {\n type: 'boolean',\n description: 'Include type/interface duplicate detection',\n },\n structureOnly: {\n type: 'boolean',\n description: 'Only analyze module structure',\n },\n dryRun: {\n type: 'boolean',\n description: 'Show migration plan without applying',\n },\n apply: {\n type: 'boolean',\n description: 'Apply migrations (move files, update imports)',\n },\n fixTypes: {\n type: 'boolean',\n description: 'Auto-fix type duplicates (merge identical types)',\n },\n },\n },\n template: { when: 'Find duplicates/structure', params: '`dryRun: true`' },\n workflow: { trigger: 'on_refactor', order: 1 },\n category: 'code',\n handler: (args, workspaceRoot) => {\n const result = buildFlags(args, refactorSchema);\n if (!result.ok) {\n // Provide better error message for package name\n if (args.package && result.error.includes('package')) {\n return 'Error: Invalid package name.';\n }\n return result.error;\n }\n\n // Always use AI-native output for MCP\n const flags = result.flags ? `${result.flags} --ai` : '--ai';\n\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n return runKrolik(`refactor ${flags}`, projectPath, TIMEOUT_60S);\n });\n },\n};\n\nregisterTool(refactorTool);\n","/**\n * @module mcp/tools/review\n * @description krolik_review tool - Code review\n */\n\nimport {\n buildFlags,\n COMMON_FLAGS,\n type FlagSchema,\n type MCPToolDefinition,\n PROJECT_PROPERTY,\n registerTool,\n runKrolik,\n TIMEOUT_60S,\n withProjectDetection,\n} from '../core';\n\nconst reviewSchema: FlagSchema = {\n staged: COMMON_FLAGS.staged,\n pr: COMMON_FLAGS.pr,\n};\n\nexport const reviewTool: MCPToolDefinition = {\n name: 'krolik_review',\n description:\n 'Review code changes. Analyzes git diff for security issues, performance problems, and risks.',\n inputSchema: {\n type: 'object',\n properties: {\n ...PROJECT_PROPERTY,\n staged: {\n type: 'boolean',\n description: 'Review only staged changes',\n },\n pr: {\n type: 'string',\n description: 'Review specific PR number',\n },\n },\n },\n template: { when: 'After code changes', params: '`staged: true`' },\n workflow: { trigger: 'before_commit', order: 1 },\n category: 'code',\n handler: (args, workspaceRoot) => {\n const result = buildFlags(args, reviewSchema);\n if (!result.ok) return result.error;\n\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n return runKrolik(`review ${result.flags}`, projectPath, TIMEOUT_60S);\n });\n },\n};\n\nregisterTool(reviewTool);\n","/**\n * @module mcp/tools/routes\n * @description krolik_routes tool - tRPC routes analysis\n */\n\nimport {\n buildFlags,\n COMMON_FLAGS,\n type FlagSchema,\n type MCPToolDefinition,\n PROJECT_PROPERTY,\n registerTool,\n runKrolik,\n withProjectDetection,\n} from '../core';\n\nconst routesFlagSchema: FlagSchema = {\n json: COMMON_FLAGS.json,\n};\n\nexport const routesTool: MCPToolDefinition = {\n name: 'krolik_routes',\n description:\n 'Analyze tRPC API routes. Returns all procedures with types, inputs, and protection status.',\n inputSchema: {\n type: 'object',\n properties: {\n ...PROJECT_PROPERTY,\n json: {\n type: 'boolean',\n description: 'Return JSON format instead of markdown',\n },\n },\n },\n template: { when: 'API routes questions', params: '—' },\n category: 'context',\n handler: (args, workspaceRoot) => {\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n const result = buildFlags(args, routesFlagSchema);\n if (!result.ok) return result.error;\n return runKrolik(`routes ${result.flags}`, projectPath);\n });\n },\n};\n\nregisterTool(routesTool);\n","/**\n * @module mcp/tools/schema\n * @description krolik_schema tool - Prisma schema analysis\n */\n\nimport {\n buildFlags,\n COMMON_FLAGS,\n type FlagSchema,\n type MCPToolDefinition,\n PROJECT_PROPERTY,\n registerTool,\n runKrolik,\n withProjectDetection,\n} from '../core';\n\nconst schemaFlagSchema: FlagSchema = {\n json: COMMON_FLAGS.json,\n};\n\nexport const schemaTool: MCPToolDefinition = {\n name: 'krolik_schema',\n description: 'Analyze Prisma database schema. Returns all models, fields, relations, and enums.',\n inputSchema: {\n type: 'object',\n properties: {\n ...PROJECT_PROPERTY,\n json: {\n type: 'boolean',\n description: 'Return JSON format instead of markdown',\n },\n },\n },\n template: { when: 'DB schema questions', params: '—' },\n category: 'context',\n handler: (args, workspaceRoot) => {\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n const result = buildFlags(args, schemaFlagSchema);\n if (!result.ok) return result.error;\n return runKrolik(`schema ${result.flags}`, projectPath);\n });\n },\n};\n\nregisterTool(schemaTool);\n","/**\n * @module mcp/tools/status\n * @description krolik_status tool - Project diagnostics\n */\n\nimport {\n type MCPToolDefinition,\n PROJECT_PROPERTY,\n registerTool,\n runKrolik,\n withProjectDetection,\n} from '../core';\n\nexport const statusTool: MCPToolDefinition = {\n name: 'krolik_status',\n description:\n 'Get project diagnostics: git status, typecheck, lint, TODOs. Use this to understand the current state of the project.',\n inputSchema: {\n type: 'object',\n properties: {\n ...PROJECT_PROPERTY,\n fast: {\n type: 'boolean',\n description: 'Skip slow checks (typecheck, lint) for faster response',\n },\n },\n },\n template: { when: 'Session start', params: '`fast: true`' },\n workflow: { trigger: 'session_start', order: 1 },\n category: 'start',\n handler: (args, workspaceRoot) => {\n return withProjectDetection(args, workspaceRoot, (projectPath) => {\n const flags = args.fast ? '--fast' : '';\n return runKrolik(`status ${flags}`, projectPath);\n });\n },\n};\n\nregisterTool(statusTool);\n","/**\n * @module lib/fs\n * @description File system utilities\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Default directories to skip when walking\n */\nconst DEFAULT_SKIP_DIRS = ['node_modules', '.next', 'dist', '.git', '.turbo', 'coverage', '.cache'];\n\n/**\n * Options for file finding\n */\nexport interface FindFilesOptions {\n /** File extensions to include (e.g., ['.ts', '.tsx']) */\n extensions?: string[];\n /** Directories to skip */\n skipDirs?: string[];\n /** Maximum depth to traverse */\n maxDepth?: number;\n}\n\n/**\n * Check if a path exists\n */\nexport function exists(filePath: string): boolean {\n return fs.existsSync(filePath);\n}\n\n/**\n * Check if path is a directory\n */\nexport function isDirectory(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Check if path is a file\n */\nexport function isFile(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Read file contents as string\n */\nexport function readFile(filePath: string): string | null {\n try {\n return fs.readFileSync(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/**\n * Write content to file\n */\nexport function writeFile(filePath: string, content: string): boolean {\n try {\n const dir = path.dirname(filePath);\n if (!exists(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, content, 'utf-8');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Read and parse JSON file\n */\nexport function readJson<T = unknown>(filePath: string): T | null {\n const content = readFile(filePath);\n if (!content) return null;\n\n try {\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Write JSON to file\n */\nexport function writeJson(filePath: string, data: unknown, indent = 2): boolean {\n try {\n return writeFile(filePath, JSON.stringify(data, null, indent));\n } catch {\n return false;\n }\n}\n\n/**\n * Ensure directory exists\n */\nexport function ensureDir(dirPath: string): boolean {\n try {\n if (!exists(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get relative path from base\n */\nexport function relativePath(filePath: string, basePath: string): string {\n return path.relative(basePath, filePath);\n}\n\n/**\n * Find files recursively matching criteria\n */\nexport function findFiles(dir: string, options: FindFilesOptions = {}): string[] {\n const { extensions = [], skipDirs = DEFAULT_SKIP_DIRS, maxDepth = Infinity } = options;\n\n const files: string[] = [];\n\n function walk(currentDir: string, depth: number): void {\n if (depth > maxDepth || !exists(currentDir)) {\n return;\n }\n\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n if (!skipDirs.includes(entry.name)) {\n walk(fullPath, depth + 1);\n }\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name);\n if (extensions.length === 0 || extensions.includes(ext)) {\n files.push(fullPath);\n }\n }\n }\n }\n\n walk(dir, 0);\n return files;\n}\n\n/**\n * Get all subdirectories in a directory\n */\nexport function getSubdirectories(dir: string): string[] {\n if (!exists(dir) || !isDirectory(dir)) {\n return [];\n }\n\n try {\n return fs\n .readdirSync(dir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n } catch {\n return [];\n }\n}\n\n/**\n * List files in a directory (non-recursive)\n */\nexport function listFiles(dir: string, extensions?: string[]): string[] {\n if (!exists(dir) || !isDirectory(dir)) {\n return [];\n }\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n return entries\n .filter((entry) => {\n if (!entry.isFile()) return false;\n if (!extensions) return true;\n const ext = path.extname(entry.name);\n return extensions.includes(ext);\n })\n .map((entry) => entry.name);\n } catch {\n return [];\n }\n}\n","/**\n * @module lib/shell\n * @description Shell command execution utilities\n */\n\nimport { type ExecSyncOptions, execSync } from 'node:child_process';\n\n/**\n * Shell execution options\n */\nexport interface ShellOptions {\n /** Working directory */\n cwd?: string;\n /** Suppress output */\n silent?: boolean;\n /** Timeout in milliseconds */\n timeout?: number;\n /** Environment variables */\n env?: Record<string, string>;\n}\n\n/**\n * Shell execution result\n */\nexport interface ShellResult {\n /** Command succeeded */\n success: boolean;\n /** Command output */\n output: string;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Execute a shell command and return trimmed output\n *\n * @throws Error if command fails\n */\nexport function exec(command: string, options: ShellOptions = {}): string {\n const { cwd, silent = true, timeout = 30000, env } = options;\n\n const execOptions: ExecSyncOptions = {\n cwd,\n encoding: 'utf-8',\n stdio: silent ? ['pipe', 'pipe', 'pipe'] : 'inherit',\n timeout,\n env: env ? { ...process.env, ...env } : undefined,\n };\n\n return execSync(command, execOptions).toString().trim();\n}\n\n/**\n * Execute a shell command and return result object (never throws)\n */\nexport function tryExec(command: string, options: ShellOptions = {}): ShellResult {\n try {\n const output = exec(command, options);\n return { success: true, output };\n } catch (error) {\n const err = error as { stdout?: Buffer; stderr?: Buffer; message?: string };\n return {\n success: false,\n output: err.stdout?.toString() ?? '',\n error: err.stderr?.toString() ?? err.message ?? 'Unknown error',\n };\n }\n}\n\n/**\n * Execute a shell command and return lines array\n */\nexport function execLines(command: string, options: ShellOptions = {}): string[] {\n const result = tryExec(command, options);\n if (!result.success || !result.output) {\n return [];\n }\n return result.output.split('\\n').filter(Boolean);\n}\n\n/**\n * Check if a command exists in PATH\n */\nexport function commandExists(command: string): boolean {\n const result = tryExec(`command -v ${command}`);\n return result.success && result.output.length > 0;\n}\n\n/**\n * Get npm/pnpm package manager in use\n */\nexport function getPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n if (commandExists('pnpm')) return 'pnpm';\n if (commandExists('yarn')) return 'yarn';\n if (commandExists('bun')) return 'bun';\n return 'npm';\n}\n\n/**\n * Create shell options with optional cwd (convenience helper)\n */\nexport function shellOpts(cwd?: string): ShellOptions {\n const opts: ShellOptions = { silent: true };\n if (cwd) opts.cwd = cwd;\n return opts;\n}\n","/**\n * @module lib/@git/local\n * @description Git operations for local project repository\n */\n\nimport { execLines, shellOpts, tryExec } from '../@shell/shell';\n\nconst MAGIC_3_VALUE = 3;\n\nconst MAGIC_3 = MAGIC_3_VALUE;\n\n/**\n * Git status information\n */\nexport interface GitStatus {\n /** Files with modifications */\n modified: string[];\n /** Untracked files */\n untracked: string[];\n /** Staged files */\n staged: string[];\n /** Has any changes */\n hasChanges: boolean;\n}\n\n/**\n * Commit information\n */\nexport interface GitCommit {\n hash: string;\n message: string;\n author?: string;\n date?: string;\n}\n\n/**\n * Ahead/behind remote status\n */\nexport interface GitAheadBehind {\n ahead: number;\n behind: number;\n}\n\n/**\n * Check if current directory is a git repository\n */\nexport function isGitRepo(cwd?: string): boolean {\n const result = tryExec('git rev-parse --is-inside-work-tree', shellOpts(cwd));\n return result.success && result.output === 'true';\n}\n\n/**\n * Get current branch name\n */\nexport function getCurrentBranch(cwd?: string): string | null {\n const result = tryExec('git branch --show-current', shellOpts(cwd));\n return result.success ? result.output : null;\n}\n\n/**\n * Get default branch name (main or master)\n */\nexport function getDefaultBranch(cwd?: string): string {\n const result = tryExec(\n 'git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed \"s@^refs/remotes/origin/@@\"',\n shellOpts(cwd),\n );\n return result.success && result.output ? result.output : 'main';\n}\n\n/**\n * Get git status (modified, untracked, staged files)\n */\nexport function getStatus(cwd?: string): GitStatus {\n const result = tryExec('git status --porcelain', shellOpts(cwd));\n const lines = result.success ? result.output.split('\\n').filter(Boolean) : [];\n\n const modified: string[] = [];\n const untracked: string[] = [];\n const staged: string[] = [];\n\n for (const line of lines) {\n const status = line.slice(0, 2);\n const file = line.slice(MAGIC_3);\n\n if (status.startsWith('?')) {\n untracked.push(file);\n } else if (status[0] !== ' ') {\n staged.push(file);\n }\n\n if (status[1] === 'M' || status[0] === 'M') {\n modified.push(file);\n }\n }\n\n return {\n modified,\n untracked,\n staged,\n hasChanges: lines.length > 0,\n };\n}\n\n/**\n * Get recent commits\n */\nexport function getRecentCommits(count = 5, cwd?: string): GitCommit[] {\n const lines = execLines(`git log --oneline -${count}`, shellOpts(cwd));\n\n return lines.map((line) => {\n const [hash, ...messageParts] = line.split(' ');\n return {\n hash: hash ?? '',\n message: messageParts.join(' '),\n };\n });\n}\n\n/**\n * Get ahead/behind count from remote\n */\nexport function getAheadBehind(cwd?: string): GitAheadBehind | null {\n const result = tryExec(\n 'git rev-list --left-right --count HEAD...@{upstream} 2>/dev/null',\n shellOpts(cwd),\n );\n\n if (!result.success || !result.output) {\n return null;\n }\n\n const [ahead, behind] = result.output.split('\\t').map(Number);\n return { ahead: ahead ?? 0, behind: behind ?? 0 };\n}\n\n/**\n * Get diff stats between two refs\n */\nexport function getDiffStats(\n base: string,\n head: string,\n cwd?: string,\n): Array<{ path: string; additions: number; deletions: number }> {\n const result = tryExec(`git diff --numstat ${base}...${head}`, shellOpts(cwd));\n\n if (!result.success || !result.output) {\n return [];\n }\n\n return result.output\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [adds, dels, filepath] = line.split('\\t');\n return {\n path: filepath ?? '',\n additions: adds === '-' ? 0 : Number.parseInt(adds ?? '0', 10),\n deletions: dels === '-' ? 0 : Number.parseInt(dels ?? '0', 10),\n };\n });\n}\n\n/**\n * Get file diff\n */\nexport function getFileDiff(base: string, head: string, filepath: string, cwd?: string): string {\n const result = tryExec(`git diff ${base}...${head} -- \"${filepath}\"`, shellOpts(cwd));\n return result.success ? result.output : '';\n}\n\n/**\n * Get staged diff\n */\nexport function getStagedDiff(filepath?: string, cwd?: string): string {\n const fileArg = filepath ? `-- \"${filepath}\"` : '';\n const result = tryExec(`git diff --cached ${fileArg}`, shellOpts(cwd));\n return result.success ? result.output : '';\n}\n\n/**\n * Get full diff content between refs or for working directory\n */\nexport function getDiff(options?: {\n base?: string;\n head?: string;\n staged?: boolean;\n cwd?: string;\n}): string {\n const { base, head, staged, cwd } = options ?? {};\n\n let cmd: string;\n if (staged) {\n cmd = 'git diff --cached';\n } else if (base && head) {\n cmd = `git diff ${base}...${head}`;\n } else if (base) {\n cmd = `git diff ${base}`;\n } else {\n cmd = 'git diff';\n }\n\n const result = tryExec(cmd, shellOpts(cwd));\n return result.success ? result.output : '';\n}\n\n/**\n * Get list of staged files with their status\n */\nexport function getStagedFiles(cwd?: string): Array<{ path: string; status: string }> {\n const result = tryExec('git diff --cached --name-status', shellOpts(cwd));\n if (!result.success || !result.output) return [];\n\n return result.output\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [status, ...pathParts] = line.split('\\t');\n return {\n status: status ?? 'M',\n path: pathParts.join('\\t'),\n };\n });\n}\n\n/**\n * Get list of changed files (unstaged)\n */\nexport function getChangedFiles(cwd?: string): string[] {\n const result = tryExec('git diff --name-only', shellOpts(cwd));\n if (!result.success || !result.output) return [];\n return result.output.split('\\n').filter(Boolean);\n}\n\n/**\n * Get files changed between two refs\n */\nexport function getChangedFilesBetween(base: string, head: string, cwd?: string): string[] {\n const result = tryExec(`git diff --name-only ${base}...${head}`, shellOpts(cwd));\n if (!result.success || !result.output) return [];\n return result.output.split('\\n').filter(Boolean);\n}\n\n/**\n * Get the merge base between two refs\n */\nexport function getMergeBase(ref1: string, ref2: string, cwd?: string): string | null {\n const result = tryExec(`git merge-base ${ref1} ${ref2}`, shellOpts(cwd));\n return result.success ? result.output : null;\n}\n\n/**\n * Check if a ref exists\n */\nexport function refExists(ref: string, cwd?: string): boolean {\n const result = tryExec(`git rev-parse --verify ${ref}`, shellOpts(cwd));\n return result.success;\n}\n","/**\n * @module lib/logger\n * @description Colored console logging with multiple output styles\n */\n\nimport chalk from 'chalk';\nimport type { Logger, LogLevel } from '../../types';\n\n/**\n * Logger options\n */\ninterface LoggerOptions {\n /** Minimum log level */\n level?: LogLevel;\n /** Use colors */\n colors?: boolean;\n /** Custom write function (for testing) */\n write?: (message: string) => void;\n}\n\n/**\n * Log level priority\n */\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\n/**\n * Create a logger instance\n */\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const { level = 'info', colors = true, write = console.log } = options;\n\n const shouldLog = (msgLevel: LogLevel): boolean => {\n return LOG_LEVELS[msgLevel] >= LOG_LEVELS[level];\n };\n\n const format = colors\n ? {\n debug: (msg: string) => chalk.dim(msg),\n info: (msg: string) => chalk.cyan(msg),\n warn: (msg: string) => chalk.yellow(msg),\n error: (msg: string) => chalk.red(msg),\n success: (msg: string) => chalk.green(msg),\n header: (msg: string) => chalk.bold.blue(msg),\n }\n : {\n debug: (msg: string) => msg,\n info: (msg: string) => msg,\n warn: (msg: string) => `[WARN] ${msg}`,\n error: (msg: string) => `[ERROR] ${msg}`,\n success: (msg: string) => msg,\n header: (msg: string) => msg,\n };\n\n return {\n debug(message: string): void {\n if (shouldLog('debug')) {\n write(format.debug(message));\n }\n },\n\n info(message: string): void {\n if (shouldLog('info')) {\n write(format.info(message));\n }\n },\n\n warn(message: string): void {\n if (shouldLog('warn')) {\n write(format.warn(message));\n }\n },\n\n error(message: string): void {\n if (shouldLog('error')) {\n write(format.error(message));\n }\n },\n\n success(message: string): void {\n if (shouldLog('info')) {\n write(format.success(message));\n }\n },\n\n section(title: string): void {\n if (shouldLog('info')) {\n write('');\n write(format.header('═'.repeat(60)));\n write(format.header(` ${title}`));\n write(format.header('═'.repeat(60)));\n write('');\n }\n },\n\n box(lines: string[], type: 'info' | 'success' | 'warning' | 'error' = 'info'): void {\n if (!shouldLog('info')) return;\n\n const maxLen = Math.max(...lines.map((l) => l.length));\n const border = '─'.repeat(maxLen + 2);\n const colorFn =\n type === 'success'\n ? format.success\n : type === 'warning'\n ? format.warn\n : type === 'error'\n ? format.error\n : format.info;\n write(colorFn(`┌${border}┐`));\n for (const line of lines) {\n write(colorFn(`│ ${line.padEnd(maxLen)} │`));\n }\n write(colorFn(`└${border}┘`));\n },\n };\n}\n\n/**\n * Default logger instance\n */\nexport const logger = createLogger();\n","/**\n * @module lib/@patterns/complexity\n * @description Unified complexity patterns - single source of truth\n *\n * Used by:\n * - quality/analyzers/complexity.ts (detection)\n * - fix/strategies/complexity (fixing)\n */\n\nimport { SyntaxKind } from 'ts-morph';\n\n// ============================================================================\n// AST COMPLEXITY CALCULATION\n// ============================================================================\n\n/**\n * SyntaxKinds that increase cyclomatic complexity\n */\nexport const COMPLEXITY_SYNTAX_KINDS = new Set([\n SyntaxKind.IfStatement,\n SyntaxKind.ForStatement,\n SyntaxKind.ForInStatement,\n SyntaxKind.ForOfStatement,\n SyntaxKind.WhileStatement,\n SyntaxKind.DoStatement,\n SyntaxKind.CaseClause,\n SyntaxKind.CatchClause,\n SyntaxKind.ConditionalExpression,\n]);\n\n/**\n * Binary operators that add to complexity\n */\nexport const COMPLEXITY_OPERATORS = new Set([\n SyntaxKind.AmpersandAmpersandToken, // &&\n SyntaxKind.BarBarToken, // ||\n SyntaxKind.QuestionQuestionToken, // ??\n]);\n\n/**\n * Regex fallback patterns for complexity calculation\n */\nexport const COMPLEXITY_REGEX_PATTERNS = [\n /\\bif\\s*\\(/g,\n /\\bfor\\s*\\(/g,\n /\\bwhile\\s*\\(/g,\n /\\bdo\\s*\\{/g,\n /\\bcase\\s+[^:]+:/g,\n /\\bcatch\\s*\\(/g,\n /\\?\\s*[^:]+:/g,\n /&&/g,\n /\\|\\|/g,\n /\\?\\?/g,\n];\n\n// ============================================================================\n// THRESHOLDS\n// ============================================================================\n\n/**\n * Number range type\n */\nexport interface NumberRange {\n min: number;\n max: number;\n}\n\n/**\n * Complexity range we can handle (10-120)\n */\nexport const COMPLEXITY_RANGE: NumberRange = {\n min: 10,\n max: 120,\n};\n\n/**\n * Line count range for long function fixes (50-200)\n */\nexport const LONG_FUNCTION_RANGE: NumberRange = {\n min: 50,\n max: 200,\n};\n\n/**\n * Minimum block size for extraction (5+ lines)\n */\nexport const MIN_BLOCK_SIZE = 5;\n\n/**\n * Minimum complexity for block extraction\n */\nexport const MIN_BLOCK_COMPLEXITY = 2;\n\n/**\n * Minimum conditions for if-chain to map conversion\n */\nexport const MIN_IF_CHAIN_LENGTH = 4;\n\n/**\n * Minimum statements for early return transformation\n */\nexport const MIN_STATEMENTS_FOR_EARLY_RETURN = 3;\n\n/**\n * Default max nesting depth\n */\nexport const DEFAULT_MAX_NESTING = 4;\n\n/**\n * Default max function complexity\n */\nexport const DEFAULT_MAX_COMPLEXITY = 10;\n\n// ============================================================================\n// DETECTION PATTERNS (for fix strategies)\n// ============================================================================\n\n/**\n * Patterns to detect fixable complexity issues from quality messages\n */\nexport const DETECTION_PATTERNS = {\n /** Matches: \"nesting depth\" */\n NESTING: /nesting depth/i,\n /** Matches: \"has complexity 25 (max: 10)\" - captures the number */\n COMPLEXITY: /has\\s+complexity\\s+(\\d+)/i,\n /** Matches: \"has 50 lines\" or \"function ... 50 lines\" - captures the number */\n LONG_FUNCTION: /(\\d+)\\s*lines/i,\n} as const;\n\n// ============================================================================\n// FUNCTION NAME GENERATION\n// ============================================================================\n\n/**\n * Keyword to function name mapping for extracted functions\n */\nexport const FUNCTION_NAME_MAP: Record<string, string> = {\n // Validation\n valid: 'validateInput',\n check: 'checkCondition',\n // Error handling\n error: 'handleError',\n catch: 'handleError',\n // Data fetching\n fetch: 'fetchData',\n request: 'fetchData',\n // Data transformation\n transform: 'transformData',\n map: 'transformData',\n filter: 'filterItems',\n sort: 'sortItems',\n // Rendering\n render: 'renderContent',\n component: 'renderContent',\n // Lifecycle\n init: 'initialize',\n setup: 'initialize',\n clean: 'cleanup',\n dispose: 'cleanup',\n // Configuration\n config: 'processConfig',\n option: 'processConfig',\n // I/O\n format: 'formatOutput',\n parse: 'parseInput',\n // CRUD\n update: 'updateState',\n create: 'createItem',\n delete: 'removeItem',\n remove: 'removeItem',\n};\n\n/**\n * Default function name when no keyword matches\n */\nexport const DEFAULT_FUNCTION_NAME = 'processBlock';\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/**\n * Calculate complexity using regex (fallback)\n */\nexport function calculateComplexityRegex(code: string): number {\n let complexity = 1;\n\n for (const pattern of COMPLEXITY_REGEX_PATTERNS) {\n const matches = code.match(pattern);\n if (matches) {\n complexity += matches.length;\n }\n }\n\n return complexity;\n}\n\n/**\n * Check if complexity is in fixable range\n */\nexport function isFixableComplexity(complexity: number): boolean {\n return complexity >= COMPLEXITY_RANGE.min && complexity <= COMPLEXITY_RANGE.max;\n}\n\n/**\n * Check if function length is in fixable range\n */\nexport function isFixableFunctionLength(lines: number): boolean {\n return lines >= LONG_FUNCTION_RANGE.min && lines <= LONG_FUNCTION_RANGE.max;\n}\n\n/**\n * Get function name from code content keywords\n */\nexport function getFunctionNameFromKeywords(codeSnippet: string): string {\n const lowerCode = codeSnippet.toLowerCase();\n\n for (const [keyword, name] of Object.entries(FUNCTION_NAME_MAP)) {\n if (lowerCode.includes(keyword)) {\n return name;\n }\n }\n\n return DEFAULT_FUNCTION_NAME;\n}\n","/**\n * @module config/detect\n * @description Auto-detection of project features and paths\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { exists, isDirectory, readJson } from '../lib';\nimport type { FeatureConfig, PathConfig, PrismaConfig, TrpcConfig } from '../types';\n\n/**\n * Package.json structure (partial)\n */\ninterface PackageJson {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: string[] | { packages: string[] };\n}\n\n/**\n * Detect features from package.json\n */\nexport function detectFeatures(projectRoot: string): Partial<FeatureConfig> {\n const pkgPath = path.join(projectRoot, 'package.json');\n const pkg = readJson<PackageJson>(pkgPath);\n\n if (!pkg) {\n return {};\n }\n\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n const hasWorkspaces = Boolean(pkg.workspaces);\n\n return {\n prisma: '@prisma/client' in allDeps || 'prisma' in allDeps,\n trpc: '@trpc/server' in allDeps || '@trpc/client' in allDeps,\n nextjs: 'next' in allDeps,\n react: 'react' in allDeps,\n monorepo: hasWorkspaces || exists(path.join(projectRoot, 'pnpm-workspace.yaml')),\n typescript: 'typescript' in allDeps || exists(path.join(projectRoot, 'tsconfig.json')),\n };\n}\n\n/**\n * Detect path configuration\n */\nexport function detectPaths(projectRoot: string, isMonorepo: boolean): Partial<PathConfig> {\n const detected: Partial<PathConfig> = {};\n\n if (isMonorepo) {\n // Common monorepo structures\n const monorepoPatterns = [\n { web: 'apps/web', api: 'packages/api', db: 'packages/db', shared: 'packages/shared' },\n { web: 'packages/web', api: 'packages/api', db: 'packages/db', shared: 'packages/shared' },\n {\n web: 'apps/frontend',\n api: 'apps/backend',\n db: 'packages/database',\n shared: 'packages/common',\n },\n ];\n\n for (const pattern of monorepoPatterns) {\n if (exists(path.join(projectRoot, pattern.web))) {\n detected.web = pattern.web;\n detected.api = pattern.api;\n detected.db = pattern.db;\n detected.shared = pattern.shared;\n break;\n }\n }\n } else {\n // Single project structures\n if (exists(path.join(projectRoot, 'src'))) {\n detected.web = 'src';\n detected.lib = 'src/lib';\n detected.components = 'src/components';\n detected.hooks = 'src/hooks';\n }\n\n if (exists(path.join(projectRoot, 'app'))) {\n detected.web = 'app';\n }\n }\n\n return detected;\n}\n\n/**\n * Detect Prisma configuration\n */\nexport function detectPrisma(projectRoot: string, _webPath?: string): Partial<PrismaConfig> {\n const detected: Partial<PrismaConfig> = {};\n\n // Check for multi-file schema\n const multiSchemaPath = path.join(projectRoot, 'prisma/schema');\n if (isDirectory(multiSchemaPath)) {\n detected.schemaDir = 'prisma/schema';\n return detected;\n }\n\n // Check for single schema file\n const singleSchemaPath = path.join(projectRoot, 'prisma/schema.prisma');\n if (exists(singleSchemaPath)) {\n detected.schemaDir = 'prisma/schema.prisma';\n return detected;\n }\n\n // Check in packages/db for monorepo\n const pkgDbSchema = path.join(projectRoot, 'packages/db/prisma/schema');\n if (isDirectory(pkgDbSchema)) {\n detected.schemaDir = 'packages/db/prisma/schema';\n return detected;\n }\n\n const pkgDbSingleSchema = path.join(projectRoot, 'packages/db/prisma/schema.prisma');\n if (exists(pkgDbSingleSchema)) {\n detected.schemaDir = 'packages/db/prisma/schema.prisma';\n return detected;\n }\n\n return detected;\n}\n\n/**\n * Detect tRPC configuration\n */\nexport function detectTrpc(projectRoot: string, _apiPath?: string): Partial<TrpcConfig> {\n const detected: Partial<TrpcConfig> = {};\n\n // Common router locations\n const routerPatterns = [\n 'src/server/routers',\n 'src/trpc/routers',\n 'server/routers',\n 'packages/api/src/routers',\n 'apps/api/src/routers',\n ];\n\n for (const pattern of routerPatterns) {\n const fullPath = path.join(projectRoot, pattern);\n if (isDirectory(fullPath)) {\n detected.routersDir = pattern;\n\n // Try to find app router\n const indexPath = path.join(fullPath, 'index.ts');\n if (exists(indexPath)) {\n detected.appRouter = `${pattern}/index.ts`;\n }\n break;\n }\n }\n\n return detected;\n}\n\n/**\n * Detect project name from package.json\n */\nexport function detectProjectName(projectRoot: string): string | undefined {\n const pkgPath = path.join(projectRoot, 'package.json');\n const pkg = readJson<PackageJson>(pkgPath);\n return pkg?.name;\n}\n\n/**\n * Monorepo package info for refactor command\n */\nexport interface MonorepoPackage {\n /** Package name (e.g., 'web', 'api') */\n name: string;\n /** Path to package root relative to project root */\n path: string;\n /** Path to lib directory relative to project root */\n libPath: string;\n /** Path to tsconfig.json */\n tsconfigPath: string;\n /** Package type */\n type: 'app' | 'package';\n}\n\n/**\n * Detect all packages with lib directories in a monorepo\n */\nexport function detectMonorepoPackages(projectRoot: string): MonorepoPackage[] {\n const packages: MonorepoPackage[] = [];\n\n // Common lib locations within packages\n const libPatterns = ['lib', 'src/lib'];\n\n // Check apps/\n const appsDir = path.join(projectRoot, 'apps');\n if (isDirectory(appsDir)) {\n const apps = fs.readdirSync(appsDir).filter((name: string) => {\n const fullPath = path.join(appsDir, name);\n return isDirectory(fullPath) && !name.startsWith('.');\n });\n\n for (const app of apps) {\n const appPath = path.join('apps', app);\n\n for (const libPattern of libPatterns) {\n const libPath = path.join(appPath, libPattern);\n const fullLibPath = path.join(projectRoot, libPath);\n\n if (isDirectory(fullLibPath)) {\n // Find tsconfig\n let tsconfigPath = path.join(appPath, 'tsconfig.json');\n if (!exists(path.join(projectRoot, tsconfigPath))) {\n tsconfigPath = 'tsconfig.base.json';\n }\n\n packages.push({\n name: app,\n path: appPath,\n libPath,\n tsconfigPath,\n type: 'app',\n });\n break;\n }\n }\n }\n }\n\n // Check packages/\n const packagesDir = path.join(projectRoot, 'packages');\n if (isDirectory(packagesDir)) {\n const pkgs = fs.readdirSync(packagesDir).filter((name: string) => {\n const fullPath = path.join(packagesDir, name);\n return isDirectory(fullPath) && !name.startsWith('.');\n });\n\n for (const pkg of pkgs) {\n const pkgPath = path.join('packages', pkg);\n\n for (const libPattern of libPatterns) {\n const libPath = path.join(pkgPath, libPattern);\n const fullLibPath = path.join(projectRoot, libPath);\n\n if (isDirectory(fullLibPath)) {\n // Find tsconfig\n let tsconfigPath = path.join(pkgPath, 'tsconfig.json');\n if (!exists(path.join(projectRoot, tsconfigPath))) {\n tsconfigPath = 'tsconfig.base.json';\n }\n\n packages.push({\n name: pkg,\n path: pkgPath,\n libPath,\n tsconfigPath,\n type: 'package',\n });\n break;\n }\n }\n }\n }\n\n return packages;\n}\n\n/**\n * Run all detections and return partial config\n */\nexport function detectAll(projectRoot: string): {\n name: string | undefined;\n features: Partial<FeatureConfig>;\n paths: Partial<PathConfig>;\n prisma: Partial<PrismaConfig>;\n trpc: Partial<TrpcConfig>;\n} {\n const features = detectFeatures(projectRoot);\n const paths = detectPaths(projectRoot, features.monorepo ?? false);\n const prisma = features.prisma ? detectPrisma(projectRoot, paths.web) : {};\n const trpc = features.trpc ? detectTrpc(projectRoot, paths.api) : {};\n const name = detectProjectName(projectRoot);\n\n return {\n name,\n features,\n paths,\n prisma,\n trpc,\n };\n}\n","/**\n * @module config/domains\n * @description Domain definitions and keyword mappings for context detection\n */\n\n/**\n * Domain keyword mappings - used to detect which domain a task belongs to\n */\nexport const DOMAIN_KEYWORDS: Record<string, string[]> = {\n booking: [\n 'booking',\n 'slot',\n 'availability',\n 'schedule',\n 'appointment',\n 'reservation',\n 'calendar',\n 'time slot',\n 'bookingSettings',\n 'busySlot',\n ],\n events: ['events', 'event', 'ticket', 'ticketing', 'venue', 'concert', 'festival'],\n places: ['places', 'place', 'business', 'location', 'restaurant', 'cafe', 'bar', 'club'],\n users: ['users', 'user', 'profile', 'account', 'auth', 'login', 'registration'],\n crm: ['crm', 'customer', 'client', 'lead', 'contact', 'interaction', 'customerNote'],\n gamification: [\n 'gamification',\n 'reward',\n 'points',\n 'achievement',\n 'badge',\n 'level',\n 'leaderboard',\n 'streak',\n ],\n payments: [\n 'payment',\n 'subscription',\n 'invoice',\n 'billing',\n 'transaction',\n 'refund',\n 'payout',\n 'stripe',\n ],\n notifications: [\n 'notification',\n 'email',\n 'sms',\n 'push',\n 'reminder',\n 'alert',\n 'message',\n 'template',\n ],\n admin: [\n 'admin',\n 'dashboard',\n 'analytics',\n 'moderation',\n 'report',\n 'stats',\n 'metrics',\n 'management',\n ],\n mobile: ['mobile', 'expo', 'react native', 'app', 'ios', 'android', 'push notification'],\n};\n\n/**\n * Domain file patterns - used to find related files for each domain\n * Patterns use glob syntax\n */\nexport const DOMAIN_FILES: Record<string, string[]> = {\n booking: [\n 'packages/api/src/routers/booking*.ts',\n 'packages/api/src/routers/business/booking*.ts',\n 'apps/web/components/Business/Booking/**/*.tsx',\n 'apps/web/components/booking/**/*.tsx',\n 'packages/db/prisma/models/booking*.prisma',\n 'packages/shared/src/schemas/booking*.ts',\n ],\n events: [\n 'packages/api/src/routers/events*.ts',\n 'packages/api/src/routers/business/ticketing*.ts',\n 'apps/web/components/Business/Ticketing/**/*.tsx',\n 'apps/web/components/events/**/*.tsx',\n 'packages/db/prisma/models/event*.prisma',\n 'packages/db/prisma/models/ticket*.prisma',\n 'packages/shared/src/schemas/event*.ts',\n ],\n places: [\n 'packages/api/src/routers/places*.ts',\n 'packages/api/src/routers/business*.ts',\n 'apps/web/components/Business/**/*.tsx',\n 'apps/web/components/places/**/*.tsx',\n 'packages/db/prisma/models/place*.prisma',\n 'packages/db/prisma/models/business*.prisma',\n 'packages/shared/src/schemas/place*.ts',\n ],\n users: [\n 'packages/api/src/routers/user*.ts',\n 'packages/api/src/routers/auth*.ts',\n 'apps/web/components/auth/**/*.tsx',\n 'apps/web/components/profile/**/*.tsx',\n 'packages/db/prisma/models/user*.prisma',\n 'packages/shared/src/schemas/user*.ts',\n ],\n crm: [\n 'packages/api/src/routers/business/crm*.ts',\n 'packages/api/src/routers/customer*.ts',\n 'apps/web/components/Business/CRM/**/*.tsx',\n 'packages/db/prisma/models/customer*.prisma',\n 'packages/shared/src/schemas/customer*.ts',\n ],\n gamification: [\n 'packages/api/src/routers/gamification*.ts',\n 'apps/web/components/gamification/**/*.tsx',\n 'packages/db/prisma/models/gamification*.prisma',\n 'packages/shared/src/schemas/gamification*.ts',\n ],\n payments: [\n 'packages/api/src/routers/payment*.ts',\n 'packages/api/src/routers/subscription*.ts',\n 'apps/web/components/payments/**/*.tsx',\n 'packages/db/prisma/models/payment*.prisma',\n 'packages/db/prisma/models/subscription*.prisma',\n ],\n notifications: [\n 'packages/api/src/routers/notification*.ts',\n 'apps/web/components/notifications/**/*.tsx',\n 'packages/db/prisma/models/notification*.prisma',\n ],\n admin: [\n 'packages/api/src/routers/admin*.ts',\n 'apps/web/components/admin/**/*.tsx',\n 'apps/web/app/admin/**/*.tsx',\n ],\n mobile: ['apps/mobile/**/*.tsx', 'apps/mobile/**/*.ts', 'packages/shared/src/mobile/**/*.ts'],\n};\n\n/**\n * Suggested approaches for each domain\n */\nexport const DOMAIN_APPROACHES: Record<string, string[]> = {\n booking: [\n 'Check existing Booking schema in packages/db/prisma/models/',\n 'Review tRPC router at packages/api/src/routers/',\n 'Update Zod schemas in packages/shared/',\n 'Create/update React components in apps/web/components/Business/Booking/',\n 'Add tests for new booking logic',\n ],\n events: [\n 'Check Event/Ticket schemas in packages/db/prisma/models/',\n 'Review tRPC router for events/ticketing',\n 'Update Zod schemas in packages/shared/',\n 'Create/update React components in apps/web/components/Business/Ticketing/',\n 'Consider event occurrence patterns',\n ],\n places: [\n 'Check Place/Business schemas in packages/db/prisma/models/',\n 'Review tRPC router for places/business',\n 'Update Zod schemas in packages/shared/',\n 'Consider business hours and availability',\n ],\n users: [\n 'Check User schema in packages/db/prisma/models/',\n 'Review auth router in packages/api/',\n 'Update authentication middleware if needed',\n 'Consider email verification flow',\n ],\n crm: [\n 'Check Customer schema in packages/db/prisma/models/',\n 'Review CRM router in packages/api/src/routers/business/',\n 'Update customer interaction tracking',\n 'Consider segmentation logic',\n ],\n gamification: [\n 'Check Gamification schema in packages/db/prisma/models/',\n 'Review points calculation logic',\n 'Update achievement triggers',\n 'Consider leaderboard queries performance',\n ],\n payments: [\n 'Check Payment/Subscription schemas',\n 'Review Stripe integration',\n 'Update webhook handlers',\n 'Consider refund flow',\n ],\n notifications: [\n 'Check Notification schema',\n 'Review email/SMS templates',\n 'Update notification triggers',\n 'Consider push notification setup',\n ],\n admin: [\n 'Check admin permissions',\n 'Review dashboard queries for performance',\n 'Update analytics aggregations',\n 'Consider data export functionality',\n ],\n mobile: [\n 'Check Expo setup in apps/mobile/',\n 'Review shared components from packages/shared/',\n 'Update navigation structure',\n 'Consider offline support',\n ],\n};\n\n/**\n * Detect domains from text (issue title, description, etc.)\n */\nexport function detectDomains(text: string): string[] {\n const lowerText = text.toLowerCase();\n const detected: string[] = [];\n\n for (const [domain, keywords] of Object.entries(DOMAIN_KEYWORDS)) {\n for (const keyword of keywords) {\n if (lowerText.includes(keyword.toLowerCase())) {\n if (!detected.includes(domain)) {\n detected.push(domain);\n }\n break;\n }\n }\n }\n\n return detected;\n}\n\n/**\n * Get related files for domains\n */\nexport function getRelatedFiles(domains: string[]): string[] {\n const files: string[] = [];\n\n for (const domain of domains) {\n const patterns = DOMAIN_FILES[domain];\n if (patterns) {\n files.push(...patterns);\n }\n }\n\n return [...new Set(files)];\n}\n\n/**\n * Get suggested approaches for domains\n */\nexport function getApproaches(domains: string[]): string[] {\n const approaches: string[] = [];\n\n for (const domain of domains) {\n const steps = DOMAIN_APPROACHES[domain];\n if (steps) {\n approaches.push(...steps);\n }\n }\n\n return [...new Set(approaches)];\n}\n","/**\n * @module config/loader\n * @description Configuration loading and resolution\n */\n\nimport * as path from 'node:path';\nimport { cosmiconfig } from 'cosmiconfig';\nimport type { KrolikConfig, ResolvedConfig } from '../types';\nimport { createDefaultConfig } from './defaults';\nimport { detectAll } from './detect';\n\n/**\n * Config file names to search for\n */\nconst CONFIG_MODULE_NAME = 'krolik';\n\n/**\n * Cached config instance\n */\nlet cachedConfig: ResolvedConfig | null = null;\nlet cachedProjectRoot: string | null = null;\n\n/**\n * Find project root by looking for package.json\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string {\n let currentDir = startDir;\n\n while (currentDir !== path.dirname(currentDir)) {\n const pkgPath = path.join(currentDir, 'package.json');\n try {\n const fs = require('node:fs');\n if (fs.existsSync(pkgPath)) {\n return currentDir;\n }\n } catch {\n // Continue searching\n }\n currentDir = path.dirname(currentDir);\n }\n\n return startDir;\n}\n\n/**\n * Load config from file using cosmiconfig\n */\nasync function loadConfigFile(projectRoot: string): Promise<KrolikConfig | null> {\n const explorer = cosmiconfig(CONFIG_MODULE_NAME, {\n searchPlaces: [\n 'krolik.config.ts',\n 'krolik.config.js',\n 'krolik.config.mjs',\n 'krolik.config.json',\n 'krolik.config.yaml',\n 'krolik.config.yml',\n 'krolik.yaml',\n 'krolik.yml',\n '.krolikrc',\n '.krolikrc.json',\n '.krolikrc.yaml',\n '.krolikrc.yml',\n '.krolikrc.js',\n '.krolikrc.ts',\n ],\n });\n\n try {\n const result = await explorer.search(projectRoot);\n return result?.config ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Merge user config with defaults and auto-detected values\n */\nfunction resolveConfig(\n userConfig: KrolikConfig | null,\n detected: ReturnType<typeof detectAll>,\n projectRoot: string,\n): ResolvedConfig {\n const base = createDefaultConfig(projectRoot);\n\n // Apply detected values first (can be overridden by user config)\n const resolvedPaths = {\n ...base.paths,\n ...detected.paths,\n ...userConfig?.paths,\n };\n\n const resolvedFeatures = {\n ...base.features,\n ...detected.features,\n ...userConfig?.features,\n };\n\n const resolvedPrisma = {\n ...base.prisma,\n ...detected.prisma,\n ...userConfig?.prisma,\n };\n\n const resolvedTrpc = {\n ...base.trpc,\n ...detected.trpc,\n ...userConfig?.trpc,\n };\n\n return {\n name: userConfig?.name ?? detected.name ?? base.name,\n projectRoot: userConfig?.projectRoot ?? projectRoot,\n paths: resolvedPaths,\n features: resolvedFeatures,\n prisma: resolvedPrisma,\n trpc: resolvedTrpc,\n templates: { ...base.templates, ...userConfig?.templates },\n exclude: userConfig?.exclude ?? base.exclude,\n extensions: userConfig?.extensions ?? base.extensions,\n };\n}\n\n/**\n * Load and resolve configuration\n */\nexport async function loadConfig(\n options: { configPath?: string; projectRoot?: string; noCache?: boolean } = {},\n): Promise<ResolvedConfig> {\n const { projectRoot: explicitRoot, noCache = false } = options;\n\n // Use cached config if available\n const projectRoot = explicitRoot ?? findProjectRoot();\n if (!noCache && cachedConfig && cachedProjectRoot === projectRoot) {\n return cachedConfig;\n }\n\n // Load user config file\n const userConfig = await loadConfigFile(projectRoot);\n\n // Auto-detect project features\n const detected = detectAll(projectRoot);\n\n // Resolve final config\n const resolved = resolveConfig(userConfig, detected, projectRoot);\n\n // Cache the result\n cachedConfig = resolved;\n cachedProjectRoot = projectRoot;\n\n return resolved;\n}\n\n/**\n * Get config synchronously (must have been loaded first)\n */\nexport function getConfig(): ResolvedConfig {\n if (!cachedConfig) {\n // Return default config if not loaded\n const projectRoot = findProjectRoot();\n const detected = detectAll(projectRoot);\n return resolveConfig(null, detected, projectRoot);\n }\n return cachedConfig;\n}\n\n/**\n * Clear config cache\n */\nexport function clearConfigCache(): void {\n cachedConfig = null;\n cachedProjectRoot = null;\n}\n\n/**\n * Helper to define config with type checking\n */\nexport function defineConfig(config: KrolikConfig): KrolikConfig {\n return config;\n}\n"]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { R as ResolvedConfig, F as FeatureConfig, P as PathConfig, a as PrismaConfig, c as TrpcConfig } from '../loader-_tD59b9E.js';
|
|
2
|
+
export { e as clearConfigCache, d as defineConfig, f as findProjectRoot, g as getConfig, l as loadConfig } from '../loader-_tD59b9E.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @module config/defaults
|
|
6
|
+
* @description Default configuration values
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Default path configuration
|
|
11
|
+
*/
|
|
12
|
+
declare const DEFAULT_PATHS: Required<PathConfig>;
|
|
13
|
+
/**
|
|
14
|
+
* Default feature configuration
|
|
15
|
+
*/
|
|
16
|
+
declare const DEFAULT_FEATURES: Required<FeatureConfig>;
|
|
17
|
+
/**
|
|
18
|
+
* Default exclude patterns
|
|
19
|
+
*/
|
|
20
|
+
declare const DEFAULT_EXCLUDE: string[];
|
|
21
|
+
/**
|
|
22
|
+
* Default file extensions
|
|
23
|
+
*/
|
|
24
|
+
declare const DEFAULT_EXTENSIONS: string[];
|
|
25
|
+
/**
|
|
26
|
+
* Create default resolved config
|
|
27
|
+
*/
|
|
28
|
+
declare function createDefaultConfig(projectRoot: string): ResolvedConfig;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @module config/detect
|
|
32
|
+
* @description Auto-detection of project features and paths
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Detect features from package.json
|
|
37
|
+
*/
|
|
38
|
+
declare function detectFeatures(projectRoot: string): Partial<FeatureConfig>;
|
|
39
|
+
/**
|
|
40
|
+
* Detect path configuration
|
|
41
|
+
*/
|
|
42
|
+
declare function detectPaths(projectRoot: string, isMonorepo: boolean): Partial<PathConfig>;
|
|
43
|
+
/**
|
|
44
|
+
* Detect Prisma configuration
|
|
45
|
+
*/
|
|
46
|
+
declare function detectPrisma(projectRoot: string, _webPath?: string): Partial<PrismaConfig>;
|
|
47
|
+
/**
|
|
48
|
+
* Detect tRPC configuration
|
|
49
|
+
*/
|
|
50
|
+
declare function detectTrpc(projectRoot: string, _apiPath?: string): Partial<TrpcConfig>;
|
|
51
|
+
/**
|
|
52
|
+
* Detect project name from package.json
|
|
53
|
+
*/
|
|
54
|
+
declare function detectProjectName(projectRoot: string): string | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* Monorepo package info for refactor command
|
|
57
|
+
*/
|
|
58
|
+
interface MonorepoPackage {
|
|
59
|
+
/** Package name (e.g., 'web', 'api') */
|
|
60
|
+
name: string;
|
|
61
|
+
/** Path to package root relative to project root */
|
|
62
|
+
path: string;
|
|
63
|
+
/** Path to lib directory relative to project root */
|
|
64
|
+
libPath: string;
|
|
65
|
+
/** Path to tsconfig.json */
|
|
66
|
+
tsconfigPath: string;
|
|
67
|
+
/** Package type */
|
|
68
|
+
type: 'app' | 'package';
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Detect all packages with lib directories in a monorepo
|
|
72
|
+
*/
|
|
73
|
+
declare function detectMonorepoPackages(projectRoot: string): MonorepoPackage[];
|
|
74
|
+
/**
|
|
75
|
+
* Run all detections and return partial config
|
|
76
|
+
*/
|
|
77
|
+
declare function detectAll(projectRoot: string): {
|
|
78
|
+
name: string | undefined;
|
|
79
|
+
features: Partial<FeatureConfig>;
|
|
80
|
+
paths: Partial<PathConfig>;
|
|
81
|
+
prisma: Partial<PrismaConfig>;
|
|
82
|
+
trpc: Partial<TrpcConfig>;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @module config/domains
|
|
87
|
+
* @description Domain definitions and keyword mappings for context detection
|
|
88
|
+
*/
|
|
89
|
+
/**
|
|
90
|
+
* Domain keyword mappings - used to detect which domain a task belongs to
|
|
91
|
+
*/
|
|
92
|
+
declare const DOMAIN_KEYWORDS: Record<string, string[]>;
|
|
93
|
+
/**
|
|
94
|
+
* Domain file patterns - used to find related files for each domain
|
|
95
|
+
* Patterns use glob syntax
|
|
96
|
+
*/
|
|
97
|
+
declare const DOMAIN_FILES: Record<string, string[]>;
|
|
98
|
+
/**
|
|
99
|
+
* Suggested approaches for each domain
|
|
100
|
+
*/
|
|
101
|
+
declare const DOMAIN_APPROACHES: Record<string, string[]>;
|
|
102
|
+
/**
|
|
103
|
+
* Detect domains from text (issue title, description, etc.)
|
|
104
|
+
*/
|
|
105
|
+
declare function detectDomains(text: string): string[];
|
|
106
|
+
/**
|
|
107
|
+
* Get related files for domains
|
|
108
|
+
*/
|
|
109
|
+
declare function getRelatedFiles(domains: string[]): string[];
|
|
110
|
+
/**
|
|
111
|
+
* Get suggested approaches for domains
|
|
112
|
+
*/
|
|
113
|
+
declare function getApproaches(domains: string[]): string[];
|
|
114
|
+
|
|
115
|
+
export { DEFAULT_EXCLUDE, DEFAULT_EXTENSIONS, DEFAULT_FEATURES, DEFAULT_PATHS, DOMAIN_APPROACHES, DOMAIN_FILES, DOMAIN_KEYWORDS, type MonorepoPackage, createDefaultConfig, detectAll, detectDomains, detectFeatures, detectMonorepoPackages, detectPaths, detectPrisma, detectProjectName, detectTrpc, getApproaches, getRelatedFiles };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { DEFAULT_EXCLUDE, DEFAULT_EXTENSIONS, DEFAULT_FEATURES, DEFAULT_PATHS, DOMAIN_APPROACHES, DOMAIN_FILES, DOMAIN_KEYWORDS, clearConfigCache, createDefaultConfig, defineConfig, detectAll, detectDomains, detectFeatures, detectMonorepoPackages, detectPaths, detectPrisma, detectProjectName, detectTrpc, findProjectRoot, getApproaches, getConfig, getRelatedFiles, loadConfig } from '../chunk-DTDOBWO6.js';
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|