@makeitvisible/cli 0.1.0 → 0.2.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 +43 -0
- package/dist/bin/index.js +696 -82
- package/dist/bin/index.js.map +1 -1
- package/dist/index.d.ts +17 -62
- package/dist/index.js +143 -11
- package/dist/index.js.map +1 -1
- package/dist/types-BmNeVNFe.d.ts +62 -0
- package/dist/video/remotion/index.d.ts +2 -0
- package/dist/video/remotion/index.js +716 -0
- package/dist/video/remotion/index.js.map +1 -0
- package/dist/video/remotion/render.d.ts +111 -0
- package/dist/video/remotion/render.js +110 -0
- package/dist/video/remotion/render.js.map +1 -0
- package/dist/video/renderer.d.ts +154 -0
- package/dist/video/renderer.js +367 -0
- package/dist/video/renderer.js.map +1 -0
- package/package.json +15 -4
package/dist/bin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/analyzers/git/index.ts","../../src/agent/tools/definitions.ts","../../src/agent/tools/implementations.ts","../../src/agent/detective.ts","../../src/api/client.ts","../../src/commands/analyze.ts","../../src/bin/index.ts"],"names":["range","result","listDir","execSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Git Analyzer\n *\n * Analyzes Git repositories, commits, branches, and pull requests.\n *\n * Features:\n * - Parse commit history\n * - Analyze PR changes\n * - Extract diff information\n * - Identify changed files and their context\n */\n\nimport { execSync } from \"child_process\";\nimport type { ArtifactSource, ArtifactContext } from \"../../shared/types.js\";\n\nexport interface AnalysisResult {\n title: string;\n description: string;\n source: ArtifactSource;\n context: ArtifactContext;\n guidelines: string[];\n}\n\ninterface DiffFile {\n path: string;\n additions: number;\n deletions: number;\n status: \"added\" | \"modified\" | \"deleted\" | \"renamed\";\n}\n\ninterface CommitInfo {\n hash: string;\n author: string;\n date: string;\n message: string;\n}\n\n/**\n * Execute a git command and return the output\n */\nfunction git(command: string): string {\n try {\n return execSync(`git ${command}`, {\n encoding: \"utf-8\",\n maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large diffs\n }).trim();\n } catch (error) {\n throw new Error(`Git command failed: git ${command}`);\n }\n}\n\n/**\n * Check if a git revision exists\n */\nfunction revisionExists(revision: string): boolean {\n try {\n git(`rev-parse --verify ${revision}`);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the default diff range based on available commits\n */\nfunction getDefaultRange(): string {\n // Check if HEAD~1 exists (more than one commit)\n if (revisionExists(\"HEAD~1\")) {\n return \"HEAD~1..HEAD\";\n }\n\n // Check if HEAD exists (at least one commit)\n if (revisionExists(\"HEAD\")) {\n // Compare against empty tree (shows all files in first commit)\n const emptyTree = \"4b825dc642cb6eb9a060e54bf8d69288fbee4904\";\n return `${emptyTree}..HEAD`;\n }\n\n throw new Error(\"No commits found in repository\");\n}\n\n/**\n * Get the list of changed files in a diff range\n */\nfunction getChangedFiles(range: string): DiffFile[] {\n const output = git(`diff --numstat ${range}`);\n if (!output) return [];\n\n return output.split(\"\\n\").map((line) => {\n const [additions, deletions, path] = line.split(\"\\t\");\n return {\n path,\n additions: parseInt(additions, 10) || 0,\n deletions: parseInt(deletions, 10) || 0,\n status: \"modified\" as const,\n };\n });\n}\n\n/**\n * Get commit information for a range\n */\nfunction getCommits(range: string): CommitInfo[] {\n const output = git(`log --format=\"%H|%an|%ai|%s\" ${range}`);\n if (!output) return [];\n\n return output.split(\"\\n\").map((line) => {\n const [hash, author, date, message] = line.split(\"|\");\n return { hash, author, date, message };\n });\n}\n\n/**\n * Get the actual diff content\n */\nfunction getDiffContent(range: string): string {\n return git(`diff ${range}`);\n}\n\n/**\n * Detect if there are breaking changes based on diff content and commit messages\n */\nfunction detectBreakingChanges(commits: CommitInfo[], diffContent: string): boolean {\n // Check commit messages for breaking change indicators\n const breakingPatterns = [\n /BREAKING CHANGE/i,\n /\\bbreaking\\b/i,\n /\\!:/,\n /removed/i,\n /deprecated/i,\n ];\n\n for (const commit of commits) {\n if (breakingPatterns.some((pattern) => pattern.test(commit.message))) {\n return true;\n }\n }\n\n // Check diff for removal of exports or major structural changes\n const lines = diffContent.split(\"\\n\");\n const removedExports = lines.filter(\n (line) => line.startsWith(\"-\") && /export\\s+(default\\s+)?(function|class|const|interface|type)/.test(line)\n );\n\n return removedExports.length > 0;\n}\n\n/**\n * Extract keywords from file paths and diff content\n */\nfunction extractKeywords(files: DiffFile[], diffContent: string): string[] {\n const keywords = new Set<string>();\n\n // Extract from file paths\n for (const file of files) {\n const parts = file.path.split(\"/\");\n for (const part of parts) {\n // Skip common non-meaningful names\n if (![\"src\", \"lib\", \"dist\", \"index\", \"node_modules\"].includes(part)) {\n // Extract meaningful words\n const words = part\n .replace(/\\.(ts|tsx|js|jsx|json|md|css|scss)$/, \"\")\n .split(/[-_.]/)\n .filter((w) => w.length > 2);\n words.forEach((w) => keywords.add(w.toLowerCase()));\n }\n }\n }\n\n // Extract from diff content (function names, class names, etc.)\n const codePatterns = [\n /(?:function|class|interface|type|const|let|var)\\s+([A-Za-z_][A-Za-z0-9_]*)/g,\n /export\\s+(?:default\\s+)?(?:function|class|const)\\s+([A-Za-z_][A-Za-z0-9_]*)/g,\n ];\n\n for (const pattern of codePatterns) {\n let match;\n while ((match = pattern.exec(diffContent)) !== null) {\n if (match[1] && match[1].length > 2) {\n keywords.add(match[1].toLowerCase());\n }\n }\n }\n\n return Array.from(keywords).slice(0, 20);\n}\n\n/**\n * Generate a summary title from commits and file changes\n */\nfunction generateTitle(commits: CommitInfo[], files: DiffFile[]): string {\n if (commits.length === 1) {\n return commits[0].message;\n }\n\n if (commits.length > 1) {\n // Find common theme in commit messages or use generic title\n const messages = commits.map((c) => c.message);\n const firstWords = messages.map((m) => m.split(\" \").slice(0, 3).join(\" \"));\n return `Changes across ${commits.length} commits: ${firstWords[0]}...`;\n }\n\n // Fallback to file-based title\n const extensions = [...new Set(files.map((f) => f.path.split(\".\").pop()))];\n return `Code changes in ${files.length} files (${extensions.join(\", \")})`;\n}\n\n/**\n * Generate a description from the analysis\n */\nfunction generateDescription(\n commits: CommitInfo[],\n files: DiffFile[],\n breakingChanges: boolean\n): string {\n const parts: string[] = [];\n\n if (commits.length > 0) {\n parts.push(`This change includes ${commits.length} commit(s).`);\n }\n\n const totalAdditions = files.reduce((sum, f) => sum + f.additions, 0);\n const totalDeletions = files.reduce((sum, f) => sum + f.deletions, 0);\n parts.push(`Modified ${files.length} file(s) with +${totalAdditions}/-${totalDeletions} lines.`);\n\n if (breakingChanges) {\n parts.push(\"⚠️ This change may contain breaking changes.\");\n }\n\n return parts.join(\" \");\n}\n\n/**\n * Generate guidelines for artifact messaging\n */\nfunction generateGuidelines(\n commits: CommitInfo[],\n files: DiffFile[],\n breakingChanges: boolean\n): string[] {\n const guidelines: string[] = [];\n\n // Feature vs fix detection\n const hasFeature = commits.some((c) => /feat|feature|add|new/i.test(c.message));\n const hasFix = commits.some((c) => /fix|bug|patch|issue/i.test(c.message));\n const hasRefactor = commits.some((c) => /refactor|clean|improve/i.test(c.message));\n\n if (hasFeature) {\n guidelines.push(\"Highlight the new capability and its user-facing benefits.\");\n }\n if (hasFix) {\n guidelines.push(\"Explain what was broken and how it's now fixed.\");\n }\n if (hasRefactor) {\n guidelines.push(\"Note the improvements without exposing internal complexity.\");\n }\n\n if (breakingChanges) {\n guidelines.push(\"Clearly communicate the breaking change and migration steps.\");\n guidelines.push(\"Provide a timeline for deprecation if applicable.\");\n }\n\n // File type specific guidelines\n const hasAPI = files.some((f) => /api|route|endpoint/i.test(f.path));\n const hasUI = files.some((f) => /component|page|view|ui/i.test(f.path));\n const hasConfig = files.some((f) => /config|env|setting/i.test(f.path));\n\n if (hasAPI) {\n guidelines.push(\"Document any API changes with request/response examples.\");\n }\n if (hasUI) {\n guidelines.push(\"Consider including screenshots or visual demos.\");\n }\n if (hasConfig) {\n guidelines.push(\"List any new configuration options or environment variables.\");\n }\n\n return guidelines.length > 0\n ? guidelines\n : [\"Focus on the value delivered to users.\", \"Keep technical details accessible.\"];\n}\n\n/**\n * Analyze a git diff range and produce an artifact\n */\nexport async function analyzeDiff(range: string): Promise<AnalysisResult> {\n // Validate we're in a git repository\n try {\n git(\"rev-parse --git-dir\");\n } catch {\n throw new Error(\"Not in a git repository\");\n }\n\n // Handle default range or validate provided range\n let effectiveRange = range;\n if (range === \"HEAD~1..HEAD\") {\n // This is the default, check if it exists\n try {\n effectiveRange = getDefaultRange();\n } catch (error) {\n throw new Error(\n `Could not determine diff range: ${error instanceof Error ? error.message : error}`\n );\n }\n } else {\n // Validate the provided range\n const [start] = range.split(\"..\");\n if (!revisionExists(start)) {\n throw new Error(`Invalid revision: ${start}`);\n }\n }\n\n const files = getChangedFiles(effectiveRange);\n if (files.length === 0) {\n throw new Error(`No changes found in range: ${effectiveRange}`);\n }\n\n const commits = getCommits(effectiveRange);\n const diffContent = getDiffContent(effectiveRange);\n const breakingChanges = detectBreakingChanges(commits, diffContent);\n const keywords = extractKeywords(files, diffContent);\n\n const title = generateTitle(commits, files);\n const description = generateDescription(commits, files, breakingChanges);\n const guidelines = generateGuidelines(commits, files, breakingChanges);\n\n // Get repository info for source reference\n let repoUrl = \"\";\n try {\n repoUrl = git(\"config --get remote.origin.url\").replace(/\\.git$/, \"\");\n } catch {\n // No remote configured\n }\n\n const source: ArtifactSource = {\n type: \"commit\",\n reference: effectiveRange,\n url: repoUrl ? `${repoUrl}/compare/${effectiveRange.replace(\"..\", \"...\")}` : undefined,\n };\n\n const context: ArtifactContext = {\n summary: description,\n technicalDetails: commits.map((c) => `${c.hash.slice(0, 7)}: ${c.message}`),\n affectedComponents: files.map((f) => f.path),\n breakingChanges,\n keywords,\n };\n\n return {\n title,\n description,\n source,\n context,\n guidelines,\n };\n}\n\nexport interface PROptions {\n url?: string;\n number?: number;\n}\n\n/**\n * Analyze a pull request and produce an artifact\n */\nexport async function analyzePR(options: PROptions): Promise<AnalysisResult> {\n // Validate we're in a git repository\n try {\n git(\"rev-parse --git-dir\");\n } catch {\n throw new Error(\"Not in a git repository\");\n }\n\n let prTitle = \"\";\n let prBody = \"\";\n let prNumber = options.number;\n let prUrl = options.url;\n\n // If URL provided, parse it\n if (prUrl) {\n const match = prUrl.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/pull\\/(\\d+)/);\n if (match) {\n prNumber = parseInt(match[3], 10);\n }\n }\n\n // Try to get PR info from GitHub CLI if available\n if (prNumber) {\n try {\n const prInfo = git(`gh pr view ${prNumber} --json title,body,headRefName,baseRefName`);\n const parsed = JSON.parse(prInfo);\n prTitle = parsed.title || \"\";\n prBody = parsed.body || \"\";\n\n // Get diff between base and head\n const baseRef = parsed.baseRefName || \"main\";\n const headRef = parsed.headRefName || \"HEAD\";\n\n // Fetch the base branch to ensure we have it\n try {\n git(`fetch origin ${baseRef}`);\n } catch {\n // Branch might already exist locally\n }\n\n const range = `origin/${baseRef}...${headRef}`;\n const result = await analyzeDiff(range);\n\n // Override with PR-specific info\n result.title = prTitle || result.title;\n result.description = prBody\n ? `${prBody.slice(0, 200)}${prBody.length > 200 ? \"...\" : \"\"}`\n : result.description;\n result.source = {\n type: \"pr\",\n reference: `#${prNumber}`,\n url: prUrl || `${git(\"config --get remote.origin.url\").replace(/\\.git$/, \"\")}/pull/${prNumber}`,\n };\n\n return result;\n } catch {\n // GitHub CLI not available or PR not found, fall back to current branch diff\n }\n }\n\n // Fallback: analyze current branch against main/master\n const currentBranch = git(\"rev-parse --abbrev-ref HEAD\");\n let baseBranch = \"main\";\n\n try {\n git(\"rev-parse --verify main\");\n } catch {\n try {\n git(\"rev-parse --verify master\");\n baseBranch = \"master\";\n } catch {\n throw new Error(\"Could not find base branch (main or master)\");\n }\n }\n\n const range = `${baseBranch}...${currentBranch}`;\n const result = await analyzeDiff(range);\n\n result.source = {\n type: \"pr\",\n reference: prNumber ? `#${prNumber}` : currentBranch,\n url: prUrl,\n };\n\n return result;\n}\n","/**\n * Tool Definitions for the Detective Agent\n *\n * These are the OpenAI function calling definitions that describe\n * what tools the agent can use to explore a codebase.\n */\n\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const AGENT_TOOLS: ChatCompletionTool[] = [\n {\n type: \"function\",\n function: {\n name: \"search_files\",\n description:\n \"Search for files by name pattern or content. Use this to find files related to a feature, component, or concept. Returns file paths that match.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description:\n \"Search query - can be a filename pattern (e.g., '*expense*', '*.schema.ts') or keywords to search in file content\",\n },\n searchIn: {\n type: \"string\",\n enum: [\"filename\", \"content\", \"both\"],\n description: \"Where to search: filename only, file content only, or both\",\n },\n fileTypes: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Optional file extensions to filter (e.g., ['.ts', '.tsx']). If not provided, searches all code files.\",\n },\n directory: {\n type: \"string\",\n description:\n \"Optional subdirectory to search in (relative to project root). If not provided, searches entire project.\",\n },\n },\n required: [\"query\", \"searchIn\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"read_file\",\n description:\n \"Read the contents of a specific file. Use this after finding a relevant file to understand its implementation, imports, exports, and logic.\",\n parameters: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Path to the file (relative to project root)\",\n },\n startLine: {\n type: \"number\",\n description: \"Optional start line number (1-indexed) to read from\",\n },\n endLine: {\n type: \"number\",\n description: \"Optional end line number (1-indexed) to read to\",\n },\n },\n required: [\"path\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"find_references\",\n description:\n \"Find where a symbol (function, component, class, type, constant) is used/imported across the codebase. Critical for understanding how something is triggered or consumed.\",\n parameters: {\n type: \"object\",\n properties: {\n symbol: {\n type: \"string\",\n description:\n \"The symbol name to find references for (e.g., 'CreateExpenseModal', 'useAuth', 'ExpenseSchema')\",\n },\n type: {\n type: \"string\",\n enum: [\"import\", \"usage\", \"all\"],\n description:\n \"Type of references: 'import' finds import statements, 'usage' finds actual usage, 'all' finds both\",\n },\n },\n required: [\"symbol\", \"type\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"find_definition\",\n description:\n \"Find where a symbol is defined/exported. Use this to find the source definition of a type, function, or component.\",\n parameters: {\n type: \"object\",\n properties: {\n symbol: {\n type: \"string\",\n description: \"The symbol name to find the definition of\",\n },\n },\n required: [\"symbol\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"list_directory\",\n description:\n \"List files and subdirectories in a directory. Use this to explore the project structure and understand how code is organized.\",\n parameters: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description:\n \"Directory path relative to project root. Use '.' or empty string for root.\",\n },\n recursive: {\n type: \"boolean\",\n description:\n \"If true, lists all files recursively (up to 3 levels deep). If false, only immediate children.\",\n },\n },\n required: [\"path\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"get_file_structure\",\n description:\n \"Analyze a file and extract its structure: imports, exports, functions, classes, types, and their relationships. Use this to quickly understand what a file provides and depends on.\",\n parameters: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Path to the file to analyze\",\n },\n },\n required: [\"path\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"search_types\",\n description:\n \"Search for TypeScript/JavaScript type definitions, interfaces, schemas (Zod, Yup), or prop types. Useful for understanding data structures.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description:\n \"Search query for types (e.g., 'Expense', 'CreditCard', 'FormData')\",\n },\n kind: {\n type: \"string\",\n enum: [\"interface\", \"type\", \"schema\", \"all\"],\n description:\n \"What kind of type definition to search for\",\n },\n },\n required: [\"query\", \"kind\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"complete_investigation\",\n description:\n \"Call this when you have gathered enough information to create a comprehensive artifact. Provide your findings structured for documentation generation.\",\n parameters: {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n description: \"A clear, descriptive title for the feature/topic\",\n },\n summary: {\n type: \"string\",\n description:\n \"A 2-3 sentence summary explaining what this feature does from a user perspective\",\n },\n entryPoints: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n file: { type: \"string\" },\n component: { type: \"string\" },\n description: { type: \"string\" },\n },\n },\n description:\n \"The main entry points/components for this feature (e.g., the modal, page, or button that triggers it)\",\n },\n dataFlow: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n step: { type: \"number\" },\n description: { type: \"string\" },\n files: { type: \"array\", items: { type: \"string\" } },\n },\n },\n description:\n \"Step-by-step data flow explaining how the feature works\",\n },\n keyFiles: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n purpose: { type: \"string\" },\n keyExports: { type: \"array\", items: { type: \"string\" } },\n },\n },\n description: \"The most important files for this feature\",\n },\n dataStructures: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n file: { type: \"string\" },\n fields: { type: \"array\", items: { type: \"string\" } },\n description: { type: \"string\" },\n },\n },\n description:\n \"Key data structures (types, interfaces, schemas) used\",\n },\n usageExamples: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n description: { type: \"string\" },\n file: { type: \"string\" },\n codeSnippet: { type: \"string\" },\n },\n },\n description:\n \"Examples of how this feature is used in the codebase\",\n },\n relatedFeatures: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Other features or components that relate to this one\",\n },\n technicalNotes: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Important technical details, edge cases, or implementation notes\",\n },\n },\n required: [\n \"title\",\n \"summary\",\n \"entryPoints\",\n \"dataFlow\",\n \"keyFiles\",\n \"dataStructures\",\n ],\n },\n },\n },\n];\n\nexport type ToolName =\n | \"search_files\"\n | \"read_file\"\n | \"find_references\"\n | \"find_definition\"\n | \"list_directory\"\n | \"get_file_structure\"\n | \"search_types\"\n | \"complete_investigation\";\n","/**\n * Tool Implementations for the Detective Agent\n *\n * These are the actual implementations of the tools that the agent uses\n * to explore and understand a codebase.\n */\n\nimport { readFileSync, readdirSync, statSync, existsSync } from \"fs\";\nimport { join, relative, basename } from \"path\";\nimport { glob } from \"glob\";\nimport type { ToolName } from \"./definitions.js\";\n\nconst CODE_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".vue\",\n \".svelte\",\n \".py\",\n \".go\",\n \".rs\",\n \".java\",\n \".rb\",\n \".json\",\n \".yaml\",\n \".yml\",\n];\n\nconst IGNORED_DIRS = [\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \".nuxt\",\n \"coverage\",\n \".turbo\",\n \".cache\",\n \"__pycache__\",\n \".venv\",\n \"venv\",\n];\n\nexport interface ToolContext {\n projectRoot: string;\n}\n\nexport interface ToolResult {\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\n/**\n * Search for files by name pattern or content\n */\nexport async function searchFiles(\n ctx: ToolContext,\n args: {\n query: string;\n searchIn: \"filename\" | \"content\" | \"both\";\n fileTypes?: string[];\n directory?: string;\n }\n): Promise<ToolResult> {\n const { query, searchIn, fileTypes, directory } = args;\n const searchRoot = directory ? join(ctx.projectRoot, directory) : ctx.projectRoot;\n\n if (!existsSync(searchRoot)) {\n return { success: false, error: `Directory not found: ${directory}` };\n }\n\n const results: Array<{ path: string; matches?: string[] }> = [];\n const lowerQuery = query.toLowerCase();\n\n // Build glob pattern for file types\n const extensions = fileTypes?.length ? fileTypes : CODE_EXTENSIONS;\n const patterns = extensions.map((ext) => `**/*${ext}`);\n\n try {\n for (const pattern of patterns) {\n const files = await glob(pattern, {\n cwd: searchRoot,\n ignore: IGNORED_DIRS.map((d) => `**/${d}/**`),\n nodir: true,\n absolute: false,\n });\n\n for (const file of files) {\n const fullPath = join(searchRoot, file);\n const relativePath = relative(ctx.projectRoot, fullPath);\n\n // Check filename match\n if (searchIn === \"filename\" || searchIn === \"both\") {\n const fileName = basename(file).toLowerCase();\n if (fileName.includes(lowerQuery) || matchGlob(fileName, query)) {\n if (!results.find((r) => r.path === relativePath)) {\n results.push({ path: relativePath });\n }\n continue;\n }\n }\n\n // Check content match\n if (searchIn === \"content\" || searchIn === \"both\") {\n try {\n const content = readFileSync(fullPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n const matches: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].toLowerCase().includes(lowerQuery)) {\n matches.push(`L${i + 1}: ${lines[i].trim().slice(0, 100)}`);\n if (matches.length >= 5) break;\n }\n }\n\n if (matches.length > 0) {\n results.push({ path: relativePath, matches });\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n }\n\n // Sort by relevance (filename matches first, then by number of content matches)\n results.sort((a, b) => {\n if (!a.matches && b.matches) return -1;\n if (a.matches && !b.matches) return 1;\n if (a.matches && b.matches) return b.matches.length - a.matches.length;\n return 0;\n });\n\n return {\n success: true,\n data: {\n query,\n totalResults: results.length,\n results: results.slice(0, 20), // Limit results\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Search failed: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * Simple glob matching for filename patterns\n */\nfunction matchGlob(filename: string, pattern: string): boolean {\n const regex = pattern\n .replace(/\\./g, \"\\\\.\")\n .replace(/\\*/g, \".*\")\n .replace(/\\?/g, \".\");\n return new RegExp(regex, \"i\").test(filename);\n}\n\n/**\n * Read a file's contents\n */\nexport async function readFile(\n ctx: ToolContext,\n args: { path: string; startLine?: number; endLine?: number }\n): Promise<ToolResult> {\n const { path: filePath, startLine, endLine } = args;\n const fullPath = join(ctx.projectRoot, filePath);\n\n if (!existsSync(fullPath)) {\n return { success: false, error: `File not found: ${filePath}` };\n }\n\n try {\n const content = readFileSync(fullPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n\n const start = startLine ? Math.max(0, startLine - 1) : 0;\n const end = endLine ? Math.min(lines.length, endLine) : lines.length;\n\n const selectedLines = lines.slice(start, end);\n const numberedContent = selectedLines\n .map((line, i) => `${start + i + 1}| ${line}`)\n .join(\"\\n\");\n\n return {\n success: true,\n data: {\n path: filePath,\n totalLines: lines.length,\n linesShown: `${start + 1}-${end}`,\n content: numberedContent,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to read file: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * Find references to a symbol across the codebase\n */\nexport async function findReferences(\n ctx: ToolContext,\n args: { symbol: string; type: \"import\" | \"usage\" | \"all\" }\n): Promise<ToolResult> {\n const { symbol, type } = args;\n const results: Array<{\n file: string;\n line: number;\n type: \"import\" | \"usage\";\n context: string;\n }> = [];\n\n // Build search patterns based on type\n const patterns: Array<{ regex: RegExp; type: \"import\" | \"usage\" }> = [];\n\n if (type === \"import\" || type === \"all\") {\n // Import patterns\n patterns.push(\n { regex: new RegExp(`import\\\\s+.*\\\\b${symbol}\\\\b.*from`, \"g\"), type: \"import\" },\n { regex: new RegExp(`import\\\\s+${symbol}\\\\s+from`, \"g\"), type: \"import\" },\n { regex: new RegExp(`from\\\\s+['\"][^'\"]+['\"].*\\\\b${symbol}\\\\b`, \"g\"), type: \"import\" },\n { regex: new RegExp(`require\\\\([^)]*${symbol}[^)]*\\\\)`, \"g\"), type: \"import\" }\n );\n }\n\n if (type === \"usage\" || type === \"all\") {\n // Usage patterns (component usage, function calls, type references)\n patterns.push(\n { regex: new RegExp(`<${symbol}[\\\\s/>]`, \"g\"), type: \"usage\" }, // JSX component\n { regex: new RegExp(`\\\\b${symbol}\\\\s*\\\\(`, \"g\"), type: \"usage\" }, // Function call\n { regex: new RegExp(`:\\\\s*${symbol}[\\\\s,;>]`, \"g\"), type: \"usage\" }, // Type annotation\n { regex: new RegExp(`extends\\\\s+${symbol}\\\\b`, \"g\"), type: \"usage\" }, // Class extends\n { regex: new RegExp(`implements\\\\s+${symbol}\\\\b`, \"g\"), type: \"usage\" } // Interface implements\n );\n }\n\n try {\n const files = await glob(\"**/*.{ts,tsx,js,jsx,vue,svelte}\", {\n cwd: ctx.projectRoot,\n ignore: IGNORED_DIRS.map((d) => `**/${d}/**`),\n nodir: true,\n });\n\n for (const file of files) {\n const fullPath = join(ctx.projectRoot, file);\n try {\n const content = readFileSync(fullPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n for (const pattern of patterns) {\n if (pattern.regex.test(line)) {\n // Reset regex state\n pattern.regex.lastIndex = 0;\n results.push({\n file,\n line: i + 1,\n type: pattern.type,\n context: line.trim().slice(0, 150),\n });\n break; // Only count each line once\n }\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n // Group by file for cleaner output\n const groupedByFile = results.reduce(\n (acc, ref) => {\n if (!acc[ref.file]) acc[ref.file] = [];\n acc[ref.file].push(ref);\n return acc;\n },\n {} as Record<string, typeof results>\n );\n\n return {\n success: true,\n data: {\n symbol,\n totalReferences: results.length,\n fileCount: Object.keys(groupedByFile).length,\n references: groupedByFile,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to find references: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * Find where a symbol is defined/exported\n */\nexport async function findDefinition(\n ctx: ToolContext,\n args: { symbol: string }\n): Promise<ToolResult> {\n const { symbol } = args;\n\n // Patterns that indicate a definition\n const definitionPatterns = [\n new RegExp(`export\\\\s+(?:default\\\\s+)?(?:async\\\\s+)?function\\\\s+${symbol}\\\\b`),\n new RegExp(`export\\\\s+(?:default\\\\s+)?class\\\\s+${symbol}\\\\b`),\n new RegExp(`export\\\\s+(?:const|let|var)\\\\s+${symbol}\\\\s*=`),\n new RegExp(`export\\\\s+(?:interface|type)\\\\s+${symbol}\\\\b`),\n new RegExp(`(?:const|let|var)\\\\s+${symbol}\\\\s*=.*(?:function|=>|class)`),\n new RegExp(`function\\\\s+${symbol}\\\\s*\\\\(`),\n new RegExp(`class\\\\s+${symbol}\\\\s*(?:extends|implements|\\\\{)`),\n new RegExp(`interface\\\\s+${symbol}\\\\s*(?:extends|\\\\{)`),\n new RegExp(`type\\\\s+${symbol}\\\\s*=`),\n new RegExp(`export\\\\s*\\\\{[^}]*\\\\b${symbol}\\\\b[^}]*\\\\}`), // Named export\n ];\n\n const results: Array<{\n file: string;\n line: number;\n definitionType: string;\n context: string;\n }> = [];\n\n try {\n const files = await glob(\"**/*.{ts,tsx,js,jsx}\", {\n cwd: ctx.projectRoot,\n ignore: IGNORED_DIRS.map((d) => `**/${d}/**`),\n nodir: true,\n });\n\n for (const file of files) {\n const fullPath = join(ctx.projectRoot, file);\n try {\n const content = readFileSync(fullPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n for (const pattern of definitionPatterns) {\n if (pattern.test(line)) {\n // Determine definition type\n let defType = \"unknown\";\n if (/function/.test(line)) defType = \"function\";\n else if (/class/.test(line)) defType = \"class\";\n else if (/interface/.test(line)) defType = \"interface\";\n else if (/type\\s+\\w+\\s*=/.test(line)) defType = \"type\";\n else if (/const|let|var/.test(line)) defType = \"variable\";\n else if (/export\\s*\\{/.test(line)) defType = \"re-export\";\n\n results.push({\n file,\n line: i + 1,\n definitionType: defType,\n context: lines.slice(i, Math.min(i + 5, lines.length)).join(\"\\n\").slice(0, 300),\n });\n break;\n }\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n return {\n success: true,\n data: {\n symbol,\n definitionsFound: results.length,\n definitions: results,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to find definition: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * List directory contents\n */\nexport async function listDirectory(\n ctx: ToolContext,\n args: { path: string; recursive?: boolean }\n): Promise<ToolResult> {\n const { path: dirPath, recursive } = args;\n const fullPath = dirPath ? join(ctx.projectRoot, dirPath) : ctx.projectRoot;\n\n if (!existsSync(fullPath)) {\n return { success: false, error: `Directory not found: ${dirPath}` };\n }\n\n try {\n const stat = statSync(fullPath);\n if (!stat.isDirectory()) {\n return { success: false, error: `Not a directory: ${dirPath}` };\n }\n\n const items: Array<{ path: string; type: \"file\" | \"directory\"; size?: number }> = [];\n\n function listDir(dir: string, depth: number) {\n if (depth > 3) return; // Max depth\n\n const entries = readdirSync(dir);\n for (const entry of entries) {\n if (IGNORED_DIRS.includes(entry) || entry.startsWith(\".\")) continue;\n\n const entryPath = join(dir, entry);\n const relativePath = relative(ctx.projectRoot, entryPath);\n\n try {\n const entryStat = statSync(entryPath);\n if (entryStat.isDirectory()) {\n items.push({ path: relativePath, type: \"directory\" });\n if (recursive) {\n listDir(entryPath, depth + 1);\n }\n } else if (entryStat.isFile()) {\n items.push({ path: relativePath, type: \"file\", size: entryStat.size });\n }\n } catch {\n // Skip inaccessible entries\n }\n }\n }\n\n listDir(fullPath, 0);\n\n // Sort: directories first, then files\n items.sort((a, b) => {\n if (a.type !== b.type) return a.type === \"directory\" ? -1 : 1;\n return a.path.localeCompare(b.path);\n });\n\n return {\n success: true,\n data: {\n path: dirPath || \".\",\n totalItems: items.length,\n items: items.slice(0, 100), // Limit results\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to list directory: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * Get structured analysis of a file\n */\nexport async function getFileStructure(\n ctx: ToolContext,\n args: { path: string }\n): Promise<ToolResult> {\n const { path: filePath } = args;\n const fullPath = join(ctx.projectRoot, filePath);\n\n if (!existsSync(fullPath)) {\n return { success: false, error: `File not found: ${filePath}` };\n }\n\n try {\n const content = readFileSync(fullPath, \"utf-8\");\n\n const structure = {\n imports: [] as Array<{ from: string; imports: string[] }>,\n exports: [] as Array<{ name: string; type: string; line: number }>,\n functions: [] as Array<{ name: string; line: number; async: boolean }>,\n classes: [] as Array<{ name: string; line: number; extends?: string }>,\n types: [] as Array<{ name: string; line: number; kind: \"type\" | \"interface\" }>,\n components: [] as Array<{ name: string; line: number; props?: string }>,\n };\n\n const lines = content.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + 1;\n\n // Parse imports\n const importMatch = line.match(\n /import\\s+(?:type\\s+)?(?:\\{([^}]+)\\}|(\\w+))\\s+from\\s+['\"]([^'\"]+)['\"]/\n );\n if (importMatch) {\n const imports = importMatch[1]\n ? importMatch[1].split(\",\").map((s) => s.trim().split(\" as \")[0])\n : [importMatch[2]];\n structure.imports.push({ from: importMatch[3], imports: imports.filter(Boolean) });\n }\n\n // Parse exports\n const exportMatch = line.match(\n /export\\s+(?:default\\s+)?(?:async\\s+)?(function|class|const|let|var|interface|type)\\s+(\\w+)/\n );\n if (exportMatch) {\n structure.exports.push({ name: exportMatch[2], type: exportMatch[1], line: lineNum });\n }\n\n // Parse functions\n const funcMatch = line.match(\n /(?:export\\s+)?(?:default\\s+)?(async\\s+)?function\\s+(\\w+)/\n );\n if (funcMatch) {\n structure.functions.push({\n name: funcMatch[2],\n line: lineNum,\n async: !!funcMatch[1],\n });\n }\n\n // Parse arrow functions assigned to const\n const arrowMatch = line.match(\n /(?:export\\s+)?const\\s+(\\w+)\\s*=\\s*(async\\s+)?(?:\\([^)]*\\)|[^=])\\s*=>/\n );\n if (arrowMatch) {\n structure.functions.push({\n name: arrowMatch[1],\n line: lineNum,\n async: !!arrowMatch[2],\n });\n }\n\n // Parse classes\n const classMatch = line.match(\n /(?:export\\s+)?(?:default\\s+)?class\\s+(\\w+)(?:\\s+extends\\s+(\\w+))?/\n );\n if (classMatch) {\n structure.classes.push({\n name: classMatch[1],\n line: lineNum,\n extends: classMatch[2],\n });\n }\n\n // Parse types/interfaces\n const typeMatch = line.match(\n /(?:export\\s+)?(interface|type)\\s+(\\w+)/\n );\n if (typeMatch) {\n structure.types.push({\n name: typeMatch[2],\n line: lineNum,\n kind: typeMatch[1] as \"type\" | \"interface\",\n });\n }\n\n // Parse React components (function components)\n if (\n line.match(/(?:export\\s+)?(?:default\\s+)?(?:const|function)\\s+([A-Z]\\w+)/) &&\n (content.includes(\"React\") || content.includes(\"jsx\") || filePath.endsWith(\".tsx\"))\n ) {\n const compMatch = line.match(/(?:const|function)\\s+([A-Z]\\w+)/);\n if (compMatch) {\n // Check for props type\n const propsMatch = line.match(/:\\s*(?:React\\.)?FC<(\\w+)>|props:\\s*(\\w+)/);\n structure.components.push({\n name: compMatch[1],\n line: lineNum,\n props: propsMatch ? propsMatch[1] || propsMatch[2] : undefined,\n });\n }\n }\n }\n\n return {\n success: true,\n data: {\n path: filePath,\n structure,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to analyze file: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * Search for type definitions\n */\nexport async function searchTypes(\n ctx: ToolContext,\n args: { query: string; kind: \"interface\" | \"type\" | \"schema\" | \"all\" }\n): Promise<ToolResult> {\n const { query, kind } = args;\n\n const results: Array<{\n name: string;\n file: string;\n line: number;\n kind: string;\n preview: string;\n }> = [];\n\n // Patterns based on kind\n const patterns: RegExp[] = [];\n if (kind === \"interface\" || kind === \"all\") {\n patterns.push(new RegExp(`interface\\\\s+(\\\\w*${query}\\\\w*)`, \"gi\"));\n }\n if (kind === \"type\" || kind === \"all\") {\n patterns.push(new RegExp(`type\\\\s+(\\\\w*${query}\\\\w*)\\\\s*=`, \"gi\"));\n }\n if (kind === \"schema\" || kind === \"all\") {\n // Zod, Yup, and other schema patterns\n patterns.push(new RegExp(`(?:const|export\\\\s+const)\\\\s+(\\\\w*${query}\\\\w*Schema)\\\\s*=`, \"gi\"));\n patterns.push(new RegExp(`z\\\\.object.*${query}`, \"gi\"));\n }\n\n try {\n const files = await glob(\"**/*.{ts,tsx,js,jsx}\", {\n cwd: ctx.projectRoot,\n ignore: IGNORED_DIRS.map((d) => `**/${d}/**`),\n nodir: true,\n });\n\n for (const file of files) {\n const fullPath = join(ctx.projectRoot, file);\n try {\n const content = readFileSync(fullPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n for (const pattern of patterns) {\n const match = pattern.exec(line);\n if (match) {\n pattern.lastIndex = 0; // Reset\n\n // Get more context (the full type definition if small)\n const preview = lines.slice(i, Math.min(i + 10, lines.length)).join(\"\\n\").slice(0, 400);\n\n let detectedKind = \"type\";\n if (/interface/.test(line)) detectedKind = \"interface\";\n else if (/Schema/.test(line) || /z\\./.test(line)) detectedKind = \"schema\";\n\n results.push({\n name: match[1] || query,\n file,\n line: i + 1,\n kind: detectedKind,\n preview,\n });\n break;\n }\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n return {\n success: true,\n data: {\n query,\n kind,\n totalResults: results.length,\n results: results.slice(0, 15),\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to search types: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * Execute a tool by name\n */\nexport async function executeTool(\n toolName: ToolName,\n args: Record<string, unknown>,\n ctx: ToolContext\n): Promise<ToolResult> {\n switch (toolName) {\n case \"search_files\":\n return searchFiles(ctx, args as Parameters<typeof searchFiles>[1]);\n case \"read_file\":\n return readFile(ctx, args as Parameters<typeof readFile>[1]);\n case \"find_references\":\n return findReferences(ctx, args as Parameters<typeof findReferences>[1]);\n case \"find_definition\":\n return findDefinition(ctx, args as Parameters<typeof findDefinition>[1]);\n case \"list_directory\":\n return listDirectory(ctx, args as Parameters<typeof listDirectory>[1]);\n case \"get_file_structure\":\n return getFileStructure(ctx, args as Parameters<typeof getFileStructure>[1]);\n case \"search_types\":\n return searchTypes(ctx, args as Parameters<typeof searchTypes>[1]);\n case \"complete_investigation\":\n // This is handled specially by the agent\n return { success: true, data: args };\n default:\n return { success: false, error: `Unknown tool: ${toolName}` };\n }\n}\n","/**\n * The Detective Agent\n *\n * An AI agent that explores codebases to understand features, flows, and implementations.\n * Uses tools to navigate code rather than trying to read everything at once.\n */\n\nimport OpenAI from \"openai\";\nimport type {\n ChatCompletionMessageParam,\n ChatCompletionToolMessageParam,\n} from \"openai/resources/chat/completions\";\nimport { AGENT_TOOLS, type ToolName } from \"./tools/definitions.js\";\nimport { executeTool, type ToolContext, type ToolResult } from \"./tools/implementations.js\";\n\nconst SYSTEM_PROMPT = `You are \"The Detective\" - an expert code analyst who explores codebases methodically to understand features and implementations.\n\nYour mission is to investigate a codebase based on a user's query and produce a comprehensive understanding of how a feature works.\n\n## Investigation Strategy\n\n1. **Start Broad**: Begin by searching for files related to the query keywords. Look for obvious matches first.\n\n2. **Follow the Trail**: When you find a relevant file:\n - Read it to understand what it does\n - Look at its imports to find dependencies\n - Find where it's exported/used to understand how it fits in\n\n3. **Find Entry Points**: Always identify HOW a feature is triggered:\n - Is it a page/route?\n - Is it a component triggered by user action?\n - Is it an API endpoint?\n - Find the \"beginning\" of the user journey\n\n4. **Trace Data Flow**: Understand:\n - What data does the feature work with? (types, schemas)\n - Where does data come from? (API, props, state)\n - Where does data go? (mutations, API calls, state updates)\n\n5. **Find Usage Examples**: Search for where components/functions are actually used. This shows real-world integration.\n\n6. **Document Technical Details**: Note any important patterns, validations, error handling, or edge cases.\n\n## Tool Usage Tips\n\n- Use \\`search_files\\` with searchIn=\"filename\" first for broad discovery\n- Use \\`search_files\\` with searchIn=\"content\" when looking for specific patterns\n- Use \\`get_file_structure\\` to quickly understand a file's purpose without reading everything\n- Use \\`find_references\\` to understand how something is used/triggered\n- Use \\`find_definition\\` when you see an import and need to find the source\n- Use \\`search_types\\` to find data structures and schemas\n- Use \\`read_file\\` to examine specific implementation details\n\n## Investigation Rules\n\n1. Be thorough but efficient - don't read every file, use structure analysis first\n2. Always find at least ONE usage example of the main component/function\n3. Always identify the data types/schemas involved\n4. Focus on answering: \"If I were a new developer, what would I need to know to work on this?\"\n5. When you have enough information, call \\`complete_investigation\\` with your structured findings\n\n## Output Quality\n\nYour final investigation should enable someone to:\n- Understand what the feature does (user perspective)\n- Know which files to look at\n- Understand the data flow\n- See real usage examples\n- Know about edge cases or important details`;\n\nexport interface DetectiveOptions {\n projectRoot: string;\n verbose?: boolean;\n maxIterations?: number;\n onToolCall?: (toolName: string, args: unknown) => void;\n onToolResult?: (toolName: string, result: ToolResult) => void;\n onThinking?: (thought: string) => void;\n}\n\nexport interface InvestigationResult {\n success: boolean;\n title?: string;\n summary?: string;\n entryPoints?: Array<{ file: string; component: string; description: string }>;\n dataFlow?: Array<{ step: number; description: string; files: string[] }>;\n keyFiles?: Array<{ path: string; purpose: string; keyExports: string[] }>;\n dataStructures?: Array<{\n name: string;\n file: string;\n fields: string[];\n description: string;\n }>;\n usageExamples?: Array<{ description: string; file: string; codeSnippet: string }>;\n relatedFeatures?: string[];\n technicalNotes?: string[];\n error?: string;\n toolCalls?: number;\n}\n\n/**\n * The Detective Agent - explores a codebase to understand a feature\n */\nexport class DetectiveAgent {\n private openai: OpenAI;\n private context: ToolContext;\n private options: DetectiveOptions;\n private messages: ChatCompletionMessageParam[];\n private toolCallCount: number = 0;\n\n constructor(options: DetectiveOptions) {\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"Missing OPENAI_API_KEY environment variable.\\n\" +\n \"Set it to use the Detective agent for code exploration.\"\n );\n }\n\n this.openai = new OpenAI({ apiKey });\n this.context = { projectRoot: options.projectRoot };\n this.options = {\n maxIterations: 25,\n ...options,\n };\n this.messages = [{ role: \"system\", content: SYSTEM_PROMPT }];\n }\n\n /**\n * Run an investigation based on a user query\n */\n async investigate(query: string): Promise<InvestigationResult> {\n // Add the user's query\n this.messages.push({\n role: \"user\",\n content: `Investigate the following topic in the codebase:\\n\\n\"${query}\"\\n\\nUse the available tools to explore the codebase, understand the feature, and then call complete_investigation with your findings.`,\n });\n\n let iterations = 0;\n const maxIterations = this.options.maxIterations!;\n\n while (iterations < maxIterations) {\n iterations++;\n\n try {\n const response = await this.openai.chat.completions.create({\n model: \"gpt-4o\",\n messages: this.messages,\n tools: AGENT_TOOLS,\n tool_choice: \"auto\",\n temperature: 0.1,\n });\n\n const message = response.choices[0].message;\n\n // Add assistant message to history\n this.messages.push(message);\n\n // If there's thinking/content, log it\n if (message.content && this.options.onThinking) {\n this.options.onThinking(message.content);\n }\n\n // Check if we're done (no tool calls)\n if (!message.tool_calls || message.tool_calls.length === 0) {\n // No more tool calls - check if we got a complete_investigation\n return {\n success: false,\n error: \"Agent finished without completing investigation\",\n toolCalls: this.toolCallCount,\n };\n }\n\n // Process tool calls\n const toolResults: ChatCompletionToolMessageParam[] = [];\n\n for (const toolCall of message.tool_calls) {\n const toolName = toolCall.function.name as ToolName;\n let args: Record<string, unknown>;\n\n try {\n args = JSON.parse(toolCall.function.arguments);\n } catch {\n args = {};\n }\n\n this.toolCallCount++;\n\n // Notify about tool call\n if (this.options.onToolCall) {\n this.options.onToolCall(toolName, args);\n }\n\n // Check if this is the completion tool\n if (toolName === \"complete_investigation\") {\n if (this.options.onToolResult) {\n this.options.onToolResult(toolName, { success: true, data: args });\n }\n\n return {\n success: true,\n title: args.title as string,\n summary: args.summary as string,\n entryPoints: args.entryPoints as InvestigationResult[\"entryPoints\"],\n dataFlow: args.dataFlow as InvestigationResult[\"dataFlow\"],\n keyFiles: args.keyFiles as InvestigationResult[\"keyFiles\"],\n dataStructures: args.dataStructures as InvestigationResult[\"dataStructures\"],\n usageExamples: args.usageExamples as InvestigationResult[\"usageExamples\"],\n relatedFeatures: args.relatedFeatures as string[],\n technicalNotes: args.technicalNotes as string[],\n toolCalls: this.toolCallCount,\n };\n }\n\n // Execute the tool\n const result = await executeTool(toolName, args, this.context);\n\n // Notify about result\n if (this.options.onToolResult) {\n this.options.onToolResult(toolName, result);\n }\n\n toolResults.push({\n role: \"tool\",\n tool_call_id: toolCall.id,\n content: JSON.stringify(result),\n });\n }\n\n // Add all tool results to messages\n this.messages.push(...toolResults);\n } catch (error) {\n return {\n success: false,\n error: `Agent error: ${error instanceof Error ? error.message : error}`,\n toolCalls: this.toolCallCount,\n };\n }\n }\n\n return {\n success: false,\n error: `Investigation exceeded maximum iterations (${maxIterations})`,\n toolCalls: this.toolCallCount,\n };\n }\n}\n\n/**\n * Create and run a detective investigation\n */\nexport async function investigateFeature(\n query: string,\n options: Omit<DetectiveOptions, \"projectRoot\"> & { projectRoot?: string }\n): Promise<InvestigationResult> {\n const projectRoot = options.projectRoot || getProjectRoot();\n\n const agent = new DetectiveAgent({\n ...options,\n projectRoot,\n });\n\n return agent.investigate(query);\n}\n\n/**\n * Get the project root directory\n */\nfunction getProjectRoot(): string {\n try {\n const { execSync } = require(\"child_process\");\n return execSync(\"git rev-parse --show-toplevel\", { encoding: \"utf-8\" }).trim();\n } catch {\n return process.cwd();\n }\n}\n","/**\n * Visible API Client\n *\n * HTTP client for posting artifacts to the Visible API.\n */\n\nimport type { ArtifactSource, ArtifactContext } from \"../shared/types.js\";\n\nexport interface ArtifactPayload {\n title: string;\n description: string;\n source: ArtifactSource;\n context: ArtifactContext;\n guidelines: string[];\n}\n\nexport interface ArtifactResponse {\n id: string;\n url: string;\n}\n\n/**\n * Get required environment variables\n */\nfunction getConfig(): { baseUrl: string; apiKey: string } {\n const baseUrl = process.env.VISIBLE_API_BASE_URL;\n const apiKey = process.env.VISIBLE_API_KEY;\n\n if (!baseUrl) {\n throw new Error(\n \"Missing VISIBLE_API_BASE_URL environment variable.\\n\" +\n \"Set it to your Visible API endpoint (e.g., https://api.visible.dev)\"\n );\n }\n\n if (!apiKey) {\n throw new Error(\n \"Missing VISIBLE_API_KEY environment variable.\\n\" +\n \"Get your API key from the Visible dashboard.\"\n );\n }\n\n return { baseUrl: baseUrl.replace(/\\/$/, \"\"), apiKey };\n}\n\n/**\n * Post an artifact to the Visible API\n */\nexport async function postArtifact(payload: ArtifactPayload): Promise<ArtifactResponse> {\n const { baseUrl, apiKey } = getConfig();\n\n const response = await fetch(`${baseUrl}/api/artifacts`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n title: payload.title,\n description: payload.description,\n source: payload.source,\n context: payload.context,\n guidelines: payload.guidelines,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage = `API request failed with status ${response.status}`;\n\n try {\n const errorJson = JSON.parse(errorText);\n if (errorJson.message) {\n errorMessage = errorJson.message;\n } else if (errorJson.error) {\n errorMessage = errorJson.error;\n }\n } catch {\n if (errorText) {\n errorMessage = errorText;\n }\n }\n\n throw new Error(errorMessage);\n }\n\n const data = (await response.json()) as { id?: string; url?: string };\n\n if (!data.id || !data.url) {\n throw new Error(\"Invalid API response: missing id or url\");\n }\n\n return {\n id: data.id,\n url: data.url,\n };\n}\n\n/**\n * Check if the API is configured (env vars are set)\n */\nexport function isApiConfigured(): boolean {\n return !!(process.env.VISIBLE_API_BASE_URL && process.env.VISIBLE_API_KEY);\n}\n","/**\n * Analyze Command\n *\n * Analyzes code, PRs, and repositories to extract context and create artifacts.\n *\n * Usage:\n * visible analyze diff [range] # Analyze git diff (default: HEAD~1..HEAD)\n * visible analyze pr --url <url> # Analyze a pull request\n * visible analyze prompt \"...\" # Explore codebase with AI agent\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\nimport type { ArtifactSource, ArtifactContext } from \"../shared/types.js\";\nimport { analyzeDiff } from \"../analyzers/git/index.js\";\nimport { analyzePR } from \"../analyzers/git/index.js\";\nimport { investigateFeature, type InvestigationResult } from \"../agent/detective.js\";\nimport { postArtifact, type ArtifactPayload } from \"../api/client.js\";\n\nexport const analyzeCommand = new Command(\"analyze\")\n .description(\"Analyze code changes and create artifacts\")\n .addCommand(createDiffCommand())\n .addCommand(createPRCommand())\n .addCommand(createPromptCommand());\n\nfunction createDiffCommand(): Command {\n return new Command(\"diff\")\n .description(\"Analyze git diff between commits\")\n .argument(\"[range]\", \"Git commit range (e.g., HEAD~1..HEAD)\", \"HEAD~1..HEAD\")\n .option(\"--no-post\", \"Skip posting artifact to API\")\n .action(async (range: string, options: { post: boolean }) => {\n const spinner = ora(\"Analyzing diff...\").start();\n\n try {\n const result = await analyzeDiff(range);\n\n spinner.succeed(\"Diff analyzed successfully\");\n\n console.log(chalk.bold(\"\\nArtifact Summary:\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log(chalk.cyan(\"Title:\"), result.title);\n console.log(chalk.cyan(\"Description:\"), result.description);\n console.log(chalk.cyan(\"Files changed:\"), result.context.affectedComponents.length);\n console.log(chalk.cyan(\"Breaking changes:\"), result.context.breakingChanges ? \"Yes\" : \"No\");\n\n if (options.post) {\n spinner.start(\"Posting artifact to Visible API...\");\n const response = await postArtifact(result);\n spinner.succeed(\"Artifact posted successfully\");\n console.log(chalk.green(\"\\n✓ Artifact created:\"), response.url);\n } else {\n console.log(chalk.yellow(\"\\nSkipped posting to API (--no-post)\"));\n console.log(chalk.dim(\"Artifact payload:\"));\n console.log(JSON.stringify(result, null, 2));\n }\n } catch (error) {\n spinner.fail(\"Failed to analyze diff\");\n console.error(chalk.red(\"Error:\"), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n}\n\nfunction createPRCommand(): Command {\n return new Command(\"pr\")\n .description(\"Analyze a pull request\")\n .option(\"--url <url>\", \"Pull request URL (e.g., https://github.com/owner/repo/pull/123)\")\n .option(\"--number <number>\", \"Pull request number (uses current repo)\")\n .option(\"--no-post\", \"Skip posting artifact to API\")\n .action(async (options: { url?: string; number?: string; post: boolean }) => {\n const spinner = ora(\"Analyzing pull request...\").start();\n\n try {\n if (!options.url && !options.number) {\n spinner.fail(\"Missing required option\");\n console.error(chalk.red(\"Error:\"), \"Either --url or --number is required\");\n process.exit(1);\n }\n\n const result = await analyzePR({\n url: options.url,\n number: options.number ? parseInt(options.number, 10) : undefined,\n });\n\n spinner.succeed(\"Pull request analyzed successfully\");\n\n console.log(chalk.bold(\"\\nArtifact Summary:\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log(chalk.cyan(\"Title:\"), result.title);\n console.log(chalk.cyan(\"Description:\"), result.description);\n console.log(chalk.cyan(\"Files changed:\"), result.context.affectedComponents.length);\n console.log(chalk.cyan(\"Breaking changes:\"), result.context.breakingChanges ? \"Yes\" : \"No\");\n\n if (options.post) {\n spinner.start(\"Posting artifact to Visible API...\");\n const response = await postArtifact(result);\n spinner.succeed(\"Artifact posted successfully\");\n console.log(chalk.green(\"\\n✓ Artifact created:\"), response.url);\n } else {\n console.log(chalk.yellow(\"\\nSkipped posting to API (--no-post)\"));\n console.log(chalk.dim(\"Artifact payload:\"));\n console.log(JSON.stringify(result, null, 2));\n }\n } catch (error) {\n spinner.fail(\"Failed to analyze pull request\");\n console.error(chalk.red(\"Error:\"), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n}\n\nfunction createPromptCommand(): Command {\n return new Command(\"prompt\")\n .description(\"Explore codebase with an AI agent\")\n .argument(\"<query>\", \"Natural language prompt describing what to analyze\")\n .option(\"--no-post\", \"Skip posting artifact to API\")\n .option(\"-v, --verbose\", \"Show detailed agent activity\")\n .action(async (query: string, options: { post: boolean; verbose?: boolean }) => {\n console.log(chalk.bold(\"\\n🔍 The Detective is investigating...\\n\"));\n console.log(chalk.dim(`Query: \"${query}\"\\n`));\n\n let spinner: Ora | null = null;\n let toolCount = 0;\n\n try {\n const investigation = await investigateFeature(query, {\n verbose: options.verbose,\n onToolCall: (toolName, args) => {\n toolCount++;\n\n if (options.verbose) {\n if (spinner) spinner.stop();\n console.log(chalk.blue(`\\n[${toolCount}] ${toolName}`));\n console.log(chalk.dim(JSON.stringify(args, null, 2)));\n spinner = ora(`Running ${toolName}...`).start();\n } else {\n if (spinner) {\n spinner.text = `Investigating... (${toolCount} tool calls) - ${toolName}`;\n } else {\n spinner = ora(`Investigating... (${toolCount} tool calls) - ${toolName}`).start();\n }\n }\n },\n onToolResult: (toolName, result) => {\n if (options.verbose && spinner) {\n if (result.success) {\n spinner.succeed(`${toolName} completed`);\n const dataStr = JSON.stringify(result.data, null, 2);\n if (dataStr.length > 500) {\n console.log(chalk.dim(dataStr.slice(0, 500) + \"\\n...\"));\n } else {\n console.log(chalk.dim(dataStr));\n }\n } else {\n spinner.fail(`${toolName} failed: ${result.error}`);\n }\n spinner = null;\n }\n },\n onThinking: (thought) => {\n if (options.verbose) {\n console.log(chalk.yellow(\"\\n💭 Agent thinking:\"));\n console.log(chalk.dim(thought));\n }\n },\n });\n\n // Stop spinner after investigation\n if (spinner !== null) {\n const activeSpinner = spinner as Ora;\n if (investigation.success) {\n activeSpinner.succeed(`Investigation complete (${investigation.toolCalls} tool calls)`);\n } else {\n activeSpinner.fail(\"Investigation failed\");\n }\n }\n\n if (!investigation.success) {\n console.error(chalk.red(\"\\nError:\"), investigation.error);\n process.exit(1);\n }\n\n // Display investigation results\n console.log(chalk.bold(\"\\n📋 Investigation Results:\"));\n console.log(chalk.dim(\"─\".repeat(60)));\n\n console.log(chalk.cyan(\"\\nTitle:\"), investigation.title);\n console.log(chalk.cyan(\"Summary:\"), investigation.summary);\n\n if (investigation.entryPoints && investigation.entryPoints.length > 0) {\n console.log(chalk.cyan(\"\\nEntry Points:\"));\n for (const ep of investigation.entryPoints) {\n console.log(chalk.dim(` • ${ep.component} (${ep.file})`));\n console.log(chalk.dim(` ${ep.description}`));\n }\n }\n\n if (investigation.dataFlow && investigation.dataFlow.length > 0) {\n console.log(chalk.cyan(\"\\nData Flow:\"));\n for (const step of investigation.dataFlow) {\n console.log(chalk.dim(` ${step.step}. ${step.description}`));\n if (step.files.length > 0) {\n console.log(chalk.dim(` Files: ${step.files.join(\", \")}`));\n }\n }\n }\n\n if (investigation.keyFiles && investigation.keyFiles.length > 0) {\n console.log(chalk.cyan(\"\\nKey Files:\"));\n for (const file of investigation.keyFiles) {\n console.log(chalk.dim(` • ${file.path}`));\n console.log(chalk.dim(` Purpose: ${file.purpose}`));\n if (file.keyExports.length > 0) {\n console.log(chalk.dim(` Exports: ${file.keyExports.join(\", \")}`));\n }\n }\n }\n\n if (investigation.dataStructures && investigation.dataStructures.length > 0) {\n console.log(chalk.cyan(\"\\nData Structures:\"));\n for (const ds of investigation.dataStructures) {\n console.log(chalk.dim(` • ${ds.name} (${ds.file})`));\n console.log(chalk.dim(` ${ds.description}`));\n if (ds.fields.length > 0) {\n console.log(chalk.dim(` Fields: ${ds.fields.slice(0, 5).join(\", \")}${ds.fields.length > 5 ? \"...\" : \"\"}`));\n }\n }\n }\n\n if (investigation.usageExamples && investigation.usageExamples.length > 0) {\n console.log(chalk.cyan(\"\\nUsage Examples:\"));\n for (const example of investigation.usageExamples) {\n console.log(chalk.dim(` • ${example.description} (${example.file})`));\n }\n }\n\n if (investigation.technicalNotes && investigation.technicalNotes.length > 0) {\n console.log(chalk.cyan(\"\\nTechnical Notes:\"));\n for (const note of investigation.technicalNotes) {\n console.log(chalk.dim(` • ${note}`));\n }\n }\n\n // Convert investigation to artifact\n const artifact = investigationToArtifact(query, investigation);\n\n if (options.post) {\n const postSpinner = ora(\"Posting artifact to Visible API...\").start();\n const response = await postArtifact(artifact);\n postSpinner.succeed(\"Artifact posted successfully\");\n console.log(chalk.green(\"\\n✓ Artifact created:\"), response.url);\n } else {\n console.log(chalk.yellow(\"\\nSkipped posting to API (--no-post)\"));\n console.log(chalk.dim(\"\\nArtifact payload:\"));\n console.log(JSON.stringify(artifact, null, 2));\n }\n } catch (error) {\n if (spinner) spinner.fail(\"Investigation failed\");\n console.error(chalk.red(\"\\nError:\"), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n}\n\n/**\n * Convert an investigation result to an artifact payload\n */\nfunction investigationToArtifact(\n query: string,\n investigation: InvestigationResult\n): ArtifactPayload {\n const source: ArtifactSource = {\n type: \"code-section\",\n reference: query,\n };\n\n // Build technical details from investigation\n const technicalDetails: string[] = [];\n\n if (investigation.dataFlow) {\n for (const step of investigation.dataFlow) {\n technicalDetails.push(`Step ${step.step}: ${step.description}`);\n }\n }\n\n if (investigation.technicalNotes) {\n technicalDetails.push(...investigation.technicalNotes);\n }\n\n // Collect all affected files\n const affectedComponents: string[] = [];\n\n if (investigation.keyFiles) {\n affectedComponents.push(...investigation.keyFiles.map((f) => f.path));\n }\n if (investigation.entryPoints) {\n affectedComponents.push(...investigation.entryPoints.map((e) => e.file));\n }\n if (investigation.dataStructures) {\n affectedComponents.push(...investigation.dataStructures.map((d) => d.file));\n }\n if (investigation.usageExamples) {\n affectedComponents.push(...investigation.usageExamples.map((e) => e.file));\n }\n\n // Deduplicate\n const uniqueComponents = [...new Set(affectedComponents)];\n\n // Extract keywords from data structures and key files\n const keywords: string[] = [];\n if (investigation.dataStructures) {\n keywords.push(...investigation.dataStructures.map((d) => d.name.toLowerCase()));\n }\n if (investigation.keyFiles) {\n keywords.push(...investigation.keyFiles.flatMap((f) => f.keyExports.map((e) => e.toLowerCase())));\n }\n if (investigation.relatedFeatures) {\n keywords.push(...investigation.relatedFeatures.map((f) => f.toLowerCase()));\n }\n\n const uniqueKeywords = [...new Set(keywords)].slice(0, 20);\n\n const context: ArtifactContext = {\n summary: investigation.summary || \"\",\n technicalDetails,\n affectedComponents: uniqueComponents,\n breakingChanges: false,\n keywords: uniqueKeywords,\n };\n\n // Build guidelines from investigation structure\n const guidelines: string[] = [\n \"Explain the feature from the user's perspective first.\",\n ];\n\n if (investigation.entryPoints && investigation.entryPoints.length > 0) {\n guidelines.push(\"Show how users trigger/access this feature.\");\n }\n if (investigation.dataFlow && investigation.dataFlow.length > 0) {\n guidelines.push(\"Walk through the data flow step by step.\");\n }\n if (investigation.dataStructures && investigation.dataStructures.length > 0) {\n guidelines.push(\"Define the key data structures and their fields.\");\n }\n if (investigation.usageExamples && investigation.usageExamples.length > 0) {\n guidelines.push(\"Include code examples showing real usage.\");\n }\n\n return {\n title: investigation.title || `Feature: ${query}`,\n description: investigation.summary || `Investigation of: ${query}`,\n source,\n context,\n guidelines,\n };\n}\n","#!/usr/bin/env node\n\n/**\n * Visible CLI Entry Point\n *\n * This is the main entry point for the CLI.\n * Run with: visible <command>\n */\n\nimport { program } from \"commander\";\nimport { analyzeCommand } from \"../commands/analyze.js\";\n\nprogram\n .name(\"visible\")\n .description(\"Transform technical changes into audience-friendly materials\")\n .version(\"0.1.0\");\n\n// Register commands\nprogram.addCommand(analyzeCommand);\n\nprogram.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/analyzers/git/index.ts","../../src/agent/tools/definitions.ts","../../src/agent/tools/implementations.ts","../../src/agent/detective.ts","../../src/api/client.ts","../../src/video/types.ts","../../src/video/storyboard.ts","../../src/video/renderer.ts","../../src/commands/analyze.ts","../../src/bin/index.ts"],"names":["range","result","listDir","execSync","__dirname","existsSync","join"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Git Analyzer\n *\n * Analyzes Git repositories, commits, branches, and pull requests.\n *\n * Features:\n * - Parse commit history\n * - Analyze PR changes\n * - Extract diff information\n * - Identify changed files and their context\n */\n\nimport { execSync } from \"child_process\";\nimport type { ArtifactSource, ArtifactContext } from \"../../shared/types.js\";\n\n/**\n * Code snippet extracted from diff\n */\nexport interface DiffCodeSnippet {\n file: string;\n code: string;\n startLine?: number;\n language?: string;\n description?: string;\n changeType: \"added\" | \"deleted\" | \"modified\" | \"context\";\n}\n\nexport interface AnalysisResult {\n title: string;\n description: string;\n source: ArtifactSource;\n context: ArtifactContext;\n guidelines: string[];\n /** Code snippets extracted from the diff */\n codeSnippets?: DiffCodeSnippet[];\n}\n\ninterface DiffFile {\n path: string;\n additions: number;\n deletions: number;\n status: \"added\" | \"modified\" | \"deleted\" | \"renamed\";\n}\n\ninterface CommitInfo {\n hash: string;\n author: string;\n date: string;\n message: string;\n}\n\n/**\n * Execute a git command and return the output\n */\nfunction git(command: string): string {\n try {\n return execSync(`git ${command}`, {\n encoding: \"utf-8\",\n maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large diffs\n }).trim();\n } catch (error) {\n throw new Error(`Git command failed: git ${command}`);\n }\n}\n\n/**\n * Check if a git revision exists\n */\nfunction revisionExists(revision: string): boolean {\n try {\n git(`rev-parse --verify ${revision}`);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the default diff range based on available commits\n */\nfunction getDefaultRange(): string {\n // Check if HEAD~1 exists (more than one commit)\n if (revisionExists(\"HEAD~1\")) {\n return \"HEAD~1..HEAD\";\n }\n\n // Check if HEAD exists (at least one commit)\n if (revisionExists(\"HEAD\")) {\n // Compare against empty tree (shows all files in first commit)\n const emptyTree = \"4b825dc642cb6eb9a060e54bf8d69288fbee4904\";\n return `${emptyTree}..HEAD`;\n }\n\n throw new Error(\"No commits found in repository\");\n}\n\n/**\n * Get the list of changed files in a diff range\n */\nfunction getChangedFiles(range: string): DiffFile[] {\n const output = git(`diff --numstat ${range}`);\n if (!output) return [];\n\n return output.split(\"\\n\").map((line) => {\n const [additions, deletions, path] = line.split(\"\\t\");\n return {\n path,\n additions: parseInt(additions, 10) || 0,\n deletions: parseInt(deletions, 10) || 0,\n status: \"modified\" as const,\n };\n });\n}\n\n/**\n * Get commit information for a range\n */\nfunction getCommits(range: string): CommitInfo[] {\n const output = git(`log --format=\"%H|%an|%ai|%s\" ${range}`);\n if (!output) return [];\n\n return output.split(\"\\n\").map((line) => {\n const [hash, author, date, message] = line.split(\"|\");\n return { hash, author, date, message };\n });\n}\n\n/**\n * Get the actual diff content\n */\nfunction getDiffContent(range: string): string {\n return git(`diff ${range}`);\n}\n\n/**\n * Extract code snippets from diff content\n */\nfunction extractCodeSnippets(diffContent: string, maxSnippets: number = 6): DiffCodeSnippet[] {\n const snippets: DiffCodeSnippet[] = [];\n const lines = diffContent.split(\"\\n\");\n \n let currentFile = \"\";\n let currentHunk: string[] = [];\n let currentStartLine = 0;\n let inHunk = false;\n\n for (const line of lines) {\n // Detect file header\n if (line.startsWith(\"diff --git\")) {\n // Save previous hunk if exists\n if (currentHunk.length > 0 && currentFile) {\n snippets.push(createSnippetFromHunk(currentFile, currentHunk, currentStartLine));\n if (snippets.length >= maxSnippets) break;\n }\n currentHunk = [];\n inHunk = false;\n continue;\n }\n\n // Get filename\n if (line.startsWith(\"+++ b/\")) {\n currentFile = line.slice(6);\n continue;\n }\n\n // Detect hunk header\n if (line.startsWith(\"@@\")) {\n // Save previous hunk\n if (currentHunk.length > 0 && currentFile) {\n snippets.push(createSnippetFromHunk(currentFile, currentHunk, currentStartLine));\n if (snippets.length >= maxSnippets) break;\n }\n \n // Parse line number from @@ -start,count +start,count @@\n const match = line.match(/@@ -\\d+(?:,\\d+)? \\+(\\d+)/);\n currentStartLine = match ? parseInt(match[1], 10) : 1;\n currentHunk = [];\n inHunk = true;\n continue;\n }\n\n // Collect hunk content (limit size)\n if (inHunk && currentHunk.length < 15) {\n currentHunk.push(line);\n }\n }\n\n // Save last hunk\n if (currentHunk.length > 0 && currentFile && snippets.length < maxSnippets) {\n snippets.push(createSnippetFromHunk(currentFile, currentHunk, currentStartLine));\n }\n\n return snippets;\n}\n\n/**\n * Create a code snippet from a diff hunk\n */\nfunction createSnippetFromHunk(\n file: string,\n hunkLines: string[],\n startLine: number\n): DiffCodeSnippet {\n // Determine change type based on content\n const hasAdditions = hunkLines.some(l => l.startsWith(\"+\"));\n const hasDeletions = hunkLines.some(l => l.startsWith(\"-\"));\n \n let changeType: \"added\" | \"deleted\" | \"modified\" | \"context\";\n if (hasAdditions && hasDeletions) {\n changeType = \"modified\";\n } else if (hasAdditions) {\n changeType = \"added\";\n } else if (hasDeletions) {\n changeType = \"deleted\";\n } else {\n changeType = \"context\";\n }\n\n // Clean up the code (remove diff markers for display)\n const code = hunkLines\n .map(line => {\n if (line.startsWith(\"+\") || line.startsWith(\"-\") || line.startsWith(\" \")) {\n return line.slice(1);\n }\n return line;\n })\n .join(\"\\n\");\n\n // Detect language from extension\n const ext = file.split(\".\").pop()?.toLowerCase() || \"\";\n const langMap: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"typescript\",\n js: \"javascript\",\n jsx: \"javascript\",\n vue: \"vue\",\n py: \"python\",\n rb: \"ruby\",\n go: \"go\",\n rs: \"rust\",\n java: \"java\",\n css: \"css\",\n scss: \"scss\",\n html: \"html\",\n json: \"json\",\n };\n\n return {\n file,\n code,\n startLine,\n language: langMap[ext] || \"text\",\n description: `${changeType === \"added\" ? \"Added\" : changeType === \"deleted\" ? \"Removed\" : \"Changed\"} in ${file}`,\n changeType,\n };\n}\n\n/**\n * Detect if there are breaking changes based on diff content and commit messages\n */\nfunction detectBreakingChanges(commits: CommitInfo[], diffContent: string): boolean {\n // Check commit messages for breaking change indicators\n const breakingPatterns = [\n /BREAKING CHANGE/i,\n /\\bbreaking\\b/i,\n /\\!:/,\n /removed/i,\n /deprecated/i,\n ];\n\n for (const commit of commits) {\n if (breakingPatterns.some((pattern) => pattern.test(commit.message))) {\n return true;\n }\n }\n\n // Check diff for removal of exports or major structural changes\n const lines = diffContent.split(\"\\n\");\n const removedExports = lines.filter(\n (line) => line.startsWith(\"-\") && /export\\s+(default\\s+)?(function|class|const|interface|type)/.test(line)\n );\n\n return removedExports.length > 0;\n}\n\n/**\n * Extract keywords from file paths and diff content\n */\nfunction extractKeywords(files: DiffFile[], diffContent: string): string[] {\n const keywords = new Set<string>();\n\n // Extract from file paths\n for (const file of files) {\n const parts = file.path.split(\"/\");\n for (const part of parts) {\n // Skip common non-meaningful names\n if (![\"src\", \"lib\", \"dist\", \"index\", \"node_modules\"].includes(part)) {\n // Extract meaningful words\n const words = part\n .replace(/\\.(ts|tsx|js|jsx|json|md|css|scss)$/, \"\")\n .split(/[-_.]/)\n .filter((w) => w.length > 2);\n words.forEach((w) => keywords.add(w.toLowerCase()));\n }\n }\n }\n\n // Extract from diff content (function names, class names, etc.)\n const codePatterns = [\n /(?:function|class|interface|type|const|let|var)\\s+([A-Za-z_][A-Za-z0-9_]*)/g,\n /export\\s+(?:default\\s+)?(?:function|class|const)\\s+([A-Za-z_][A-Za-z0-9_]*)/g,\n ];\n\n for (const pattern of codePatterns) {\n let match;\n while ((match = pattern.exec(diffContent)) !== null) {\n if (match[1] && match[1].length > 2) {\n keywords.add(match[1].toLowerCase());\n }\n }\n }\n\n return Array.from(keywords).slice(0, 20);\n}\n\n/**\n * Generate a summary title from commits and file changes\n */\nfunction generateTitle(commits: CommitInfo[], files: DiffFile[]): string {\n if (commits.length === 1) {\n return commits[0].message;\n }\n\n if (commits.length > 1) {\n // Find common theme in commit messages or use generic title\n const messages = commits.map((c) => c.message);\n const firstWords = messages.map((m) => m.split(\" \").slice(0, 3).join(\" \"));\n return `Changes across ${commits.length} commits: ${firstWords[0]}...`;\n }\n\n // Fallback to file-based title\n const extensions = [...new Set(files.map((f) => f.path.split(\".\").pop()))];\n return `Code changes in ${files.length} files (${extensions.join(\", \")})`;\n}\n\n/**\n * Generate a description from the analysis\n */\nfunction generateDescription(\n commits: CommitInfo[],\n files: DiffFile[],\n breakingChanges: boolean\n): string {\n const parts: string[] = [];\n\n if (commits.length > 0) {\n parts.push(`This change includes ${commits.length} commit(s).`);\n }\n\n const totalAdditions = files.reduce((sum, f) => sum + f.additions, 0);\n const totalDeletions = files.reduce((sum, f) => sum + f.deletions, 0);\n parts.push(`Modified ${files.length} file(s) with +${totalAdditions}/-${totalDeletions} lines.`);\n\n if (breakingChanges) {\n parts.push(\"⚠️ This change may contain breaking changes.\");\n }\n\n return parts.join(\" \");\n}\n\n/**\n * Generate guidelines for artifact messaging\n */\nfunction generateGuidelines(\n commits: CommitInfo[],\n files: DiffFile[],\n breakingChanges: boolean\n): string[] {\n const guidelines: string[] = [];\n\n // Feature vs fix detection\n const hasFeature = commits.some((c) => /feat|feature|add|new/i.test(c.message));\n const hasFix = commits.some((c) => /fix|bug|patch|issue/i.test(c.message));\n const hasRefactor = commits.some((c) => /refactor|clean|improve/i.test(c.message));\n\n if (hasFeature) {\n guidelines.push(\"Highlight the new capability and its user-facing benefits.\");\n }\n if (hasFix) {\n guidelines.push(\"Explain what was broken and how it's now fixed.\");\n }\n if (hasRefactor) {\n guidelines.push(\"Note the improvements without exposing internal complexity.\");\n }\n\n if (breakingChanges) {\n guidelines.push(\"Clearly communicate the breaking change and migration steps.\");\n guidelines.push(\"Provide a timeline for deprecation if applicable.\");\n }\n\n // File type specific guidelines\n const hasAPI = files.some((f) => /api|route|endpoint/i.test(f.path));\n const hasUI = files.some((f) => /component|page|view|ui/i.test(f.path));\n const hasConfig = files.some((f) => /config|env|setting/i.test(f.path));\n\n if (hasAPI) {\n guidelines.push(\"Document any API changes with request/response examples.\");\n }\n if (hasUI) {\n guidelines.push(\"Consider including screenshots or visual demos.\");\n }\n if (hasConfig) {\n guidelines.push(\"List any new configuration options or environment variables.\");\n }\n\n return guidelines.length > 0\n ? guidelines\n : [\"Focus on the value delivered to users.\", \"Keep technical details accessible.\"];\n}\n\n/**\n * Analyze a git diff range and produce an artifact\n */\nexport async function analyzeDiff(range: string): Promise<AnalysisResult> {\n // Validate we're in a git repository\n try {\n git(\"rev-parse --git-dir\");\n } catch {\n throw new Error(\"Not in a git repository\");\n }\n\n // Handle default range or validate provided range\n let effectiveRange = range;\n if (range === \"HEAD~1..HEAD\") {\n // This is the default, check if it exists\n try {\n effectiveRange = getDefaultRange();\n } catch (error) {\n throw new Error(\n `Could not determine diff range: ${error instanceof Error ? error.message : error}`\n );\n }\n } else {\n // Validate the provided range\n const [start] = range.split(\"..\");\n if (!revisionExists(start)) {\n throw new Error(`Invalid revision: ${start}`);\n }\n }\n\n const files = getChangedFiles(effectiveRange);\n if (files.length === 0) {\n throw new Error(`No changes found in range: ${effectiveRange}`);\n }\n\n const commits = getCommits(effectiveRange);\n const diffContent = getDiffContent(effectiveRange);\n const breakingChanges = detectBreakingChanges(commits, diffContent);\n const keywords = extractKeywords(files, diffContent);\n\n const title = generateTitle(commits, files);\n const description = generateDescription(commits, files, breakingChanges);\n const guidelines = generateGuidelines(commits, files, breakingChanges);\n\n // Get repository info for source reference\n let repoUrl = \"\";\n try {\n repoUrl = git(\"config --get remote.origin.url\").replace(/\\.git$/, \"\");\n } catch {\n // No remote configured\n }\n\n const source: ArtifactSource = {\n type: \"commit\",\n reference: effectiveRange,\n url: repoUrl ? `${repoUrl}/compare/${effectiveRange.replace(\"..\", \"...\")}` : undefined,\n };\n\n const context: ArtifactContext = {\n summary: description,\n technicalDetails: commits.map((c) => `${c.hash.slice(0, 7)}: ${c.message}`),\n affectedComponents: files.map((f) => f.path),\n breakingChanges,\n keywords,\n };\n\n // Extract code snippets from the diff\n const codeSnippets = extractCodeSnippets(diffContent);\n\n return {\n title,\n description,\n source,\n context,\n guidelines,\n codeSnippets,\n };\n}\n\nexport interface PROptions {\n url?: string;\n number?: number;\n}\n\n/**\n * Analyze a pull request and produce an artifact\n */\nexport async function analyzePR(options: PROptions): Promise<AnalysisResult> {\n // Validate we're in a git repository\n try {\n git(\"rev-parse --git-dir\");\n } catch {\n throw new Error(\"Not in a git repository\");\n }\n\n let prTitle = \"\";\n let prBody = \"\";\n let prNumber = options.number;\n let prUrl = options.url;\n\n // If URL provided, parse it\n if (prUrl) {\n const match = prUrl.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/pull\\/(\\d+)/);\n if (match) {\n prNumber = parseInt(match[3], 10);\n }\n }\n\n // Try to get PR info from GitHub CLI if available\n if (prNumber) {\n try {\n const prInfo = git(`gh pr view ${prNumber} --json title,body,headRefName,baseRefName`);\n const parsed = JSON.parse(prInfo);\n prTitle = parsed.title || \"\";\n prBody = parsed.body || \"\";\n\n // Get diff between base and head\n const baseRef = parsed.baseRefName || \"main\";\n const headRef = parsed.headRefName || \"HEAD\";\n\n // Fetch the base branch to ensure we have it\n try {\n git(`fetch origin ${baseRef}`);\n } catch {\n // Branch might already exist locally\n }\n\n const range = `origin/${baseRef}...${headRef}`;\n const result = await analyzeDiff(range);\n\n // Override with PR-specific info\n result.title = prTitle || result.title;\n result.description = prBody\n ? `${prBody.slice(0, 200)}${prBody.length > 200 ? \"...\" : \"\"}`\n : result.description;\n result.source = {\n type: \"pr\",\n reference: `#${prNumber}`,\n url: prUrl || `${git(\"config --get remote.origin.url\").replace(/\\.git$/, \"\")}/pull/${prNumber}`,\n };\n\n return result;\n } catch {\n // GitHub CLI not available or PR not found, fall back to current branch diff\n }\n }\n\n // Fallback: analyze current branch against main/master\n const currentBranch = git(\"rev-parse --abbrev-ref HEAD\");\n let baseBranch = \"main\";\n\n try {\n git(\"rev-parse --verify main\");\n } catch {\n try {\n git(\"rev-parse --verify master\");\n baseBranch = \"master\";\n } catch {\n throw new Error(\"Could not find base branch (main or master)\");\n }\n }\n\n const range = `${baseBranch}...${currentBranch}`;\n const result = await analyzeDiff(range);\n\n result.source = {\n type: \"pr\",\n reference: prNumber ? `#${prNumber}` : currentBranch,\n url: prUrl,\n };\n\n return result;\n}\n","/**\n * Tool Definitions for the Detective Agent\n *\n * These are the OpenAI function calling definitions that describe\n * what tools the agent can use to explore a codebase.\n */\n\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const AGENT_TOOLS: ChatCompletionTool[] = [\n {\n type: \"function\",\n function: {\n name: \"search_files\",\n description:\n \"Search for files by name pattern or content. Use this to find files related to a feature, component, or concept. Returns file paths that match.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description:\n \"Search query - can be a filename pattern (e.g., '*expense*', '*.schema.ts') or keywords to search in file content\",\n },\n searchIn: {\n type: \"string\",\n enum: [\"filename\", \"content\", \"both\"],\n description: \"Where to search: filename only, file content only, or both\",\n },\n fileTypes: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Optional file extensions to filter (e.g., ['.ts', '.tsx']). If not provided, searches all code files.\",\n },\n directory: {\n type: \"string\",\n description:\n \"Optional subdirectory to search in (relative to project root). If not provided, searches entire project.\",\n },\n },\n required: [\"query\", \"searchIn\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"read_file\",\n description:\n \"Read the contents of a specific file. Use this after finding a relevant file to understand its implementation, imports, exports, and logic.\",\n parameters: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Path to the file (relative to project root)\",\n },\n startLine: {\n type: \"number\",\n description: \"Optional start line number (1-indexed) to read from\",\n },\n endLine: {\n type: \"number\",\n description: \"Optional end line number (1-indexed) to read to\",\n },\n },\n required: [\"path\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"find_references\",\n description:\n \"Find where a symbol (function, component, class, type, constant) is used/imported across the codebase. Critical for understanding how something is triggered or consumed.\",\n parameters: {\n type: \"object\",\n properties: {\n symbol: {\n type: \"string\",\n description:\n \"The symbol name to find references for (e.g., 'CreateExpenseModal', 'useAuth', 'ExpenseSchema')\",\n },\n type: {\n type: \"string\",\n enum: [\"import\", \"usage\", \"all\"],\n description:\n \"Type of references: 'import' finds import statements, 'usage' finds actual usage, 'all' finds both\",\n },\n },\n required: [\"symbol\", \"type\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"find_definition\",\n description:\n \"Find where a symbol is defined/exported. Use this to find the source definition of a type, function, or component.\",\n parameters: {\n type: \"object\",\n properties: {\n symbol: {\n type: \"string\",\n description: \"The symbol name to find the definition of\",\n },\n },\n required: [\"symbol\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"list_directory\",\n description:\n \"List files and subdirectories in a directory. Use this to explore the project structure and understand how code is organized.\",\n parameters: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description:\n \"Directory path relative to project root. Use '.' or empty string for root.\",\n },\n recursive: {\n type: \"boolean\",\n description:\n \"If true, lists all files recursively (up to 3 levels deep). If false, only immediate children.\",\n },\n },\n required: [\"path\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"get_file_structure\",\n description:\n \"Analyze a file and extract its structure: imports, exports, functions, classes, types, and their relationships. Use this to quickly understand what a file provides and depends on.\",\n parameters: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Path to the file to analyze\",\n },\n },\n required: [\"path\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"search_types\",\n description:\n \"Search for TypeScript/JavaScript type definitions, interfaces, schemas (Zod, Yup), or prop types. Useful for understanding data structures.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description:\n \"Search query for types (e.g., 'Expense', 'CreditCard', 'FormData')\",\n },\n kind: {\n type: \"string\",\n enum: [\"interface\", \"type\", \"schema\", \"all\"],\n description:\n \"What kind of type definition to search for\",\n },\n },\n required: [\"query\", \"kind\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"complete_investigation\",\n description:\n \"Call this when you have gathered enough information to create a comprehensive artifact. Provide your findings structured for documentation generation.\",\n parameters: {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n description: \"A clear, descriptive title for the feature/topic\",\n },\n summary: {\n type: \"string\",\n description:\n \"A 2-3 sentence summary explaining what this feature does from a user perspective\",\n },\n entryPoints: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n file: { type: \"string\" },\n component: { type: \"string\" },\n description: { type: \"string\" },\n },\n },\n description:\n \"The main entry points/components for this feature (e.g., the modal, page, or button that triggers it)\",\n },\n dataFlow: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n step: { type: \"number\" },\n description: { type: \"string\" },\n files: { type: \"array\", items: { type: \"string\" } },\n },\n },\n description:\n \"Step-by-step data flow explaining how the feature works\",\n },\n keyFiles: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n purpose: { type: \"string\" },\n keyExports: { type: \"array\", items: { type: \"string\" } },\n },\n },\n description: \"The most important files for this feature\",\n },\n dataStructures: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n file: { type: \"string\" },\n fields: { type: \"array\", items: { type: \"string\" } },\n description: { type: \"string\" },\n },\n },\n description:\n \"Key data structures (types, interfaces, schemas) used\",\n },\n usageExamples: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n description: { type: \"string\" },\n file: { type: \"string\" },\n codeSnippet: { type: \"string\" },\n },\n },\n description:\n \"Examples of how this feature is used in the codebase\",\n },\n relatedFeatures: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Other features or components that relate to this one\",\n },\n technicalNotes: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Important technical details, edge cases, or implementation notes\",\n },\n },\n required: [\n \"title\",\n \"summary\",\n \"entryPoints\",\n \"dataFlow\",\n \"keyFiles\",\n \"dataStructures\",\n ],\n },\n },\n },\n];\n\nexport type ToolName =\n | \"search_files\"\n | \"read_file\"\n | \"find_references\"\n | \"find_definition\"\n | \"list_directory\"\n | \"get_file_structure\"\n | \"search_types\"\n | \"complete_investigation\";\n","/**\n * Tool Implementations for the Detective Agent\n *\n * These are the actual implementations of the tools that the agent uses\n * to explore and understand a codebase.\n */\n\nimport { readFileSync, readdirSync, statSync, existsSync } from \"fs\";\nimport { join, relative, basename } from \"path\";\nimport { glob } from \"glob\";\nimport type { ToolName } from \"./definitions.js\";\n\nconst CODE_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".vue\",\n \".svelte\",\n \".py\",\n \".go\",\n \".rs\",\n \".java\",\n \".rb\",\n \".json\",\n \".yaml\",\n \".yml\",\n];\n\nconst IGNORED_DIRS = [\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \".nuxt\",\n \"coverage\",\n \".turbo\",\n \".cache\",\n \"__pycache__\",\n \".venv\",\n \"venv\",\n];\n\nexport interface ToolContext {\n projectRoot: string;\n}\n\nexport interface ToolResult {\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\n/**\n * Search for files by name pattern or content\n */\nexport async function searchFiles(\n ctx: ToolContext,\n args: {\n query: string;\n searchIn: \"filename\" | \"content\" | \"both\";\n fileTypes?: string[];\n directory?: string;\n }\n): Promise<ToolResult> {\n const { query, searchIn, fileTypes, directory } = args;\n const searchRoot = directory ? join(ctx.projectRoot, directory) : ctx.projectRoot;\n\n if (!existsSync(searchRoot)) {\n return { success: false, error: `Directory not found: ${directory}` };\n }\n\n const results: Array<{ path: string; matches?: string[] }> = [];\n const lowerQuery = query.toLowerCase();\n\n // Build glob pattern for file types\n const extensions = fileTypes?.length ? fileTypes : CODE_EXTENSIONS;\n const patterns = extensions.map((ext) => `**/*${ext}`);\n\n try {\n for (const pattern of patterns) {\n const files = await glob(pattern, {\n cwd: searchRoot,\n ignore: IGNORED_DIRS.map((d) => `**/${d}/**`),\n nodir: true,\n absolute: false,\n });\n\n for (const file of files) {\n const fullPath = join(searchRoot, file);\n const relativePath = relative(ctx.projectRoot, fullPath);\n\n // Check filename match\n if (searchIn === \"filename\" || searchIn === \"both\") {\n const fileName = basename(file).toLowerCase();\n if (fileName.includes(lowerQuery) || matchGlob(fileName, query)) {\n if (!results.find((r) => r.path === relativePath)) {\n results.push({ path: relativePath });\n }\n continue;\n }\n }\n\n // Check content match\n if (searchIn === \"content\" || searchIn === \"both\") {\n try {\n const content = readFileSync(fullPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n const matches: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].toLowerCase().includes(lowerQuery)) {\n matches.push(`L${i + 1}: ${lines[i].trim().slice(0, 100)}`);\n if (matches.length >= 5) break;\n }\n }\n\n if (matches.length > 0) {\n results.push({ path: relativePath, matches });\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n }\n\n // Sort by relevance (filename matches first, then by number of content matches)\n results.sort((a, b) => {\n if (!a.matches && b.matches) return -1;\n if (a.matches && !b.matches) return 1;\n if (a.matches && b.matches) return b.matches.length - a.matches.length;\n return 0;\n });\n\n return {\n success: true,\n data: {\n query,\n totalResults: results.length,\n results: results.slice(0, 20), // Limit results\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Search failed: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * Simple glob matching for filename patterns\n */\nfunction matchGlob(filename: string, pattern: string): boolean {\n const regex = pattern\n .replace(/\\./g, \"\\\\.\")\n .replace(/\\*/g, \".*\")\n .replace(/\\?/g, \".\");\n return new RegExp(regex, \"i\").test(filename);\n}\n\n/**\n * Read a file's contents\n */\nexport async function readFile(\n ctx: ToolContext,\n args: { path: string; startLine?: number; endLine?: number }\n): Promise<ToolResult> {\n const { path: filePath, startLine, endLine } = args;\n const fullPath = join(ctx.projectRoot, filePath);\n\n if (!existsSync(fullPath)) {\n return { success: false, error: `File not found: ${filePath}` };\n }\n\n try {\n const content = readFileSync(fullPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n\n const start = startLine ? Math.max(0, startLine - 1) : 0;\n const end = endLine ? Math.min(lines.length, endLine) : lines.length;\n\n const selectedLines = lines.slice(start, end);\n const numberedContent = selectedLines\n .map((line, i) => `${start + i + 1}| ${line}`)\n .join(\"\\n\");\n\n return {\n success: true,\n data: {\n path: filePath,\n totalLines: lines.length,\n linesShown: `${start + 1}-${end}`,\n content: numberedContent,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to read file: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * Find references to a symbol across the codebase\n */\nexport async function findReferences(\n ctx: ToolContext,\n args: { symbol: string; type: \"import\" | \"usage\" | \"all\" }\n): Promise<ToolResult> {\n const { symbol, type } = args;\n const results: Array<{\n file: string;\n line: number;\n type: \"import\" | \"usage\";\n context: string;\n }> = [];\n\n // Build search patterns based on type\n const patterns: Array<{ regex: RegExp; type: \"import\" | \"usage\" }> = [];\n\n if (type === \"import\" || type === \"all\") {\n // Import patterns\n patterns.push(\n { regex: new RegExp(`import\\\\s+.*\\\\b${symbol}\\\\b.*from`, \"g\"), type: \"import\" },\n { regex: new RegExp(`import\\\\s+${symbol}\\\\s+from`, \"g\"), type: \"import\" },\n { regex: new RegExp(`from\\\\s+['\"][^'\"]+['\"].*\\\\b${symbol}\\\\b`, \"g\"), type: \"import\" },\n { regex: new RegExp(`require\\\\([^)]*${symbol}[^)]*\\\\)`, \"g\"), type: \"import\" }\n );\n }\n\n if (type === \"usage\" || type === \"all\") {\n // Usage patterns (component usage, function calls, type references)\n patterns.push(\n { regex: new RegExp(`<${symbol}[\\\\s/>]`, \"g\"), type: \"usage\" }, // JSX component\n { regex: new RegExp(`\\\\b${symbol}\\\\s*\\\\(`, \"g\"), type: \"usage\" }, // Function call\n { regex: new RegExp(`:\\\\s*${symbol}[\\\\s,;>]`, \"g\"), type: \"usage\" }, // Type annotation\n { regex: new RegExp(`extends\\\\s+${symbol}\\\\b`, \"g\"), type: \"usage\" }, // Class extends\n { regex: new RegExp(`implements\\\\s+${symbol}\\\\b`, \"g\"), type: \"usage\" } // Interface implements\n );\n }\n\n try {\n const files = await glob(\"**/*.{ts,tsx,js,jsx,vue,svelte}\", {\n cwd: ctx.projectRoot,\n ignore: IGNORED_DIRS.map((d) => `**/${d}/**`),\n nodir: true,\n });\n\n for (const file of files) {\n const fullPath = join(ctx.projectRoot, file);\n try {\n const content = readFileSync(fullPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n for (const pattern of patterns) {\n if (pattern.regex.test(line)) {\n // Reset regex state\n pattern.regex.lastIndex = 0;\n results.push({\n file,\n line: i + 1,\n type: pattern.type,\n context: line.trim().slice(0, 150),\n });\n break; // Only count each line once\n }\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n // Group by file for cleaner output\n const groupedByFile = results.reduce(\n (acc, ref) => {\n if (!acc[ref.file]) acc[ref.file] = [];\n acc[ref.file].push(ref);\n return acc;\n },\n {} as Record<string, typeof results>\n );\n\n return {\n success: true,\n data: {\n symbol,\n totalReferences: results.length,\n fileCount: Object.keys(groupedByFile).length,\n references: groupedByFile,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to find references: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * Find where a symbol is defined/exported\n */\nexport async function findDefinition(\n ctx: ToolContext,\n args: { symbol: string }\n): Promise<ToolResult> {\n const { symbol } = args;\n\n // Patterns that indicate a definition\n const definitionPatterns = [\n new RegExp(`export\\\\s+(?:default\\\\s+)?(?:async\\\\s+)?function\\\\s+${symbol}\\\\b`),\n new RegExp(`export\\\\s+(?:default\\\\s+)?class\\\\s+${symbol}\\\\b`),\n new RegExp(`export\\\\s+(?:const|let|var)\\\\s+${symbol}\\\\s*=`),\n new RegExp(`export\\\\s+(?:interface|type)\\\\s+${symbol}\\\\b`),\n new RegExp(`(?:const|let|var)\\\\s+${symbol}\\\\s*=.*(?:function|=>|class)`),\n new RegExp(`function\\\\s+${symbol}\\\\s*\\\\(`),\n new RegExp(`class\\\\s+${symbol}\\\\s*(?:extends|implements|\\\\{)`),\n new RegExp(`interface\\\\s+${symbol}\\\\s*(?:extends|\\\\{)`),\n new RegExp(`type\\\\s+${symbol}\\\\s*=`),\n new RegExp(`export\\\\s*\\\\{[^}]*\\\\b${symbol}\\\\b[^}]*\\\\}`), // Named export\n ];\n\n const results: Array<{\n file: string;\n line: number;\n definitionType: string;\n context: string;\n }> = [];\n\n try {\n const files = await glob(\"**/*.{ts,tsx,js,jsx}\", {\n cwd: ctx.projectRoot,\n ignore: IGNORED_DIRS.map((d) => `**/${d}/**`),\n nodir: true,\n });\n\n for (const file of files) {\n const fullPath = join(ctx.projectRoot, file);\n try {\n const content = readFileSync(fullPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n for (const pattern of definitionPatterns) {\n if (pattern.test(line)) {\n // Determine definition type\n let defType = \"unknown\";\n if (/function/.test(line)) defType = \"function\";\n else if (/class/.test(line)) defType = \"class\";\n else if (/interface/.test(line)) defType = \"interface\";\n else if (/type\\s+\\w+\\s*=/.test(line)) defType = \"type\";\n else if (/const|let|var/.test(line)) defType = \"variable\";\n else if (/export\\s*\\{/.test(line)) defType = \"re-export\";\n\n results.push({\n file,\n line: i + 1,\n definitionType: defType,\n context: lines.slice(i, Math.min(i + 5, lines.length)).join(\"\\n\").slice(0, 300),\n });\n break;\n }\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n return {\n success: true,\n data: {\n symbol,\n definitionsFound: results.length,\n definitions: results,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to find definition: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * List directory contents\n */\nexport async function listDirectory(\n ctx: ToolContext,\n args: { path: string; recursive?: boolean }\n): Promise<ToolResult> {\n const { path: dirPath, recursive } = args;\n const fullPath = dirPath ? join(ctx.projectRoot, dirPath) : ctx.projectRoot;\n\n if (!existsSync(fullPath)) {\n return { success: false, error: `Directory not found: ${dirPath}` };\n }\n\n try {\n const stat = statSync(fullPath);\n if (!stat.isDirectory()) {\n return { success: false, error: `Not a directory: ${dirPath}` };\n }\n\n const items: Array<{ path: string; type: \"file\" | \"directory\"; size?: number }> = [];\n\n function listDir(dir: string, depth: number) {\n if (depth > 3) return; // Max depth\n\n const entries = readdirSync(dir);\n for (const entry of entries) {\n if (IGNORED_DIRS.includes(entry) || entry.startsWith(\".\")) continue;\n\n const entryPath = join(dir, entry);\n const relativePath = relative(ctx.projectRoot, entryPath);\n\n try {\n const entryStat = statSync(entryPath);\n if (entryStat.isDirectory()) {\n items.push({ path: relativePath, type: \"directory\" });\n if (recursive) {\n listDir(entryPath, depth + 1);\n }\n } else if (entryStat.isFile()) {\n items.push({ path: relativePath, type: \"file\", size: entryStat.size });\n }\n } catch {\n // Skip inaccessible entries\n }\n }\n }\n\n listDir(fullPath, 0);\n\n // Sort: directories first, then files\n items.sort((a, b) => {\n if (a.type !== b.type) return a.type === \"directory\" ? -1 : 1;\n return a.path.localeCompare(b.path);\n });\n\n return {\n success: true,\n data: {\n path: dirPath || \".\",\n totalItems: items.length,\n items: items.slice(0, 100), // Limit results\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to list directory: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * Get structured analysis of a file\n */\nexport async function getFileStructure(\n ctx: ToolContext,\n args: { path: string }\n): Promise<ToolResult> {\n const { path: filePath } = args;\n const fullPath = join(ctx.projectRoot, filePath);\n\n if (!existsSync(fullPath)) {\n return { success: false, error: `File not found: ${filePath}` };\n }\n\n try {\n const content = readFileSync(fullPath, \"utf-8\");\n\n const structure = {\n imports: [] as Array<{ from: string; imports: string[] }>,\n exports: [] as Array<{ name: string; type: string; line: number }>,\n functions: [] as Array<{ name: string; line: number; async: boolean }>,\n classes: [] as Array<{ name: string; line: number; extends?: string }>,\n types: [] as Array<{ name: string; line: number; kind: \"type\" | \"interface\" }>,\n components: [] as Array<{ name: string; line: number; props?: string }>,\n };\n\n const lines = content.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + 1;\n\n // Parse imports\n const importMatch = line.match(\n /import\\s+(?:type\\s+)?(?:\\{([^}]+)\\}|(\\w+))\\s+from\\s+['\"]([^'\"]+)['\"]/\n );\n if (importMatch) {\n const imports = importMatch[1]\n ? importMatch[1].split(\",\").map((s) => s.trim().split(\" as \")[0])\n : [importMatch[2]];\n structure.imports.push({ from: importMatch[3], imports: imports.filter(Boolean) });\n }\n\n // Parse exports\n const exportMatch = line.match(\n /export\\s+(?:default\\s+)?(?:async\\s+)?(function|class|const|let|var|interface|type)\\s+(\\w+)/\n );\n if (exportMatch) {\n structure.exports.push({ name: exportMatch[2], type: exportMatch[1], line: lineNum });\n }\n\n // Parse functions\n const funcMatch = line.match(\n /(?:export\\s+)?(?:default\\s+)?(async\\s+)?function\\s+(\\w+)/\n );\n if (funcMatch) {\n structure.functions.push({\n name: funcMatch[2],\n line: lineNum,\n async: !!funcMatch[1],\n });\n }\n\n // Parse arrow functions assigned to const\n const arrowMatch = line.match(\n /(?:export\\s+)?const\\s+(\\w+)\\s*=\\s*(async\\s+)?(?:\\([^)]*\\)|[^=])\\s*=>/\n );\n if (arrowMatch) {\n structure.functions.push({\n name: arrowMatch[1],\n line: lineNum,\n async: !!arrowMatch[2],\n });\n }\n\n // Parse classes\n const classMatch = line.match(\n /(?:export\\s+)?(?:default\\s+)?class\\s+(\\w+)(?:\\s+extends\\s+(\\w+))?/\n );\n if (classMatch) {\n structure.classes.push({\n name: classMatch[1],\n line: lineNum,\n extends: classMatch[2],\n });\n }\n\n // Parse types/interfaces\n const typeMatch = line.match(\n /(?:export\\s+)?(interface|type)\\s+(\\w+)/\n );\n if (typeMatch) {\n structure.types.push({\n name: typeMatch[2],\n line: lineNum,\n kind: typeMatch[1] as \"type\" | \"interface\",\n });\n }\n\n // Parse React components (function components)\n if (\n line.match(/(?:export\\s+)?(?:default\\s+)?(?:const|function)\\s+([A-Z]\\w+)/) &&\n (content.includes(\"React\") || content.includes(\"jsx\") || filePath.endsWith(\".tsx\"))\n ) {\n const compMatch = line.match(/(?:const|function)\\s+([A-Z]\\w+)/);\n if (compMatch) {\n // Check for props type\n const propsMatch = line.match(/:\\s*(?:React\\.)?FC<(\\w+)>|props:\\s*(\\w+)/);\n structure.components.push({\n name: compMatch[1],\n line: lineNum,\n props: propsMatch ? propsMatch[1] || propsMatch[2] : undefined,\n });\n }\n }\n }\n\n return {\n success: true,\n data: {\n path: filePath,\n structure,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to analyze file: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * Search for type definitions\n */\nexport async function searchTypes(\n ctx: ToolContext,\n args: { query: string; kind: \"interface\" | \"type\" | \"schema\" | \"all\" }\n): Promise<ToolResult> {\n const { query, kind } = args;\n\n const results: Array<{\n name: string;\n file: string;\n line: number;\n kind: string;\n preview: string;\n }> = [];\n\n // Patterns based on kind\n const patterns: RegExp[] = [];\n if (kind === \"interface\" || kind === \"all\") {\n patterns.push(new RegExp(`interface\\\\s+(\\\\w*${query}\\\\w*)`, \"gi\"));\n }\n if (kind === \"type\" || kind === \"all\") {\n patterns.push(new RegExp(`type\\\\s+(\\\\w*${query}\\\\w*)\\\\s*=`, \"gi\"));\n }\n if (kind === \"schema\" || kind === \"all\") {\n // Zod, Yup, and other schema patterns\n patterns.push(new RegExp(`(?:const|export\\\\s+const)\\\\s+(\\\\w*${query}\\\\w*Schema)\\\\s*=`, \"gi\"));\n patterns.push(new RegExp(`z\\\\.object.*${query}`, \"gi\"));\n }\n\n try {\n const files = await glob(\"**/*.{ts,tsx,js,jsx}\", {\n cwd: ctx.projectRoot,\n ignore: IGNORED_DIRS.map((d) => `**/${d}/**`),\n nodir: true,\n });\n\n for (const file of files) {\n const fullPath = join(ctx.projectRoot, file);\n try {\n const content = readFileSync(fullPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n for (const pattern of patterns) {\n const match = pattern.exec(line);\n if (match) {\n pattern.lastIndex = 0; // Reset\n\n // Get more context (the full type definition if small)\n const preview = lines.slice(i, Math.min(i + 10, lines.length)).join(\"\\n\").slice(0, 400);\n\n let detectedKind = \"type\";\n if (/interface/.test(line)) detectedKind = \"interface\";\n else if (/Schema/.test(line) || /z\\./.test(line)) detectedKind = \"schema\";\n\n results.push({\n name: match[1] || query,\n file,\n line: i + 1,\n kind: detectedKind,\n preview,\n });\n break;\n }\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n return {\n success: true,\n data: {\n query,\n kind,\n totalResults: results.length,\n results: results.slice(0, 15),\n },\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to search types: ${error instanceof Error ? error.message : error}`,\n };\n }\n}\n\n/**\n * Execute a tool by name\n */\nexport async function executeTool(\n toolName: ToolName,\n args: Record<string, unknown>,\n ctx: ToolContext\n): Promise<ToolResult> {\n switch (toolName) {\n case \"search_files\":\n return searchFiles(ctx, args as Parameters<typeof searchFiles>[1]);\n case \"read_file\":\n return readFile(ctx, args as Parameters<typeof readFile>[1]);\n case \"find_references\":\n return findReferences(ctx, args as Parameters<typeof findReferences>[1]);\n case \"find_definition\":\n return findDefinition(ctx, args as Parameters<typeof findDefinition>[1]);\n case \"list_directory\":\n return listDirectory(ctx, args as Parameters<typeof listDirectory>[1]);\n case \"get_file_structure\":\n return getFileStructure(ctx, args as Parameters<typeof getFileStructure>[1]);\n case \"search_types\":\n return searchTypes(ctx, args as Parameters<typeof searchTypes>[1]);\n case \"complete_investigation\":\n // This is handled specially by the agent\n return { success: true, data: args };\n default:\n return { success: false, error: `Unknown tool: ${toolName}` };\n }\n}\n","/**\n * The Detective Agent\n *\n * An AI agent that explores codebases to understand features, flows, and implementations.\n * Uses tools to navigate code rather than trying to read everything at once.\n */\n\nimport OpenAI from \"openai\";\nimport type {\n ChatCompletionMessageParam,\n ChatCompletionToolMessageParam,\n} from \"openai/resources/chat/completions\";\nimport { AGENT_TOOLS, type ToolName } from \"./tools/definitions.js\";\nimport { executeTool, type ToolContext, type ToolResult } from \"./tools/implementations.js\";\n\nconst SYSTEM_PROMPT = `You are \"The Detective\" - an expert code analyst who explores codebases methodically to understand features and implementations.\n\nYour mission is to investigate a codebase based on a user's query and produce a comprehensive understanding of how a feature works.\n\n## Investigation Strategy\n\n1. **Start Broad**: Begin by searching for files related to the query keywords. Look for obvious matches first.\n\n2. **Follow the Trail**: When you find a relevant file:\n - Read it to understand what it does\n - Look at its imports to find dependencies\n - Find where it's exported/used to understand how it fits in\n\n3. **Find Entry Points**: Always identify HOW a feature is triggered:\n - Is it a page/route?\n - Is it a component triggered by user action?\n - Is it an API endpoint?\n - Find the \"beginning\" of the user journey\n\n4. **Trace Data Flow**: Understand:\n - What data does the feature work with? (types, schemas)\n - Where does data come from? (API, props, state)\n - Where does data go? (mutations, API calls, state updates)\n\n5. **Find Usage Examples**: Search for where components/functions are actually used. This shows real-world integration.\n\n6. **Document Technical Details**: Note any important patterns, validations, error handling, or edge cases.\n\n## Efficiency Rules (Important)\n\n- Be efficient: use as few tools as possible (aim for 8-12 tool calls).\n- Prefer targeted \\`search_files\\` in content or filename over broad directory listing.\n- Read only the most relevant files; avoid reading the same file multiple times.\n- If you have enough information to explain the feature, **complete the investigation** even if some sections are partial.\n- Use empty arrays for unknown sections rather than continuing to search.\n\n## Tool Usage Tips\n\n- Use \\`search_files\\` with searchIn=\"filename\" first for broad discovery\n- Use \\`search_files\\` with searchIn=\"content\" when looking for specific patterns\n- Use \\`get_file_structure\\` to quickly understand a file's purpose without reading everything\n- Use \\`find_references\\` to understand how something is used/triggered\n- Use \\`find_definition\\` when you see an import and need to find the source\n- Use \\`search_types\\` to find data structures and schemas\n- Use \\`read_file\\` to examine specific implementation details\n\n## Investigation Rules\n\n1. Be thorough but efficient - don't read every file, use structure analysis first\n2. Always find at least ONE usage example of the main component/function\n3. Always identify the data types/schemas involved\n4. Focus on answering: \"If I were a new developer, what would I need to know to work on this?\"\n5. When you have enough information, call \\`complete_investigation\\` with your structured findings\n\n## Output Quality\n\nYour final investigation should enable someone to:\n- Understand what the feature does (user perspective)\n- Know which files to look at\n- Understand the data flow\n- See real usage examples\n- Know about edge cases or important details`;\n\nexport interface DetectiveOptions {\n projectRoot: string;\n verbose?: boolean;\n maxIterations?: number;\n maxToolCalls?: number;\n onToolCall?: (toolName: string, args: unknown) => void;\n onToolResult?: (toolName: string, result: ToolResult) => void;\n onThinking?: (thought: string) => void;\n}\n\nexport interface InvestigationResult {\n success: boolean;\n title?: string;\n summary?: string;\n entryPoints?: Array<{ file: string; component: string; description: string }>;\n dataFlow?: Array<{ step: number; description: string; files: string[] }>;\n keyFiles?: Array<{ path: string; purpose: string; keyExports: string[] }>;\n dataStructures?: Array<{\n name: string;\n file: string;\n fields: string[];\n description: string;\n }>;\n usageExamples?: Array<{ description: string; file: string; codeSnippet: string }>;\n relatedFeatures?: string[];\n technicalNotes?: string[];\n error?: string;\n toolCalls?: number;\n}\n\n/**\n * The Detective Agent - explores a codebase to understand a feature\n */\nexport class DetectiveAgent {\n private openai: OpenAI;\n private context: ToolContext;\n private options: DetectiveOptions;\n private messages: ChatCompletionMessageParam[];\n private toolCallCount: number = 0;\n\n constructor(options: DetectiveOptions) {\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"Missing OPENAI_API_KEY environment variable.\\n\" +\n \"Set it to use the Detective agent for code exploration.\"\n );\n }\n\n this.openai = new OpenAI({ apiKey });\n this.context = { projectRoot: options.projectRoot };\n this.options = {\n maxIterations: 25,\n maxToolCalls: 18,\n ...options,\n };\n this.messages = [{ role: \"system\", content: SYSTEM_PROMPT }];\n }\n\n /**\n * Run an investigation based on a user query\n */\n async investigate(query: string): Promise<InvestigationResult> {\n // Add the user's query\n this.messages.push({\n role: \"user\",\n content: `Investigate the following topic in the codebase:\\n\\n\"${query}\"\\n\\nUse the available tools to explore the codebase, understand the feature, and then call complete_investigation with your findings.`,\n });\n\n let iterations = 0;\n const maxIterations = this.options.maxIterations!;\n const maxToolCalls = this.options.maxToolCalls!;\n\n while (iterations < maxIterations) {\n iterations++;\n\n try {\n const shouldForceCompletion =\n this.toolCallCount >= maxToolCalls || iterations === maxIterations;\n\n if (shouldForceCompletion) {\n this.messages.push({\n role: \"user\",\n content:\n \"Finalize the investigation now using ONLY the information already gathered. \" +\n \"Do not call any tools except complete_investigation. \" +\n \"Use empty arrays for any section you could not verify.\",\n });\n }\n\n const tools = shouldForceCompletion\n ? AGENT_TOOLS.filter((tool) => tool.function.name === \"complete_investigation\")\n : AGENT_TOOLS;\n\n const response = await this.openai.chat.completions.create({\n model: \"gpt-5.2\",\n messages: this.messages,\n tools,\n tool_choice: shouldForceCompletion ? \"required\" : \"auto\",\n temperature: 0.1,\n });\n\n const message = response.choices[0].message;\n\n // Add assistant message to history\n this.messages.push(message);\n\n // If there's thinking/content, log it\n if (message.content && this.options.onThinking) {\n this.options.onThinking(message.content);\n }\n\n let toolCalls = message.tool_calls;\n\n // Check if we're done (no tool calls)\n if (!toolCalls || toolCalls.length === 0) {\n if (!shouldForceCompletion) {\n // Try one last time to force a completion with existing context\n this.messages.push({\n role: \"user\",\n content:\n \"Complete the investigation now using the current context. \" +\n \"Call complete_investigation with best-effort details and empty arrays where needed.\",\n });\n\n const forced = await this.openai.chat.completions.create({\n model: \"gpt-5.2\",\n messages: this.messages,\n tools: AGENT_TOOLS.filter((tool) => tool.function.name === \"complete_investigation\"),\n tool_choice: \"required\",\n temperature: 0.1,\n });\n\n const forcedMessage = forced.choices[0].message;\n this.messages.push(forcedMessage);\n\n if (forcedMessage.tool_calls && forcedMessage.tool_calls.length > 0) {\n // Handle forced completion tool calls below\n toolCalls = forcedMessage.tool_calls;\n } else {\n return {\n success: false,\n error: forcedMessage.content\n ? `Agent finished without tool calls: ${forcedMessage.content}`\n : \"Agent finished without completing investigation\",\n toolCalls: this.toolCallCount,\n };\n }\n } else {\n return {\n success: false,\n error: message.content\n ? `Agent finished without tool calls: ${message.content}`\n : \"Agent finished without completing investigation\",\n toolCalls: this.toolCallCount,\n };\n }\n }\n\n // Process tool calls\n const toolResults: ChatCompletionToolMessageParam[] = [];\n\n for (const toolCall of toolCalls ?? []) {\n const toolName = toolCall.function.name as ToolName;\n let args: Record<string, unknown>;\n\n try {\n args = JSON.parse(toolCall.function.arguments);\n } catch {\n args = {};\n }\n\n this.toolCallCount++;\n\n // Notify about tool call\n if (this.options.onToolCall) {\n this.options.onToolCall(toolName, args);\n }\n\n // Check if this is the completion tool\n if (toolName === \"complete_investigation\") {\n if (this.options.onToolResult) {\n this.options.onToolResult(toolName, { success: true, data: args });\n }\n\n return {\n success: true,\n title: args.title as string,\n summary: args.summary as string,\n entryPoints: args.entryPoints as InvestigationResult[\"entryPoints\"],\n dataFlow: args.dataFlow as InvestigationResult[\"dataFlow\"],\n keyFiles: args.keyFiles as InvestigationResult[\"keyFiles\"],\n dataStructures: args.dataStructures as InvestigationResult[\"dataStructures\"],\n usageExamples: args.usageExamples as InvestigationResult[\"usageExamples\"],\n relatedFeatures: args.relatedFeatures as string[],\n technicalNotes: args.technicalNotes as string[],\n toolCalls: this.toolCallCount,\n };\n }\n\n // Execute the tool\n const result = await executeTool(toolName, args, this.context);\n\n // Notify about result\n if (this.options.onToolResult) {\n this.options.onToolResult(toolName, result);\n }\n\n toolResults.push({\n role: \"tool\",\n tool_call_id: toolCall.id,\n content: JSON.stringify(result),\n });\n }\n\n // Add all tool results to messages\n this.messages.push(...toolResults);\n } catch (error) {\n return {\n success: false,\n error: `Agent error: ${error instanceof Error ? error.message : error}`,\n toolCalls: this.toolCallCount,\n };\n }\n }\n\n return {\n success: false,\n error: `Investigation exceeded maximum iterations (${maxIterations})`,\n toolCalls: this.toolCallCount,\n };\n }\n}\n\n/**\n * Create and run a detective investigation\n */\nexport async function investigateFeature(\n query: string,\n options: Omit<DetectiveOptions, \"projectRoot\"> & { projectRoot?: string }\n): Promise<InvestigationResult> {\n const projectRoot = options.projectRoot || getProjectRoot();\n\n const agent = new DetectiveAgent({\n ...options,\n projectRoot,\n });\n\n return agent.investigate(query);\n}\n\n/**\n * Get the project root directory\n */\nfunction getProjectRoot(): string {\n try {\n const { execSync } = require(\"child_process\");\n return execSync(\"git rev-parse --show-toplevel\", { encoding: \"utf-8\" }).trim();\n } catch {\n return process.cwd();\n }\n}\n","/**\n * Visible API Client\n *\n * HTTP client for generating artifacts via the Visible API.\n */\n\nimport type { ArtifactSource, ArtifactContext } from \"../shared/types.js\";\n\nexport interface ArtifactPayload {\n title: string;\n description: string;\n source: ArtifactSource;\n context: ArtifactContext;\n guidelines: string[];\n}\n\nexport interface ArtifactResponse {\n link: string;\n}\n\n/**\n * Get required environment variables\n */\nfunction getConfig(): { baseUrl: string; apiKey?: string } {\n const baseUrl = (process.env.VISIBLE_API_BASE_URL || \"http://localhost:3000/api\").replace(\n /\\/$/,\n \"\"\n );\n const apiKey = process.env.VISIBLE_API_KEY;\n\n if (!apiKey && !isLocalApi(baseUrl)) {\n throw new Error(\n \"Missing VISIBLE_API_KEY environment variable.\\n\" +\n \"Get your API key from the Visible dashboard.\"\n );\n }\n\n return { baseUrl, apiKey };\n}\n\nfunction isLocalApi(baseUrl: string): boolean {\n return (\n baseUrl.includes(\"localhost\") ||\n baseUrl.includes(\"127.0.0.1\") ||\n baseUrl.includes(\"0.0.0.0\")\n );\n}\n\n/**\n * Generate an artifact via the Visible API\n */\nfunction buildRawChangelog(payload: ArtifactPayload): string {\n const details = payload.context.technicalDetails || [];\n const lines = [\n payload.description,\n details.length > 0 ? \"\" : undefined,\n details.length > 0 ? \"Technical details:\" : undefined,\n ...details.map((detail) => `- ${detail}`),\n ].filter((line): line is string => typeof line === \"string\" && line.length > 0);\n\n return lines.join(\"\\n\");\n}\n\nexport async function postArtifact(payload: ArtifactPayload): Promise<ArtifactResponse> {\n const { baseUrl, apiKey } = getConfig();\n const apiBase = baseUrl.endsWith(\"/api\") ? baseUrl : `${baseUrl}/api`;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(`${apiBase}/generate`, {\n method: \"POST\",\n headers: {\n ...headers,\n },\n body: JSON.stringify({\n title: payload.title,\n raw_changelog: buildRawChangelog(payload),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage = `API request failed with status ${response.status}`;\n\n try {\n const errorJson = JSON.parse(errorText);\n if (errorJson.message) {\n errorMessage = errorJson.message;\n } else if (errorJson.error) {\n errorMessage = errorJson.error;\n }\n } catch {\n if (errorText) {\n errorMessage = errorText;\n }\n }\n\n throw new Error(errorMessage);\n }\n\n const data = (await response.json()) as { link?: string };\n\n if (!data.link) {\n throw new Error(\"Invalid API response: missing link\");\n }\n\n return {\n link: data.link,\n };\n}\n\n/**\n * Check if the API is configured (env vars are set)\n */\nexport function isApiConfigured(): boolean {\n const baseUrl = process.env.VISIBLE_API_BASE_URL || \"http://localhost:3000/api\";\n const apiKey = process.env.VISIBLE_API_KEY;\n\n return isLocalApi(baseUrl) ? true : !!apiKey;\n}\n","/**\n * Video Generation Types\n *\n * Types for video generation from artifacts.\n */\n\nimport type { ArtifactPayload } from \"../api/client.js\";\n\n/**\n * Code snippet with metadata for display in videos\n */\nexport interface CodeSnippet {\n /** File path */\n file: string;\n /** Code content */\n code: string;\n /** Starting line number (optional) */\n startLine?: number;\n /** Language for syntax highlighting */\n language?: string;\n /** Description of what this code shows */\n description?: string;\n /** Whether this is an addition (green), deletion (red), or neutral */\n changeType?: \"added\" | \"deleted\" | \"modified\" | \"context\";\n}\n\n/**\n * Enhanced artifact payload with code content for video generation\n */\nexport interface VideoArtifactPayload extends ArtifactPayload {\n /** Relevant code snippets extracted from the analysis */\n codeSnippets?: CodeSnippet[];\n /** Full diff content (for diff-based analysis) */\n diffContent?: string;\n /** UI components identified (for potential screenshot/mock generation) */\n uiComponents?: Array<{\n name: string;\n file: string;\n props?: Record<string, unknown>;\n }>;\n}\n\n/**\n * Configuration for video generation\n */\nexport interface VideoConfig {\n /** Output directory for the video */\n outputDir: string;\n /** Output filename (without extension) */\n filename?: string;\n /** Video format */\n format?: \"mp4\" | \"webm\";\n /** Video resolution */\n resolution?: VideoResolution;\n /** Frames per second */\n fps?: number;\n /** Whether to generate a poster image */\n generatePoster?: boolean;\n}\n\n/**\n * Video resolution preset\n */\nexport interface VideoResolution {\n width: number;\n height: number;\n}\n\n/**\n * Common resolution presets\n */\nexport const RESOLUTIONS = {\n \"1080p\": { width: 1920, height: 1080 },\n \"720p\": { width: 1280, height: 720 },\n \"480p\": { width: 854, height: 480 },\n square: { width: 1080, height: 1080 },\n vertical: { width: 1080, height: 1920 },\n} as const;\n\n/**\n * Scene types for the video\n */\nexport type SceneType = \"title\" | \"overview\" | \"walkthrough\" | \"code\" | \"code-highlight\" | \"diff\" | \"ui\" | \"outro\";\n\n/**\n * A single scene in the video storyboard\n */\nexport interface VideoScene {\n /** Unique scene identifier */\n id: string;\n /** Type of scene */\n type: SceneType;\n /** Scene title/heading */\n title: string;\n /** Main content/description */\n content: string;\n /** Duration in frames (at 30fps, 30 frames = 1 second) */\n durationInFrames: number;\n /** Additional props for the scene */\n props?: Record<string, unknown>;\n}\n\n/**\n * Complete storyboard for video generation\n */\nexport interface VideoStoryboard {\n /** Video title */\n title: string;\n /** Total duration in frames */\n totalDurationInFrames: number;\n /** List of scenes */\n scenes: VideoScene[];\n /** Source artifact data */\n artifact: ArtifactPayload;\n /** Design tokens for styling */\n theme: VideoTheme;\n}\n\n/**\n * Theme/design tokens for video styling\n */\nexport interface VideoTheme {\n /** Primary brand color */\n primaryColor: string;\n /** Background color */\n backgroundColor: string;\n /** Foreground/text color */\n foregroundColor: string;\n /** Accent color */\n accentColor: string;\n /** Muted text color */\n mutedColor: string;\n /** Card background color */\n cardColor: string;\n /** Border color */\n borderColor: string;\n /** Font family */\n fontFamily: string;\n}\n\n/**\n * Default dark theme matching the dashboard design\n */\nexport const DEFAULT_THEME: VideoTheme = {\n primaryColor: \"#10B981\", // Green accent\n backgroundColor: \"#0A0A0B\", // Dark background\n foregroundColor: \"#FAFAFA\", // Light text\n accentColor: \"#10B981\", // Green accent\n mutedColor: \"#A1A1A6\", // Secondary text\n cardColor: \"#141415\", // Card background\n borderColor: \"#1C1C1E\", // Border\n fontFamily: \"Inter, system-ui, sans-serif\",\n};\n\n/**\n * Result of video generation\n */\nexport interface VideoGenerationResult {\n /** Whether generation succeeded */\n success: boolean;\n /** Path to the generated video */\n videoPath?: string;\n /** Path to the poster image (if generated) */\n posterPath?: string;\n /** Error message if failed */\n error?: string;\n /** Generation duration in ms */\n durationMs?: number;\n}\n\n/**\n * Input for generating a video from an artifact\n */\nexport interface GenerateVideoInput {\n /** The artifact payload (can be enhanced with code content) */\n artifact: ArtifactPayload | VideoArtifactPayload;\n /** List of affected files (from analysis) */\n files?: string[];\n /** Code snippets to display in the video */\n codeSnippets?: CodeSnippet[];\n /** Video configuration */\n config: VideoConfig;\n /** Optional custom theme */\n theme?: Partial<VideoTheme>;\n /** Verbose logging */\n verbose?: boolean;\n}\n","/**\n * Storyboard Generator\n *\n * Converts artifact data into a video storyboard with scenes.\n */\n\nimport type { ArtifactPayload } from \"../api/client.js\";\nimport type { VideoScene, VideoStoryboard, VideoTheme, CodeSnippet, VideoArtifactPayload } from \"./types.js\";\nimport { DEFAULT_THEME } from \"./types.js\";\n\n/**\n * Generated UI scene data (from ui-generator)\n */\nexport interface UISceneData {\n id: string;\n componentName: string;\n description: string;\n jsx: string;\n mockData: Record<string, unknown>;\n pattern: string;\n durationInFrames: number;\n}\n\n/**\n * Input for storyboard generation\n */\nexport interface StoryboardInput {\n artifact: ArtifactPayload | VideoArtifactPayload;\n codeSnippets?: CodeSnippet[];\n uiScenes?: UISceneData[];\n theme?: Partial<VideoTheme>;\n}\n\n/** Frames per second (standard) */\nconst FPS = 30;\n\n/** Default scene durations in seconds */\nconst DURATIONS = {\n title: 4,\n overview: 6,\n walkthrough: 8,\n code: 6,\n outro: 4,\n};\n\n/**\n * Generate a storyboard from an artifact\n */\nexport function generateStoryboard(\n artifact: ArtifactPayload | VideoArtifactPayload,\n theme: Partial<VideoTheme> = {},\n codeSnippets?: CodeSnippet[],\n uiScenes?: UISceneData[]\n): VideoStoryboard {\n const mergedTheme = { ...DEFAULT_THEME, ...theme };\n const scenes: VideoScene[] = [];\n\n // Get code snippets from input or from enhanced artifact\n const snippets = codeSnippets || (artifact as VideoArtifactPayload).codeSnippets || [];\n\n // Scene 1: Title card\n scenes.push(createTitleScene(artifact));\n\n // Scene 2: Overview/Summary\n scenes.push(createOverviewScene(artifact));\n\n // Scene 3-N: UI mockup scenes (if we have generated UI)\n if (uiScenes && uiScenes.length > 0) {\n const uiVideoScenes = createUIScenes(uiScenes);\n scenes.push(...uiVideoScenes);\n }\n\n // Scene N+1: Walkthrough scenes based on technical details\n const walkthroughScenes = createWalkthroughScenes(artifact);\n scenes.push(...walkthroughScenes);\n\n // Scene N+2: Code highlight scenes (if we have actual code snippets)\n if (snippets.length > 0) {\n const codeHighlightScenes = createCodeHighlightScenes(snippets);\n scenes.push(...codeHighlightScenes);\n }\n\n // Scene N+3: File list (if affected components exist)\n if (artifact.context.affectedComponents.length > 0) {\n scenes.push(createCodeScene(artifact));\n }\n\n // Final scene: Outro/CTA\n scenes.push(createOutroScene(artifact));\n\n const totalDurationInFrames = scenes.reduce((sum, s) => sum + s.durationInFrames, 0);\n\n // Store snippets in the artifact for the video renderer\n const enhancedArtifact: VideoArtifactPayload = {\n ...artifact,\n codeSnippets: snippets,\n };\n\n return {\n title: artifact.title,\n totalDurationInFrames,\n scenes,\n artifact: enhancedArtifact,\n theme: mergedTheme,\n };\n}\n\n/**\n * Create UI mockup scenes from generated UI data\n */\nfunction createUIScenes(uiScenes: UISceneData[]): VideoScene[] {\n return uiScenes.map((ui, index) => ({\n id: ui.id || `ui-${index}`,\n type: \"ui\" as const,\n title: ui.componentName,\n content: ui.description,\n durationInFrames: ui.durationInFrames || 6 * FPS,\n props: {\n componentName: ui.componentName,\n jsx: ui.jsx,\n mockData: ui.mockData,\n pattern: ui.pattern,\n },\n }));\n}\n\n/**\n * Create the title scene\n */\nfunction createTitleScene(artifact: ArtifactPayload): VideoScene {\n return {\n id: \"title\",\n type: \"title\",\n title: artifact.title,\n content: artifact.description,\n durationInFrames: DURATIONS.title * FPS,\n props: {\n source: artifact.source,\n keywords: artifact.context.keywords.slice(0, 5),\n },\n };\n}\n\n/**\n * Create the overview scene\n */\nfunction createOverviewScene(artifact: ArtifactPayload): VideoScene {\n return {\n id: \"overview\",\n type: \"overview\",\n title: \"What Changed\",\n content: artifact.context.summary,\n durationInFrames: DURATIONS.overview * FPS,\n props: {\n breakingChanges: artifact.context.breakingChanges,\n componentCount: artifact.context.affectedComponents.length,\n },\n };\n}\n\n/**\n * Create walkthrough scenes from technical details\n */\nfunction createWalkthroughScenes(artifact: ArtifactPayload): VideoScene[] {\n const scenes: VideoScene[] = [];\n const details = artifact.context.technicalDetails;\n\n // Group details into scenes (max 3 details per scene)\n const chunks = chunkArray(details, 3);\n\n chunks.forEach((chunk, index) => {\n scenes.push({\n id: `walkthrough-${index + 1}`,\n type: \"walkthrough\",\n title: index === 0 ? \"How It Works\" : `Details (${index + 1})`,\n content: chunk.join(\"\\n\\n\"),\n durationInFrames: DURATIONS.walkthrough * FPS,\n props: {\n steps: chunk,\n stepIndex: index,\n },\n });\n });\n\n // Ensure at least one walkthrough scene\n if (scenes.length === 0) {\n scenes.push({\n id: \"walkthrough-1\",\n type: \"walkthrough\",\n title: \"How It Works\",\n content: artifact.context.summary,\n durationInFrames: DURATIONS.walkthrough * FPS,\n props: {\n steps: [artifact.context.summary],\n stepIndex: 0,\n },\n });\n }\n\n return scenes;\n}\n\n/**\n * Create code highlight scenes from code snippets\n */\nfunction createCodeHighlightScenes(snippets: CodeSnippet[]): VideoScene[] {\n const scenes: VideoScene[] = [];\n \n // Group snippets by file or show individually (max 3 scenes)\n const displaySnippets = snippets.slice(0, 6);\n const chunkedSnippets = chunkArray(displaySnippets, 2);\n\n chunkedSnippets.forEach((chunk, index) => {\n scenes.push({\n id: `code-highlight-${index + 1}`,\n type: \"code-highlight\",\n title: index === 0 ? \"Code Changes\" : `More Changes (${index + 1})`,\n content: chunk.map(s => s.description || s.file).join(\", \"),\n durationInFrames: DURATIONS.code * FPS,\n props: {\n snippets: chunk.map(s => ({\n file: s.file,\n code: s.code,\n language: s.language || detectLanguage(s.file),\n description: s.description,\n changeType: s.changeType,\n startLine: s.startLine,\n })),\n },\n });\n });\n\n return scenes;\n}\n\n/**\n * Detect language from file extension\n */\nfunction detectLanguage(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase() || \"\";\n const langMap: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"typescript\",\n js: \"javascript\",\n jsx: \"javascript\",\n vue: \"vue\",\n py: \"python\",\n rb: \"ruby\",\n go: \"go\",\n rs: \"rust\",\n java: \"java\",\n css: \"css\",\n scss: \"scss\",\n html: \"html\",\n json: \"json\",\n md: \"markdown\",\n yaml: \"yaml\",\n yml: \"yaml\",\n };\n return langMap[ext] || \"text\";\n}\n\n/**\n * Create a code/files scene\n */\nfunction createCodeScene(artifact: ArtifactPayload | VideoArtifactPayload): VideoScene {\n const components = artifact.context.affectedComponents;\n const displayComponents = components.slice(0, 8);\n\n return {\n id: \"code\",\n type: \"code\",\n title: \"Files Changed\",\n content: `${components.length} file${components.length !== 1 ? \"s\" : \"\"} affected`,\n durationInFrames: DURATIONS.code * FPS,\n props: {\n files: displayComponents,\n totalFiles: components.length,\n hasMore: components.length > 8,\n },\n };\n}\n\n/**\n * Create the outro scene\n */\nfunction createOutroScene(artifact: ArtifactPayload): VideoScene {\n // Pick a guideline for the CTA if available\n const cta = artifact.guidelines[0] || \"Learn more about this feature\";\n\n return {\n id: \"outro\",\n type: \"outro\",\n title: \"Summary\",\n content: cta,\n durationInFrames: DURATIONS.outro * FPS,\n props: {\n guidelines: artifact.guidelines.slice(0, 3),\n source: artifact.source,\n },\n };\n}\n\n/**\n * Chunk an array into smaller arrays\n */\nfunction chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Calculate total video duration in seconds\n */\nexport function getVideoDurationSeconds(storyboard: VideoStoryboard): number {\n return storyboard.totalDurationInFrames / FPS;\n}\n\n/**\n * Format duration as MM:SS\n */\nexport function formatDuration(seconds: number): string {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, \"0\")}`;\n}\n","/**\n * Video Renderer\n *\n * Renders video using Remotion. Everything is self-contained in the CLI.\n */\n\nimport { writeFileSync, mkdirSync, existsSync } from \"fs\";\nimport { join, resolve, dirname } from \"path\";\nimport { fileURLToPath, pathToFileURL } from \"url\";\nimport type {\n VideoConfig,\n VideoGenerationResult,\n GenerateVideoInput,\n} from \"./types.js\";\nimport { DEFAULT_THEME, RESOLUTIONS } from \"./types.js\";\nimport { generateStoryboard, getVideoDurationSeconds, formatDuration } from \"./storyboard.js\";\n\n// Get directory of current module for resolving relative imports\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n/**\n * Generate a video from an artifact\n *\n * This function:\n * 1. Creates a storyboard from the artifact\n * 2. Writes the storyboard to a JSON file\n * 3. Attempts to render with Remotion if available\n * 4. Falls back to outputting props for manual rendering\n */\nexport async function generateVideo(input: GenerateVideoInput): Promise<VideoGenerationResult> {\n const startTime = Date.now();\n\n try {\n const { artifact, codeSnippets, config, theme = {}, verbose } = input;\n\n // Merge theme with defaults\n const mergedTheme = { ...DEFAULT_THEME, ...theme };\n\n // Generate storyboard with code snippets\n const storyboard = generateStoryboard(artifact, mergedTheme, codeSnippets);\n\n if (verbose) {\n console.log(`\\nStoryboard generated:`);\n console.log(` - Scenes: ${storyboard.scenes.length}`);\n console.log(` - Duration: ${formatDuration(getVideoDurationSeconds(storyboard))}`);\n }\n\n // Ensure output directory exists\n const outputDir = resolve(config.outputDir);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Write storyboard JSON\n const storyboardPath = join(outputDir, \"storyboard.json\");\n writeFileSync(storyboardPath, JSON.stringify(storyboard, null, 2));\n\n if (verbose) {\n console.log(` - Storyboard saved: ${storyboardPath}`);\n }\n\n // Write video props for Remotion composition\n const propsPath = join(outputDir, \"video-props.json\");\n const videoProps = {\n storyboard,\n resolution: config.resolution || RESOLUTIONS[\"1080p\"],\n fps: config.fps || 30,\n };\n writeFileSync(propsPath, JSON.stringify(videoProps, null, 2));\n\n if (verbose) {\n console.log(` - Props saved: ${propsPath}`);\n }\n\n // Determine output path\n const filename = config.filename || \"video\";\n const format = config.format || \"mp4\";\n const videoPath = join(outputDir, `${filename}.${format}`);\n\n // Try to render with bundled Remotion\n const renderResult = await tryRenderWithRemotion({\n storyboard,\n outputPath: videoPath,\n config,\n verbose,\n });\n\n if (renderResult.success) {\n return {\n success: true,\n videoPath: renderResult.videoPath,\n posterPath: renderResult.posterPath,\n durationMs: Date.now() - startTime,\n };\n }\n\n // Remotion not available - return props path for manual rendering\n const durationMs = Date.now() - startTime;\n\n return {\n success: true,\n videoPath: propsPath,\n durationMs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n };\n }\n}\n\ninterface RenderOptions {\n storyboard: ReturnType<typeof generateStoryboard>;\n outputPath: string;\n config: VideoConfig;\n verbose?: boolean;\n}\n\ninterface RenderResult {\n success: boolean;\n videoPath?: string;\n posterPath?: string;\n error?: string;\n}\n\n/**\n * Attempt to render with bundled Remotion\n */\nasync function tryRenderWithRemotion(options: RenderOptions): Promise<RenderResult> {\n const { storyboard, outputPath, config, verbose } = options;\n\n // Check if Remotion is available\n const remotionAvailable = await isRemotionAvailable();\n if (!remotionAvailable) {\n if (verbose) {\n console.log(\"\\n ⚠️ Remotion dependencies not installed.\");\n console.log(\" To enable automatic video rendering, install Remotion in the CLI:\");\n console.log(\"\");\n console.log(\" cd $(npm root -g)/@makeitvisible/cli && npm install\");\n console.log(\"\");\n console.log(\" Or install locally:\");\n console.log(\" npm install @remotion/bundler @remotion/renderer @remotion/cli remotion react react-dom\");\n console.log(\"\");\n console.log(\" For now, you can render manually with the generated video-props.json\");\n }\n return { success: false, error: \"Remotion not available\" };\n }\n\n try {\n // Dynamic import to avoid errors when Remotion isn't installed\n // Use absolute path based on this module's location\n const renderPath = pathToFileURL(join(__dirname, \"remotion\", \"render.js\")).href;\n const { renderVideo } = await import(/* @vite-ignore */ renderPath);\n\n // Map resolution to preset name\n const resolution = config.resolution || RESOLUTIONS[\"1080p\"];\n let resolutionKey: \"1080p\" | \"720p\" | \"480p\" | \"square\" | \"vertical\" = \"1080p\";\n\n if (resolution.width === RESOLUTIONS[\"720p\"].width) {\n resolutionKey = \"720p\";\n } else if (resolution.width === RESOLUTIONS.square.width && resolution.height === RESOLUTIONS.square.height) {\n resolutionKey = \"square\";\n } else if (resolution.width === RESOLUTIONS.vertical.width && resolution.height === RESOLUTIONS.vertical.height) {\n resolutionKey = \"vertical\";\n }\n\n if (verbose) {\n console.log(`\\n Rendering video with Remotion...`);\n console.log(` Resolution: ${resolution.width}x${resolution.height}`);\n }\n\n const result = await renderVideo({\n storyboard,\n outputPath,\n resolution: resolutionKey,\n codec: \"h264\",\n verbose,\n onProgress: (progress: number) => {\n if (verbose) {\n process.stdout.write(`\\r Rendering: ${Math.round(progress * 100)}%`);\n }\n },\n });\n\n if (verbose && result.success) {\n console.log(\"\\n\");\n }\n\n return result;\n } catch (error) {\n if (verbose) {\n console.log(`\\n Remotion render failed: ${error instanceof Error ? error.message : error}`);\n }\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Check if Remotion is available for rendering\n */\nexport async function isRemotionAvailable(): Promise<boolean> {\n try {\n // Use dynamic imports for ESM compatibility\n await import(\"@remotion/bundler\");\n await import(\"@remotion/renderer\");\n await import(\"remotion\");\n return true;\n } catch (error) {\n // Log error for debugging\n if (process.env.DEBUG_REMOTION) {\n console.error(\"Remotion availability check failed:\", error);\n }\n return false;\n }\n}\n","/**\n * Analyze Command\n *\n * Analyzes code, PRs, and repositories to extract context and create artifacts.\n *\n * Usage:\n * visible analyze diff [range] # Analyze git diff (default: HEAD~1..HEAD)\n * visible analyze pr --url <url> # Analyze a pull request\n * visible analyze prompt \"...\" # Explore codebase with AI agent\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\nimport type { ArtifactSource, ArtifactContext } from \"../shared/types.js\";\nimport { analyzeDiff } from \"../analyzers/git/index.js\";\nimport { analyzePR } from \"../analyzers/git/index.js\";\nimport { investigateFeature, type InvestigationResult } from \"../agent/detective.js\";\nimport { postArtifact, type ArtifactPayload } from \"../api/client.js\";\nimport {\n generateVideo,\n type VideoConfig,\n type CodeSnippet,\n RESOLUTIONS,\n formatDuration,\n getVideoDurationSeconds,\n generateStoryboard,\n} from \"../video/index.js\";\n\nexport const analyzeCommand = new Command(\"analyze\")\n .description(\"Analyze code changes and create artifacts\")\n .addCommand(createDiffCommand())\n .addCommand(createPRCommand())\n .addCommand(createPromptCommand());\n\nfunction createDiffCommand(): Command {\n return new Command(\"diff\")\n .description(\"Analyze git diff between commits\")\n .argument(\"[range]\", \"Git commit range (e.g., HEAD~1..HEAD)\", \"HEAD~1..HEAD\")\n .option(\"--no-post\", \"Skip posting artifact to API\")\n .option(\"--video [output]\", \"Generate video from artifact (optional: output directory)\")\n .option(\"--video-format <format>\", \"Video format: mp4 or webm\", \"mp4\")\n .option(\"--video-resolution <res>\", \"Resolution: 1080p, 720p, 480p, square, vertical\", \"1080p\")\n .action(async (range: string, options: { post: boolean; video?: boolean | string; videoFormat?: string; videoResolution?: string }) => {\n const spinner = ora(\"Analyzing diff...\").start();\n\n try {\n const result = await analyzeDiff(range);\n\n spinner.succeed(\"Diff analyzed successfully\");\n\n console.log(chalk.bold(\"\\nArtifact Summary:\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log(chalk.cyan(\"Title:\"), result.title);\n console.log(chalk.cyan(\"Description:\"), result.description);\n console.log(chalk.cyan(\"Files changed:\"), result.context.affectedComponents.length);\n console.log(chalk.cyan(\"Breaking changes:\"), result.context.breakingChanges ? \"Yes\" : \"No\");\n\n // Generate video if requested\n if (options.video !== undefined) {\n // Use code snippets from the analysis result\n const snippets: CodeSnippet[] = (result.codeSnippets || []).map((s) => ({\n file: s.file,\n code: s.code,\n startLine: s.startLine,\n language: s.language,\n description: s.description,\n changeType: s.changeType,\n }));\n await handleVideoGeneration(result, options, spinner, snippets);\n }\n\n if (options.post) {\n spinner.start(\"Posting artifact to Visible API...\");\n const response = await postArtifact(result);\n spinner.succeed(\"Artifact posted successfully\");\n console.log(chalk.green(\"\\n✓ Artifact created:\"), response.link);\n } else {\n console.log(chalk.yellow(\"\\nSkipped posting to API (--no-post)\"));\n console.log(chalk.dim(\"Artifact payload:\"));\n console.log(JSON.stringify(result, null, 2));\n }\n } catch (error) {\n spinner.fail(\"Failed to analyze diff\");\n console.error(chalk.red(\"Error:\"), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n}\n\nfunction createPRCommand(): Command {\n return new Command(\"pr\")\n .description(\"Analyze a pull request\")\n .option(\"--url <url>\", \"Pull request URL (e.g., https://github.com/owner/repo/pull/123)\")\n .option(\"--number <number>\", \"Pull request number (uses current repo)\")\n .option(\"--no-post\", \"Skip posting artifact to API\")\n .option(\"--video [output]\", \"Generate video from artifact (optional: output directory)\")\n .option(\"--video-format <format>\", \"Video format: mp4 or webm\", \"mp4\")\n .option(\"--video-resolution <res>\", \"Resolution: 1080p, 720p, 480p, square, vertical\", \"1080p\")\n .action(async (options: { url?: string; number?: string; post: boolean; video?: boolean | string; videoFormat?: string; videoResolution?: string }) => {\n const spinner = ora(\"Analyzing pull request...\").start();\n\n try {\n if (!options.url && !options.number) {\n spinner.fail(\"Missing required option\");\n console.error(chalk.red(\"Error:\"), \"Either --url or --number is required\");\n process.exit(1);\n }\n\n const result = await analyzePR({\n url: options.url,\n number: options.number ? parseInt(options.number, 10) : undefined,\n });\n\n spinner.succeed(\"Pull request analyzed successfully\");\n\n console.log(chalk.bold(\"\\nArtifact Summary:\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log(chalk.cyan(\"Title:\"), result.title);\n console.log(chalk.cyan(\"Description:\"), result.description);\n console.log(chalk.cyan(\"Files changed:\"), result.context.affectedComponents.length);\n console.log(chalk.cyan(\"Breaking changes:\"), result.context.breakingChanges ? \"Yes\" : \"No\");\n\n // Generate video if requested\n if (options.video !== undefined) {\n // Use code snippets from the PR analysis result\n const snippets: CodeSnippet[] = (result.codeSnippets || []).map((s) => ({\n file: s.file,\n code: s.code,\n startLine: s.startLine,\n language: s.language,\n description: s.description,\n changeType: s.changeType,\n }));\n await handleVideoGeneration(result, options, spinner, snippets);\n }\n\n if (options.post) {\n spinner.start(\"Posting artifact to Visible API...\");\n const response = await postArtifact(result);\n spinner.succeed(\"Artifact posted successfully\");\n console.log(chalk.green(\"\\n✓ Artifact created:\"), response.link);\n } else {\n console.log(chalk.yellow(\"\\nSkipped posting to API (--no-post)\"));\n console.log(chalk.dim(\"Artifact payload:\"));\n console.log(JSON.stringify(result, null, 2));\n }\n } catch (error) {\n spinner.fail(\"Failed to analyze pull request\");\n console.error(chalk.red(\"Error:\"), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n}\n\nfunction createPromptCommand(): Command {\n return new Command(\"prompt\")\n .description(\"Explore codebase with an AI agent\")\n .argument(\"<query>\", \"Natural language prompt describing what to analyze\")\n .option(\"--no-post\", \"Skip posting artifact to API\")\n .option(\"-v, --verbose\", \"Show detailed agent activity\")\n .option(\"--video [output]\", \"Generate video from artifact (optional: output directory)\")\n .option(\"--video-format <format>\", \"Video format: mp4 or webm\", \"mp4\")\n .option(\"--video-resolution <res>\", \"Resolution: 1080p, 720p, 480p, square, vertical\", \"1080p\")\n .action(async (query: string, options: { post: boolean; verbose?: boolean; video?: boolean | string; videoFormat?: string; videoResolution?: string }) => {\n console.log(chalk.bold(\"\\n🔍 The Detective is investigating... (hot)\\n\"));\n console.log(chalk.dim(`Query: \"${query}\"\\n`));\n\n const asArray = <T>(value?: T[]): T[] => (Array.isArray(value) ? value : []);\n\n let spinner: Ora | null = null;\n let toolCount = 0;\n\n try {\n const investigation = await investigateFeature(query, {\n verbose: options.verbose,\n onToolCall: (toolName, args) => {\n toolCount++;\n\n if (options.verbose) {\n if (spinner) spinner.stop();\n console.log(chalk.blue(`\\n[${toolCount}] ${toolName}`));\n console.log(chalk.dim(JSON.stringify(args, null, 2)));\n spinner = ora(`Running ${toolName}...`).start();\n } else {\n if (spinner) {\n spinner.text = `Investigating... (${toolCount} tool calls) - ${toolName}`;\n } else {\n spinner = ora(`Investigating... (${toolCount} tool calls) - ${toolName}`).start();\n }\n }\n },\n onToolResult: (toolName, result) => {\n if (options.verbose && spinner) {\n if (result.success) {\n spinner.succeed(`${toolName} completed`);\n const dataStr = JSON.stringify(result.data, null, 2);\n if (dataStr.length > 500) {\n console.log(chalk.dim(dataStr.slice(0, 500) + \"\\n...\"));\n } else {\n console.log(chalk.dim(dataStr));\n }\n } else {\n spinner.fail(`${toolName} failed: ${result.error}`);\n }\n spinner = null;\n }\n },\n onThinking: (thought) => {\n if (options.verbose) {\n console.log(chalk.yellow(\"\\n💭 Agent thinking:\"));\n console.log(chalk.dim(thought));\n }\n },\n });\n\n // Stop spinner after investigation\n if (spinner !== null) {\n const activeSpinner = spinner as Ora;\n if (investigation.success) {\n activeSpinner.succeed(`Investigation complete (${investigation.toolCalls} tool calls)`);\n } else {\n activeSpinner.fail(\"Investigation failed\");\n }\n }\n\n if (!investigation.success) {\n console.error(chalk.red(\"\\nError:\"), investigation.error);\n process.exit(1);\n }\n\n // Display investigation results\n console.log(chalk.bold(\"\\n📋 Investigation Results:\"));\n console.log(chalk.dim(\"─\".repeat(60)));\n\n console.log(chalk.cyan(\"\\nTitle:\"), investigation.title);\n console.log(chalk.cyan(\"Summary:\"), investigation.summary);\n\n if (investigation.entryPoints && investigation.entryPoints.length > 0) {\n console.log(chalk.cyan(\"\\nEntry Points:\"));\n for (const ep of investigation.entryPoints) {\n console.log(chalk.dim(` • ${ep.component} (${ep.file})`));\n console.log(chalk.dim(` ${ep.description}`));\n }\n }\n\n if (asArray(investigation.dataFlow).length > 0) {\n console.log(chalk.cyan(\"\\nData Flow:\"));\n for (const step of asArray(investigation.dataFlow)) {\n console.log(chalk.dim(` ${step.step}. ${step.description}`));\n const stepFiles = asArray(step.files);\n if (stepFiles.length > 0) {\n console.log(chalk.dim(` Files: ${stepFiles.join(\", \")}`));\n }\n }\n }\n\n if (asArray(investigation.keyFiles).length > 0) {\n console.log(chalk.cyan(\"\\nKey Files:\"));\n for (const file of asArray(investigation.keyFiles)) {\n console.log(chalk.dim(` • ${file.path}`));\n console.log(chalk.dim(` Purpose: ${file.purpose}`));\n const keyExports = asArray(file.keyExports);\n if (keyExports.length > 0) {\n console.log(chalk.dim(` Exports: ${keyExports.join(\", \")}`));\n }\n }\n }\n\n if (asArray(investigation.dataStructures).length > 0) {\n console.log(chalk.cyan(\"\\nData Structures:\"));\n for (const ds of asArray(investigation.dataStructures)) {\n console.log(chalk.dim(` • ${ds.name} (${ds.file})`));\n console.log(chalk.dim(` ${ds.description}`));\n const fields = asArray(ds.fields);\n if (fields.length > 0) {\n console.log(\n chalk.dim(\n ` Fields: ${fields.slice(0, 5).join(\", \")}${fields.length > 5 ? \"...\" : \"\"}`\n )\n );\n }\n }\n }\n\n if (asArray(investigation.usageExamples).length > 0) {\n console.log(chalk.cyan(\"\\nUsage Examples:\"));\n for (const example of asArray(investigation.usageExamples)) {\n console.log(chalk.dim(` • ${example.description} (${example.file})`));\n }\n }\n\n if (asArray(investigation.technicalNotes).length > 0) {\n console.log(chalk.cyan(\"\\nTechnical Notes:\"));\n for (const note of asArray(investigation.technicalNotes)) {\n console.log(chalk.dim(` • ${note}`));\n }\n }\n\n // Convert investigation to artifact\n const { artifact, codeSnippets } = investigationToArtifact(query, investigation);\n\n // Generate video if requested\n if (options.video !== undefined) {\n await handleVideoGeneration(artifact, options, null, codeSnippets);\n }\n\n if (options.post) {\n const postSpinner = ora(\"Posting artifact to Visible API...\").start();\n const response = await postArtifact(artifact);\n postSpinner.succeed(\"Artifact posted successfully\");\n console.log(chalk.green(\"\\n✓ Artifact created:\"), response.link);\n } else {\n console.log(chalk.yellow(\"\\nSkipped posting to API (--no-post)\"));\n console.log(chalk.dim(\"\\nArtifact payload:\"));\n console.log(JSON.stringify(artifact, null, 2));\n }\n } catch (error) {\n if (spinner) spinner.fail(\"Investigation failed\");\n console.error(chalk.red(\"\\nError:\"), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n}\n\n/**\n * Result of converting investigation to artifact with code snippets\n */\ninterface ArtifactWithSnippets {\n artifact: ArtifactPayload;\n codeSnippets: CodeSnippet[];\n}\n\n/**\n * Convert an investigation result to an artifact payload\n */\nfunction investigationToArtifact(\n query: string,\n investigation: InvestigationResult\n): ArtifactWithSnippets {\n const asArray = <T>(value?: T[]): T[] => (Array.isArray(value) ? value : []);\n\n const source: ArtifactSource = {\n type: \"code-section\",\n reference: query,\n };\n\n // Build technical details from investigation\n const technicalDetails: string[] = [];\n\n if (investigation.dataFlow) {\n for (const step of investigation.dataFlow) {\n technicalDetails.push(`Step ${step.step}: ${step.description}`);\n }\n }\n\n if (investigation.technicalNotes) {\n technicalDetails.push(...investigation.technicalNotes);\n }\n\n // Collect all affected files\n const affectedComponents: string[] = [];\n\n affectedComponents.push(...asArray(investigation.keyFiles).map((f) => f.path));\n affectedComponents.push(...asArray(investigation.entryPoints).map((e) => e.file));\n affectedComponents.push(...asArray(investigation.dataStructures).map((d) => d.file));\n affectedComponents.push(...asArray(investigation.usageExamples).map((e) => e.file));\n\n // Deduplicate\n const uniqueComponents = [...new Set(affectedComponents)];\n\n // Extract keywords from data structures and key files\n const keywords: string[] = [];\n keywords.push(...asArray(investigation.dataStructures).map((d) => d.name.toLowerCase()));\n keywords.push(\n ...asArray(investigation.keyFiles).flatMap((f) =>\n asArray(f.keyExports).map((e) => e.toLowerCase())\n )\n );\n keywords.push(...asArray(investigation.relatedFeatures).map((f) => f.toLowerCase()));\n\n const uniqueKeywords = [...new Set(keywords)].slice(0, 20);\n\n const context: ArtifactContext = {\n summary: investigation.summary || \"\",\n technicalDetails,\n affectedComponents: uniqueComponents,\n breakingChanges: false,\n keywords: uniqueKeywords,\n };\n\n // Build guidelines from investigation structure\n const guidelines: string[] = [\n \"Explain the feature from the user's perspective first.\",\n ];\n\n if (asArray(investigation.entryPoints).length > 0) {\n guidelines.push(\"Show how users trigger/access this feature.\");\n }\n if (asArray(investigation.dataFlow).length > 0) {\n guidelines.push(\"Walk through the data flow step by step.\");\n }\n if (asArray(investigation.dataStructures).length > 0) {\n guidelines.push(\"Define the key data structures and their fields.\");\n }\n if (asArray(investigation.usageExamples).length > 0) {\n guidelines.push(\"Include code examples showing real usage.\");\n }\n\n // Extract code snippets from usage examples\n const codeSnippets: CodeSnippet[] = [];\n \n for (const example of asArray(investigation.usageExamples)) {\n if (example.codeSnippet) {\n codeSnippets.push({\n file: example.file,\n code: example.codeSnippet,\n description: example.description,\n changeType: \"context\",\n });\n }\n }\n\n // Also extract from data structures (show type definitions)\n for (const ds of asArray(investigation.dataStructures)) {\n if (ds.fields && ds.fields.length > 0) {\n const typeCode = `interface ${ds.name} {\\n ${ds.fields.slice(0, 8).join(\"\\n \")}\\n}`;\n codeSnippets.push({\n file: ds.file,\n code: typeCode,\n description: ds.description,\n changeType: \"context\",\n });\n }\n }\n\n const artifact: ArtifactPayload = {\n title: investigation.title || `Feature: ${query}`,\n description: investigation.summary || `Investigation of: ${query}`,\n source,\n context,\n guidelines,\n };\n\n return { artifact, codeSnippets };\n}\n\n/**\n * Handle video generation for analyze commands\n */\nasync function handleVideoGeneration(\n artifact: ArtifactPayload,\n options: { video?: boolean | string; videoFormat?: string; videoResolution?: string },\n existingSpinner: Ora | null,\n codeSnippets?: CodeSnippet[]\n): Promise<void> {\n const spinner = existingSpinner || ora();\n\n spinner.start(\"Generating video...\");\n\n // Determine output directory\n const outputDir = typeof options.video === \"string\" ? options.video : process.cwd();\n\n // Parse resolution\n const resolutionKey = (options.videoResolution || \"1080p\") as keyof typeof RESOLUTIONS;\n const resolution = RESOLUTIONS[resolutionKey] || RESOLUTIONS[\"1080p\"];\n\n // Parse format\n const format = (options.videoFormat === \"webm\" ? \"webm\" : \"mp4\") as \"mp4\" | \"webm\";\n\n // Generate video config\n const config: VideoConfig = {\n outputDir,\n filename: sanitizeFilename(artifact.title),\n format,\n resolution,\n fps: 30,\n generatePoster: true,\n };\n\n // Generate storyboard for preview (with code snippets)\n const storyboard = generateStoryboard(artifact, {}, codeSnippets);\n const duration = getVideoDurationSeconds(storyboard);\n\n const snippetCount = codeSnippets?.length || 0;\n spinner.text = `Generating video (${storyboard.scenes.length} scenes, ${snippetCount} code snippets, ${formatDuration(duration)})...`;\n\n const result = await generateVideo({\n artifact,\n codeSnippets,\n config,\n verbose: false,\n });\n\n // Check if we actually rendered a video or just saved props\n const isActualVideo = result.videoPath?.endsWith(\".mp4\") || result.videoPath?.endsWith(\".webm\");\n\n if (result.success && isActualVideo) {\n spinner.succeed(\"Video rendered successfully\");\n console.log(chalk.bold(\"\\n🎬 Video Output:\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log(chalk.cyan(\"Scenes:\"), storyboard.scenes.length);\n console.log(chalk.cyan(\"Duration:\"), formatDuration(duration));\n console.log(chalk.cyan(\"Resolution:\"), `${resolution.width}x${resolution.height}`);\n console.log(chalk.cyan(\"Output:\"), result.videoPath);\n\n if (result.posterPath) {\n console.log(chalk.cyan(\"Poster:\"), result.posterPath);\n }\n\n console.log(chalk.dim(`\\nRender time: ${result.durationMs}ms`));\n } else if (result.success) {\n // Props were saved but video wasn't rendered (Remotion not installed)\n spinner.warn(\"Storyboard saved (Remotion not installed for rendering)\");\n console.log(chalk.bold(\"\\n📋 Storyboard Output:\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log(chalk.cyan(\"Scenes:\"), storyboard.scenes.length);\n console.log(chalk.cyan(\"Duration:\"), formatDuration(duration));\n console.log(chalk.cyan(\"Resolution:\"), `${resolution.width}x${resolution.height}`);\n console.log(chalk.cyan(\"Props file:\"), result.videoPath);\n console.log(chalk.yellow(\"\\n⚠️ To render the actual video, install Remotion:\"));\n console.log(chalk.dim(\"\"));\n console.log(chalk.dim(\" npm install @remotion/bundler @remotion/renderer @remotion/cli remotion react react-dom\"));\n console.log(chalk.dim(\"\"));\n console.log(chalk.yellow(\"Then run the command again, or render manually:\"));\n console.log(chalk.dim(` # From the CLI package directory:`));\n console.log(chalk.dim(` cd $(npm root -g)/@makeitvisible/cli`));\n console.log(chalk.dim(` npx remotion render src/video/remotion/index.tsx Main ${outputDir}/video.mp4 --props=${result.videoPath}`));\n } else {\n spinner.fail(\"Video generation failed\");\n console.log(chalk.red(\"\\nError:\"), result.error);\n }\n}\n\n/**\n * Sanitize a string for use as a filename\n */\nfunction sanitizeFilename(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 50);\n}\n","#!/usr/bin/env node\n\n/**\n * Visible CLI Entry Point\n *\n * This is the main entry point for the CLI.\n * Run with: visible <command>\n */\n\nimport { program } from \"commander\";\nimport { analyzeCommand } from \"../commands/analyze.js\";\n\nprogram\n .name(\"visible\")\n .description(\"Transform technical changes into audience-friendly materials\")\n .version(\"0.1.0\");\n\n// Register commands\nprogram.addCommand(analyzeCommand);\n\nprogram.parse();\n"]}
|