@sashabogi/argus-mcp 2.0.4 → 2.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/core/onboarding-ui.tsx","../src/core/onboarding.ts","../src/cli.ts","../src/core/config.ts","../src/core/snapshot.ts","../src/core/enhanced-snapshot.ts","../src/core/engine.ts","../src/core/prompts.ts","../src/providers/index.ts","../src/providers/openai-compatible.ts","../src/providers/ollama.ts","../src/providers/anthropic.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Argus Onboarding UI - Clean wizard matching Claude Code style\n * \n * Design principles from Claude Code:\n * - Tab bar at top with \"(tab to cycle)\"\n * - Clean list items with ○/● indicators\n * - › for current selection\n * - Footer with keyboard hints\n * - No boxes or borders, just spacing\n * - CONSISTENT controls: Space/Enter both work everywhere\n */\n\nimport React, { useState, useCallback } from 'react';\nimport { render, Box, Text, useInput, useApp } from 'ink';\nimport type { ExperienceLevel, OnboardingConfig, ProjectOnboardingConfig, DetectedKeyFile } from './onboarding.js';\nimport { COMMON_KEY_FILE_PATTERNS, DEFAULT_ONBOARDING_CONFIG } from './onboarding.js';\n\n// ============================================================================\n// Shared Components\n// ============================================================================\n\ninterface TabBarProps {\n tabs: string[];\n activeIndex: number;\n}\n\nfunction TabBar({ tabs, activeIndex }: TabBarProps) {\n return (\n <Box marginBottom={1}>\n {tabs.map((tab, i) => (\n <React.Fragment key={tab}>\n {i === activeIndex ? (\n <Text bold inverse> {tab} </Text>\n ) : (\n <Text dimColor> {tab} </Text>\n )}\n </React.Fragment>\n ))}\n <Text dimColor> (tab to cycle)</Text>\n </Box>\n );\n}\n\ninterface SelectItemProps {\n label: string;\n value?: string; // For displaying current value (bold + cyan)\n description?: string;\n isSelected: boolean;\n isCurrent: boolean;\n isMulti?: boolean;\n}\n\nfunction SelectItem({ label, value, description, isSelected, isCurrent, isMulti = false }: SelectItemProps) {\n const indicator = isMulti \n ? (isSelected ? '●' : '○')\n : (isSelected ? '●' : '○');\n \n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={isCurrent ? 'cyan' : undefined}>\n {isCurrent ? '› ' : ' '}\n </Text>\n <Text color={isSelected ? 'cyan' : 'gray'}>{indicator} </Text>\n <Text bold={isCurrent}>{label}</Text>\n {value && (\n <Text bold color=\"cyan\"> {value}</Text>\n )}\n </Box>\n {description && (\n <Box marginLeft={4}>\n <Text dimColor>{description}</Text>\n </Box>\n )}\n </Box>\n );\n}\n\ninterface FooterProps {\n hints: string[];\n}\n\nfunction Footer({ hints }: FooterProps) {\n return (\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" borderTop borderBottom={false} borderLeft={false} borderRight={false} paddingTop={0}>\n <Text dimColor>{hints.join(' · ')}</Text>\n </Box>\n );\n}\n\n// ============================================================================\n// Global Onboarding Wizard\n// ============================================================================\n\ninterface GlobalWizardProps {\n onComplete: (config: OnboardingConfig) => void;\n}\n\ntype GlobalTab = 'experience' | 'patterns' | 'behaviors' | 'confirm';\n\nfunction GlobalWizard({ onComplete }: GlobalWizardProps) {\n const { exit } = useApp();\n \n // Tab state\n const [activeTab, setActiveTab] = useState<GlobalTab>('experience');\n \n // Form state\n const [experienceLevel, setExperienceLevel] = useState<ExperienceLevel>('intermediate');\n const [selectedPatterns, setSelectedPatterns] = useState<Set<string>>(\n new Set(COMMON_KEY_FILE_PATTERNS.filter(p => p.default).map(p => p.pattern))\n );\n const [customPatterns, setCustomPatterns] = useState('');\n const [refreshStale, setRefreshStale] = useState(true);\n const [contextRestore, setContextRestore] = useState(true);\n const [trackNew, setTrackNew] = useState<'auto' | 'ask' | 'manual'>('auto');\n \n // List navigation\n const [cursorIndex, setCursorIndex] = useState(0);\n const [isEditingCustom, setIsEditingCustom] = useState(false);\n \n // Determine available tabs based on experience\n const getTabs = useCallback((): GlobalTab[] => {\n if (experienceLevel === 'beginner') return ['experience', 'confirm'];\n if (experienceLevel === 'intermediate') return ['experience', 'patterns', 'confirm'];\n return ['experience', 'patterns', 'behaviors', 'confirm'];\n }, [experienceLevel]);\n \n const tabs = getTabs();\n const tabIndex = tabs.indexOf(activeTab);\n \n // Handle completion\n const handleComplete = useCallback(() => {\n const allPatterns = [\n ...Array.from(selectedPatterns),\n ...(customPatterns ? customPatterns.split(',').map(p => p.trim()).filter(Boolean) : []),\n ];\n \n const config: OnboardingConfig = {\n experienceLevel,\n globalKeyPatterns: experienceLevel === 'beginner' \n ? DEFAULT_ONBOARDING_CONFIG.globalKeyPatterns \n : allPatterns,\n autoBehaviors: experienceLevel === 'expert'\n ? { refreshStaleSnapshots: refreshStale, contextRestoreOnCompact: contextRestore, trackNewKeyFiles: trackNew }\n : DEFAULT_ONBOARDING_CONFIG.autoBehaviors,\n projects: {},\n };\n \n onComplete(config);\n exit();\n }, [experienceLevel, selectedPatterns, customPatterns, refreshStale, contextRestore, trackNew, onComplete, exit]);\n \n // Input handling\n useInput((input, key) => {\n if (key.escape) {\n if (isEditingCustom) {\n setIsEditingCustom(false);\n } else {\n exit();\n }\n return;\n }\n \n // Tab navigation\n if (key.tab && !isEditingCustom) {\n const newIndex = key.shift \n ? (tabIndex - 1 + tabs.length) % tabs.length\n : (tabIndex + 1) % tabs.length;\n setActiveTab(tabs[newIndex]);\n setCursorIndex(0);\n return;\n }\n \n // If editing custom patterns\n if (isEditingCustom) {\n if (key.return) {\n setIsEditingCustom(false);\n } else if (key.backspace || key.delete) {\n setCustomPatterns(prev => prev.slice(0, -1));\n } else if (input && !key.ctrl && !key.meta) {\n setCustomPatterns(prev => prev + input);\n }\n return;\n }\n \n // Get current items count\n const getItemCount = () => {\n switch (activeTab) {\n case 'experience': return 3;\n case 'patterns': return COMMON_KEY_FILE_PATTERNS.length + 1; // +1 for custom\n case 'behaviors': return 3;\n case 'confirm': return 2;\n default: return 0;\n }\n };\n \n // List navigation\n if (key.upArrow) {\n setCursorIndex(prev => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow) {\n setCursorIndex(prev => Math.min(getItemCount() - 1, prev + 1));\n return;\n }\n \n // Selection - BOTH Space and Enter work everywhere for consistency\n if (key.return || input === ' ') {\n switch (activeTab) {\n case 'experience': {\n const levels: ExperienceLevel[] = ['beginner', 'intermediate', 'expert'];\n const selected = levels[cursorIndex];\n if (selected) {\n setExperienceLevel(selected);\n // Auto-advance to next tab\n const newTabs = selected === 'beginner' \n ? ['experience', 'confirm'] \n : selected === 'intermediate'\n ? ['experience', 'patterns', 'confirm']\n : ['experience', 'patterns', 'behaviors', 'confirm'];\n setActiveTab(newTabs[1] as GlobalTab);\n setCursorIndex(0);\n }\n break;\n }\n \n case 'patterns': {\n const isCustom = cursorIndex === COMMON_KEY_FILE_PATTERNS.length;\n if (isCustom) {\n setIsEditingCustom(true);\n } else {\n const pattern = COMMON_KEY_FILE_PATTERNS[cursorIndex];\n if (pattern) {\n setSelectedPatterns(prev => {\n const next = new Set(prev);\n if (next.has(pattern.pattern)) {\n next.delete(pattern.pattern);\n } else {\n next.add(pattern.pattern);\n }\n return next;\n });\n }\n }\n break;\n }\n \n case 'behaviors': {\n // Toggle the selected behavior\n if (cursorIndex === 0) {\n setRefreshStale(!refreshStale);\n } else if (cursorIndex === 1) {\n setContextRestore(!contextRestore);\n } else if (cursorIndex === 2) {\n // Cycle through options\n setTrackNew(trackNew === 'auto' ? 'ask' : trackNew === 'ask' ? 'manual' : 'auto');\n }\n break;\n }\n \n case 'confirm': {\n if (cursorIndex === 0) {\n handleComplete();\n } else {\n // Go back to previous tab\n setActiveTab(tabs[tabIndex - 1] || 'experience');\n setCursorIndex(0);\n }\n break;\n }\n }\n }\n });\n \n // Get tab display names\n const tabNames = tabs.map(t => {\n switch (t) {\n case 'experience': return 'Experience';\n case 'patterns': return 'Patterns';\n case 'behaviors': return 'Behaviors';\n case 'confirm': return 'Confirm';\n default: return t;\n }\n });\n \n // Get title for current tab\n const getTitle = () => {\n switch (activeTab) {\n case 'experience': return 'Select your experience level';\n case 'patterns': return `Key file patterns (${selectedPatterns.size} selected)`;\n case 'behaviors': return 'Configure auto behaviors';\n case 'confirm': return 'Ready to complete setup';\n default: return '';\n }\n };\n \n // Render experience items\n const renderExperience = () => {\n const items = [\n { id: 'beginner', label: 'Beginner', desc: 'Auto-setup, minimal questions' },\n { id: 'intermediate', label: 'Intermediate', desc: 'Smart defaults with confirmation' },\n { id: 'expert', label: 'Expert', desc: 'Full control over all settings' },\n ];\n \n return items.map((item, i) => (\n <SelectItem\n key={item.id}\n label={item.label}\n description={item.desc}\n isCurrent={i === cursorIndex}\n isSelected={item.id === experienceLevel}\n />\n ));\n };\n \n // Render patterns items\n const renderPatterns = () => {\n const patternItems = COMMON_KEY_FILE_PATTERNS.map((p, i) => (\n <SelectItem\n key={p.pattern}\n label={p.pattern}\n description={p.description}\n isCurrent={i === cursorIndex}\n isSelected={selectedPatterns.has(p.pattern)}\n isMulti\n />\n ));\n \n // Custom patterns item\n const customIndex = COMMON_KEY_FILE_PATTERNS.length;\n const customItem = isEditingCustom ? (\n <Box key=\"_custom\" flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\">› </Text>\n <Text color=\"gray\">○ </Text>\n <Text>Custom: </Text>\n <Text color=\"cyan\">{customPatterns}</Text>\n <Text color=\"cyan\" inverse> </Text>\n </Box>\n <Box marginLeft={4}>\n <Text dimColor>Type comma-separated patterns, Enter when done</Text>\n </Box>\n </Box>\n ) : (\n <SelectItem\n key=\"_custom\"\n label=\"Custom patterns...\"\n description={customPatterns || 'Add your own patterns'}\n isCurrent={cursorIndex === customIndex}\n isSelected={false}\n />\n );\n \n return [...patternItems, customItem];\n };\n \n // Render behaviors items\n const renderBehaviors = () => {\n const items = [\n { \n id: 'refresh', \n label: 'Auto-refresh snapshots:', \n value: refreshStale ? 'Yes' : 'No',\n desc: 'Refresh when snapshots become stale' \n },\n { \n id: 'context', \n label: 'Context restore:', \n value: contextRestore ? 'Yes' : 'No',\n desc: 'Auto-restore after compaction' \n },\n { \n id: 'track', \n label: 'New key files:', \n value: trackNew,\n desc: 'When new potential key files detected (auto/ask/manual)' \n },\n ];\n \n return items.map((item, i) => (\n <SelectItem\n key={item.id}\n label={item.label}\n value={item.value}\n description={item.desc}\n isCurrent={i === cursorIndex}\n isSelected={i === cursorIndex}\n isMulti\n />\n ));\n };\n \n // Render confirm items\n const renderConfirm = () => {\n return (\n <>\n <SelectItem\n label=\"Confirm and continue\"\n description=\"Save settings and install MCP server\"\n isCurrent={cursorIndex === 0}\n isSelected={cursorIndex === 0}\n />\n <SelectItem\n label=\"Go back\"\n description=\"Review settings\"\n isCurrent={cursorIndex === 1}\n isSelected={false}\n />\n </>\n );\n };\n \n // Get content for current tab\n const renderContent = () => {\n switch (activeTab) {\n case 'experience': return renderExperience();\n case 'patterns': return renderPatterns();\n case 'behaviors': return renderBehaviors();\n case 'confirm': return renderConfirm();\n default: return null;\n }\n };\n \n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">🔮 Argus Setup</Text>\n </Box>\n \n {/* Tab bar */}\n <TabBar tabs={tabNames} activeIndex={tabIndex} />\n \n {/* Title */}\n <Box marginBottom={1}>\n <Text bold>{getTitle()}</Text>\n </Box>\n \n {/* Content */}\n {renderContent()}\n \n {/* Scroll indicator */}\n {activeTab === 'patterns' && cursorIndex < COMMON_KEY_FILE_PATTERNS.length && (\n <Box marginLeft={2} marginTop={1}>\n <Text dimColor>↓ more below</Text>\n </Box>\n )}\n \n {/* Footer - consistent hint for all tabs */}\n <Footer hints={\n isEditingCustom \n ? ['Type patterns', 'Enter: done', 'Esc: cancel']\n : ['↑↓: navigate', 'Space/Enter: select', 'Tab: next section', 'Esc: cancel']\n } />\n </Box>\n );\n}\n\n// ============================================================================\n// Project Onboarding Wizard\n// ============================================================================\n\ninterface ProjectWizardProps {\n projectName: string;\n detectedFiles: DetectedKeyFile[];\n globalPatterns: string[];\n experienceLevel: ExperienceLevel;\n onComplete: (config: ProjectOnboardingConfig) => void;\n}\n\nfunction ProjectWizard({ \n projectName, \n detectedFiles, \n globalPatterns,\n experienceLevel,\n onComplete \n}: ProjectWizardProps) {\n const { exit } = useApp();\n \n // Separate pattern matches from other detections\n const patternMatches = detectedFiles.filter(f => f.matchedPattern);\n const otherFiles = detectedFiles.filter(f => !f.matchedPattern).slice(0, 10);\n const allFiles = [...patternMatches, ...otherFiles];\n \n // State\n const [selectedFiles, setSelectedFiles] = useState<Set<string>>(\n new Set(patternMatches.map(f => f.path))\n );\n const [cursorIndex, setCursorIndex] = useState(0);\n const [tab, setTab] = useState<'files' | 'confirm'>(allFiles.length > 0 ? 'files' : 'confirm');\n \n const tabs: ('files' | 'confirm')[] = allFiles.length > 0 ? ['files', 'confirm'] : ['confirm'];\n const tabIndex = tabs.indexOf(tab);\n \n const handleComplete = useCallback(() => {\n const config: ProjectOnboardingConfig = {\n keyFiles: Array.from(selectedFiles),\n customPatterns: [],\n lastScanDate: new Date().toISOString(),\n };\n onComplete(config);\n exit();\n }, [selectedFiles, onComplete, exit]);\n \n useInput((input, key) => {\n if (key.escape) {\n exit();\n return;\n }\n \n if (key.tab) {\n const newIndex = key.shift \n ? (tabIndex - 1 + tabs.length) % tabs.length\n : (tabIndex + 1) % tabs.length;\n setTab(tabs[newIndex]);\n setCursorIndex(0);\n return;\n }\n \n if (key.upArrow) {\n setCursorIndex(prev => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow) {\n const maxIndex = tab === 'files' ? allFiles.length - 1 : 1;\n setCursorIndex(prev => Math.min(maxIndex, prev + 1));\n return;\n }\n \n // Both Space and Enter work for consistency\n if (key.return || input === ' ') {\n if (tab === 'files') {\n const file = allFiles[cursorIndex];\n if (file) {\n setSelectedFiles(prev => {\n const next = new Set(prev);\n if (next.has(file.path)) {\n next.delete(file.path);\n } else {\n next.add(file.path);\n }\n return next;\n });\n }\n } else {\n if (cursorIndex === 0) {\n handleComplete();\n } else {\n setTab('files');\n setCursorIndex(0);\n }\n }\n }\n });\n \n const tabNames = tabs.map(t => t === 'files' ? 'Files' : 'Confirm');\n \n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📂 Project Setup: {projectName}</Text>\n </Box>\n \n {/* Tab bar */}\n <TabBar tabs={tabNames} activeIndex={tabIndex} />\n \n {/* Title */}\n <Box marginBottom={1}>\n <Text bold>\n {tab === 'files' \n ? `Select key files (${selectedFiles.size}/${allFiles.length} selected)`\n : 'Ready to continue'}\n </Text>\n </Box>\n \n {/* File list */}\n {tab === 'files' && (\n <>\n {patternMatches.length > 0 && (\n <Box marginBottom={1}>\n <Text dimColor>── Matches your patterns ──</Text>\n </Box>\n )}\n {allFiles.map((file, i) => {\n const isPatternMatch = patternMatches.includes(file);\n const showSeparator = i === patternMatches.length && otherFiles.length > 0;\n \n return (\n <React.Fragment key={file.path}>\n {showSeparator && (\n <Box marginY={1}>\n <Text dimColor>── Other detected files ──</Text>\n </Box>\n )}\n <SelectItem\n label={file.path}\n description={`${file.lines} lines · ${file.reason}`}\n isCurrent={i === cursorIndex}\n isSelected={selectedFiles.has(file.path)}\n isMulti\n />\n </React.Fragment>\n );\n })}\n {allFiles.length > 8 && cursorIndex < allFiles.length - 1 && (\n <Box marginLeft={2}>\n <Text dimColor>↓ more below</Text>\n </Box>\n )}\n </>\n )}\n \n {/* Confirm options */}\n {tab === 'confirm' && (\n <>\n <SelectItem\n label=\"Confirm and continue\"\n description={`Track ${selectedFiles.size} key file(s)`}\n isCurrent={cursorIndex === 0}\n isSelected={cursorIndex === 0}\n />\n <SelectItem\n label=\"Go back\"\n description=\"Review file selection\"\n isCurrent={cursorIndex === 1}\n isSelected={false}\n />\n </>\n )}\n \n {/* Footer - consistent hints */}\n <Footer hints={['↑↓: navigate', 'Space/Enter: select', 'Tab: next section', 'Esc: cancel']} />\n </Box>\n );\n}\n\n// ============================================================================\n// Render Functions\n// ============================================================================\n\nexport async function renderGlobalOnboarding(): Promise<OnboardingConfig> {\n return new Promise((resolve) => {\n const { waitUntilExit } = render(\n <GlobalWizard onComplete={resolve} />\n );\n waitUntilExit();\n });\n}\n\nexport async function renderProjectOnboarding(\n projectName: string,\n detectedFiles: DetectedKeyFile[],\n globalPatterns: string[],\n experienceLevel: ExperienceLevel\n): Promise<ProjectOnboardingConfig> {\n return new Promise((resolve) => {\n const { waitUntilExit } = render(\n <ProjectWizard\n projectName={projectName}\n detectedFiles={detectedFiles}\n globalPatterns={globalPatterns}\n experienceLevel={experienceLevel}\n onComplete={resolve}\n />\n );\n waitUntilExit();\n });\n}\n","/**\n * Argus Onboarding Module\n * \n * Interactive setup wizard that adapts to user experience level.\n * - Beginner: Automatic setup with sensible defaults\n * - Intermediate: Smart detection with confirmation\n * - Expert: Full control over all settings\n */\n\nimport type { Answers } from 'inquirer';\n\nexport type ExperienceLevel = 'beginner' | 'intermediate' | 'expert';\n\nexport interface OnboardingConfig {\n experienceLevel: ExperienceLevel;\n globalKeyPatterns: string[];\n autoBehaviors: {\n refreshStaleSnapshots: boolean;\n contextRestoreOnCompact: boolean;\n trackNewKeyFiles: 'auto' | 'ask' | 'manual';\n };\n projects: Record<string, ProjectOnboardingConfig>;\n}\n\nexport interface ProjectOnboardingConfig {\n keyFiles: string[];\n customPatterns: string[];\n lastScanDate?: string;\n}\n\n// Default key file patterns (not hardcoded assumptions - just common patterns)\nexport const COMMON_KEY_FILE_PATTERNS = [\n { pattern: 'STATUS*', description: 'Project status tracking', default: true },\n { pattern: 'README*', description: 'Project documentation', default: true },\n { pattern: 'TODO*', description: 'Task lists', default: true },\n { pattern: 'ROADMAP*', description: 'Project roadmap', default: false },\n { pattern: 'PROGRESS*', description: 'Progress tracking', default: false },\n { pattern: 'CHANGELOG*', description: 'Version history', default: false },\n { pattern: 'ARCHITECTURE*', description: 'Architecture docs', default: false },\n { pattern: 'DEVELOPMENT*', description: 'Development notes', default: false },\n { pattern: '.plan', description: 'Plan files', default: false },\n { pattern: 'docs/architecture*', description: 'Architecture in docs/', default: false },\n];\n\n// Content signals that indicate a file might be important\nexport const CONTENT_SIGNALS = [\n 'roadmap',\n 'milestone',\n 'progress',\n 'status',\n 'todo',\n 'architecture',\n 'overview',\n 'getting started',\n];\n\nexport const DEFAULT_ONBOARDING_CONFIG: OnboardingConfig = {\n experienceLevel: 'beginner',\n globalKeyPatterns: ['STATUS*', 'README*', 'TODO*'],\n autoBehaviors: {\n refreshStaleSnapshots: true,\n contextRestoreOnCompact: true,\n trackNewKeyFiles: 'auto',\n },\n projects: {},\n};\n\n/**\n * Detect potential key files in a project directory\n * This doesn't assume anything - it finds candidates for the user to confirm\n */\nexport interface DetectedKeyFile {\n path: string;\n reason: string;\n lines: number;\n lastModified: Date;\n matchedPattern?: string;\n matchedSignal?: string;\n}\n\nexport function detectPotentialKeyFiles(\n projectPath: string,\n userPatterns: string[],\n fs: typeof import('fs'),\n path: typeof import('path')\n): DetectedKeyFile[] {\n const detected: DetectedKeyFile[] = [];\n \n function checkFile(filePath: string, relativePath: string): void {\n try {\n const stats = fs.statSync(filePath);\n if (!stats.isFile()) return;\n \n const fileName = path.basename(filePath).toLowerCase();\n const ext = path.extname(filePath).toLowerCase();\n \n // Only check text-like files\n if (!['.md', '.txt', '.org', ''].includes(ext)) return;\n \n let reason = '';\n let matchedPattern: string | undefined;\n let matchedSignal: string | undefined;\n \n // Check against user patterns\n for (const pattern of userPatterns) {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$',\n 'i'\n );\n if (regex.test(fileName) || regex.test(relativePath)) {\n reason = `Matches pattern: ${pattern}`;\n matchedPattern = pattern;\n break;\n }\n }\n \n // If no pattern match, check content signals\n if (!reason && ext === '.md') {\n try {\n const content = fs.readFileSync(filePath, 'utf-8').toLowerCase();\n for (const signal of CONTENT_SIGNALS) {\n if (content.includes(signal)) {\n reason = `Contains \"${signal}\" keyword`;\n matchedSignal = signal;\n break;\n }\n }\n } catch {\n // Can't read file, skip\n }\n }\n \n // Root-level markdown files are often important\n if (!reason && ext === '.md' && !relativePath.includes('/')) {\n const lineCount = countLines(filePath, fs);\n if (lineCount > 50) {\n reason = 'Large markdown file in project root';\n }\n }\n \n if (reason) {\n detected.push({\n path: relativePath,\n reason,\n lines: countLines(filePath, fs),\n lastModified: stats.mtime,\n matchedPattern,\n matchedSignal,\n });\n }\n } catch {\n // Skip files we can't access\n }\n }\n \n function scanDir(dirPath: string, relativePath: string = ''): void {\n try {\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\n \n for (const entry of entries) {\n // Skip common non-essential directories\n if (entry.isDirectory()) {\n if (['node_modules', '.git', 'target', 'dist', 'build', '.next', \n 'coverage', '__pycache__', '.venv', 'vendor'].includes(entry.name)) {\n continue;\n }\n // Only scan a couple levels deep for key files\n if (relativePath.split('/').filter(Boolean).length < 2) {\n scanDir(\n path.join(dirPath, entry.name),\n relativePath ? `${relativePath}/${entry.name}` : entry.name\n );\n }\n } else {\n checkFile(\n path.join(dirPath, entry.name),\n relativePath ? `${relativePath}/${entry.name}` : entry.name\n );\n }\n }\n } catch {\n // Skip directories we can't access\n }\n }\n \n scanDir(projectPath);\n \n // Sort by relevance: pattern matches first, then by line count (bigger = more important)\n return detected.sort((a, b) => {\n if (a.matchedPattern && !b.matchedPattern) return -1;\n if (!a.matchedPattern && b.matchedPattern) return 1;\n return b.lines - a.lines;\n });\n}\n\nfunction countLines(filePath: string, fs: typeof import('fs')): number {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n return content.split('\\n').length;\n } catch {\n return 0;\n }\n}\n\n/**\n * Interactive Global Onboarding\n * Called during `argus mcp install` first run\n * Uses ink-based wizard UI for a clean, tabbed interface\n */\nexport async function runGlobalOnboarding(): Promise<OnboardingConfig> {\n // Use the ink-based wizard UI\n const { renderGlobalOnboarding } = await import('./onboarding-ui.js');\n \n const config = await renderGlobalOnboarding();\n \n // Show completion summary\n console.log('\\n✅ Onboarding complete!');\n console.log(` Experience level: ${config.experienceLevel}`);\n console.log(` Key patterns: ${config.globalKeyPatterns.join(', ')}`);\n \n return config;\n}\n\n/**\n * Interactive Project Onboarding\n * Called during `argus setup .` to configure project-specific settings\n * Uses ink-based wizard UI for a clean, tabbed interface\n */\nexport async function runProjectOnboarding(\n projectPath: string,\n globalConfig: OnboardingConfig,\n fs: typeof import('fs'),\n path: typeof import('path')\n): Promise<ProjectOnboardingConfig> {\n const projectName = path.basename(projectPath);\n \n console.log(`\\n📂 Scanning project: ${projectName}\\n`);\n \n // Detect potential key files\n const detected = detectPotentialKeyFiles(projectPath, globalConfig.globalKeyPatterns, fs, path);\n \n // For beginners, auto-select pattern matches (no wizard)\n if (globalConfig.experienceLevel === 'beginner') {\n const autoSelected = detected\n .filter(d => d.matchedPattern)\n .map(d => d.path);\n \n if (autoSelected.length > 0) {\n console.log('✅ Auto-detected key files:');\n autoSelected.forEach(f => console.log(` • ${f}`));\n } else {\n console.log('ℹ️ No key files matching your patterns found');\n }\n \n return {\n keyFiles: autoSelected,\n customPatterns: [],\n lastScanDate: new Date().toISOString(),\n };\n }\n \n // For intermediate/expert, use the ink wizard\n const { renderProjectOnboarding } = await import('./onboarding-ui.js');\n \n const config = await renderProjectOnboarding(\n projectName,\n detected,\n globalConfig.globalKeyPatterns,\n globalConfig.experienceLevel\n );\n \n if (config.keyFiles.length > 0) {\n console.log(`\\n✅ Tracking ${config.keyFiles.length} key file(s)`);\n }\n \n return config;\n}\n\n/**\n * Format a summary of detected files for display\n */\nexport function formatDetectionSummary(detected: DetectedKeyFile[]): string {\n if (detected.length === 0) {\n return 'No potential key files detected';\n }\n \n const lines: string[] = [];\n lines.push(`Found ${detected.length} potential key file(s):\\n`);\n \n const patternMatches = detected.filter(d => d.matchedPattern);\n const others = detected.filter(d => !d.matchedPattern);\n \n if (patternMatches.length > 0) {\n lines.push('Matches your patterns:');\n patternMatches.forEach(d => {\n lines.push(` ✓ ${d.path} (${d.lines} lines)`);\n });\n }\n \n if (others.length > 0) {\n lines.push('\\nAdditional suggestions:');\n others.slice(0, 5).forEach(d => {\n lines.push(` ? ${d.path} - ${d.reason}`);\n });\n }\n \n return lines.join('\\n');\n}\n\n","/**\n * Argus CLI\n * \n * Command-line interface for Argus codebase intelligence.\n */\n\nimport { Command } from 'commander';\nimport { existsSync, readFileSync, writeFileSync, statSync, unlinkSync, readdirSync, mkdirSync } from 'fs';\nimport * as fs from 'fs';\nimport { homedir } from 'os';\nimport { join, resolve, basename } from 'path';\nimport * as path from 'path';\nimport { execSync } from 'child_process';\n\nimport {\n loadConfig,\n saveConfig,\n getConfigPath,\n ensureConfigDir,\n validateConfig,\n PROVIDER_DEFAULTS,\n ArgusConfig,\n ProviderType,\n} from './core/config.js';\nimport { createSnapshot, getSnapshotStats } from './core/snapshot.js';\nimport { createEnhancedSnapshot } from './core/enhanced-snapshot.js';\nimport { analyze, searchDocument } from './core/engine.js';\nimport { createProvider, listProviderTypes, getProviderDisplayName } from './providers/index.js';\nimport {\n runGlobalOnboarding,\n runProjectOnboarding,\n detectPotentialKeyFiles,\n formatDetectionSummary,\n DEFAULT_ONBOARDING_CONFIG,\n} from './core/onboarding.js';\n\nconst program = new Command();\n\nprogram\n .name('argus')\n .description('Codebase Intelligence Beyond Context Limits')\n .version('2.0.3');\n\n// ============================================================================\n// argus init\n// ============================================================================\nprogram\n .command('init')\n .description('Interactive setup wizard')\n .action(async () => {\n console.log('\\n🔮 Argus Setup Wizard\\n');\n console.log('This will configure your AI provider and create ~/.argus/config.json\\n');\n \n // Dynamic import for inquirer (ESM)\n const inquirer = await import('inquirer');\n \n const providers = listProviderTypes();\n const providerChoices = providers.map(p => ({\n name: `${getProviderDisplayName(p)} - ${getProviderDescription(p)}`,\n value: p,\n }));\n \n const answers = await inquirer.default.prompt([\n {\n type: 'list',\n name: 'provider',\n message: 'Select your AI provider:',\n choices: providerChoices,\n },\n {\n type: 'input',\n name: 'apiKey',\n message: 'Enter your API key:',\n when: (ans: { provider: ProviderType }) => ans.provider !== 'ollama',\n validate: (input: string) => input.length > 0 || 'API key is required',\n },\n {\n type: 'input',\n name: 'model',\n message: 'Enter model name (leave empty for default):',\n default: (ans: { provider: ProviderType }) => PROVIDER_DEFAULTS[ans.provider]?.model || '',\n },\n {\n type: 'input',\n name: 'baseUrl',\n message: 'Enter custom base URL (leave empty for default):',\n when: (ans: { provider: ProviderType }) => ans.provider === 'ollama',\n default: 'http://localhost:11434',\n },\n ]);\n \n // Build config\n const config: ArgusConfig = {\n provider: answers.provider,\n providers: {\n [answers.provider]: {\n ...(answers.apiKey && { apiKey: answers.apiKey }),\n ...(answers.baseUrl && { baseUrl: answers.baseUrl }),\n model: answers.model || PROVIDER_DEFAULTS[answers.provider as ProviderType]?.model || '',\n ...PROVIDER_DEFAULTS[answers.provider as ProviderType],\n },\n },\n defaults: {\n maxTurns: 15,\n turnTimeoutMs: 60000,\n snapshotExtensions: ['ts', 'tsx', 'js', 'jsx', 'rs', 'py', 'go', 'java', 'rb', 'php', 'md'],\n excludePatterns: ['node_modules', '.git', 'target', 'dist', 'build', '.next'],\n },\n };\n \n saveConfig(config);\n console.log(`\\n✅ Configuration saved to ${getConfigPath()}`);\n \n // Test connection\n console.log('\\n🔍 Testing connection...');\n try {\n const provider = createProvider(config);\n const healthy = await provider.healthCheck();\n if (healthy) {\n console.log('✅ Connection successful!\\n');\n } else {\n console.log('⚠️ Connection test failed. Please check your configuration.\\n');\n }\n } catch (error) {\n console.log(`⚠️ Connection test failed: ${error instanceof Error ? error.message : error}\\n`);\n }\n \n console.log('Next steps:');\n console.log(' argus snapshot ./my-project -o snapshot.txt');\n console.log(' argus analyze snapshot.txt \"What are the main modules?\"');\n console.log(' argus mcp install # Add to Claude Code');\n });\n\n// ============================================================================\n// argus update\n// ============================================================================\nprogram\n .command('update')\n .description('Update Argus to the latest version')\n .action(() => {\n console.log('\\n🔄 Updating Argus...\\n');\n \n try {\n execSync('npm install -g https://github.com/sashabogi/argus/tarball/main', { stdio: 'inherit' });\n console.log('\\n✅ Argus updated successfully!');\n console.log('\\nRun `argus --version` to check the new version.');\n } catch (error) {\n console.error('\\n❌ Update failed. Try manually:');\n console.error(' npm install -g https://github.com/sashabogi/argus/tarball/main');\n process.exit(1);\n }\n });\n\n// ============================================================================\n// argus analyze\n// ============================================================================\nprogram\n .command('analyze <path> <query>')\n .description('Analyze a codebase or snapshot with AI')\n .option('-p, --provider <provider>', 'Override default provider')\n .option('-t, --max-turns <n>', 'Maximum reasoning turns', '15')\n .option('-v, --verbose', 'Show detailed execution logs')\n .action(async (path: string, query: string, opts) => {\n const config = loadConfig();\n \n if (opts.provider) {\n config.provider = opts.provider as ProviderType;\n }\n \n const errors = validateConfig(config);\n if (errors.length > 0) {\n console.error('Configuration errors:');\n errors.forEach(e => console.error(` - ${e}`));\n console.error('\\nRun `argus init` to configure.');\n process.exit(1);\n }\n \n const resolvedPath = resolve(path);\n \n if (!existsSync(resolvedPath)) {\n console.error(`File not found: ${resolvedPath}`);\n process.exit(1);\n }\n \n // Check if it's a directory - if so, create a temporary snapshot\n let snapshotPath = resolvedPath;\n let tempSnapshot = false;\n \n const stats = statSync(resolvedPath);\n if (stats.isDirectory()) {\n console.log('📸 Creating snapshot of codebase...');\n snapshotPath = join(homedir(), '.argus', `temp-${Date.now()}.txt`);\n ensureConfigDir();\n \n const result = createEnhancedSnapshot(resolvedPath, snapshotPath, {\n extensions: config.defaults.snapshotExtensions,\n excludePatterns: config.defaults.excludePatterns,\n });\n \n console.log(` ${result.fileCount} files, ${formatSize(result.totalSize)} (enhanced)`);\n tempSnapshot = true;\n }\n \n console.log(`\\n🔍 Analyzing with ${getProviderDisplayName(config.provider)}...`);\n console.log(` Query: ${query}\\n`);\n \n try {\n const provider = createProvider(config);\n const result = await analyze(provider, snapshotPath, query, {\n maxTurns: parseInt(opts.maxTurns),\n verbose: opts.verbose,\n onProgress: (turn, cmd) => {\n if (!opts.verbose) {\n process.stdout.write(`\\r Turn ${turn}: ${cmd.slice(0, 50)}...`);\n }\n },\n });\n \n if (!opts.verbose) {\n console.log('\\n');\n }\n \n if (result.success) {\n console.log('📋 Answer:\\n');\n console.log(result.answer);\n console.log(`\\n(${result.turns} turns, ${result.commands.length} commands)`);\n } else {\n console.log('⚠️ Analysis incomplete:');\n console.log(result.answer);\n if (result.error) {\n console.log(`Error: ${result.error}`);\n }\n }\n } finally {\n // Clean up temp snapshot\n if (tempSnapshot && existsSync(snapshotPath)) {\n unlinkSync(snapshotPath);\n }\n }\n });\n\n// ============================================================================\n// argus snapshot\n// ============================================================================\nprogram\n .command('snapshot <path>')\n .description('Create a codebase snapshot for analysis')\n .option('-o, --output <file>', 'Output file path')\n .option('-e, --extensions <exts>', 'File extensions to include (comma-separated)')\n .option('--exclude <patterns>', 'Patterns to exclude (comma-separated)')\n .option('--basic', 'Skip structural metadata (faster, smaller snapshot)')\n .action((path: string, opts) => {\n const config = loadConfig();\n const resolvedPath = resolve(path);\n \n if (!existsSync(resolvedPath)) {\n console.error(`Path not found: ${resolvedPath}`);\n process.exit(1);\n }\n \n const outputPath = opts.output || `${basename(resolvedPath)}-snapshot.txt`;\n \n console.log('📸 Creating codebase snapshot...');\n console.log(` Source: ${resolvedPath}`);\n console.log(` Output: ${outputPath}`);\n \n const extensions = opts.extensions \n ? opts.extensions.split(',').map((e: string) => e.trim())\n : config.defaults.snapshotExtensions;\n \n const excludePatterns = opts.exclude\n ? opts.exclude.split(',').map((p: string) => p.trim())\n : config.defaults.excludePatterns;\n \n if (opts.basic) {\n console.log(' Mode: Basic (no structural metadata)');\n } else {\n console.log(' Mode: Enhanced (with import graph & exports index)');\n }\n \n const result = opts.basic\n ? createSnapshot(resolvedPath, outputPath, { extensions, excludePatterns })\n : createEnhancedSnapshot(resolvedPath, outputPath, { extensions, excludePatterns });\n \n console.log(`\\n✅ Snapshot created!`);\n console.log(` Files: ${result.fileCount}`);\n console.log(` Lines: ${result.totalLines.toLocaleString()}`);\n console.log(` Size: ${formatSize(result.totalSize)}`);\n \n if (!opts.basic && 'metadata' in result) {\n const meta = result.metadata;\n console.log(`\\n📊 Structural Metadata:`);\n console.log(` Imports tracked: ${meta.imports.length}`);\n console.log(` Exports indexed: ${meta.exports.length}`);\n console.log(` Symbols indexed: ${Object.keys(meta.symbolIndex).length}`);\n }\n \n console.log(`\\nAnalyze with:`);\n console.log(` argus analyze ${outputPath} \"Your query here\"`);\n });\n\n// ============================================================================\n// argus query\n// ============================================================================\nprogram\n .command('query <snapshot> <query>')\n .description('Query an existing snapshot')\n .option('-v, --verbose', 'Show detailed execution logs')\n .action(async (snapshot: string, query: string, opts) => {\n // Alias for analyze with a snapshot file\n await program.commands.find(c => c.name() === 'analyze')?.parseAsync([\n snapshot, query,\n ...(opts.verbose ? ['-v'] : []),\n ], { from: 'user' });\n });\n\n// ============================================================================\n// argus search\n// ============================================================================\nprogram\n .command('search <snapshot> <pattern>')\n .description('Fast grep search (no AI)')\n .option('-i, --ignore-case', 'Case-insensitive search')\n .option('-n, --max-results <n>', 'Maximum results', '50')\n .action((snapshot: string, pattern: string, opts) => {\n const resolvedPath = resolve(snapshot);\n \n if (!existsSync(resolvedPath)) {\n console.error(`File not found: ${resolvedPath}`);\n process.exit(1);\n }\n \n console.log(`🔍 Searching for: ${pattern}\\n`);\n \n const matches = searchDocument(resolvedPath, pattern, {\n caseInsensitive: opts.ignoreCase,\n maxResults: parseInt(opts.maxResults),\n });\n \n if (matches.length === 0) {\n console.log('No matches found.');\n return;\n }\n \n console.log(`Found ${matches.length} matches:\\n`);\n \n for (const match of matches) {\n console.log(`${match.lineNum}: ${match.line.trim()}`);\n }\n });\n\n// ============================================================================\n// argus status - Check if snapshot is up to date\n// ============================================================================\nprogram\n .command('status [path]')\n .description('Check if snapshot is up to date')\n .option('-s, --snapshot <file>', 'Snapshot file to check', '.argus/snapshot.txt')\n .action((path: string | undefined, opts) => {\n const projectPath = path ? resolve(path) : process.cwd();\n const snapshotPath = resolve(projectPath, opts.snapshot);\n \n console.log('📊 Argus Status\\n');\n \n // Check if snapshot exists\n if (!existsSync(snapshotPath)) {\n console.log('❌ No snapshot found at:', snapshotPath);\n console.log('\\nCreate one with:');\n console.log(` argus snapshot ${projectPath} -o ${snapshotPath}`);\n return;\n }\n \n // Get snapshot stats\n const snapshotStats = statSync(snapshotPath);\n const snapshotAge = Date.now() - snapshotStats.mtimeMs;\n const ageHours = Math.floor(snapshotAge / (1000 * 60 * 60));\n const ageDays = Math.floor(ageHours / 24);\n \n console.log('Snapshot:', snapshotPath);\n console.log('Size:', formatSize(snapshotStats.size));\n \n if (ageDays > 0) {\n console.log('Age:', `${ageDays} day${ageDays > 1 ? 's' : ''} ago`);\n } else if (ageHours > 0) {\n console.log('Age:', `${ageHours} hour${ageHours > 1 ? 's' : ''} ago`);\n } else {\n console.log('Age:', 'Less than an hour ago');\n }\n \n // Count files modified since snapshot\n const config = loadConfig();\n let modifiedCount = 0;\n let newCount = 0;\n \n function checkDir(dir: string) {\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n \n // Skip excluded patterns\n if (config.defaults.excludePatterns.some(p => fullPath.includes(p))) {\n continue;\n }\n \n if (entry.isDirectory()) {\n checkDir(fullPath);\n } else if (entry.isFile()) {\n const ext = entry.name.split('.').pop() || '';\n if (config.defaults.snapshotExtensions.includes(ext)) {\n const fileStats = statSync(fullPath);\n if (fileStats.mtimeMs > snapshotStats.mtimeMs) {\n modifiedCount++;\n }\n if (fileStats.birthtimeMs > snapshotStats.mtimeMs) {\n newCount++;\n }\n }\n }\n }\n } catch {\n // Ignore permission errors\n }\n }\n \n checkDir(projectPath);\n \n console.log('\\nChanges since snapshot:');\n if (modifiedCount === 0 && newCount === 0) {\n console.log(' ✅ No changes detected - snapshot is current');\n } else {\n if (newCount > 0) {\n console.log(` 📄 ${newCount} new file${newCount > 1 ? 's' : ''}`);\n }\n if (modifiedCount > newCount) {\n console.log(` ✏️ ${modifiedCount - newCount} modified file${modifiedCount - newCount > 1 ? 's' : ''}`);\n }\n console.log('\\n⚠️ Snapshot may be stale. Refresh with:');\n console.log(` argus snapshot ${projectPath} -o ${snapshotPath}`);\n }\n \n // Recommendations based on age\n if (ageDays >= 7) {\n console.log('\\n💡 Tip: Snapshot is over a week old. Consider refreshing.');\n }\n });\n\n// ============================================================================\n// argus mcp install/uninstall\n// ============================================================================\nconst mcpCommand = program\n .command('mcp')\n .description('Manage Claude Code MCP integration');\n\nmcpCommand\n .command('install')\n .description('Install Argus as an MCP server for Claude Code (global)')\n .option('--no-claude-md', 'Skip global CLAUDE.md injection')\n .option('--no-onboarding', 'Skip interactive onboarding')\n .option('--reset-onboarding', 'Re-run onboarding even if already completed')\n .action(async (opts) => {\n let config = loadConfig();\n \n // Check if this is first install or user wants to reset onboarding\n const shouldOnboard = opts.resetOnboarding || (!config.onboardingComplete && opts.onboarding !== false);\n \n if (shouldOnboard) {\n try {\n const onboardingConfig = await runGlobalOnboarding();\n config.onboarding = onboardingConfig;\n config.onboardingComplete = true;\n saveConfig(config);\n } catch (error) {\n // If onboarding fails (e.g., non-interactive terminal), use defaults\n console.log('\\n⚠️ Interactive onboarding skipped (non-interactive terminal)');\n console.log(' Using default settings. Run `argus mcp install --reset-onboarding` to configure later.\\n');\n config.onboarding = DEFAULT_ONBOARDING_CONFIG;\n config.onboardingComplete = true;\n saveConfig(config);\n }\n }\n \n const errors = validateConfig(config);\n \n if (errors.length > 0) {\n console.error('Configuration errors - run `argus init` first:');\n errors.forEach(e => console.error(` - ${e}`));\n process.exit(1);\n }\n \n // Create the MCP wrapper script\n const wrapperPath = join(homedir(), '.argus', 'argus-mcp-wrapper');\n const providerConfig = config.providers[config.provider];\n \n let envVars = '';\n if (providerConfig?.apiKey) {\n envVars += `export ARGUS_API_KEY=\"${providerConfig.apiKey}\"\\n`;\n }\n if (providerConfig?.baseUrl) {\n envVars += `export ARGUS_BASE_URL=\"${providerConfig.baseUrl}\"\\n`;\n }\n \n const wrapperScript = `#!/bin/bash\n# Argus MCP Wrapper - Auto-generated\nexport PATH=\"/opt/homebrew/bin:/usr/local/bin:$HOME/.npm-global/bin:$PATH\"\nexport ARGUS_PROVIDER=\"${config.provider}\"\nexport ARGUS_MODEL=\"${providerConfig?.model || ''}\"\n${envVars}\nexec argus-mcp \"$@\"\n`;\n \n ensureConfigDir();\n writeFileSync(wrapperPath, wrapperScript, { mode: 0o755 });\n \n // Try to add to Claude Code\n try {\n execSync(`claude mcp remove argus -s user 2>/dev/null || true`, { stdio: 'ignore' });\n execSync(`claude mcp add argus -s user -- \"${wrapperPath}\"`, { stdio: 'inherit' });\n console.log('\\n✅ Argus MCP server installed for Claude Code!');\n } catch {\n console.log('\\n⚠️ Could not automatically add to Claude Code.');\n console.log('Add manually by running:');\n console.log(` claude mcp add argus -s user -- \"${wrapperPath}\"`);\n }\n \n // Inject into global CLAUDE.md (applies to ALL projects, ALL agents)\n if (opts.claudeMd !== false) {\n const globalClaudeMdPath = join(homedir(), '.claude', 'CLAUDE.md');\n \n if (existsSync(globalClaudeMdPath)) {\n let content = readFileSync(globalClaudeMdPath, 'utf-8');\n \n if (content.includes('## Codebase Intelligence (Argus)')) {\n console.log('✓ Global CLAUDE.md already has Argus section');\n } else {\n // Append Argus section\n content += GLOBAL_CLAUDE_MD_ARGUS_SECTION;\n writeFileSync(globalClaudeMdPath, content);\n console.log('✅ Added Argus section to global ~/.claude/CLAUDE.md');\n console.log(' → This applies to ALL projects and ALL sub-agents');\n }\n } else {\n // Create global CLAUDE.md directory if needed\n const claudeDir = join(homedir(), '.claude');\n if (!existsSync(claudeDir)) {\n mkdirSync(claudeDir, { recursive: true });\n }\n writeFileSync(globalClaudeMdPath, GLOBAL_CLAUDE_MD_ARGUS_SECTION.trim());\n console.log('✅ Created global ~/.claude/CLAUDE.md with Argus section');\n }\n }\n \n console.log('\\n📋 Next: Run `argus setup .` in any project to create a snapshot');\n });\n\nmcpCommand\n .command('uninstall')\n .description('Remove Argus from Claude Code')\n .action(() => {\n try {\n execSync('claude mcp remove argus -s user', { stdio: 'inherit' });\n console.log('\\n✅ Argus MCP server removed from Claude Code.');\n } catch {\n console.log('\\n⚠️ Could not remove from Claude Code.');\n console.log('Remove manually by running:');\n console.log(' claude mcp remove argus -s user');\n }\n });\n\n// ============================================================================\n// argus context - Generate persistent codebase knowledge for CLAUDE.md\n// ============================================================================\nconst contextCommand = program\n .command('context')\n .description('Generate architectural context for CLAUDE.md (survives compaction)');\n\ncontextCommand\n .command('generate <path>')\n .description('Generate architecture summary for a project')\n .option('-o, --output <file>', 'Output file (default: stdout)')\n .option('-f, --format <format>', 'Output format: markdown, json', 'markdown')\n .action(async (path: string, opts) => {\n const config = loadConfig();\n const errors = validateConfig(config);\n \n if (errors.length > 0) {\n console.error('Configuration errors - run `argus init` first:');\n errors.forEach(e => console.error(` - ${e}`));\n process.exit(1);\n }\n \n const resolvedPath = resolve(path);\n if (!existsSync(resolvedPath)) {\n console.error(`Path not found: ${resolvedPath}`);\n process.exit(1);\n }\n \n console.error('📸 Creating snapshot...');\n const snapshotPath = join(homedir(), '.argus', `context-${Date.now()}.txt`);\n ensureConfigDir();\n \n const snapshotResult = createEnhancedSnapshot(resolvedPath, snapshotPath, {\n extensions: config.defaults.snapshotExtensions,\n excludePatterns: config.defaults.excludePatterns,\n });\n \n console.error(` ${snapshotResult.fileCount} files, ${formatSize(snapshotResult.totalSize)} (enhanced)`);\n console.error('🧠 Analyzing architecture...\\n');\n \n try {\n const provider = createProvider(config);\n \n // First, get the module structure\n const moduleQuery = `List all the main directories/modules under src/ or the main source folder. \nFor each module, based on its file names and code, describe its purpose in ONE sentence.\nFormat as a bullet list: - **module_name/** - description`;\n \n const moduleResult = await analyze(provider, snapshotPath, moduleQuery, {\n maxTurns: 10,\n onProgress: (turn) => {\n process.stderr.write(`\\r Analyzing modules (turn ${turn})...`);\n },\n });\n \n console.error('\\n');\n \n // Second, get the key patterns\n const patternQuery = `What are the main coding patterns and conventions used? Look for:\n- Error handling approach\n- State management\n- API/data patterns\n- Testing patterns\nKeep it brief - one line per pattern.`;\n \n const patternResult = await analyze(provider, snapshotPath, patternQuery, {\n maxTurns: 8,\n onProgress: (turn) => {\n process.stderr.write(`\\r Analyzing patterns (turn ${turn})...`);\n },\n });\n \n console.error('\\n');\n \n // Third, get important files\n const filesQuery = `What are the 5-10 most important files that a developer should understand first?\nList with file paths and one-line descriptions.`;\n \n const filesResult = await analyze(provider, snapshotPath, filesQuery, {\n maxTurns: 8,\n onProgress: (turn) => {\n process.stderr.write(`\\r Finding key files (turn ${turn})...`);\n },\n });\n \n console.error('\\n');\n \n // Generate the output\n const projectName = basename(resolvedPath);\n const output = generateContextMarkdown(projectName, {\n modules: moduleResult.answer || 'Unable to analyze modules',\n patterns: patternResult.answer || 'Unable to analyze patterns',\n keyFiles: filesResult.answer || 'Unable to identify key files',\n fileCount: snapshotResult.fileCount,\n lineCount: snapshotResult.totalLines,\n });\n \n if (opts.output) {\n writeFileSync(opts.output, output);\n console.error(`✅ Context saved to ${opts.output}`);\n } else {\n console.log(output);\n }\n \n } finally {\n // Cleanup\n if (existsSync(snapshotPath)) {\n unlinkSync(snapshotPath);\n }\n }\n });\n\ncontextCommand\n .command('inject <path>')\n .description('Add/update architecture section in CLAUDE.md')\n .action(async (path: string) => {\n const resolvedPath = resolve(path);\n const claudeMdPath = join(resolvedPath, 'CLAUDE.md');\n \n // Generate context\n console.error('Generating context...\\n');\n \n // Create a child process to run generate and capture output\n const { execSync } = await import('child_process');\n \n try {\n const contextOutput = execSync(\n `argus context generate \"${resolvedPath}\"`,\n { encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024 }\n );\n \n const marker = '<!-- ARGUS:CONTEXT -->';\n const endMarker = '<!-- /ARGUS:CONTEXT -->';\n const wrappedContext = `${marker}\\n${contextOutput}\\n${endMarker}`;\n \n if (existsSync(claudeMdPath)) {\n let existing = readFileSync(claudeMdPath, 'utf-8');\n \n // Check if markers exist\n const markerRegex = new RegExp(`${marker}[\\\\s\\\\S]*?${endMarker}`, 'g');\n \n if (markerRegex.test(existing)) {\n // Replace existing section\n existing = existing.replace(markerRegex, wrappedContext);\n } else {\n // Append to end\n existing = existing.trim() + '\\n\\n' + wrappedContext;\n }\n \n writeFileSync(claudeMdPath, existing);\n console.log(`✅ Updated ${claudeMdPath}`);\n } else {\n // Create new CLAUDE.md\n writeFileSync(claudeMdPath, wrappedContext);\n console.log(`✅ Created ${claudeMdPath}`);\n }\n \n console.log('\\nClaude Code will now have persistent architectural knowledge!');\n console.log('This section survives compaction and restarts.');\n \n } catch (error) {\n console.error('Failed to generate context:', error);\n process.exit(1);\n }\n });\n\ncontextCommand\n .command('refresh <path>')\n .description('Regenerate architecture context (run after major changes)')\n .action(async (path: string) => {\n // Just an alias for inject\n const resolvedPath = resolve(path);\n console.log('Refreshing codebase context...\\n');\n execSync(`argus context inject \"${resolvedPath}\"`, { stdio: 'inherit' });\n });\n\nfunction generateContextMarkdown(projectName: string, data: {\n modules: string;\n patterns: string;\n keyFiles: string;\n fileCount: number;\n lineCount: number;\n}): string {\n return `## Codebase Intelligence (Auto-generated by Argus)\n\n> **This section provides architectural context that survives context compaction.**\n> Regenerate with: \\`argus context refresh .\\`\n\n### Project: ${projectName}\n- **Files:** ${data.fileCount}\n- **Lines:** ${data.lineCount.toLocaleString()}\n\n### Module Structure\n\n${data.modules}\n\n### Key Patterns & Conventions\n\n${data.patterns}\n\n### Important Files to Understand\n\n${data.keyFiles}\n\n### Using Argus for On-Demand Queries\n\nWhen you need more specific information about this codebase:\n\n\\`\\`\\`bash\n# Find where something is implemented\nargus analyze . \"Where is authentication handled?\"\n\n# Understand a specific module\nargus analyze . \"What does the cognition/ module do?\"\n\n# Find code patterns\nargus search .argus/snapshot.txt \"async fn.*Result\"\n\\`\\`\\`\n\n### After Compaction Checklist\n\nIf your context was compacted or you're starting fresh:\n1. ✅ This architecture section is still available (you're reading it)\n2. Query @argus for specific questions about the codebase\n3. Don't re-scan the entire codebase - use targeted queries\n\n`;\n}\n\n// ============================================================================\n// argus config\n// ============================================================================\nprogram\n .command('config [key] [value]')\n .description('View or modify configuration')\n .action((key?: string, value?: string) => {\n const config = loadConfig();\n \n if (!key) {\n // Show all config\n console.log('Current configuration:\\n');\n console.log(JSON.stringify(config, null, 2));\n console.log(`\\nConfig file: ${getConfigPath()}`);\n return;\n }\n \n if (!value) {\n // Show specific key\n const parts = key.split('.');\n let current: unknown = config;\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n console.error(`Key not found: ${key}`);\n process.exit(1);\n }\n }\n console.log(JSON.stringify(current, null, 2));\n return;\n }\n \n // Set value\n const parts = key.split('.');\n let current: Record<string, unknown> = config as unknown as Record<string, unknown>;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current)) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n \n // Try to parse JSON value\n try {\n current[parts[parts.length - 1]] = JSON.parse(value);\n } catch {\n current[parts[parts.length - 1]] = value;\n }\n \n saveConfig(config as unknown as ArgusConfig);\n console.log(`✅ Set ${key} = ${value}`);\n });\n\n// ============================================================================\n// Helpers\n// ============================================================================\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getProviderDescription(provider: ProviderType): string {\n switch (provider) {\n case 'zai': return 'GLM-4.7, best value for code';\n case 'anthropic': return 'Claude, highest quality';\n case 'openai': return 'GPT-4o, general purpose';\n case 'deepseek': return 'Budget-friendly';\n case 'ollama': return 'Free, local, private';\n default: return '';\n }\n}\n\n// ============================================================================\n// Global CLAUDE.md section - applies to ALL projects and ALL sub-agents\n// ============================================================================\nconst GLOBAL_CLAUDE_MD_ARGUS_SECTION = `\n\n## Codebase Intelligence (Argus) — ALL AGENTS\n\n> **This applies to the main session AND all sub-agents/tasks regardless of type.**\n\n### The Rule: Argus Before Multi-File Exploration\n\n**Before reading more than 3 files to understand a codebase, use Argus MCP tools:**\n\n1. **Check for snapshot**: Look for \\`.argus/snapshot.txt\\` in the project\n2. **Search first** (FREE): \\`search_codebase(\".argus/snapshot.txt\", \"pattern\")\\`\n3. **Understand if needed** (~500 tokens): \\`analyze_codebase(\".argus/snapshot.txt\", \"How does X work?\")\\`\n4. **Then read specific files**: Only the files Argus identified as relevant\n\n### Why This Matters\n\n| Without Argus | With Argus |\n|---------------|------------|\n| Read 15+ files = 5,000-50,000 tokens | search → read 2 files = 100-500 tokens |\n| Slow, expensive, loses context | Fast, cheap, efficient |\n\n### For Sub-Agents\n\nIf you are a sub-agent (coder, tester, reviewer, debugger, or ANY other type):\n1. Check if \\`.argus/snapshot.txt\\` exists in the project\n2. If exploring the codebase, use \\`search_codebase\\` first (it's free)\n3. This rule applies regardless of your specific role or instructions\n\n### Quick Reference\n\n| Tool | Cost | Use For |\n|------|------|---------|\n| \\`search_codebase\\` | FREE | Finding files, patterns, definitions |\n| \\`analyze_codebase\\` | ~500 tokens | Architecture questions, understanding flows |\n\n### No Snapshot?\n\nIf \\`.argus/snapshot.txt\\` doesn't exist, proceed normally with native tools.\nThe user can create one with: \\`argus setup .\\`\n`;\n\n// CLAUDE.md template for project setup - UNIVERSAL (works with any agent/skill setup)\nconst CLAUDE_MD_ARGUS_SECTION = `\n## Codebase Intelligence (Argus) — APPLIES TO ALL AGENTS\n\n> **This section applies to the main conversation AND all sub-agents/tasks.**\n> Any agent exploring the codebase should use Argus tools.\n\n### The Rule: Argus Before Multi-File Exploration\n\n**Before reading more than 3 files to understand the codebase, use Argus MCP tools:**\n\n\\`\\`\\`\n# Step 1: Search (FREE, instant)\nsearch_codebase(\".argus/snapshot.txt\", \"pattern-or-keyword\")\n\n# Step 2: If needed, understand architecture (~500 tokens) \nanalyze_codebase(\".argus/snapshot.txt\", \"How does X work?\")\n\n# Step 3: Read only the specific files you need\nRead(the-file-you-found.ts)\n\\`\\`\\`\n\n### Why This Matters\n\n| Approach | Tokens | Speed |\n|----------|--------|-------|\n| Read 15 files to find something | 5,000-50,000 | Slow |\n| search_codebase → Read 2 files | 100-500 | Fast |\n\n### Available Tools\n\n| Tool | Use For | Cost |\n|------|---------|------|\n| \\`search_codebase\\` | Find files, patterns, definitions | **FREE** |\n| \\`analyze_codebase\\` | Architecture, \"how does X work\" | ~500 tokens |\n| \\`create_snapshot\\` | Refresh after major changes | ~100 tokens |\n\n### When to Use What\n\n**Use Argus (\\`.argus/snapshot.txt\\`) for:**\n- Finding where something is defined or used\n- Understanding how modules connect\n- Debugging: \"where is this function called?\"\n- Architecture questions\n- After context compaction\n\n**Use native Read/Search for:**\n- Single file you already know\n- Quick edits to known locations\n- Files you just created\n\n### For Sub-Agents / Background Tasks\n\nIf you are a sub-agent or background task:\n1. Check if \\`.argus/snapshot.txt\\` exists\n2. Use \\`search_codebase\\` before reading multiple files\n3. This applies regardless of your specific role (coder, tester, reviewer, etc.)\n\n### Keeping Updated\n\n\\`\\`\\`bash\nargus status . # Check if stale\nargus snapshot . -o .argus/snapshot.txt # Refresh\n\\`\\`\\`\n`;\n\n// ============================================================================\n// argus setup - One-command project setup with interactive onboarding\n// ============================================================================\nprogram\n .command('setup [path]')\n .description('Set up Argus for a project (snapshot + key files + CLAUDE.md + .gitignore)')\n .option('--no-claude-md', 'Skip CLAUDE.md injection')\n .option('--no-gitignore', 'Skip .gitignore update')\n .option('--no-onboarding', 'Skip interactive key file selection')\n .action(async (pathArg: string | undefined, opts) => {\n const projectPath = pathArg ? resolve(pathArg) : process.cwd();\n \n console.log('🚀 Setting up Argus for project...\\n');\n console.log(` Project: ${projectPath}\\n`);\n \n // Load config (includes onboarding settings)\n const config = loadConfig();\n const onboardingConfig = config.onboarding || DEFAULT_ONBOARDING_CONFIG;\n \n // 1. Create .argus directory\n const argusDir = join(projectPath, '.argus');\n if (!existsSync(argusDir)) {\n mkdirSync(argusDir, { recursive: true });\n console.log('✅ Created .argus/ directory');\n } else {\n console.log('✓ .argus/ directory exists');\n }\n \n // 2. Run project onboarding (key file detection/selection)\n let projectConfig = onboardingConfig.projects[projectPath];\n \n if (!projectConfig && opts.onboarding !== false) {\n try {\n projectConfig = await runProjectOnboarding(projectPath, onboardingConfig, fs, path);\n \n // Save project config\n config.onboarding = config.onboarding || DEFAULT_ONBOARDING_CONFIG;\n config.onboarding.projects[projectPath] = projectConfig;\n saveConfig(config);\n \n if (projectConfig.keyFiles.length > 0) {\n console.log(`\\n✅ Tracking ${projectConfig.keyFiles.length} key file(s) for this project`);\n }\n } catch {\n // Non-interactive terminal, use auto-detection\n console.log('\\n⚠️ Interactive selection skipped (non-interactive terminal)');\n const detected = detectPotentialKeyFiles(projectPath, onboardingConfig.globalKeyPatterns, fs, path);\n projectConfig = {\n keyFiles: detected.filter(d => d.matchedPattern).map(d => d.path),\n customPatterns: [],\n lastScanDate: new Date().toISOString(),\n };\n }\n } else if (projectConfig) {\n console.log(`✓ Using existing project configuration (${projectConfig.keyFiles.length} key files)`);\n }\n \n // 3. Create enhanced snapshot\n const snapshotPath = join(argusDir, 'snapshot.txt');\n console.log('\\n📸 Creating codebase snapshot (enhanced)...');\n \n const result = createEnhancedSnapshot(projectPath, snapshotPath, {\n extensions: config.defaults.snapshotExtensions,\n excludePatterns: config.defaults.excludePatterns,\n });\n \n console.log(`✅ Snapshot created: ${result.fileCount} files, ${result.totalLines.toLocaleString()} lines`);\n if ('metadata' in result) {\n console.log(` Imports: ${result.metadata.imports.length} | Exports: ${result.metadata.exports.length} | Symbols: ${Object.keys(result.metadata.symbolIndex).length}`);\n }\n \n // 4. Save key files list to .argus/key-files.json for Claude to read\n if (projectConfig && projectConfig.keyFiles.length > 0) {\n const keyFilesPath = join(argusDir, 'key-files.json');\n writeFileSync(keyFilesPath, JSON.stringify({\n keyFiles: projectConfig.keyFiles,\n customPatterns: projectConfig.customPatterns,\n lastUpdated: new Date().toISOString(),\n }, null, 2));\n console.log('✅ Saved key files list to .argus/key-files.json');\n }\n \n // 5. Update .gitignore\n if (opts.gitignore !== false) {\n const gitignorePath = join(projectPath, '.gitignore');\n let gitignoreContent = '';\n \n if (existsSync(gitignorePath)) {\n gitignoreContent = readFileSync(gitignorePath, 'utf-8');\n }\n \n if (!gitignoreContent.includes('.argus')) {\n const addition = gitignoreContent.endsWith('\\n') ? '' : '\\n';\n writeFileSync(gitignorePath, gitignoreContent + addition + '\\n# Argus codebase intelligence\\n.argus/\\n');\n console.log('✅ Added .argus/ to .gitignore');\n } else {\n console.log('✓ .argus/ already in .gitignore');\n }\n }\n \n // 6. Inject CLAUDE.md instructions\n if (opts.claudeMd !== false) {\n const claudeMdPath = join(projectPath, 'CLAUDE.md');\n \n if (existsSync(claudeMdPath)) {\n let claudeMdContent = readFileSync(claudeMdPath, 'utf-8');\n \n if (claudeMdContent.includes('Codebase Intelligence (Argus)')) {\n console.log('✓ CLAUDE.md already has Argus section');\n } else {\n // Find a good place to inject - after first heading or at end\n const firstHeadingMatch = claudeMdContent.match(/^#[^#].*$/m);\n if (firstHeadingMatch && firstHeadingMatch.index !== undefined) {\n // Find the end of the first section (next heading or significant break)\n const afterFirstHeading = claudeMdContent.indexOf('\\n## ', firstHeadingMatch.index + 1);\n if (afterFirstHeading > 0) {\n // Insert before the second major section\n claudeMdContent = \n claudeMdContent.slice(0, afterFirstHeading) + \n '\\n' + CLAUDE_MD_ARGUS_SECTION + '\\n' +\n claudeMdContent.slice(afterFirstHeading);\n } else {\n // Append at end\n claudeMdContent += '\\n' + CLAUDE_MD_ARGUS_SECTION;\n }\n } else {\n // No headings found, append at end\n claudeMdContent += '\\n' + CLAUDE_MD_ARGUS_SECTION;\n }\n \n writeFileSync(claudeMdPath, claudeMdContent);\n console.log('✅ Added Argus section to CLAUDE.md');\n }\n } else {\n // Create new CLAUDE.md with Argus section\n const newClaudeMd = `# Project Intelligence\n\nThis project uses Argus for efficient codebase analysis.\n${CLAUDE_MD_ARGUS_SECTION}`;\n \n writeFileSync(claudeMdPath, newClaudeMd);\n console.log('✅ Created CLAUDE.md with Argus section');\n }\n }\n \n console.log('\\n🎉 Argus setup complete!\\n');\n console.log('Next steps:');\n console.log(' 1. Restart Claude Code to pick up CLAUDE.md changes');\n console.log(' 2. Ask Claude about your codebase architecture');\n console.log(' 3. Run `argus status` periodically to check if snapshot needs refresh');\n \n if (projectConfig && projectConfig.keyFiles.length > 0) {\n console.log(`\\n💡 Key files tracked for context restoration:`);\n projectConfig.keyFiles.slice(0, 5).forEach(f => console.log(` • ${f}`));\n if (projectConfig.keyFiles.length > 5) {\n console.log(` ... and ${projectConfig.keyFiles.length - 5} more`);\n }\n }\n });\n\n// ============================================================================\n// argus ui - Open the web UI for visualization\n// ============================================================================\nprogram\n .command('ui')\n .description('Open the Argus web UI for codebase visualization')\n .option('-p, --port <port>', 'Port to serve on', '3333')\n .option('--no-open', 'Do not open browser automatically')\n .action(async (opts) => {\n const uiPath = join(__dirname, '..', 'packages', 'ui');\n\n // Check if UI package exists and is built\n if (!existsSync(join(uiPath, 'package.json'))) {\n console.error('Argus UI package not found.');\n console.error('\\nThe UI package needs to be installed separately:');\n console.error(' cd packages/ui && npm install && npm run build');\n process.exit(1);\n }\n\n // Check if built\n const distPath = join(uiPath, 'dist');\n const hasBuiltUI = existsSync(distPath);\n\n console.log('Starting Argus UI...\\n');\n\n try {\n if (hasBuiltUI) {\n // Serve built static files\n console.log(` Serving built UI from ${distPath}`);\n console.log(` Open http://localhost:${opts.port} in your browser`);\n\n // Use a simple static file server\n const http = await import('http');\n\n const mimeTypes: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'text/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n };\n\n const server = http.createServer((req, res) => {\n let filePath = join(distPath, req.url === '/' ? 'index.html' : req.url || '');\n\n // Handle SPA routing - serve index.html for non-file routes\n if (!existsSync(filePath) && !filePath.includes('.')) {\n filePath = join(distPath, 'index.html');\n }\n\n if (existsSync(filePath)) {\n const ext = path.extname(filePath);\n const contentType = mimeTypes[ext] || 'application/octet-stream';\n const content = readFileSync(filePath);\n res.writeHead(200, { 'Content-Type': contentType });\n res.end(content);\n } else {\n res.writeHead(404);\n res.end('Not found');\n }\n });\n\n const port = parseInt(opts.port, 10);\n server.listen(port, () => {\n console.log(`\\nArgus UI running at http://localhost:${port}`);\n\n if (opts.open !== false) {\n // Open browser using spawn for safety\n const { spawn } = require('child_process');\n const openUrl = `http://localhost:${port}`;\n const openCmd = process.platform === 'darwin' ? 'open' :\n process.platform === 'win32' ? 'start' : 'xdg-open';\n spawn(openCmd, [openUrl], { detached: true, stdio: 'ignore' }).unref();\n }\n });\n\n // Keep running\n process.on('SIGINT', () => {\n console.log('\\n\\nShutting down Argus UI...');\n server.close();\n process.exit(0);\n });\n\n } else {\n // Run vite dev server\n console.log(` Running development server...`);\n console.log(` Port: ${opts.port}`);\n\n // Use spawn instead of execSync for safety\n const { spawn } = require('child_process');\n const vite = spawn('npm', ['run', 'dev', '--', '--port', opts.port], {\n cwd: uiPath,\n stdio: 'inherit',\n });\n\n process.on('SIGINT', () => {\n vite.kill();\n process.exit(0);\n });\n }\n } catch (error) {\n console.error('Failed to start UI server:', error);\n console.error('\\nTry building the UI first:');\n console.error(' cd packages/ui && npm install && npm run build');\n process.exit(1);\n }\n });\n\n// Run\nprogram.parse();\n","/**\n * Argus Configuration Management\n * \n * Handles loading, saving, and validating configuration for Argus.\n * Configuration is stored in ~/.argus/config.json\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport type { OnboardingConfig, ProjectOnboardingConfig } from './onboarding.js';\n\nexport type ProviderType = 'zai' | 'anthropic' | 'openai' | 'deepseek' | 'ollama';\n\n// Re-export onboarding types\nexport type { OnboardingConfig, ProjectOnboardingConfig } from './onboarding.js';\n\nexport interface ProviderConfig {\n apiKey?: string;\n baseUrl?: string;\n model: string;\n options?: Record<string, unknown>;\n}\n\nexport interface ArgusConfig {\n provider: ProviderType;\n providers: {\n zai?: ProviderConfig;\n anthropic?: ProviderConfig;\n openai?: ProviderConfig;\n deepseek?: ProviderConfig;\n ollama?: ProviderConfig;\n };\n defaults: {\n maxTurns: number;\n turnTimeoutMs: number;\n snapshotExtensions: string[];\n excludePatterns: string[];\n };\n onboarding?: OnboardingConfig;\n onboardingComplete?: boolean;\n}\n\nconst DEFAULT_CONFIG: ArgusConfig = {\n provider: 'ollama',\n providers: {\n ollama: {\n baseUrl: 'http://localhost:11434',\n model: 'qwen2.5-coder:7b',\n },\n },\n defaults: {\n maxTurns: 15,\n turnTimeoutMs: 60000,\n snapshotExtensions: ['ts', 'tsx', 'js', 'jsx', 'rs', 'py', 'go', 'java', 'rb', 'php', 'swift', 'kt', 'scala', 'c', 'cpp', 'h', 'hpp', 'cs', 'md'],\n excludePatterns: [\n 'node_modules',\n '.git',\n 'target',\n 'dist',\n 'build',\n '.next',\n 'coverage',\n '__pycache__',\n '.venv',\n 'vendor',\n ],\n },\n};\n\nexport function getConfigDir(): string {\n return join(homedir(), '.argus');\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), 'config.json');\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nexport function loadConfig(): ArgusConfig {\n const configPath = getConfigPath();\n \n if (!existsSync(configPath)) {\n return DEFAULT_CONFIG;\n }\n \n try {\n const content = readFileSync(configPath, 'utf-8');\n const loaded = JSON.parse(content) as Partial<ArgusConfig>;\n \n // Merge with defaults\n return {\n ...DEFAULT_CONFIG,\n ...loaded,\n providers: {\n ...DEFAULT_CONFIG.providers,\n ...loaded.providers,\n },\n defaults: {\n ...DEFAULT_CONFIG.defaults,\n ...loaded.defaults,\n },\n };\n } catch {\n // Silently return defaults - don't console.error as it can corrupt MCP JSON streams\n return DEFAULT_CONFIG;\n }\n}\n\nexport function saveConfig(config: ArgusConfig): void {\n ensureConfigDir();\n const configPath = getConfigPath();\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n}\n\nexport function getProviderConfig(config: ArgusConfig): ProviderConfig {\n const providerConfig = config.providers[config.provider];\n \n if (!providerConfig) {\n throw new Error(`No configuration found for provider: ${config.provider}`);\n }\n \n return providerConfig;\n}\n\nexport function validateConfig(config: ArgusConfig): string[] {\n const errors: string[] = [];\n \n const providerConfig = config.providers[config.provider];\n \n if (!providerConfig) {\n errors.push(`Provider \"${config.provider}\" is not configured`);\n return errors;\n }\n \n // Ollama doesn't need an API key\n if (config.provider !== 'ollama' && !providerConfig.apiKey) {\n errors.push(`API key is required for provider \"${config.provider}\"`);\n }\n \n if (!providerConfig.model) {\n errors.push(`Model is required for provider \"${config.provider}\"`);\n }\n \n return errors;\n}\n\nexport const PROVIDER_DEFAULTS: Record<ProviderType, Partial<ProviderConfig>> = {\n zai: {\n baseUrl: 'https://api.z.ai/api/coding/paas/v4',\n model: 'glm-4.7',\n },\n anthropic: {\n baseUrl: 'https://api.anthropic.com',\n model: 'claude-sonnet-4-20250514',\n },\n openai: {\n baseUrl: 'https://api.openai.com/v1',\n model: 'gpt-4o',\n },\n deepseek: {\n baseUrl: 'https://api.deepseek.com',\n model: 'deepseek-chat',\n },\n ollama: {\n baseUrl: 'http://localhost:11434',\n model: 'qwen2.5-coder:7b',\n },\n};\n","/**\n * Argus Snapshot Generator\n * \n * Creates optimized text snapshots of codebases for analysis.\n * Handles file filtering, exclusion patterns, and formatting.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync, writeFileSync } from 'fs';\nimport { join, relative, extname } from 'path';\n\nexport interface SnapshotOptions {\n extensions?: string[];\n excludePatterns?: string[];\n maxFileSize?: number; // in bytes\n includeHidden?: boolean;\n}\n\nexport interface SnapshotResult {\n outputPath: string;\n fileCount: number;\n totalLines: number;\n totalSize: number;\n files: string[];\n}\n\nconst DEFAULT_OPTIONS: Required<SnapshotOptions> = {\n extensions: ['ts', 'tsx', 'js', 'jsx', 'rs', 'py', 'go', 'java', 'rb', 'php', 'swift', 'kt', 'scala', 'c', 'cpp', 'h', 'hpp', 'cs', 'md', 'json'],\n excludePatterns: [\n 'node_modules',\n '.git',\n 'target',\n 'dist',\n 'build',\n '.next',\n 'coverage',\n '__pycache__',\n '.venv',\n 'vendor',\n '.DS_Store',\n '*.lock',\n 'package-lock.json',\n '*.min.js',\n '*.min.css',\n ],\n maxFileSize: 1024 * 1024, // 1MB\n includeHidden: false,\n};\n\nfunction shouldExclude(filePath: string, patterns: string[]): boolean {\n const normalizedPath = filePath.replace(/\\\\/g, '/');\n \n for (const pattern of patterns) {\n // Glob-like pattern matching\n if (pattern.startsWith('*')) {\n const suffix = pattern.slice(1);\n if (normalizedPath.endsWith(suffix)) return true;\n } else if (normalizedPath.includes(`/${pattern}/`) || normalizedPath.endsWith(`/${pattern}`) || normalizedPath === pattern) {\n return true;\n }\n }\n \n return false;\n}\n\nfunction hasValidExtension(filePath: string, extensions: string[]): boolean {\n const ext = extname(filePath).slice(1).toLowerCase();\n return extensions.includes(ext);\n}\n\nfunction collectFiles(\n dir: string,\n options: Required<SnapshotOptions>,\n baseDir: string = dir\n): string[] {\n const files: string[] = [];\n \n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n \n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = relative(baseDir, fullPath);\n \n // Skip hidden files unless explicitly included\n if (!options.includeHidden && entry.name.startsWith('.')) {\n continue;\n }\n \n // Check exclusion patterns\n if (shouldExclude(relativePath, options.excludePatterns)) {\n continue;\n }\n \n if (entry.isDirectory()) {\n files.push(...collectFiles(fullPath, options, baseDir));\n } else if (entry.isFile()) {\n // Check extension\n if (!hasValidExtension(entry.name, options.extensions)) {\n continue;\n }\n \n // Check file size\n try {\n const stats = statSync(fullPath);\n if (stats.size > options.maxFileSize) {\n continue;\n }\n } catch {\n continue;\n }\n \n files.push(fullPath);\n }\n }\n } catch (error) {\n // Directory not readable, skip\n }\n \n return files.sort();\n}\n\nexport function createSnapshot(\n projectPath: string,\n outputPath: string,\n options: SnapshotOptions = {}\n): SnapshotResult {\n const mergedOptions: Required<SnapshotOptions> = {\n ...DEFAULT_OPTIONS,\n ...options,\n };\n \n if (!existsSync(projectPath)) {\n throw new Error(`Project path does not exist: ${projectPath}`);\n }\n \n const stats = statSync(projectPath);\n if (!stats.isDirectory()) {\n throw new Error(`Project path is not a directory: ${projectPath}`);\n }\n \n // Collect all files\n const files = collectFiles(projectPath, mergedOptions);\n \n // Build snapshot content\n const lines: string[] = [];\n \n // Header\n lines.push('================================================================================');\n lines.push('CODEBASE SNAPSHOT');\n lines.push(`Project: ${projectPath}`);\n lines.push(`Generated: ${new Date().toISOString()}`);\n lines.push(`Extensions: ${mergedOptions.extensions.join(', ')}`);\n lines.push(`Files: ${files.length}`);\n lines.push('================================================================================');\n lines.push('');\n \n // Process each file\n for (const filePath of files) {\n const relativePath = relative(projectPath, filePath);\n \n lines.push('');\n lines.push('================================================================================');\n lines.push(`FILE: ./${relativePath}`);\n lines.push('================================================================================');\n \n try {\n const content = readFileSync(filePath, 'utf-8');\n lines.push(content);\n } catch (error) {\n lines.push('[Unable to read file]');\n }\n }\n \n // Write snapshot\n const content = lines.join('\\n');\n writeFileSync(outputPath, content);\n \n const totalLines = content.split('\\n').length;\n const totalSize = Buffer.byteLength(content, 'utf-8');\n \n return {\n outputPath,\n fileCount: files.length,\n totalLines,\n totalSize,\n files: files.map(f => relative(projectPath, f)),\n };\n}\n\nexport function getSnapshotStats(snapshotPath: string): {\n fileCount: number;\n totalLines: number;\n totalSize: number;\n} {\n if (!existsSync(snapshotPath)) {\n throw new Error(`Snapshot file does not exist: ${snapshotPath}`);\n }\n \n const content = readFileSync(snapshotPath, 'utf-8');\n const totalLines = content.split('\\n').length;\n const totalSize = Buffer.byteLength(content, 'utf-8');\n \n // Count FILE: markers\n const fileMatches = content.match(/^FILE: /gm);\n const fileCount = fileMatches ? fileMatches.length : 0;\n \n return { fileCount, totalLines, totalSize };\n}\n","/**\n * Argus Enhanced Snapshot\n * \n * Extends basic snapshots with structural metadata:\n * - Import graph (who imports whom)\n * - Export index (symbols → files)\n * - Function/class signatures\n * - File dependency tree\n * \n * This enables Claude Code to understand architecture without\n * reading individual files.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join, relative, dirname, extname, basename } from 'path';\nimport { execSync } from 'child_process';\nimport { createSnapshot, SnapshotOptions, SnapshotResult } from './snapshot.js';\n\nexport interface ImportInfo {\n source: string; // File doing the import\n target: string; // What's being imported (module path or relative)\n resolved?: string; // Resolved file path if local\n symbols: string[]; // Imported symbols (or ['*'] for namespace)\n isDefault: boolean; // Is it a default import?\n isType: boolean; // Is it a type-only import?\n}\n\nexport interface ExportInfo {\n file: string;\n symbol: string;\n type: 'function' | 'class' | 'const' | 'let' | 'var' | 'type' | 'interface' | 'enum' | 'default' | 'unknown';\n signature?: string; // Function signature or type definition\n line: number;\n}\n\nexport interface FileMetadata {\n path: string;\n imports: ImportInfo[];\n exports: ExportInfo[];\n size: number;\n lines: number;\n}\n\nexport interface ComplexityInfo {\n file: string;\n score: number;\n level: 'low' | 'medium' | 'high';\n}\n\nexport interface RecentChangeInfo {\n file: string;\n commits: number;\n authors: number;\n}\n\nexport interface EnhancedSnapshotResult extends SnapshotResult {\n metadata: {\n imports: ImportInfo[];\n exports: ExportInfo[];\n fileIndex: Record<string, FileMetadata>;\n importGraph: Record<string, string[]>; // file → files it imports\n exportGraph: Record<string, string[]>; // file → files that import it\n symbolIndex: Record<string, string[]>; // symbol → files that export it\n complexityScores: ComplexityInfo[]; // cyclomatic complexity per file\n testFileMap: Record<string, string[]>; // source file → test files\n recentChanges: RecentChangeInfo[] | null; // recent git changes (null if not git repo)\n };\n}\n\n/**\n * Parse imports from TypeScript/JavaScript content\n */\nfunction parseImports(content: string, filePath: string): ImportInfo[] {\n const imports: ImportInfo[] = [];\n const lines = content.split('\\n');\n \n // Patterns for different import styles\n const patterns = [\n // import { a, b } from 'module'\n /import\\s+(?:type\\s+)?{([^}]+)}\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n // import * as name from 'module'\n /import\\s+\\*\\s+as\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n // import defaultExport from 'module'\n /import\\s+(?:type\\s+)?(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n // import 'module' (side-effect)\n /import\\s+['\"]([^'\"]+)['\"]/g,\n // require('module')\n /(?:const|let|var)\\s+(?:{([^}]+)}|(\\w+))\\s*=\\s*require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n ];\n \n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith('import') && !trimmed.includes('require(')) continue;\n \n // Named imports: import { a, b } from 'module'\n let match = /import\\s+(type\\s+)?{([^}]+)}\\s+from\\s+['\"]([^'\"]+)['\"]/.exec(trimmed);\n if (match) {\n const isType = !!match[1];\n const symbols = match[2].split(',').map(s => s.trim().split(/\\s+as\\s+/)[0].trim()).filter(Boolean);\n const target = match[3];\n imports.push({\n source: filePath,\n target,\n symbols,\n isDefault: false,\n isType,\n });\n continue;\n }\n \n // Namespace import: import * as name from 'module'\n match = /import\\s+\\*\\s+as\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/.exec(trimmed);\n if (match) {\n imports.push({\n source: filePath,\n target: match[2],\n symbols: ['*'],\n isDefault: false,\n isType: false,\n });\n continue;\n }\n \n // Default import: import name from 'module'\n match = /import\\s+(type\\s+)?(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/.exec(trimmed);\n if (match && !trimmed.includes('{')) {\n imports.push({\n source: filePath,\n target: match[3],\n symbols: [match[2]],\n isDefault: true,\n isType: !!match[1],\n });\n continue;\n }\n \n // Side-effect import: import 'module'\n match = /^import\\s+['\"]([^'\"]+)['\"]/.exec(trimmed);\n if (match) {\n imports.push({\n source: filePath,\n target: match[1],\n symbols: [],\n isDefault: false,\n isType: false,\n });\n }\n }\n \n return imports;\n}\n\n/**\n * Parse exports from TypeScript/JavaScript content\n */\nfunction parseExports(content: string, filePath: string): ExportInfo[] {\n const exports: ExportInfo[] = [];\n const lines = content.split('\\n');\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n \n // export function name(...) or export async function name(...)\n let match = /export\\s+(?:async\\s+)?function\\s+(\\w+)\\s*(\\([^)]*\\))/.exec(trimmed);\n if (match) {\n exports.push({\n file: filePath,\n symbol: match[1],\n type: 'function',\n signature: `function ${match[1]}${match[2]}`,\n line: i + 1,\n });\n continue;\n }\n \n // export class Name\n match = /export\\s+class\\s+(\\w+)/.exec(trimmed);\n if (match) {\n exports.push({\n file: filePath,\n symbol: match[1],\n type: 'class',\n line: i + 1,\n });\n continue;\n }\n \n // export const/let/var name\n match = /export\\s+(const|let|var)\\s+(\\w+)/.exec(trimmed);\n if (match) {\n exports.push({\n file: filePath,\n symbol: match[2],\n type: match[1] as 'const' | 'let' | 'var',\n line: i + 1,\n });\n continue;\n }\n \n // export type Name or export interface Name\n match = /export\\s+(type|interface)\\s+(\\w+)/.exec(trimmed);\n if (match) {\n exports.push({\n file: filePath,\n symbol: match[2],\n type: match[1] as 'type' | 'interface',\n line: i + 1,\n });\n continue;\n }\n \n // export enum Name\n match = /export\\s+enum\\s+(\\w+)/.exec(trimmed);\n if (match) {\n exports.push({\n file: filePath,\n symbol: match[1],\n type: 'enum',\n line: i + 1,\n });\n continue;\n }\n \n // export default\n if (/export\\s+default/.test(trimmed)) {\n match = /export\\s+default\\s+(?:function\\s+)?(\\w+)?/.exec(trimmed);\n exports.push({\n file: filePath,\n symbol: match?.[1] || 'default',\n type: 'default',\n line: i + 1,\n });\n }\n }\n \n return exports;\n}\n\n/**\n * Calculate cyclomatic complexity for a file\n * Counts decision points: if, else if, while, for, case, ternary, &&, ||, catch\n */\nfunction calculateComplexity(content: string): number {\n const patterns = [\n /\\bif\\s*\\(/g,\n /\\belse\\s+if\\s*\\(/g,\n /\\bwhile\\s*\\(/g,\n /\\bfor\\s*\\(/g,\n /\\bcase\\s+/g,\n /\\?\\s*.*\\s*:/g,\n /\\&\\&/g,\n /\\|\\|/g,\n /\\bcatch\\s*\\(/g,\n ];\n\n let complexity = 1; // Base complexity\n for (const pattern of patterns) {\n const matches = content.match(pattern);\n if (matches) complexity += matches.length;\n }\n return complexity;\n}\n\n/**\n * Get complexity level label\n */\nfunction getComplexityLevel(score: number): 'low' | 'medium' | 'high' {\n if (score <= 10) return 'low';\n if (score <= 20) return 'medium';\n return 'high';\n}\n\n/**\n * Map source files to their test files\n */\nfunction mapTestFiles(files: string[]): Record<string, string[]> {\n const testMap: Record<string, string[]> = {};\n\n // Common test file patterns\n const testPatterns = [\n // Same directory patterns\n (src: string) => src.replace(/\\.tsx?$/, '.test.ts'),\n (src: string) => src.replace(/\\.tsx?$/, '.test.tsx'),\n (src: string) => src.replace(/\\.tsx?$/, '.spec.ts'),\n (src: string) => src.replace(/\\.tsx?$/, '.spec.tsx'),\n (src: string) => src.replace(/\\.jsx?$/, '.test.js'),\n (src: string) => src.replace(/\\.jsx?$/, '.test.jsx'),\n (src: string) => src.replace(/\\.jsx?$/, '.spec.js'),\n (src: string) => src.replace(/\\.jsx?$/, '.spec.jsx'),\n // __tests__ directory pattern\n (src: string) => {\n const dir = dirname(src);\n const base = basename(src).replace(/\\.(tsx?|jsx?)$/, '');\n return join(dir, '__tests__', `${base}.test.ts`);\n },\n (src: string) => {\n const dir = dirname(src);\n const base = basename(src).replace(/\\.(tsx?|jsx?)$/, '');\n return join(dir, '__tests__', `${base}.test.tsx`);\n },\n // test/ directory pattern\n (src: string) => src.replace(/^src\\//, 'test/').replace(/\\.(tsx?|jsx?)$/, '.test.ts'),\n (src: string) => src.replace(/^src\\//, 'tests/').replace(/\\.(tsx?|jsx?)$/, '.test.ts'),\n ];\n\n // Create a set for fast lookup\n const fileSet = new Set(files);\n\n for (const file of files) {\n // Skip test files themselves\n if (file.includes('.test.') || file.includes('.spec.') || file.includes('__tests__')) continue;\n\n // Only check source files\n if (!/\\.(tsx?|jsx?)$/.test(file)) continue;\n\n const tests: string[] = [];\n for (const pattern of testPatterns) {\n const testPath = pattern(file);\n // Only add if the path changed (pattern matched) AND test file exists\n if (testPath !== file && fileSet.has(testPath)) {\n tests.push(testPath);\n }\n }\n\n if (tests.length > 0) {\n testMap[file] = [...new Set(tests)]; // Dedupe\n }\n }\n return testMap;\n}\n\n/**\n * Get recent changes from git (last 7 days)\n * Returns null if not a git repo\n * Note: Uses execSync with hardcoded commands (no user input) for git operations\n */\nfunction getRecentChanges(projectPath: string): RecentChangeInfo[] | null {\n try {\n // Check if it's a git repo - using execSync with hardcoded command\n execSync('git rev-parse --git-dir', { cwd: projectPath, encoding: 'utf-8', stdio: 'pipe' });\n\n // Get commits with file names and authors from last 7 days\n // Note: This is a hardcoded git command with no user input, safe from injection\n const output = execSync(\n 'git log --since=\"7 days ago\" --name-only --format=\"COMMIT_AUTHOR:%an\" --diff-filter=ACMR',\n { cwd: projectPath, encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024, stdio: 'pipe' }\n );\n\n if (!output.trim()) return [];\n\n const fileStats: Record<string, { commits: Set<string>; authors: Set<string> }> = {};\n let currentAuthor = '';\n let currentCommitId = 0;\n\n for (const line of output.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) {\n currentCommitId++; // New commit block\n continue;\n }\n\n if (trimmed.startsWith('COMMIT_AUTHOR:')) {\n currentAuthor = trimmed.replace('COMMIT_AUTHOR:', '');\n continue;\n }\n\n // It's a file name\n const file = trimmed;\n if (!fileStats[file]) {\n fileStats[file] = { commits: new Set(), authors: new Set() };\n }\n fileStats[file].commits.add(`${currentCommitId}`);\n if (currentAuthor) {\n fileStats[file].authors.add(currentAuthor);\n }\n }\n\n // Convert to array and sort by commit count (most active first)\n const result: RecentChangeInfo[] = Object.entries(fileStats)\n .map(([file, stats]) => ({\n file,\n commits: stats.commits.size,\n authors: stats.authors.size,\n }))\n .sort((a, b) => b.commits - a.commits);\n\n return result;\n } catch {\n return null; // Not a git repo or git not available\n }\n}\n\n/**\n * Resolve a relative import path to an actual file\n */\nfunction resolveImportPath(importPath: string, fromFile: string, projectFiles: string[]): string | undefined {\n if (!importPath.startsWith('.')) return undefined; // External module\n \n const fromDir = dirname(fromFile);\n let resolved = join(fromDir, importPath);\n \n // Try with extensions\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '', '/index.ts', '/index.tsx', '/index.js', '/index.jsx'];\n for (const ext of extensions) {\n const candidate = resolved + ext;\n if (projectFiles.includes(candidate) || projectFiles.includes('./' + candidate)) {\n return candidate;\n }\n }\n \n return undefined;\n}\n\n/**\n * Create an enhanced snapshot with structural metadata\n */\nexport function createEnhancedSnapshot(\n projectPath: string,\n outputPath: string,\n options: SnapshotOptions = {}\n): EnhancedSnapshotResult {\n // First create the basic snapshot\n const baseResult = createSnapshot(projectPath, outputPath, options);\n \n // Now parse all files for metadata\n const allImports: ImportInfo[] = [];\n const allExports: ExportInfo[] = [];\n const fileIndex: Record<string, FileMetadata> = {};\n const projectFiles = baseResult.files.map(f => './' + f);\n \n for (const relPath of baseResult.files) {\n const fullPath = join(projectPath, relPath);\n const ext = extname(relPath).toLowerCase();\n \n // Only parse JS/TS files for imports/exports\n if (!['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'].includes(ext)) {\n continue;\n }\n \n try {\n const content = readFileSync(fullPath, 'utf-8');\n const imports = parseImports(content, relPath);\n const exports = parseExports(content, relPath);\n \n // Resolve local imports\n for (const imp of imports) {\n imp.resolved = resolveImportPath(imp.target, relPath, projectFiles);\n }\n \n allImports.push(...imports);\n allExports.push(...exports);\n \n fileIndex[relPath] = {\n path: relPath,\n imports,\n exports,\n size: content.length,\n lines: content.split('\\n').length,\n };\n } catch {\n // Skip files that can't be read\n }\n }\n \n // Build import graph (file → files it imports)\n const importGraph: Record<string, string[]> = {};\n for (const imp of allImports) {\n if (imp.resolved) {\n if (!importGraph[imp.source]) importGraph[imp.source] = [];\n if (!importGraph[imp.source].includes(imp.resolved)) {\n importGraph[imp.source].push(imp.resolved);\n }\n }\n }\n \n // Build export graph (file → files that import it)\n const exportGraph: Record<string, string[]> = {};\n for (const imp of allImports) {\n if (imp.resolved) {\n if (!exportGraph[imp.resolved]) exportGraph[imp.resolved] = [];\n if (!exportGraph[imp.resolved].includes(imp.source)) {\n exportGraph[imp.resolved].push(imp.source);\n }\n }\n }\n \n // Build symbol index (symbol → files that export it)\n const symbolIndex: Record<string, string[]> = {};\n for (const exp of allExports) {\n if (!symbolIndex[exp.symbol]) symbolIndex[exp.symbol] = [];\n if (!symbolIndex[exp.symbol].includes(exp.file)) {\n symbolIndex[exp.symbol].push(exp.file);\n }\n }\n\n // Calculate complexity scores for all files\n const complexityScores: ComplexityInfo[] = [];\n for (const [relPath, metadata] of Object.entries(fileIndex)) {\n const fullPath = join(projectPath, relPath);\n try {\n const content = readFileSync(fullPath, 'utf-8');\n const score = calculateComplexity(content);\n complexityScores.push({\n file: relPath,\n score,\n level: getComplexityLevel(score),\n });\n } catch {\n // Skip files that can't be read\n }\n }\n // Sort by complexity score (highest first)\n complexityScores.sort((a, b) => b.score - a.score);\n\n // Map test files to source files\n const testFileMap = mapTestFiles(baseResult.files);\n\n // Get recent git changes (null if not a git repo)\n const recentChanges = getRecentChanges(projectPath);\n\n // Append metadata to snapshot file\n const metadataSection = `\n\n================================================================================\nMETADATA: IMPORT GRAPH\n================================================================================\n${Object.entries(importGraph).map(([file, imports]) => `${file}:\\n${imports.map(i => ` → ${i}`).join('\\n')}`).join('\\n\\n')}\n\n================================================================================\nMETADATA: EXPORT INDEX\n================================================================================\n${Object.entries(symbolIndex).map(([symbol, files]) => `${symbol}: ${files.join(', ')}`).join('\\n')}\n\n================================================================================\nMETADATA: FILE EXPORTS\n================================================================================\n${allExports.map(e => `${e.file}:${e.line} - ${e.type} ${e.symbol}${e.signature ? ` ${e.signature}` : ''}`).join('\\n')}\n\n================================================================================\nMETADATA: WHO IMPORTS WHOM\n================================================================================\n${Object.entries(exportGraph).map(([file, importers]) => `${file} is imported by:\\n${importers.map(i => ` ← ${i}`).join('\\n')}`).join('\\n\\n')}\n\n================================================================================\nMETADATA: COMPLEXITY SCORES\n================================================================================\n${complexityScores.map(c => `${c.file}: ${c.score} (${c.level})`).join('\\n')}\n\n================================================================================\nMETADATA: TEST COVERAGE MAP\n================================================================================\n${Object.entries(testFileMap).length > 0\n ? Object.entries(testFileMap).map(([src, tests]) => `${src} -> ${tests.join(', ')}`).join('\\n')\n : '(no test file mappings found)'}\n${baseResult.files.filter(f =>\n /\\.(tsx?|jsx?)$/.test(f) &&\n !f.includes('.test.') &&\n !f.includes('.spec.') &&\n !f.includes('__tests__') &&\n !testFileMap[f]\n ).map(f => `${f} -> (no tests)`).join('\\n')}\n${recentChanges !== null ? `\n\n================================================================================\nMETADATA: RECENT CHANGES (last 7 days)\n================================================================================\n${recentChanges.length > 0\n ? recentChanges.map(c => `${c.file}: ${c.commits} commit${c.commits !== 1 ? 's' : ''}, ${c.authors} author${c.authors !== 1 ? 's' : ''}`).join('\\n')\n : '(no changes in the last 7 days)'}` : ''}\n`;\n\n // Append to snapshot\n const existingContent = readFileSync(outputPath, 'utf-8');\n writeFileSync(outputPath, existingContent + metadataSection);\n\n return {\n ...baseResult,\n metadata: {\n imports: allImports,\n exports: allExports,\n fileIndex,\n importGraph,\n exportGraph,\n symbolIndex,\n complexityScores,\n testFileMap,\n recentChanges,\n },\n };\n}\n","/**\n * Argus RLM Engine\n * \n * Recursive Language Model engine for document analysis.\n * Based on the Matryoshka RLM approach by Dmitri Sotnikov.\n * \n * The engine uses an LLM to generate Nucleus DSL commands that are\n * executed against documents, enabling analysis of content far\n * exceeding typical context limits.\n */\n\nimport { readFileSync } from 'fs';\nimport { AIProvider, Message } from '../providers/types.js';\nimport { buildSystemPrompt, getTurnLimit } from './prompts.js';\n\nexport interface AnalysisOptions {\n maxTurns?: number;\n turnTimeoutMs?: number;\n verbose?: boolean;\n onProgress?: (turn: number, command: string, result: unknown) => void;\n}\n\nexport interface AnalysisResult {\n answer: string;\n turns: number;\n commands: string[];\n success: boolean;\n error?: string;\n}\n\ninterface GrepMatch {\n match: string;\n line: string;\n lineNum: number;\n index: number;\n groups: string[];\n}\n\nconst NUCLEUS_REFERENCE = `\nYou are analyzing a document using the Nucleus DSL. Generate S-expression commands to explore the document.\n\nAVAILABLE COMMANDS:\n- (grep \"pattern\") - Search for regex pattern, returns matches with line numbers\n- (grep \"pattern\" \"flags\") - With flags like \"i\" for case-insensitive\n- (count RESULTS) - Count number of items in RESULTS\n- (map RESULTS (lambda (x) expr)) - Transform each item\n- (filter RESULTS (lambda (x) expr)) - Keep items where expr is true\n- (sort RESULTS key) - Sort by key\n- (first RESULTS) - Get first item\n- (last RESULTS) - Get last item \n- (take RESULTS n) - Get first n items\n- (match str \"pattern\" group) - Extract regex group from string\n\nVARIABLES:\n- RESULTS always contains the result of the last command\n- _1, _2, etc. contain results from turn 1, 2, etc.\n\nFINAL ANSWER:\nWhen you have enough information, output: <<<FINAL>>>your answer here<<<END>>>\n\nRULES:\n1. Output ONLY a single Nucleus command OR a final answer, nothing else\n2. Use grep to search the document\n3. Use map/filter to process results\n4. Build understanding iteratively\n5. When ready, provide the final answer\n\nExample session:\nTurn 1: (grep \"function.*export\")\nTurn 2: (count RESULTS)\nTurn 3: <<<FINAL>>>There are 15 exported functions<<<END>>>\n`;\n\n/**\n * Execute a Nucleus command against document content\n */\nfunction executeNucleus(command: string, content: string, bindings: Map<string, unknown>): unknown {\n // Parse the S-expression\n const parsed = parseSExpression(command);\n if (!parsed) {\n throw new Error(`Failed to parse command: ${command}`);\n }\n \n return evaluateExpr(parsed, content, bindings);\n}\n\ntype SExpr = string | SExpr[];\n\nfunction parseSExpression(input: string): SExpr | null {\n const tokens = tokenize(input.trim());\n if (tokens.length === 0) return null;\n \n let pos = 0;\n \n function parse(): SExpr {\n const token = tokens[pos++];\n \n if (token === '(') {\n const list: SExpr[] = [];\n while (tokens[pos] !== ')' && pos < tokens.length) {\n list.push(parse());\n }\n pos++; // consume ')'\n return list;\n } else if (token.startsWith('\"')) {\n // String literal\n return token.slice(1, -1).replace(/\\\\\"/g, '\"');\n } else if (/^-?\\d+(\\.\\d+)?$/.test(token)) {\n return token; // Keep as string, convert when needed\n } else {\n return token; // Symbol\n }\n }\n \n return parse();\n}\n\nfunction tokenize(input: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n \n while (i < input.length) {\n const char = input[i];\n \n if (/\\s/.test(char)) {\n i++;\n continue;\n }\n \n if (char === '(' || char === ')') {\n tokens.push(char);\n i++;\n continue;\n }\n \n if (char === '\"') {\n let str = '\"';\n i++;\n while (i < input.length && input[i] !== '\"') {\n if (input[i] === '\\\\' && i + 1 < input.length) {\n str += input[i] + input[i + 1];\n i += 2;\n } else {\n str += input[i];\n i++;\n }\n }\n str += '\"';\n i++;\n tokens.push(str);\n continue;\n }\n \n // Symbol or number\n let sym = '';\n while (i < input.length && !/[\\s()]/.test(input[i])) {\n sym += input[i];\n i++;\n }\n tokens.push(sym);\n }\n \n return tokens;\n}\n\nfunction evaluateExpr(expr: SExpr, content: string, bindings: Map<string, unknown>): unknown {\n if (typeof expr === 'string') {\n // Variable lookup\n if (bindings.has(expr)) {\n return bindings.get(expr);\n }\n // Number\n if (/^-?\\d+(\\.\\d+)?$/.test(expr)) {\n return parseFloat(expr);\n }\n return expr;\n }\n \n if (!Array.isArray(expr) || expr.length === 0) {\n return expr;\n }\n \n const [op, ...args] = expr;\n \n switch (op) {\n case 'grep': {\n const pattern = evaluateExpr(args[0], content, bindings) as string;\n const flags = args[1] ? evaluateExpr(args[1], content, bindings) as string : '';\n const regex = new RegExp(pattern, flags + 'g');\n const lines = content.split('\\n');\n const matches: GrepMatch[] = [];\n \n let charIndex = 0;\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const line = lines[lineNum];\n let match;\n const lineRegex = new RegExp(pattern, flags + 'g');\n while ((match = lineRegex.exec(line)) !== null) {\n matches.push({\n match: match[0],\n line: line,\n lineNum: lineNum + 1,\n index: charIndex + match.index,\n groups: match.slice(1),\n });\n }\n charIndex += line.length + 1;\n }\n \n return matches;\n }\n \n case 'count': {\n const arr = evaluateExpr(args[0], content, bindings);\n if (Array.isArray(arr)) return arr.length;\n return 0;\n }\n \n case 'map': {\n const arr = evaluateExpr(args[0], content, bindings) as unknown[];\n const lambdaExpr = args[1] as SExpr[];\n \n if (!Array.isArray(lambdaExpr) || lambdaExpr[0] !== 'lambda') {\n throw new Error('map requires a lambda expression');\n }\n \n const params = lambdaExpr[1] as SExpr[];\n const body = lambdaExpr[2];\n const paramName = Array.isArray(params) ? params[0] as string : params as string;\n \n return arr.map(item => {\n const localBindings = new Map(bindings);\n localBindings.set(paramName, item);\n return evaluateExpr(body, content, localBindings);\n });\n }\n \n case 'filter': {\n const arr = evaluateExpr(args[0], content, bindings) as unknown[];\n const lambdaExpr = args[1] as SExpr[];\n \n if (!Array.isArray(lambdaExpr) || lambdaExpr[0] !== 'lambda') {\n throw new Error('filter requires a lambda expression');\n }\n \n const params = lambdaExpr[1] as SExpr[];\n const body = lambdaExpr[2];\n const paramName = Array.isArray(params) ? params[0] as string : params as string;\n \n return arr.filter(item => {\n const localBindings = new Map(bindings);\n localBindings.set(paramName, item);\n return evaluateExpr(body, content, localBindings);\n });\n }\n \n case 'first': {\n const arr = evaluateExpr(args[0], content, bindings) as unknown[];\n return arr[0];\n }\n \n case 'last': {\n const arr = evaluateExpr(args[0], content, bindings) as unknown[];\n return arr[arr.length - 1];\n }\n \n case 'take': {\n const arr = evaluateExpr(args[0], content, bindings) as unknown[];\n const n = evaluateExpr(args[1], content, bindings) as number;\n return arr.slice(0, n);\n }\n \n case 'sort': {\n const arr = evaluateExpr(args[0], content, bindings) as Record<string, unknown>[];\n const key = evaluateExpr(args[1], content, bindings) as string;\n return [...arr].sort((a, b) => {\n const aVal = a[key];\n const bVal = b[key];\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return aVal - bVal;\n }\n return String(aVal).localeCompare(String(bVal));\n });\n }\n \n case 'match': {\n const str = evaluateExpr(args[0], content, bindings);\n const strValue = typeof str === 'object' && str !== null && 'line' in str \n ? (str as GrepMatch).line \n : String(str);\n const pattern = evaluateExpr(args[1], content, bindings) as string;\n const group = args[2] ? evaluateExpr(args[2], content, bindings) as number : 0;\n \n const regex = new RegExp(pattern);\n const match = strValue.match(regex);\n if (match) {\n return match[group] || null;\n }\n return null;\n }\n \n default:\n throw new Error(`Unknown command: ${op}`);\n }\n}\n\n/**\n * Extract Nucleus command from LLM response\n */\nfunction extractCommand(response: string): { command?: string; finalAnswer?: string } {\n // Check for final answer\n const finalMatch = response.match(/<<<FINAL>>>([\\s\\S]*?)<<<END>>>/);\n if (finalMatch) {\n return { finalAnswer: finalMatch[1].trim() };\n }\n \n // Look for S-expression\n const sexpMatch = response.match(/\\([^)]*(?:\\([^)]*\\)[^)]*)*\\)/);\n if (sexpMatch) {\n return { command: sexpMatch[0] };\n }\n \n return {};\n}\n\n/**\n * Run RLM analysis on a document\n */\nexport async function analyze(\n provider: AIProvider,\n documentPath: string,\n query: string,\n options: AnalysisOptions = {}\n): Promise<AnalysisResult> {\n const {\n maxTurns = 15,\n verbose = false,\n onProgress,\n } = options;\n \n // Use dynamic turn limit based on query type, but cap at maxTurns\n const dynamicLimit = Math.min(getTurnLimit(query), maxTurns);\n \n // Load document\n const content = readFileSync(documentPath, 'utf-8');\n \n // Get document stats for context\n const fileCount = (content.match(/^FILE:/gm) || []).length;\n const lineCount = content.split('\\n').length;\n \n const bindings = new Map<string, unknown>();\n const commands: string[] = [];\n const messages: Message[] = [\n {\n role: 'system',\n content: buildSystemPrompt(query),\n },\n {\n role: 'user',\n content: `CODEBASE SNAPSHOT:\n- Total size: ${content.length.toLocaleString()} characters\n- Files: ${fileCount}\n- Lines: ${lineCount.toLocaleString()}\n\nFiles are marked with \"FILE: ./path/to/file\" headers.\n\nQUERY: ${query}\n\nBegin analysis. You have ${dynamicLimit} turns maximum - provide final answer before then.`,\n },\n ];\n \n for (let turn = 1; turn <= dynamicLimit; turn++) {\n // Force final answer on last turn\n const isLastTurn = turn === dynamicLimit;\n const isNearEnd = turn >= dynamicLimit - 2;\n \n if (verbose) {\n console.log(`\\n[Turn ${turn}/${dynamicLimit}] Querying LLM...`);\n }\n \n // Get LLM response\n const result = await provider.complete(messages);\n const response = result.content;\n \n if (verbose) {\n console.log(`[Turn ${turn}] Response: ${response.slice(0, 200)}...`);\n }\n \n // Extract command or final answer\n const extracted = extractCommand(response);\n \n if (extracted.finalAnswer) {\n return {\n answer: extracted.finalAnswer,\n turns: turn,\n commands,\n success: true,\n };\n }\n \n if (!extracted.command) {\n // No command found, add to messages and continue\n messages.push({ role: 'assistant', content: response });\n messages.push({ role: 'user', content: 'Please provide a Nucleus command or final answer.' });\n continue;\n }\n \n const command = extracted.command;\n commands.push(command);\n \n if (verbose) {\n console.log(`[Turn ${turn}] Command: ${command}`);\n }\n \n // Execute command\n try {\n const cmdResult = executeNucleus(command, content, bindings);\n \n // Store result in bindings\n bindings.set('RESULTS', cmdResult);\n bindings.set(`_${turn}`, cmdResult);\n \n const resultStr = JSON.stringify(cmdResult, null, 2);\n const truncatedResult = resultStr.length > 2000 \n ? resultStr.slice(0, 2000) + '...[truncated]' \n : resultStr;\n \n if (verbose) {\n console.log(`[Turn ${turn}] Result: ${truncatedResult.slice(0, 500)}...`);\n }\n \n onProgress?.(turn, command, cmdResult);\n \n // Add to conversation with nudge if near end\n messages.push({ role: 'assistant', content: command });\n \n let userMessage = `Result:\\n${truncatedResult}`;\n if (isNearEnd && !isLastTurn) {\n userMessage += `\\n\\n⚠️ ${dynamicLimit - turn} turns remaining. Start forming your final answer.`;\n }\n messages.push({ role: 'user', content: userMessage });\n \n // FORCE final answer on last turn - make one more LLM call\n if (isLastTurn) {\n messages.push({ \n role: 'user', \n content: 'STOP SEARCHING. Based on everything you found, provide your final answer NOW using <<<FINAL>>>your answer<<<END>>>' \n });\n \n const finalResult = await provider.complete(messages);\n const finalExtracted = extractCommand(finalResult.content);\n \n if (finalExtracted.finalAnswer) {\n return {\n answer: finalExtracted.finalAnswer,\n turns: turn,\n commands,\n success: true,\n };\n }\n \n // Even if not properly formatted, return whatever we got\n return {\n answer: finalResult.content,\n turns: turn,\n commands,\n success: true,\n };\n }\n \n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n \n if (verbose) {\n console.log(`[Turn ${turn}] Error: ${errMsg}`);\n }\n \n messages.push({ role: 'assistant', content: command });\n messages.push({ role: 'user', content: `Error executing command: ${errMsg}` });\n }\n }\n \n return {\n answer: 'Maximum turns reached without final answer',\n turns: dynamicLimit,\n commands,\n success: false,\n error: 'Max turns reached',\n };\n}\n\n/**\n * Fast grep search without AI\n */\nexport function searchDocument(\n documentPath: string,\n pattern: string,\n options: { caseInsensitive?: boolean; maxResults?: number } = {}\n): GrepMatch[] {\n const content = readFileSync(documentPath, 'utf-8');\n const flags = options.caseInsensitive ? 'gi' : 'g';\n const regex = new RegExp(pattern, flags);\n const lines = content.split('\\n');\n const matches: GrepMatch[] = [];\n \n let charIndex = 0;\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const line = lines[lineNum];\n let match;\n const lineRegex = new RegExp(pattern, flags);\n while ((match = lineRegex.exec(line)) !== null) {\n matches.push({\n match: match[0],\n line: line,\n lineNum: lineNum + 1,\n index: charIndex + match.index,\n groups: match.slice(1),\n });\n \n if (options.maxResults && matches.length >= options.maxResults) {\n return matches;\n }\n }\n charIndex += line.length + 1;\n }\n \n return matches;\n}\n","/**\n * Argus RLM Prompts\n * \n * Optimized prompts for codebase understanding that persists across Claude Code sessions.\n */\n\nexport const NUCLEUS_COMMANDS = `\nCOMMANDS (output ONE per turn):\n(grep \"pattern\") - Find lines matching regex\n(grep \"pattern\" \"i\") - Case-insensitive search \n(count RESULTS) - Count matches\n(take RESULTS n) - First n results\n(filter RESULTS (lambda (x) (match x.line \"pattern\" 0))) - Filter results\n(map RESULTS (lambda (x) x.line)) - Extract just the lines\n\nVARIABLES: RESULTS = last result, _1 _2 _3 = results from turn 1,2,3\n\nTO ANSWER: <<<FINAL>>>your answer<<<END>>>\n`;\n\n// Main system prompt for codebase analysis\nexport const CODEBASE_ANALYSIS_PROMPT = `You are analyzing a SOFTWARE CODEBASE snapshot to help a developer understand it.\n\nThe snapshot contains source files concatenated with \"FILE: ./path/to/file\" markers.\n\n${NUCLEUS_COMMANDS}\n\n## STRATEGY FOR CODEBASE SNAPSHOTS\n\n**To find modules/directories:**\n(grep \"FILE:.*src/[^/]+/\") - top-level source dirs\n(grep \"FILE:.*mod\\\\.rs\") - Rust modules \n(grep \"FILE:.*index\\\\.(ts|js)\") - JS/TS modules\n\n**To find implementations:**\n(grep \"fn function_name\") - Rust functions\n(grep \"function|const.*=>\") - JS functions\n(grep \"class ClassName\") - Classes\n(grep \"struct |type |interface\") - Type definitions\n\n**To understand structure:**\n(grep \"FILE:\") - List all files\n(grep \"use |import |require\") - Find dependencies\n(grep \"pub |export\") - Public APIs\n\n## RULES\n1. Output ONLY a Nucleus command OR a final answer\n2. NO explanations, NO markdown formatting in commands\n3. MUST provide final answer by turn 8\n4. If turn 6+, start summarizing what you found\n\n## EXAMPLE SESSION\nTurn 1: (grep \"FILE:.*src/[^/]+/mod\\\\.rs\")\nTurn 2: (take RESULTS 15)\nTurn 3: <<<FINAL>>>The codebase has these main modules:\n- src/auth/ - Authentication handling\n- src/api/ - API endpoints\n- src/db/ - Database layer\n...<<<END>>>\n`;\n\n// Specialized prompt for architecture questions\nexport const ARCHITECTURE_PROMPT = `You are generating an ARCHITECTURE SUMMARY of a codebase.\n\n${NUCLEUS_COMMANDS}\n\n## YOUR TASK\nCreate a summary suitable for CLAUDE.md that helps Claude Code understand this project after context compaction.\n\n## SEARCH STRATEGY (do these in order)\n1. (grep \"FILE:.*mod\\\\.rs|FILE:.*index\\\\.(ts|js)\") - Find module entry points\n2. (take RESULTS 20) - Limit results\n3. Based on file paths, provide your summary\n\n## OUTPUT FORMAT\nYour final answer should be structured like:\n\n## Modules\n- **module_name/** - Brief description based on files found\n\n## Key Patterns \n- Pattern observations from the code\n\n## Important Files\n- List key files and their apparent purpose\n\nPROVIDE FINAL ANSWER BY TURN 6.\n`;\n\n// Prompt for finding specific implementations\nexport const IMPLEMENTATION_PROMPT = `You are finding HOW something works in a codebase.\n\n${NUCLEUS_COMMANDS}\n\n## STRATEGY\n1. (grep \"FILE:.*keyword\") - Find files related to the concept\n2. (grep \"keyword\") - Find all mentions\n3. (take RESULTS 30) - Limit if too many results\n4. Look for function definitions, structs, classes\n5. PROVIDE FINAL ANSWER based on file paths and code patterns found\n\n## IMPORTANT\n- You have 12 turns maximum\n- By turn 8, START WRITING YOUR FINAL ANSWER\n- Use what you've found - don't keep searching indefinitely\n- It's better to give a partial answer than no answer\n\n## OUTPUT FORMAT\nYour final answer should explain:\n- Which files contain the implementation\n- Key functions/structs/classes involved \n- Basic flow of how it works (based on what you found)\n`;\n\n// Prompt for counting/quantifying\nexport const COUNT_PROMPT = `You are counting items in a codebase.\n\n${NUCLEUS_COMMANDS}\n\n## STRATEGY \n1. (grep \"pattern\")\n2. (count RESULTS)\n3. <<<FINAL>>>There are N items matching the pattern.<<<END>>>\n\nTHIS SHOULD TAKE 2-3 TURNS MAXIMUM.\n`;\n\n// Prompt for quick searches\nexport const SEARCH_PROMPT = `You are searching for specific code.\n\n${NUCLEUS_COMMANDS}\n\n## STRATEGY\n1. (grep \"pattern\")\n2. (take RESULTS 20) if too many\n3. Report what you found with file paths\n\nPROVIDE FINAL ANSWER BY TURN 4.\n`;\n\n/**\n * Detect query type and select best prompt\n */\nexport function selectPrompt(query: string): string {\n const q = query.toLowerCase();\n \n // Count queries - fastest\n if (/how many|count|number of|total|how much/.test(q)) {\n return COUNT_PROMPT;\n }\n \n // Simple search queries\n if (/^(find|search|show|list|where is|locate)\\b/.test(q) && q.length < 50) {\n return SEARCH_PROMPT;\n }\n \n // Architecture/overview queries \n if (/architect|structure|overview|module|organization|main.*component|summar|layout/.test(q)) {\n return ARCHITECTURE_PROMPT;\n }\n \n // Implementation queries\n if (/how does|how is|implement|work|handle|process|flow/.test(q)) {\n return IMPLEMENTATION_PROMPT;\n }\n \n // Default\n return CODEBASE_ANALYSIS_PROMPT;\n}\n\n/**\n * Build system prompt with query-specific guidance\n */\nexport function buildSystemPrompt(query: string): string {\n return selectPrompt(query);\n}\n\n/**\n * Get the turn limit based on query type\n */\nexport function getTurnLimit(query: string): number {\n const q = query.toLowerCase();\n \n if (/how many|count/.test(q)) return 5;\n if (/^(find|search|show|list)\\b/.test(q) && q.length < 50) return 6;\n if (/architect|overview|structure|module/.test(q)) return 12;\n if (/how does|how is|implement|work/.test(q)) return 12; // Implementation needs more\n \n return 12; // Default\n}\n","/**\n * Argus AI Providers\n * \n * Factory for creating AI providers based on configuration.\n */\n\nimport { ArgusConfig, ProviderType, ProviderConfig } from '../core/config.js';\nimport { AIProvider } from './types.js';\nimport { createZAIProvider, createOpenAIProvider, createDeepSeekProvider } from './openai-compatible.js';\nimport { createOllamaProvider } from './ollama.js';\nimport { createAnthropicProvider } from './anthropic.js';\n\nexport type { AIProvider, Message, CompletionOptions, CompletionResult, ProviderConfig } from './types.js';\nexport { createZAIProvider, createOpenAIProvider, createDeepSeekProvider } from './openai-compatible.js';\nexport { createOllamaProvider, OllamaProvider } from './ollama.js';\nexport { createAnthropicProvider } from './anthropic.js';\n\n/**\n * Create an AI provider from Argus configuration\n */\nexport function createProvider(config: ArgusConfig): AIProvider {\n const providerType = config.provider;\n const providerConfig = config.providers[providerType];\n \n if (!providerConfig) {\n throw new Error(`No configuration found for provider: ${providerType}`);\n }\n \n return createProviderByType(providerType, providerConfig);\n}\n\n/**\n * Create an AI provider by type and config\n */\nexport function createProviderByType(type: ProviderType, config: ProviderConfig): AIProvider {\n switch (type) {\n case 'zai':\n return createZAIProvider(config);\n case 'openai':\n return createOpenAIProvider(config);\n case 'deepseek':\n return createDeepSeekProvider(config);\n case 'ollama':\n return createOllamaProvider(config);\n case 'anthropic':\n return createAnthropicProvider(config);\n default:\n throw new Error(`Unknown provider type: ${type}`);\n }\n}\n\n/**\n * Get a human-readable name for a provider\n */\nexport function getProviderDisplayName(type: ProviderType): string {\n switch (type) {\n case 'zai':\n return 'ZAI (GLM)';\n case 'openai':\n return 'OpenAI';\n case 'deepseek':\n return 'DeepSeek';\n case 'ollama':\n return 'Ollama (Local)';\n case 'anthropic':\n return 'Anthropic (Claude)';\n default:\n return type;\n }\n}\n\n/**\n * List all available provider types\n */\nexport function listProviderTypes(): ProviderType[] {\n return ['zai', 'anthropic', 'openai', 'deepseek', 'ollama'];\n}\n","/**\n * OpenAI-Compatible Provider\n * \n * Works with OpenAI, ZAI (GLM), DeepSeek, and any OpenAI-compatible API.\n */\n\nimport { AIProvider, Message, CompletionOptions, CompletionResult, ProviderConfig } from './types.js';\n\nexport class OpenAICompatibleProvider implements AIProvider {\n name: string;\n private config: ProviderConfig;\n \n constructor(name: string, config: ProviderConfig) {\n this.name = name;\n this.config = config;\n \n if (!config.apiKey) {\n throw new Error(`API key is required for ${name} provider`);\n }\n \n if (!config.baseUrl) {\n throw new Error(`Base URL is required for ${name} provider`);\n }\n }\n \n async complete(messages: Message[], options?: CompletionOptions): Promise<CompletionResult> {\n const endpoint = `${this.config.baseUrl}/chat/completions`;\n \n const body = {\n model: this.config.model,\n messages: messages.map(m => ({\n role: m.role,\n content: m.content,\n })),\n temperature: options?.temperature ?? this.config.options?.temperature ?? 0.2,\n max_tokens: options?.maxTokens ?? this.config.options?.max_tokens ?? 4096,\n ...(options?.stopSequences && { stop: options.stopSequences }),\n };\n \n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`${this.name} API error (${response.status}): ${errorText}`);\n }\n \n const data = await response.json() as {\n choices: Array<{\n message: { content: string };\n finish_reason: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n };\n \n const choice = data.choices[0];\n \n return {\n content: choice.message.content || '',\n finishReason: choice.finish_reason === 'stop' ? 'stop' : \n choice.finish_reason === 'length' ? 'length' : 'error',\n usage: data.usage ? {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n } : undefined,\n };\n }\n \n async healthCheck(): Promise<boolean> {\n try {\n const result = await this.complete([\n { role: 'user', content: 'Say \"ok\"' }\n ], { maxTokens: 10 });\n return result.content.length > 0;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Create a provider for ZAI GLM models\n */\nexport function createZAIProvider(config: ProviderConfig): AIProvider {\n return new OpenAICompatibleProvider('ZAI', {\n ...config,\n baseUrl: config.baseUrl || 'https://api.z.ai/api/coding/paas/v4',\n model: config.model || 'glm-4.7',\n });\n}\n\n/**\n * Create a provider for OpenAI models\n */\nexport function createOpenAIProvider(config: ProviderConfig): AIProvider {\n return new OpenAICompatibleProvider('OpenAI', {\n ...config,\n baseUrl: config.baseUrl || 'https://api.openai.com/v1',\n model: config.model || 'gpt-4o',\n });\n}\n\n/**\n * Create a provider for DeepSeek models\n */\nexport function createDeepSeekProvider(config: ProviderConfig): AIProvider {\n return new OpenAICompatibleProvider('DeepSeek', {\n ...config,\n baseUrl: config.baseUrl || 'https://api.deepseek.com',\n model: config.model || 'deepseek-chat',\n });\n}\n","/**\n * Ollama Provider\n * \n * Provider for local Ollama models.\n */\n\nimport { AIProvider, Message, CompletionOptions, CompletionResult, ProviderConfig } from './types.js';\n\nexport class OllamaProvider implements AIProvider {\n name = 'Ollama';\n private config: ProviderConfig;\n \n constructor(config: ProviderConfig) {\n this.config = {\n ...config,\n baseUrl: config.baseUrl || 'http://localhost:11434',\n model: config.model || 'qwen2.5-coder:7b',\n };\n }\n \n async complete(messages: Message[], options?: CompletionOptions): Promise<CompletionResult> {\n const endpoint = `${this.config.baseUrl}/api/chat`;\n \n const body = {\n model: this.config.model,\n messages: messages.map(m => ({\n role: m.role,\n content: m.content,\n })),\n stream: false,\n options: {\n temperature: options?.temperature ?? this.config.options?.temperature ?? 0.2,\n num_ctx: this.config.options?.num_ctx ?? 8192,\n },\n };\n \n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Ollama API error (${response.status}): ${errorText}`);\n }\n \n const data = await response.json() as {\n message: { content: string };\n done: boolean;\n eval_count?: number;\n prompt_eval_count?: number;\n };\n \n return {\n content: data.message.content || '',\n finishReason: data.done ? 'stop' : 'error',\n usage: data.eval_count ? {\n promptTokens: data.prompt_eval_count || 0,\n completionTokens: data.eval_count,\n totalTokens: (data.prompt_eval_count || 0) + data.eval_count,\n } : undefined,\n };\n }\n \n async healthCheck(): Promise<boolean> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/tags`);\n if (!response.ok) return false;\n \n const data = await response.json() as { models: Array<{ name: string }> };\n const hasModel = data.models.some(m => \n m.name === this.config.model || m.name.startsWith(this.config.model + ':')\n );\n \n return hasModel;\n } catch {\n return false;\n }\n }\n \n /**\n * List available models\n */\n async listModels(): Promise<string[]> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/tags`);\n if (!response.ok) return [];\n \n const data = await response.json() as { models: Array<{ name: string }> };\n return data.models.map(m => m.name);\n } catch {\n return [];\n }\n }\n}\n\nexport function createOllamaProvider(config: ProviderConfig): OllamaProvider {\n return new OllamaProvider(config);\n}\n","/**\n * Anthropic Provider\n * \n * Provider for Claude models via the Anthropic API.\n */\n\nimport { AIProvider, Message, CompletionOptions, CompletionResult, ProviderConfig } from './types.js';\n\nexport class AnthropicProvider implements AIProvider {\n name = 'Anthropic';\n private config: ProviderConfig;\n \n constructor(config: ProviderConfig) {\n if (!config.apiKey) {\n throw new Error('API key is required for Anthropic provider');\n }\n \n this.config = {\n ...config,\n baseUrl: config.baseUrl || 'https://api.anthropic.com',\n model: config.model || 'claude-sonnet-4-20250514',\n };\n }\n \n async complete(messages: Message[], options?: CompletionOptions): Promise<CompletionResult> {\n const endpoint = `${this.config.baseUrl}/v1/messages`;\n \n // Extract system message if present\n const systemMessage = messages.find(m => m.role === 'system');\n const nonSystemMessages = messages.filter(m => m.role !== 'system');\n \n const body = {\n model: this.config.model,\n max_tokens: options?.maxTokens ?? this.config.options?.max_tokens ?? 4096,\n ...(systemMessage && { system: systemMessage.content }),\n messages: nonSystemMessages.map(m => ({\n role: m.role,\n content: m.content,\n })),\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\n ...(options?.stopSequences && { stop_sequences: options.stopSequences }),\n };\n \n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey!,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify(body),\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Anthropic API error (${response.status}): ${errorText}`);\n }\n \n const data = await response.json() as {\n content: Array<{ type: string; text: string }>;\n stop_reason: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n };\n };\n \n const textContent = data.content\n .filter(c => c.type === 'text')\n .map(c => c.text)\n .join('');\n \n return {\n content: textContent,\n finishReason: data.stop_reason === 'end_turn' ? 'stop' : \n data.stop_reason === 'max_tokens' ? 'length' : 'error',\n usage: {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.input_tokens + data.usage.output_tokens,\n },\n };\n }\n \n async healthCheck(): Promise<boolean> {\n try {\n const result = await this.complete([\n { role: 'user', content: 'Say \"ok\"' }\n ], { maxTokens: 10 });\n return result.content.length > 0;\n } catch {\n return false;\n }\n }\n}\n\nexport function createAnthropicProvider(config: ProviderConfig): AIProvider {\n return new AnthropicProvider(config);\n}\n"],"mappings":"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","names":["resolve","fs","path","renderGlobalOnboarding","renderProjectOnboarding","existsSync","readFileSync","writeFileSync","statSync","readdirSync","mkdirSync","homedir","join","basename","path","execSync","existsSync","readFileSync","writeFileSync","join","content","readFileSync","writeFileSync","join","extname","join","extname","readFileSync","writeFileSync","readFileSync","readFileSync","execSync","path","existsSync","statSync","join","homedir","basename","readdirSync","writeFileSync","readFileSync","mkdirSync","parts","current"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/core/onboarding-ui.tsx","../src/core/onboarding.ts","../src/cli.ts","../src/core/config.ts","../src/core/snapshot.ts","../src/core/enhanced-snapshot.ts","../src/core/engine.ts","../src/core/prompts.ts","../src/providers/index.ts","../src/providers/openai-compatible.ts","../src/providers/ollama.ts","../src/providers/anthropic.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Argus Onboarding UI - Clean wizard matching Claude Code style\n * \n * Design principles from Claude Code:\n * - Tab bar at top with \"(tab to cycle)\"\n * - Clean list items with ○/● indicators\n * - › for current selection\n * - Footer with keyboard hints\n * - No boxes or borders, just spacing\n * - CONSISTENT controls: Space/Enter both work everywhere\n */\n\nimport React, { useState, useCallback } from 'react';\nimport { render, Box, Text, useInput, useApp } from 'ink';\nimport type { ExperienceLevel, OnboardingConfig, ProjectOnboardingConfig, DetectedKeyFile } from './onboarding.js';\nimport { COMMON_KEY_FILE_PATTERNS, DEFAULT_ONBOARDING_CONFIG } from './onboarding.js';\n\n// ============================================================================\n// Shared Components\n// ============================================================================\n\ninterface TabBarProps {\n tabs: string[];\n activeIndex: number;\n}\n\nfunction TabBar({ tabs, activeIndex }: TabBarProps) {\n return (\n <Box marginBottom={1}>\n {tabs.map((tab, i) => (\n <React.Fragment key={tab}>\n {i === activeIndex ? (\n <Text bold inverse> {tab} </Text>\n ) : (\n <Text dimColor> {tab} </Text>\n )}\n </React.Fragment>\n ))}\n <Text dimColor> (tab to cycle)</Text>\n </Box>\n );\n}\n\ninterface SelectItemProps {\n label: string;\n value?: string; // For displaying current value (bold + cyan)\n description?: string;\n isSelected: boolean;\n isCurrent: boolean;\n isMulti?: boolean;\n}\n\nfunction SelectItem({ label, value, description, isSelected, isCurrent, isMulti = false }: SelectItemProps) {\n const indicator = isMulti \n ? (isSelected ? '●' : '○')\n : (isSelected ? '●' : '○');\n \n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={isCurrent ? 'cyan' : undefined}>\n {isCurrent ? '› ' : ' '}\n </Text>\n <Text color={isSelected ? 'cyan' : 'gray'}>{indicator} </Text>\n <Text bold={isCurrent}>{label}</Text>\n {value && (\n <Text bold color=\"cyan\"> {value}</Text>\n )}\n </Box>\n {description && (\n <Box marginLeft={4}>\n <Text dimColor>{description}</Text>\n </Box>\n )}\n </Box>\n );\n}\n\ninterface FooterProps {\n hints: string[];\n}\n\nfunction Footer({ hints }: FooterProps) {\n return (\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" borderTop borderBottom={false} borderLeft={false} borderRight={false} paddingTop={0}>\n <Text dimColor>{hints.join(' · ')}</Text>\n </Box>\n );\n}\n\n// ============================================================================\n// Global Onboarding Wizard\n// ============================================================================\n\ninterface GlobalWizardProps {\n onComplete: (config: OnboardingConfig) => void;\n}\n\ntype GlobalTab = 'experience' | 'patterns' | 'behaviors' | 'confirm';\n\nfunction GlobalWizard({ onComplete }: GlobalWizardProps) {\n const { exit } = useApp();\n \n // Tab state\n const [activeTab, setActiveTab] = useState<GlobalTab>('experience');\n \n // Form state\n const [experienceLevel, setExperienceLevel] = useState<ExperienceLevel>('intermediate');\n const [selectedPatterns, setSelectedPatterns] = useState<Set<string>>(\n new Set(COMMON_KEY_FILE_PATTERNS.filter(p => p.default).map(p => p.pattern))\n );\n const [customPatterns, setCustomPatterns] = useState('');\n const [refreshStale, setRefreshStale] = useState(true);\n const [contextRestore, setContextRestore] = useState(true);\n const [trackNew, setTrackNew] = useState<'auto' | 'ask' | 'manual'>('auto');\n \n // List navigation\n const [cursorIndex, setCursorIndex] = useState(0);\n const [isEditingCustom, setIsEditingCustom] = useState(false);\n \n // Determine available tabs based on experience\n const getTabs = useCallback((): GlobalTab[] => {\n if (experienceLevel === 'beginner') return ['experience', 'confirm'];\n if (experienceLevel === 'intermediate') return ['experience', 'patterns', 'confirm'];\n return ['experience', 'patterns', 'behaviors', 'confirm'];\n }, [experienceLevel]);\n \n const tabs = getTabs();\n const tabIndex = tabs.indexOf(activeTab);\n \n // Handle completion\n const handleComplete = useCallback(() => {\n const allPatterns = [\n ...Array.from(selectedPatterns),\n ...(customPatterns ? customPatterns.split(',').map(p => p.trim()).filter(Boolean) : []),\n ];\n \n const config: OnboardingConfig = {\n experienceLevel,\n globalKeyPatterns: experienceLevel === 'beginner' \n ? DEFAULT_ONBOARDING_CONFIG.globalKeyPatterns \n : allPatterns,\n autoBehaviors: experienceLevel === 'expert'\n ? { refreshStaleSnapshots: refreshStale, contextRestoreOnCompact: contextRestore, trackNewKeyFiles: trackNew }\n : DEFAULT_ONBOARDING_CONFIG.autoBehaviors,\n projects: {},\n };\n \n onComplete(config);\n exit();\n }, [experienceLevel, selectedPatterns, customPatterns, refreshStale, contextRestore, trackNew, onComplete, exit]);\n \n // Input handling\n useInput((input, key) => {\n if (key.escape) {\n if (isEditingCustom) {\n setIsEditingCustom(false);\n } else {\n exit();\n }\n return;\n }\n \n // Tab navigation\n if (key.tab && !isEditingCustom) {\n const newIndex = key.shift \n ? (tabIndex - 1 + tabs.length) % tabs.length\n : (tabIndex + 1) % tabs.length;\n setActiveTab(tabs[newIndex]);\n setCursorIndex(0);\n return;\n }\n \n // If editing custom patterns\n if (isEditingCustom) {\n if (key.return) {\n setIsEditingCustom(false);\n } else if (key.backspace || key.delete) {\n setCustomPatterns(prev => prev.slice(0, -1));\n } else if (input && !key.ctrl && !key.meta) {\n setCustomPatterns(prev => prev + input);\n }\n return;\n }\n \n // Get current items count\n const getItemCount = () => {\n switch (activeTab) {\n case 'experience': return 3;\n case 'patterns': return COMMON_KEY_FILE_PATTERNS.length + 1; // +1 for custom\n case 'behaviors': return 3;\n case 'confirm': return 2;\n default: return 0;\n }\n };\n \n // List navigation\n if (key.upArrow) {\n setCursorIndex(prev => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow) {\n setCursorIndex(prev => Math.min(getItemCount() - 1, prev + 1));\n return;\n }\n \n // Selection - BOTH Space and Enter work everywhere for consistency\n if (key.return || input === ' ') {\n switch (activeTab) {\n case 'experience': {\n const levels: ExperienceLevel[] = ['beginner', 'intermediate', 'expert'];\n const selected = levels[cursorIndex];\n if (selected) {\n setExperienceLevel(selected);\n // Auto-advance to next tab\n const newTabs = selected === 'beginner' \n ? ['experience', 'confirm'] \n : selected === 'intermediate'\n ? ['experience', 'patterns', 'confirm']\n : ['experience', 'patterns', 'behaviors', 'confirm'];\n setActiveTab(newTabs[1] as GlobalTab);\n setCursorIndex(0);\n }\n break;\n }\n \n case 'patterns': {\n const isCustom = cursorIndex === COMMON_KEY_FILE_PATTERNS.length;\n if (isCustom) {\n setIsEditingCustom(true);\n } else {\n const pattern = COMMON_KEY_FILE_PATTERNS[cursorIndex];\n if (pattern) {\n setSelectedPatterns(prev => {\n const next = new Set(prev);\n if (next.has(pattern.pattern)) {\n next.delete(pattern.pattern);\n } else {\n next.add(pattern.pattern);\n }\n return next;\n });\n }\n }\n break;\n }\n \n case 'behaviors': {\n // Toggle the selected behavior\n if (cursorIndex === 0) {\n setRefreshStale(!refreshStale);\n } else if (cursorIndex === 1) {\n setContextRestore(!contextRestore);\n } else if (cursorIndex === 2) {\n // Cycle through options\n setTrackNew(trackNew === 'auto' ? 'ask' : trackNew === 'ask' ? 'manual' : 'auto');\n }\n break;\n }\n \n case 'confirm': {\n if (cursorIndex === 0) {\n handleComplete();\n } else {\n // Go back to previous tab\n setActiveTab(tabs[tabIndex - 1] || 'experience');\n setCursorIndex(0);\n }\n break;\n }\n }\n }\n });\n \n // Get tab display names\n const tabNames = tabs.map(t => {\n switch (t) {\n case 'experience': return 'Experience';\n case 'patterns': return 'Patterns';\n case 'behaviors': return 'Behaviors';\n case 'confirm': return 'Confirm';\n default: return t;\n }\n });\n \n // Get title for current tab\n const getTitle = () => {\n switch (activeTab) {\n case 'experience': return 'Select your experience level';\n case 'patterns': return `Key file patterns (${selectedPatterns.size} selected)`;\n case 'behaviors': return 'Configure auto behaviors';\n case 'confirm': return 'Ready to complete setup';\n default: return '';\n }\n };\n \n // Render experience items\n const renderExperience = () => {\n const items = [\n { id: 'beginner', label: 'Beginner', desc: 'Auto-setup, minimal questions' },\n { id: 'intermediate', label: 'Intermediate', desc: 'Smart defaults with confirmation' },\n { id: 'expert', label: 'Expert', desc: 'Full control over all settings' },\n ];\n \n return items.map((item, i) => (\n <SelectItem\n key={item.id}\n label={item.label}\n description={item.desc}\n isCurrent={i === cursorIndex}\n isSelected={item.id === experienceLevel}\n />\n ));\n };\n \n // Render patterns items\n const renderPatterns = () => {\n const patternItems = COMMON_KEY_FILE_PATTERNS.map((p, i) => (\n <SelectItem\n key={p.pattern}\n label={p.pattern}\n description={p.description}\n isCurrent={i === cursorIndex}\n isSelected={selectedPatterns.has(p.pattern)}\n isMulti\n />\n ));\n \n // Custom patterns item\n const customIndex = COMMON_KEY_FILE_PATTERNS.length;\n const customItem = isEditingCustom ? (\n <Box key=\"_custom\" flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\">› </Text>\n <Text color=\"gray\">○ </Text>\n <Text>Custom: </Text>\n <Text color=\"cyan\">{customPatterns}</Text>\n <Text color=\"cyan\" inverse> </Text>\n </Box>\n <Box marginLeft={4}>\n <Text dimColor>Type comma-separated patterns, Enter when done</Text>\n </Box>\n </Box>\n ) : (\n <SelectItem\n key=\"_custom\"\n label=\"Custom patterns...\"\n description={customPatterns || 'Add your own patterns'}\n isCurrent={cursorIndex === customIndex}\n isSelected={false}\n />\n );\n \n return [...patternItems, customItem];\n };\n \n // Render behaviors items\n const renderBehaviors = () => {\n const items = [\n { \n id: 'refresh', \n label: 'Auto-refresh snapshots:', \n value: refreshStale ? 'Yes' : 'No',\n desc: 'Refresh when snapshots become stale' \n },\n { \n id: 'context', \n label: 'Context restore:', \n value: contextRestore ? 'Yes' : 'No',\n desc: 'Auto-restore after compaction' \n },\n { \n id: 'track', \n label: 'New key files:', \n value: trackNew,\n desc: 'When new potential key files detected (auto/ask/manual)' \n },\n ];\n \n return items.map((item, i) => (\n <SelectItem\n key={item.id}\n label={item.label}\n value={item.value}\n description={item.desc}\n isCurrent={i === cursorIndex}\n isSelected={i === cursorIndex}\n isMulti\n />\n ));\n };\n \n // Render confirm items\n const renderConfirm = () => {\n return (\n <>\n <SelectItem\n label=\"Confirm and continue\"\n description=\"Save settings and install MCP server\"\n isCurrent={cursorIndex === 0}\n isSelected={cursorIndex === 0}\n />\n <SelectItem\n label=\"Go back\"\n description=\"Review settings\"\n isCurrent={cursorIndex === 1}\n isSelected={false}\n />\n </>\n );\n };\n \n // Get content for current tab\n const renderContent = () => {\n switch (activeTab) {\n case 'experience': return renderExperience();\n case 'patterns': return renderPatterns();\n case 'behaviors': return renderBehaviors();\n case 'confirm': return renderConfirm();\n default: return null;\n }\n };\n \n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">🔮 Argus Setup</Text>\n </Box>\n \n {/* Tab bar */}\n <TabBar tabs={tabNames} activeIndex={tabIndex} />\n \n {/* Title */}\n <Box marginBottom={1}>\n <Text bold>{getTitle()}</Text>\n </Box>\n \n {/* Content */}\n {renderContent()}\n \n {/* Scroll indicator */}\n {activeTab === 'patterns' && cursorIndex < COMMON_KEY_FILE_PATTERNS.length && (\n <Box marginLeft={2} marginTop={1}>\n <Text dimColor>↓ more below</Text>\n </Box>\n )}\n \n {/* Footer - consistent hint for all tabs */}\n <Footer hints={\n isEditingCustom \n ? ['Type patterns', 'Enter: done', 'Esc: cancel']\n : ['↑↓: navigate', 'Space/Enter: select', 'Tab: next section', 'Esc: cancel']\n } />\n </Box>\n );\n}\n\n// ============================================================================\n// Project Onboarding Wizard\n// ============================================================================\n\ninterface ProjectWizardProps {\n projectName: string;\n detectedFiles: DetectedKeyFile[];\n globalPatterns: string[];\n experienceLevel: ExperienceLevel;\n onComplete: (config: ProjectOnboardingConfig) => void;\n}\n\nfunction ProjectWizard({ \n projectName, \n detectedFiles, \n globalPatterns,\n experienceLevel,\n onComplete \n}: ProjectWizardProps) {\n const { exit } = useApp();\n \n // Separate pattern matches from other detections\n const patternMatches = detectedFiles.filter(f => f.matchedPattern);\n const otherFiles = detectedFiles.filter(f => !f.matchedPattern).slice(0, 10);\n const allFiles = [...patternMatches, ...otherFiles];\n \n // State\n const [selectedFiles, setSelectedFiles] = useState<Set<string>>(\n new Set(patternMatches.map(f => f.path))\n );\n const [cursorIndex, setCursorIndex] = useState(0);\n const [tab, setTab] = useState<'files' | 'confirm'>(allFiles.length > 0 ? 'files' : 'confirm');\n \n const tabs: ('files' | 'confirm')[] = allFiles.length > 0 ? ['files', 'confirm'] : ['confirm'];\n const tabIndex = tabs.indexOf(tab);\n \n const handleComplete = useCallback(() => {\n const config: ProjectOnboardingConfig = {\n keyFiles: Array.from(selectedFiles),\n customPatterns: [],\n lastScanDate: new Date().toISOString(),\n };\n onComplete(config);\n exit();\n }, [selectedFiles, onComplete, exit]);\n \n useInput((input, key) => {\n if (key.escape) {\n exit();\n return;\n }\n \n if (key.tab) {\n const newIndex = key.shift \n ? (tabIndex - 1 + tabs.length) % tabs.length\n : (tabIndex + 1) % tabs.length;\n setTab(tabs[newIndex]);\n setCursorIndex(0);\n return;\n }\n \n if (key.upArrow) {\n setCursorIndex(prev => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow) {\n const maxIndex = tab === 'files' ? allFiles.length - 1 : 1;\n setCursorIndex(prev => Math.min(maxIndex, prev + 1));\n return;\n }\n \n // Both Space and Enter work for consistency\n if (key.return || input === ' ') {\n if (tab === 'files') {\n const file = allFiles[cursorIndex];\n if (file) {\n setSelectedFiles(prev => {\n const next = new Set(prev);\n if (next.has(file.path)) {\n next.delete(file.path);\n } else {\n next.add(file.path);\n }\n return next;\n });\n }\n } else {\n if (cursorIndex === 0) {\n handleComplete();\n } else {\n setTab('files');\n setCursorIndex(0);\n }\n }\n }\n });\n \n const tabNames = tabs.map(t => t === 'files' ? 'Files' : 'Confirm');\n \n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📂 Project Setup: {projectName}</Text>\n </Box>\n \n {/* Tab bar */}\n <TabBar tabs={tabNames} activeIndex={tabIndex} />\n \n {/* Title */}\n <Box marginBottom={1}>\n <Text bold>\n {tab === 'files' \n ? `Select key files (${selectedFiles.size}/${allFiles.length} selected)`\n : 'Ready to continue'}\n </Text>\n </Box>\n \n {/* File list */}\n {tab === 'files' && (\n <>\n {patternMatches.length > 0 && (\n <Box marginBottom={1}>\n <Text dimColor>── Matches your patterns ──</Text>\n </Box>\n )}\n {allFiles.map((file, i) => {\n const isPatternMatch = patternMatches.includes(file);\n const showSeparator = i === patternMatches.length && otherFiles.length > 0;\n \n return (\n <React.Fragment key={file.path}>\n {showSeparator && (\n <Box marginY={1}>\n <Text dimColor>── Other detected files ──</Text>\n </Box>\n )}\n <SelectItem\n label={file.path}\n description={`${file.lines} lines · ${file.reason}`}\n isCurrent={i === cursorIndex}\n isSelected={selectedFiles.has(file.path)}\n isMulti\n />\n </React.Fragment>\n );\n })}\n {allFiles.length > 8 && cursorIndex < allFiles.length - 1 && (\n <Box marginLeft={2}>\n <Text dimColor>↓ more below</Text>\n </Box>\n )}\n </>\n )}\n \n {/* Confirm options */}\n {tab === 'confirm' && (\n <>\n <SelectItem\n label=\"Confirm and continue\"\n description={`Track ${selectedFiles.size} key file(s)`}\n isCurrent={cursorIndex === 0}\n isSelected={cursorIndex === 0}\n />\n <SelectItem\n label=\"Go back\"\n description=\"Review file selection\"\n isCurrent={cursorIndex === 1}\n isSelected={false}\n />\n </>\n )}\n \n {/* Footer - consistent hints */}\n <Footer hints={['↑↓: navigate', 'Space/Enter: select', 'Tab: next section', 'Esc: cancel']} />\n </Box>\n );\n}\n\n// ============================================================================\n// Render Functions\n// ============================================================================\n\nexport async function renderGlobalOnboarding(): Promise<OnboardingConfig> {\n return new Promise((resolve) => {\n const { waitUntilExit } = render(\n <GlobalWizard onComplete={resolve} />\n );\n waitUntilExit();\n });\n}\n\nexport async function renderProjectOnboarding(\n projectName: string,\n detectedFiles: DetectedKeyFile[],\n globalPatterns: string[],\n experienceLevel: ExperienceLevel\n): Promise<ProjectOnboardingConfig> {\n return new Promise((resolve) => {\n const { waitUntilExit } = render(\n <ProjectWizard\n projectName={projectName}\n detectedFiles={detectedFiles}\n globalPatterns={globalPatterns}\n experienceLevel={experienceLevel}\n onComplete={resolve}\n />\n );\n waitUntilExit();\n });\n}\n","/**\n * Argus Onboarding Module\n * \n * Interactive setup wizard that adapts to user experience level.\n * - Beginner: Automatic setup with sensible defaults\n * - Intermediate: Smart detection with confirmation\n * - Expert: Full control over all settings\n */\n\nimport type { Answers } from 'inquirer';\n\nexport type ExperienceLevel = 'beginner' | 'intermediate' | 'expert';\n\nexport interface OnboardingConfig {\n experienceLevel: ExperienceLevel;\n globalKeyPatterns: string[];\n autoBehaviors: {\n refreshStaleSnapshots: boolean;\n contextRestoreOnCompact: boolean;\n trackNewKeyFiles: 'auto' | 'ask' | 'manual';\n };\n projects: Record<string, ProjectOnboardingConfig>;\n}\n\nexport interface ProjectOnboardingConfig {\n keyFiles: string[];\n customPatterns: string[];\n lastScanDate?: string;\n}\n\n// Default key file patterns (not hardcoded assumptions - just common patterns)\nexport const COMMON_KEY_FILE_PATTERNS = [\n { pattern: 'STATUS*', description: 'Project status tracking', default: true },\n { pattern: 'README*', description: 'Project documentation', default: true },\n { pattern: 'TODO*', description: 'Task lists', default: true },\n { pattern: 'ROADMAP*', description: 'Project roadmap', default: false },\n { pattern: 'PROGRESS*', description: 'Progress tracking', default: false },\n { pattern: 'CHANGELOG*', description: 'Version history', default: false },\n { pattern: 'ARCHITECTURE*', description: 'Architecture docs', default: false },\n { pattern: 'DEVELOPMENT*', description: 'Development notes', default: false },\n { pattern: '.plan', description: 'Plan files', default: false },\n { pattern: 'docs/architecture*', description: 'Architecture in docs/', default: false },\n];\n\n// Content signals that indicate a file might be important\nexport const CONTENT_SIGNALS = [\n 'roadmap',\n 'milestone',\n 'progress',\n 'status',\n 'todo',\n 'architecture',\n 'overview',\n 'getting started',\n];\n\nexport const DEFAULT_ONBOARDING_CONFIG: OnboardingConfig = {\n experienceLevel: 'beginner',\n globalKeyPatterns: ['STATUS*', 'README*', 'TODO*'],\n autoBehaviors: {\n refreshStaleSnapshots: true,\n contextRestoreOnCompact: true,\n trackNewKeyFiles: 'auto',\n },\n projects: {},\n};\n\n/**\n * Detect potential key files in a project directory\n * This doesn't assume anything - it finds candidates for the user to confirm\n */\nexport interface DetectedKeyFile {\n path: string;\n reason: string;\n lines: number;\n lastModified: Date;\n matchedPattern?: string;\n matchedSignal?: string;\n}\n\nexport function detectPotentialKeyFiles(\n projectPath: string,\n userPatterns: string[],\n fs: typeof import('fs'),\n path: typeof import('path')\n): DetectedKeyFile[] {\n const detected: DetectedKeyFile[] = [];\n \n function checkFile(filePath: string, relativePath: string): void {\n try {\n const stats = fs.statSync(filePath);\n if (!stats.isFile()) return;\n \n const fileName = path.basename(filePath).toLowerCase();\n const ext = path.extname(filePath).toLowerCase();\n \n // Only check text-like files\n if (!['.md', '.txt', '.org', ''].includes(ext)) return;\n \n let reason = '';\n let matchedPattern: string | undefined;\n let matchedSignal: string | undefined;\n \n // Check against user patterns\n for (const pattern of userPatterns) {\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$',\n 'i'\n );\n if (regex.test(fileName) || regex.test(relativePath)) {\n reason = `Matches pattern: ${pattern}`;\n matchedPattern = pattern;\n break;\n }\n }\n \n // If no pattern match, check content signals\n if (!reason && ext === '.md') {\n try {\n const content = fs.readFileSync(filePath, 'utf-8').toLowerCase();\n for (const signal of CONTENT_SIGNALS) {\n if (content.includes(signal)) {\n reason = `Contains \"${signal}\" keyword`;\n matchedSignal = signal;\n break;\n }\n }\n } catch {\n // Can't read file, skip\n }\n }\n \n // Root-level markdown files are often important\n if (!reason && ext === '.md' && !relativePath.includes('/')) {\n const lineCount = countLines(filePath, fs);\n if (lineCount > 50) {\n reason = 'Large markdown file in project root';\n }\n }\n \n if (reason) {\n detected.push({\n path: relativePath,\n reason,\n lines: countLines(filePath, fs),\n lastModified: stats.mtime,\n matchedPattern,\n matchedSignal,\n });\n }\n } catch {\n // Skip files we can't access\n }\n }\n \n function scanDir(dirPath: string, relativePath: string = ''): void {\n try {\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\n \n for (const entry of entries) {\n // Skip common non-essential directories\n if (entry.isDirectory()) {\n if (['node_modules', '.git', 'target', 'dist', 'build', '.next', \n 'coverage', '__pycache__', '.venv', 'vendor'].includes(entry.name)) {\n continue;\n }\n // Only scan a couple levels deep for key files\n if (relativePath.split('/').filter(Boolean).length < 2) {\n scanDir(\n path.join(dirPath, entry.name),\n relativePath ? `${relativePath}/${entry.name}` : entry.name\n );\n }\n } else {\n checkFile(\n path.join(dirPath, entry.name),\n relativePath ? `${relativePath}/${entry.name}` : entry.name\n );\n }\n }\n } catch {\n // Skip directories we can't access\n }\n }\n \n scanDir(projectPath);\n \n // Sort by relevance: pattern matches first, then by line count (bigger = more important)\n return detected.sort((a, b) => {\n if (a.matchedPattern && !b.matchedPattern) return -1;\n if (!a.matchedPattern && b.matchedPattern) return 1;\n return b.lines - a.lines;\n });\n}\n\nfunction countLines(filePath: string, fs: typeof import('fs')): number {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n return content.split('\\n').length;\n } catch {\n return 0;\n }\n}\n\n/**\n * Interactive Global Onboarding\n * Called during `argus mcp install` first run\n * Uses ink-based wizard UI for a clean, tabbed interface\n */\nexport async function runGlobalOnboarding(): Promise<OnboardingConfig> {\n // Use the ink-based wizard UI\n const { renderGlobalOnboarding } = await import('./onboarding-ui.js');\n \n const config = await renderGlobalOnboarding();\n \n // Show completion summary\n console.log('\\n✅ Onboarding complete!');\n console.log(` Experience level: ${config.experienceLevel}`);\n console.log(` Key patterns: ${config.globalKeyPatterns.join(', ')}`);\n \n return config;\n}\n\n/**\n * Interactive Project Onboarding\n * Called during `argus setup .` to configure project-specific settings\n * Uses ink-based wizard UI for a clean, tabbed interface\n */\nexport async function runProjectOnboarding(\n projectPath: string,\n globalConfig: OnboardingConfig,\n fs: typeof import('fs'),\n path: typeof import('path')\n): Promise<ProjectOnboardingConfig> {\n const projectName = path.basename(projectPath);\n \n console.log(`\\n📂 Scanning project: ${projectName}\\n`);\n \n // Detect potential key files\n const detected = detectPotentialKeyFiles(projectPath, globalConfig.globalKeyPatterns, fs, path);\n \n // For beginners, auto-select pattern matches (no wizard)\n if (globalConfig.experienceLevel === 'beginner') {\n const autoSelected = detected\n .filter(d => d.matchedPattern)\n .map(d => d.path);\n \n if (autoSelected.length > 0) {\n console.log('✅ Auto-detected key files:');\n autoSelected.forEach(f => console.log(` • ${f}`));\n } else {\n console.log('ℹ️ No key files matching your patterns found');\n }\n \n return {\n keyFiles: autoSelected,\n customPatterns: [],\n lastScanDate: new Date().toISOString(),\n };\n }\n \n // For intermediate/expert, use the ink wizard\n const { renderProjectOnboarding } = await import('./onboarding-ui.js');\n \n const config = await renderProjectOnboarding(\n projectName,\n detected,\n globalConfig.globalKeyPatterns,\n globalConfig.experienceLevel\n );\n \n if (config.keyFiles.length > 0) {\n console.log(`\\n✅ Tracking ${config.keyFiles.length} key file(s)`);\n }\n \n return config;\n}\n\n/**\n * Format a summary of detected files for display\n */\nexport function formatDetectionSummary(detected: DetectedKeyFile[]): string {\n if (detected.length === 0) {\n return 'No potential key files detected';\n }\n \n const lines: string[] = [];\n lines.push(`Found ${detected.length} potential key file(s):\\n`);\n \n const patternMatches = detected.filter(d => d.matchedPattern);\n const others = detected.filter(d => !d.matchedPattern);\n \n if (patternMatches.length > 0) {\n lines.push('Matches your patterns:');\n patternMatches.forEach(d => {\n lines.push(` ✓ ${d.path} (${d.lines} lines)`);\n });\n }\n \n if (others.length > 0) {\n lines.push('\\nAdditional suggestions:');\n others.slice(0, 5).forEach(d => {\n lines.push(` ? ${d.path} - ${d.reason}`);\n });\n }\n \n return lines.join('\\n');\n}\n\n","/**\n * Argus CLI\n * \n * Command-line interface for Argus codebase intelligence.\n */\n\nimport { Command } from 'commander';\nimport { existsSync, readFileSync, writeFileSync, statSync, unlinkSync, readdirSync, mkdirSync } from 'fs';\nimport * as fs from 'fs';\nimport { homedir } from 'os';\nimport { join, resolve, basename } from 'path';\nimport * as path from 'path';\nimport { execSync } from 'child_process';\n\nimport {\n loadConfig,\n saveConfig,\n getConfigPath,\n ensureConfigDir,\n validateConfig,\n PROVIDER_DEFAULTS,\n ArgusConfig,\n ProviderType,\n} from './core/config.js';\nimport { createSnapshot, getSnapshotStats } from './core/snapshot.js';\nimport { createEnhancedSnapshot } from './core/enhanced-snapshot.js';\nimport { analyze, searchDocument } from './core/engine.js';\nimport { createProvider, listProviderTypes, getProviderDisplayName } from './providers/index.js';\nimport {\n runGlobalOnboarding,\n runProjectOnboarding,\n detectPotentialKeyFiles,\n formatDetectionSummary,\n DEFAULT_ONBOARDING_CONFIG,\n} from './core/onboarding.js';\n\nconst program = new Command();\n\nprogram\n .name('argus')\n .description('Codebase Intelligence Beyond Context Limits')\n .version('2.0.6');\n\n// ============================================================================\n// argus init\n// ============================================================================\nprogram\n .command('init')\n .description('Interactive setup wizard')\n .action(async () => {\n console.log('\\n🔮 Argus Setup Wizard\\n');\n console.log('This will configure your AI provider and create ~/.argus/config.json\\n');\n \n // Dynamic import for inquirer (ESM)\n const inquirer = await import('inquirer');\n \n const providers = listProviderTypes();\n const providerChoices = providers.map(p => ({\n name: `${getProviderDisplayName(p)} - ${getProviderDescription(p)}`,\n value: p,\n }));\n \n const answers = await inquirer.default.prompt([\n {\n type: 'list',\n name: 'provider',\n message: 'Select your AI provider:',\n choices: providerChoices,\n },\n {\n type: 'input',\n name: 'apiKey',\n message: 'Enter your API key:',\n when: (ans: { provider: ProviderType }) => ans.provider !== 'ollama',\n validate: (input: string) => input.length > 0 || 'API key is required',\n },\n {\n type: 'input',\n name: 'model',\n message: 'Enter model name (leave empty for default):',\n default: (ans: { provider: ProviderType }) => PROVIDER_DEFAULTS[ans.provider]?.model || '',\n },\n {\n type: 'input',\n name: 'baseUrl',\n message: 'Enter custom base URL (leave empty for default):',\n when: (ans: { provider: ProviderType }) => ans.provider === 'ollama',\n default: 'http://localhost:11434',\n },\n ]);\n \n // Build config\n const config: ArgusConfig = {\n provider: answers.provider,\n providers: {\n [answers.provider]: {\n ...(answers.apiKey && { apiKey: answers.apiKey }),\n ...(answers.baseUrl && { baseUrl: answers.baseUrl }),\n model: answers.model || PROVIDER_DEFAULTS[answers.provider as ProviderType]?.model || '',\n ...PROVIDER_DEFAULTS[answers.provider as ProviderType],\n },\n },\n defaults: {\n maxTurns: 15,\n turnTimeoutMs: 60000,\n snapshotExtensions: ['ts', 'tsx', 'js', 'jsx', 'rs', 'py', 'go', 'java', 'rb', 'php', 'md'],\n excludePatterns: ['node_modules', '.git', 'target', 'dist', 'build', '.next'],\n },\n };\n \n saveConfig(config);\n console.log(`\\n✅ Configuration saved to ${getConfigPath()}`);\n \n // Test connection\n console.log('\\n🔍 Testing connection...');\n try {\n const provider = createProvider(config);\n const healthy = await provider.healthCheck();\n if (healthy) {\n console.log('✅ Connection successful!\\n');\n } else {\n console.log('⚠️ Connection test failed. Please check your configuration.\\n');\n }\n } catch (error) {\n console.log(`⚠️ Connection test failed: ${error instanceof Error ? error.message : error}\\n`);\n }\n \n console.log('Next steps:');\n console.log(' argus snapshot ./my-project -o snapshot.txt');\n console.log(' argus analyze snapshot.txt \"What are the main modules?\"');\n console.log(' argus mcp install # Add to Claude Code');\n });\n\n// ============================================================================\n// argus update\n// ============================================================================\nprogram\n .command('update')\n .description('Update Argus to the latest version')\n .action(() => {\n console.log('\\n🔄 Updating Argus...\\n');\n \n try {\n execSync('npm install -g https://github.com/sashabogi/argus/tarball/main', { stdio: 'inherit' });\n console.log('\\n✅ Argus updated successfully!');\n console.log('\\nRun `argus --version` to check the new version.');\n } catch (error) {\n console.error('\\n❌ Update failed. Try manually:');\n console.error(' npm install -g https://github.com/sashabogi/argus/tarball/main');\n process.exit(1);\n }\n });\n\n// ============================================================================\n// argus analyze\n// ============================================================================\nprogram\n .command('analyze <path> <query>')\n .description('Analyze a codebase or snapshot with AI')\n .option('-p, --provider <provider>', 'Override default provider')\n .option('-t, --max-turns <n>', 'Maximum reasoning turns', '15')\n .option('-v, --verbose', 'Show detailed execution logs')\n .action(async (path: string, query: string, opts) => {\n const config = loadConfig();\n \n if (opts.provider) {\n config.provider = opts.provider as ProviderType;\n }\n \n const errors = validateConfig(config);\n if (errors.length > 0) {\n console.error('Configuration errors:');\n errors.forEach(e => console.error(` - ${e}`));\n console.error('\\nRun `argus init` to configure.');\n process.exit(1);\n }\n \n const resolvedPath = resolve(path);\n \n if (!existsSync(resolvedPath)) {\n console.error(`File not found: ${resolvedPath}`);\n process.exit(1);\n }\n \n // Check if it's a directory - if so, create a temporary snapshot\n let snapshotPath = resolvedPath;\n let tempSnapshot = false;\n \n const stats = statSync(resolvedPath);\n if (stats.isDirectory()) {\n console.log('📸 Creating snapshot of codebase...');\n snapshotPath = join(homedir(), '.argus', `temp-${Date.now()}.txt`);\n ensureConfigDir();\n \n const result = createEnhancedSnapshot(resolvedPath, snapshotPath, {\n extensions: config.defaults.snapshotExtensions,\n excludePatterns: config.defaults.excludePatterns,\n });\n \n console.log(` ${result.fileCount} files, ${formatSize(result.totalSize)} (enhanced)`);\n tempSnapshot = true;\n }\n \n console.log(`\\n🔍 Analyzing with ${getProviderDisplayName(config.provider)}...`);\n console.log(` Query: ${query}\\n`);\n \n try {\n const provider = createProvider(config);\n const result = await analyze(provider, snapshotPath, query, {\n maxTurns: parseInt(opts.maxTurns),\n verbose: opts.verbose,\n onProgress: (turn, cmd) => {\n if (!opts.verbose) {\n process.stdout.write(`\\r Turn ${turn}: ${cmd.slice(0, 50)}...`);\n }\n },\n });\n \n if (!opts.verbose) {\n console.log('\\n');\n }\n \n if (result.success) {\n console.log('📋 Answer:\\n');\n console.log(result.answer);\n console.log(`\\n(${result.turns} turns, ${result.commands.length} commands)`);\n } else {\n console.log('⚠️ Analysis incomplete:');\n console.log(result.answer);\n if (result.error) {\n console.log(`Error: ${result.error}`);\n }\n }\n } finally {\n // Clean up temp snapshot\n if (tempSnapshot && existsSync(snapshotPath)) {\n unlinkSync(snapshotPath);\n }\n }\n });\n\n// ============================================================================\n// argus snapshot\n// ============================================================================\nprogram\n .command('snapshot <path>')\n .description('Create a codebase snapshot for analysis')\n .option('-o, --output <file>', 'Output file path')\n .option('-e, --extensions <exts>', 'File extensions to include (comma-separated)')\n .option('--exclude <patterns>', 'Patterns to exclude (comma-separated)')\n .option('--basic', 'Skip structural metadata (faster, smaller snapshot)')\n .action((path: string, opts) => {\n const config = loadConfig();\n const resolvedPath = resolve(path);\n \n if (!existsSync(resolvedPath)) {\n console.error(`Path not found: ${resolvedPath}`);\n process.exit(1);\n }\n \n const outputPath = opts.output || `${basename(resolvedPath)}-snapshot.txt`;\n \n console.log('📸 Creating codebase snapshot...');\n console.log(` Source: ${resolvedPath}`);\n console.log(` Output: ${outputPath}`);\n \n const extensions = opts.extensions \n ? opts.extensions.split(',').map((e: string) => e.trim())\n : config.defaults.snapshotExtensions;\n \n const excludePatterns = opts.exclude\n ? opts.exclude.split(',').map((p: string) => p.trim())\n : config.defaults.excludePatterns;\n \n if (opts.basic) {\n console.log(' Mode: Basic (no structural metadata)');\n } else {\n console.log(' Mode: Enhanced (with import graph & exports index)');\n }\n \n const result = opts.basic\n ? createSnapshot(resolvedPath, outputPath, { extensions, excludePatterns })\n : createEnhancedSnapshot(resolvedPath, outputPath, { extensions, excludePatterns });\n \n console.log(`\\n✅ Snapshot created!`);\n console.log(` Files: ${result.fileCount}`);\n console.log(` Lines: ${result.totalLines.toLocaleString()}`);\n console.log(` Size: ${formatSize(result.totalSize)}`);\n \n if (!opts.basic && 'metadata' in result) {\n const meta = result.metadata;\n console.log(`\\n📊 Structural Metadata:`);\n console.log(` Imports tracked: ${meta.imports.length}`);\n console.log(` Exports indexed: ${meta.exports.length}`);\n console.log(` Symbols indexed: ${Object.keys(meta.symbolIndex).length}`);\n }\n \n console.log(`\\nAnalyze with:`);\n console.log(` argus analyze ${outputPath} \"Your query here\"`);\n });\n\n// ============================================================================\n// argus query\n// ============================================================================\nprogram\n .command('query <snapshot> <query>')\n .description('Query an existing snapshot')\n .option('-v, --verbose', 'Show detailed execution logs')\n .action(async (snapshot: string, query: string, opts) => {\n // Alias for analyze with a snapshot file\n await program.commands.find(c => c.name() === 'analyze')?.parseAsync([\n snapshot, query,\n ...(opts.verbose ? ['-v'] : []),\n ], { from: 'user' });\n });\n\n// ============================================================================\n// argus search\n// ============================================================================\nprogram\n .command('search <snapshot> <pattern>')\n .description('Fast grep search (no AI)')\n .option('-i, --ignore-case', 'Case-insensitive search')\n .option('-n, --max-results <n>', 'Maximum results', '50')\n .action((snapshot: string, pattern: string, opts) => {\n const resolvedPath = resolve(snapshot);\n \n if (!existsSync(resolvedPath)) {\n console.error(`File not found: ${resolvedPath}`);\n process.exit(1);\n }\n \n console.log(`🔍 Searching for: ${pattern}\\n`);\n \n const matches = searchDocument(resolvedPath, pattern, {\n caseInsensitive: opts.ignoreCase,\n maxResults: parseInt(opts.maxResults),\n });\n \n if (matches.length === 0) {\n console.log('No matches found.');\n return;\n }\n \n console.log(`Found ${matches.length} matches:\\n`);\n \n for (const match of matches) {\n console.log(`${match.lineNum}: ${match.line.trim()}`);\n }\n });\n\n// ============================================================================\n// argus status - Check if snapshot is up to date\n// ============================================================================\nprogram\n .command('status [path]')\n .description('Check if snapshot is up to date')\n .option('-s, --snapshot <file>', 'Snapshot file to check', '.argus/snapshot.txt')\n .action((path: string | undefined, opts) => {\n const projectPath = path ? resolve(path) : process.cwd();\n const snapshotPath = resolve(projectPath, opts.snapshot);\n \n console.log('📊 Argus Status\\n');\n \n // Check if snapshot exists\n if (!existsSync(snapshotPath)) {\n console.log('❌ No snapshot found at:', snapshotPath);\n console.log('\\nCreate one with:');\n console.log(` argus snapshot ${projectPath} -o ${snapshotPath}`);\n return;\n }\n \n // Get snapshot stats\n const snapshotStats = statSync(snapshotPath);\n const snapshotAge = Date.now() - snapshotStats.mtimeMs;\n const ageHours = Math.floor(snapshotAge / (1000 * 60 * 60));\n const ageDays = Math.floor(ageHours / 24);\n \n console.log('Snapshot:', snapshotPath);\n console.log('Size:', formatSize(snapshotStats.size));\n \n if (ageDays > 0) {\n console.log('Age:', `${ageDays} day${ageDays > 1 ? 's' : ''} ago`);\n } else if (ageHours > 0) {\n console.log('Age:', `${ageHours} hour${ageHours > 1 ? 's' : ''} ago`);\n } else {\n console.log('Age:', 'Less than an hour ago');\n }\n \n // Count files modified since snapshot\n const config = loadConfig();\n let modifiedCount = 0;\n let newCount = 0;\n \n function checkDir(dir: string) {\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n \n // Skip excluded patterns\n if (config.defaults.excludePatterns.some(p => fullPath.includes(p))) {\n continue;\n }\n \n if (entry.isDirectory()) {\n checkDir(fullPath);\n } else if (entry.isFile()) {\n const ext = entry.name.split('.').pop() || '';\n if (config.defaults.snapshotExtensions.includes(ext)) {\n const fileStats = statSync(fullPath);\n if (fileStats.mtimeMs > snapshotStats.mtimeMs) {\n modifiedCount++;\n }\n if (fileStats.birthtimeMs > snapshotStats.mtimeMs) {\n newCount++;\n }\n }\n }\n }\n } catch {\n // Ignore permission errors\n }\n }\n \n checkDir(projectPath);\n \n console.log('\\nChanges since snapshot:');\n if (modifiedCount === 0 && newCount === 0) {\n console.log(' ✅ No changes detected - snapshot is current');\n } else {\n if (newCount > 0) {\n console.log(` 📄 ${newCount} new file${newCount > 1 ? 's' : ''}`);\n }\n if (modifiedCount > newCount) {\n console.log(` ✏️ ${modifiedCount - newCount} modified file${modifiedCount - newCount > 1 ? 's' : ''}`);\n }\n console.log('\\n⚠️ Snapshot may be stale. Refresh with:');\n console.log(` argus snapshot ${projectPath} -o ${snapshotPath}`);\n }\n \n // Recommendations based on age\n if (ageDays >= 7) {\n console.log('\\n💡 Tip: Snapshot is over a week old. Consider refreshing.');\n }\n });\n\n// ============================================================================\n// argus mcp install/uninstall\n// ============================================================================\nconst mcpCommand = program\n .command('mcp')\n .description('Manage Claude Code MCP integration');\n\nmcpCommand\n .command('install')\n .description('Install Argus as an MCP server for Claude Code (global)')\n .option('--no-claude-md', 'Skip global CLAUDE.md injection')\n .option('--no-onboarding', 'Skip interactive onboarding')\n .option('--reset-onboarding', 'Re-run onboarding even if already completed')\n .action(async (opts) => {\n let config = loadConfig();\n \n // Check if this is first install or user wants to reset onboarding\n const shouldOnboard = opts.resetOnboarding || (!config.onboardingComplete && opts.onboarding !== false);\n \n if (shouldOnboard) {\n try {\n const onboardingConfig = await runGlobalOnboarding();\n config.onboarding = onboardingConfig;\n config.onboardingComplete = true;\n saveConfig(config);\n } catch (error) {\n // If onboarding fails (e.g., non-interactive terminal), use defaults\n console.log('\\n⚠️ Interactive onboarding skipped (non-interactive terminal)');\n console.log(' Using default settings. Run `argus mcp install --reset-onboarding` to configure later.\\n');\n config.onboarding = DEFAULT_ONBOARDING_CONFIG;\n config.onboardingComplete = true;\n saveConfig(config);\n }\n }\n \n const errors = validateConfig(config);\n \n if (errors.length > 0) {\n console.error('Configuration errors - run `argus init` first:');\n errors.forEach(e => console.error(` - ${e}`));\n process.exit(1);\n }\n \n // Create the MCP wrapper script\n const wrapperPath = join(homedir(), '.argus', 'argus-mcp-wrapper');\n const providerConfig = config.providers[config.provider];\n \n let envVars = '';\n if (providerConfig?.apiKey) {\n envVars += `export ARGUS_API_KEY=\"${providerConfig.apiKey}\"\\n`;\n }\n if (providerConfig?.baseUrl) {\n envVars += `export ARGUS_BASE_URL=\"${providerConfig.baseUrl}\"\\n`;\n }\n \n const wrapperScript = `#!/bin/bash\n# Argus MCP Wrapper - Auto-generated\nexport PATH=\"/opt/homebrew/bin:/usr/local/bin:$HOME/.npm-global/bin:$PATH\"\nexport ARGUS_PROVIDER=\"${config.provider}\"\nexport ARGUS_MODEL=\"${providerConfig?.model || ''}\"\n${envVars}\nexec argus-mcp \"$@\"\n`;\n \n ensureConfigDir();\n writeFileSync(wrapperPath, wrapperScript, { mode: 0o755 });\n \n // Try to add to Claude Code\n try {\n execSync(`claude mcp remove argus -s user 2>/dev/null || true`, { stdio: 'ignore' });\n execSync(`claude mcp add argus -s user -- \"${wrapperPath}\"`, { stdio: 'inherit' });\n console.log('\\n✅ Argus MCP server installed for Claude Code!');\n } catch {\n console.log('\\n⚠️ Could not automatically add to Claude Code.');\n console.log('Add manually by running:');\n console.log(` claude mcp add argus -s user -- \"${wrapperPath}\"`);\n }\n \n // Inject into global CLAUDE.md (applies to ALL projects, ALL agents)\n if (opts.claudeMd !== false) {\n const globalClaudeMdPath = join(homedir(), '.claude', 'CLAUDE.md');\n \n if (existsSync(globalClaudeMdPath)) {\n let content = readFileSync(globalClaudeMdPath, 'utf-8');\n \n if (content.includes('## Codebase Intelligence (Argus)')) {\n console.log('✓ Global CLAUDE.md already has Argus section');\n } else {\n // Append Argus section\n content += GLOBAL_CLAUDE_MD_ARGUS_SECTION;\n writeFileSync(globalClaudeMdPath, content);\n console.log('✅ Added Argus section to global ~/.claude/CLAUDE.md');\n console.log(' → This applies to ALL projects and ALL sub-agents');\n }\n } else {\n // Create global CLAUDE.md directory if needed\n const claudeDir = join(homedir(), '.claude');\n if (!existsSync(claudeDir)) {\n mkdirSync(claudeDir, { recursive: true });\n }\n writeFileSync(globalClaudeMdPath, GLOBAL_CLAUDE_MD_ARGUS_SECTION.trim());\n console.log('✅ Created global ~/.claude/CLAUDE.md with Argus section');\n }\n }\n \n console.log('\\n📋 Next: Run `argus setup .` in any project to create a snapshot');\n });\n\nmcpCommand\n .command('uninstall')\n .description('Remove Argus from Claude Code')\n .action(() => {\n try {\n execSync('claude mcp remove argus -s user', { stdio: 'inherit' });\n console.log('\\n✅ Argus MCP server removed from Claude Code.');\n } catch {\n console.log('\\n⚠️ Could not remove from Claude Code.');\n console.log('Remove manually by running:');\n console.log(' claude mcp remove argus -s user');\n }\n });\n\n// ============================================================================\n// argus context - Generate persistent codebase knowledge for CLAUDE.md\n// ============================================================================\nconst contextCommand = program\n .command('context')\n .description('Generate architectural context for CLAUDE.md (survives compaction)');\n\ncontextCommand\n .command('generate <path>')\n .description('Generate architecture summary for a project')\n .option('-o, --output <file>', 'Output file (default: stdout)')\n .option('-f, --format <format>', 'Output format: markdown, json', 'markdown')\n .action(async (path: string, opts) => {\n const config = loadConfig();\n const errors = validateConfig(config);\n \n if (errors.length > 0) {\n console.error('Configuration errors - run `argus init` first:');\n errors.forEach(e => console.error(` - ${e}`));\n process.exit(1);\n }\n \n const resolvedPath = resolve(path);\n if (!existsSync(resolvedPath)) {\n console.error(`Path not found: ${resolvedPath}`);\n process.exit(1);\n }\n \n console.error('📸 Creating snapshot...');\n const snapshotPath = join(homedir(), '.argus', `context-${Date.now()}.txt`);\n ensureConfigDir();\n \n const snapshotResult = createEnhancedSnapshot(resolvedPath, snapshotPath, {\n extensions: config.defaults.snapshotExtensions,\n excludePatterns: config.defaults.excludePatterns,\n });\n \n console.error(` ${snapshotResult.fileCount} files, ${formatSize(snapshotResult.totalSize)} (enhanced)`);\n console.error('🧠 Analyzing architecture...\\n');\n \n try {\n const provider = createProvider(config);\n \n // First, get the module structure\n const moduleQuery = `List all the main directories/modules under src/ or the main source folder. \nFor each module, based on its file names and code, describe its purpose in ONE sentence.\nFormat as a bullet list: - **module_name/** - description`;\n \n const moduleResult = await analyze(provider, snapshotPath, moduleQuery, {\n maxTurns: 10,\n onProgress: (turn) => {\n process.stderr.write(`\\r Analyzing modules (turn ${turn})...`);\n },\n });\n \n console.error('\\n');\n \n // Second, get the key patterns\n const patternQuery = `What are the main coding patterns and conventions used? Look for:\n- Error handling approach\n- State management\n- API/data patterns\n- Testing patterns\nKeep it brief - one line per pattern.`;\n \n const patternResult = await analyze(provider, snapshotPath, patternQuery, {\n maxTurns: 8,\n onProgress: (turn) => {\n process.stderr.write(`\\r Analyzing patterns (turn ${turn})...`);\n },\n });\n \n console.error('\\n');\n \n // Third, get important files\n const filesQuery = `What are the 5-10 most important files that a developer should understand first?\nList with file paths and one-line descriptions.`;\n \n const filesResult = await analyze(provider, snapshotPath, filesQuery, {\n maxTurns: 8,\n onProgress: (turn) => {\n process.stderr.write(`\\r Finding key files (turn ${turn})...`);\n },\n });\n \n console.error('\\n');\n \n // Generate the output\n const projectName = basename(resolvedPath);\n const output = generateContextMarkdown(projectName, {\n modules: moduleResult.answer || 'Unable to analyze modules',\n patterns: patternResult.answer || 'Unable to analyze patterns',\n keyFiles: filesResult.answer || 'Unable to identify key files',\n fileCount: snapshotResult.fileCount,\n lineCount: snapshotResult.totalLines,\n });\n \n if (opts.output) {\n writeFileSync(opts.output, output);\n console.error(`✅ Context saved to ${opts.output}`);\n } else {\n console.log(output);\n }\n \n } finally {\n // Cleanup\n if (existsSync(snapshotPath)) {\n unlinkSync(snapshotPath);\n }\n }\n });\n\ncontextCommand\n .command('inject <path>')\n .description('Add/update architecture section in CLAUDE.md')\n .action(async (path: string) => {\n const resolvedPath = resolve(path);\n const claudeMdPath = join(resolvedPath, 'CLAUDE.md');\n \n // Generate context\n console.error('Generating context...\\n');\n \n // Create a child process to run generate and capture output\n const { execSync } = await import('child_process');\n \n try {\n const contextOutput = execSync(\n `argus context generate \"${resolvedPath}\"`,\n { encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024 }\n );\n \n const marker = '<!-- ARGUS:CONTEXT -->';\n const endMarker = '<!-- /ARGUS:CONTEXT -->';\n const wrappedContext = `${marker}\\n${contextOutput}\\n${endMarker}`;\n \n if (existsSync(claudeMdPath)) {\n let existing = readFileSync(claudeMdPath, 'utf-8');\n \n // Check if markers exist\n const markerRegex = new RegExp(`${marker}[\\\\s\\\\S]*?${endMarker}`, 'g');\n \n if (markerRegex.test(existing)) {\n // Replace existing section\n existing = existing.replace(markerRegex, wrappedContext);\n } else {\n // Append to end\n existing = existing.trim() + '\\n\\n' + wrappedContext;\n }\n \n writeFileSync(claudeMdPath, existing);\n console.log(`✅ Updated ${claudeMdPath}`);\n } else {\n // Create new CLAUDE.md\n writeFileSync(claudeMdPath, wrappedContext);\n console.log(`✅ Created ${claudeMdPath}`);\n }\n \n console.log('\\nClaude Code will now have persistent architectural knowledge!');\n console.log('This section survives compaction and restarts.');\n \n } catch (error) {\n console.error('Failed to generate context:', error);\n process.exit(1);\n }\n });\n\ncontextCommand\n .command('refresh <path>')\n .description('Regenerate architecture context (run after major changes)')\n .action(async (path: string) => {\n // Just an alias for inject\n const resolvedPath = resolve(path);\n console.log('Refreshing codebase context...\\n');\n execSync(`argus context inject \"${resolvedPath}\"`, { stdio: 'inherit' });\n });\n\nfunction generateContextMarkdown(projectName: string, data: {\n modules: string;\n patterns: string;\n keyFiles: string;\n fileCount: number;\n lineCount: number;\n}): string {\n return `## Codebase Intelligence (Auto-generated by Argus)\n\n> **This section provides architectural context that survives context compaction.**\n> Regenerate with: \\`argus context refresh .\\`\n\n### Project: ${projectName}\n- **Files:** ${data.fileCount}\n- **Lines:** ${data.lineCount.toLocaleString()}\n\n### Module Structure\n\n${data.modules}\n\n### Key Patterns & Conventions\n\n${data.patterns}\n\n### Important Files to Understand\n\n${data.keyFiles}\n\n### Using Argus for On-Demand Queries\n\nWhen you need more specific information about this codebase:\n\n\\`\\`\\`bash\n# Find where something is implemented\nargus analyze . \"Where is authentication handled?\"\n\n# Understand a specific module\nargus analyze . \"What does the cognition/ module do?\"\n\n# Find code patterns\nargus search .argus/snapshot.txt \"async fn.*Result\"\n\\`\\`\\`\n\n### After Compaction Checklist\n\nIf your context was compacted or you're starting fresh:\n1. ✅ This architecture section is still available (you're reading it)\n2. Query @argus for specific questions about the codebase\n3. Don't re-scan the entire codebase - use targeted queries\n\n`;\n}\n\n// ============================================================================\n// argus config\n// ============================================================================\nprogram\n .command('config [key] [value]')\n .description('View or modify configuration')\n .action((key?: string, value?: string) => {\n const config = loadConfig();\n \n if (!key) {\n // Show all config\n console.log('Current configuration:\\n');\n console.log(JSON.stringify(config, null, 2));\n console.log(`\\nConfig file: ${getConfigPath()}`);\n return;\n }\n \n if (!value) {\n // Show specific key\n const parts = key.split('.');\n let current: unknown = config;\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n console.error(`Key not found: ${key}`);\n process.exit(1);\n }\n }\n console.log(JSON.stringify(current, null, 2));\n return;\n }\n \n // Set value\n const parts = key.split('.');\n let current: Record<string, unknown> = config as unknown as Record<string, unknown>;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current)) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n \n // Try to parse JSON value\n try {\n current[parts[parts.length - 1]] = JSON.parse(value);\n } catch {\n current[parts[parts.length - 1]] = value;\n }\n \n saveConfig(config as unknown as ArgusConfig);\n console.log(`✅ Set ${key} = ${value}`);\n });\n\n// ============================================================================\n// Helpers\n// ============================================================================\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getProviderDescription(provider: ProviderType): string {\n switch (provider) {\n case 'zai': return 'GLM-4.7, best value for code';\n case 'anthropic': return 'Claude, highest quality';\n case 'openai': return 'GPT-4o, general purpose';\n case 'deepseek': return 'Budget-friendly';\n case 'ollama': return 'Free, local, private';\n default: return '';\n }\n}\n\n// ============================================================================\n// Global CLAUDE.md section - applies to ALL projects and ALL sub-agents\n// ============================================================================\nconst GLOBAL_CLAUDE_MD_ARGUS_SECTION = `\n\n## Codebase Intelligence (Argus) — ALL AGENTS\n\n> **This applies to the main session AND all sub-agents/tasks regardless of type.**\n\n### The Rule: Argus Before Multi-File Exploration\n\n**Before reading more than 3 files to understand a codebase, use Argus MCP tools:**\n\n1. **Check for snapshot**: Look for \\`.argus/snapshot.txt\\` in the project\n2. **Search first** (FREE): \\`search_codebase(\".argus/snapshot.txt\", \"pattern\")\\`\n3. **Understand if needed** (~500 tokens): \\`analyze_codebase(\".argus/snapshot.txt\", \"How does X work?\")\\`\n4. **Then read specific files**: Only the files Argus identified as relevant\n\n### Why This Matters\n\n| Without Argus | With Argus |\n|---------------|------------|\n| Read 15+ files = 5,000-50,000 tokens | search → read 2 files = 100-500 tokens |\n| Slow, expensive, loses context | Fast, cheap, efficient |\n\n### For Sub-Agents\n\nIf you are a sub-agent (coder, tester, reviewer, debugger, or ANY other type):\n1. Check if \\`.argus/snapshot.txt\\` exists in the project\n2. If exploring the codebase, use \\`search_codebase\\` first (it's free)\n3. This rule applies regardless of your specific role or instructions\n\n### Quick Reference\n\n| Tool | Cost | Use For |\n|------|------|---------|\n| \\`search_codebase\\` | FREE | Finding files, patterns, definitions |\n| \\`analyze_codebase\\` | ~500 tokens | Architecture questions, understanding flows |\n\n### No Snapshot?\n\nIf \\`.argus/snapshot.txt\\` doesn't exist, proceed normally with native tools.\nThe user can create one with: \\`argus setup .\\`\n`;\n\n// CLAUDE.md template for project setup - UNIVERSAL (works with any agent/skill setup)\nconst CLAUDE_MD_ARGUS_SECTION = `\n## Codebase Intelligence (Argus) — APPLIES TO ALL AGENTS\n\n> **This section applies to the main conversation AND all sub-agents/tasks.**\n> Any agent exploring the codebase should use Argus tools.\n\n### The Rule: Argus Before Multi-File Exploration\n\n**Before reading more than 3 files to understand the codebase, use Argus MCP tools:**\n\n\\`\\`\\`\n# Step 1: Search (FREE, instant)\nsearch_codebase(\".argus/snapshot.txt\", \"pattern-or-keyword\")\n\n# Step 2: If needed, understand architecture (~500 tokens) \nanalyze_codebase(\".argus/snapshot.txt\", \"How does X work?\")\n\n# Step 3: Read only the specific files you need\nRead(the-file-you-found.ts)\n\\`\\`\\`\n\n### Why This Matters\n\n| Approach | Tokens | Speed |\n|----------|--------|-------|\n| Read 15 files to find something | 5,000-50,000 | Slow |\n| search_codebase → Read 2 files | 100-500 | Fast |\n\n### Available Tools\n\n| Tool | Use For | Cost |\n|------|---------|------|\n| \\`search_codebase\\` | Find files, patterns, definitions | **FREE** |\n| \\`analyze_codebase\\` | Architecture, \"how does X work\" | ~500 tokens |\n| \\`create_snapshot\\` | Refresh after major changes | ~100 tokens |\n\n### When to Use What\n\n**Use Argus (\\`.argus/snapshot.txt\\`) for:**\n- Finding where something is defined or used\n- Understanding how modules connect\n- Debugging: \"where is this function called?\"\n- Architecture questions\n- After context compaction\n\n**Use native Read/Search for:**\n- Single file you already know\n- Quick edits to known locations\n- Files you just created\n\n### For Sub-Agents / Background Tasks\n\nIf you are a sub-agent or background task:\n1. Check if \\`.argus/snapshot.txt\\` exists\n2. Use \\`search_codebase\\` before reading multiple files\n3. This applies regardless of your specific role (coder, tester, reviewer, etc.)\n\n### Keeping Updated\n\n\\`\\`\\`bash\nargus status . # Check if stale\nargus snapshot . -o .argus/snapshot.txt # Refresh\n\\`\\`\\`\n`;\n\n// ============================================================================\n// argus setup - One-command project setup with interactive onboarding\n// ============================================================================\nprogram\n .command('setup [path]')\n .description('Set up Argus for a project (snapshot + key files + CLAUDE.md + .gitignore)')\n .option('--no-claude-md', 'Skip CLAUDE.md injection')\n .option('--no-gitignore', 'Skip .gitignore update')\n .option('--no-onboarding', 'Skip interactive key file selection')\n .action(async (pathArg: string | undefined, opts) => {\n const projectPath = pathArg ? resolve(pathArg) : process.cwd();\n \n console.log('🚀 Setting up Argus for project...\\n');\n console.log(` Project: ${projectPath}\\n`);\n \n // Load config (includes onboarding settings)\n const config = loadConfig();\n const onboardingConfig = config.onboarding || DEFAULT_ONBOARDING_CONFIG;\n \n // 1. Create .argus directory\n const argusDir = join(projectPath, '.argus');\n if (!existsSync(argusDir)) {\n mkdirSync(argusDir, { recursive: true });\n console.log('✅ Created .argus/ directory');\n } else {\n console.log('✓ .argus/ directory exists');\n }\n \n // 2. Run project onboarding (key file detection/selection)\n let projectConfig = onboardingConfig.projects[projectPath];\n \n if (!projectConfig && opts.onboarding !== false) {\n try {\n projectConfig = await runProjectOnboarding(projectPath, onboardingConfig, fs, path);\n \n // Save project config\n config.onboarding = config.onboarding || DEFAULT_ONBOARDING_CONFIG;\n config.onboarding.projects[projectPath] = projectConfig;\n saveConfig(config);\n \n if (projectConfig.keyFiles.length > 0) {\n console.log(`\\n✅ Tracking ${projectConfig.keyFiles.length} key file(s) for this project`);\n }\n } catch {\n // Non-interactive terminal, use auto-detection\n console.log('\\n⚠️ Interactive selection skipped (non-interactive terminal)');\n const detected = detectPotentialKeyFiles(projectPath, onboardingConfig.globalKeyPatterns, fs, path);\n projectConfig = {\n keyFiles: detected.filter(d => d.matchedPattern).map(d => d.path),\n customPatterns: [],\n lastScanDate: new Date().toISOString(),\n };\n }\n } else if (projectConfig) {\n console.log(`✓ Using existing project configuration (${projectConfig.keyFiles.length} key files)`);\n }\n \n // 3. Create enhanced snapshot\n const snapshotPath = join(argusDir, 'snapshot.txt');\n console.log('\\n📸 Creating codebase snapshot (enhanced)...');\n \n const result = createEnhancedSnapshot(projectPath, snapshotPath, {\n extensions: config.defaults.snapshotExtensions,\n excludePatterns: config.defaults.excludePatterns,\n });\n \n console.log(`✅ Snapshot created: ${result.fileCount} files, ${result.totalLines.toLocaleString()} lines`);\n if ('metadata' in result) {\n console.log(` Imports: ${result.metadata.imports.length} | Exports: ${result.metadata.exports.length} | Symbols: ${Object.keys(result.metadata.symbolIndex).length}`);\n }\n \n // 4. Save key files list to .argus/key-files.json for Claude to read\n if (projectConfig && projectConfig.keyFiles.length > 0) {\n const keyFilesPath = join(argusDir, 'key-files.json');\n writeFileSync(keyFilesPath, JSON.stringify({\n keyFiles: projectConfig.keyFiles,\n customPatterns: projectConfig.customPatterns,\n lastUpdated: new Date().toISOString(),\n }, null, 2));\n console.log('✅ Saved key files list to .argus/key-files.json');\n }\n \n // 5. Update .gitignore\n if (opts.gitignore !== false) {\n const gitignorePath = join(projectPath, '.gitignore');\n let gitignoreContent = '';\n \n if (existsSync(gitignorePath)) {\n gitignoreContent = readFileSync(gitignorePath, 'utf-8');\n }\n \n if (!gitignoreContent.includes('.argus')) {\n const addition = gitignoreContent.endsWith('\\n') ? '' : '\\n';\n writeFileSync(gitignorePath, gitignoreContent + addition + '\\n# Argus codebase intelligence\\n.argus/\\n');\n console.log('✅ Added .argus/ to .gitignore');\n } else {\n console.log('✓ .argus/ already in .gitignore');\n }\n }\n \n // 6. Inject CLAUDE.md instructions\n if (opts.claudeMd !== false) {\n const claudeMdPath = join(projectPath, 'CLAUDE.md');\n \n if (existsSync(claudeMdPath)) {\n let claudeMdContent = readFileSync(claudeMdPath, 'utf-8');\n \n if (claudeMdContent.includes('Codebase Intelligence (Argus)')) {\n console.log('✓ CLAUDE.md already has Argus section');\n } else {\n // Find a good place to inject - after first heading or at end\n const firstHeadingMatch = claudeMdContent.match(/^#[^#].*$/m);\n if (firstHeadingMatch && firstHeadingMatch.index !== undefined) {\n // Find the end of the first section (next heading or significant break)\n const afterFirstHeading = claudeMdContent.indexOf('\\n## ', firstHeadingMatch.index + 1);\n if (afterFirstHeading > 0) {\n // Insert before the second major section\n claudeMdContent = \n claudeMdContent.slice(0, afterFirstHeading) + \n '\\n' + CLAUDE_MD_ARGUS_SECTION + '\\n' +\n claudeMdContent.slice(afterFirstHeading);\n } else {\n // Append at end\n claudeMdContent += '\\n' + CLAUDE_MD_ARGUS_SECTION;\n }\n } else {\n // No headings found, append at end\n claudeMdContent += '\\n' + CLAUDE_MD_ARGUS_SECTION;\n }\n \n writeFileSync(claudeMdPath, claudeMdContent);\n console.log('✅ Added Argus section to CLAUDE.md');\n }\n } else {\n // Create new CLAUDE.md with Argus section\n const newClaudeMd = `# Project Intelligence\n\nThis project uses Argus for efficient codebase analysis.\n${CLAUDE_MD_ARGUS_SECTION}`;\n \n writeFileSync(claudeMdPath, newClaudeMd);\n console.log('✅ Created CLAUDE.md with Argus section');\n }\n }\n \n console.log('\\n🎉 Argus setup complete!\\n');\n console.log('Next steps:');\n console.log(' 1. Restart Claude Code to pick up CLAUDE.md changes');\n console.log(' 2. Ask Claude about your codebase architecture');\n console.log(' 3. Run `argus status` periodically to check if snapshot needs refresh');\n \n if (projectConfig && projectConfig.keyFiles.length > 0) {\n console.log(`\\n💡 Key files tracked for context restoration:`);\n projectConfig.keyFiles.slice(0, 5).forEach(f => console.log(` • ${f}`));\n if (projectConfig.keyFiles.length > 5) {\n console.log(` ... and ${projectConfig.keyFiles.length - 5} more`);\n }\n }\n });\n\n// ============================================================================\n// argus ui - Open the web UI for visualization\n// ============================================================================\nprogram\n .command('ui')\n .description('Open the Argus web UI for codebase visualization')\n .option('-p, --port <port>', 'Port to serve on', '3333')\n .option('--no-open', 'Do not open browser automatically')\n .action(async (opts) => {\n const uiPath = join(__dirname, '..', 'packages', 'ui');\n\n // Check if UI package exists and is built\n if (!existsSync(join(uiPath, 'package.json'))) {\n console.error('Argus UI package not found.');\n console.error('\\nThe UI package needs to be installed separately:');\n console.error(' cd packages/ui && npm install && npm run build');\n process.exit(1);\n }\n\n // Check if built\n const distPath = join(uiPath, 'dist');\n const hasBuiltUI = existsSync(distPath);\n\n console.log('Starting Argus UI...\\n');\n\n try {\n if (hasBuiltUI) {\n // Serve built static files\n console.log(` Serving built UI from ${distPath}`);\n console.log(` Open http://localhost:${opts.port} in your browser`);\n\n // Use a simple static file server\n const http = await import('http');\n\n const mimeTypes: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'text/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n };\n\n const server = http.createServer((req, res) => {\n let filePath = join(distPath, req.url === '/' ? 'index.html' : req.url || '');\n\n // Handle SPA routing - serve index.html for non-file routes\n if (!existsSync(filePath) && !filePath.includes('.')) {\n filePath = join(distPath, 'index.html');\n }\n\n if (existsSync(filePath)) {\n const ext = path.extname(filePath);\n const contentType = mimeTypes[ext] || 'application/octet-stream';\n const content = readFileSync(filePath);\n res.writeHead(200, { 'Content-Type': contentType });\n res.end(content);\n } else {\n res.writeHead(404);\n res.end('Not found');\n }\n });\n\n const port = parseInt(opts.port, 10);\n server.listen(port, () => {\n console.log(`\\nArgus UI running at http://localhost:${port}`);\n\n if (opts.open !== false) {\n // Open browser using spawn for safety\n const { spawn } = require('child_process');\n const openUrl = `http://localhost:${port}`;\n const openCmd = process.platform === 'darwin' ? 'open' :\n process.platform === 'win32' ? 'start' : 'xdg-open';\n spawn(openCmd, [openUrl], { detached: true, stdio: 'ignore' }).unref();\n }\n });\n\n // Keep running\n process.on('SIGINT', () => {\n console.log('\\n\\nShutting down Argus UI...');\n server.close();\n process.exit(0);\n });\n\n } else {\n // Run vite dev server\n console.log(` Running development server...`);\n console.log(` Port: ${opts.port}`);\n\n // Use spawn instead of execSync for safety\n const { spawn } = require('child_process');\n const vite = spawn('npm', ['run', 'dev', '--', '--port', opts.port], {\n cwd: uiPath,\n stdio: 'inherit',\n });\n\n process.on('SIGINT', () => {\n vite.kill();\n process.exit(0);\n });\n }\n } catch (error) {\n console.error('Failed to start UI server:', error);\n console.error('\\nTry building the UI first:');\n console.error(' cd packages/ui && npm install && npm run build');\n process.exit(1);\n }\n });\n\n// Run\nprogram.parse();\n","/**\n * Argus Configuration Management\n * \n * Handles loading, saving, and validating configuration for Argus.\n * Configuration is stored in ~/.argus/config.json\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport type { OnboardingConfig, ProjectOnboardingConfig } from './onboarding.js';\n\nexport type ProviderType = 'zai' | 'anthropic' | 'openai' | 'deepseek' | 'ollama';\n\n// Re-export onboarding types\nexport type { OnboardingConfig, ProjectOnboardingConfig } from './onboarding.js';\n\nexport interface ProviderConfig {\n apiKey?: string;\n baseUrl?: string;\n model: string;\n options?: Record<string, unknown>;\n}\n\nexport interface ArgusConfig {\n provider: ProviderType;\n providers: {\n zai?: ProviderConfig;\n anthropic?: ProviderConfig;\n openai?: ProviderConfig;\n deepseek?: ProviderConfig;\n ollama?: ProviderConfig;\n };\n defaults: {\n maxTurns: number;\n turnTimeoutMs: number;\n snapshotExtensions: string[];\n excludePatterns: string[];\n };\n onboarding?: OnboardingConfig;\n onboardingComplete?: boolean;\n}\n\nconst DEFAULT_CONFIG: ArgusConfig = {\n provider: 'ollama',\n providers: {\n ollama: {\n baseUrl: 'http://localhost:11434',\n model: 'qwen2.5-coder:7b',\n },\n },\n defaults: {\n maxTurns: 15,\n turnTimeoutMs: 60000,\n snapshotExtensions: ['ts', 'tsx', 'js', 'jsx', 'rs', 'py', 'go', 'java', 'rb', 'php', 'swift', 'kt', 'scala', 'c', 'cpp', 'h', 'hpp', 'cs', 'md'],\n excludePatterns: [\n 'node_modules',\n '.git',\n 'target',\n 'dist',\n 'build',\n '.next',\n 'coverage',\n '__pycache__',\n '.venv',\n 'vendor',\n ],\n },\n};\n\nexport function getConfigDir(): string {\n return join(homedir(), '.argus');\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), 'config.json');\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nexport function loadConfig(): ArgusConfig {\n const configPath = getConfigPath();\n \n if (!existsSync(configPath)) {\n return DEFAULT_CONFIG;\n }\n \n try {\n const content = readFileSync(configPath, 'utf-8');\n const loaded = JSON.parse(content) as Partial<ArgusConfig>;\n \n // Merge with defaults\n return {\n ...DEFAULT_CONFIG,\n ...loaded,\n providers: {\n ...DEFAULT_CONFIG.providers,\n ...loaded.providers,\n },\n defaults: {\n ...DEFAULT_CONFIG.defaults,\n ...loaded.defaults,\n },\n };\n } catch {\n // Silently return defaults - don't console.error as it can corrupt MCP JSON streams\n return DEFAULT_CONFIG;\n }\n}\n\nexport function saveConfig(config: ArgusConfig): void {\n ensureConfigDir();\n const configPath = getConfigPath();\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n}\n\nexport function getProviderConfig(config: ArgusConfig): ProviderConfig {\n const providerConfig = config.providers[config.provider];\n \n if (!providerConfig) {\n throw new Error(`No configuration found for provider: ${config.provider}`);\n }\n \n return providerConfig;\n}\n\nexport function validateConfig(config: ArgusConfig): string[] {\n const errors: string[] = [];\n \n const providerConfig = config.providers[config.provider];\n \n if (!providerConfig) {\n errors.push(`Provider \"${config.provider}\" is not configured`);\n return errors;\n }\n \n // Ollama doesn't need an API key\n if (config.provider !== 'ollama' && !providerConfig.apiKey) {\n errors.push(`API key is required for provider \"${config.provider}\"`);\n }\n \n if (!providerConfig.model) {\n errors.push(`Model is required for provider \"${config.provider}\"`);\n }\n \n return errors;\n}\n\nexport const PROVIDER_DEFAULTS: Record<ProviderType, Partial<ProviderConfig>> = {\n zai: {\n baseUrl: 'https://api.z.ai/api/coding/paas/v4',\n model: 'glm-4.7',\n },\n anthropic: {\n baseUrl: 'https://api.anthropic.com',\n model: 'claude-sonnet-4-20250514',\n },\n openai: {\n baseUrl: 'https://api.openai.com/v1',\n model: 'gpt-4o',\n },\n deepseek: {\n baseUrl: 'https://api.deepseek.com',\n model: 'deepseek-chat',\n },\n ollama: {\n baseUrl: 'http://localhost:11434',\n model: 'qwen2.5-coder:7b',\n },\n};\n","/**\n * Argus Snapshot Generator\n * \n * Creates optimized text snapshots of codebases for analysis.\n * Handles file filtering, exclusion patterns, and formatting.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync, writeFileSync } from 'fs';\nimport { join, relative, extname } from 'path';\n\nexport interface SnapshotOptions {\n extensions?: string[];\n excludePatterns?: string[];\n maxFileSize?: number; // in bytes\n includeHidden?: boolean;\n}\n\nexport interface SnapshotResult {\n outputPath: string;\n fileCount: number;\n totalLines: number;\n totalSize: number;\n files: string[];\n}\n\nconst DEFAULT_OPTIONS: Required<SnapshotOptions> = {\n extensions: ['ts', 'tsx', 'js', 'jsx', 'rs', 'py', 'go', 'java', 'rb', 'php', 'swift', 'kt', 'scala', 'c', 'cpp', 'h', 'hpp', 'cs', 'md', 'json'],\n excludePatterns: [\n 'node_modules',\n '.git',\n 'target',\n 'dist',\n 'build',\n '.next',\n 'coverage',\n '__pycache__',\n '.venv',\n 'vendor',\n '.DS_Store',\n '*.lock',\n 'package-lock.json',\n '*.min.js',\n '*.min.css',\n ],\n maxFileSize: 1024 * 1024, // 1MB\n includeHidden: false,\n};\n\nfunction shouldExclude(filePath: string, patterns: string[]): boolean {\n const normalizedPath = filePath.replace(/\\\\/g, '/');\n \n for (const pattern of patterns) {\n // Glob-like pattern matching\n if (pattern.startsWith('*')) {\n const suffix = pattern.slice(1);\n if (normalizedPath.endsWith(suffix)) return true;\n } else if (normalizedPath.includes(`/${pattern}/`) || normalizedPath.endsWith(`/${pattern}`) || normalizedPath === pattern) {\n return true;\n }\n }\n \n return false;\n}\n\nfunction hasValidExtension(filePath: string, extensions: string[]): boolean {\n const ext = extname(filePath).slice(1).toLowerCase();\n return extensions.includes(ext);\n}\n\nfunction collectFiles(\n dir: string,\n options: Required<SnapshotOptions>,\n baseDir: string = dir\n): string[] {\n const files: string[] = [];\n \n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n \n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = relative(baseDir, fullPath);\n \n // Skip hidden files unless explicitly included\n if (!options.includeHidden && entry.name.startsWith('.')) {\n continue;\n }\n \n // Check exclusion patterns\n if (shouldExclude(relativePath, options.excludePatterns)) {\n continue;\n }\n \n if (entry.isDirectory()) {\n files.push(...collectFiles(fullPath, options, baseDir));\n } else if (entry.isFile()) {\n // Check extension\n if (!hasValidExtension(entry.name, options.extensions)) {\n continue;\n }\n \n // Check file size\n try {\n const stats = statSync(fullPath);\n if (stats.size > options.maxFileSize) {\n continue;\n }\n } catch {\n continue;\n }\n \n files.push(fullPath);\n }\n }\n } catch (error) {\n // Directory not readable, skip\n }\n \n return files.sort();\n}\n\nexport function createSnapshot(\n projectPath: string,\n outputPath: string,\n options: SnapshotOptions = {}\n): SnapshotResult {\n const mergedOptions: Required<SnapshotOptions> = {\n ...DEFAULT_OPTIONS,\n ...options,\n };\n \n if (!existsSync(projectPath)) {\n throw new Error(`Project path does not exist: ${projectPath}`);\n }\n \n const stats = statSync(projectPath);\n if (!stats.isDirectory()) {\n throw new Error(`Project path is not a directory: ${projectPath}`);\n }\n \n // Collect all files\n const files = collectFiles(projectPath, mergedOptions);\n \n // Build snapshot content\n const lines: string[] = [];\n \n // Header\n lines.push('================================================================================');\n lines.push('CODEBASE SNAPSHOT');\n lines.push(`Project: ${projectPath}`);\n lines.push(`Generated: ${new Date().toISOString()}`);\n lines.push(`Extensions: ${mergedOptions.extensions.join(', ')}`);\n lines.push(`Files: ${files.length}`);\n lines.push('================================================================================');\n lines.push('');\n \n // Process each file\n for (const filePath of files) {\n const relativePath = relative(projectPath, filePath);\n \n lines.push('');\n lines.push('================================================================================');\n lines.push(`FILE: ./${relativePath}`);\n lines.push('================================================================================');\n \n try {\n const content = readFileSync(filePath, 'utf-8');\n lines.push(content);\n } catch (error) {\n lines.push('[Unable to read file]');\n }\n }\n \n // Write snapshot\n const content = lines.join('\\n');\n writeFileSync(outputPath, content);\n \n const totalLines = content.split('\\n').length;\n const totalSize = Buffer.byteLength(content, 'utf-8');\n \n return {\n outputPath,\n fileCount: files.length,\n totalLines,\n totalSize,\n files: files.map(f => relative(projectPath, f)),\n };\n}\n\nexport function getSnapshotStats(snapshotPath: string): {\n fileCount: number;\n totalLines: number;\n totalSize: number;\n} {\n if (!existsSync(snapshotPath)) {\n throw new Error(`Snapshot file does not exist: ${snapshotPath}`);\n }\n \n const content = readFileSync(snapshotPath, 'utf-8');\n const totalLines = content.split('\\n').length;\n const totalSize = Buffer.byteLength(content, 'utf-8');\n \n // Count FILE: markers\n const fileMatches = content.match(/^FILE: /gm);\n const fileCount = fileMatches ? fileMatches.length : 0;\n \n return { fileCount, totalLines, totalSize };\n}\n","/**\n * Argus Enhanced Snapshot\n * \n * Extends basic snapshots with structural metadata:\n * - Import graph (who imports whom)\n * - Export index (symbols → files)\n * - Function/class signatures\n * - File dependency tree\n * \n * This enables Claude Code to understand architecture without\n * reading individual files.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join, relative, dirname, extname, basename } from 'path';\nimport { execSync } from 'child_process';\nimport { createSnapshot, SnapshotOptions, SnapshotResult } from './snapshot.js';\n\nexport interface ImportInfo {\n source: string; // File doing the import\n target: string; // What's being imported (module path or relative)\n resolved?: string; // Resolved file path if local\n symbols: string[]; // Imported symbols (or ['*'] for namespace)\n isDefault: boolean; // Is it a default import?\n isType: boolean; // Is it a type-only import?\n}\n\nexport interface ExportInfo {\n file: string;\n symbol: string;\n type: 'function' | 'class' | 'const' | 'let' | 'var' | 'type' | 'interface' | 'enum' | 'default' | 'unknown';\n signature?: string; // Function signature or type definition\n line: number;\n}\n\nexport interface FileMetadata {\n path: string;\n imports: ImportInfo[];\n exports: ExportInfo[];\n size: number;\n lines: number;\n}\n\nexport interface ComplexityInfo {\n file: string;\n score: number;\n level: 'low' | 'medium' | 'high';\n}\n\nexport interface RecentChangeInfo {\n file: string;\n commits: number;\n authors: number;\n}\n\nexport interface EnhancedSnapshotResult extends SnapshotResult {\n metadata: {\n imports: ImportInfo[];\n exports: ExportInfo[];\n fileIndex: Record<string, FileMetadata>;\n importGraph: Record<string, string[]>; // file → files it imports\n exportGraph: Record<string, string[]>; // file → files that import it\n symbolIndex: Record<string, string[]>; // symbol → files that export it\n complexityScores: ComplexityInfo[]; // cyclomatic complexity per file\n testFileMap: Record<string, string[]>; // source file → test files\n recentChanges: RecentChangeInfo[] | null; // recent git changes (null if not git repo)\n };\n}\n\n/**\n * Parse imports from TypeScript/JavaScript content\n */\nfunction parseImports(content: string, filePath: string): ImportInfo[] {\n const imports: ImportInfo[] = [];\n const lines = content.split('\\n');\n \n // Patterns for different import styles\n const patterns = [\n // import { a, b } from 'module'\n /import\\s+(?:type\\s+)?{([^}]+)}\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n // import * as name from 'module'\n /import\\s+\\*\\s+as\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n // import defaultExport from 'module'\n /import\\s+(?:type\\s+)?(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n // import 'module' (side-effect)\n /import\\s+['\"]([^'\"]+)['\"]/g,\n // require('module')\n /(?:const|let|var)\\s+(?:{([^}]+)}|(\\w+))\\s*=\\s*require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n ];\n \n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith('import') && !trimmed.includes('require(')) continue;\n \n // Named imports: import { a, b } from 'module'\n let match = /import\\s+(type\\s+)?{([^}]+)}\\s+from\\s+['\"]([^'\"]+)['\"]/.exec(trimmed);\n if (match) {\n const isType = !!match[1];\n const symbols = match[2].split(',').map(s => s.trim().split(/\\s+as\\s+/)[0].trim()).filter(Boolean);\n const target = match[3];\n imports.push({\n source: filePath,\n target,\n symbols,\n isDefault: false,\n isType,\n });\n continue;\n }\n \n // Namespace import: import * as name from 'module'\n match = /import\\s+\\*\\s+as\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/.exec(trimmed);\n if (match) {\n imports.push({\n source: filePath,\n target: match[2],\n symbols: ['*'],\n isDefault: false,\n isType: false,\n });\n continue;\n }\n \n // Default import: import name from 'module'\n match = /import\\s+(type\\s+)?(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/.exec(trimmed);\n if (match && !trimmed.includes('{')) {\n imports.push({\n source: filePath,\n target: match[3],\n symbols: [match[2]],\n isDefault: true,\n isType: !!match[1],\n });\n continue;\n }\n \n // Side-effect import: import 'module'\n match = /^import\\s+['\"]([^'\"]+)['\"]/.exec(trimmed);\n if (match) {\n imports.push({\n source: filePath,\n target: match[1],\n symbols: [],\n isDefault: false,\n isType: false,\n });\n }\n }\n \n return imports;\n}\n\n/**\n * Parse exports from TypeScript/JavaScript content\n */\nfunction parseExports(content: string, filePath: string): ExportInfo[] {\n const exports: ExportInfo[] = [];\n const lines = content.split('\\n');\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n \n // export function name(...) or export async function name(...)\n let match = /export\\s+(?:async\\s+)?function\\s+(\\w+)\\s*(\\([^)]*\\))/.exec(trimmed);\n if (match) {\n exports.push({\n file: filePath,\n symbol: match[1],\n type: 'function',\n signature: `function ${match[1]}${match[2]}`,\n line: i + 1,\n });\n continue;\n }\n \n // export class Name\n match = /export\\s+class\\s+(\\w+)/.exec(trimmed);\n if (match) {\n exports.push({\n file: filePath,\n symbol: match[1],\n type: 'class',\n line: i + 1,\n });\n continue;\n }\n \n // export const/let/var name\n match = /export\\s+(const|let|var)\\s+(\\w+)/.exec(trimmed);\n if (match) {\n exports.push({\n file: filePath,\n symbol: match[2],\n type: match[1] as 'const' | 'let' | 'var',\n line: i + 1,\n });\n continue;\n }\n \n // export type Name or export interface Name\n match = /export\\s+(type|interface)\\s+(\\w+)/.exec(trimmed);\n if (match) {\n exports.push({\n file: filePath,\n symbol: match[2],\n type: match[1] as 'type' | 'interface',\n line: i + 1,\n });\n continue;\n }\n \n // export enum Name\n match = /export\\s+enum\\s+(\\w+)/.exec(trimmed);\n if (match) {\n exports.push({\n file: filePath,\n symbol: match[1],\n type: 'enum',\n line: i + 1,\n });\n continue;\n }\n \n // export default\n if (/export\\s+default/.test(trimmed)) {\n match = /export\\s+default\\s+(?:function\\s+)?(\\w+)?/.exec(trimmed);\n exports.push({\n file: filePath,\n symbol: match?.[1] || 'default',\n type: 'default',\n line: i + 1,\n });\n }\n }\n \n return exports;\n}\n\n/**\n * Calculate cyclomatic complexity for a file\n * Counts decision points: if, else if, while, for, case, ternary, &&, ||, catch\n */\nfunction calculateComplexity(content: string): number {\n const patterns = [\n /\\bif\\s*\\(/g,\n /\\belse\\s+if\\s*\\(/g,\n /\\bwhile\\s*\\(/g,\n /\\bfor\\s*\\(/g,\n /\\bcase\\s+/g,\n /\\?\\s*.*\\s*:/g,\n /\\&\\&/g,\n /\\|\\|/g,\n /\\bcatch\\s*\\(/g,\n ];\n\n let complexity = 1; // Base complexity\n for (const pattern of patterns) {\n const matches = content.match(pattern);\n if (matches) complexity += matches.length;\n }\n return complexity;\n}\n\n/**\n * Get complexity level label\n */\nfunction getComplexityLevel(score: number): 'low' | 'medium' | 'high' {\n if (score <= 10) return 'low';\n if (score <= 20) return 'medium';\n return 'high';\n}\n\n/**\n * Map source files to their test files\n */\nfunction mapTestFiles(files: string[]): Record<string, string[]> {\n const testMap: Record<string, string[]> = {};\n\n // Common test file patterns\n const testPatterns = [\n // Same directory patterns\n (src: string) => src.replace(/\\.tsx?$/, '.test.ts'),\n (src: string) => src.replace(/\\.tsx?$/, '.test.tsx'),\n (src: string) => src.replace(/\\.tsx?$/, '.spec.ts'),\n (src: string) => src.replace(/\\.tsx?$/, '.spec.tsx'),\n (src: string) => src.replace(/\\.jsx?$/, '.test.js'),\n (src: string) => src.replace(/\\.jsx?$/, '.test.jsx'),\n (src: string) => src.replace(/\\.jsx?$/, '.spec.js'),\n (src: string) => src.replace(/\\.jsx?$/, '.spec.jsx'),\n // __tests__ directory pattern\n (src: string) => {\n const dir = dirname(src);\n const base = basename(src).replace(/\\.(tsx?|jsx?)$/, '');\n return join(dir, '__tests__', `${base}.test.ts`);\n },\n (src: string) => {\n const dir = dirname(src);\n const base = basename(src).replace(/\\.(tsx?|jsx?)$/, '');\n return join(dir, '__tests__', `${base}.test.tsx`);\n },\n // test/ directory pattern\n (src: string) => src.replace(/^src\\//, 'test/').replace(/\\.(tsx?|jsx?)$/, '.test.ts'),\n (src: string) => src.replace(/^src\\//, 'tests/').replace(/\\.(tsx?|jsx?)$/, '.test.ts'),\n ];\n\n // Create a set for fast lookup\n const fileSet = new Set(files);\n\n for (const file of files) {\n // Skip test files themselves\n if (file.includes('.test.') || file.includes('.spec.') || file.includes('__tests__')) continue;\n\n // Only check source files\n if (!/\\.(tsx?|jsx?)$/.test(file)) continue;\n\n const tests: string[] = [];\n for (const pattern of testPatterns) {\n const testPath = pattern(file);\n // Only add if the path changed (pattern matched) AND test file exists\n if (testPath !== file && fileSet.has(testPath)) {\n tests.push(testPath);\n }\n }\n\n if (tests.length > 0) {\n testMap[file] = [...new Set(tests)]; // Dedupe\n }\n }\n return testMap;\n}\n\n/**\n * Get recent changes from git (last 7 days)\n * Returns null if not a git repo\n * Note: Uses execSync with hardcoded commands (no user input) for git operations\n */\nfunction getRecentChanges(projectPath: string): RecentChangeInfo[] | null {\n try {\n // Check if it's a git repo - using execSync with hardcoded command\n execSync('git rev-parse --git-dir', { cwd: projectPath, encoding: 'utf-8', stdio: 'pipe' });\n\n // Get commits with file names and authors from last 7 days\n // Note: This is a hardcoded git command with no user input, safe from injection\n const output = execSync(\n 'git log --since=\"7 days ago\" --name-only --format=\"COMMIT_AUTHOR:%an\" --diff-filter=ACMR',\n { cwd: projectPath, encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024, stdio: 'pipe' }\n );\n\n if (!output.trim()) return [];\n\n const fileStats: Record<string, { commits: Set<string>; authors: Set<string> }> = {};\n let currentAuthor = '';\n let currentCommitId = 0;\n\n for (const line of output.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) {\n currentCommitId++; // New commit block\n continue;\n }\n\n if (trimmed.startsWith('COMMIT_AUTHOR:')) {\n currentAuthor = trimmed.replace('COMMIT_AUTHOR:', '');\n continue;\n }\n\n // It's a file name\n const file = trimmed;\n if (!fileStats[file]) {\n fileStats[file] = { commits: new Set(), authors: new Set() };\n }\n fileStats[file].commits.add(`${currentCommitId}`);\n if (currentAuthor) {\n fileStats[file].authors.add(currentAuthor);\n }\n }\n\n // Convert to array and sort by commit count (most active first)\n const result: RecentChangeInfo[] = Object.entries(fileStats)\n .map(([file, stats]) => ({\n file,\n commits: stats.commits.size,\n authors: stats.authors.size,\n }))\n .sort((a, b) => b.commits - a.commits);\n\n return result;\n } catch {\n return null; // Not a git repo or git not available\n }\n}\n\n/**\n * Resolve a relative import path to an actual file\n */\nfunction resolveImportPath(importPath: string, fromFile: string, projectFiles: string[]): string | undefined {\n if (!importPath.startsWith('.')) return undefined; // External module\n \n const fromDir = dirname(fromFile);\n let resolved = join(fromDir, importPath);\n \n // Try with extensions\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '', '/index.ts', '/index.tsx', '/index.js', '/index.jsx'];\n for (const ext of extensions) {\n const candidate = resolved + ext;\n if (projectFiles.includes(candidate) || projectFiles.includes('./' + candidate)) {\n return candidate;\n }\n }\n \n return undefined;\n}\n\n/**\n * Create an enhanced snapshot with structural metadata\n */\nexport function createEnhancedSnapshot(\n projectPath: string,\n outputPath: string,\n options: SnapshotOptions = {}\n): EnhancedSnapshotResult {\n // First create the basic snapshot\n const baseResult = createSnapshot(projectPath, outputPath, options);\n \n // Now parse all files for metadata\n const allImports: ImportInfo[] = [];\n const allExports: ExportInfo[] = [];\n const fileIndex: Record<string, FileMetadata> = {};\n const projectFiles = baseResult.files.map(f => './' + f);\n \n for (const relPath of baseResult.files) {\n const fullPath = join(projectPath, relPath);\n const ext = extname(relPath).toLowerCase();\n \n // Only parse JS/TS files for imports/exports\n if (!['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'].includes(ext)) {\n continue;\n }\n \n try {\n const content = readFileSync(fullPath, 'utf-8');\n const imports = parseImports(content, relPath);\n const exports = parseExports(content, relPath);\n \n // Resolve local imports\n for (const imp of imports) {\n imp.resolved = resolveImportPath(imp.target, relPath, projectFiles);\n }\n \n allImports.push(...imports);\n allExports.push(...exports);\n \n fileIndex[relPath] = {\n path: relPath,\n imports,\n exports,\n size: content.length,\n lines: content.split('\\n').length,\n };\n } catch {\n // Skip files that can't be read\n }\n }\n \n // Build import graph (file → files it imports)\n const importGraph: Record<string, string[]> = {};\n for (const imp of allImports) {\n if (imp.resolved) {\n if (!importGraph[imp.source]) importGraph[imp.source] = [];\n if (!importGraph[imp.source].includes(imp.resolved)) {\n importGraph[imp.source].push(imp.resolved);\n }\n }\n }\n \n // Build export graph (file → files that import it)\n const exportGraph: Record<string, string[]> = {};\n for (const imp of allImports) {\n if (imp.resolved) {\n if (!exportGraph[imp.resolved]) exportGraph[imp.resolved] = [];\n if (!exportGraph[imp.resolved].includes(imp.source)) {\n exportGraph[imp.resolved].push(imp.source);\n }\n }\n }\n \n // Build symbol index (symbol → files that export it)\n const symbolIndex: Record<string, string[]> = {};\n for (const exp of allExports) {\n if (!symbolIndex[exp.symbol]) symbolIndex[exp.symbol] = [];\n if (!symbolIndex[exp.symbol].includes(exp.file)) {\n symbolIndex[exp.symbol].push(exp.file);\n }\n }\n\n // Calculate complexity scores for all files\n const complexityScores: ComplexityInfo[] = [];\n for (const [relPath, metadata] of Object.entries(fileIndex)) {\n const fullPath = join(projectPath, relPath);\n try {\n const content = readFileSync(fullPath, 'utf-8');\n const score = calculateComplexity(content);\n complexityScores.push({\n file: relPath,\n score,\n level: getComplexityLevel(score),\n });\n } catch {\n // Skip files that can't be read\n }\n }\n // Sort by complexity score (highest first)\n complexityScores.sort((a, b) => b.score - a.score);\n\n // Map test files to source files\n const testFileMap = mapTestFiles(baseResult.files);\n\n // Get recent git changes (null if not a git repo)\n const recentChanges = getRecentChanges(projectPath);\n\n // Append metadata to snapshot file\n const metadataSection = `\n\n================================================================================\nMETADATA: IMPORT GRAPH\n================================================================================\n${Object.entries(importGraph).map(([file, imports]) => `${file}:\\n${imports.map(i => ` → ${i}`).join('\\n')}`).join('\\n\\n')}\n\n================================================================================\nMETADATA: EXPORT INDEX\n================================================================================\n${Object.entries(symbolIndex).map(([symbol, files]) => `${symbol}: ${files.join(', ')}`).join('\\n')}\n\n================================================================================\nMETADATA: FILE EXPORTS\n================================================================================\n${allExports.map(e => `${e.file}:${e.line} - ${e.type} ${e.symbol}${e.signature ? ` ${e.signature}` : ''}`).join('\\n')}\n\n================================================================================\nMETADATA: WHO IMPORTS WHOM\n================================================================================\n${Object.entries(exportGraph).map(([file, importers]) => `${file} is imported by:\\n${importers.map(i => ` ← ${i}`).join('\\n')}`).join('\\n\\n')}\n\n================================================================================\nMETADATA: COMPLEXITY SCORES\n================================================================================\n${complexityScores.map(c => `${c.file}: ${c.score} (${c.level})`).join('\\n')}\n\n================================================================================\nMETADATA: TEST COVERAGE MAP\n================================================================================\n${Object.entries(testFileMap).length > 0\n ? Object.entries(testFileMap).map(([src, tests]) => `${src} -> ${tests.join(', ')}`).join('\\n')\n : '(no test file mappings found)'}\n${baseResult.files.filter(f =>\n /\\.(tsx?|jsx?)$/.test(f) &&\n !f.includes('.test.') &&\n !f.includes('.spec.') &&\n !f.includes('__tests__') &&\n !testFileMap[f]\n ).map(f => `${f} -> (no tests)`).join('\\n')}\n${recentChanges !== null ? `\n\n================================================================================\nMETADATA: RECENT CHANGES (last 7 days)\n================================================================================\n${recentChanges.length > 0\n ? recentChanges.map(c => `${c.file}: ${c.commits} commit${c.commits !== 1 ? 's' : ''}, ${c.authors} author${c.authors !== 1 ? 's' : ''}`).join('\\n')\n : '(no changes in the last 7 days)'}` : ''}\n`;\n\n // Append to snapshot\n const existingContent = readFileSync(outputPath, 'utf-8');\n writeFileSync(outputPath, existingContent + metadataSection);\n\n return {\n ...baseResult,\n metadata: {\n imports: allImports,\n exports: allExports,\n fileIndex,\n importGraph,\n exportGraph,\n symbolIndex,\n complexityScores,\n testFileMap,\n recentChanges,\n },\n };\n}\n","/**\n * Argus RLM Engine\n * \n * Recursive Language Model engine for document analysis.\n * Based on the Matryoshka RLM approach by Dmitri Sotnikov.\n * \n * The engine uses an LLM to generate Nucleus DSL commands that are\n * executed against documents, enabling analysis of content far\n * exceeding typical context limits.\n */\n\nimport { readFileSync } from 'fs';\nimport { AIProvider, Message } from '../providers/types.js';\nimport { buildSystemPrompt, getTurnLimit } from './prompts.js';\n\nexport interface AnalysisOptions {\n maxTurns?: number;\n turnTimeoutMs?: number;\n verbose?: boolean;\n onProgress?: (turn: number, command: string, result: unknown) => void;\n}\n\nexport interface AnalysisResult {\n answer: string;\n turns: number;\n commands: string[];\n success: boolean;\n error?: string;\n}\n\ninterface GrepMatch {\n match: string;\n line: string;\n lineNum: number;\n index: number;\n groups: string[];\n}\n\nconst NUCLEUS_REFERENCE = `\nYou are analyzing a document using the Nucleus DSL. Generate S-expression commands to explore the document.\n\nAVAILABLE COMMANDS:\n- (grep \"pattern\") - Search for regex pattern, returns matches with line numbers\n- (grep \"pattern\" \"flags\") - With flags like \"i\" for case-insensitive\n- (count RESULTS) - Count number of items in RESULTS\n- (map RESULTS (lambda (x) expr)) - Transform each item\n- (filter RESULTS (lambda (x) expr)) - Keep items where expr is true\n- (sort RESULTS key) - Sort by key\n- (first RESULTS) - Get first item\n- (last RESULTS) - Get last item \n- (take RESULTS n) - Get first n items\n- (match str \"pattern\" group) - Extract regex group from string\n\nVARIABLES:\n- RESULTS always contains the result of the last command\n- _1, _2, etc. contain results from turn 1, 2, etc.\n\nFINAL ANSWER:\nWhen you have enough information, output: <<<FINAL>>>your answer here<<<END>>>\n\nRULES:\n1. Output ONLY a single Nucleus command OR a final answer, nothing else\n2. Use grep to search the document\n3. Use map/filter to process results\n4. Build understanding iteratively\n5. When ready, provide the final answer\n\nExample session:\nTurn 1: (grep \"function.*export\")\nTurn 2: (count RESULTS)\nTurn 3: <<<FINAL>>>There are 15 exported functions<<<END>>>\n`;\n\n/**\n * Execute a Nucleus command against document content\n */\nfunction executeNucleus(command: string, content: string, bindings: Map<string, unknown>): unknown {\n // Parse the S-expression\n const parsed = parseSExpression(command);\n if (!parsed) {\n throw new Error(`Failed to parse command: ${command}`);\n }\n \n return evaluateExpr(parsed, content, bindings);\n}\n\ntype SExpr = string | SExpr[];\n\nfunction parseSExpression(input: string): SExpr | null {\n const tokens = tokenize(input.trim());\n if (tokens.length === 0) return null;\n \n let pos = 0;\n \n function parse(): SExpr {\n const token = tokens[pos++];\n \n if (token === '(') {\n const list: SExpr[] = [];\n while (tokens[pos] !== ')' && pos < tokens.length) {\n list.push(parse());\n }\n pos++; // consume ')'\n return list;\n } else if (token.startsWith('\"')) {\n // String literal\n return token.slice(1, -1).replace(/\\\\\"/g, '\"');\n } else if (/^-?\\d+(\\.\\d+)?$/.test(token)) {\n return token; // Keep as string, convert when needed\n } else {\n return token; // Symbol\n }\n }\n \n return parse();\n}\n\nfunction tokenize(input: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n \n while (i < input.length) {\n const char = input[i];\n \n if (/\\s/.test(char)) {\n i++;\n continue;\n }\n \n if (char === '(' || char === ')') {\n tokens.push(char);\n i++;\n continue;\n }\n \n if (char === '\"') {\n let str = '\"';\n i++;\n while (i < input.length && input[i] !== '\"') {\n if (input[i] === '\\\\' && i + 1 < input.length) {\n str += input[i] + input[i + 1];\n i += 2;\n } else {\n str += input[i];\n i++;\n }\n }\n str += '\"';\n i++;\n tokens.push(str);\n continue;\n }\n \n // Symbol or number\n let sym = '';\n while (i < input.length && !/[\\s()]/.test(input[i])) {\n sym += input[i];\n i++;\n }\n tokens.push(sym);\n }\n \n return tokens;\n}\n\nfunction evaluateExpr(expr: SExpr, content: string, bindings: Map<string, unknown>): unknown {\n if (typeof expr === 'string') {\n // Variable lookup\n if (bindings.has(expr)) {\n return bindings.get(expr);\n }\n // Number\n if (/^-?\\d+(\\.\\d+)?$/.test(expr)) {\n return parseFloat(expr);\n }\n return expr;\n }\n \n if (!Array.isArray(expr) || expr.length === 0) {\n return expr;\n }\n \n const [op, ...args] = expr;\n \n switch (op) {\n case 'grep': {\n const pattern = evaluateExpr(args[0], content, bindings) as string;\n const flags = args[1] ? evaluateExpr(args[1], content, bindings) as string : '';\n const regex = new RegExp(pattern, flags + 'g');\n const lines = content.split('\\n');\n const matches: GrepMatch[] = [];\n \n let charIndex = 0;\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const line = lines[lineNum];\n let match;\n const lineRegex = new RegExp(pattern, flags + 'g');\n while ((match = lineRegex.exec(line)) !== null) {\n matches.push({\n match: match[0],\n line: line,\n lineNum: lineNum + 1,\n index: charIndex + match.index,\n groups: match.slice(1),\n });\n }\n charIndex += line.length + 1;\n }\n \n return matches;\n }\n \n case 'count': {\n const arr = evaluateExpr(args[0], content, bindings);\n if (Array.isArray(arr)) return arr.length;\n return 0;\n }\n \n case 'map': {\n const arr = evaluateExpr(args[0], content, bindings) as unknown[];\n const lambdaExpr = args[1] as SExpr[];\n \n if (!Array.isArray(lambdaExpr) || lambdaExpr[0] !== 'lambda') {\n throw new Error('map requires a lambda expression');\n }\n \n const params = lambdaExpr[1] as SExpr[];\n const body = lambdaExpr[2];\n const paramName = Array.isArray(params) ? params[0] as string : params as string;\n \n return arr.map(item => {\n const localBindings = new Map(bindings);\n localBindings.set(paramName, item);\n return evaluateExpr(body, content, localBindings);\n });\n }\n \n case 'filter': {\n const arr = evaluateExpr(args[0], content, bindings) as unknown[];\n const lambdaExpr = args[1] as SExpr[];\n \n if (!Array.isArray(lambdaExpr) || lambdaExpr[0] !== 'lambda') {\n throw new Error('filter requires a lambda expression');\n }\n \n const params = lambdaExpr[1] as SExpr[];\n const body = lambdaExpr[2];\n const paramName = Array.isArray(params) ? params[0] as string : params as string;\n \n return arr.filter(item => {\n const localBindings = new Map(bindings);\n localBindings.set(paramName, item);\n return evaluateExpr(body, content, localBindings);\n });\n }\n \n case 'first': {\n const arr = evaluateExpr(args[0], content, bindings) as unknown[];\n return arr[0];\n }\n \n case 'last': {\n const arr = evaluateExpr(args[0], content, bindings) as unknown[];\n return arr[arr.length - 1];\n }\n \n case 'take': {\n const arr = evaluateExpr(args[0], content, bindings) as unknown[];\n const n = evaluateExpr(args[1], content, bindings) as number;\n return arr.slice(0, n);\n }\n \n case 'sort': {\n const arr = evaluateExpr(args[0], content, bindings) as Record<string, unknown>[];\n const key = evaluateExpr(args[1], content, bindings) as string;\n return [...arr].sort((a, b) => {\n const aVal = a[key];\n const bVal = b[key];\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return aVal - bVal;\n }\n return String(aVal).localeCompare(String(bVal));\n });\n }\n \n case 'match': {\n const str = evaluateExpr(args[0], content, bindings);\n const strValue = typeof str === 'object' && str !== null && 'line' in str \n ? (str as GrepMatch).line \n : String(str);\n const pattern = evaluateExpr(args[1], content, bindings) as string;\n const group = args[2] ? evaluateExpr(args[2], content, bindings) as number : 0;\n \n const regex = new RegExp(pattern);\n const match = strValue.match(regex);\n if (match) {\n return match[group] || null;\n }\n return null;\n }\n \n default:\n throw new Error(`Unknown command: ${op}`);\n }\n}\n\n/**\n * Extract Nucleus command from LLM response\n */\nfunction extractCommand(response: string): { command?: string; finalAnswer?: string } {\n // Check for final answer\n const finalMatch = response.match(/<<<FINAL>>>([\\s\\S]*?)<<<END>>>/);\n if (finalMatch) {\n return { finalAnswer: finalMatch[1].trim() };\n }\n \n // Look for S-expression\n const sexpMatch = response.match(/\\([^)]*(?:\\([^)]*\\)[^)]*)*\\)/);\n if (sexpMatch) {\n return { command: sexpMatch[0] };\n }\n \n return {};\n}\n\n/**\n * Run RLM analysis on a document\n */\nexport async function analyze(\n provider: AIProvider,\n documentPath: string,\n query: string,\n options: AnalysisOptions = {}\n): Promise<AnalysisResult> {\n const {\n maxTurns = 15,\n verbose = false,\n onProgress,\n } = options;\n \n // Use dynamic turn limit based on query type, but cap at maxTurns\n const dynamicLimit = Math.min(getTurnLimit(query), maxTurns);\n \n // Load document\n const content = readFileSync(documentPath, 'utf-8');\n \n // Get document stats for context\n const fileCount = (content.match(/^FILE:/gm) || []).length;\n const lineCount = content.split('\\n').length;\n \n const bindings = new Map<string, unknown>();\n const commands: string[] = [];\n const messages: Message[] = [\n {\n role: 'system',\n content: buildSystemPrompt(query),\n },\n {\n role: 'user',\n content: `CODEBASE SNAPSHOT:\n- Total size: ${content.length.toLocaleString()} characters\n- Files: ${fileCount}\n- Lines: ${lineCount.toLocaleString()}\n\nFiles are marked with \"FILE: ./path/to/file\" headers.\n\nQUERY: ${query}\n\nBegin analysis. You have ${dynamicLimit} turns maximum - provide final answer before then.`,\n },\n ];\n \n for (let turn = 1; turn <= dynamicLimit; turn++) {\n // Force final answer on last turn\n const isLastTurn = turn === dynamicLimit;\n const isNearEnd = turn >= dynamicLimit - 2;\n \n if (verbose) {\n console.log(`\\n[Turn ${turn}/${dynamicLimit}] Querying LLM...`);\n }\n \n // Get LLM response\n const result = await provider.complete(messages);\n const response = result.content;\n \n if (verbose) {\n console.log(`[Turn ${turn}] Response: ${response.slice(0, 200)}...`);\n }\n \n // Extract command or final answer\n const extracted = extractCommand(response);\n \n if (extracted.finalAnswer) {\n return {\n answer: extracted.finalAnswer,\n turns: turn,\n commands,\n success: true,\n };\n }\n \n if (!extracted.command) {\n // No command found, add to messages and continue\n messages.push({ role: 'assistant', content: response });\n messages.push({ role: 'user', content: 'Please provide a Nucleus command or final answer.' });\n continue;\n }\n \n const command = extracted.command;\n commands.push(command);\n \n if (verbose) {\n console.log(`[Turn ${turn}] Command: ${command}`);\n }\n \n // Execute command\n try {\n const cmdResult = executeNucleus(command, content, bindings);\n \n // Store result in bindings\n bindings.set('RESULTS', cmdResult);\n bindings.set(`_${turn}`, cmdResult);\n \n const resultStr = JSON.stringify(cmdResult, null, 2);\n const truncatedResult = resultStr.length > 2000 \n ? resultStr.slice(0, 2000) + '...[truncated]' \n : resultStr;\n \n if (verbose) {\n console.log(`[Turn ${turn}] Result: ${truncatedResult.slice(0, 500)}...`);\n }\n \n onProgress?.(turn, command, cmdResult);\n \n // Add to conversation with nudge if near end\n messages.push({ role: 'assistant', content: command });\n \n let userMessage = `Result:\\n${truncatedResult}`;\n if (isNearEnd && !isLastTurn) {\n userMessage += `\\n\\n⚠️ ${dynamicLimit - turn} turns remaining. Start forming your final answer.`;\n }\n messages.push({ role: 'user', content: userMessage });\n \n // FORCE final answer on last turn - make one more LLM call\n if (isLastTurn) {\n messages.push({ \n role: 'user', \n content: 'STOP SEARCHING. Based on everything you found, provide your final answer NOW using <<<FINAL>>>your answer<<<END>>>' \n });\n \n const finalResult = await provider.complete(messages);\n const finalExtracted = extractCommand(finalResult.content);\n \n if (finalExtracted.finalAnswer) {\n return {\n answer: finalExtracted.finalAnswer,\n turns: turn,\n commands,\n success: true,\n };\n }\n \n // Even if not properly formatted, return whatever we got\n return {\n answer: finalResult.content,\n turns: turn,\n commands,\n success: true,\n };\n }\n \n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n \n if (verbose) {\n console.log(`[Turn ${turn}] Error: ${errMsg}`);\n }\n \n messages.push({ role: 'assistant', content: command });\n messages.push({ role: 'user', content: `Error executing command: ${errMsg}` });\n }\n }\n \n return {\n answer: 'Maximum turns reached without final answer',\n turns: dynamicLimit,\n commands,\n success: false,\n error: 'Max turns reached',\n };\n}\n\n/**\n * Fast grep search without AI\n */\nexport function searchDocument(\n documentPath: string,\n pattern: string,\n options: { caseInsensitive?: boolean; maxResults?: number } = {}\n): GrepMatch[] {\n const content = readFileSync(documentPath, 'utf-8');\n const flags = options.caseInsensitive ? 'gi' : 'g';\n const regex = new RegExp(pattern, flags);\n const lines = content.split('\\n');\n const matches: GrepMatch[] = [];\n \n let charIndex = 0;\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const line = lines[lineNum];\n let match;\n const lineRegex = new RegExp(pattern, flags);\n while ((match = lineRegex.exec(line)) !== null) {\n matches.push({\n match: match[0],\n line: line,\n lineNum: lineNum + 1,\n index: charIndex + match.index,\n groups: match.slice(1),\n });\n \n if (options.maxResults && matches.length >= options.maxResults) {\n return matches;\n }\n }\n charIndex += line.length + 1;\n }\n \n return matches;\n}\n","/**\n * Argus RLM Prompts\n * \n * Optimized prompts for codebase understanding that persists across Claude Code sessions.\n */\n\nexport const NUCLEUS_COMMANDS = `\nCOMMANDS (output ONE per turn):\n(grep \"pattern\") - Find lines matching regex\n(grep \"pattern\" \"i\") - Case-insensitive search \n(count RESULTS) - Count matches\n(take RESULTS n) - First n results\n(filter RESULTS (lambda (x) (match x.line \"pattern\" 0))) - Filter results\n(map RESULTS (lambda (x) x.line)) - Extract just the lines\n\nVARIABLES: RESULTS = last result, _1 _2 _3 = results from turn 1,2,3\n\nTO ANSWER: <<<FINAL>>>your answer<<<END>>>\n`;\n\n// Main system prompt for codebase analysis\nexport const CODEBASE_ANALYSIS_PROMPT = `You are analyzing a SOFTWARE CODEBASE snapshot to help a developer understand it.\n\nThe snapshot contains source files concatenated with \"FILE: ./path/to/file\" markers.\n\n${NUCLEUS_COMMANDS}\n\n## STRATEGY FOR CODEBASE SNAPSHOTS\n\n**To find modules/directories:**\n(grep \"FILE:.*src/[^/]+/\") - top-level source dirs\n(grep \"FILE:.*mod\\\\.rs\") - Rust modules \n(grep \"FILE:.*index\\\\.(ts|js)\") - JS/TS modules\n\n**To find implementations:**\n(grep \"fn function_name\") - Rust functions\n(grep \"function|const.*=>\") - JS functions\n(grep \"class ClassName\") - Classes\n(grep \"struct |type |interface\") - Type definitions\n\n**To understand structure:**\n(grep \"FILE:\") - List all files\n(grep \"use |import |require\") - Find dependencies\n(grep \"pub |export\") - Public APIs\n\n## RULES\n1. Output ONLY a Nucleus command OR a final answer\n2. NO explanations, NO markdown formatting in commands\n3. MUST provide final answer by turn 8\n4. If turn 6+, start summarizing what you found\n\n## EXAMPLE SESSION\nTurn 1: (grep \"FILE:.*src/[^/]+/mod\\\\.rs\")\nTurn 2: (take RESULTS 15)\nTurn 3: <<<FINAL>>>The codebase has these main modules:\n- src/auth/ - Authentication handling\n- src/api/ - API endpoints\n- src/db/ - Database layer\n...<<<END>>>\n`;\n\n// Specialized prompt for architecture questions\nexport const ARCHITECTURE_PROMPT = `You are generating an ARCHITECTURE SUMMARY of a codebase.\n\n${NUCLEUS_COMMANDS}\n\n## YOUR TASK\nCreate a summary suitable for CLAUDE.md that helps Claude Code understand this project after context compaction.\n\n## SEARCH STRATEGY (do these in order)\n1. (grep \"FILE:.*mod\\\\.rs|FILE:.*index\\\\.(ts|js)\") - Find module entry points\n2. (take RESULTS 20) - Limit results\n3. Based on file paths, provide your summary\n\n## OUTPUT FORMAT\nYour final answer should be structured like:\n\n## Modules\n- **module_name/** - Brief description based on files found\n\n## Key Patterns \n- Pattern observations from the code\n\n## Important Files\n- List key files and their apparent purpose\n\nPROVIDE FINAL ANSWER BY TURN 6.\n`;\n\n// Prompt for finding specific implementations\nexport const IMPLEMENTATION_PROMPT = `You are finding HOW something works in a codebase.\n\n${NUCLEUS_COMMANDS}\n\n## STRATEGY\n1. (grep \"FILE:.*keyword\") - Find files related to the concept\n2. (grep \"keyword\") - Find all mentions\n3. (take RESULTS 30) - Limit if too many results\n4. Look for function definitions, structs, classes\n5. PROVIDE FINAL ANSWER based on file paths and code patterns found\n\n## IMPORTANT\n- You have 12 turns maximum\n- By turn 8, START WRITING YOUR FINAL ANSWER\n- Use what you've found - don't keep searching indefinitely\n- It's better to give a partial answer than no answer\n\n## OUTPUT FORMAT\nYour final answer should explain:\n- Which files contain the implementation\n- Key functions/structs/classes involved \n- Basic flow of how it works (based on what you found)\n`;\n\n// Prompt for counting/quantifying\nexport const COUNT_PROMPT = `You are counting items in a codebase.\n\n${NUCLEUS_COMMANDS}\n\n## STRATEGY \n1. (grep \"pattern\")\n2. (count RESULTS)\n3. <<<FINAL>>>There are N items matching the pattern.<<<END>>>\n\nTHIS SHOULD TAKE 2-3 TURNS MAXIMUM.\n`;\n\n// Prompt for quick searches\nexport const SEARCH_PROMPT = `You are searching for specific code.\n\n${NUCLEUS_COMMANDS}\n\n## STRATEGY\n1. (grep \"pattern\")\n2. (take RESULTS 20) if too many\n3. Report what you found with file paths\n\nPROVIDE FINAL ANSWER BY TURN 4.\n`;\n\n/**\n * Detect query type and select best prompt\n */\nexport function selectPrompt(query: string): string {\n const q = query.toLowerCase();\n \n // Count queries - fastest\n if (/how many|count|number of|total|how much/.test(q)) {\n return COUNT_PROMPT;\n }\n \n // Simple search queries\n if (/^(find|search|show|list|where is|locate)\\b/.test(q) && q.length < 50) {\n return SEARCH_PROMPT;\n }\n \n // Architecture/overview queries \n if (/architect|structure|overview|module|organization|main.*component|summar|layout/.test(q)) {\n return ARCHITECTURE_PROMPT;\n }\n \n // Implementation queries\n if (/how does|how is|implement|work|handle|process|flow/.test(q)) {\n return IMPLEMENTATION_PROMPT;\n }\n \n // Default\n return CODEBASE_ANALYSIS_PROMPT;\n}\n\n/**\n * Build system prompt with query-specific guidance\n */\nexport function buildSystemPrompt(query: string): string {\n return selectPrompt(query);\n}\n\n/**\n * Get the turn limit based on query type\n */\nexport function getTurnLimit(query: string): number {\n const q = query.toLowerCase();\n \n if (/how many|count/.test(q)) return 5;\n if (/^(find|search|show|list)\\b/.test(q) && q.length < 50) return 6;\n if (/architect|overview|structure|module/.test(q)) return 12;\n if (/how does|how is|implement|work/.test(q)) return 12; // Implementation needs more\n \n return 12; // Default\n}\n","/**\n * Argus AI Providers\n * \n * Factory for creating AI providers based on configuration.\n */\n\nimport { ArgusConfig, ProviderType, ProviderConfig } from '../core/config.js';\nimport { AIProvider } from './types.js';\nimport { createZAIProvider, createOpenAIProvider, createDeepSeekProvider } from './openai-compatible.js';\nimport { createOllamaProvider } from './ollama.js';\nimport { createAnthropicProvider } from './anthropic.js';\n\nexport type { AIProvider, Message, CompletionOptions, CompletionResult, ProviderConfig } from './types.js';\nexport { createZAIProvider, createOpenAIProvider, createDeepSeekProvider } from './openai-compatible.js';\nexport { createOllamaProvider, OllamaProvider } from './ollama.js';\nexport { createAnthropicProvider } from './anthropic.js';\n\n/**\n * Create an AI provider from Argus configuration\n */\nexport function createProvider(config: ArgusConfig): AIProvider {\n const providerType = config.provider;\n const providerConfig = config.providers[providerType];\n \n if (!providerConfig) {\n throw new Error(`No configuration found for provider: ${providerType}`);\n }\n \n return createProviderByType(providerType, providerConfig);\n}\n\n/**\n * Create an AI provider by type and config\n */\nexport function createProviderByType(type: ProviderType, config: ProviderConfig): AIProvider {\n switch (type) {\n case 'zai':\n return createZAIProvider(config);\n case 'openai':\n return createOpenAIProvider(config);\n case 'deepseek':\n return createDeepSeekProvider(config);\n case 'ollama':\n return createOllamaProvider(config);\n case 'anthropic':\n return createAnthropicProvider(config);\n default:\n throw new Error(`Unknown provider type: ${type}`);\n }\n}\n\n/**\n * Get a human-readable name for a provider\n */\nexport function getProviderDisplayName(type: ProviderType): string {\n switch (type) {\n case 'zai':\n return 'ZAI (GLM)';\n case 'openai':\n return 'OpenAI';\n case 'deepseek':\n return 'DeepSeek';\n case 'ollama':\n return 'Ollama (Local)';\n case 'anthropic':\n return 'Anthropic (Claude)';\n default:\n return type;\n }\n}\n\n/**\n * List all available provider types\n */\nexport function listProviderTypes(): ProviderType[] {\n return ['zai', 'anthropic', 'openai', 'deepseek', 'ollama'];\n}\n","/**\n * OpenAI-Compatible Provider\n * \n * Works with OpenAI, ZAI (GLM), DeepSeek, and any OpenAI-compatible API.\n */\n\nimport { AIProvider, Message, CompletionOptions, CompletionResult, ProviderConfig } from './types.js';\n\nexport class OpenAICompatibleProvider implements AIProvider {\n name: string;\n private config: ProviderConfig;\n \n constructor(name: string, config: ProviderConfig) {\n this.name = name;\n this.config = config;\n \n if (!config.apiKey) {\n throw new Error(`API key is required for ${name} provider`);\n }\n \n if (!config.baseUrl) {\n throw new Error(`Base URL is required for ${name} provider`);\n }\n }\n \n async complete(messages: Message[], options?: CompletionOptions): Promise<CompletionResult> {\n const endpoint = `${this.config.baseUrl}/chat/completions`;\n \n const body = {\n model: this.config.model,\n messages: messages.map(m => ({\n role: m.role,\n content: m.content,\n })),\n temperature: options?.temperature ?? this.config.options?.temperature ?? 0.2,\n max_tokens: options?.maxTokens ?? this.config.options?.max_tokens ?? 4096,\n ...(options?.stopSequences && { stop: options.stopSequences }),\n };\n \n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`${this.name} API error (${response.status}): ${errorText}`);\n }\n \n const data = await response.json() as {\n choices: Array<{\n message: { content: string };\n finish_reason: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n };\n \n const choice = data.choices[0];\n \n return {\n content: choice.message.content || '',\n finishReason: choice.finish_reason === 'stop' ? 'stop' : \n choice.finish_reason === 'length' ? 'length' : 'error',\n usage: data.usage ? {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n } : undefined,\n };\n }\n \n async healthCheck(): Promise<boolean> {\n try {\n const result = await this.complete([\n { role: 'user', content: 'Say \"ok\"' }\n ], { maxTokens: 10 });\n return result.content.length > 0;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Create a provider for ZAI GLM models\n */\nexport function createZAIProvider(config: ProviderConfig): AIProvider {\n return new OpenAICompatibleProvider('ZAI', {\n ...config,\n baseUrl: config.baseUrl || 'https://api.z.ai/api/coding/paas/v4',\n model: config.model || 'glm-4.7',\n });\n}\n\n/**\n * Create a provider for OpenAI models\n */\nexport function createOpenAIProvider(config: ProviderConfig): AIProvider {\n return new OpenAICompatibleProvider('OpenAI', {\n ...config,\n baseUrl: config.baseUrl || 'https://api.openai.com/v1',\n model: config.model || 'gpt-4o',\n });\n}\n\n/**\n * Create a provider for DeepSeek models\n */\nexport function createDeepSeekProvider(config: ProviderConfig): AIProvider {\n return new OpenAICompatibleProvider('DeepSeek', {\n ...config,\n baseUrl: config.baseUrl || 'https://api.deepseek.com',\n model: config.model || 'deepseek-chat',\n });\n}\n","/**\n * Ollama Provider\n * \n * Provider for local Ollama models.\n */\n\nimport { AIProvider, Message, CompletionOptions, CompletionResult, ProviderConfig } from './types.js';\n\nexport class OllamaProvider implements AIProvider {\n name = 'Ollama';\n private config: ProviderConfig;\n \n constructor(config: ProviderConfig) {\n this.config = {\n ...config,\n baseUrl: config.baseUrl || 'http://localhost:11434',\n model: config.model || 'qwen2.5-coder:7b',\n };\n }\n \n async complete(messages: Message[], options?: CompletionOptions): Promise<CompletionResult> {\n const endpoint = `${this.config.baseUrl}/api/chat`;\n \n const body = {\n model: this.config.model,\n messages: messages.map(m => ({\n role: m.role,\n content: m.content,\n })),\n stream: false,\n options: {\n temperature: options?.temperature ?? this.config.options?.temperature ?? 0.2,\n num_ctx: this.config.options?.num_ctx ?? 8192,\n },\n };\n \n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Ollama API error (${response.status}): ${errorText}`);\n }\n \n const data = await response.json() as {\n message: { content: string };\n done: boolean;\n eval_count?: number;\n prompt_eval_count?: number;\n };\n \n return {\n content: data.message.content || '',\n finishReason: data.done ? 'stop' : 'error',\n usage: data.eval_count ? {\n promptTokens: data.prompt_eval_count || 0,\n completionTokens: data.eval_count,\n totalTokens: (data.prompt_eval_count || 0) + data.eval_count,\n } : undefined,\n };\n }\n \n async healthCheck(): Promise<boolean> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/tags`);\n if (!response.ok) return false;\n \n const data = await response.json() as { models: Array<{ name: string }> };\n const hasModel = data.models.some(m => \n m.name === this.config.model || m.name.startsWith(this.config.model + ':')\n );\n \n return hasModel;\n } catch {\n return false;\n }\n }\n \n /**\n * List available models\n */\n async listModels(): Promise<string[]> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/tags`);\n if (!response.ok) return [];\n \n const data = await response.json() as { models: Array<{ name: string }> };\n return data.models.map(m => m.name);\n } catch {\n return [];\n }\n }\n}\n\nexport function createOllamaProvider(config: ProviderConfig): OllamaProvider {\n return new OllamaProvider(config);\n}\n","/**\n * Anthropic Provider\n * \n * Provider for Claude models via the Anthropic API.\n */\n\nimport { AIProvider, Message, CompletionOptions, CompletionResult, ProviderConfig } from './types.js';\n\nexport class AnthropicProvider implements AIProvider {\n name = 'Anthropic';\n private config: ProviderConfig;\n \n constructor(config: ProviderConfig) {\n if (!config.apiKey) {\n throw new Error('API key is required for Anthropic provider');\n }\n \n this.config = {\n ...config,\n baseUrl: config.baseUrl || 'https://api.anthropic.com',\n model: config.model || 'claude-sonnet-4-20250514',\n };\n }\n \n async complete(messages: Message[], options?: CompletionOptions): Promise<CompletionResult> {\n const endpoint = `${this.config.baseUrl}/v1/messages`;\n \n // Extract system message if present\n const systemMessage = messages.find(m => m.role === 'system');\n const nonSystemMessages = messages.filter(m => m.role !== 'system');\n \n const body = {\n model: this.config.model,\n max_tokens: options?.maxTokens ?? this.config.options?.max_tokens ?? 4096,\n ...(systemMessage && { system: systemMessage.content }),\n messages: nonSystemMessages.map(m => ({\n role: m.role,\n content: m.content,\n })),\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\n ...(options?.stopSequences && { stop_sequences: options.stopSequences }),\n };\n \n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey!,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify(body),\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Anthropic API error (${response.status}): ${errorText}`);\n }\n \n const data = await response.json() as {\n content: Array<{ type: string; text: string }>;\n stop_reason: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n };\n };\n \n const textContent = data.content\n .filter(c => c.type === 'text')\n .map(c => c.text)\n .join('');\n \n return {\n content: textContent,\n finishReason: data.stop_reason === 'end_turn' ? 'stop' : \n data.stop_reason === 'max_tokens' ? 'length' : 'error',\n usage: {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.input_tokens + data.usage.output_tokens,\n },\n };\n }\n \n async healthCheck(): Promise<boolean> {\n try {\n const result = await this.complete([\n { role: 'user', content: 'Say \"ok\"' }\n ], { maxTokens: 10 });\n return result.content.length > 0;\n } catch {\n return false;\n }\n }\n}\n\nexport function createAnthropicProvider(config: ProviderConfig): AIProvider {\n return new AnthropicProvider(config);\n}\n"],"mappings":"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","names":["resolve","fs","path","renderGlobalOnboarding","renderProjectOnboarding","existsSync","readFileSync","writeFileSync","statSync","readdirSync","mkdirSync","homedir","join","basename","path","execSync","existsSync","readFileSync","writeFileSync","join","content","readFileSync","writeFileSync","join","extname","join","extname","readFileSync","writeFileSync","readFileSync","readFileSync","execSync","path","existsSync","statSync","join","homedir","basename","readdirSync","writeFileSync","readFileSync","mkdirSync","parts","current"]}
|