@triedotdev/mcp 1.0.166 → 1.0.168
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +333 -805
- package/dist/chunk-2HF65EHQ.js +311 -0
- package/dist/chunk-2HF65EHQ.js.map +1 -0
- package/dist/{chunk-JNUOW2JS.js → chunk-4MXH2ZPT.js} +12 -12
- package/dist/chunk-4MXH2ZPT.js.map +1 -0
- package/dist/{chunk-LR5M4RTN.js → chunk-575YT2SD.js} +1 -1
- package/dist/chunk-575YT2SD.js.map +1 -0
- package/dist/{chunk-ZKKKLRZZ.js → chunk-5BRRRTN6.js} +4 -4
- package/dist/{chunk-TQOO6A4G.js → chunk-7WITSO22.js} +3 -3
- package/dist/{chunk-ACU2RJUJ.js → chunk-F6WFNUAY.js} +2 -2
- package/dist/{chunk-VR4VWXXU.js → chunk-G2TGF6TR.js} +9 -2
- package/dist/chunk-G2TGF6TR.js.map +1 -0
- package/dist/{chunk-ZBXW244P.js → chunk-HVCDY3AK.js} +3 -3
- package/dist/chunk-HVCDY3AK.js.map +1 -0
- package/dist/{chunk-HOGKPDZA.js → chunk-LQIMKE3P.js} +678 -151
- package/dist/chunk-LQIMKE3P.js.map +1 -0
- package/dist/{chunk-2Z3TQNNK.js → chunk-MRHKX5M5.js} +3 -3
- package/dist/{chunk-OLNZJ3XV.js → chunk-Q63FFI6D.js} +2 -2
- package/dist/{chunk-S36IO3EE.js → chunk-XE6KQRKZ.js} +9 -8
- package/dist/chunk-XE6KQRKZ.js.map +1 -0
- package/dist/{chunk-GDWA3CH3.js → chunk-XPZZFPBZ.js} +30 -6
- package/dist/chunk-XPZZFPBZ.js.map +1 -0
- package/dist/{chunk-JEZ7XJQN.js → chunk-XTFWT2XM.js} +2 -2
- package/dist/{chunk-UXRW2YSP.js → chunk-YDHUCDHM.js} +18 -112
- package/dist/chunk-YDHUCDHM.js.map +1 -0
- package/dist/{chunk-LG5CBK6A.js → chunk-YZ6Y2H3P.js} +21 -196
- package/dist/chunk-YZ6Y2H3P.js.map +1 -0
- package/dist/{chunk-MVVPJ73K.js → chunk-ZJF5FTBX.js} +126 -358
- package/dist/chunk-ZJF5FTBX.js.map +1 -0
- package/dist/cli/create-agent.js +1 -1
- package/dist/cli/create-agent.js.map +1 -1
- package/dist/cli/main.js +194 -849
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/yolo-daemon.js +15 -14
- package/dist/cli/yolo-daemon.js.map +1 -1
- package/dist/{fast-analyzer-NJQO3TFD.js → fast-analyzer-XXYMOXRK.js} +3 -3
- package/dist/git-EO5SRFMN.js +28 -0
- package/dist/{github-ingester-TFBDUDIY.js → github-ingester-ZOKK6GRS.js} +3 -3
- package/dist/{goal-manager-DVX24UPZ.js → goal-manager-YOB7VWK7.js} +5 -4
- package/dist/{goal-validator-6Y5CDEMJ.js → goal-validator-ULKIBDPX.js} +5 -4
- package/dist/{hypothesis-UKPGOYY2.js → hypothesis-7BFFT5JY.js} +5 -4
- package/dist/index.js +19 -18
- package/dist/index.js.map +1 -1
- package/dist/{issue-store-UZAPI5DU.js → issue-store-ZIRP23EP.js} +4 -3
- package/dist/{ledger-CNFCJKHX.js → ledger-TWZTGDFA.js} +3 -2
- package/dist/{linear-ingester-PLES2BRS.js → linear-ingester-XXPAZZRW.js} +3 -3
- package/dist/{output-manager-JNMEAXFO.js → output-manager-RVJ37XKA.js} +2 -2
- package/dist/server/mcp-server.js +19 -18
- package/dist/{tiered-storage-OP74NPJY.js → tiered-storage-Z3YCR465.js} +2 -2
- package/dist/{trie-agent-6SWUHCVO.js → trie-agent-3YDPEGHJ.js} +9 -8
- package/dist/trie-agent-3YDPEGHJ.js.map +1 -0
- package/package.json +3 -2
- package/dist/chunk-GDWA3CH3.js.map +0 -1
- package/dist/chunk-HOGKPDZA.js.map +0 -1
- package/dist/chunk-JNUOW2JS.js.map +0 -1
- package/dist/chunk-LG5CBK6A.js.map +0 -1
- package/dist/chunk-LR5M4RTN.js.map +0 -1
- package/dist/chunk-MVVPJ73K.js.map +0 -1
- package/dist/chunk-S36IO3EE.js.map +0 -1
- package/dist/chunk-UXRW2YSP.js.map +0 -1
- package/dist/chunk-VR4VWXXU.js.map +0 -1
- package/dist/chunk-ZBXW244P.js.map +0 -1
- /package/dist/{chunk-ZKKKLRZZ.js.map → chunk-5BRRRTN6.js.map} +0 -0
- /package/dist/{chunk-TQOO6A4G.js.map → chunk-7WITSO22.js.map} +0 -0
- /package/dist/{chunk-ACU2RJUJ.js.map → chunk-F6WFNUAY.js.map} +0 -0
- /package/dist/{chunk-2Z3TQNNK.js.map → chunk-MRHKX5M5.js.map} +0 -0
- /package/dist/{chunk-OLNZJ3XV.js.map → chunk-Q63FFI6D.js.map} +0 -0
- /package/dist/{chunk-JEZ7XJQN.js.map → chunk-XTFWT2XM.js.map} +0 -0
- /package/dist/{fast-analyzer-NJQO3TFD.js.map → fast-analyzer-XXYMOXRK.js.map} +0 -0
- /package/dist/{github-ingester-TFBDUDIY.js.map → git-EO5SRFMN.js.map} +0 -0
- /package/dist/{goal-manager-DVX24UPZ.js.map → github-ingester-ZOKK6GRS.js.map} +0 -0
- /package/dist/{goal-validator-6Y5CDEMJ.js.map → goal-manager-YOB7VWK7.js.map} +0 -0
- /package/dist/{hypothesis-UKPGOYY2.js.map → goal-validator-ULKIBDPX.js.map} +0 -0
- /package/dist/{issue-store-UZAPI5DU.js.map → hypothesis-7BFFT5JY.js.map} +0 -0
- /package/dist/{ledger-CNFCJKHX.js.map → issue-store-ZIRP23EP.js.map} +0 -0
- /package/dist/{linear-ingester-PLES2BRS.js.map → ledger-TWZTGDFA.js.map} +0 -0
- /package/dist/{output-manager-JNMEAXFO.js.map → linear-ingester-XXPAZZRW.js.map} +0 -0
- /package/dist/{tiered-storage-OP74NPJY.js.map → output-manager-RVJ37XKA.js.map} +0 -0
- /package/dist/{trie-agent-6SWUHCVO.js.map → tiered-storage-Z3YCR465.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/mcp-server.ts","../src/utils/ai-tool-detector.ts","../src/tools/test.ts","../src/tools/pr-review.ts","../src/tools/project-info.ts","../src/tools/init.ts","../src/tools/memory-search.ts","../src/tools/reconcile.ts","../src/tools/context.ts","../src/tools/linear-sync.ts","../src/tools/github-sync.ts","../src/tools/index-codebase.ts","../src/server/tool-registry.ts","../src/server/resource-manager.ts","../src/tools/visual-qa-browser.ts","../src/server/request-handlers.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\nimport { detectAITool } from '../utils/ai-tool-detector.js';\nimport { loadConfig } from '../config/loader.js';\nimport { ToolRegistry } from './tool-registry.js';\nimport { ResourceManager } from './resource-manager.js';\nimport { RequestHandlers } from './request-handlers.js';\n\nexport class MCPServer {\n private server: Server;\n private toolRegistry: ToolRegistry;\n private resourceManager: ResourceManager;\n private requestHandlers: RequestHandlers;\n\n constructor() {\n this.server = new Server(\n {\n name: 'trie',\n version: '1.0.0',\n description: 'Intelligent Agent Orchestration for AI Coding Tools. IMPORTANT: Read trie://context first to understand project state, priorities, and recent scan history before making changes.',\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n // Enable MCP Apps - interactive UI components in AI clients\n // See: https://blog.modelcontextprotocol.io/posts/2026-01-26-mcp-apps/\n experimental: {\n ui: {},\n },\n },\n }\n );\n\n this.toolRegistry = new ToolRegistry();\n this.resourceManager = new ResourceManager();\n this.requestHandlers = new RequestHandlers(this.toolRegistry, this.resourceManager);\n\n this.setupRequestHandlers();\n }\n\n private setupRequestHandlers() {\n // List tools handler\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: this.toolRegistry.getAllTools()\n };\n });\n\n // Call tool handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n return await this.requestHandlers.handleToolCall(name, args);\n });\n\n // List resources handler\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n return await this.requestHandlers.handleListResources();\n });\n\n // Read resource handler\n this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n return await this.requestHandlers.handleReadResource(uri);\n });\n }\n\n /**\n * Show startup banner\n */\n private showStartupBanner(toolCount: number, aiTool: string) {\n console.error(`\n ████████╗██████╗ ██╗███████╗\n ╚══██╔══╝██╔══██╗██║██╔════╝\n ██║ ██████╔╝██║█████╗\n ██║ ██╔══██╗██║██╔══╝\n ██║ ██║ ██║██║███████╗\n ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝\n Your central registry for Trie tools\n\n by Louis Kishfy\n\n Download the Trie workspace: https://www.trie.dev\n Follow me on X: https://x.com/louiskishfy\n\n ${toolCount} tools ready | ${aiTool}\n\n Quick Start:\n • \"Scan this code\" - Run Trie analysis\n • \"Use trie\" - Open the Trie menu\n • \"Use trie_fix\" - Apply high-confidence fixes\n\n Ready.\n`);\n }\n\n /**\n * Initialize and start the server\n */\n async start(): Promise<void> {\n try {\n // Detect the AI tool environment\n const aiTool = detectAITool();\n\n // Load configuration\n await loadConfig();\n\n const toolCount = this.toolRegistry.getAllTools().length;\n\n this.showStartupBanner(toolCount, aiTool.name);\n\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n } catch (error) {\n console.error('Fatal error starting MCP server:', error);\n process.exit(1);\n }\n }\n}\n\n/**\n * Start the MCP server\n */\nexport async function startServer(): Promise<void> {\n const server = new MCPServer();\n await server.start();\n}","import { AITool } from '../types/index.js';\n\nexport function detectAITool(): AITool {\n // Check environment variables set by AI tools\n if (process.env.CLAUDE_CODE_VERSION || process.env.CLAUDE_CODE) {\n return {\n name: 'Claude Code',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: true,\n };\n }\n\n if (process.env.CURSOR_IDE || process.env.CURSOR_TRACE_ID) {\n return {\n name: 'Cursor',\n preferredOutputFormat: 'rich-text',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n }\n\n if (process.env.OPENCODE_INSTANCE) {\n return {\n name: 'OpenCode',\n preferredOutputFormat: 'plain-text',\n supportsDiffs: false,\n supportsInlineActions: false,\n };\n }\n\n if (process.env.VSCODE_PID || process.env.VSCODE_IPC_HOOK) {\n return {\n name: 'VS Code',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n }\n\n // Check parent process name or other hints\n const parentProcess = process.env.PARENT_PROCESS_NAME || process.env._ || '';\n if (parentProcess.toLowerCase().includes('claude')) {\n return {\n name: 'Claude Code',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: true,\n };\n }\n\n if (parentProcess.toLowerCase().includes('cursor')) {\n return {\n name: 'Cursor',\n preferredOutputFormat: 'rich-text',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n }\n\n // Check if running via npx (likely from an MCP client)\n if (process.env.npm_execpath || process.argv[1]?.includes('npx')) {\n return {\n name: 'MCP Client',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n }\n\n // Default\n return {\n name: 'MCP Client',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n}","import { readFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { extname, relative, resolve, isAbsolute, dirname, basename, join } from 'path';\nimport { getPrompt, getSystemPrompt } from '../ai/prompts.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\n/**\n * Test Tool - AI-powered test generation and coverage analysis\n * \n * This tool can:\n * - Generate comprehensive tests for code\n * - Analyze test coverage gaps\n * - Suggest test improvements\n */\n\ninterface TestableUnit {\n name: string;\n type: 'function' | 'class' | 'method' | 'component';\n startLine: number;\n endLine: number;\n signature: string;\n complexity: number;\n dependencies: string[];\n}\n\nexport class TrieTestTool {\n async execute(args: any) {\n const { action, files, framework, style = 'unit' } = args || {};\n\n if (!action || !files || files.length === 0) {\n return {\n content: [{\n type: 'text',\n text: this.getHelpText()\n }]\n };\n }\n\n switch (action) {\n case 'generate':\n return this.generateTests(files, framework, style);\n case 'coverage':\n return this.analyzeCoverage(files);\n case 'suggest':\n return this.suggestTests(files);\n case 'run':\n return this.runTestsInfo(files);\n default:\n return {\n content: [{\n type: 'text',\n text: `Unknown action: ${action}`\n }]\n };\n }\n }\n\n private async generateTests(files: string[], framework?: string, style?: string) {\n const detectedFramework = framework || await this.detectTestFramework();\n \n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `🧪 TEST GENERATION\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n output += `## ⚙️ Configuration\\n\\n`;\n output += `- **Framework:** ${detectedFramework}\\n`;\n output += `- **Style:** ${style}\\n`;\n output += `- **Files:** ${files.length}\\n\\n`;\n\n const workDir = getWorkingDirectory(undefined, true);\n const allUnits: { file: string; units: TestableUnit[] }[] = [];\n\n for (const file of files) {\n const resolvedPath = isAbsolute(file) ? file : resolve(workDir, file);\n \n if (!existsSync(resolvedPath)) {\n output += `[!] File not found: ${file}\\n`;\n continue;\n }\n\n const code = await readFile(resolvedPath, 'utf-8');\n const language = this.detectLanguage(resolvedPath);\n const relativePath = relative(workDir, resolvedPath);\n const units = this.extractTestableUnits(code, language);\n\n allUnits.push({ file: relativePath, units });\n\n output += `### 📄 ${relativePath}\\n\\n`;\n output += `Found **${units.length}** testable units:\\n\\n`;\n\n for (const unit of units) {\n const complexityIcon = unit.complexity > 10 ? '🔴' : unit.complexity > 5 ? '🟡' : '🟢';\n output += `- ${complexityIcon} \\`${unit.name}\\` (${unit.type}, complexity: ${unit.complexity})\\n`;\n if (unit.dependencies.length > 0) {\n output += ` - Dependencies: ${unit.dependencies.join(', ')}\\n`;\n }\n }\n output += '\\n';\n }\n\n // Generate the test file content\n output += `${'─'.repeat(60)}\\n`;\n output += `## 🧠 Test Generation Request\\n\\n`;\n \n const systemPrompt = getSystemPrompt('test');\n output += `**Role:** ${systemPrompt.split('\\n')[0]}\\n\\n`;\n\n for (const { file, units } of allUnits) {\n if (units.length === 0) continue;\n\n const code = await readFile(resolve(workDir, file), 'utf-8');\n const language = this.detectLanguage(file);\n\n const prompt = getPrompt('test', 'generate', {\n code,\n language,\n filePath: file,\n framework: detectedFramework,\n });\n\n output += `### Tests for ${file}\\n\\n`;\n output += prompt;\n output += '\\n\\n';\n }\n\n output += `${'─'.repeat(60)}\\n`;\n output += `\\n## 📝 Expected Test Output\\n\\n`;\n output += `Generate complete test files with:\\n`;\n output += `- All imports and setup\\n`;\n output += `- Tests for each function/method\\n`;\n output += `- Edge cases and error scenarios\\n`;\n output += `- Mock requirements clearly stated\\n`;\n output += `- Ready to copy and run\\n`;\n\n return { content: [{ type: 'text', text: output }] };\n }\n\n private async analyzeCoverage(files: string[]) {\n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `📊 COVERAGE ANALYSIS\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n const workDir = getWorkingDirectory(undefined, true);\n\n for (const file of files) {\n const resolvedPath = isAbsolute(file) ? file : resolve(workDir, file);\n \n if (!existsSync(resolvedPath)) {\n output += `[!] File not found: ${file}\\n`;\n continue;\n }\n\n const code = await readFile(resolvedPath, 'utf-8');\n const language = this.detectLanguage(resolvedPath);\n const relativePath = relative(workDir, resolvedPath);\n const units = this.extractTestableUnits(code, language);\n\n // Try to find existing tests\n const testFile = await this.findTestFile(resolvedPath);\n let testCode = '';\n let testedUnits: string[] = [];\n\n if (testFile) {\n testCode = await readFile(testFile, 'utf-8');\n testedUnits = this.findTestedUnits(testCode, units.map(u => u.name));\n }\n\n const coverage = units.length > 0 \n ? Math.round((testedUnits.length / units.length) * 100)\n : 0;\n\n const coverageIcon = coverage >= 80 ? '🟢' : coverage >= 50 ? '🟡' : '🔴';\n\n output += `### 📄 ${relativePath}\\n\\n`;\n output += `**Coverage:** ${coverageIcon} ${coverage}% (${testedUnits.length}/${units.length} units)\\n`;\n if (testFile) {\n output += `**Test file:** \\`${relative(workDir, testFile)}\\`\\n`;\n } else {\n output += `**Test file:** ❌ Not found\\n`;\n }\n output += '\\n';\n\n // Show what's tested and what's not\n const untested = units.filter(u => !testedUnits.includes(u.name));\n \n if (untested.length > 0) {\n output += `**Missing Tests:**\\n`;\n for (const unit of untested) {\n const priority = unit.complexity > 5 ? '🔴 HIGH' : '🟡 MEDIUM';\n output += `- ${priority}: \\`${unit.name}\\` (${unit.type})\\n`;\n }\n output += '\\n';\n }\n\n if (testedUnits.length > 0) {\n output += `**Tested:**\\n`;\n for (const name of testedUnits) {\n output += `- ✅ \\`${name}\\`\\n`;\n }\n output += '\\n';\n }\n }\n\n output += `${'─'.repeat(60)}\\n`;\n output += `## 📋 Recommendations\\n\\n`;\n output += `To improve coverage:\\n`;\n output += `1. Focus on high-complexity untested functions first\\n`;\n output += `2. Add edge case tests for existing coverage\\n`;\n output += `3. Consider integration tests for complex interactions\\n`;\n output += `\\nRun \\`trie_test action:generate files:[\"file.ts\"]\\` to generate missing tests.\\n`;\n\n return { content: [{ type: 'text', text: output }] };\n }\n\n private async suggestTests(files: string[]) {\n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `💡 TEST SUGGESTIONS\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n const workDir = getWorkingDirectory(undefined, true);\n\n for (const file of files) {\n const resolvedPath = isAbsolute(file) ? file : resolve(workDir, file);\n \n if (!existsSync(resolvedPath)) {\n output += `[!] File not found: ${file}\\n`;\n continue;\n }\n\n const code = await readFile(resolvedPath, 'utf-8');\n const relativePath = relative(workDir, resolvedPath);\n \n // Analyze patterns that need testing\n const patterns = this.detectTestablePatterns(code);\n\n output += `### 📄 ${relativePath}\\n\\n`;\n\n if (patterns.length === 0) {\n output += `No specific test suggestions for this file.\\n\\n`;\n continue;\n }\n\n output += `| Priority | Pattern | Suggested Test |\\n`;\n output += `|----------|---------|----------------|\\n`;\n \n for (const pattern of patterns) {\n output += `| ${pattern.priority} | ${pattern.name} | ${pattern.suggestion} |\\n`;\n }\n output += '\\n';\n }\n\n return { content: [{ type: 'text', text: output }] };\n }\n\n private async runTestsInfo(files: string[]) {\n const framework = await this.detectTestFramework();\n \n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `RUN TESTS\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n output += `## Detected Configuration\\n\\n`;\n output += `- **Framework:** ${framework}\\n`;\n output += `- **Files:** ${files.join(', ')}\\n\\n`;\n\n output += `## Commands\\n\\n`;\n\n switch (framework) {\n case 'jest':\n output += `\\`\\`\\`bash\\n`;\n output += `# Run all tests\\n`;\n output += `npx jest\\n\\n`;\n output += `# Run specific files\\n`;\n output += `npx jest ${files.join(' ')}\\n\\n`;\n output += `# Run with coverage\\n`;\n output += `npx jest --coverage\\n`;\n output += `\\`\\`\\`\\n`;\n break;\n case 'vitest':\n output += `\\`\\`\\`bash\\n`;\n output += `# Run all tests\\n`;\n output += `npx vitest run\\n\\n`;\n output += `# Run specific files\\n`;\n output += `npx vitest run ${files.join(' ')}\\n\\n`;\n output += `# Run with coverage\\n`;\n output += `npx vitest run --coverage\\n`;\n output += `\\`\\`\\`\\n`;\n break;\n case 'pytest':\n output += `\\`\\`\\`bash\\n`;\n output += `# Run all tests\\n`;\n output += `pytest\\n\\n`;\n output += `# Run specific files\\n`;\n output += `pytest ${files.join(' ')}\\n\\n`;\n output += `# Run with coverage\\n`;\n output += `pytest --cov\\n`;\n output += `\\`\\`\\`\\n`;\n break;\n default:\n output += `Run your test framework with the specified files.\\n`;\n }\n\n output += `\\n*Note: This tool provides test commands but doesn't execute them directly.*\\n`;\n\n return { content: [{ type: 'text', text: output }] };\n }\n\n private extractTestableUnits(code: string, language: string): TestableUnit[] {\n const units: TestableUnit[] = [];\n const lines = code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] || '';\n\n // Function declarations\n const funcMatch = line.match(/(?:export\\s+)?(?:async\\s+)?function\\s+(\\w+)\\s*\\(([^)]*)\\)/);\n if (funcMatch) {\n const endLine = this.findBlockEnd(lines, i);\n const body = lines.slice(i, endLine + 1).join('\\n');\n units.push({\n name: funcMatch[1]!,\n type: 'function',\n startLine: i + 1,\n endLine: endLine + 1,\n signature: `${funcMatch[1]}(${funcMatch[2]})`,\n complexity: this.calculateComplexity(body),\n dependencies: this.extractDependencies(body),\n });\n }\n\n // Arrow functions\n const arrowMatch = line.match(/(?:export\\s+)?(?:const|let)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\([^)]*\\)\\s*(?:=>|:)/);\n if (arrowMatch) {\n const endLine = this.findBlockEnd(lines, i);\n const body = lines.slice(i, endLine + 1).join('\\n');\n units.push({\n name: arrowMatch[1]!,\n type: 'function',\n startLine: i + 1,\n endLine: endLine + 1,\n signature: arrowMatch[1]!,\n complexity: this.calculateComplexity(body),\n dependencies: this.extractDependencies(body),\n });\n }\n\n // Classes\n const classMatch = line.match(/(?:export\\s+)?class\\s+(\\w+)/);\n if (classMatch) {\n const endLine = this.findBlockEnd(lines, i);\n units.push({\n name: classMatch[1]!,\n type: 'class',\n startLine: i + 1,\n endLine: endLine + 1,\n signature: `class ${classMatch[1]}`,\n complexity: this.calculateComplexity(lines.slice(i, endLine + 1).join('\\n')),\n dependencies: [],\n });\n }\n\n // React components\n const componentMatch = line.match(/(?:export\\s+)?(?:const|function)\\s+([A-Z]\\w+)\\s*[=:]/);\n if (componentMatch && /jsx|tsx/.test(language)) {\n const endLine = this.findBlockEnd(lines, i);\n units.push({\n name: componentMatch[1]!,\n type: 'component',\n startLine: i + 1,\n endLine: endLine + 1,\n signature: componentMatch[1]!,\n complexity: this.calculateComplexity(lines.slice(i, endLine + 1).join('\\n')),\n dependencies: this.extractDependencies(lines.slice(i, endLine + 1).join('\\n')),\n });\n }\n }\n\n return units;\n }\n\n private findBlockEnd(lines: string[], startLine: number): number {\n let braceCount = 0;\n let started = false;\n\n for (let i = startLine; i < lines.length; i++) {\n const line = lines[i] || '';\n \n for (const char of line) {\n if (char === '{') {\n braceCount++;\n started = true;\n } else if (char === '}') {\n braceCount--;\n }\n }\n\n if (started && braceCount === 0) {\n return i;\n }\n }\n\n return lines.length - 1;\n }\n\n private calculateComplexity(code: string): number {\n let complexity = 1;\n const patterns = [\n /if\\s*\\(/g, /else\\s+if/g, /\\?\\s*[^:]/g, // Conditionals\n /for\\s*\\(/g, /while\\s*\\(/g, /do\\s*\\{/g, // Loops\n /catch\\s*\\(/g, // Error handling\n /&&/g, /\\|\\|/g, // Logical operators\n /case\\s+/g, // Switch cases\n ];\n\n for (const pattern of patterns) {\n const matches = code.match(pattern);\n if (matches) {\n complexity += matches.length;\n }\n }\n\n return complexity;\n }\n\n private extractDependencies(code: string): string[] {\n const deps: string[] = [];\n \n // Look for function calls\n const calls = code.match(/\\b([a-z]\\w+)\\s*\\(/gi) || [];\n const builtins = ['if', 'for', 'while', 'switch', 'catch', 'function', 'return', 'throw', 'new', 'await', 'async'];\n \n for (const call of calls) {\n const name = call.replace(/\\s*\\($/, '');\n if (!builtins.includes(name.toLowerCase()) && !deps.includes(name)) {\n deps.push(name);\n }\n }\n\n return deps.slice(0, 10); // Limit to 10\n }\n\n private async findTestFile(sourcePath: string): Promise<string | null> {\n const dir = dirname(sourcePath);\n const base = basename(sourcePath, extname(sourcePath));\n const ext = extname(sourcePath);\n\n // Common test file patterns\n const patterns = [\n `${base}.test${ext}`,\n `${base}.spec${ext}`,\n `${base}_test${ext}`,\n `test_${base}${ext}`,\n ];\n\n // Check same directory\n for (const pattern of patterns) {\n const testPath = join(dir, pattern);\n if (existsSync(testPath)) {\n return testPath;\n }\n }\n\n // Check __tests__ directory\n const testsDir = join(dir, '__tests__');\n if (existsSync(testsDir)) {\n for (const pattern of patterns) {\n const testPath = join(testsDir, pattern);\n if (existsSync(testPath)) {\n return testPath;\n }\n }\n }\n\n return null;\n }\n\n private findTestedUnits(testCode: string, unitNames: string[]): string[] {\n const tested: string[] = [];\n\n for (const name of unitNames) {\n // Look for the name in test descriptions or assertions\n const patterns = [\n new RegExp(`describe\\\\s*\\\\([^)]*${name}`, 'i'),\n new RegExp(`it\\\\s*\\\\([^)]*${name}`, 'i'),\n new RegExp(`test\\\\s*\\\\([^)]*${name}`, 'i'),\n new RegExp(`expect\\\\s*\\\\([^)]*${name}`, 'i'),\n ];\n\n for (const pattern of patterns) {\n if (pattern.test(testCode)) {\n tested.push(name);\n break;\n }\n }\n }\n\n return tested;\n }\n\n private detectTestablePatterns(code: string): Array<{ priority: string; name: string; suggestion: string }> {\n const patterns: Array<{ priority: string; name: string; suggestion: string }> = [];\n\n const checks = [\n { pattern: /async\\s+function|await\\s+/i, priority: '🔴 HIGH', name: 'Async code', suggestion: 'Test async flows and error handling' },\n { pattern: /try\\s*{[^}]*catch/i, priority: '🔴 HIGH', name: 'Error handling', suggestion: 'Test both success and error paths' },\n { pattern: /if\\s*\\([^)]*&&[^)]*\\)/i, priority: '🟡 MED', name: 'Complex conditionals', suggestion: 'Test all condition branches' },\n { pattern: /\\.map\\(|\\.filter\\(|\\.reduce\\(/i, priority: '🟡 MED', name: 'Array operations', suggestion: 'Test with empty, single, multiple items' },\n { pattern: /fetch\\(|axios\\.|request\\(/i, priority: '🔴 HIGH', name: 'HTTP requests', suggestion: 'Mock API calls, test error responses' },\n { pattern: /localStorage|sessionStorage/i, priority: '🟡 MED', name: 'Storage usage', suggestion: 'Mock storage, test read/write' },\n { pattern: /setTimeout|setInterval/i, priority: '🟡 MED', name: 'Timers', suggestion: 'Use fake timers in tests' },\n { pattern: /useState|useEffect|useCallback/i, priority: '🔴 HIGH', name: 'React hooks', suggestion: 'Test hook behavior and updates' },\n { pattern: /form|input|submit/i, priority: '🟡 MED', name: 'Form handling', suggestion: 'Test validation and submission' },\n ];\n\n for (const { pattern, priority, name, suggestion } of checks) {\n if (pattern.test(code)) {\n patterns.push({ priority, name, suggestion });\n }\n }\n\n return patterns;\n }\n\n private async detectTestFramework(): Promise<string> {\n const workDir = getWorkingDirectory(undefined, true);\n const packagePath = resolve(workDir, 'package.json');\n \n if (existsSync(packagePath)) {\n try {\n const pkg = JSON.parse(await readFile(packagePath, 'utf-8'));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n \n if (deps.vitest) return 'vitest';\n if (deps.jest) return 'jest';\n if (deps.mocha) return 'mocha';\n } catch {\n // Ignore parse errors\n }\n }\n\n // Check for pytest\n if (existsSync(resolve(workDir, 'pytest.ini')) ||\n existsSync(resolve(workDir, 'pyproject.toml'))) {\n return 'pytest';\n }\n\n return 'jest'; // Default\n }\n\n private detectLanguage(filePath: string): string {\n const ext = extname(filePath).toLowerCase();\n const langMap: Record<string, string> = {\n '.ts': 'typescript', '.tsx': 'tsx', '.js': 'javascript', '.jsx': 'jsx',\n '.py': 'python', '.go': 'go', '.rs': 'rust',\n };\n return langMap[ext] || 'javascript';\n }\n\n private getHelpText(): string {\n return `\n${'━'.repeat(60)}\n🧪 TRIE TEST - AI-POWERED TEST GENERATION\n${'━'.repeat(60)}\n\n## Usage\n\n### Generate tests:\n\\`\\`\\`\ntrie_test action:\"generate\" files:[\"src/utils.ts\"]\n\\`\\`\\`\n\n### Analyze coverage:\n\\`\\`\\`\ntrie_test action:\"coverage\" files:[\"src/utils.ts\"]\n\\`\\`\\`\n\n### Get test suggestions:\n\\`\\`\\`\ntrie_test action:\"suggest\" files:[\"src/app.ts\"]\n\\`\\`\\`\n\n### Get run commands:\n\\`\\`\\`\ntrie_test action:\"run\" files:[\"src/utils.test.ts\"]\n\\`\\`\\`\n\n## Options\n\n| Option | Values | Description |\n|--------|--------|-------------|\n| action | generate, coverage, suggest, run | What to do |\n| files | Array of paths | Files to analyze |\n| framework | jest, vitest, mocha, pytest | Test framework |\n| style | unit, integration, e2e, all | Test style |\n`;\n }\n}\n","import { readFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join, basename, resolve, isAbsolute } from 'path';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { runShellCommandSync } from '../utils/command-runner.js';\n\n/**\n * PR Review Tool — Interactive AI-Guided Code Review\n * \n * Based on https://github.com/sitaram/devtools/blob/main/pr_review.md\n * \n * Code reviews are the bottleneck in AI coding. This tool scales them by\n * putting the human back in the loop, shepherded by AI.\n */\nexport class TriePRReviewTool {\n // Review workflow is now ledger-driven; keep a lightweight built-in checklist.\n private CRITICAL_REVIEW_CHECKLIST = {\n stateAndLifecycle: [\n 'Uninitialized state accessed before setup',\n 'Missing cleanup on unmount/dispose',\n 'State mutations in wrong lifecycle phase',\n ],\n edgeCasesAndRaces: [\n 'Race conditions in async operations',\n 'Missing error handling for edge cases',\n 'Unhandled promise rejections',\n ],\n missingPieces: [\n 'Missing input validation',\n 'Missing error handling',\n 'Missing logging/monitoring',\n ],\n };\n\n private exec(command: string, cwd?: string, maxBuffer?: number): string {\n const opts: Parameters<typeof runShellCommandSync>[2] = {\n captureOutput: false,\n redactOutput: true,\n ...(cwd ? { cwd } : {}),\n ...(maxBuffer ? { maxBuffer } : {}),\n };\n const { stdout } = runShellCommandSync(\n command,\n { actor: 'tool:pr-review', triggeredBy: 'manual', targetPath: cwd ?? getWorkingDirectory(undefined, true) },\n opts\n );\n return stdout.trimEnd();\n }\n\n async execute(args: any) {\n const { \n pr, \n worktree,\n mode,\n files: _specificFiles, // Reserved for future file filtering\n } = args;\n\n try {\n // Step 1: Determine target and get PR info\n const prInfo = await this.getPRInfo(pr, worktree);\n \n if (!prInfo.success) {\n return {\n content: [{\n type: 'text',\n text: `${prInfo.error}\\n\\nUsage:\\n- \\`pr_review 12345\\` — review specific PR\\n- \\`pr_review\\` — review PR for current branch\\n- \\`pr_review ../worktree\\` — review worktree changes`\n }]\n };\n }\n\n // Step 2: Get the diff and changed files\n const changes = await this.getChanges(prInfo);\n \n if (changes.files.length === 0) {\n return {\n content: [{\n type: 'text',\n text: `No changes found to review.`\n }]\n };\n }\n\n // Step 3: Look for design docs\n const designDocs = await this.findDesignDocs(changes.files, prInfo);\n\n // Step 4: Build the review workflow\n const workflow = this.buildReviewWorkflow(changes.files, {\n ...(prInfo.number ? { prNumber: prInfo.number } : {}),\n ...(prInfo.title ? { prTitle: prInfo.title } : {}),\n ...(prInfo.author ? { prAuthor: prInfo.author } : {}),\n ...(prInfo.baseBranch ? { baseBranch: prInfo.baseBranch } : {}),\n ...(prInfo.headBranch ? { headBranch: prInfo.headBranch } : {}),\n mode: mode || 'own',\n designDocs,\n });\n\n // Step 5: Pre-load all file contents for instant responses\n const fileContents = await this.preloadFiles(changes.files.map(f => f.path));\n\n // Step 6: Generate the review prompt\n const reviewPrompt = this.generateReviewPrompt(workflow, changes, fileContents);\n\n return {\n content: [{\n type: 'text',\n text: reviewPrompt\n }]\n };\n\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : String(error)}`\n }]\n };\n }\n }\n\n /**\n * Get PR information from GitHub or local worktree\n */\n private async getPRInfo(pr?: string, worktree?: string): Promise<PRInfo> {\n // If worktree path provided, analyze local changes\n if (worktree) {\n const worktreePath = isAbsolute(worktree) ? worktree : resolve(getWorkingDirectory(undefined, true), worktree);\n if (!existsSync(worktreePath)) {\n return { success: false, error: `Worktree not found: ${worktreePath}` };\n }\n \n return {\n success: true,\n type: 'worktree',\n path: worktreePath,\n title: `Local changes in ${basename(worktreePath)}`,\n author: this.getGitUser(),\n baseBranch: 'HEAD~1',\n headBranch: 'HEAD',\n };\n }\n\n // If PR number provided, get from GitHub\n if (pr) {\n return this.getPRFromGitHub(pr);\n }\n\n // No args — try to get PR for current branch\n try {\n this.exec('git branch --show-current');\n \n // Check if there's a PR for this branch\n const prJson = this.exec(\n `gh pr view --json number,title,author,headRefName,baseRefName`\n );\n \n const prData = JSON.parse(prJson);\n \n return {\n success: true,\n type: 'github',\n number: String(prData.number),\n title: prData.title,\n author: prData.author?.login || 'unknown',\n baseBranch: prData.baseRefName,\n headBranch: prData.headRefName,\n };\n } catch {\n // No PR found, fall back to local changes\n return {\n success: true,\n type: 'local',\n title: 'Local uncommitted changes',\n author: this.getGitUser(),\n baseBranch: 'HEAD',\n headBranch: 'working tree',\n };\n }\n }\n\n /**\n * Get PR info from GitHub CLI\n */\n private async getPRFromGitHub(prNumber: string): Promise<PRInfo> {\n try {\n const prJson = this.exec(\n `gh pr view ${prNumber} --json number,title,author,headRefName,baseRefName`\n );\n \n const prData = JSON.parse(prJson);\n \n return {\n success: true,\n type: 'github',\n number: String(prData.number),\n title: prData.title,\n author: prData.author?.login || 'unknown',\n baseBranch: prData.baseRefName,\n headBranch: prData.headRefName,\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to get PR #${prNumber}. Is \\`gh\\` CLI installed and authenticated?`\n };\n }\n }\n\n /**\n * Get changes (diff) for the PR or local changes\n */\n private async getChanges(prInfo: PRInfo): Promise<{ files: ChangedFile[]; fullDiff: string }> {\n let diffOutput: string;\n \n try {\n if (prInfo.type === 'github' && prInfo.number) {\n // Get diff from GitHub PR\n diffOutput = this.exec(`gh pr diff ${prInfo.number}`, undefined, 50 * 1024 * 1024);\n } else if (prInfo.type === 'worktree' && prInfo.path) {\n // Get diff from worktree\n diffOutput = this.exec(`git diff HEAD`, prInfo.path, 50 * 1024 * 1024);\n } else {\n // Local changes\n diffOutput = this.exec(`git diff HEAD`, undefined, 50 * 1024 * 1024);\n \n // If no diff, try staged changes\n if (!diffOutput.trim()) {\n diffOutput = this.exec(`git diff --cached`, undefined, 50 * 1024 * 1024);\n }\n }\n } catch {\n diffOutput = '';\n }\n\n // Parse the diff to extract file information\n const files = this.parseDiff(diffOutput);\n\n return { files, fullDiff: diffOutput };\n }\n\n /**\n * Parse git diff output into structured file changes\n */\n private parseDiff(diffOutput: string): ChangedFile[] {\n const files: ChangedFile[] = [];\n const fileDiffs = diffOutput.split(/^diff --git /m).slice(1);\n\n for (const fileDiff of fileDiffs) {\n const lines = fileDiff.split('\\n');\n const headerLine = lines[0] || '';\n \n // Extract file path from \"a/path b/path\"\n const pathMatch = headerLine.match(/a\\/(.+?) b\\/(.+)/);\n if (!pathMatch || !pathMatch[2]) continue;\n \n const path: string = pathMatch[2];\n const diff = `diff --git ${fileDiff}`;\n \n // Count additions and deletions\n let additions = 0;\n let deletions = 0;\n \n for (const line of lines) {\n if (line.startsWith('+') && !line.startsWith('+++')) {\n additions++;\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n deletions++;\n }\n }\n \n files.push({ path, diff, additions, deletions, status: 'modified' });\n }\n\n return files;\n }\n\n private buildReviewWorkflow(\n files: ChangedFile[],\n context: {\n prNumber?: string;\n prTitle?: string;\n prAuthor?: string;\n baseBranch?: string;\n headBranch?: string;\n mode: string;\n designDocs: string[];\n }\n ): {\n metadata: {\n prNumber?: string;\n prTitle: string;\n prAuthor: string;\n baseBranch: string;\n headBranch: string;\n totalFiles: number;\n totalAdditions: number;\n totalDeletions: number;\n designDocs: string[];\n };\n fileOrder: Array<{ index: number; path: string; reason: string }>;\n reviewInstructions: { mode: 'own' | 'others'; description: string };\n } {\n const totalAdditions = files.reduce((sum, f) => sum + (f.additions || 0), 0);\n const totalDeletions = files.reduce((sum, f) => sum + (f.deletions || 0), 0);\n\n const reviewMode: 'own' | 'others' = context.mode === 'others' ? 'others' : 'own';\n const reviewInstructions = {\n mode: reviewMode,\n description:\n reviewMode === 'own'\n ? 'Your PR — focus on footguns, missing tests, and production risks.'\n : \"Someone else's PR — focus on correctness, clarity, and maintainability.\",\n };\n\n const sorted = [...files].sort((a, b) => a.path.localeCompare(b.path));\n const fileOrder = sorted.map((f, i) => ({\n index: i + 1,\n path: f.path,\n reason: i === 0 ? 'Start here to establish baseline context' : 'Proceed in filename order',\n }));\n\n return {\n metadata: {\n ...(context.prNumber ? { prNumber: context.prNumber } : {}),\n prTitle: context.prTitle || 'PR Review',\n prAuthor: context.prAuthor || 'unknown',\n baseBranch: context.baseBranch || 'unknown',\n headBranch: context.headBranch || 'unknown',\n totalFiles: files.length,\n totalAdditions,\n totalDeletions,\n designDocs: context.designDocs,\n },\n fileOrder,\n reviewInstructions,\n };\n }\n\n /**\n * Find related design docs\n */\n private async findDesignDocs(files: ChangedFile[], prInfo: PRInfo): Promise<string[]> {\n const designDocs: string[] = [];\n const cwd = prInfo.path || getWorkingDirectory(undefined, true);\n \n // Check for design_docs/ in changed files\n for (const file of files) {\n if (file.path.includes('design_docs/') || \n file.path.includes('docs/design/') ||\n file.path.includes('rfcs/')) {\n designDocs.push(file.path);\n }\n }\n \n // Look for design docs in standard locations\n const designDocPaths = [\n 'design_docs',\n 'docs/design',\n 'docs/rfcs',\n 'rfcs',\n ];\n \n for (const docPath of designDocPaths) {\n const fullPath = join(cwd, docPath);\n if (existsSync(fullPath)) {\n // Could list and add recent docs, but for now just note the directory exists\n }\n }\n \n return designDocs;\n }\n\n /**\n * Pre-load all changed files for instant responses during review\n */\n private async preloadFiles(filePaths: string[]): Promise<Map<string, string>> {\n const contents = new Map<string, string>();\n const cwd = getWorkingDirectory(undefined, true);\n \n await Promise.all(filePaths.map(async (filePath) => {\n try {\n const fullPath = isAbsolute(filePath) ? filePath : join(cwd, filePath);\n if (existsSync(fullPath)) {\n const content = await readFile(fullPath, 'utf-8');\n contents.set(filePath, content);\n }\n } catch {\n // Skip unreadable files\n }\n }));\n \n return contents;\n }\n\n /**\n * Get git user name\n */\n private getGitUser(): string {\n try {\n return this.exec('git config user.name');\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Generate the full review prompt for Claude to execute\n */\n private generateReviewPrompt(\n workflow: any,\n changes: { files: ChangedFile[]; fullDiff: string },\n _fileContents: Map<string, string> // Reserved for future: inline file contents in review\n ): string {\n const { metadata, fileOrder, reviewInstructions } = workflow;\n \n let prompt = `# 🔍 Super Reviewer — Interactive PR Review\\n\\n`;\n \n // PR Header\n if (metadata.prNumber) {\n prompt += `## PR #${metadata.prNumber}: ${metadata.prTitle}\\n\\n`;\n } else {\n prompt += `## ${metadata.prTitle}\\n\\n`;\n }\n \n prompt += `**Author:** ${metadata.prAuthor}\\n`;\n prompt += `**Branch:** \\`${metadata.headBranch}\\` → \\`${metadata.baseBranch}\\`\\n`;\n prompt += `**Scope:** ${metadata.totalFiles} files, +${metadata.totalAdditions}/-${metadata.totalDeletions} lines\\n\\n`;\n \n prompt += `---\\n\\n`;\n \n // Review Mode Selection\n prompt += `## Review Mode\\n\\n`;\n prompt += `**Current Mode:** ${reviewInstructions.mode === 'own' ? '1' : '2'}. ${reviewInstructions.description}\\n\\n`;\n prompt += `> To switch modes, say \"mode 1\" for your own PR or \"mode 2\" for someone else's\\n\\n`;\n \n prompt += `---\\n\\n`;\n \n // File Order Table\n prompt += `## Files to Review (ordered for understanding)\\n\\n`;\n prompt += `| # | File | Why this order |\\n`;\n prompt += `|---|------|----------------|\\n`;\n \n for (const file of fileOrder) {\n const stats = `+${changes.files.find(f => f.path === file.path)?.additions || 0}/-${changes.files.find(f => f.path === file.path)?.deletions || 0}`;\n prompt += `| ${file.index} | \\`${file.path}\\` (${stats}) | ${file.reason} |\\n`;\n }\n \n prompt += `\\n---\\n\\n`;\n \n // Critical Review Mindset\n prompt += `## Critical Review Mindset\\n\\n`;\n prompt += `As we go through each file, I'll actively look for:\\n\\n`;\n \n prompt += `**State & Lifecycle:**\\n`;\n for (const check of this.CRITICAL_REVIEW_CHECKLIST.stateAndLifecycle) {\n prompt += `- ${check}\\n`;\n }\n \n prompt += `\\n**Edge Cases & Races:**\\n`;\n for (const check of this.CRITICAL_REVIEW_CHECKLIST.edgeCasesAndRaces) {\n prompt += `- ${check}\\n`;\n }\n \n prompt += `\\n**Missing Pieces:**\\n`;\n for (const check of this.CRITICAL_REVIEW_CHECKLIST.missingPieces) {\n prompt += `- ${check}\\n`;\n }\n \n prompt += `\\n---\\n\\n`;\n \n // Pre-loaded diffs\n prompt += `## File Diffs (pre-loaded for instant review)\\n\\n`;\n prompt += `<details>\\n<summary>📁 All file diffs (click to expand)</summary>\\n\\n`;\n \n for (const file of fileOrder) {\n const fileChange = changes.files.find(f => f.path === file.path);\n if (fileChange) {\n prompt += `### ${file.path}\\n\\n`;\n prompt += `\\`\\`\\`diff\\n${fileChange.diff}\\n\\`\\`\\`\\n\\n`;\n }\n }\n \n prompt += `</details>\\n\\n`;\n \n prompt += `---\\n\\n`;\n \n // Ready to start\n prompt += `## Ready to Begin\\n\\n`;\n prompt += `I'll walk you through each file, explaining what changed and why. After each file, I'll pause for your questions.\\n\\n`;\n prompt += `**Commands during review:**\\n`;\n prompt += `- \\`yes\\` or \\`y\\` — continue to next file\\n`;\n prompt += `- \\`skip to [filename]\\` — jump to specific file\\n`;\n prompt += `- \\`questions?\\` — ask about current file\\n`;\n prompt += `- \\`reorder\\` — change the file order\\n`;\n prompt += `- \\`done\\` — end review and show summary\\n\\n`;\n \n prompt += `**Ready for File 1?** (\\`${fileOrder[0]?.path || 'no files'}\\`)\\n\\n`;\n prompt += `*(say \"yes\" to start, or ask me anything)*\\n`;\n \n return prompt;\n }\n}\n\n// Type definitions\ninterface PRInfo {\n success: boolean;\n error?: string;\n type?: 'github' | 'worktree' | 'local';\n number?: string;\n title?: string;\n author?: string;\n baseBranch?: string;\n headBranch?: string;\n path?: string;\n}\n\ninterface ChangedFile {\n path: string;\n diff: string;\n additions: number;\n deletions: number;\n status: string;\n}\n","/**\n * Project Info MCP Tool\n * \n * Provides MCP tool for viewing and managing PROJECT.md\n */\n\nimport {\n loadProjectInfo,\n initProjectInfo,\n getProjectSection,\n updateProjectSection,\n appendToSection,\n getProjectSections,\n getProjectInfoStructured,\n projectInfoExists,\n} from '../utils/project-info.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\nexport interface ProjectInfoArgs {\n action: 'view' | 'init' | 'update' | 'append' | 'sections' | 'raw';\n section?: string;\n content?: string;\n directory?: string;\n}\n\nexport class TrieProjectInfoTool {\n async execute(args: ProjectInfoArgs): Promise<{ content: Array<{ type: string; text: string }> }> {\n const workDir = args.directory || getWorkingDirectory(undefined, true);\n const action = args.action || 'view';\n\n try {\n switch (action) {\n case 'view':\n return await this.handleView(workDir, args.section);\n \n case 'init':\n return await this.handleInit(workDir);\n \n case 'update':\n return await this.handleUpdate(workDir, args.section, args.content);\n \n case 'append':\n return await this.handleAppend(workDir, args.section, args.content);\n \n case 'sections':\n return await this.handleSections(workDir);\n \n case 'raw':\n return await this.handleRaw(workDir);\n \n default:\n return this.error(`Unknown action: ${action}. Use: view, init, update, append, sections, raw`);\n }\n } catch (error) {\n return this.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n private async handleView(workDir: string, section?: string): Promise<{ content: Array<{ type: string; text: string }> }> {\n if (!projectInfoExists(workDir)) {\n return this.formatResponse(`## Project Info Not Found\n\nNo \\`.trie/PROJECT.md\\` file exists in this project.\n\n**To create one, use:**\n\\`\\`\\`\ntrie_project action=\"init\"\n\\`\\`\\`\n\nOr run: \\`trie project init\\`\n\nThis will create a template with sections for:\n- Project Overview\n- Technology Stack\n- Architecture\n- Coding Conventions\n- Environment\n- Team\n- Compliance\n- AI Instructions`);\n }\n\n if (section) {\n const sectionContent = await getProjectSection(section, workDir);\n if (sectionContent === null) {\n const sections = await getProjectSections(workDir);\n return this.formatResponse(`## Section Not Found: \"${section}\"\n\nAvailable sections:\n${sections.map(s => `- ${s}`).join('\\n')}`);\n }\n \n return this.formatResponse(`## ${section}\n\n${sectionContent}`);\n }\n\n // Return structured view\n const info = await getProjectInfoStructured(workDir);\n \n let output = `## Project Information\n\n**Path:** \\`${info.path}\\`\n**Sections:** ${Object.keys(info.sections).length}\n\n---\n\n`;\n\n for (const [name, content] of Object.entries(info.sections)) {\n output += `### ${name}\n\n${content}\n\n---\n\n`;\n }\n\n return this.formatResponse(output);\n }\n\n private async handleInit(workDir: string): Promise<{ content: Array<{ type: string; text: string }> }> {\n const result = await initProjectInfo(workDir);\n \n if (result.created) {\n return this.formatResponse(`## PROJECT.md Created\n\n**Path:** \\`${result.path}\\`\n\nA new PROJECT.md file has been created with a template including sections for:\n- Project Overview\n- Technology Stack\n- Architecture\n- Coding Conventions\n- Environment\n- Team\n- Compliance\n- AI Instructions\n\n**Next steps:**\n1. Open the file and fill in your project details\n2. The content will be available via \\`trie://project\\` resource\n3. AI assistants will use this context when working on your project\n\n**View the template:**\n\\`\\`\\`\ntrie_project action=\"view\"\n\\`\\`\\``);\n }\n\n return this.formatResponse(`## PROJECT.md Already Exists\n\n**Path:** \\`${result.path}\\`\n\nUse \\`trie_project action=\"view\"\\` to see the current content.`);\n }\n\n private async handleUpdate(\n workDir: string, \n section?: string, \n content?: string\n ): Promise<{ content: Array<{ type: string; text: string }> }> {\n if (!section) {\n return this.error('Missing required parameter: section');\n }\n if (!content) {\n return this.error('Missing required parameter: content');\n }\n\n const success = await updateProjectSection(section, content, workDir);\n \n if (success) {\n return this.formatResponse(`## Section Updated: \"${section}\"\n\nThe \"${section}\" section has been updated with your new content.\n\n**View updated section:**\n\\`\\`\\`\ntrie_project action=\"view\" section=\"${section}\"\n\\`\\`\\``);\n }\n\n const sections = await getProjectSections(workDir);\n return this.error(`Could not update section \"${section}\". \n\nAvailable sections:\n${sections.map(s => `- ${s}`).join('\\n')}`);\n }\n\n private async handleAppend(\n workDir: string,\n section?: string,\n content?: string\n ): Promise<{ content: Array<{ type: string; text: string }> }> {\n if (!section) {\n return this.error('Missing required parameter: section');\n }\n if (!content) {\n return this.error('Missing required parameter: content');\n }\n\n const success = await appendToSection(section, content, workDir);\n \n if (success) {\n return this.formatResponse(`## Content Appended to: \"${section}\"\n\nYour content has been added to the \"${section}\" section.\n\n**View updated section:**\n\\`\\`\\`\ntrie_project action=\"view\" section=\"${section}\"\n\\`\\`\\``);\n }\n\n return this.error(`Could not append to section \"${section}\". Make sure the section exists.`);\n }\n\n private async handleSections(workDir: string): Promise<{ content: Array<{ type: string; text: string }> }> {\n if (!projectInfoExists(workDir)) {\n return this.formatResponse(`## No PROJECT.md Found\n\nRun \\`trie_project action=\"init\"\\` to create one.`);\n }\n\n const sections = await getProjectSections(workDir);\n \n return this.formatResponse(`## Available Sections\n\n${sections.map((s, i) => `${i + 1}. **${s}**`).join('\\n')}\n\n**View a section:**\n\\`\\`\\`\ntrie_project action=\"view\" section=\"Section Name\"\n\\`\\`\\`\n\n**Update a section:**\n\\`\\`\\`\ntrie_project action=\"update\" section=\"Section Name\" content=\"New content...\"\n\\`\\`\\``);\n }\n\n private async handleRaw(workDir: string): Promise<{ content: Array<{ type: string; text: string }> }> {\n const content = await loadProjectInfo(workDir);\n \n if (!content) {\n return this.formatResponse(`No PROJECT.md found. Run \\`trie_project action=\"init\"\\` to create one.`);\n }\n\n return this.formatResponse(content);\n }\n\n private formatResponse(text: string): { content: Array<{ type: string; text: string }> } {\n return {\n content: [{ type: 'text', text }]\n };\n }\n\n private error(message: string): { content: Array<{ type: string; text: string }> } {\n return {\n content: [{ type: 'text', text: `**Error:** ${message}` }]\n };\n }\n}\n","/**\n * Trie Init Tool\n * \n * MCP tool for initializing bootstrap files.\n */\n\nimport { initializeBootstrapFiles, loadBootstrapContext, completeBootstrap, needsBootstrap } from '../bootstrap/index.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\nexport class TrieInitTool {\n async execute(params: {\n action?: 'init' | 'status' | 'complete' | 'context';\n directory?: string;\n force?: boolean;\n skipBootstrap?: boolean;\n }): Promise<string> {\n const action = params.action || 'init';\n const workDir = params.directory || getWorkingDirectory(undefined, true);\n\n if (action === 'status') {\n const needs = needsBootstrap(workDir);\n const context = await loadBootstrapContext(workDir);\n \n const existingFiles = context.files.filter(f => f.exists).map(f => f.name);\n const missingFiles = context.files.filter(f => !f.exists).map(f => f.name);\n \n return [\n '# Bootstrap Status',\n '',\n `**Bootstrap pending:** ${needs ? 'Yes' : 'No'}`,\n '',\n '## Files',\n '',\n '**Existing:**',\n existingFiles.length > 0 ? existingFiles.map(f => `- .trie/${f}`).join('\\n') : '- None',\n '',\n '**Missing:**',\n missingFiles.length > 0 ? missingFiles.map(f => `- .trie/${f}`).join('\\n') : '- None',\n ].join('\\n');\n }\n\n if (action === 'complete') {\n const result = await completeBootstrap(workDir);\n if (result) {\n return 'Bootstrap completed. BOOTSTRAP.md has been deleted.';\n }\n return 'No BOOTSTRAP.md file found.';\n }\n\n if (action === 'context') {\n const context = await loadBootstrapContext(workDir);\n if (!context.injectedContent) {\n return 'No bootstrap context available. Run trie_init with action=\"init\" first.';\n }\n return context.injectedContent;\n }\n\n // Default: init\n const initOptions: Parameters<typeof initializeBootstrapFiles>[0] = {\n workDir,\n };\n if (params.force !== undefined) {\n initOptions.force = params.force;\n }\n if (params.skipBootstrap !== undefined) {\n initOptions.skipBootstrap = params.skipBootstrap;\n }\n const result = await initializeBootstrapFiles(initOptions);\n\n const lines: string[] = [\n '# Trie Workspace Initialized',\n '',\n ];\n\n if (result.created.length > 0) {\n lines.push('## Created Files', '');\n for (const file of result.created) {\n lines.push(`- .trie/${file}`);\n }\n lines.push('');\n }\n\n if (result.skipped.length > 0) {\n lines.push('## Skipped (already exist)', '');\n for (const file of result.skipped) {\n lines.push(`- .trie/${file}`);\n }\n lines.push('');\n }\n\n lines.push('## Detected Stack', '');\n if (result.stack.framework) lines.push(`- **Framework:** ${result.stack.framework}`);\n if (result.stack.language) lines.push(`- **Language:** ${result.stack.language}`);\n if (result.stack.database) lines.push(`- **Database:** ${result.stack.database}`);\n if (result.stack.auth) lines.push(`- **Auth:** ${result.stack.auth}`);\n if (result.stack.packageManager) lines.push(`- **Package Manager:** ${result.stack.packageManager}`);\n lines.push('');\n\n if (result.stack.suggestedSkills.length > 0) {\n lines.push('## Suggested Skills', '');\n for (const skill of result.stack.suggestedSkills) {\n lines.push(`\\`\\`\\`bash`);\n lines.push(`trie skills add ${skill}`);\n lines.push(`\\`\\`\\``);\n }\n lines.push('');\n }\n\n lines.push(\n '## Next Steps',\n '',\n '1. Edit `.trie/PROJECT.md` with your project description',\n '2. Define coding standards in `.trie/RULES.md`',\n '3. Run `trie watch` to analyze your codebase',\n '4. Run `trie_init` with action=\"complete\" when setup is done',\n );\n\n return lines.join('\\n');\n }\n}\n","/**\n * Trie Memory Search Tool\n * \n * MCP tool for searching issue memory.\n */\n\nimport {\n searchIssues,\n getMemoryStats,\n getRecentIssues,\n findSimilarIssues,\n markIssueResolved,\n purgeIssues,\n} from '../memory/issue-store.js';\nimport {\n findCrossProjectPatterns,\n searchGlobalPatterns,\n listTrackedProjects,\n getGlobalMemoryStats,\n} from '../memory/global-memory.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { getStorage } from '../storage/tiered-storage.js';\n\nexport class TrieMemorySearchTool {\n async execute(params: {\n action?: 'search' | 'stats' | 'recent' | 'similar' | 'resolve' | 'global' | 'purge' | 'nudges' | 'clear-nudges';\n query?: string;\n issueId?: string;\n nudgeId?: string;\n limit?: number;\n severity?: string[];\n agent?: string;\n includeResolved?: boolean;\n directory?: string;\n purgeStrategy?: 'smart' | 'resolved' | 'old' | 'all';\n daysOld?: number;\n clearAll?: boolean;\n pattern?: string;\n }): Promise<{ content: Array<{ type: string; text: string }> }> {\n const action = params.action || 'search';\n const workDir = params.directory || getWorkingDirectory(undefined, true);\n\n let resultText: string;\n switch (action) {\n case 'search':\n resultText = await this.handleSearch(params, workDir);\n break;\n case 'stats':\n resultText = await this.handleStats(workDir);\n break;\n case 'recent':\n resultText = await this.handleRecent(params, workDir);\n break;\n case 'similar':\n resultText = await this.handleSimilar(params, workDir);\n break;\n case 'resolve':\n resultText = await this.handleResolve(params, workDir);\n break;\n case 'global':\n resultText = await this.handleGlobal(params);\n break;\n case 'purge':\n resultText = await this.handlePurge(params, workDir);\n break;\n case 'nudges':\n resultText = await this.handleNudges(params, workDir);\n break;\n case 'clear-nudges':\n resultText = await this.handleClearNudges(params, workDir);\n break;\n default:\n resultText = 'Unknown action. Use: search, stats, recent, similar, resolve, global, purge, nudges, or clear-nudges';\n }\n\n return {\n content: [{\n type: 'text',\n text: resultText\n }]\n };\n }\n\n private async handleSearch(params: {\n query?: string;\n limit?: number;\n severity?: string[];\n agent?: string;\n includeResolved?: boolean;\n }, workDir: string): Promise<string> {\n if (!params.query) {\n return 'Missing required parameter: query';\n }\n\n const searchOptions: Parameters<typeof searchIssues>[1] = {\n workDir,\n limit: params.limit || 10,\n };\n if (params.severity !== undefined) {\n searchOptions.severity = params.severity;\n }\n if (params.agent !== undefined) {\n searchOptions.agent = params.agent;\n }\n if (params.includeResolved !== undefined) {\n searchOptions.includeResolved = params.includeResolved;\n }\n const results = await searchIssues(params.query, searchOptions);\n\n if (results.length === 0) {\n return `No issues found matching \"${params.query}\"`;\n }\n\n const lines: string[] = [\n `# Search Results: \"${params.query}\"`,\n '',\n `Found ${results.length} matching issue(s):`,\n '',\n ];\n\n for (const result of results) {\n const i = result.issue;\n const status = i.resolved ? ' [RESOLVED]' : '';\n lines.push(\n `## [${i.severity.toUpperCase()}]${status} ${i.issue.slice(0, 80)}`,\n '',\n `- **File:** \\`${i.file}\\`${i.line ? `:${i.line}` : ''}`,\n `- **Agent:** ${i.agent}`,\n `- **Score:** ${(result.score * 100).toFixed(0)}%`,\n `- **Date:** ${new Date(i.timestamp).toLocaleDateString()}`,\n `- **Fix:** ${i.fix.slice(0, 150)}${i.fix.length > 150 ? '...' : ''}`,\n '',\n );\n }\n\n return lines.join('\\n');\n }\n\n private async handleStats(workDir: string): Promise<string> {\n const stats = await getMemoryStats(workDir);\n const globalStats = await getGlobalMemoryStats();\n\n const lines: string[] = [\n '# Memory Statistics',\n '',\n '## Local Issue Memory',\n '',\n `- **Active Issues:** ${stats.activeIssues}`,\n `- **Resolved:** ${stats.resolvedCount}`,\n `- **Total (all-time):** ${stats.totalIssues}`,\n ];\n\n // Capacity warning\n const cap = stats.capacityInfo;\n if (cap.isAtCap) {\n lines.push(\n '',\n '### ⚠️ CAPACITY WARNING',\n '',\n `**Memory is at maximum capacity (${cap.current}/${cap.max} issues, ${cap.percentFull}%)**`,\n '',\n 'Trie caps issue storage at 10,000 for performance. New repeats are deduplicated.',\n 'Older issues are compacted into summaries, and if it still exceeds the cap the oldest/lowest-value issues are pruned.',\n '',\n '**Options to free up space:**',\n '- `trie memory purge smart` - Remove resolved and old low-priority issues (recommended)',\n '- `trie memory purge resolved` - Remove all resolved issues',\n '- `trie memory purge old` - Remove issues older than 90 days',\n '- `trie memory purge all` - Clear all issues (keeps summaries)',\n );\n } else if (cap.percentFull >= 80) {\n lines.push(\n '',\n `### ℹ️ Memory Usage: ${cap.percentFull}% (${cap.current}/${cap.max})`,\n '',\n `You're approaching the storage cap. Consider running \\`trie memory purge smart\\` to free up space.`,\n );\n } else {\n lines.push(`- **Memory Usage:** ${cap.percentFull}% (${cap.current}/${cap.max})`);\n }\n\n // Deduplication stats\n if (stats.deduplicationStats.duplicatesAvoided > 0) {\n lines.push(\n '',\n '### Deduplication',\n '',\n `- **Unique Patterns:** ${stats.deduplicationStats.uniquePatterns}`,\n `- **Duplicates Avoided:** ${stats.deduplicationStats.duplicatesAvoided}`,\n );\n }\n\n if (stats.oldestIssue) {\n lines.push('', `- **Date Range:** ${stats.oldestIssue.split('T')[0]} to ${stats.newestIssue?.split('T')[0]}`);\n }\n\n lines.push('', '### By Severity', '');\n for (const [severity, count] of Object.entries(stats.issuesBySeverity)) {\n lines.push(`- ${severity}: ${count}`);\n }\n\n lines.push('', '### By Agent', '');\n const sortedAgents = Object.entries(stats.issuesByAgent).sort((a, b) => b[1] - a[1]);\n for (const [agent, count] of sortedAgents.slice(0, 10)) {\n lines.push(`- ${agent}: ${count}`);\n }\n\n lines.push(\n '',\n '## Global Cross-Project Memory',\n '',\n `- **Tracked Projects:** ${globalStats.trackedProjects}`,\n `- **Total Patterns:** ${globalStats.totalPatterns}`,\n `- **Cross-Project Patterns:** ${globalStats.crossProjectPatterns}`,\n `- **Fixed Patterns:** ${globalStats.fixedPatterns}`,\n );\n\n return lines.join('\\n');\n }\n\n private async handleRecent(params: {\n limit?: number;\n }, workDir: string): Promise<string> {\n const issues = await getRecentIssues({\n workDir,\n limit: params.limit || 10,\n });\n\n if (issues.length === 0) {\n return 'No recent issues found.';\n }\n\n const lines: string[] = [\n '# Recent Issues (Last 7 Days)',\n '',\n ];\n\n for (const i of issues) {\n const status = i.resolved ? ' [RESOLVED]' : '';\n lines.push(\n `## [${i.severity.toUpperCase()}]${status} ${i.issue.slice(0, 70)}`,\n '',\n `- \\`${i.file}\\`${i.line ? `:${i.line}` : ''}`,\n `- Agent: ${i.agent} | ${new Date(i.timestamp).toLocaleDateString()}`,\n '',\n );\n }\n\n return lines.join('\\n');\n }\n\n private async handleSimilar(params: {\n query?: string;\n limit?: number;\n }, workDir: string): Promise<string> {\n if (!params.query) {\n return 'Missing required parameter: query (issue description to find similar issues for)';\n }\n\n const mockIssue = {\n id: 'search',\n severity: 'moderate' as const,\n issue: params.query,\n fix: '',\n file: '',\n agent: 'search',\n confidence: 1,\n autoFixable: false,\n };\n\n const results = await findSimilarIssues(mockIssue, {\n workDir,\n limit: params.limit || 5,\n });\n\n if (results.length === 0) {\n return 'No similar issues found.';\n }\n\n const lines: string[] = [\n `# Similar Issues`,\n '',\n `Found ${results.length} similar issue(s):`,\n '',\n ];\n\n for (const result of results) {\n const i = result.issue;\n lines.push(\n `## [${i.severity.toUpperCase()}] ${i.issue.slice(0, 70)}`,\n '',\n `- **File:** \\`${i.file}\\``,\n `- **Similarity:** ${(result.score * 100).toFixed(0)}%`,\n '',\n );\n }\n\n return lines.join('\\n');\n }\n\n private async handleResolve(params: {\n issueId?: string;\n }, workDir: string): Promise<string> {\n if (!params.issueId) {\n return 'Missing required parameter: issueId';\n }\n\n const result = await markIssueResolved(params.issueId, workDir);\n \n if (result) {\n return `Issue ${params.issueId} marked as resolved.`;\n }\n return `Issue ${params.issueId} not found.`;\n }\n\n private async handleGlobal(params: {\n query?: string;\n limit?: number;\n }): Promise<string> {\n if (params.query) {\n const patterns = await searchGlobalPatterns(params.query, {\n limit: params.limit || 10,\n });\n\n if (patterns.length === 0) {\n return `No global patterns found matching \"${params.query}\"`;\n }\n\n const lines: string[] = [\n `# Global Pattern Search: \"${params.query}\"`,\n '',\n ];\n\n for (const p of patterns) {\n lines.push(\n `## [${p.severity.toUpperCase()}] ${p.pattern.slice(0, 60)}`,\n '',\n `- **Occurrences:** ${p.occurrences} across ${p.projects.length} projects`,\n `- **Agent:** ${p.agent}`,\n `- **Projects:** ${p.projects.slice(0, 3).join(', ')}`,\n p.fixApplied ? `- **Fixed in:** ${p.fixApplied.project}` : '',\n '',\n );\n }\n\n return lines.join('\\n');\n }\n\n const patterns = await findCrossProjectPatterns(2);\n const projects = await listTrackedProjects();\n\n const lines: string[] = [\n '# Global Cross-Project Memory',\n '',\n `**Tracked Projects:** ${projects.length}`,\n `**Cross-Project Patterns:** ${patterns.length}`,\n '',\n ];\n\n if (patterns.length > 0) {\n lines.push('## Top Cross-Project Patterns', '');\n \n for (const p of patterns.slice(0, 5)) {\n lines.push(\n `### [${p.severity.toUpperCase()}] ${p.pattern.slice(0, 50)}`,\n '',\n `- Seen ${p.occurrences}x across ${p.projects.length} projects`,\n p.fixApplied ? `- Fixed in ${p.fixApplied.project}` : '- Not yet fixed',\n '',\n );\n }\n }\n\n if (projects.length > 0) {\n lines.push('## Recent Projects', '', '| Project | Issues |', '|---------|--------|');\n \n for (const p of projects.slice(0, 5)) {\n lines.push(`| ${p.name} | ${p.totalIssues} |`);\n }\n }\n\n return lines.join('\\n');\n }\n\n private async handlePurge(params: {\n purgeStrategy?: 'smart' | 'resolved' | 'old' | 'all';\n daysOld?: number;\n }, workDir: string): Promise<string> {\n const strategy = params.purgeStrategy || 'smart';\n \n const options: { workDir: string; daysOld?: number } = { workDir };\n if (params.daysOld !== undefined) {\n options.daysOld = params.daysOld;\n }\n \n const result = await purgeIssues(strategy, options);\n\n const lines: string[] = [\n '# Memory Purge Complete',\n '',\n `**Strategy:** ${strategy}`,\n `**Removed:** ${result.removed} issues`,\n `**Remaining:** ${result.remaining} issues`,\n '',\n ];\n\n switch (strategy) {\n case 'smart':\n lines.push(\n '**What was removed:**',\n '- Resolved issues older than 30 days',\n '- Low-priority issues (info/low severity) older than 30 days',\n '',\n '**What was kept:**',\n '- All critical and high severity issues',\n '- All unresolved issues',\n '- All issues from the last 30 days',\n );\n break;\n case 'resolved':\n lines.push('**Removed all resolved issues.**', '**Kept all unresolved issues.**');\n break;\n case 'old':\n lines.push(\n `**Removed all issues older than ${params.daysOld || 90} days.**`,\n `**Kept all recent issues.**`,\n );\n break;\n case 'all':\n lines.push(\n '**Cleared all issues from active memory.**',\n '',\n 'Historical summaries are preserved in compacted-summaries.json.',\n );\n break;\n }\n\n lines.push('', '**Note:** Compacted historical summaries were preserved for trend analysis.');\n\n return lines.join('\\n');\n }\n\n private async handleNudges(params: {\n limit?: number;\n includeResolved?: boolean;\n }, workDir: string): Promise<string> {\n const storage = getStorage(workDir);\n await storage.initialize();\n \n const queryParams: { resolved?: boolean; limit?: number } = {\n limit: params.limit || 20,\n };\n if (!params.includeResolved) {\n queryParams.resolved = false;\n }\n const nudges = await storage.queryNudges(queryParams);\n\n if (nudges.length === 0) {\n return params.includeResolved \n ? 'No nudges found in storage.'\n : 'No unresolved nudges. All clear!';\n }\n\n const lines: string[] = [\n '# Nudges (Goal Violations & Alerts)',\n '',\n `Found ${nudges.length} nudge(s):`,\n '',\n ];\n\n for (const nudge of nudges) {\n const status = nudge.resolved ? ` [${nudge.resolution || 'RESOLVED'}]` : '';\n const severity = nudge.severity.toUpperCase();\n lines.push(\n `## [${severity}]${status} ${nudge.message.slice(0, 80)}${nudge.message.length > 80 ? '...' : ''}`,\n '',\n `- **ID:** \\`${nudge.id}\\``,\n nudge.file ? `- **File:** \\`${nudge.file}\\`` : '',\n `- **Time:** ${new Date(nudge.timestamp).toLocaleString()}`,\n nudge.suggestedAction ? `- **Suggested:** ${nudge.suggestedAction}` : '',\n '',\n );\n }\n\n lines.push(\n '---',\n '',\n '**Actions:**',\n '- `trie_memory action:clear-nudges nudgeId:<id>` - Dismiss a specific nudge',\n '- `trie_memory action:clear-nudges clearAll:true` - Clear all nudges',\n '- `trie_memory action:clear-nudges pattern:\"<text>\"` - Clear nudges matching pattern',\n );\n\n return lines.join('\\n');\n }\n\n private async handleClearNudges(params: {\n nudgeId?: string;\n clearAll?: boolean;\n pattern?: string;\n }, workDir: string): Promise<string> {\n const storage = getStorage(workDir);\n await storage.initialize();\n\n if (params.clearAll) {\n await storage.clearAllNudges();\n return '✓ All nudges have been cleared.';\n }\n\n if (params.nudgeId) {\n await storage.dismissNudge(params.nudgeId);\n return `✓ Nudge \\`${params.nudgeId}\\` has been dismissed.`;\n }\n\n if (params.pattern) {\n const count = await storage.resolveNudgesByPattern(params.pattern, 'dismissed');\n return count > 0\n ? `✓ Cleared ${count} nudge(s) matching \"${params.pattern}\".`\n : `No nudges found matching \"${params.pattern}\".`;\n }\n\n return [\n 'Missing parameter. Specify one of:',\n '- `nudgeId` - ID of specific nudge to dismiss',\n '- `clearAll: true` - Clear all nudges',\n '- `pattern` - Clear nudges matching text pattern',\n '',\n 'Use `trie_memory action:nudges` to list current nudges and their IDs.',\n ].join('\\n');\n }\n}\n","import path from 'node:path';\n\nimport { ContextGraph } from '../context/graph.js';\nimport { importFromJson } from '../context/sync.js';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\nimport { formatFriendlyError } from '../utils/errors.js';\n\nasync function removeOrphanEdges(graph: ContextGraph): Promise<number> {\n const nodes = await graph.listNodes();\n const ids = new Set(nodes.map((n) => n.id));\n const edges = await graph.listEdges();\n let removed = 0;\n for (const edge of edges) {\n if (!ids.has(edge.from_id) || !ids.has(edge.to_id)) {\n await graph.deleteEdge(edge.id);\n removed++;\n }\n }\n return removed;\n}\n\nexport interface ReconcileToolInput {\n directory?: string;\n source?: string;\n}\n\nexport class TrieReconcileTool {\n async execute(input: ReconcileToolInput = {}): Promise<any> {\n try {\n const projectPath = input.directory || getWorkingDirectory(undefined, true);\n const sourcePath = input.source ?? path.join(getTrieDirectory(projectPath), 'context.json');\n\n const graph = new ContextGraph(projectPath);\n await importFromJson(graph, '', sourcePath);\n const removed = await removeOrphanEdges(graph);\n\n return {\n content: [{\n type: 'text',\n text: `Reconciled context from ${sourcePath}. Removed ${removed} orphaned edges.`\n }]\n };\n } catch (error) {\n const friendly = formatFriendlyError(error);\n return { content: [{ type: 'text', text: friendly.userMessage }] };\n }\n }\n}\n","import { ContextGraph } from '../context/graph.js';\nimport { exportToJson } from '../context/sync.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { formatFriendlyError } from '../utils/errors.js';\n\nexport interface ContextToolInput {\n directory?: string;\n}\n\nexport class TrieContextTool {\n async execute(input: ContextToolInput = {}): Promise<any> {\n try {\n const workDir = input.directory || getWorkingDirectory(undefined, true);\n const graph = new ContextGraph(workDir);\n const snapshot = await graph.getSnapshot();\n await exportToJson(graph);\n\n const summary = `Nodes: ${snapshot.nodes.length}, Edges: ${snapshot.edges.length}, Exported: ${snapshot.exported_at}`;\n\n return {\n content: [{\n type: 'text',\n text: summary\n }],\n data: snapshot\n };\n } catch (error) {\n const friendly = formatFriendlyError(error);\n return { content: [{ type: 'text', text: friendly.userMessage }] };\n }\n }\n}\n","import { LinearIngester } from '../ingest/linear-ingester.js';\nimport { ContextGraph } from '../context/graph.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\nexport interface LinearSyncInput {\n directory?: string;\n}\n\nexport class LinearSyncTool {\n async execute(input: LinearSyncInput): Promise<any> {\n try {\n const workDir = input.directory || getWorkingDirectory(undefined, true);\n const graph = new ContextGraph(workDir);\n const ingester = new LinearIngester(workDir, graph);\n\n await ingester.syncTickets();\n\n return {\n content: [{\n type: 'text',\n text: '✅ Linear tickets synced successfully. Trie now has context on your active tasks.'\n }]\n };\n } catch (error: any) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `Failed to sync Linear tickets: ${error.message}`\n }]\n };\n }\n }\n}\n","import { GitHubIngester } from '../ingest/github-ingester.js';\nimport { ContextGraph } from '../context/graph.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\nexport interface GitHubSyncInput {\n directory?: string;\n}\n\nexport class GitHubSyncTool {\n async execute(input: GitHubSyncInput): Promise<any> {\n try {\n const workDir = input.directory || getWorkingDirectory(undefined, true);\n const graph = new ContextGraph(workDir);\n const ingester = new GitHubIngester(graph);\n\n const token = await ingester.getApiToken();\n if (!token) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: 'GitHub token not configured.\\n\\n' +\n 'Set one of:\\n' +\n ' • Environment variable: GITHUB_TOKEN=ghp_...\\n' +\n ' • Config dialog (C key) → API Keys → GitHub\\n' +\n ' • .trie/config.json: { \"apiKeys\": { \"github\": \"ghp_...\" } }\\n\\n' +\n 'Token needs `repo` scope for private repos, `public_repo` for public.',\n }],\n };\n }\n\n const repoInfo = ingester.getRepoInfo(workDir);\n if (!repoInfo) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: 'Could not detect GitHub repository.\\n\\n' +\n 'Make sure this directory is a git repo with a GitHub remote:\\n' +\n ' git remote get-url origin',\n }],\n };\n }\n\n const prResult = await ingester.syncPullRequests(repoInfo.owner, repoInfo.name, token);\n const issueResult = await ingester.syncIssues(repoInfo.owner, repoInfo.name, token);\n\n const LINE = '\\u2500'.repeat(45);\n const lines = [\n 'GITHUB SYNC',\n LINE,\n `Repo: ${repoInfo.owner}/${repoInfo.name}`,\n `Pulled ${prResult.prs} open PR${prResult.prs !== 1 ? 's' : ''}, ${issueResult.issues} open issue${issueResult.issues !== 1 ? 's' : ''}`,\n `Linked ${prResult.linkedTickets} PR${prResult.linkedTickets !== 1 ? 's' : ''} to Linear tickets`,\n `Linked ${prResult.linkedFiles} PR${prResult.linkedFiles !== 1 ? 's' : ''} to changed files in context graph`,\n LINE,\n 'Next sync: trie_github_sync',\n 'Or use trie_pipeline for consolidated view.',\n ];\n\n return {\n content: [{\n type: 'text',\n text: lines.join('\\n'),\n }],\n };\n } catch (error: any) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `GitHub sync failed: ${error.message}`,\n }],\n };\n }\n }\n}\n","/**\n * Trie Index Tool\n * \n * MCP tool for indexing the codebase for fast goal checking and file lookups.\n * The index is automatically updated when files change during watch mode,\n * but this tool allows manual full indexing.\n */\n\nimport { glob } from 'glob';\nimport { CodebaseIndex } from '../context/codebase-index.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { isTrieInitialized } from '../utils/trie-init.js';\n\nconst INDEXABLE_EXTENSIONS = [\n 'ts', 'tsx', 'js', 'jsx', 'mjs',\n 'vue', 'svelte', 'astro',\n 'py', 'go', 'rs', 'java', 'c', 'cpp', 'h', 'hpp',\n 'cs', 'rb', 'php', 'css', 'scss', 'html',\n];\n\nexport class TrieIndexTool {\n async execute(params: {\n action?: 'full' | 'status' | 'clear';\n directory?: string;\n }): Promise<string> {\n const action = params.action || 'full';\n const workDir = getWorkingDirectory(params.directory, true);\n\n if (!isTrieInitialized(workDir)) {\n return 'Trie is not initialized for this project. Run `trie init` first.';\n }\n\n const codebaseIndex = new CodebaseIndex(workDir);\n\n if (action === 'status') {\n const stats = codebaseIndex.getStats();\n \n let lastUpdatedStr = 'Never';\n if (stats.lastUpdated) {\n try {\n const date = new Date(stats.lastUpdated);\n lastUpdatedStr = date.toLocaleString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n } catch {\n lastUpdatedStr = 'Unknown';\n }\n }\n \n return [\n '# Codebase Index Status',\n '',\n `**Total files indexed:** ${stats.totalFiles}`,\n `**Total size:** ${(stats.totalSize / 1024 / 1024).toFixed(2)} MB`,\n `**Files scanned for goals:** ${stats.scannedFiles}`,\n `**Files with violations:** ${stats.filesWithViolations}`,\n `**Last updated:** ${lastUpdatedStr}`,\n '',\n '## Files by Type',\n '',\n ...Object.entries(stats.filesByType)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 10)\n .map(([type, count]) => `- .${type}: ${count} files`),\n '',\n '---',\n '',\n 'Run `trie_index` with action=\"full\" to re-index the codebase.',\n 'Run `trie_index` with action=\"clear\" to clear stale cache entries.',\n ].join('\\n');\n }\n\n if (action === 'clear') {\n const cleared = codebaseIndex.clearStaleCache();\n await codebaseIndex.save();\n return `Cleared ${cleared} stale cache entries.`;\n }\n\n // Full indexing\n const pattern = `${workDir}/**/*.{${INDEXABLE_EXTENSIONS.join(',')}}`;\n const allFiles = await glob(pattern, {\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/.trie/**', '**/coverage/**'],\n nodir: true,\n });\n\n let indexed = 0;\n let failed = 0;\n const startTime = Date.now();\n\n // Process files in batches to avoid overwhelming the system\n const BATCH_SIZE = 50;\n for (let i = 0; i < allFiles.length; i += BATCH_SIZE) {\n const batch = allFiles.slice(i, i + BATCH_SIZE);\n \n await Promise.all(batch.map(async (filePath) => {\n try {\n // Get relative path (handle case-insensitive filesystems)\n let relativePath = filePath;\n if (filePath.toLowerCase().startsWith(workDir.toLowerCase() + '/')) {\n relativePath = filePath.slice(workDir.length + 1);\n }\n \n const result = await codebaseIndex.indexFile(relativePath);\n if (result) {\n indexed++;\n } else {\n failed++;\n }\n } catch {\n failed++;\n }\n }));\n }\n\n await codebaseIndex.save();\n const duration = ((Date.now() - startTime) / 1000).toFixed(1);\n const stats = codebaseIndex.getStats();\n\n return [\n '# Codebase Indexing Complete',\n '',\n `**Files indexed:** ${indexed}`,\n `**Files failed:** ${failed}`,\n `**Duration:** ${duration}s`,\n '',\n '## Index Statistics',\n '',\n `- Total files: ${stats.totalFiles}`,\n `- Total size: ${(stats.totalSize / 1024 / 1024).toFixed(2)} MB`,\n '',\n '## Files by Type',\n '',\n ...Object.entries(stats.filesByType)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 10)\n .map(([type, count]) => `- .${type}: ${count} files`),\n '',\n '---',\n '',\n 'The index will be automatically updated when files change during watch mode.',\n 'Goal checks will now use cached results for unchanged files.',\n ].join('\\n');\n }\n}\n","import { TrieFixTool } from '../tools/fix.js';\nimport { TrieCloudFixTool } from '../tools/cloud-fix.js';\nimport { TrieExplainTool } from '../tools/explain.js';\nimport { TrieTestTool } from '../tools/test.js';\nimport { TrieWatchTool } from '../tools/watch.js';\nimport { TriePRReviewTool } from '../tools/pr-review.js';\nimport { TrieProjectInfoTool } from '../tools/project-info.js';\nimport { TrieInitTool } from '../tools/init.js';\nimport { TrieMemorySearchTool } from '../tools/memory-search.js';\nimport { handleCheckpointTool, type CheckpointToolInput } from '../tools/checkpoint.js';\nimport { TrieCheckTool } from '../tools/check.js';\nimport { TrieTellTool } from '../tools/tell.js';\nimport { TrieReconcileTool } from '../tools/reconcile.js';\nimport { TrieContextTool } from '../tools/context.js';\nimport { TrieFeedbackTool } from '../tools/feedback.js';\nimport { LinearSyncTool } from '../tools/linear-sync.js';\nimport { GitHubSyncTool } from '../tools/github-sync.js';\nimport { GitHubBranchesTool } from '../tools/github-branches.js';\nimport { TriePipelineTool } from '../tools/pipeline.js';\nimport { TrieIndexTool } from '../tools/index-codebase.js';\nimport { \n TrieGetGovernanceTool,\n TrieGetDecisionsTool,\n TrieGetBlockersTool,\n TrieGetNudgesTool,\n TrieGetRelatedGovernanceTool,\n TrieGetRelatedDecisionsTool,\n TrieQueryContextTool,\n TrieQueryLedgerBlocksTool\n} from '../tools/query-tools.js';\n\nclass TrieCheckpointTool {\n async execute(input: CheckpointToolInput): Promise<any> {\n const result = await handleCheckpointTool(input);\n return {\n content: [{\n type: 'text',\n text: result\n }]\n };\n }\n}\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, any>;\n _meta?: {\n ui?: {\n resourceUri: string;\n };\n };\n}\n\nexport class ToolRegistry {\n private tools: Map<string, any> = new Map();\n private definitions: ToolDefinition[] = [];\n\n constructor() {\n this.initializeTools();\n this.defineToolSchemas();\n }\n\n private initializeTools() {\n // Initialize tool instances\n this.tools.set('fix', new TrieFixTool());\n this.tools.set('cloud_fix', new TrieCloudFixTool());\n this.tools.set('explain', new TrieExplainTool());\n this.tools.set('test', new TrieTestTool());\n this.tools.set('watch', new TrieWatchTool());\n this.tools.set('pr_review', new TriePRReviewTool());\n this.tools.set('project', new TrieProjectInfoTool());\n this.tools.set('init', new TrieInitTool());\n this.tools.set('memory', new TrieMemorySearchTool());\n this.tools.set('checkpoint', new TrieCheckpointTool());\n this.tools.set('check', new TrieCheckTool());\n this.tools.set('tell', new TrieTellTool());\n this.tools.set('reconcile', new TrieReconcileTool());\n this.tools.set('context', new TrieContextTool());\n this.tools.set('feedback', new TrieFeedbackTool());\n this.tools.set('ok', new TrieFeedbackTool());\n this.tools.set('bad', new TrieFeedbackTool());\n this.tools.set('linear_sync', new LinearSyncTool());\n this.tools.set('github_sync', new GitHubSyncTool());\n this.tools.set('github_branches', new GitHubBranchesTool());\n this.tools.set('pipeline', new TriePipelineTool());\n this.tools.set('index', new TrieIndexTool());\n \n // Query tools for governance ledger\n this.tools.set('get_governance', new TrieGetGovernanceTool());\n this.tools.set('get_decisions', new TrieGetDecisionsTool()); // Backward compatibility\n this.tools.set('get_blockers', new TrieGetBlockersTool());\n this.tools.set('get_nudges', new TrieGetNudgesTool());\n this.tools.set('query_ledger_blocks', new TrieQueryLedgerBlocksTool());\n this.tools.set('get_related_governance', new TrieGetRelatedGovernanceTool());\n this.tools.set('get_related_decisions', new TrieGetRelatedDecisionsTool()); // Backward compatibility\n this.tools.set('query_context', new TrieQueryContextTool());\n }\n\n private defineToolSchemas() {\n this.definitions = [\n {\n name: 'trie',\n description: 'Quick menu of available Trie commands. TIP: Read trie://context first for project state and priorities. Call with `action` to run directly.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n description: 'Optional quick action: pr_review, watch, fix, explain, test, visual_qa_browser'\n },\n files: {\n type: 'array',\n items: { type: 'string' },\n description: 'Files to scan (absolute or relative)'\n },\n directory: {\n type: 'string',\n description: 'Directory to scan (defaults to detected workspace)'\n }\n }\n } as const,\n },\n {\n name: 'trie_fix',\n description: 'Apply high-confidence fixes to code. Use action:route to see triage plan first. Alias: fix',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['route'],\n description: 'route: show fix routing plan without applying fixes'\n },\n issueIds: {\n type: 'array',\n items: { type: 'string' },\n description: 'Specific issues to fix (empty = all high-confidence)'\n },\n autoApprove: {\n type: 'boolean',\n description: 'Skip human review for high-confidence fixes'\n }\n }\n } as const,\n },\n {\n name: 'trie_cloud_fix',\n description: 'Dispatch issues to Cursor cloud agents for verified, test-passing fixes. The cloud agent runs in an isolated VM, applies the fix, runs tests, screenshots the result, and opens a PR. CRITICAL: Ad-hoc mode (file+issue+fix) dispatches ONLY that single issue. Use trie_fix action:route first to see which issues qualify.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['configure', 'dispatch', 'status', 'artifacts', 'cancel'],\n description: 'configure: save API key | dispatch: send to cloud | status: poll jobs | artifacts: get screenshots + PR links | cancel: abort a job'\n },\n issueIds: {\n type: 'array',\n items: { type: 'string' },\n description: 'Issue IDs to dispatch (from trie_fix/watch). If omitted, dispatches all cloud-eligible pending issues. IGNORED if file+issue+fix are provided (ad-hoc mode).'\n },\n forceCloud: {\n type: 'boolean',\n description: 'When true, bypass triage and dispatch ALL resolved issues to cloud agents. Use when user explicitly requests cloud fix. In ad-hoc mode, this is implied.'\n },\n file: {\n type: 'string',\n description: 'For ad-hoc single-incident dispatch: file path. When provided with issue+fix, ONLY this single issue is dispatched (memory issues are ignored).'\n },\n issue: {\n type: 'string',\n description: 'For ad-hoc dispatch: issue description (use with file and fix)'\n },\n fix: {\n type: 'string',\n description: 'For ad-hoc dispatch: suggested fix (use with file and issue)'\n },\n line: { type: 'number', description: 'For ad-hoc dispatch: line number' },\n severity: { type: 'string', description: 'For ad-hoc dispatch: severity (critical, serious, moderate, low)' },\n effort: { type: 'string', description: 'For ad-hoc dispatch: effort (trivial, easy, medium, hard)' },\n apiKey: {\n type: 'string',\n description: 'Cursor API key (configure action only)'\n },\n jobId: {\n type: 'string',\n description: 'Job ID for cancel or artifacts actions'\n }\n },\n required: ['action']\n } as const,\n },\n {\n name: 'trie_explain',\n description: 'Explain code, issues, or changes in plain language. Alias: explain',\n inputSchema: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: ['code', 'issue', 'change', 'risk']\n },\n target: {\n type: 'string',\n description: 'What to explain (file path, issue ID, etc.)'\n }\n },\n required: ['type', 'target']\n } as const,\n },\n {\n name: 'trie_feedback',\n description: 'Record quick feedback about a warning or suggestion (thumbs up/down). Alias: trie_ok, trie_bad',\n inputSchema: {\n type: 'object',\n properties: {\n helpful: { type: 'boolean', description: 'true for 👍, false for 👎' },\n target: { type: 'string', description: 'Optional file or item being rated' },\n note: { type: 'string', description: 'Optional short note about why' },\n files: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional related files (absolute or relative)'\n },\n directory: { type: 'string', description: 'Working directory (defaults to auto-detected)' }\n },\n required: ['helpful']\n } as const,\n },\n {\n name: 'trie_check',\n description: 'Run Trie risk check on current changes. Modes: quick, full, offline.',\n inputSchema: {\n type: 'object',\n properties: {\n directory: { type: 'string' },\n files: { type: 'array', items: { type: 'string' } },\n mode: { type: 'string', enum: ['quick', 'full', 'offline'] }\n }\n }\n },\n {\n name: 'trie_tell',\n description: 'Report an incident so Trie can learn.',\n inputSchema: {\n type: 'object',\n properties: {\n description: { type: 'string' },\n directory: { type: 'string' }\n },\n required: ['description']\n }\n },\n {\n name: 'trie_reconcile',\n description: 'Re-sync context graph from context.json and clean orphaned edges.',\n inputSchema: {\n type: 'object',\n properties: {\n directory: { type: 'string' },\n source: { type: 'string' }\n }\n }\n },\n {\n name: 'trie_context',\n description: 'Return current context snapshot (nodes/edges) and export context.json.',\n inputSchema: {\n type: 'object',\n properties: {\n directory: { type: 'string' }\n }\n }\n },\n {\n name: 'trie_test',\n description: 'Generate or reason about tests. Alias: test',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['generate', 'coverage', 'suggest', 'run'],\n description: 'Test action to perform'\n },\n files: {\n type: 'array',\n items: { type: 'string' },\n description: 'Target source files'\n },\n framework: {\n type: 'string',\n description: 'Optional framework hint (jest, vitest, playwright, etc.)'\n },\n style: {\n type: 'string',\n description: 'Test style (unit, integration, e2e). Defaults to unit.'\n }\n },\n required: ['action', 'files']\n } as const,\n },\n {\n name: 'trie_watch',\n description: 'Autonomous watch mode. Alias: watch',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['start', 'stop', 'status', 'issues'],\n description: 'Watch action'\n },\n directory: {\n type: 'string',\n description: 'Workspace directory to watch (optional, auto-detected)'\n },\n debounceMs: {\n type: 'number',\n description: 'Debounce time for scans (ms)'\n }\n },\n required: ['action']\n } as const,\n },\n {\n name: 'trie_project',\n description: 'View and manage project information (.trie/PROJECT.md). Store project context for AI assistants. Alias: project',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['view', 'init', 'update', 'append', 'sections', 'raw'],\n description: 'Action: view (default), init (create template), update (replace section), append (add to section), sections (list), raw (full file)'\n },\n section: {\n type: 'string',\n description: 'Section name (e.g., \"Project Overview\", \"Technology Stack\", \"AI Instructions\")'\n },\n content: {\n type: 'string',\n description: 'Content for update/append actions'\n },\n directory: {\n type: 'string',\n description: 'Project directory (defaults to current workspace)'\n }\n }\n } as const,\n },\n {\n name: 'trie_init',\n description: 'Initialize bootstrap files (.trie/RULES.md, .trie/TEAM.md, .trie/BOOTSTRAP.md). Detects stack.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['init', 'status', 'complete', 'context'],\n description: 'Action: init (create files), status (check state), complete (finish bootstrap), context (get injected content)'\n },\n directory: {\n type: 'string',\n description: 'Project directory (defaults to current workspace)'\n },\n force: {\n type: 'boolean',\n description: 'Overwrite existing files'\n },\n skipBootstrap: {\n type: 'boolean',\n description: 'Skip creating BOOTSTRAP.md'\n }\n }\n } as const,\n },\n {\n name: 'trie_memory',\n description: 'Search and manage issue memory. Find similar issues, view stats, search across projects, and purge old issues.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['search', 'stats', 'recent', 'similar', 'resolve', 'global', 'purge'],\n description: 'Action: search (find issues), stats (show statistics), recent (recent issues), similar (find similar), resolve (mark resolved), global (cross-project), purge (free up memory)'\n },\n query: {\n type: 'string',\n description: 'Search query for search/similar/global actions'\n },\n issueId: {\n type: 'string',\n description: 'Issue ID for resolve action'\n },\n limit: {\n type: 'number',\n description: 'Maximum results to return'\n },\n severity: {\n type: 'array',\n items: { type: 'string' },\n description: 'Filter by severity levels'\n },\n agent: {\n type: 'string',\n description: 'Filter by agent name'\n },\n includeResolved: {\n type: 'boolean',\n description: 'Include resolved issues in search'\n },\n directory: {\n type: 'string',\n description: 'Project directory (defaults to current workspace)'\n },\n purgeStrategy: {\n type: 'string',\n enum: ['smart', 'resolved', 'old', 'all'],\n description: 'Purge strategy: smart (remove resolved & old low-priority), resolved (all resolved), old (older than daysOld), all (clear all)'\n },\n daysOld: {\n type: 'number',\n description: 'Days threshold for old purge strategy (default 90)'\n }\n }\n } as const,\n // MCP Apps: Interactive memory viewer\n _meta: {\n ui: { resourceUri: 'ui://trie/memory-viewer' }\n },\n },\n {\n name: 'trie_checkpoint',\n description: 'Save a context checkpoint without running a full scan. Quick save for your current work state.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['save', 'list', 'last'],\n description: 'Action: save (create checkpoint), list (show recent), last (show last checkpoint)'\n },\n message: {\n type: 'string',\n description: 'Checkpoint message (what you were working on)'\n },\n notes: {\n type: 'string',\n description: 'Additional notes'\n },\n files: {\n type: 'array',\n items: { type: 'string' },\n description: 'Files to associate with this checkpoint'\n }\n },\n required: ['action']\n } as const,\n },\n {\n name: 'trie_index',\n description: 'Index codebase for fast goal checking and file lookups. Index is auto-updated during watch mode. Use this for initial indexing or to rebuild the index.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['full', 'status', 'clear'],\n description: 'Action: full (index all files), status (show index stats), clear (remove stale cache)'\n },\n directory: {\n type: 'string',\n description: 'Project directory (defaults to current workspace)'\n }\n }\n } as const,\n },\n // Add remaining tool definitions...\n this.createSpecialAgentDefinitions(),\n ].flat();\n }\n\n private createSpecialAgentDefinitions(): ToolDefinition[] {\n return [\n {\n name: 'trie_visual_qa_browser',\n description: 'Capture screenshots at mobile/tablet/desktop viewports for visual QA. Alias: visual_qa_browser',\n inputSchema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'URL to screenshot' },\n port: { type: 'number', description: 'Specific port to check' },\n waitForSelector: { type: 'string', description: 'CSS selector to wait for' },\n waitMs: { type: 'number', description: 'Additional wait time' }\n }\n } as const,\n // MCP Apps: Interactive visual QA gallery\n _meta: {\n ui: { resourceUri: 'ui://trie/visual-qa' }\n },\n },\n {\n name: 'trie_pr_review',\n description: '🔍 Interactive PR review: walks through changes file-by-file. Alias: pr_review',\n inputSchema: {\n type: 'object',\n properties: {\n pr: { type: 'string', description: 'PR number to review' },\n worktree: { type: 'string', description: 'Path to worktree directory' },\n mode: {\n type: 'string',\n enum: ['own', 'others'],\n description: 'Review mode'\n },\n files: {\n type: 'array',\n items: { type: 'string' },\n description: 'Specific files to review'\n }\n }\n } as const,\n // MCP Apps: Interactive PR review UI\n _meta: {\n ui: { resourceUri: 'ui://trie/pr-review' }\n },\n },\n {\n name: 'trie_linear_sync',\n description: 'Sync active Linear tickets to build context for JIT defect prediction. Alias: linear_sync',\n inputSchema: {\n type: 'object',\n properties: {\n directory: { type: 'string', description: 'Project directory' }\n }\n }\n },\n {\n name: 'trie_github_sync',\n description: 'Sync open PRs and issues from GitHub into the Trie context graph. Links PRs to files they touch and to Linear tickets mentioned in PR descriptions. Run once to initialize, or periodically to stay current.',\n inputSchema: {\n type: 'object',\n properties: {\n directory: { type: 'string', description: 'Project directory (defaults to current workspace)' }\n }\n }\n },\n {\n name: 'trie_github_branches',\n description: 'Fetch GitHub branches with latest commit info. Use when the user asks which branch has the latest updates, what branches exist, or when branches were last updated. Requires GitHub API key.',\n inputSchema: {\n type: 'object',\n properties: {\n directory: { type: 'string', description: 'Project directory (defaults to current workspace)' },\n limit: { type: 'number', description: 'Max branches to return (default 15, max 30)' }\n }\n }\n },\n {\n name: 'trie_pipeline',\n description: 'Get consolidated pipeline status: open PRs, active Linear tickets, open GitHub issues, and Trie scan issues not yet in any ticket or PR (coverage gaps). Use to understand where work stands and what is falling through the cracks.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['status', 'coverage', 'create_tickets'],\n description: 'status: full pipeline view | coverage: only show Trie issues with no ticket/PR | create_tickets: open Linear tickets for uncovered issues'\n },\n focus: {\n type: 'string',\n description: 'Optional file path or Linear ticket ID to narrow the view'\n },\n issueIds: {\n type: 'array',\n items: { type: 'string' },\n description: 'Issue IDs to create tickets for (create_tickets action only)'\n },\n directory: { type: 'string', description: 'Project directory' }\n }\n }\n },\n {\n name: 'trie_get_governance',\n description: 'Query governance records (architectural decisions, standards, team agreements) from governance ledger with targeted retrieval. Prevents context pollution by returning only relevant records.',\n inputSchema: {\n type: 'object',\n properties: {\n relatedTo: { type: 'string', description: 'File path or topic to find related governance' },\n tags: { type: 'array', items: { type: 'string' }, description: 'Filter by tags' },\n since: { type: 'string', description: 'Time filter: ISO date or \"7d\", \"30d\", \"90d\"' },\n limit: { type: 'number', description: 'Max results (default 10)' },\n directory: { type: 'string', description: 'Working directory' }\n }\n }\n },\n {\n name: 'trie_get_decisions',\n description: '[DEPRECATED - use trie_get_governance] Query governance records from ledger. Backward compatibility alias.',\n inputSchema: {\n type: 'object',\n properties: {\n relatedTo: { type: 'string', description: 'File path or topic to find related governance' },\n tags: { type: 'array', items: { type: 'string' }, description: 'Filter by tags' },\n since: { type: 'string', description: 'Time filter: ISO date or \"7d\", \"30d\", \"90d\"' },\n limit: { type: 'number', description: 'Max results (default 10)' },\n directory: { type: 'string', description: 'Working directory' }\n }\n }\n },\n {\n name: 'trie_get_blockers',\n description: 'Get active blockers from governance ledger. Returns only unresolved blockers. NOT the same as \"blocks\" (ledger chain) — use trie_query_ledger_blocks for that.',\n inputSchema: {\n type: 'object',\n properties: {\n tags: { type: 'array', items: { type: 'string' }, description: 'Filter by tags' },\n limit: { type: 'number', description: 'Max results (default 5)' },\n directory: { type: 'string', description: 'Working directory' }\n }\n }\n },\n {\n name: 'trie_get_nudges',\n description: 'Get unresolved nudges (goal violations). Use when automating fixes: call trie_get_nudges, then trie_propose_fix or trie_propose_fixes_batch with file/goal/violation from results.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default 20)' },\n severity: { type: 'string', enum: ['critical', 'high', 'warning', 'info'], description: 'Filter by severity' },\n file: { type: 'string', description: 'Filter by file path' },\n directory: { type: 'string', description: 'Working directory' }\n }\n }\n },\n {\n name: 'trie_query_ledger_blocks',\n description: 'Query the ledger chain blocks — the tamper-evident chain of recorded issues. Use when user asks about \"blocks\", \"ledger chain\", \"what issues in my blocks\", \"most frequent issues in blocks\", etc. Returns block summary and aggregation by file, severity, and agent.',\n inputSchema: {\n type: 'object',\n properties: {\n analysis: { type: 'string', enum: ['summary', 'issues', 'all'], description: 'What to analyze: summary, issues (default), or all' },\n limit: { type: 'number', description: 'Max blocks to include (default 50)' },\n directory: { type: 'string', description: 'Working directory' }\n }\n }\n },\n {\n name: 'trie_get_related_governance',\n description: 'Find governance records related to a specific governance record, file, or topic. Targeted context retrieval.',\n inputSchema: {\n type: 'object',\n properties: {\n governanceId: { type: 'string', description: 'Governance ID to find related records' },\n file: { type: 'string', description: 'File path to find related governance' },\n topic: { type: 'string', description: 'Topic to find related governance' },\n limit: { type: 'number', description: 'Max results (default 5)' },\n directory: { type: 'string', description: 'Working directory' }\n }\n }\n },\n {\n name: 'trie_get_related_decisions',\n description: '[DEPRECATED - use trie_get_related_governance] Find related governance records. Backward compatibility alias.',\n inputSchema: {\n type: 'object',\n properties: {\n decisionId: { type: 'string', description: 'Decision ID to find related records' },\n file: { type: 'string', description: 'File path to find related governance' },\n topic: { type: 'string', description: 'Topic to find related governance' },\n limit: { type: 'number', description: 'Max results (default 5)' },\n directory: { type: 'string', description: 'Working directory' }\n }\n }\n },\n {\n name: 'trie_query_context',\n description: 'Natural-language search across ALL Trie context: goals, hypotheses, nudges (goal violations), incidents, governance, blockers. Use for \"what are my goals\", \"show hypotheses\", \"any nudges\", \"show incidents\", \"recent governance\", etc.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Natural language query (e.g. goals, hypotheses, nudges, incidents, governance)' },\n type: { \n type: 'string', \n enum: ['goals', 'hypotheses', 'nudges', 'incidents', 'governance', 'decisions', 'blockers', 'facts', 'questions', 'all'],\n description: 'Type of context to query (default: all). \"decisions\" is deprecated, use \"governance\"'\n },\n limit: { type: 'number', description: 'Max results per type (default 10)' },\n directory: { type: 'string', description: 'Working directory' }\n },\n required: ['query']\n }\n }\n ];\n }\n\n getTool(name: string): any {\n return this.tools.get(name);\n }\n\n getAllTools(): ToolDefinition[] {\n return this.definitions;\n }\n\n getToolNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n}","import { readdir, readFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\nimport { loadConfig } from '../config/loader.js';\nimport { getContextForAI, loadContextState } from '../utils/context-state.js';\nimport { loadProjectInfo, projectInfoExists } from '../utils/project-info.js';\nimport { loadBootstrapContext, loadRules, loadTeamInfo } from '../bootstrap/index.js';\nimport { getMemoryStats, getRecentIssues } from '../memory/issue-store.js';\nimport { getGlobalMemoryStats, findCrossProjectPatterns } from '../memory/global-memory.js';\nimport { getStorage } from '../storage/tiered-storage.js';\n\nexport interface Resource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface ResourceContent {\n contents: Array<{\n uri: string;\n mimeType?: string;\n text: string;\n }>;\n}\n\n// UI App definitions for MCP Apps\nconst UI_APPS = {\n 'ledger': {\n name: 'Decision Ledger',\n description: 'Track decisions, blockers, facts, and questions across your project',\n },\n 'goals': {\n name: 'Goals & Progress',\n description: 'Monitor code quality goals and track progress with visual indicators',\n },\n 'hypotheses': {\n name: 'Hypotheses',\n description: 'Test and validate development theories with evidence-based reasoning',\n },\n 'nudges': {\n name: 'Nudges & Insights',\n description: 'AI-powered code quality insights, warnings, and suggestions',\n },\n 'chat': {\n name: 'AI Chat',\n description: 'Interactive chat with Trie assistant for code analysis and guidance',\n },\n} as const;\n\ntype UIAppId = keyof typeof UI_APPS;\n\nexport class ResourceManager {\n /**\n * Get all available resources dynamically\n */\n async getAvailableResources(): Promise<Resource[]> {\n const resources: Resource[] = [];\n\n // Static resources\n resources.push(\n {\n uri: 'trie://context',\n name: 'AI Context (Consolidated)',\n description: 'Single source of truth: project state, coding rules, recent issues, and cross-project patterns. Read this first.',\n mimeType: 'text/markdown',\n },\n {\n uri: 'trie://project',\n name: 'Project Information',\n description: 'User-defined project context (description, conventions, architecture, AI instructions)',\n mimeType: 'text/markdown',\n },\n {\n uri: 'trie://context/state',\n name: 'Context State',\n description: 'Detailed context state with scan history and priorities',\n mimeType: 'application/json',\n },\n {\n uri: 'trie://config',\n name: 'Trie Configuration',\n description: 'Current Trie configuration settings',\n mimeType: 'application/json',\n },\n {\n uri: 'trie://cache/stats',\n name: 'Cache Statistics',\n description: 'Trie scan cache statistics and performance metrics',\n mimeType: 'application/json',\n },\n {\n uri: 'trie://signatures',\n name: 'Vulnerability Signatures',\n description: 'Summary of loaded vulnerability detection signatures',\n mimeType: 'application/json',\n },\n {\n uri: 'trie://bootstrap',\n name: 'Bootstrap Status',\n description: 'Bootstrap file status and project setup context',\n mimeType: 'application/json',\n },\n {\n uri: 'trie://rules',\n name: 'Project Rules',\n description: 'User-defined coding standards from .trie/RULES.md',\n mimeType: 'text/markdown',\n },\n {\n uri: 'trie://team',\n name: 'Team Info',\n description: 'Team ownership and escalation from .trie/TEAM.md',\n mimeType: 'text/markdown',\n },\n {\n uri: 'trie://memory',\n name: 'Issue Memory',\n description: 'Issue memory statistics and recent issues',\n mimeType: 'application/json',\n },\n {\n uri: 'trie://memory/global',\n name: 'Global Memory',\n description: 'Cross-project patterns and statistics',\n mimeType: 'application/json',\n }\n );\n\n // Dynamic resources: scan reports\n resources.push(...await this.getScanReportResources());\n\n // UI App resources (MCP Apps)\n resources.push(...this.getUIAppResources());\n\n return resources;\n }\n\n private async getScanReportResources(): Promise<Resource[]> {\n try {\n const reportsDir = join(getWorkingDirectory(undefined, true), 'trie-reports');\n const files = await readdir(reportsDir);\n const reportFiles = files.filter(f => f.endsWith('.txt') || f.endsWith('.json'));\n\n return reportFiles.slice(0, 10).map(file => ({\n uri: `trie://reports/${file}`,\n name: `Scan Report: ${file}`,\n description: `Trie scan report from ${file}`,\n mimeType: file.endsWith('.json') ? 'application/json' : 'text/plain',\n }));\n } catch {\n return []; // No reports directory yet\n }\n }\n\n /**\n * Read content for a specific resource\n */\n async readResourceContent(uri: string): Promise<ResourceContent> {\n // Handle UI App resources (MCP Apps)\n if (uri.startsWith('ui://trie/')) {\n const appId = uri.replace('ui://trie/', '');\n return await this.getUIAppResource(uri, appId);\n }\n\n const parsedUri = uri.replace('trie://', '');\n\n // Handle AI context (read this first!)\n if (parsedUri === 'context') {\n return await this.getContextResource(uri);\n }\n\n // Handle project info (user-defined context)\n if (parsedUri === 'project') {\n return await this.getProjectResource(uri);\n }\n\n // Handle context state (detailed JSON)\n if (parsedUri === 'context/state') {\n return await this.getContextStateResource(uri);\n }\n\n // Handle configuration\n if (parsedUri === 'config') {\n return await this.getConfigResource(uri);\n }\n\n // Handle cache stats\n if (parsedUri === 'cache/stats') {\n return await this.getCacheStatsResource(uri);\n }\n\n // Handle vulnerability signatures\n if (parsedUri === 'signatures') {\n return await this.getSignaturesResource(uri);\n }\n\n // Handle bootstrap status\n if (parsedUri === 'bootstrap') {\n return await this.getBootstrapResource(uri);\n }\n\n // Handle rules\n if (parsedUri === 'rules') {\n return await this.getRulesResource(uri);\n }\n\n // Handle team info\n if (parsedUri === 'team') {\n return await this.getTeamResource(uri);\n }\n\n // Handle memory\n if (parsedUri === 'memory') {\n return await this.getMemoryResource(uri);\n }\n\n // Handle global memory\n if (parsedUri === 'memory/global') {\n return await this.getGlobalMemoryResource(uri);\n }\n\n // Handle scan reports\n if (parsedUri.startsWith('reports/')) {\n return await this.getScanReportResource(uri, parsedUri);\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n }\n\n /**\n * Get UI App resources for MCP Apps\n */\n private getUIAppResources(): Resource[] {\n return Object.entries(UI_APPS).map(([id, app]) => ({\n uri: `ui://trie/${id}`,\n name: app.name,\n description: app.description,\n mimeType: 'text/html;profile=mcp-app',\n }));\n }\n\n /**\n * Read UI App resource content (bundled HTML)\n */\n private async getUIAppResource(uri: string, appId: string): Promise<ResourceContent> {\n // Get the directory of this file to find the dist/ui folder\n const currentFile = fileURLToPath(import.meta.url);\n const distDir = dirname(dirname(currentFile)); // Go up from server/ to dist/\n const uiDir = join(distDir, 'ui');\n const htmlPath = join(uiDir, `${appId}.html`);\n\n try {\n if (!existsSync(htmlPath)) {\n // Return a fallback HTML if the bundled app doesn't exist yet\n return {\n contents: [{\n uri,\n mimeType: 'text/html;profile=mcp-app',\n text: this.getFallbackUIHtml(appId),\n }],\n };\n }\n\n const content = await readFile(htmlPath, 'utf-8');\n return {\n contents: [{\n uri,\n mimeType: 'text/html;profile=mcp-app',\n text: content,\n }],\n };\n } catch (error) {\n return {\n contents: [{\n uri,\n mimeType: 'text/html;profile=mcp-app',\n text: this.getFallbackUIHtml(appId),\n }],\n };\n }\n }\n\n /**\n * Generate fallback HTML for UI apps that haven't been built yet\n */\n private getFallbackUIHtml(appId: string): string {\n const app = UI_APPS[appId as UIAppId];\n const title = app?.name || 'Trie UI';\n const description = app?.description || 'Loading...';\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${title} - Trie</title>\n <style>\n :root {\n --bg: #0d1117;\n --surface: #161b22;\n --border: #30363d;\n --text: #e6edf3;\n --text-muted: #8b949e;\n --primary: #58a6ff;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n background: var(--bg);\n color: var(--text);\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n padding: 24px;\n }\n .container {\n text-align: center;\n max-width: 400px;\n }\n h1 {\n font-size: 24px;\n margin-bottom: 8px;\n }\n p {\n color: var(--text-muted);\n margin-bottom: 24px;\n }\n .status {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 8px;\n color: var(--primary);\n }\n .spinner {\n width: 16px;\n height: 16px;\n border: 2px solid var(--border);\n border-top-color: var(--primary);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n @keyframes spin { to { transform: rotate(360deg); } }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>${title}</h1>\n <p>${description}</p>\n <div class=\"status\">\n <div class=\"spinner\"></div>\n <span>Connecting to Trie...</span>\n </div>\n </div>\n <script type=\"module\">\n // MCP Apps SDK connection\n import { App } from \"@modelcontextprotocol/ext-apps\";\n \n const app = new App();\n await app.connect();\n \n app.ontoolresult = (result) => {\n document.querySelector('.status span').textContent = 'Connected! Waiting for data...';\n console.log('Received tool result:', result);\n };\n </script>\n</body>\n</html>`;\n }\n\n private async getContextResource(uri: string): Promise<ResourceContent> {\n const workDir = getWorkingDirectory(undefined, true);\n const state = await loadContextState();\n \n // Build executive summary first\n const summary: string[] = [\n '# Trie Context',\n '',\n '> Quick reference for AI assistants. Detailed sections below.',\n '',\n '## Quick Status',\n '',\n `| Metric | Value |`,\n `|--------|-------|`,\n `| Last Scan | ${state.lastScan ? new Date(state.lastScan.timestamp).toLocaleDateString() : 'Never'} |`,\n `| Critical Issues | ${state.lastScan?.issues.critical ?? 0} |`,\n `| Total Issues | ${state.lastScan?.issues.total ?? 0} |`,\n '',\n ];\n \n // Add top priorities (max 3)\n if (state.activePriorities.length > 0) {\n summary.push('## Top Priorities', '');\n state.activePriorities.slice(0, 3).forEach((p, i) => {\n summary.push(`${i + 1}. ${p}`);\n });\n summary.push('');\n }\n \n // Add recent issues from memory (max 3, one-liners)\n try {\n const recentIssues = await getRecentIssues({ workDir, limit: 3 });\n if (recentIssues.length > 0) {\n summary.push('## Recent Issues', '');\n recentIssues.forEach(i => {\n summary.push(`- [${i.severity.toUpperCase()}] ${i.issue.slice(0, 50)}... (\\`${i.file.split('/').pop()}\\`)`);\n });\n summary.push('');\n }\n } catch {\n // Memory not available\n }\n\n // Add unresolved nudges (goal violations) for automation\n try {\n const storage = getStorage(workDir);\n await storage.initialize();\n const nudges = await storage.queryNudges({ resolved: false, limit: 5 });\n if (nudges.length > 0) {\n summary.push('## Recent Goal Violations (Nudges)', '');\n summary.push('> Use `trie_get_nudges` for full list, then `trie_propose_fix` or `trie_propose_fixes_batch` to automate fixes.', '');\n nudges.forEach(n => {\n const file = n.file || 'unknown';\n summary.push(`- [${n.severity}] ${n.message.slice(0, 60)}${n.message.length > 60 ? '...' : ''} (\\`${file.split('/').pop()}\\`)`);\n });\n summary.push('');\n }\n } catch {\n // Storage not available\n }\n \n // Add cross-project patterns (max 2, one-liners)\n try {\n const patterns = await findCrossProjectPatterns(2);\n if (patterns.length > 0) {\n summary.push('## Watch For (seen in other projects)', '');\n patterns.slice(0, 2).forEach(p => {\n summary.push(`- ${p.pattern.slice(0, 40)}... (${p.occurrences}x across ${p.projects.length} projects)`);\n });\n summary.push('');\n }\n } catch {\n // Global memory not available\n }\n \n // Add coding rules summary (just headers)\n const rules = await loadRules(workDir);\n if (rules) {\n const ruleHeaders = rules.match(/^##?\\s+.+$/gm)?.slice(0, 5) || [];\n if (ruleHeaders.length > 0) {\n summary.push('## Coding Rules (see trie://rules for full)', '');\n ruleHeaders.forEach(h => summary.push(`- ${h.replace(/^#+\\s*/, '')}`));\n summary.push('');\n }\n }\n \n // Add available tools/capabilities\n summary.push('## Available Tools', '');\n summary.push('| Tool | Purpose |');\n summary.push('|------|---------|');\n summary.push('| `trie_fix` | Apply high-confidence fixes |');\n summary.push('| `trie_get_nudges` | Get goal violations for automation |');\n summary.push('| `trie_propose_fix` / `trie_propose_fixes_batch` | Fix nudges from trie_get_nudges |');\n summary.push('| `trie_memory` | Search issue history |');\n summary.push('| `trie_init` | Initialize bootstrap files |');\n summary.push('');\n\n summary.push('---', '', '# Detailed Context', '');\n \n // Now add the full AGENTS.md\n const agentsMdPath = join(getTrieDirectory(workDir), 'AGENTS.md');\n try {\n if (existsSync(agentsMdPath)) {\n const agentsContent = await readFile(agentsMdPath, 'utf-8');\n summary.push(agentsContent);\n } else {\n const contextSummary = await getContextForAI();\n summary.push(contextSummary);\n }\n } catch {\n const contextSummary = await getContextForAI();\n summary.push(contextSummary);\n }\n \n return {\n contents: [{\n uri,\n mimeType: 'text/markdown',\n text: summary.join('\\n'),\n }],\n };\n }\n\n private async getContextStateResource(uri: string): Promise<ResourceContent> {\n const state = await loadContextState();\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(state, null, 2),\n }],\n };\n }\n\n private async getProjectResource(uri: string): Promise<ResourceContent> {\n const workDir = getWorkingDirectory(undefined, true);\n \n if (!projectInfoExists(workDir)) {\n return {\n contents: [{\n uri,\n mimeType: 'text/markdown',\n text: `# Project Information Not Found\n\nNo \\`.trie/PROJECT.md\\` file exists in this project.\n\n## Create One\n\nUse the \\`trie_project\\` tool with action=\"init\" to create a PROJECT.md template:\n\n\\`\\`\\`\ntrie_project action=\"init\"\n\\`\\`\\`\n\nOr run from CLI:\n\\`\\`\\`\ntrie project init\n\\`\\`\\`\n\n## What is PROJECT.md?\n\nPROJECT.md is a user-defined file that stores important project context:\n- Project description and purpose\n- Technology stack\n- Architecture decisions\n- Coding conventions\n- Environment info\n- Team ownership\n- Compliance requirements\n- Special instructions for AI assistants\n\nThis information is automatically available to Claude Code, Cursor, and other AI tools.\n`,\n }],\n };\n }\n\n const content = await loadProjectInfo(workDir);\n return {\n contents: [{\n uri,\n mimeType: 'text/markdown',\n text: content || '',\n }],\n };\n }\n\n private async getConfigResource(uri: string): Promise<ResourceContent> {\n const config = await loadConfig();\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(config, null, 2),\n }],\n };\n }\n\n private async getCacheStatsResource(uri: string): Promise<ResourceContent> {\n try {\n const cachePath = join(getTrieDirectory(getWorkingDirectory(undefined, true)), '.trie-cache.json');\n const cacheContent = await readFile(cachePath, 'utf-8');\n const cache = JSON.parse(cacheContent);\n\n const fileCount = Object.keys(cache.files || {}).length;\n const totalVulns = Object.values(cache.files || {}).reduce((acc: number, file: any) => {\n return acc + (file.vulnerabilities?.length || 0);\n }, 0);\n\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify({\n version: cache.version,\n created: new Date(cache.created).toISOString(),\n lastUpdated: new Date(cache.lastUpdated).toISOString(),\n cachedFiles: fileCount,\n totalVulnerabilitiesFound: totalVulns,\n cacheAgeMinutes: Math.round((Date.now() - cache.lastUpdated) / 60000),\n }, null, 2),\n }],\n };\n } catch {\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify({\n error: 'No cache found. Run a scan first to build the cache.',\n hint: 'Run trie watch to analyze your codebase',\n }, null, 2),\n }],\n };\n }\n }\n\n private async getSignaturesResource(uri: string): Promise<ResourceContent> {\n // Import dynamically to avoid circular deps\n const { getVulnerabilityStats } = await import('../trie/vulnerability-signatures.js');\n const { getVibeCodeStats } = await import('../trie/vibe-code-signatures.js');\n\n const vulnStats = getVulnerabilityStats();\n const vibeStats = getVibeCodeStats();\n\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify({\n vulnerabilitySignatures: vulnStats,\n vibeCodeSignatures: vibeStats,\n totalSignatures: vulnStats.total + vibeStats.total,\n }, null, 2),\n }],\n };\n }\n\n private async getScanReportResource(uri: string, parsedUri: string): Promise<ResourceContent> {\n const fileName = parsedUri.replace('reports/', '');\n const reportPath = join(getWorkingDirectory(undefined, true), 'trie-reports', fileName);\n\n try {\n const content = await readFile(reportPath, 'utf-8');\n\n return {\n contents: [{\n uri,\n mimeType: fileName.endsWith('.json') ? 'application/json' : 'text/plain',\n text: content,\n }],\n };\n } catch {\n throw new Error(`Report not found: ${fileName}`);\n }\n }\n\n private async getBootstrapResource(uri: string): Promise<ResourceContent> {\n const workDir = getWorkingDirectory(undefined, true);\n const context = await loadBootstrapContext(workDir);\n \n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify({\n needsBootstrap: context.needsBootstrap,\n files: context.files.map(f => ({\n name: f.name,\n type: f.type,\n exists: f.exists,\n })),\n hasInjectedContent: !!context.injectedContent,\n }, null, 2),\n }],\n };\n }\n\n private async getRulesResource(uri: string): Promise<ResourceContent> {\n const rules = await loadRules();\n \n if (!rules) {\n return {\n contents: [{\n uri,\n mimeType: 'text/markdown',\n text: `# No Rules Defined\n\nNo \\`.trie/RULES.md\\` file exists in this project.\n\nUse \\`trie_init\\` to create one, or create it manually with your coding standards.\n`,\n }],\n };\n }\n\n return {\n contents: [{\n uri,\n mimeType: 'text/markdown',\n text: rules,\n }],\n };\n }\n\n private async getTeamResource(uri: string): Promise<ResourceContent> {\n const team = await loadTeamInfo();\n \n if (!team) {\n return {\n contents: [{\n uri,\n mimeType: 'text/markdown',\n text: `# No Team Info Defined\n\nNo \\`.trie/TEAM.md\\` file exists in this project.\n\nUse \\`trie_init\\` to create one, or create it manually with team ownership info.\n`,\n }],\n };\n }\n\n return {\n contents: [{\n uri,\n mimeType: 'text/markdown',\n text: team,\n }],\n };\n }\n\n private async getMemoryResource(uri: string): Promise<ResourceContent> {\n const workDir = getWorkingDirectory(undefined, true);\n const stats = await getMemoryStats(workDir);\n const recent = await getRecentIssues({ workDir, limit: 5 });\n \n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify({\n stats,\n recentIssues: recent.map(i => ({\n severity: i.severity,\n issue: i.issue.slice(0, 100),\n file: i.file,\n agent: i.agent,\n timestamp: i.timestamp,\n resolved: i.resolved,\n })),\n }, null, 2),\n }],\n };\n }\n\n private async getGlobalMemoryResource(uri: string): Promise<ResourceContent> {\n const stats = await getGlobalMemoryStats();\n const patterns = await findCrossProjectPatterns(2);\n \n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify({\n stats,\n topPatterns: patterns.slice(0, 10).map(p => ({\n pattern: p.pattern.slice(0, 80),\n severity: p.severity,\n agent: p.agent,\n occurrences: p.occurrences,\n projectCount: p.projects.length,\n hasFixApplied: !!p.fixApplied,\n })),\n }, null, 2),\n }],\n };\n }\n}","import { chromium, Browser, Page } from 'playwright';\nimport { createServer, Server } from 'net';\nimport { request } from 'http';\nimport { isInteractiveMode } from '../utils/progress.js';\n\n/**\n * Browser-based Visual QA Tool\n * \n * Launches a headless browser, captures screenshots at multiple viewports,\n * and returns them for Claude Vision to analyze.\n */\n\nexport interface VisualQAOptions {\n url?: string;\n port?: number;\n viewports?: ViewportConfig[];\n waitForSelector?: string;\n waitMs?: number;\n}\n\nexport interface ViewportConfig {\n name: string;\n width: number;\n height: number;\n}\n\nexport interface ScreenshotResult {\n viewport: string;\n width: number;\n height: number;\n base64: string;\n mimeType: 'image/png';\n}\n\nexport interface VisualQAResult {\n success: boolean;\n url: string;\n screenshots: ScreenshotResult[];\n error?: string;\n analysisPrompt: string;\n}\n\n// Default viewports for responsive testing\nconst DEFAULT_VIEWPORTS: ViewportConfig[] = [\n { name: 'mobile', width: 375, height: 812 }, // iPhone X\n { name: 'tablet', width: 768, height: 1024 }, // iPad\n { name: 'desktop', width: 1440, height: 900 }, // Standard desktop\n];\n\n/**\n * Find an open port on localhost by checking common dev server ports\n * Returns the first port that is both in use AND serving HTTP\n */\nasync function findOpenPort(): Promise<number | null> {\n const commonPorts = [3000, 3001, 5173, 5174, 4200, 8080, 8000, 8888, 5000, 4000];\n \n // Check ports in parallel for faster detection\n const portChecks = await Promise.all(\n commonPorts.map(async (port) => {\n const isOpen = await checkPort(port);\n return isOpen ? port : null;\n })\n );\n \n // Return the first port that's open and serving HTTP\n return portChecks.find(port => port !== null) || null;\n}\n\n/**\n * Check if a port has something listening on it AND is serving HTTP\n */\nasync function checkPort(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n // First check if port is in use\n const testServer: Server = createServer();\n let portInUse = false;\n \n testServer.once('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n portInUse = true;\n // Port is in use - now verify it's serving HTTP\n testHttpPort(port).then(resolve).catch(() => resolve(false));\n } else {\n resolve(false);\n }\n });\n \n testServer.once('listening', () => {\n // Port is free - nothing running\n testServer.close();\n resolve(false);\n });\n \n // Set timeout to prevent hanging\n setTimeout(() => {\n if (!portInUse) {\n testServer.close();\n resolve(false);\n }\n }, 1000);\n \n testServer.listen(port, '127.0.0.1');\n });\n}\n\n/**\n * Verify that a port is actually serving HTTP content\n */\nasync function testHttpPort(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const req = request({\n hostname: 'localhost',\n port: port,\n path: '/',\n method: 'GET',\n timeout: 2000,\n }, (res) => {\n // If we get any HTTP response (even 404), the server is running\n resolve(res.statusCode !== undefined);\n res.on('data', () => {}); // Consume response\n res.on('end', () => {});\n });\n\n req.on('error', () => {\n // Connection refused, timeout, or other error means no HTTP server\n resolve(false);\n });\n\n req.on('timeout', () => {\n req.destroy();\n resolve(false);\n });\n\n req.end();\n });\n}\n\n/**\n * Capture screenshots at multiple viewports\n */\nasync function captureScreenshots(\n url: string,\n viewports: ViewportConfig[],\n options: { waitForSelector?: string | undefined; waitMs?: number | undefined }\n): Promise<ScreenshotResult[]> {\n let browser: Browser | null = null;\n const screenshots: ScreenshotResult[] = [];\n\n try {\n // Launch browser\n browser = await chromium.launch({\n headless: true,\n });\n\n for (const viewport of viewports) {\n const page: Page = await browser.newPage({\n viewport: { width: viewport.width, height: viewport.height },\n });\n\n try {\n // Navigate to URL\n await page.goto(url, { \n waitUntil: 'networkidle',\n timeout: 30000 \n });\n\n // Wait for specific selector if provided\n if (options.waitForSelector) {\n await page.waitForSelector(options.waitForSelector, { timeout: 10000 });\n }\n\n // Additional wait if specified\n if (options.waitMs) {\n await page.waitForTimeout(options.waitMs);\n }\n\n // Capture full-page screenshot\n const screenshotBuffer = await page.screenshot({\n fullPage: true,\n type: 'png',\n });\n\n screenshots.push({\n viewport: viewport.name,\n width: viewport.width,\n height: viewport.height,\n base64: screenshotBuffer.toString('base64'),\n mimeType: 'image/png',\n });\n\n } finally {\n await page.close();\n }\n }\n\n } finally {\n if (browser) {\n await browser.close();\n }\n }\n\n return screenshots;\n}\n\n/**\n * Main Visual QA function - captures screenshots and prepares for Claude Vision\n */\nexport async function runVisualQA(options: VisualQAOptions = {}): Promise<VisualQAResult> {\n let url = options.url;\n \n // If no URL provided, try to find a running dev server\n if (!url) {\n if (options.port) {\n // User specified a port - verify it's serving HTTP\n const isServing = await testHttpPort(options.port);\n if (!isServing) {\n return {\n success: false,\n url: `http://localhost:${options.port}`,\n screenshots: [],\n error: `Port ${options.port} is not serving HTTP. Is your dev server running on this port?\\n\\nTry:\\n1. Verify your dev server is running: curl http://localhost:${options.port}\\n2. Check if the port is correct\\n3. Provide full URL: trie_visual_qa_browser url:\"http://localhost:${options.port}\"`,\n analysisPrompt: '',\n };\n }\n url = `http://localhost:${options.port}`;\n } else {\n // Auto-detect port\n if (!isInteractiveMode()) {\n console.error('Visual QA: Auto-detecting running dev server...');\n }\n const port = await findOpenPort();\n \n if (!port) {\n return {\n success: false,\n url: '',\n screenshots: [],\n error: 'No running dev server found on common ports (3000, 3001, 5173, 5174, 4200, 8080, 8000, 8888, 5000, 4000).\\n\\nPlease:\\n1. Start your dev server, OR\\n2. Provide a URL: trie_visual_qa_browser url:\"http://localhost:3000\", OR\\n3. Specify a port: trie_visual_qa_browser port:3000',\n analysisPrompt: '',\n };\n }\n \n url = `http://localhost:${port}`;\n if (!isInteractiveMode()) {\n console.error(` ✓ Found server on port ${port}`);\n }\n }\n }\n\n const viewports = options.viewports || DEFAULT_VIEWPORTS;\n\n try {\n if (!isInteractiveMode()) {\n console.error(`📸 Visual QA: Capturing screenshots from ${url}`);\n console.error(` Viewports: ${viewports.map(v => `${v.name} (${v.width}x${v.height})`).join(', ')}`);\n }\n\n const screenshots = await captureScreenshots(url, viewports, {\n waitForSelector: options.waitForSelector,\n waitMs: options.waitMs,\n });\n\n if (!isInteractiveMode()) {\n console.error(` ✓ Captured ${screenshots.length} screenshots`);\n }\n\n // Build analysis prompt for Claude Vision\n const analysisPrompt = buildAnalysisPrompt(url, screenshots);\n\n return {\n success: true,\n url,\n screenshots,\n analysisPrompt,\n };\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n \n // Check for common issues\n if (errorMessage.includes('net::ERR_CONNECTION_REFUSED') || errorMessage.includes('ECONNREFUSED')) {\n return {\n success: false,\n url,\n screenshots: [],\n error: `Cannot connect to ${url}. Is your dev server running?\\n\\nTry:\\n1. Start your dev server (e.g., npm start, npm run dev)\\n2. Specify the URL explicitly: trie_visual_qa_browser url:\"http://localhost:3000\"\\n3. Or specify the port: trie_visual_qa_browser port:3000`,\n analysisPrompt: '',\n };\n }\n \n if (errorMessage.includes('Executable doesn\\'t exist') || errorMessage.includes('BrowserType')) {\n return {\n success: false,\n url,\n screenshots: [],\n error: 'Playwright browsers not installed. Run: npx playwright install chromium',\n analysisPrompt: '',\n };\n }\n\n if (errorMessage.includes('timeout') || errorMessage.includes('Navigation timeout')) {\n return {\n success: false,\n url,\n screenshots: [],\n error: `Page load timeout for ${url}. The page may be taking too long to load or may have JavaScript errors.\\n\\nTry:\\n1. Check if the page loads in your browser\\n2. Increase wait time: trie_visual_qa_browser url:\"${url}\" waitMs:5000\\n3. Wait for specific element: trie_visual_qa_browser url:\"${url}\" waitForSelector:\".main-content\"`,\n analysisPrompt: '',\n };\n }\n\n return {\n success: false,\n url,\n screenshots: [],\n error: `Screenshot capture failed: ${errorMessage}\\n\\nTroubleshooting:\\n1. Verify ${url} is accessible in your browser\\n2. Check that your dev server is running\\n3. Try specifying the URL explicitly: trie_visual_qa_browser url:\"${url}\"`,\n analysisPrompt: '',\n };\n }\n}\n\n/**\n * Build the analysis prompt for Claude Vision\n */\nfunction buildAnalysisPrompt(url: string, screenshots: ScreenshotResult[]): string {\n const viewportList = screenshots.map(s => `- ${s.viewport}: ${s.width}x${s.height}`).join('\\n');\n \n return `## Visual QA Analysis\n\nI've captured screenshots of **${url}** at ${screenshots.length} viewports:\n\n${viewportList}\n\nPlease analyze these screenshots for:\n\n### Layout Issues\n- Overlapping elements or text\n- Content overflow or clipping\n- Broken layouts at specific breakpoints\n- Misaligned elements\n- Unexpected gaps or spacing\n\n### Responsive Design\n- Mobile navigation issues\n- Text too small to read on mobile\n- Touch targets too small (<44px)\n- Horizontal scrolling on mobile\n- Content not adapting to viewport\n\n### Visual Polish\n- Inconsistent spacing or alignment\n- Poor color contrast (text hard to read)\n- Broken images or missing assets\n- Loading states stuck/visible\n- Z-index issues (elements overlapping incorrectly)\n\n### Accessibility\n- Missing focus indicators\n- Color-only information\n- Text over images without sufficient contrast\n- Very small text (<12px)\n\n### General Quality\n- Does it look professional?\n- Is the hierarchy clear?\n- Are interactive elements obvious?\n- Any obvious bugs or glitches?\n\nFor each issue found:\n1. **Viewport**: Which viewport(s) affected\n2. **Location**: Where on the page\n3. **Issue**: What's wrong\n4. **Severity**: Critical/Serious/Moderate/Low\n5. **Fix**: How to resolve it\n\nIf the UI looks good, say so! Note what's working well.`;\n}\n\n/**\n * Format MCP response with images for Claude Vision\n */\nexport function formatMCPResponse(result: VisualQAResult): {\n content: Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }>;\n} {\n if (!result.success) {\n return {\n content: [{\n type: 'text',\n text: `# Visual QA Failed\\n\\n${result.error}\\n\\n## Troubleshooting\\n\\n1. Make sure your dev server is running\\n2. Try: \\`trie_visual_qa url:\"http://localhost:3000\"\\`\\n3. If Playwright isn't installed: \\`npx playwright install chromium\\``,\n }],\n };\n }\n\n const content: Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }> = [];\n\n // Add the analysis prompt first\n content.push({\n type: 'text',\n text: result.analysisPrompt,\n });\n\n // Add each screenshot as an image\n for (const screenshot of result.screenshots) {\n content.push({\n type: 'text',\n text: `\\n### ${screenshot.viewport} (${screenshot.width}x${screenshot.height})\\n`,\n });\n content.push({\n type: 'image',\n data: screenshot.base64,\n mimeType: screenshot.mimeType,\n });\n }\n\n return { content };\n}\n\n/**\n * MCP Tool Definition\n */\nexport const VISUAL_QA_TOOL_DEFINITION = {\n name: 'visual_qa_browser',\n description: 'Capture screenshots of your app at mobile/tablet/desktop viewports for visual QA analysis. Auto-detects running dev servers or specify a URL.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n url: {\n type: 'string',\n description: 'URL to screenshot (e.g., http://localhost:3000). If not provided, auto-detects running dev server.',\n },\n port: {\n type: 'number',\n description: 'Specific port to check if no URL provided',\n },\n waitForSelector: {\n type: 'string',\n description: 'CSS selector to wait for before capturing (e.g., \".main-content\")',\n },\n waitMs: {\n type: 'number',\n description: 'Additional milliseconds to wait after page load',\n },\n },\n required: [],\n },\n};\n","import { getWorkingDirectory } from '../utils/workspace.js';\nimport { runVisualQA, formatMCPResponse } from '../tools/visual-qa-browser.js';\nimport { ToolRegistry } from './tool-registry.js';\nimport { ResourceManager } from './resource-manager.js';\n\nexport class RequestHandlers {\n constructor(\n private toolRegistry: ToolRegistry,\n private resourceManager: ResourceManager\n ) {}\n\n /**\n * Handle tool execution requests\n */\n async handleToolCall(name: string, args: any): Promise<any> {\n // Accept namespaced calls and normalize\n const normalizedName = this.normalizeName(name);\n\n // Auto-detect directory for Cursor/IDE tools when not explicitly provided\n if (args && !args.directory && !args.files) {\n const workingDir = getWorkingDirectory(undefined, true);\n if (workingDir !== process.cwd()) {\n args.directory = workingDir;\n }\n }\n\n try {\n switch (normalizedName) {\n case 'trie':\n return await this.handleTrieMenu(args);\n\n case 'scan':\n return await this.toolRegistry.getTool('scan').execute(args);\n\n case 'fix':\n return await this.toolRegistry.getTool('fix').execute(args);\n\n case 'explain':\n return await this.toolRegistry.getTool('explain').execute(args);\n\n case 'test':\n return await this.toolRegistry.getTool('test').execute(args);\n\n case 'register_agent':\n return await this.toolRegistry.getTool('register_agent').execute(args);\n\n case 'watch':\n return await this.toolRegistry.getTool('watch').execute(args);\n\n case 'visual_qa_browser': {\n try {\n const result = await runVisualQA(args as { url?: string; port?: number; waitForSelector?: string; waitMs?: number });\n return formatMCPResponse(result);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return {\n content: [{\n type: 'text',\n text: `# Visual QA Error\\n\\nFailed to capture screenshots: ${errorMessage}\\n\\n## Troubleshooting\\n\\n1. **Check if your dev server is running:**\\n - Try accessing the URL in your browser\\n - Common ports: 3000, 5173, 8080\\n\\n2. **Specify the URL explicitly:**\\n \\`\\`\\`\\ntrie_visual_qa_browser url:\"http://localhost:3000\"\\n\\`\\`\\`\\n\\n3. **Specify a port:**\\n \\`\\`\\`\\ntrie_visual_qa_browser port:3000\\n\\`\\`\\`\\n\\n4. **Install Playwright browsers (if needed):**\\n \\`\\`\\`\\nnpx playwright install chromium\\n\\`\\`\\`\\n\\n5. **Check for JavaScript errors:**\\n - Open browser dev tools\\n - Look for console errors\\n - The page may be failing to load`,\n }],\n };\n }\n }\n\n case 'pr_review':\n return await this.toolRegistry.getTool('pr_review').execute(args);\n\n case 'project':\n case 'project_info':\n return await this.toolRegistry.getTool('project').execute(args);\n\n case 'init':\n return await this.toolRegistry.getTool('init').execute(args);\n\n case 'memory':\n return await this.toolRegistry.getTool('memory').execute(args);\n\n case 'check':\n return await this.toolRegistry.getTool('check').execute(args);\n\n case 'tell':\n return await this.toolRegistry.getTool('tell').execute(args);\n\n case 'feedback':\n case 'ok':\n case 'bad':\n return await this.toolRegistry.getTool('feedback').execute(args);\n\n case 'reconcile':\n return await this.toolRegistry.getTool('reconcile').execute(args);\n\n case 'context':\n return await this.toolRegistry.getTool('context').execute(args);\n\n case 'checkpoint':\n case 'cp':\n case 'save':\n return await this.toolRegistry.getTool('checkpoint').execute(args);\n\n case 'cloud_fix':\n return await this.toolRegistry.getTool('cloud_fix').execute(args);\n\n case 'linear_sync':\n return await this.toolRegistry.getTool('linear_sync').execute(args);\n\n case 'github_sync':\n return await this.toolRegistry.getTool('github_sync').execute(args);\n\n case 'github_branches':\n return await this.toolRegistry.getTool('github_branches').execute(args);\n\n case 'pipeline':\n return await this.toolRegistry.getTool('pipeline').execute(args);\n\n case 'index':\n return await this.toolRegistry.getTool('index').execute(args);\n\n default: {\n // Fallback: try tool by normalized name (handles trie_index, trie_github_branches, etc.)\n const tool = this.toolRegistry.getTool(normalizedName);\n if (tool) {\n return await tool.execute(args);\n }\n throw new Error(`Unknown tool: ${name}`);\n }\n }\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : String(error)}`\n }]\n };\n }\n }\n\n /**\n * Handle resource listing requests\n */\n async handleListResources(): Promise<{ resources: any[] }> {\n const resources = await this.resourceManager.getAvailableResources();\n return { resources };\n }\n\n /**\n * Handle resource reading requests\n */\n async handleReadResource(uri: string): Promise<any> {\n return await this.resourceManager.readResourceContent(uri);\n }\n\n private normalizeName(name: string): string {\n // Accept namespaced calls like \"scan:user-trie-agent\" or \"user-trie-agent/scan\"\n // Also accept slash-prefixed chat-style commands like \"/trie\" or \"/trie_fix\"\n // Strip trailing \"(MCP)\" or \"(action: ...)\" that some clients append\n const stripNamespace = (n: string): string => {\n const trimmed = n.trim().replace(/\\s*\\([^)]*\\)\\s*$/, '').trim();\n const withoutSlash = trimmed.startsWith('/') ? trimmed.slice(1) : trimmed;\n const parts = withoutSlash.split(':');\n const base = (parts[0] || withoutSlash).trim();\n const slashParts = base.split('/');\n return (slashParts[slashParts.length - 1] || base).trim();\n };\n\n const rawName = stripNamespace(name);\n return rawName.startsWith('trie_') ? rawName.slice('trie_'.length) : rawName;\n }\n\n private async handleTrieMenu(args?: any) {\n const actionInput = typeof args?.action === 'string' ? args.action : null;\n if (actionInput) {\n const normalizedAction = this.normalizeName(actionInput);\n // Avoid recursion loop\n if (normalizedAction === 'trie') {\n return {\n content: [{\n type: 'text',\n text: 'Use `trie` without action for the menu, or provide a concrete action like \"scan\" or \"security\".'\n }]\n };\n }\n\n // Delegate to the same dispatcher to keep alias handling consistent\n return await this.handleToolCall(normalizedAction, { ...args });\n }\n\n return {\n content: [{\n type: 'text',\n text: [\n '## Trie Quick Actions',\n '',\n '**Most common:**',\n '- `trie` (no args) — show this menu',\n '- `action: \"fix\"` — high-confidence fixes',\n '- `action: \"watch\"` — start/stop/status autonomous watch',\n '- `action: \"pr_review\"` — interactive PR review',\n '',\n '**Other actions:**',\n '- `action: \"test\"` — generate/coverage/suggest/run tests (requires `files` + `action`)',\n '- `action: \"explain\"` — explain code/issues/risks',\n '- `action: \"visual_qa_browser\"` — screenshots for visual QA',\n '',\n 'All commands accept `trie_` prefix (e.g., `trie_fix`, `trie_watch`).',\n ].join('\\n')\n }]\n };\n }\n}"],"mappings":"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","names":["Server","readFile","existsSync","join","basename","resolve","isAbsolute","isAbsolute","resolve","existsSync","basename","path","join","readFile","result","patterns","lines","stats","readFile","existsSync","join","dirname","join","dirname","existsSync","readFile","resolve","Server","request"]}
|