@makeitvisible/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +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"]}
@@ -0,0 +1,292 @@
1
+ import { ChatCompletionTool } from 'openai/resources/chat/completions';
2
+
3
+ /**
4
+ * Shared Types for Visible CLI
5
+ *
6
+ * Types related to artifacts generated from code analysis.
7
+ * (Vendored from @visible/shared for standalone package)
8
+ */
9
+ /**
10
+ * Represents an artifact generated from code analysis.
11
+ * An artifact contains high-level descriptions and guidelines
12
+ * that serve as input for final material generation.
13
+ */
14
+ interface Artifact {
15
+ id: string;
16
+ title: string;
17
+ description: string;
18
+ source: ArtifactSource;
19
+ context: ArtifactContext;
20
+ guidelines: string[];
21
+ createdAt: Date;
22
+ updatedAt: Date;
23
+ }
24
+ /**
25
+ * The source of the artifact (PR, commit, code section, etc.)
26
+ */
27
+ interface ArtifactSource {
28
+ type: "pr" | "commit" | "code-section" | "repository";
29
+ reference: string;
30
+ url?: string;
31
+ }
32
+ /**
33
+ * Context extracted from the code analysis
34
+ */
35
+ interface ArtifactContext {
36
+ summary: string;
37
+ technicalDetails: string[];
38
+ affectedComponents: string[];
39
+ breakingChanges: boolean;
40
+ keywords: string[];
41
+ }
42
+ /**
43
+ * Status of an artifact
44
+ */
45
+ type ArtifactStatus = "draft" | "ready" | "generating" | "completed";
46
+ /**
47
+ * Input for creating a new artifact (from CLI)
48
+ */
49
+ interface CreateArtifactInput {
50
+ title: string;
51
+ description: string;
52
+ source: ArtifactSource;
53
+ context: ArtifactContext;
54
+ guidelines: string[];
55
+ }
56
+ /**
57
+ * Response after creating an artifact
58
+ */
59
+ interface CreateArtifactResponse {
60
+ id: string;
61
+ url: string;
62
+ }
63
+
64
+ /**
65
+ * Git Analyzer
66
+ *
67
+ * Analyzes Git repositories, commits, branches, and pull requests.
68
+ *
69
+ * Features:
70
+ * - Parse commit history
71
+ * - Analyze PR changes
72
+ * - Extract diff information
73
+ * - Identify changed files and their context
74
+ */
75
+
76
+ interface AnalysisResult {
77
+ title: string;
78
+ description: string;
79
+ source: ArtifactSource;
80
+ context: ArtifactContext;
81
+ guidelines: string[];
82
+ }
83
+ /**
84
+ * Analyze a git diff range and produce an artifact
85
+ */
86
+ declare function analyzeDiff(range: string): Promise<AnalysisResult>;
87
+ interface PROptions {
88
+ url?: string;
89
+ number?: number;
90
+ }
91
+ /**
92
+ * Analyze a pull request and produce an artifact
93
+ */
94
+ declare function analyzePR(options: PROptions): Promise<AnalysisResult>;
95
+
96
+ /**
97
+ * Context Extractor
98
+ *
99
+ * Extracts meaningful context from code and technical artifacts.
100
+ *
101
+ * Features:
102
+ * - Build context from multiple sources
103
+ * - Identify key concepts and terminology
104
+ * - Extract technical requirements
105
+ * - Generate structured context for artifact generation
106
+ */
107
+
108
+ interface ContextInput {
109
+ files: string[];
110
+ diff?: string;
111
+ commits?: string[];
112
+ prompt?: string;
113
+ }
114
+ /**
115
+ * Merge multiple context objects into one
116
+ */
117
+ declare function mergeContexts(...contexts: Partial<ArtifactContext>[]): ArtifactContext;
118
+ /**
119
+ * Extract context from file paths
120
+ */
121
+ declare function extractContextFromPaths(paths: string[]): Partial<ArtifactContext>;
122
+ /**
123
+ * Detect breaking changes from diff content
124
+ */
125
+ declare function detectBreakingChangesFromDiff(diff: string): boolean;
126
+ /**
127
+ * Generate a technical summary from context
128
+ */
129
+ declare function generateTechnicalSummary(context: ArtifactContext): string;
130
+
131
+ /**
132
+ * Artifact Generators
133
+ *
134
+ * Generates artifacts from analyzed code context.
135
+ * Artifacts are high-level descriptions and guidelines that serve
136
+ * as input for the final material generation.
137
+ */
138
+ declare const artifactGenerator: {};
139
+
140
+ /**
141
+ * Tool Definitions for the Detective Agent
142
+ *
143
+ * These are the OpenAI function calling definitions that describe
144
+ * what tools the agent can use to explore a codebase.
145
+ */
146
+
147
+ declare const AGENT_TOOLS: ChatCompletionTool[];
148
+ type ToolName = "search_files" | "read_file" | "find_references" | "find_definition" | "list_directory" | "get_file_structure" | "search_types" | "complete_investigation";
149
+
150
+ /**
151
+ * Tool Implementations for the Detective Agent
152
+ *
153
+ * These are the actual implementations of the tools that the agent uses
154
+ * to explore and understand a codebase.
155
+ */
156
+
157
+ interface ToolContext {
158
+ projectRoot: string;
159
+ }
160
+ interface ToolResult {
161
+ success: boolean;
162
+ data?: unknown;
163
+ error?: string;
164
+ }
165
+ /**
166
+ * Search for files by name pattern or content
167
+ */
168
+ declare function searchFiles(ctx: ToolContext, args: {
169
+ query: string;
170
+ searchIn: "filename" | "content" | "both";
171
+ fileTypes?: string[];
172
+ directory?: string;
173
+ }): Promise<ToolResult>;
174
+ /**
175
+ * Read a file's contents
176
+ */
177
+ declare function readFile(ctx: ToolContext, args: {
178
+ path: string;
179
+ startLine?: number;
180
+ endLine?: number;
181
+ }): Promise<ToolResult>;
182
+ /**
183
+ * Find references to a symbol across the codebase
184
+ */
185
+ declare function findReferences(ctx: ToolContext, args: {
186
+ symbol: string;
187
+ type: "import" | "usage" | "all";
188
+ }): Promise<ToolResult>;
189
+ /**
190
+ * Find where a symbol is defined/exported
191
+ */
192
+ declare function findDefinition(ctx: ToolContext, args: {
193
+ symbol: string;
194
+ }): Promise<ToolResult>;
195
+ /**
196
+ * List directory contents
197
+ */
198
+ declare function listDirectory(ctx: ToolContext, args: {
199
+ path: string;
200
+ recursive?: boolean;
201
+ }): Promise<ToolResult>;
202
+ /**
203
+ * Get structured analysis of a file
204
+ */
205
+ declare function getFileStructure(ctx: ToolContext, args: {
206
+ path: string;
207
+ }): Promise<ToolResult>;
208
+ /**
209
+ * Search for type definitions
210
+ */
211
+ declare function searchTypes(ctx: ToolContext, args: {
212
+ query: string;
213
+ kind: "interface" | "type" | "schema" | "all";
214
+ }): Promise<ToolResult>;
215
+ /**
216
+ * Execute a tool by name
217
+ */
218
+ declare function executeTool(toolName: ToolName, args: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult>;
219
+
220
+ /**
221
+ * The Detective Agent
222
+ *
223
+ * An AI agent that explores codebases to understand features, flows, and implementations.
224
+ * Uses tools to navigate code rather than trying to read everything at once.
225
+ */
226
+
227
+ interface DetectiveOptions {
228
+ projectRoot: string;
229
+ verbose?: boolean;
230
+ maxIterations?: number;
231
+ onToolCall?: (toolName: string, args: unknown) => void;
232
+ onToolResult?: (toolName: string, result: ToolResult) => void;
233
+ onThinking?: (thought: string) => void;
234
+ }
235
+ interface InvestigationResult {
236
+ success: boolean;
237
+ title?: string;
238
+ summary?: string;
239
+ entryPoints?: Array<{
240
+ file: string;
241
+ component: string;
242
+ description: string;
243
+ }>;
244
+ dataFlow?: Array<{
245
+ step: number;
246
+ description: string;
247
+ files: string[];
248
+ }>;
249
+ keyFiles?: Array<{
250
+ path: string;
251
+ purpose: string;
252
+ keyExports: string[];
253
+ }>;
254
+ dataStructures?: Array<{
255
+ name: string;
256
+ file: string;
257
+ fields: string[];
258
+ description: string;
259
+ }>;
260
+ usageExamples?: Array<{
261
+ description: string;
262
+ file: string;
263
+ codeSnippet: string;
264
+ }>;
265
+ relatedFeatures?: string[];
266
+ technicalNotes?: string[];
267
+ error?: string;
268
+ toolCalls?: number;
269
+ }
270
+ /**
271
+ * The Detective Agent - explores a codebase to understand a feature
272
+ */
273
+ declare class DetectiveAgent {
274
+ private openai;
275
+ private context;
276
+ private options;
277
+ private messages;
278
+ private toolCallCount;
279
+ constructor(options: DetectiveOptions);
280
+ /**
281
+ * Run an investigation based on a user query
282
+ */
283
+ investigate(query: string): Promise<InvestigationResult>;
284
+ }
285
+ /**
286
+ * Create and run a detective investigation
287
+ */
288
+ declare function investigateFeature(query: string, options: Omit<DetectiveOptions, "projectRoot"> & {
289
+ projectRoot?: string;
290
+ }): Promise<InvestigationResult>;
291
+
292
+ export { AGENT_TOOLS, type AnalysisResult, type Artifact, type ArtifactContext, type ArtifactSource, type ArtifactStatus, type ContextInput, type CreateArtifactInput, type CreateArtifactResponse, DetectiveAgent, type DetectiveOptions, type InvestigationResult, type PROptions, type ToolContext, type ToolName, type ToolResult, analyzeDiff, analyzePR, artifactGenerator, detectBreakingChangesFromDiff, executeTool, extractContextFromPaths, findDefinition, findReferences, generateTechnicalSummary, getFileStructure, investigateFeature, listDirectory, mergeContexts, readFile, searchFiles, searchTypes };