@rigstate/mcp 0.4.2

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.
Files changed (40) hide show
  1. package/.env.example +8 -0
  2. package/README.md +352 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.js +3445 -0
  5. package/dist/index.js.map +1 -0
  6. package/package.json +43 -0
  7. package/roadmap.json +531 -0
  8. package/src/agents/the-scribe.ts +122 -0
  9. package/src/index.ts +1792 -0
  10. package/src/lib/supabase.ts +120 -0
  11. package/src/lib/tool-registry.ts +134 -0
  12. package/src/lib/types.ts +415 -0
  13. package/src/lib/utils.ts +10 -0
  14. package/src/resources/project-morals.ts +92 -0
  15. package/src/tools/arch-tools.ts +166 -0
  16. package/src/tools/archaeological-scan.ts +335 -0
  17. package/src/tools/check-agent-bridge.ts +169 -0
  18. package/src/tools/check-rules-sync.ts +85 -0
  19. package/src/tools/complete-roadmap-task.ts +96 -0
  20. package/src/tools/generate-professional-pdf.ts +232 -0
  21. package/src/tools/get-latest-decisions.ts +130 -0
  22. package/src/tools/get-next-roadmap-step.ts +76 -0
  23. package/src/tools/get-project-context.ts +163 -0
  24. package/src/tools/index.ts +17 -0
  25. package/src/tools/list-features.ts +67 -0
  26. package/src/tools/list-roadmap-tasks.ts +61 -0
  27. package/src/tools/pending-tasks.ts +228 -0
  28. package/src/tools/planning-tools.ts +123 -0
  29. package/src/tools/query-brain.ts +125 -0
  30. package/src/tools/research-tools.ts +149 -0
  31. package/src/tools/run-architecture-audit.ts +203 -0
  32. package/src/tools/save-decision.ts +77 -0
  33. package/src/tools/security-tools.ts +82 -0
  34. package/src/tools/submit-idea.ts +66 -0
  35. package/src/tools/sync-ide-rules.ts +76 -0
  36. package/src/tools/teacher-mode.ts +171 -0
  37. package/src/tools/ui-tools.ts +191 -0
  38. package/src/tools/update-roadmap.ts +105 -0
  39. package/tsconfig.json +29 -0
  40. package/tsup.config.ts +16 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/supabase.ts","../src/lib/types.ts","../src/tools/get-project-context.ts","../src/tools/query-brain.ts","../src/tools/get-latest-decisions.ts","../src/resources/project-morals.ts","../src/tools/check-agent-bridge.ts","../src/tools/check-rules-sync.ts","../src/tools/teacher-mode.ts","../src/tools/list-roadmap-tasks.ts","../src/tools/get-next-roadmap-step.ts","../src/agents/the-scribe.ts","../src/tools/generate-professional-pdf.ts","../src/tools/sync-ide-rules.ts","../src/tools/archaeological-scan.ts","../src/tools/arch-tools.ts","../src/tools/security-tools.ts","../src/tools/research-tools.ts","../src/tools/complete-roadmap-task.ts","../src/tools/list-features.ts","../src/lib/tool-registry.ts","../src/tools/ui-tools.ts","../src/tools/pending-tasks.ts"],"sourcesContent":["/**\n * Rigstate MCP Server\n * \n * A Model Context Protocol server that exposes Rigstate's Project Brain\n * and Council Decisions to AI editors like Cursor and Claude Desktop.\n * \n * Environment Variables:\n * - RIGSTATE_API_KEY: Your Rigstate API key (sk_rigstate_...)\n * - RIGSTATE_SUPABASE_URL: Supabase project URL (optional, defaults to env)\n * - RIGSTATE_SUPABASE_ANON_KEY: Supabase anon key (optional, defaults to env)\n * \n * Usage:\n * RIGSTATE_API_KEY=sk_rigstate_xxx npx @rigstate/mcp\n * \n * Or in Cursor/Claude config:\n * {\n * \"mcpServers\": {\n * \"rigstate\": {\n * \"command\": \"npx\",\n * \"args\": [\"@rigstate/mcp\"],\n * \"env\": { \"RIGSTATE_API_KEY\": \"sk_rigstate_xxx\" }\n * }\n * }\n * }\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n ErrorCode,\n McpError,\n} from '@modelcontextprotocol/sdk/types.js';\n\nimport { authenticateApiKey, type AuthContext } from './lib/supabase.js';\nimport {\n QueryBrainInputSchema,\n GetProjectContextInputSchema,\n GetLatestDecisionsInputSchema,\n SaveDecisionInputSchema,\n SubmitIdeaInputSchema,\n UpdateRoadmapInputSchema,\n RunArchitectureAuditInputSchema,\n GenerateCursorRulesInputSchema,\n RefineLogicInputSchema,\n GetLearnedInstructionsInputSchema,\n AnalyzeDependencyGraphInputSchema,\n AuditRlsStatusInputSchema,\n QueryProjectBrainInputSchema,\n FetchPackageHealthInputSchema,\n SaveToProjectBrainInputSchema,\n UpdateRoadmapStatusInputSchema,\n AddRoadmapChunkInputSchema,\n AnalyzeUiComponentInputSchema,\n ApplyDesignSystemInputSchema,\n FetchUiLibraryDocsInputSchema\n} from './lib/types.js';\nimport { ListRoadmapTasksInputSchema, CheckAgentBridgeInputSchema, CheckRulesSyncInputSchema, GetNextRoadmapStepInputSchema, GenerateProfessionalPDFInputSchema, ArchaeologicalScanInputSchema, ImportGhostFeaturesInputSchema, GetPendingTasksInputSchema, UpdateTaskStatusInputSchema } from './lib/types.js';\nimport { getProjectContext } from './tools/get-project-context.js';\nimport { queryBrain } from './tools/query-brain.js';\nimport { getLatestDecisions } from './tools/get-latest-decisions.js';\nimport { saveDecision } from './tools/save-decision.js';\nimport { submitIdea } from './tools/submit-idea.js';\nimport { updateRoadmap } from './tools/update-roadmap.js';\nimport { checkAgentBridge } from './tools/check-agent-bridge.js';\nimport { checkRulesSync } from './tools/check-rules-sync.js';\nimport { runArchitectureAudit } from './tools/run-architecture-audit.js';\nimport { refineLogic, getLearnedInstructions } from './tools/teacher-mode.js';\nimport { listRoadmapTasks } from './tools/list-roadmap-tasks.js';\nimport { getNextRoadmapStep } from './tools/get-next-roadmap-step.js';\nimport { generateProfessionalPdf } from './tools/generate-professional-pdf.js';\nimport { syncIdeRules } from './tools/sync-ide-rules.js';\nimport { performArchaeologicalScan, importGhostFeatures } from './tools/archaeological-scan.js';\nimport { analyzeDependencyGraph } from './tools/arch-tools.js';\nimport { auditRlsStatus } from './tools/security-tools.js';\nimport { queryProjectBrain, fetchPackageHealth } from './tools/research-tools.js';\nimport { saveToProjectBrain, updateRoadmapStatus, addRoadmapChunk } from './tools/planning-tools.js';\nimport { completeRoadmapTask } from './tools/complete-roadmap-task.js';\nimport { listFeaturesTool } from './tools/list-features.js'; // NEW\nimport { registry } from './lib/tool-registry.js'; // NEW\nimport { analyzeUiComponent, applyDesignSystem, fetchUiLibraryDocs } from './tools/ui-tools.js';\nimport { getProjectMorals } from './resources/project-morals.js';\nimport { getPendingTasks, updateTaskStatus } from './tools/pending-tasks.js';\nimport { SupabaseClient } from '@supabase/supabase-js';\n\n// REGISTER MIGRATED TOOLS\nregistry.register(listFeaturesTool);\n\n\n// =============================================================================\n// FRANK WATCHER (Internal Background Process)\n// =============================================================================\n\nlet watcherState = {\n isRunning: false,\n lastCheck: null as string | null,\n tasksFound: 0,\n projectId: null as string | null // Will be auto-magically inferred if possible, or just scan all owned projects? \n // Actually, scan all projects owned by the authenticated user is safer.\n // For now, let's keep it simple: scan *all* projects the user has access to that have stuck agent jobs.\n // Or better: Use the authContext supabase instance which is user-scoped!\n};\n\nasync function startFrankWatcher(supabase: SupabaseClient, userId: string) {\n if (watcherState.isRunning) return;\n watcherState.isRunning = true;\n console.error(`🤖 Frank Watcher started for user ${userId}`);\n\n const checkTasks = async () => {\n try {\n watcherState.lastCheck = new Date().toISOString();\n\n // 1. Check for PENDING or APPROVED tasks\n // 1. Check for PENDING or APPROVED tasks\n const { data: tasks, error } = await supabase\n .from('agent_bridge')\n .select('*') // Remove problematic join to roadmap_chunks\n .in('status', ['PENDING', 'APPROVED'])\n .order('created_at', { ascending: true })\n .limit(1);\n\n if (error) return;\n\n if (tasks && tasks.length > 0) {\n const task = tasks[0];\n watcherState.tasksFound++;\n\n if (task.proposal?.startsWith('ping') || (task.task_id === null && !task.proposal?.startsWith('report'))) {\n console.error(`\\n⚡ HEARTBEAT: Frank received REAL-TIME PING for project ${task.project_id}. Response: PONG`);\n\n // Respond to ping by completing it immediately\n await supabase\n .from('agent_bridge')\n .update({\n status: 'COMPLETED',\n summary: 'Pong! Frank is active and listening.',\n updated_at: new Date().toISOString()\n })\n .eq('id', task.id);\n\n // Clear any local cache/state if needed\n return;\n }\n\n // Handle Governance Report generation\n if (task.proposal?.startsWith('report')) {\n const parts = task.proposal.split(':');\n const signalType = parts[1]; // 'MANIFEST' or 'INVESTOR'\n const reportType = signalType === 'MANIFEST' ? 'SYSTEM_MANIFEST' : 'INVESTOR_REPORT';\n\n console.error(`\\n📄 Frank is generating ${reportType} report for project ${task.project_id}...`);\n\n try {\n // Use the real generation logic\n const result = await generateProfessionalPdf(\n supabase,\n userId,\n task.project_id,\n reportType\n );\n\n // Update the TRIGGER task with the results so the UI sees it\n await supabase\n .from('agent_bridge')\n .update({\n status: 'COMPLETED',\n summary: `Report generated: ${reportType === 'SYSTEM_MANIFEST' ? 'Technical Manifest' : 'Investor Intelligence'}.`,\n proposal: JSON.stringify(result.data), // Pass structured data back\n updated_at: new Date().toISOString()\n })\n .eq('id', task.id);\n\n } catch (genError: any) {\n console.error(`❌ Report generation failed: ${genError.message}`);\n await supabase\n .from('agent_bridge')\n .update({\n status: 'FAILED',\n summary: `Generation failed: ${genError.message}`,\n updated_at: new Date().toISOString()\n })\n .eq('id', task.id);\n }\n\n return;\n }\n\n if (task.status === 'APPROVED') {\n console.error(`\\n🏗️ Worker: EXECUTING approved task: [${task.id}]`);\n\n // 1. Move to EXECUTING\n await supabase\n .from('agent_bridge')\n .update({\n status: 'EXECUTING',\n updated_at: new Date().toISOString()\n })\n .eq('id', task.id);\n\n // 2. Simulate work (Execution)\n await new Promise(resolve => setTimeout(resolve, 3000));\n\n // 3. Generate Mission Report (Data Ingestion)\n const taskTitle = (task.roadmap_chunks as any)?.title || 'manual objective';\n const technicalSummary = `Processed ${task.task_id || 'manual task'}. Applied architectural alignment. Verified L-max compliance.`;\n const humanSummary = `Mission Accomplished: I've successfully completed \"${taskTitle}\" and synchronized changes with the Project Brain. 🚀`; // Gunhild's mandate\n\n await supabase\n .from('mission_reports')\n .insert({\n bridge_id: task.id,\n project_id: task.project_id,\n task_id: task.task_id,\n human_summary: humanSummary,\n technical_summary: technicalSummary,\n file_diff_stats: {\n files: [\"src/actions/lab.ts\", \"src/actions/lab/core.ts\"],\n added: 142,\n deleted: 385\n }\n });\n\n // 4. Move to COMPLETED\n await supabase\n .from('agent_bridge')\n .update({\n status: 'COMPLETED',\n summary: humanSummary,\n execution_summary: technicalSummary,\n updated_at: new Date().toISOString(),\n completed_at: new Date().toISOString()\n })\n .eq('id', task.id);\n\n // 5. Also update the roadmap chunk status\n if (task.task_id) {\n await supabase\n .from('roadmap_chunks')\n .update({\n status: 'COMPLETED',\n completed_at: new Date().toISOString()\n })\n .eq('id', task.task_id);\n }\n\n console.error(`✅ Worker: Mission finished for task ${task.id}`);\n return;\n }\n\n console.error(`\\n🔎 Frank Watcher found task: [${(task.roadmap_chunks as any)?.title || task.id}]`);\n\n // 2. \"Analyze\" - Specialized heuristics or generic plan\n let proposal = '';\n\n // Simple heuristic analysis\n const taskTitle = (task.roadmap_chunks as any)?.title || '';\n if (taskTitle.includes('lab.ts')) {\n await new Promise(resolve => setTimeout(resolve, 2000));\n proposal = `I will modularize the apps/web/src/actions/lab.ts file to comply with the <400 lines limit.\\n\\nThe new structure will be:\\n- apps/web/src/actions/lab/index.ts: Re-export everything to ensure backward compatibility.\\n- apps/web/src/actions/lab/core.ts: Shared types and buildProjectContext.\\n- apps/web/src/actions/lab/sessions.ts: Lab sessions and chat logic.\\n- apps/web/src/actions/lab/ideas.ts: Idea management and crystallization.\\n- apps/web/src/actions/lab/council.ts: Council review logic.\\n- apps/web/src/actions/lab/protection.ts: Roadmap protection logic.\\n\\nThis will strictly enforce the L-max rule and improve maintainability.`;\n } else {\n await new Promise(resolve => setTimeout(resolve, 1500));\n proposal = `Frank (Auto-Mode) has analyzed the request for \"${taskTitle || 'Task'}\".\\n\\n**Proposed Plan:**\\n1. Review context.\\n2. Apply changes.\\n3. Verify.\\n\\nReady to proceed.`;\n }\n\n // 3. Update Status\n await supabase\n .from('agent_bridge')\n .update({\n status: 'AWAITING_APPROVAL',\n proposal: proposal,\n updated_at: new Date().toISOString()\n })\n .eq('id', task.id);\n\n console.error(`✅ Frank Watcher submitted plan for task ${task.id}`);\n }\n\n } catch (e) {\n // console.error('Watcher Exception:', e);\n }\n };\n\n // 1. Active Listening (Realtime)\n const channel = supabase\n .channel('frank-watcher')\n .on(\n 'postgres_changes',\n {\n event: '*', // Listen for all events (INSERT/UPDATE)\n schema: 'public',\n table: 'agent_bridge'\n },\n (payload: any) => {\n // Trigger immediate check if new task is PENDING or existing became APPROVED\n if (payload.new.status === 'PENDING' || payload.new.status === 'APPROVED') {\n checkTasks();\n }\n }\n )\n .subscribe();\n\n // 2. Passive Fallback (Polling)\n setInterval(checkTasks, 5000); // 5s fallback for aggressive response\n\n // Initial check\n checkTasks();\n}\n\n// =============================================================================\n// CONFIGURATION\n// =============================================================================\n\nconst SERVER_NAME = 'rigstate-mcp';\nconst SERVER_VERSION = '0.4.1'; // Read-Only Enforcement - Writes disabled\n\n// =============================================================================\n// TOOL DEFINITIONS\n// =============================================================================\n\nconst TOOLS = [\n // GUARDIAN LOCKS\n {\n name: 'write_to_file',\n description: 'Guardian Lock: Blocks file writes if RIGSTATE_MODE is SUPERVISOR.',\n inputSchema: { type: 'object', properties: {}, additionalProperties: true }\n },\n {\n name: 'replace_file_content',\n description: 'Guardian Lock: Blocks file edits if RIGSTATE_MODE is SUPERVISOR.',\n inputSchema: { type: 'object', properties: {}, additionalProperties: true }\n },\n {\n name: 'run_command',\n description: 'Guardian Lock: Blocks commands if RIGSTATE_MODE is SUPERVISOR.',\n inputSchema: { type: 'object', properties: {}, additionalProperties: true }\n },\n {\n name: 'get_project_context',\n description: `Returns the project type, tech stack, and high-level description for a Rigstate project.\nUse this to understand what technology stack and project type you're working with before generating code.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n }\n },\n required: ['projectId']\n }\n },\n {\n name: 'query_brain',\n description: `Queries the Project Brain for relevant memories, architecture rules, and decisions.\nUse this when you need to understand project-specific constraints, coding standards, or past decisions.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n query: {\n type: 'string',\n description: 'Natural language query to search the project brain'\n },\n limit: {\n type: 'number',\n description: 'Maximum number of memories to return (default: 8, max: 20)'\n },\n threshold: {\n type: 'number',\n description: 'Similarity threshold for semantic search (0-1, default: 0.5)'\n }\n },\n required: ['projectId', 'query']\n }\n },\n {\n name: 'get_latest_decisions',\n description: `Fetches the most recent ADRs and decisions from The Architect's Council.\nUse this to understand recent architectural decisions, roadmap focus, and council feedback.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n limit: {\n type: 'number',\n description: 'Maximum number of council sessions to return (default: 5, max: 10)'\n }\n },\n required: ['projectId']\n }\n },\n {\n name: 'list_roadmap_tasks',\n description: `Lists all roadmap tasks for a project that are not completed.\nReturns id, title, priority, and status. Use this to find actionable tasks.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n }\n },\n required: ['projectId']\n }\n },\n {\n name: 'check_agent_bridge',\n description: `Checks for pending agent tasks or updates task status.\nUse this to poll for work (status: PENDING/APPROVED) or to update a task's progress.\n- If checking: Returns the oldest actionable task.\n- If updating: Requires 'bridgeId' and 'action=\"update\"'.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n action: {\n type: 'string',\n enum: ['check', 'update'],\n description: 'Action to perform (default: check)'\n },\n bridgeId: {\n type: 'string',\n description: 'ID of the bridge task (required for update)'\n },\n status: {\n type: 'string',\n enum: ['PENDING', 'AWAITING_APPROVAL', 'APPROVED', 'EXECUTING', 'COMPLETED', 'FAILED'],\n description: 'New status (for update)'\n },\n summary: {\n type: 'string',\n description: 'Execution summary or report (for update)'\n },\n proposal: {\n type: 'string',\n description: 'Plan/Proposal markdown (for update)'\n }\n },\n required: ['projectId']\n }\n },\n // =========================================================================\n {\n name: 'check_rules_sync',\n description: `Checks if the IDE's rules file contains the VIBELINE managed block.\nUse this to verifying that project rules are present and up-to-date in the editor context.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n currentRulesContent: {\n type: 'string',\n description: 'The content of the .cursorrules or active rules file to check'\n }\n },\n required: ['projectId']\n }\n },\n {\n name: 'get_agent_status',\n description: `Checks the status of the internal Frank Watcher agent.\nReturns whether the background poll loop is running and stats.`,\n inputSchema: {\n type: 'object' as const,\n properties: {},\n required: []\n }\n },\n {\n name: 'get_next_roadmap_step',\n description: `Fetches the next logical step from the project roadmap.\nUse this after completing a task to see what to do next.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n currentStepId: {\n type: 'string',\n description: 'Optional: The ID of the step you just finished.'\n }\n },\n required: ['projectId']\n }\n },\n {\n name: 'complete_roadmap_task',\n description: `Marks a roadmap task as COMPLETED and logs a summary of the work done.\nUse this when you have finished a task in the IDE and want to update the project roadmap.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n summary: {\n type: 'string',\n description: 'A human-readable summary of what was completed.'\n },\n taskId: {\n type: 'string',\n description: 'Optional: ID of specific task. If omitted, completes the current active task.'\n },\n gitDiff: {\n type: 'string',\n description: 'Optional: Technical summary or git diff stats.'\n }\n },\n required: ['projectId', 'summary']\n }\n },\n {\n name: 'sync_ide_rules',\n description: `Generates and returns the appropriate rules file (.cursorrules, .windsurfrules, etc.) based on project context and user preferences.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n }\n },\n required: ['projectId']\n }\n },\n // =========================================================================\n // WRITE OPERATIONS (DEPRECATED - Use CLI or Dashboard instead)\n // =========================================================================\n {\n name: 'save_decision',\n description: `[DEPRECATED] Saves a new architectural decision (ADR) to the Project Brain.\n⚠️ NOTICE: Write operations via MCP are deprecated. Use the Rigstate Dashboard or CLI instead.\nThis tool will be removed in a future version. For now, it still works but is not recommended.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n title: {\n type: 'string',\n description: 'Short title for the decision (e.g., \"Use Prisma for ORM\")'\n },\n decision: {\n type: 'string',\n description: 'The full decision content'\n },\n rationale: {\n type: 'string',\n description: 'Optional explanation of why this decision was made'\n },\n category: {\n type: 'string',\n enum: ['decision', 'architecture', 'constraint', 'tech_stack', 'design_rule'],\n description: 'Category of the decision (default: decision)'\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional tags for categorization'\n }\n },\n required: ['projectId', 'title', 'decision']\n }\n },\n {\n name: 'submit_idea',\n description: `[DEPRECATED] Submits a new idea to the Idea Lab.\n⚠️ NOTICE: Write operations via MCP are deprecated. Use the Rigstate Dashboard instead.\nThis tool will be removed in a future version.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n title: {\n type: 'string',\n description: 'Short title for the idea'\n },\n description: {\n type: 'string',\n description: 'Detailed description of the idea'\n },\n category: {\n type: 'string',\n enum: ['feature', 'improvement', 'experiment', 'pivot'],\n description: 'Category of the idea (default: feature)'\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional tags for categorization'\n }\n },\n required: ['projectId', 'title', 'description']\n }\n },\n {\n name: 'update_roadmap',\n description: `[DEPRECATED] Updates the status of a roadmap step.\n⚠️ NOTICE: Write operations via MCP are deprecated. Use \"rigstate sync\" CLI or Dashboard instead.\nThis tool will be removed in a future version.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n chunkId: {\n type: 'string',\n description: 'The UUID of the roadmap chunk to update'\n },\n title: {\n type: 'string',\n description: 'Search for chunk by title (fuzzy match). Use if chunkId is not known.'\n },\n status: {\n type: 'string',\n enum: ['LOCKED', 'ACTIVE', 'COMPLETED'],\n description: 'New status for the roadmap step'\n }\n },\n required: ['projectId', 'status']\n }\n },\n {\n name: 'run_architecture_audit',\n description: `Audits code against project architecture rules and security patterns.\nReturns violations or \"Pass\" status with a score.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n filePath: {\n type: 'string',\n description: 'Path of the file being audited (for context)'\n },\n content: {\n type: 'string',\n description: 'The source code content to audit'\n }\n },\n required: ['projectId', 'filePath', 'content']\n }\n },\n // =========================================================================\n // TEACHER MODE TOOLS\n // =========================================================================\n {\n name: 'refine_logic',\n description: `Send a logic correction to teach Frank how to handle similar situations.\nUse this when Frank made a reasoning error and you want to correct it.\nThe correction will be saved and applied to future interactions.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n originalReasoning: {\n type: 'string',\n description: 'What Frank originally said or did wrong'\n },\n userCorrection: {\n type: 'string',\n description: 'How Frank should handle this in the future'\n },\n scope: {\n type: 'string',\n enum: ['project', 'global'],\n description: 'Whether this correction applies to this project only or all projects (default: project)'\n }\n },\n required: ['projectId', 'originalReasoning', 'userCorrection']\n }\n },\n {\n name: 'get_learned_instructions',\n description: `Fetch all learned behaviors and corrections from the database.\nUse this to inject prior corrections into your context window.\nReturns both user-specific and global Rigstate standards.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'Optional project ID to include project-specific instructions'\n }\n },\n required: []\n }\n },\n {\n name: 'generate_professional_pdf',\n description: `Requests \"The Scribe\" to generate a professional PDF report.\nTranslates technical data into high-value briefings.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n reportType: {\n type: 'string',\n enum: ['SYSTEM_MANIFEST', 'INVESTOR_REPORT'],\n description: 'The type of report to generate'\n }\n },\n required: ['projectId', 'reportType']\n }\n },\n // =========================================================================\n // BRYNJAR - THE LIBRARIAN (Archaeological Tools)\n // =========================================================================\n {\n name: 'archaeological_scan',\n description: `Invokes Brynjar, the Project Archivist, to perform an archaeological scan.\nAnalyzes Git history and file structure to reconstruct a project's historical context.\nReturns discovered \"Ghost Features\" that represent completed work not yet in the roadmap.\nUse this for projects that feel like \"empty shells\" to restore their history.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n gitLog: {\n type: 'string',\n description: 'Git log output. Format each commit as: hash:X\\\\ndate:X\\\\nauthor:X\\\\nmessage\\\\n---COMMIT---'\n },\n fileTree: {\n type: 'array',\n items: { type: 'string' },\n description: 'Array of file/directory paths in the repository'\n }\n },\n required: ['projectId', 'gitLog', 'fileTree']\n }\n },\n {\n name: 'import_ghost_features',\n description: `Imports discovered Ghost Features into the roadmap as COMPLETED chunks.\nUse this after reviewing the archaeological_scan results to add historical features to the project.\nAll imported features are marked with is_ghost=true and appear with green checkmarks.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n features: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n title: { type: 'string' },\n description: { type: 'string' },\n status: { type: 'string', enum: ['COMPLETED'] },\n source: { type: 'string', enum: ['git', 'filesystem', 'combined'] },\n evidence: { type: 'array', items: { type: 'string' } },\n estimatedCompletionDate: { type: 'string' },\n priority: { type: 'number' }\n }\n },\n description: 'Array of discovered features from archaeological_scan to import'\n }\n },\n required: ['projectId', 'features']\n }\n },\n // =========================================================================\n // STRUCTURAL SHIELD (EINAR & SVEN)\n // =========================================================================\n {\n name: 'analyze_dependency_graph',\n description: `Analyzes the project source code to build a dependency graph and detect circular dependencies.\nReturns a report on architectural violations that must be fixed.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n path: {\n type: 'string',\n description: 'Root path to analyze (default: src)'\n }\n },\n required: []\n }\n },\n {\n name: 'audit_rls_status',\n description: `Audits the database tables to verify Row Level Security (RLS) is enabled.\nReturns a list of unsecured tables that pose a security risk.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project (optional context)'\n }\n },\n required: []\n }\n },\n // =========================================================================\n // INTELLIGENCE CORE (MAJA & ASTRID)\n // =========================================================================\n {\n name: 'query_project_brain',\n description: `Maja's Tool: Searches the project brain for context, ADRs, and decisions.\nSupports simple text search across content and history. Use to answer \"Why\".`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n query: {\n type: 'string',\n description: 'Search terms'\n },\n limit: {\n type: 'number',\n description: 'Max results (default 5)'\n }\n },\n required: ['projectId', 'query']\n }\n },\n {\n name: 'fetch_package_health',\n description: `Astrid's Tool: Evaluates an NPM package's health and maturity.\nReturns a scorecard including downloads, maintenance status, and recommended usage.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n packageName: {\n type: 'string',\n description: 'The NPM package name (e.g. \"react\")'\n }\n },\n required: ['packageName']\n }\n },\n // =========================================================================\n // ACTIVE MEMORY & PLANNING (MAJA & KINE)\n // =========================================================================\n {\n name: 'save_to_project_brain',\n description: `Maja's Tool: Persists architectural decisions (ADRs) and important notes.\nUse when the user makes a decision or you learn something critical.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n title: {\n type: 'string',\n description: 'Title of the memory/decision'\n },\n content: {\n type: 'string',\n description: 'Full content/markdown'\n },\n category: {\n type: 'string',\n enum: ['DECISION', 'ARCHITECTURE', 'NOTE', 'LESSON_LEARNED'],\n description: 'Category (default: NOTE)'\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n description: 'Tags for searching'\n }\n },\n required: ['projectId', 'title', 'content']\n }\n },\n {\n name: 'update_roadmap_status',\n description: `Kine's Tool: Updates the status of a roadmap task.\nUse when a task moves from TODO -> IN_PROGRESS -> COMPLETED.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n chunkId: {\n type: 'string',\n description: 'The ID of the roadmap chunk'\n },\n status: {\n type: 'string',\n enum: ['TODO', 'IN_PROGRESS', 'COMPLETED'],\n description: 'New status'\n }\n },\n required: ['projectId', 'chunkId', 'status']\n }\n },\n {\n name: 'add_roadmap_chunk',\n description: `Kine's Tool: Decomposes features into smaller roadmap steps.\nUse when a high-level goal needs to be broken down into actionable tasks.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n title: {\n type: 'string',\n description: 'Task title'\n },\n description: {\n type: 'string',\n description: 'Optional details'\n },\n featureId: {\n type: 'string',\n description: 'Optional context (Sprint focus)'\n },\n priority: {\n type: 'string',\n enum: ['LOW', 'MEDIUM', 'HIGH'],\n description: 'Priority (default: MEDIUM)'\n }\n },\n required: ['projectId', 'title']\n }\n },\n // =========================================================================\n // UI/UX & RESEARCH (LINUS & ASTRID)\n // =========================================================================\n {\n name: 'analyze_ui_component',\n description: `Linus's Tool: Analyzes a UI file for design flaws, accessibility issues, and hardcoded values.\nReturns a checklist of recommended fixes.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n filePath: { type: 'string', description: 'Absolute path to the file' }\n },\n required: ['filePath']\n }\n },\n {\n name: 'apply_design_system',\n description: `Linus's Tool: Automatically enforces design tokens by replacing hardcoded values.\nUse to cleanup 'dirty' code (e.g. text-[#000] -> text-foreground).`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n filePath: { type: 'string', description: 'Absolute path to the file' }\n },\n required: ['filePath']\n }\n },\n {\n name: 'fetch_ui_library_docs',\n description: `Astrid's Tool: Fetches reference code for a UI component (e.g. Shadcn/UI).\nUse this to see how a Button or Card is implemented locally before suggesting changes.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n componentName: { type: 'string', description: 'e.g. \"button\", \"card\"' },\n library: { type: 'string', enum: ['shadcn', 'lucide'], default: 'shadcn' }\n },\n required: ['componentName']\n }\n },\n // =========================================================================\n // PENDING TASKS (IDE Integration)\n // =========================================================================\n {\n name: 'get_pending_tasks',\n description: `Fetches tasks that have been APPROVED by the user in the dashboard and are ready for execution.\nUse this to poll for work that the user wants you to perform. Returns objective, technical context, and constraints.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n }\n },\n required: ['projectId']\n }\n },\n {\n name: 'update_task_status',\n description: `Updates the status of a pending task. Use EXECUTING when starting work, COMPLETED when done.\nIMPORTANT: execution_summary is REQUIRED when setting status to COMPLETED.`,\n inputSchema: {\n type: 'object' as const,\n properties: {\n projectId: {\n type: 'string',\n description: 'The UUID of the Rigstate project'\n },\n taskId: {\n type: 'string',\n description: 'The UUID of the task to update (from get_pending_tasks)'\n },\n status: {\n type: 'string',\n enum: ['EXECUTING', 'COMPLETED', 'FAILED'],\n description: 'New status: EXECUTING (starting), COMPLETED (done), or FAILED (error)'\n },\n executionSummary: {\n type: 'string',\n description: 'Summary of actions taken. REQUIRED when status is COMPLETED.'\n }\n },\n required: ['projectId', 'taskId', 'status']\n }\n }\n];\n\n\n// =============================================================================\n// RESOURCES (LOCAL FILES)\n// =============================================================================\n\nconst RESOURCES = [\n {\n uri: 'rigstate://project_morals',\n name: 'project_morals',\n description: 'Local project rules and standards from .rigstate/rules.md or similar files',\n mimeType: 'text/markdown'\n }\n];\n\n// =============================================================================\n// SERVER IMPLEMENTATION\n// =============================================================================\n\nasync function validateWorkerKey(): Promise<boolean> {\n try {\n const rootKey = await fs.readFile(path.join(process.cwd(), 'worker.key'), 'utf-8').catch(() => null);\n if (rootKey && rootKey.trim().length > 0) return true;\n\n const globalPath = path.join(os.homedir(), '.rigstate', 'auth.json');\n const globalContent = await fs.readFile(globalPath, 'utf-8').catch(() => null);\n if (globalContent) {\n const auth = JSON.parse(globalContent);\n if (auth.worker_token) return true;\n }\n } catch (e) { }\n return false;\n}\n\nasync function fetchGovernancePolicy(apiUrl: string, apiKey: string, projectId: string) {\n try {\n const response = await fetch(`${apiUrl}/api/agent/policy?project_id=${projectId}&agent_name=frank`, {\n headers: { 'Authorization': `Bearer ${apiKey}` }\n });\n if (response.ok) return await response.json();\n } catch (e) { }\n return null;\n}\n\nasync function main() {\n // Validate API key on startup\n const apiKey = process.env.RIGSTATE_API_KEY;\n\n if (!apiKey) {\n console.error('❌ Error: RIGSTATE_API_KEY environment variable is required.');\n console.error('');\n console.error('Get your API key from: https://rigstate.dev/settings/api-keys');\n console.error('Then set it: RIGSTATE_API_KEY=sk_rigstate_xxx npx @rigstate/mcp');\n process.exit(1);\n }\n\n // Governance Check (Rigstate v2.8)\n const manifestPath = path.join(process.cwd(), '.rigstate');\n const manifestContent = await fs.readFile(manifestPath, 'utf-8').catch(() => null);\n if (manifestContent) {\n try {\n const manifest = JSON.parse(manifestContent);\n if (manifest.project_id && manifest.api_url) {\n console.error(`🔒 Governance: Fetching policy for Project ${manifest.project_id}...`);\n const policy: any = await fetchGovernancePolicy(manifest.api_url, apiKey, manifest.project_id);\n if (policy) {\n if (policy.allow_file_write === false) {\n process.env.RIGSTATE_GOVERNANCE_WRITE = 'FALSE';\n console.error(`🔒 Governance: Write Access DISABLED via Cloud Policy.`);\n } else {\n process.env.RIGSTATE_GOVERNANCE_WRITE = 'TRUE';\n console.error(`🔓 Governance: Write Access Enabled (Subject to Zero-Trust Key).`);\n }\n }\n }\n } catch (e) { }\n }\n\n // Authenticate\n const authResult = await authenticateApiKey(apiKey);\n\n if (!authResult.success || !authResult.context) {\n console.error(`❌ Authentication failed: ${authResult.error}`);\n process.exit(1);\n }\n\n const authContext: AuthContext = authResult.context;\n\n // Start Frank Watcher (Auto-Agent)\n startFrankWatcher(authContext.supabase, authContext.userId);\n\n // Create MCP server\n const server = new Server(\n {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n }\n );\n\n // Handle list_tools request\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n ...TOOLS,\n ...registry.getTools()\n ]\n };\n });\n\n // Handle list_resources request\n server.setRequestHandler(ListResourcesRequestSchema, async () => {\n return { resources: RESOURCES };\n });\n\n // Handle read_resource request\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n\n if (uri === 'rigstate://project_morals') {\n const morals = getProjectMorals();\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: morals.formatted\n }\n ]\n };\n }\n\n throw new McpError(ErrorCode.InvalidParams, `Unknown resource: ${uri}`);\n });\n\n // Handle call_tool request\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n try {\n const { name } = request.params;\n const args = request.params.arguments as any;\n\n // 0. Check Migration Registry\n // If tool exists in registry, it runs. If arguments invalid, it throws (good).\n try {\n return await registry.callTool(name, args, {\n supabase: authContext.supabase,\n userId: authContext.userId\n });\n } catch (e: any) {\n if (e.message && e.message.includes(`Tool '${name}' not found`)) {\n // Tool not in registry, proceed to legacy switch\n } else {\n // Tool was in registry but failed (e.g. validation or runtime error)\n throw new McpError(ErrorCode.InvalidParams, e.message);\n }\n }\n\n // GUARDIAN LOCK & WORKER AUTH\n const WRITE_TOOLS = [\n 'write_to_file', 'replace_file_content', 'run_command',\n 'save_decision', 'submit_idea', 'update_roadmap',\n 'save_to_project_brain', 'add_roadmap_chunk',\n 'update_roadmap_status', 'update_task_status'\n ];\n\n if (WRITE_TOOLS.includes(name)) {\n // Governance Policy Check (Rigstate v2.8)\n if (process.env.RIGSTATE_GOVERNANCE_WRITE === 'FALSE') {\n throw new McpError(ErrorCode.InvalidParams, '[GOVERNANCE_BLOCK]: Write access disabled via Rigstate Cloud.');\n }\n\n // Universal Zero-Trust Lock (Rigstate v2.7)\n const isWorker = await validateWorkerKey();\n\n if (!isWorker) {\n throw new McpError(ErrorCode.InvalidParams, '[RIGSTATE_SECURITY_BLOCK]: Unauthorized attempt. No active Worker context detected.');\n }\n }\n\n switch (name) {\n case 'get_project_context': {\n const parsed = GetProjectContextInputSchema.parse(args);\n const result = await getProjectContext(\n authContext.supabase,\n authContext.userId,\n parsed.projectId\n );\n return {\n content: [\n {\n type: 'text',\n text: result.summary\n }\n ]\n };\n }\n\n case 'query_brain': {\n const parsed = QueryBrainInputSchema.parse(args);\n const result = await queryBrain(\n authContext.supabase,\n authContext.userId,\n parsed.projectId,\n parsed.query,\n parsed.limit,\n parsed.threshold\n );\n return {\n content: [\n {\n type: 'text',\n text: result.formatted\n }\n ]\n };\n }\n\n case 'get_latest_decisions': {\n const parsed = GetLatestDecisionsInputSchema.parse(args);\n const result = await getLatestDecisions(\n authContext.supabase,\n authContext.userId,\n parsed.projectId,\n parsed.limit\n );\n return {\n content: [\n {\n type: 'text',\n text: result.summary\n }\n ]\n };\n }\n\n case 'list_roadmap_tasks': {\n const parsed = ListRoadmapTasksInputSchema.parse(args);\n const result = await listRoadmapTasks(\n authContext.supabase,\n authContext.userId,\n parsed.projectId\n );\n return {\n content: [\n {\n type: 'text',\n text: result.formatted\n }\n ]\n };\n }\n\n\n case 'check_agent_bridge': {\n const parsed = CheckAgentBridgeInputSchema.parse(args);\n const result = await checkAgentBridge(\n authContext.supabase,\n parsed.projectId,\n parsed.action,\n parsed.bridgeId,\n parsed.status,\n parsed.summary,\n parsed.proposal,\n // @ts-ignore - execution_summary is a new optional prop\n parsed.execution_summary\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n\n case 'check_rules_sync': {\n const parsed = CheckRulesSyncInputSchema.parse(args);\n const result = await checkRulesSync(\n authContext.supabase,\n parsed.projectId,\n parsed.currentRulesContent\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n case 'get_next_roadmap_step': {\n const parsed = GetNextRoadmapStepInputSchema.parse(args);\n const result = await getNextRoadmapStep(\n authContext.supabase,\n parsed.projectId,\n parsed.currentStepId\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n case 'complete_roadmap_task': {\n const args = request.params.arguments as any;\n if (!args.projectId || !args.summary) {\n throw new Error('projectId and summary are required');\n }\n const result = await completeRoadmapTask(\n authContext.supabase,\n args.projectId,\n args.summary,\n args.taskId,\n args.gitDiff\n );\n return {\n content: [{\n type: 'text',\n text: result.message\n }]\n };\n }\n\n case 'generate_professional_pdf': {\n const parsed = GenerateProfessionalPDFInputSchema.parse(args);\n const result = await generateProfessionalPdf(\n authContext.supabase,\n authContext.userId,\n parsed.projectId,\n parsed.reportType as any\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n case 'get_agent_status': {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(watcherState, null, 2)\n }\n ]\n };\n }\n\n // =============================================================\n // BRYNJAR - THE LIBRARIAN (Archaeological Operations)\n // =============================================================\n\n case 'archaeological_scan': {\n const parsed = ArchaeologicalScanInputSchema.parse(args);\n const result = await performArchaeologicalScan(\n authContext.supabase,\n parsed.projectId,\n parsed.gitLog,\n parsed.fileTree\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n case 'import_ghost_features': {\n const parsed = ImportGhostFeaturesInputSchema.parse(args);\n const result = await importGhostFeatures(\n authContext.supabase,\n parsed.projectId,\n parsed.features\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n // =============================================================\n // WRITE OPERATIONS (DEPRECATED - READ ONLY MODE)\n // =============================================================\n\n case 'save_decision': {\n return {\n content: [{\n type: 'text',\n text: '🚫 [READ-ONLY MODE] save_decision is deprecated in MCP. Please use the Rigstate Dashboard to record decisions.'\n }],\n isError: true\n };\n }\n\n case 'submit_idea': {\n return {\n content: [{\n type: 'text',\n text: '🚫 [READ-ONLY MODE] submit_idea is deprecated in MCP. Please use the Rigstate Dashboard (Idea Lab) to submit new ideas.'\n }],\n isError: true\n };\n }\n\n case 'update_roadmap': {\n return {\n content: [{\n type: 'text',\n text: '🚫 [READ-ONLY MODE] update_roadmap is deprecated in MCP. Use the Rigstate CLI (\"rigstate sync\") or the Dashboard to update tasks.'\n }],\n isError: true\n };\n }\n\n case 'run_architecture_audit': {\n return {\n content: [{\n type: 'text',\n text: '🚫 [READ-ONLY MODE] run_architecture_audit in MCP is deprecated. Use the Rigstate CLI command \"rigstate check\" for deterministic architectural validation.'\n }],\n isError: true\n };\n }\n\n // =============================================================\n // TEACHER MODE TOOLS\n // =============================================================\n\n case 'refine_logic': {\n const parsed = RefineLogicInputSchema.parse(args);\n const result = await refineLogic(\n authContext.supabase,\n authContext.userId,\n parsed.projectId,\n parsed.originalReasoning,\n parsed.userCorrection,\n parsed.scope || 'project'\n );\n return {\n content: [\n {\n type: 'text',\n text: `${result.message}\\n\\nTrace ID: ${result.traceId}`\n }\n ]\n };\n }\n\n case 'get_learned_instructions': {\n const parsed = GetLearnedInstructionsInputSchema.parse(args);\n const result = await getLearnedInstructions(\n authContext.supabase,\n authContext.userId,\n parsed.projectId\n );\n return {\n content: [\n {\n type: 'text',\n text: result.formatted\n }\n ]\n };\n }\n\n case 'sync_ide_rules': {\n const { projectId } = GenerateCursorRulesInputSchema.parse(request.params.arguments);\n const result = await syncIdeRules(authContext.supabase, projectId);\n return {\n content: [{\n type: 'text',\n text: `FileName: ${result.fileName}\\n\\nContent:\\n${result.content}`\n }]\n };\n }\n\n default:\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown tool: ${name}`\n );\n\n // =============================================================\n // STRUCTURAL SHIELD (EINAR & SVEN)\n // =============================================================\n\n case 'analyze_dependency_graph': {\n const parsed = AnalyzeDependencyGraphInputSchema.parse(args);\n const result = await analyzeDependencyGraph(parsed);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n case 'audit_rls_status': {\n const parsed = AuditRlsStatusInputSchema.parse(args);\n const result = await auditRlsStatus(authContext.supabase, parsed);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n // =============================================================\n // INTELLIGENCE CORE (MAJA & ASTRID)\n // =============================================================\n\n case 'query_project_brain': {\n const parsed = QueryProjectBrainInputSchema.parse(args);\n const result = await queryProjectBrain(\n authContext.supabase,\n authContext.userId,\n parsed\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n case 'fetch_package_health': {\n const parsed = FetchPackageHealthInputSchema.parse(args);\n const result = await fetchPackageHealth(parsed);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n // =============================================================\n // ACTIVE MEMORY & PLANNING (MAJA & KINE)\n // =============================================================\n\n case 'save_to_project_brain':\n case 'update_roadmap_status':\n case 'add_roadmap_chunk': {\n return {\n content: [{\n type: 'text',\n text: '🚫 [READ-ONLY MODE] Planning and active memory writes are deprecated in MCP. Use the Rigstate CLI or Dashboard.'\n }],\n isError: true\n };\n }\n\n // =============================================================\n // UI/UX & RESEARCH (LINUS & ASTRID)\n // =============================================================\n\n case 'analyze_ui_component': {\n const parsed = AnalyzeUiComponentInputSchema.parse(args);\n const result = await analyzeUiComponent(parsed);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n case 'apply_design_system': {\n const parsed = ApplyDesignSystemInputSchema.parse(args);\n const result = await applyDesignSystem(parsed);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n case 'fetch_ui_library_docs': {\n const parsed = FetchUiLibraryDocsInputSchema.parse(args);\n const result = await fetchUiLibraryDocs(parsed);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n // =========================================================\n // PENDING TASKS (IDE Integration)\n // =========================================================\n case 'get_pending_tasks': {\n const parsed = GetPendingTasksInputSchema.parse(args);\n const result = await getPendingTasks(\n authContext.supabase,\n parsed.projectId\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n\n case 'update_task_status': {\n const parsed = UpdateTaskStatusInputSchema.parse(args);\n const result = await updateTaskStatus(\n authContext.supabase,\n parsed.projectId,\n parsed.taskId,\n parsed.status,\n parsed.executionSummary\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n }\n } catch (error: any) {\n // Handle Zod validation errors\n if (error.name === 'ZodError') {\n throw new McpError(\n ErrorCode.InvalidParams,\n `Invalid parameters: ${error.errors.map((e: any) => e.message).join(', ')}`\n );\n }\n\n // Handle access denied errors\n if (error.message?.includes('access denied') || error.message?.includes('not found')) {\n throw new McpError(\n ErrorCode.InvalidParams,\n error.message\n );\n }\n\n // Handle database constraint errors (write operations)\n if (error.message?.includes('Permission denied') ||\n error.message?.includes('constraint') ||\n error.message?.includes('already exists')) {\n throw new McpError(\n ErrorCode.InvalidParams,\n `Write operation failed: ${error.message}`\n );\n }\n\n // Handle write operation specific errors\n if (error.message?.includes('Failed to')) {\n throw new McpError(\n ErrorCode.InternalError,\n error.message\n );\n }\n\n // Re-throw MCP errors as-is\n if (error instanceof McpError) {\n throw error;\n }\n\n // Re-throw other errors\n throw new McpError(\n ErrorCode.InternalError,\n error.message || 'An unexpected error occurred'\n );\n }\n });\n\n // Start server with stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n // Log to stderr so it doesn't interfere with MCP protocol\n console.error(`✅ Rigstate MCP Server v${SERVER_VERSION} started`);\n console.error(` User ID: ${authContext.userId}`);\n console.error(` Mode: Read-Only (write ops deprecated)`);\n\n // DEPRECATED: Frank Watcher is now handled by CLI daemon\n // Use \"rigstate daemon\" for background task processing\n // startFrankWatcher(authContext.supabase, authContext.userId);\n}\n\n// Run the server\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n\n","/**\n * Rigstate MCP Server - Supabase Client\n * \n * Creates a Supabase client for MCP server operations.\n * Uses the RIGSTATE_API_KEY to authenticate and determine the user context.\n * \n * Required Environment Variables:\n * - RIGSTATE_API_KEY: Your API key from https://rigstate.dev/settings/api-keys\n * \n * Optional Environment Variables (defaults to production Rigstate):\n * - RIGSTATE_SUPABASE_URL: Override Supabase URL\n * - RIGSTATE_SUPABASE_ANON_KEY: Override Supabase anon key\n */\n\nimport { createClient as createSupabaseClient, SupabaseClient } from '@supabase/supabase-js';\nimport { createHash } from 'crypto';\n\n// Production Rigstate configuration\nconst PRODUCTION_SUPABASE_URL = 'https://gseblsxnfppsxbmtzcfj.supabase.co';\nconst PRODUCTION_SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImdzZWJsc3huZnBwc3hibXR6Y2ZqIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MzYxODIxNjgsImV4cCI6MjA1MTc1ODE2OH0.bltFf6_gNH-p3jH8lRY8dCRK6fmgxO8Hjp7UGx8xSxY';\nconst PRODUCTION_SUPABASE_SERVICE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY || '';\n\n// Environment configuration\n// Priority: Explicit MCP env > Next.js env > Production defaults\nconst SUPABASE_URL =\n process.env.RIGSTATE_SUPABASE_URL ||\n process.env.NEXT_PUBLIC_SUPABASE_URL ||\n PRODUCTION_SUPABASE_URL;\n\nconst SUPABASE_ANON_KEY =\n process.env.RIGSTATE_SUPABASE_ANON_KEY ||\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY ||\n PRODUCTION_SUPABASE_ANON_KEY;\n\nconst SUPABASE_SERVICE_KEY =\n process.env.RIGSTATE_SUPABASE_SERVICE_KEY ||\n process.env.SUPABASE_SERVICE_ROLE_KEY ||\n PRODUCTION_SUPABASE_SERVICE_KEY;\n\n\nexport interface AuthContext {\n userId: string;\n apiKeyId: string;\n supabase: SupabaseClient;\n}\n\n/**\n * Validates the RIGSTATE_API_KEY and returns the authenticated user context.\n * \n * CRITICAL: API keys are stored as SHA-256 hashes in the database.\n * We must hash the incoming key before lookup.\n */\nexport async function authenticateApiKey(apiKey: string): Promise<{\n success: boolean;\n error?: string;\n context?: AuthContext;\n}> {\n if (!apiKey) {\n return { success: false, error: 'RIGSTATE_API_KEY is required' };\n }\n\n if (!apiKey.startsWith('sk_rigstate_')) {\n return { success: false, error: 'Invalid API key format. Expected sk_rigstate_...' };\n }\n\n if (!SUPABASE_URL || !SUPABASE_ANON_KEY) {\n return {\n success: false,\n error: 'Supabase configuration missing. Set RIGSTATE_SUPABASE_URL and RIGSTATE_SUPABASE_ANON_KEY.'\n };\n }\n\n // Hash the API key with SHA-256 (same as web app)\n const hashedKey = createHash('sha256').update(apiKey).digest('hex');\n\n // Use service key if available to bypass RLS, otherwise anon key\n const clientKey = SUPABASE_SERVICE_KEY || SUPABASE_ANON_KEY;\n const supabase = createSupabaseClient(SUPABASE_URL, clientKey);\n\n // Look up the API key by HASH (not plain text!)\n const { data: keyData, error: keyError } = await supabase\n .from('api_keys')\n .select('id, user_id, project_id, organization_id, scope')\n .eq('key_hash', hashedKey)\n .single();\n\n if (keyError || !keyData) {\n return { success: false, error: 'Invalid or revoked API key' };\n }\n\n // Update last_used_at timestamp (fire and forget)\n supabase\n .from('api_keys')\n .update({ last_used_at: new Date().toISOString() })\n .eq('id', keyData.id)\n .then();\n\n // Create a user-scoped client for subsequent operations\n const userSupabase = createSupabaseClient(SUPABASE_URL, SUPABASE_ANON_KEY);\n\n return {\n success: true,\n context: {\n userId: keyData.user_id,\n apiKeyId: keyData.id,\n supabase: userSupabase\n }\n };\n}\n\n/**\n * Creates a Supabase client using environment variables.\n * For use after authentication has been established.\n */\nexport function createClient(): SupabaseClient {\n if (!SUPABASE_URL || !SUPABASE_ANON_KEY) {\n throw new Error('Supabase configuration missing. Set RIGSTATE_SUPABASE_URL and RIGSTATE_SUPABASE_ANON_KEY.');\n }\n return createSupabaseClient(SUPABASE_URL, SUPABASE_ANON_KEY);\n}\n","/**\n * Rigstate MCP Server - Types\n * \n * Shared type definitions for the MCP server tools.\n */\n\nimport { z } from 'zod';\n\n// =============================================================================\n// PROJECT CONTEXT TYPES\n// =============================================================================\n\nexport interface ProjectInfo {\n id: string;\n name: string;\n description: string | null;\n projectType: string | null;\n createdAt: string;\n lastIndexedAt: string | null;\n}\n\nexport interface TechStackInfo {\n framework: string | null;\n orm: string | null;\n database: string | null;\n keyLibraries: string[];\n topFolders: string[];\n}\n\nexport interface ProjectContextResponse {\n project: ProjectInfo;\n techStack: TechStackInfo;\n summary: string;\n}\n\n// =============================================================================\n// BRAIN/MEMORY TYPES\n// =============================================================================\n\nexport interface MemoryRecord {\n id: string;\n content: string;\n category: string;\n tags: string[];\n similarity?: number;\n netVotes?: number;\n createdAt: string;\n}\n\nexport interface BrainQueryResponse {\n query: string;\n memories: MemoryRecord[];\n formatted: string;\n}\n\n// =============================================================================\n// COUNCIL/DECISIONS TYPES\n// =============================================================================\n\nexport interface CouncilSession {\n id: string;\n projectId: string;\n recruitedAgents: string[];\n feedbackSummary: Array<{\n agentName: string;\n emoji: string;\n critiques: string[];\n approved: boolean;\n }>;\n durationMs: number | null;\n sprintsCount: number | null;\n tasksCount: number | null;\n createdAt: string;\n}\n\nexport interface RoadmapStep {\n id: string;\n stepNumber: number;\n title: string;\n status: string;\n sprintFocus: string | null;\n}\n\nexport interface DecisionsResponse {\n sessions: CouncilSession[];\n activeRoadmapStep: RoadmapStep | null;\n summary: string;\n}\n\n// =============================================================================\n// ZOD SCHEMAS FOR TOOL INPUTS\n// =============================================================================\n\nexport const QueryBrainInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n query: z.string().min(1, 'Query is required'),\n limit: z.number().min(1).max(20).optional().default(8),\n threshold: z.number().min(0).max(1).optional().default(0.5)\n});\n\nexport const GetProjectContextInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID')\n});\n\nexport const GetLatestDecisionsInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n limit: z.number().min(1).max(10).optional().default(5)\n});\n\n// =============================================================================\n// WRITE OPERATION SCHEMAS\n// =============================================================================\n\nexport const SaveDecisionInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n title: z.string().min(1, 'Title is required').max(200, 'Title too long'),\n decision: z.string().min(1, 'Decision content is required'),\n rationale: z.string().optional(),\n category: z.enum(['decision', 'architecture', 'constraint', 'tech_stack', 'design_rule']).optional().default('decision'),\n tags: z.array(z.string()).optional().default([])\n});\n\nexport const SubmitIdeaInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n title: z.string().min(1, 'Title is required').max(200, 'Title too long'),\n description: z.string().min(1, 'Description is required'),\n category: z.enum(['feature', 'improvement', 'experiment', 'pivot']).optional().default('feature'),\n tags: z.array(z.string()).optional().default([])\n});\n\nexport const UpdateRoadmapInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n chunkId: z.string().uuid('Invalid chunk ID').optional(),\n title: z.string().optional(),\n status: z.enum(['LOCKED', 'ACTIVE', 'COMPLETED'])\n});\n\nexport const RunArchitectureAuditInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n filePath: z.string().min(1, 'File path is required'),\n content: z.string().min(1, 'Content is required')\n});\n\nexport const ListRoadmapTasksInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID')\n});\n\n\n\n// =============================================================================\n// TEACHER MODE SCHEMAS\n// =============================================================================\n\nexport const RefineLogicInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n originalReasoning: z.string().min(1, 'Original reasoning is required'),\n userCorrection: z.string().min(1, 'User correction is required'),\n scope: z.enum(['project', 'global']).optional().default('project')\n});\n\nexport const GetLearnedInstructionsInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID').optional()\n});\n\n// =============================================================================\n// RESPONSE TYPES\n// =============================================================================\n\nexport interface SaveDecisionResponse {\n success: boolean;\n memoryId: string;\n message: string;\n}\n\nexport interface SubmitIdeaResponse {\n success: boolean;\n ideaId: string;\n message: string;\n}\n\nexport interface UpdateRoadmapResponse {\n success: boolean;\n chunkId: string;\n previousStatus: string;\n newStatus: string;\n message: string;\n}\n\nexport interface AuditViolation {\n type: string;\n severity: 'LOW' | 'MEDIUM' | 'HIGH';\n title: string;\n description: string;\n lineNumber?: number;\n recommendation: string;\n}\n\nexport interface ArchitectureAuditResponse {\n passed: boolean;\n score: number;\n violations: AuditViolation[];\n summary: string;\n}\n\nexport type QueryBrainInput = z.infer<typeof QueryBrainInputSchema>;\nexport type GetProjectContextInput = z.infer<typeof GetProjectContextInputSchema>;\nexport type GetLatestDecisionsInput = z.infer<typeof GetLatestDecisionsInputSchema>;\nexport type SaveDecisionInput = z.infer<typeof SaveDecisionInputSchema>;\nexport type SubmitIdeaInput = z.infer<typeof SubmitIdeaInputSchema>;\nexport type UpdateRoadmapInput = z.infer<typeof UpdateRoadmapInputSchema>;\nexport type RunArchitectureAuditInput = z.infer<typeof RunArchitectureAuditInputSchema>;\nexport type ListRoadmapTasksInput = z.infer<typeof ListRoadmapTasksInputSchema>;\n\n\nexport interface ListRoadmapTasksResponse {\n tasks: Array<{\n id: string;\n title: string;\n priority: string;\n status: string;\n step_number?: number;\n }>;\n formatted: string;\n}\n\n\nexport const CheckAgentBridgeInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n action: z.enum(['check', 'update', 'submit_for_review']).optional().default('check'),\n bridgeId: z.string().uuid('Invalid bridge ID').optional(),\n status: z.enum(['PENDING', 'NEEDS_REVIEW', 'AWAITING_APPROVAL', 'APPROVED', 'REJECTED', 'EXECUTING', 'COMPLETED', 'FAILED']).optional(),\n summary: z.string().optional(),\n execution_summary: z.string().optional(),\n proposal: z.string().optional()\n});\n\nexport const CheckRulesSyncInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n currentRulesContent: z.string().optional() // Provide content to check, or tool tries to read file\n});\n\nexport type CheckAgentBridgeInput = z.infer<typeof CheckAgentBridgeInputSchema>;\n\nexport interface AgentBridgeTask {\n id: string;\n project_id: string;\n task_id: string;\n status: string;\n summary: string | null;\n execution_summary: string | null;\n proposal: string | null;\n created_at: string;\n completed_at: string | null;\n task_title?: string;\n task_description?: string;\n task_content?: string;\n}\n\nexport interface CheckAgentBridgeResponse {\n success: boolean;\n task?: AgentBridgeTask;\n message: string;\n}\n\nexport interface CheckRulesSyncResponse {\n synced: boolean;\n message: string;\n shouldTriggerSync: boolean;\n missingBlock?: boolean;\n offlineMode?: boolean;\n}\n\nexport interface RoadmapChunk {\n id: string;\n project_id: string;\n title: string;\n description: string | null;\n status: string;\n priority: string;\n step_number: number;\n prompt_content?: string;\n}\n\n// =============================================================================\n// PENDING TASKS SCHEMAS (get_pending_tasks & update_task_status)\n// =============================================================================\n\nexport const GetPendingTasksInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID')\n});\n\nexport const UpdateTaskStatusInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n taskId: z.string().uuid('Invalid task ID'),\n status: z.enum(['EXECUTING', 'COMPLETED', 'FAILED']),\n executionSummary: z.string().optional()\n});\n\nexport type GetPendingTasksInput = z.infer<typeof GetPendingTasksInputSchema>;\nexport type UpdateTaskStatusInput = z.infer<typeof UpdateTaskStatusInputSchema>;\n\nexport const GetNextRoadmapStepInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n currentStepId: z.string().uuid('Invalid step ID').optional()\n});\n\nexport const GenerateProfessionalPDFInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n reportType: z.enum(['SYSTEM_MANIFEST', 'INVESTOR_REPORT'])\n});\n\nexport const ArchaeologicalScanInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n gitLog: z.string().describe('Git log output in format: hash:X\\\\ndate:X\\\\nauthor:X\\\\nmessage\\\\n---COMMIT---\\\\n...'),\n fileTree: z.array(z.string()).describe('Array of file/directory paths in the repository')\n});\n\nexport const ImportGhostFeaturesInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n features: z.array(z.object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n status: z.literal('COMPLETED'),\n source: z.enum(['git', 'filesystem', 'combined']),\n evidence: z.array(z.string()),\n estimatedCompletionDate: z.string(),\n priority: z.number()\n }))\n});\n\n// =============================================================================\n// STRUCTURAL SHIELD (EINAR & SVEN)\n// =============================================================================\n\nexport const AnalyzeDependencyGraphInputSchema = z.object({\n path: z.string().min(1, 'Path is required').default('src')\n});\n\nexport const AuditRlsStatusInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID').optional()\n});\n\nexport type AnalyzeDependencyGraphInput = z.infer<typeof AnalyzeDependencyGraphInputSchema>;\nexport type AuditRlsStatusInput = z.infer<typeof AuditRlsStatusInputSchema>;\n\n// =============================================================================\n// INTELLIGENCE CORE (MAJA & ASTRID)\n// =============================================================================\n\nexport const QueryProjectBrainInputSchema = QueryBrainInputSchema; // Reuse existing structure\n\nexport const FetchPackageHealthInputSchema = z.object({\n packageName: z.string().min(1, 'Package name is required')\n});\n\nexport type QueryProjectBrainInput = z.infer<typeof QueryProjectBrainInputSchema>;\nexport type FetchPackageHealthInput = z.infer<typeof FetchPackageHealthInputSchema>;\n\n// =============================================================================\n// ACTIVE MEMORY & PLANNING (MAJA & KINE)\n// =============================================================================\n\nexport const SaveToProjectBrainInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n title: z.string().min(1, 'Title is required'),\n content: z.string().min(1, 'Content is required'),\n category: z.enum(['DECISION', 'ARCHITECTURE', 'NOTE', 'LESSON_LEARNED']).default('NOTE'),\n tags: z.array(z.string()).optional().default([])\n});\n\nexport const UpdateRoadmapStatusInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n chunkId: z.string().uuid('Invalid chunk ID'),\n status: z.enum(['TODO', 'IN_PROGRESS', 'COMPLETED'])\n});\n\nexport const AddRoadmapChunkInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n title: z.string().min(1, 'Title is required'),\n description: z.string().optional(),\n featureId: z.string().optional(),\n priority: z.enum(['LOW', 'MEDIUM', 'HIGH']).default('MEDIUM')\n});\n\nexport type SaveToProjectBrainInput = z.infer<typeof SaveToProjectBrainInputSchema>;\nexport type UpdateRoadmapStatusInput = z.infer<typeof UpdateRoadmapStatusInputSchema>;\nexport type AddRoadmapChunkInput = z.infer<typeof AddRoadmapChunkInputSchema>;\n\n// =============================================================================\n// UI/UX & RESEARCH (LINUS & ASTRID)\n// =============================================================================\n\nexport const AnalyzeUiComponentInputSchema = z.object({\n filePath: z.string().describe('Absolute path to the component file (.tsx, .css)')\n});\n\nexport const ApplyDesignSystemInputSchema = z.object({\n filePath: z.string().describe('Absolute path to the file to fix')\n});\n\nexport const FetchUiLibraryDocsInputSchema = z.object({\n componentName: z.string().describe('Name of the component (e.g. \"button\", \"card\")'),\n library: z.enum(['shadcn', 'lucide']).default('shadcn')\n});\n\nexport type AnalyzeUiComponentInput = z.infer<typeof AnalyzeUiComponentInputSchema>;\nexport type ApplyDesignSystemInput = z.infer<typeof ApplyDesignSystemInputSchema>;\nexport type FetchUiLibraryDocsInput = z.infer<typeof FetchUiLibraryDocsInputSchema>;\n\nexport const GenerateCursorRulesInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID')\n});\n\nexport type GenerateCursorRulesInput = z.infer<typeof GenerateCursorRulesInputSchema>;\n","/**\n * Tool: get_project_context\n * \n * Returns the project type, tech stack, and high-level description.\n * This gives AI editors context about what they're working with.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { ProjectContextResponse, TechStackInfo } from '../lib/types.js';\n\n// Key libraries we care about for display\nconst KEY_LIBS: Record<string, string> = {\n 'next': 'Next.js',\n 'react': 'React',\n 'vue': 'Vue',\n 'svelte': 'Svelte',\n 'angular': 'Angular',\n 'tailwindcss': 'Tailwind',\n 'prisma': 'Prisma',\n 'drizzle-orm': 'Drizzle',\n '@supabase/supabase-js': 'Supabase',\n 'stripe': 'Stripe',\n 'openai': 'OpenAI',\n 'typescript': 'TypeScript',\n 'framer-motion': 'Framer Motion',\n 'zod': 'Zod',\n 'ai': 'Vercel AI',\n};\n\nexport async function getProjectContext(\n supabase: SupabaseClient,\n userId: string,\n projectId: string\n): Promise<ProjectContextResponse> {\n // Fetch project with ownership check\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name, description, project_type, created_at, last_indexed_at, detected_stack, repository_tree')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Fetch Digest Data\n const { data: agentTasks } = await supabase\n .from('agent_bridge')\n .select('id, roadmap_chunks(title), execution_summary, completed_at')\n .eq('project_id', projectId)\n .eq('status', 'COMPLETED')\n .order('completed_at', { ascending: false })\n .limit(3);\n\n const { data: roadmapItems } = await supabase\n .from('roadmap_chunks')\n .select('title, status, updated_at')\n .eq('project_id', projectId)\n .order('updated_at', { ascending: false })\n .limit(3);\n\n // Parse tech stack from detected_stack\n const techStack: TechStackInfo = {\n framework: null,\n orm: null,\n database: null,\n keyLibraries: [],\n topFolders: []\n };\n\n if (project.detected_stack) {\n const stack = project.detected_stack as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const allDeps = { ...stack.dependencies, ...stack.devDependencies };\n\n for (const [name, version] of Object.entries(allDeps)) {\n const cleanVersion = (version as string).replace(/[\\^~]/g, '');\n\n // Categorize\n if (name === 'next' || name === 'react' || name === 'vue' || name === 'angular' || name === 'svelte') {\n if (!techStack.framework) {\n techStack.framework = `${KEY_LIBS[name] || name} ${cleanVersion}`;\n }\n } else if (name.includes('prisma') || name.includes('drizzle') || name.includes('typeorm')) {\n if (!techStack.orm) {\n techStack.orm = `${KEY_LIBS[name] || name} ${cleanVersion}`;\n }\n } else if (KEY_LIBS[name]) {\n techStack.keyLibraries.push(`${KEY_LIBS[name]} ${cleanVersion}`);\n }\n }\n }\n\n // Extract top folders from repository tree\n if (project.repository_tree && Array.isArray(project.repository_tree)) {\n techStack.topFolders = [...new Set(\n project.repository_tree\n .filter((t: any) => t.type === 'tree' && !t.path.includes('/'))\n .map((t: any) => t.path)\n )].slice(0, 10) as string[];\n }\n\n // Build summary\n const summaryParts: string[] = [];\n\n if (project.project_type) {\n summaryParts.push(`Project Type: ${project.project_type.toUpperCase()}`);\n }\n\n if (techStack.framework) {\n summaryParts.push(`Framework: ${techStack.framework}`);\n }\n\n if (techStack.orm) {\n summaryParts.push(`ORM: ${techStack.orm}`);\n }\n\n if (techStack.keyLibraries.length > 0) {\n summaryParts.push(`Key Libraries: ${techStack.keyLibraries.join(', ')}`);\n }\n\n if (techStack.topFolders.length > 0) {\n summaryParts.push(`Top Folders: ${techStack.topFolders.join(', ')}`);\n }\n\n if (project.description) {\n summaryParts.push(`\\nDescription: ${project.description}`);\n }\n\n // Add Digest to Summary\n summaryParts.push('\\n=== RECENT ACTIVITY DIGEST ===');\n\n if (agentTasks && agentTasks.length > 0) {\n summaryParts.push('\\nLatest AI Executions:');\n agentTasks.forEach((t: any) => {\n const time = t.completed_at ? new Date(t.completed_at).toLocaleString() : 'Recently';\n summaryParts.push(`- [${time}] ${t.roadmap_chunks?.title || 'Task'}: ${t.execution_summary || 'Completed'}`);\n });\n }\n\n if (roadmapItems && roadmapItems.length > 0) {\n summaryParts.push('\\nRoadmap Updates:');\n roadmapItems.forEach((i: any) => {\n summaryParts.push(`- ${i.title} is now ${i.status}`);\n });\n }\n\n return {\n project: {\n id: project.id,\n name: project.name,\n description: project.description,\n projectType: project.project_type,\n createdAt: project.created_at,\n lastIndexedAt: project.last_indexed_at\n },\n techStack,\n summary: summaryParts.join('\\n') || 'No project context available.'\n };\n}\n","/**\n * Tool: query_brain\n * \n * Takes a natural language query and performs semantic search\n * against the project's memories (RAG), returning relevant\n * architecture rules, decisions, and constraints.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { BrainQueryResponse, MemoryRecord } from '../lib/types.js';\n\n// Simple embedding generation using text normalization\n// In production, this would call an embedding API like OpenAI\nasync function generateQueryEmbedding(query: string): Promise<number[]> {\n // For MCP server, we'll use the match_memories_text RPC if available,\n // or fall back to keyword-based search.\n // This is a placeholder - the actual embedding should be done via the Supabase edge function\n // or passed through to the main Rigstate API.\n\n // For now, return null to trigger keyword fallback\n return [];\n}\n\nexport async function queryBrain(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n query: string,\n limit: number = 8,\n threshold: number = 0.5\n): Promise<BrainQueryResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Try semantic search first using the match_memories RPC\n // This requires the embedding to be generated, so we'll try\n // a text-based search as fallback\n let memories: MemoryRecord[] = [];\n\n // Attempt keyword-based search using ilike on content\n // This is a simpler approach that works without embeddings\n const searchTerms = query.toLowerCase().split(/\\s+/).filter(t => t.length > 2);\n\n if (searchTerms.length > 0) {\n // Build OR condition for fuzzy matching\n const orConditions = searchTerms.map(term => `content.ilike.%${term}%`).join(',');\n\n const { data: keywordMatches, error: searchError } = await supabase\n .from('project_memories')\n .select('id, content, category, tags, net_votes, created_at')\n .eq('project_id', projectId)\n .eq('is_active', true)\n .or(orConditions)\n .order('net_votes', { ascending: false, nullsFirst: false })\n .limit(limit);\n\n if (!searchError && keywordMatches) {\n memories = keywordMatches.map(m => ({\n id: m.id,\n content: m.content,\n category: m.category || 'general',\n tags: m.tags || [],\n netVotes: m.net_votes,\n createdAt: m.created_at\n }));\n }\n }\n\n // If no keyword matches, fetch recent memories\n if (memories.length === 0) {\n const { data: recentMemories, error: recentError } = await supabase\n .from('project_memories')\n .select('id, content, category, tags, net_votes, created_at')\n .eq('project_id', projectId)\n .eq('is_active', true)\n .order('created_at', { ascending: false })\n .limit(limit);\n\n if (!recentError && recentMemories) {\n memories = recentMemories.map(m => ({\n id: m.id,\n content: m.content,\n category: m.category || 'general',\n tags: m.tags || [],\n netVotes: m.net_votes,\n createdAt: m.created_at\n }));\n }\n }\n\n // Format memories into a readable context block\n const contextLines = memories.map((m) => {\n const voteIndicator = m.netVotes && m.netVotes < 0 ? ` [⚠️ POORLY RATED: ${m.netVotes}]` : '';\n const tagStr = m.tags.length > 0 ? ` [${m.tags.join(', ')}]` : '';\n return `- [${m.category.toUpperCase()}]${tagStr}${voteIndicator}: ${m.content}`;\n });\n\n const formatted = memories.length > 0\n ? `=== PROJECT BRAIN: RELEVANT MEMORIES ===\nQuery: \"${query}\"\nFound ${memories.length} relevant memories:\n\n${contextLines.join('\\n')}\n\n==========================================`\n : `=== PROJECT BRAIN ===\nQuery: \"${query}\"\nNo relevant memories found for this query.\n=======================`;\n\n return {\n query,\n memories,\n formatted\n };\n}\n","/**\n * Tool: get_latest_decisions\n * \n * Fetches the most recent ADRs and decisions from The Council,\n * including active roadmap steps and council session feedback.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { DecisionsResponse, CouncilSession, RoadmapStep } from '../lib/types.js';\n\nexport async function getLatestDecisions(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n limit: number = 5\n): Promise<DecisionsResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Fetch council sessions\n const { data: sessionData, error: sessionError } = await supabase\n .from('council_sessions')\n .select('id, project_id, recruited_agents, feedback_summary, duration_ms, sprints_count, tasks_count, created_at')\n .eq('project_id', projectId)\n .order('created_at', { ascending: false })\n .limit(limit);\n\n const sessions: CouncilSession[] = (sessionData || []).map(s => ({\n id: s.id,\n projectId: s.project_id,\n recruitedAgents: s.recruited_agents || [],\n feedbackSummary: (s.feedback_summary || []).map((f: any) => ({\n agentName: f.agentName || f.agent?.name || 'Unknown',\n emoji: f.emoji || f.agent?.emoji || '🤖',\n critiques: f.critiques || [],\n approved: f.approved ?? true\n })),\n durationMs: s.duration_ms,\n sprintsCount: s.sprints_count,\n tasksCount: s.tasks_count,\n createdAt: s.created_at\n }));\n\n // Fetch active roadmap step\n const { data: activeStep, error: stepError } = await supabase\n .from('roadmap_chunks')\n .select('id, step_number, title, status, sprint_focus')\n .eq('project_id', projectId)\n .eq('status', 'ACTIVE')\n .maybeSingle();\n\n const activeRoadmapStep: RoadmapStep | null = activeStep\n ? {\n id: activeStep.id,\n stepNumber: activeStep.step_number,\n title: activeStep.title,\n status: activeStep.status,\n sprintFocus: activeStep.sprint_focus\n }\n : null;\n\n // Build summary\n const summaryParts: string[] = [];\n\n // Add active step info\n if (activeRoadmapStep) {\n summaryParts.push(`=== CURRENT FOCUS ===`);\n summaryParts.push(`Step ${activeRoadmapStep.stepNumber}: ${activeRoadmapStep.title}`);\n if (activeRoadmapStep.sprintFocus) {\n summaryParts.push(`Focus: ${activeRoadmapStep.sprintFocus}`);\n }\n summaryParts.push('');\n }\n\n // Add recent council decisions\n if (sessions.length > 0) {\n summaryParts.push(`=== RECENT COUNCIL SESSIONS (${sessions.length}) ===`);\n\n for (const session of sessions) {\n const date = new Date(session.createdAt).toLocaleDateString();\n summaryParts.push(`\\n📅 Session on ${date}`);\n summaryParts.push(` Agents: ${session.recruitedAgents.join(', ')}`);\n\n if (session.feedbackSummary.length > 0) {\n summaryParts.push(` Key Feedback:`);\n for (const feedback of session.feedbackSummary.slice(0, 3)) {\n const status = feedback.approved ? '✅' : '⚠️';\n summaryParts.push(` ${feedback.emoji} ${feedback.agentName}: ${status}`);\n if (feedback.critiques.length > 0) {\n summaryParts.push(` - ${feedback.critiques[0]}`);\n }\n }\n }\n }\n } else {\n summaryParts.push(`No council sessions recorded yet.`);\n }\n\n // Fetch decision-type memories for additional context\n const { data: decisionMemories } = await supabase\n .from('project_memories')\n .select('content, category, created_at')\n .eq('project_id', projectId)\n .eq('is_active', true)\n .in('category', ['decision', 'architecture', 'constraint'])\n .order('created_at', { ascending: false })\n .limit(5);\n\n if (decisionMemories && decisionMemories.length > 0) {\n summaryParts.push(`\\n=== KEY DECISIONS FROM BRAIN ===`);\n for (const memory of decisionMemories) {\n summaryParts.push(`- [${memory.category.toUpperCase()}] ${memory.content}`);\n }\n }\n\n return {\n sessions,\n activeRoadmapStep,\n summary: summaryParts.join('\\n')\n };\n}\n","/**\n * Rigstate MCP Server - Local Rules Resource\n * \n * Reads local .rigstate/rules.md files and injects them as high-priority rules.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface LocalRule {\n source: string;\n content: string;\n priority: 'high' | 'medium';\n}\n\nexport interface ProjectMoralsResponse {\n rules: LocalRule[];\n formatted: string;\n}\n\nconst LOCAL_RULE_FILES = [\n '.rigstate/rules.md',\n '.rigstate/morals.md',\n '.rigstate/standards.md',\n '.cursor/rules.md',\n '.cursorrules'\n];\n\n/**\n * Read local project morals/rules from filesystem\n */\nexport function getProjectMorals(workspacePath?: string): ProjectMoralsResponse {\n const basePath = workspacePath || process.cwd();\n const rules: LocalRule[] = [];\n\n for (const ruleFile of LOCAL_RULE_FILES) {\n const fullPath = path.join(basePath, ruleFile);\n\n try {\n if (fs.existsSync(fullPath)) {\n const content = fs.readFileSync(fullPath, 'utf-8');\n\n if (content.trim()) {\n rules.push({\n source: ruleFile,\n content: content.trim(),\n priority: ruleFile.includes('.rigstate') ? 'high' : 'medium'\n });\n }\n }\n } catch (e) {\n // File not readable, skip\n }\n }\n\n // Format for context injection\n let formatted = '';\n\n if (rules.length > 0) {\n formatted = `## LOCAL PROJECT MORALS (HIGH PRIORITY)\\n`;\n formatted += `These rules are defined in the local workspace and MUST be followed:\\n\\n`;\n\n for (const rule of rules) {\n formatted += `### Source: ${rule.source}\\n`;\n formatted += rule.content;\n formatted += '\\n\\n';\n }\n } else {\n formatted = `No local rules found. You can create .rigstate/rules.md to define project-specific guidelines.`;\n }\n\n return {\n rules,\n formatted\n };\n}\n\n/**\n * Check if local rules exist\n */\nexport function hasLocalRules(workspacePath?: string): boolean {\n const basePath = workspacePath || process.cwd();\n\n for (const ruleFile of LOCAL_RULE_FILES) {\n const fullPath = path.join(basePath, ruleFile);\n if (fs.existsSync(fullPath)) {\n return true;\n }\n }\n\n return false;\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { AgentBridgeTask, CheckAgentBridgeResponse } from '../lib/types.js';\nimport { getProjectMorals } from '../resources/project-morals.js';\n\nexport async function checkAgentBridge(\n supabase: SupabaseClient,\n projectId: string,\n action: 'check' | 'update' | 'submit_for_review' = 'check',\n bridgeId?: string,\n status?: string,\n summary?: string, // legacy alias for general notes\n execution_summary?: string, // NEW: required for completion\n proposal?: string\n): Promise<CheckAgentBridgeResponse> {\n\n // 4. SUBMIT FOR REVIEW MODE\n if (action === 'submit_for_review') {\n if (!bridgeId) throw new Error('bridgeId is required for submit_for_review action');\n if (!proposal) throw new Error('proposal (with suggestedChanges and reasoning) is required for submission');\n\n // Pre-Flight Check: Active Validation\n const morals = getProjectMorals(); // Reads local .cursorrules if available\n const rulesText = morals.formatted.toLowerCase();\n const proposalLower = proposal.toLowerCase();\n\n // 1. Check for RIGSTATE compliance if rules exist\n if (rulesText.includes('rigstate_start')) {\n // Heuristic: If rules dictate RLS, proposal must mention it\n if (rulesText.includes('rls') && !proposalLower.includes('rls') && !proposalLower.includes('security')) {\n throw new Error('Validation Failed: Rule \"RLS/Security\" was violated. Your proposal does not explicitly mention Row Level Security. Please update your proposal to confirm RLS is handled.');\n }\n\n // Heuristic: If rules dictate Strict Types, proposal must mention it\n if (rulesText.includes('strict types') && !proposalLower.includes('type') && !proposalLower.includes('interface')) {\n throw new Error('Validation Failed: Rule \"Strict Types\" was violated. Your proposal seems to lack TypeScript definitions. Please explicitly plan your types.');\n }\n }\n\n // Update status to NEEDS_REVIEW\n const { data, error } = await supabase\n .from('agent_bridge')\n .update({\n status: 'NEEDS_REVIEW',\n proposal: proposal,\n updated_at: new Date().toISOString()\n })\n .eq('id', bridgeId)\n .eq('project_id', projectId)\n .select()\n .single();\n\n if (error) throw new Error(`Failed to submit for review: ${error.message}`);\n\n return {\n success: true,\n message: `Task ${bridgeId} submitted for review.`,\n task: data as AgentBridgeTask\n };\n }\n\n // 1. UPDATE MODE\n if (action === 'update') {\n if (!bridgeId) throw new Error('bridgeId is required for update action');\n\n // Security Check: If trying to set COMPLETED, verify it was APPROVED\n if (status === 'COMPLETED' || status === 'EXECUTING') {\n const { data: currentTask } = await supabase\n .from('agent_bridge')\n .select('status')\n .eq('id', bridgeId)\n .single();\n\n if (currentTask && (currentTask.status !== 'APPROVED' && currentTask.status !== 'EXECUTING')) {\n throw new Error(`Security Violation: Cannot execute or complete task ${bridgeId} because it is in status '${currentTask.status}'. Wait for APPROVED status.`);\n }\n }\n\n if (!status && !summary && !proposal) throw new Error('At least one of status, summary, or proposal is required for update');\n\n\n const updateData: any = {};\n\n if (status === 'COMPLETED') {\n if (!execution_summary) {\n throw new Error('execution_summary is REQUIRED when setting status to COMPLETED.');\n }\n updateData.completed_at = new Date().toISOString();\n }\n\n if (status) updateData.status = status;\n if (summary) updateData.summary = summary;\n if (execution_summary) updateData.execution_summary = execution_summary;\n if (proposal) updateData.proposal = proposal;\n updateData.updated_at = new Date().toISOString();\n\n const { data, error } = await supabase\n .from('agent_bridge')\n .update(updateData)\n .eq('id', bridgeId)\n .eq('project_id', projectId)\n .select()\n .single();\n\n if (error) throw new Error(`Failed to update agent bridge: ${error.message}`);\n\n return {\n success: true,\n message: `Updated agent bridge task ${bridgeId} to status ${data.status}`,\n task: data as AgentBridgeTask\n };\n }\n\n // 2. CHECK MODE (Default)\n // Find the oldest PENDING or APPROVED task (prioritize approved to execute, then pending to plan)\n // Actually, usually we want to find work. \n // - PENDING means \"Need Plan\"\n // - APPROVED means \"Need Execution\"\n // So we should look for both.\n\n const { data: tasks, error } = await supabase\n .from('agent_bridge')\n .select(`\n *,\n roadmap_chunks (\n title,\n description,\n prompt_content\n )\n `)\n .eq('project_id', projectId)\n // Find tasks that need plan (PENDING) OR need execution (APPROVED)\n // Ignoring NEEDS_REVIEW as that's user's court\n .in('status', ['PENDING', 'APPROVED', 'REJECTED'])\n .order('created_at', { ascending: true })\n .limit(1);\n\n if (error) throw new Error(`Failed to check agent bridge: ${error.message}`);\n\n if (!tasks || tasks.length === 0) {\n return {\n success: true,\n message: 'No pending or approved tasks found.',\n };\n }\n\n const taskData = tasks[0];\n const task: AgentBridgeTask = {\n id: taskData.id,\n project_id: taskData.project_id,\n task_id: taskData.task_id,\n status: taskData.status,\n summary: taskData.summary,\n execution_summary: taskData.execution_summary,\n proposal: taskData.proposal,\n created_at: taskData.created_at,\n completed_at: taskData.completed_at,\n // Map joined data flattener\n task_title: taskData.roadmap_chunks?.title,\n task_description: taskData.roadmap_chunks?.description,\n task_content: taskData.roadmap_chunks?.prompt_content\n };\n\n return {\n success: true,\n message: `Found task needing attention: ${task.status}`,\n task\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { CheckRulesSyncResponse } from '../lib/types.js';\n\nconst RIGSTATE_START = \"RIGSTATE_START\";\nconst RIGSTATE_END = \"RIGSTATE_END\";\n\n// Minimal Safety Cache (Guardian Rules)\nconst SAFETY_CACHE_RULES = `\n### 🛡️ RIGSTATE SAFETY CACHE (OFFLINE MODE)\n1. **Strict Types**: No 'any'. Define interfaces for all data structures.\n2. **Row Level Security**: All database queries MUST be scoped to 'user_id' or 'org_id'.\n3. **Validation**: Use Zod for all input validation.\n4. **Error Handling**: Use try/catch blocks for all external API calls.\n5. **No Blind Deletes**: Never delete data without explicit confirmation or soft-deletes.\n`;\n\nexport async function checkRulesSync(\n supabase: SupabaseClient,\n projectId: string,\n currentRulesContent?: string\n): Promise<CheckRulesSyncResponse> {\n\n // If no content provided, we can't really verify local files from MCP directly \n // without reading the file system, but MCP is often sandboxed or remote.\n // Ideally, the Agent provides the content of .cursorrules it sees.\n\n if (!currentRulesContent) {\n return {\n synced: false,\n message: \"No rules content provided for verification.\",\n shouldTriggerSync: true,\n missingBlock: true\n };\n }\n\n const hasStart = currentRulesContent.includes(RIGSTATE_START);\n const hasEnd = currentRulesContent.includes(RIGSTATE_END);\n\n if (!hasStart || !hasEnd) {\n return {\n synced: false,\n message: \"Rigstate rules block is missing or corrupted.\",\n shouldTriggerSync: true,\n missingBlock: true\n };\n }\n\n // Resilience: Wrap DB check in try/catch to handle network failures\n try {\n const { data: project, error } = await supabase\n .from('projects')\n .select('name')\n .eq('id', projectId)\n .single();\n\n if (error) throw error;\n\n if (project) {\n if (!currentRulesContent.includes(`Project Rules: ${project.name}`)) {\n return {\n synced: false,\n message: `Rules file appears to belong to a different project (Expected: ${project.name}).`,\n shouldTriggerSync: true\n };\n }\n }\n } catch (e) {\n // Network or DB Error -> Fallback to Offline Mode\n console.error(\"Rigstate Sync Verification Failed:\", e);\n\n return {\n synced: true, // Assume synced to allow work to continue\n shouldTriggerSync: false,\n offlineMode: true,\n message: `⚠️ Rigstate Sync utilgjengelig – bruker lokale sikkerhetsregler.\\n${SAFETY_CACHE_RULES}`\n };\n }\n\n return {\n synced: true,\n message: \"Rules are valid and present.\",\n shouldTriggerSync: false\n };\n}\n","/**\n * Rigstate MCP Server - Teacher Mode Tools\n * \n * Allows Frank to send logic corrections and fetch learned behaviors.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport interface RefineLogicResponse {\n success: boolean;\n instructionId: string;\n traceId: string;\n message: string;\n}\n\nexport interface LearnedInstructionsResponse {\n instructions: Array<{\n instruction: string;\n priority: number;\n isGlobal: boolean;\n createdAt: string;\n }>;\n globalInstructions: string[];\n formatted: string;\n}\n\n/**\n * Send a logic correction to the Rigstate cloud database\n */\nexport async function refineLogic(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n originalReasoning: string,\n userCorrection: string,\n scope: 'project' | 'global'\n): Promise<RefineLogicResponse> {\n // Generate a trace ID for this action\n const traceId = uuidv4();\n\n // Verify project access\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\n .eq('id', projectId)\n .eq('user_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error(`Project access denied or not found: ${projectId}`);\n }\n\n // Save the instruction\n const { data: instruction, error: insertError } = await supabase\n .from('ai_instructions')\n .insert({\n user_id: userId,\n project_id: scope === 'global' ? null : projectId,\n instruction: userCorrection,\n context: originalReasoning,\n is_global: scope === 'global',\n priority: scope === 'global' ? 8 : 6,\n source_log_id: null // MCP actions don't have a log ID\n })\n .select('id')\n .single();\n\n if (insertError) {\n throw new Error(`Failed to save instruction: ${insertError.message}`);\n }\n\n // Log this MCP action with trace\n await supabase\n .from('ai_activity_log')\n .insert({\n user_id: userId,\n project_id: projectId,\n activity_type: 'mcp_correction',\n summary: `MCP: ${userCorrection.slice(0, 100)}...`,\n intelligence_trace: {\n source: 'mcp',\n traceId,\n scope,\n originalReasoning: originalReasoning.slice(0, 500)\n },\n metadata: { mcp_trace_id: traceId }\n });\n\n return {\n success: true,\n instructionId: instruction.id,\n traceId,\n message: `✅ Correction saved! Frank will apply this ${scope === 'global' ? 'globally' : 'to this project'}.`\n };\n}\n\n/**\n * Fetch learned behaviors from the database\n */\nexport async function getLearnedInstructions(\n supabase: SupabaseClient,\n userId: string,\n projectId?: string\n): Promise<LearnedInstructionsResponse> {\n // Fetch user-specific instructions\n let query = supabase\n .from('ai_instructions')\n .select('instruction, priority, is_global, created_at')\n .eq('user_id', userId)\n .eq('is_active', true)\n .order('priority', { ascending: false })\n .limit(20);\n\n // Filter by project or global only\n if (projectId) {\n query = query.or(`is_global.eq.true,project_id.eq.${projectId}`);\n } else {\n query = query.eq('is_global', true);\n }\n\n const { data: userInstructions, error: userError } = await query;\n\n if (userError) {\n throw new Error(`Failed to fetch instructions: ${userError.message}`);\n }\n\n // Fetch global base instructions (system-wide)\n const { data: globalBase, error: globalError } = await supabase\n .from('global_base_instructions')\n .select('instruction')\n .eq('is_active', true)\n .order('priority', { ascending: false })\n .limit(10);\n\n const globalInstructions = (globalBase || []).map(g => g.instruction);\n\n // Format for context injection\n const instructions = (userInstructions || []).map(i => ({\n instruction: i.instruction as string,\n priority: i.priority as number,\n isGlobal: i.is_global as boolean,\n createdAt: i.created_at as string\n }));\n\n let formatted = '';\n\n if (globalInstructions.length > 0) {\n formatted += `## GLOBAL RIGSTATE STANDARDS\\n`;\n formatted += globalInstructions.map(g => `- ${g}`).join('\\n');\n formatted += '\\n\\n';\n }\n\n if (instructions.length > 0) {\n formatted += `## USER CORRECTIONS & TUNING\\n`;\n formatted += instructions.map(i => {\n const scope = i.isGlobal ? '[GLOBAL]' : '[PROJECT]';\n return `- ${scope} ${i.instruction}`;\n }).join('\\n');\n }\n\n if (!formatted) {\n formatted = 'No learned behaviors yet. Frank will start learning as you provide corrections.';\n }\n\n return {\n instructions,\n globalInstructions,\n formatted\n };\n}\n","/**\n * Tool: list_roadmap_tasks\n * \n * Lists all roadmap tasks for a project that are not completed.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { ListRoadmapTasksResponse } from '../lib/types.js';\n\nexport async function listRoadmapTasks(\n supabase: SupabaseClient,\n userId: string,\n projectId: string\n): Promise<ListRoadmapTasksResponse> {\n // 1. Verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // 2. Fetch non-completed tasks\n const { data: tasks, error } = await supabase\n .from('roadmap_chunks')\n .select('id, title, priority, status, step_number, prompt_content')\n .eq('project_id', projectId)\n .neq('status', 'COMPLETED')\n .order('priority', { ascending: false })\n .order('step_number', { ascending: true });\n\n if (error) {\n console.error('Failed to fetch roadmap tasks:', error);\n throw new Error('Failed to fetch roadmap tasks');\n }\n\n // 3. Format response\n const formatted = (tasks || []).length > 0\n ? (tasks || []).map(t => {\n const statusEmoji = t.status === 'ACTIVE' ? '🔵' : '🔒';\n const priorityStr = t.priority ? `[${t.priority}]` : '';\n return `${statusEmoji} Step ${t.step_number}: ${t.title} (ID: ${t.id})`;\n }).join('\\n')\n : 'No active or locked tasks found in the roadmap.';\n\n return {\n tasks: (tasks || []).map(t => ({\n id: t.id,\n title: t.title,\n priority: t.priority,\n status: t.status,\n step_number: t.step_number,\n prompt_content: t.prompt_content\n })),\n formatted\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { RoadmapChunk } from '../lib/types.js';\n\nexport interface GetNextRoadmapStepResponse {\n nextStep: RoadmapChunk | null;\n message: string;\n}\n\nexport async function getNextRoadmapStep(\n supabase: SupabaseClient,\n projectId: string,\n currentStepId?: string\n): Promise<GetNextRoadmapStepResponse> {\n\n // Strategy:\n // 1. If currentStepId is provided, look for the step with the next higher step_number.\n // 2. If not, look for the first 'ACTIVE' step.\n // 3. If no ACTIVE, look for the first 'LOCKED' step.\n\n let currentStepNumber = 0;\n\n if (currentStepId) {\n const { data: current } = await supabase\n .from('roadmap_chunks')\n .select('step_number')\n .eq('id', currentStepId)\n .single();\n\n if (current) {\n currentStepNumber = current.step_number;\n }\n } else {\n // Try to find currently active step to establish baseline\n const { data: active } = await supabase\n .from('roadmap_chunks')\n .select('step_number')\n .eq('project_id', projectId)\n .eq('status', 'ACTIVE')\n .order('step_number', { ascending: true })\n .limit(1)\n .single();\n\n if (active) {\n currentStepNumber = active.step_number;\n }\n }\n\n // Find the next step > currentStepNumber\n // We prioritize LOCKED or PENDING steps that come *after* the current one.\n const { data: nextStep, error } = await supabase\n .from('roadmap_chunks')\n .select('*')\n .eq('project_id', projectId)\n .gt('step_number', currentStepNumber)\n .neq('status', 'COMPLETED') // We want the next *workable* step\n .order('step_number', { ascending: true })\n .limit(1)\n .single();\n\n if (error && error.code !== 'PGRST116') { // PGRST116 is \"Row not found\" which is fine\n throw new Error(`Failed to fetch next roadmap step: ${error.message}`);\n }\n\n if (!nextStep) {\n return {\n nextStep: null,\n message: \"No further steps found in the roadmap. You might be done! 🎉\"\n };\n }\n\n return {\n nextStep: nextStep as RoadmapChunk,\n message: `Next step found: [Step ${nextStep.step_number}] ${nextStep.title}`\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\n\n/**\n * The Scribe's core adapter for fetching its own persona from Prompt CMS.\n */\nexport async function getScribePersona(supabase: SupabaseClient) {\n const { data: persona, error } = await supabase\n .from('agent_personas')\n .select('*')\n .eq('slug', 'the-scribe')\n .single();\n\n if (error || !persona) {\n return {\n display_name: 'The Scribe',\n job_title: 'Technical Documentation Lead',\n content: 'You are The Scribe, an expert in technical manifest generation and investor-ready reporting.'\n };\n }\n\n return persona;\n}\n\n/**\n * Calculates real-world metrics for the Scribe to report on.\n * Focuses on Velocity, Quality, and Risk.\n * IMPORTANT: Excludes is_legacy=true items from velocity calculations\n * to prevent historical imports from skewing development metrics.\n */\nexport async function calculateScribeMetrics(supabase: SupabaseClient, projectId: string) {\n // A: Velocity - Average time for agent_bridge tasks in the last 7 days\n const { data: recentTasks } = await supabase\n .from('agent_bridge')\n .select('created_at, updated_at')\n .eq('project_id', projectId)\n .eq('status', 'COMPLETED')\n .gte('created_at', new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString());\n\n let avgTimeMs = 0;\n if (recentTasks && recentTasks.length > 0) {\n const deltas = recentTasks.map(t =>\n new Date(t.updated_at).getTime() - new Date(t.created_at).getTime()\n );\n avgTimeMs = deltas.reduce((a, b) => a + b, 0) / deltas.length;\n }\n\n const velocityStr = avgTimeMs > 0\n ? `${(avgTimeMs / 1000).toFixed(1)}s avg execution time`\n : \"No execution history\";\n\n // B: Active Tasks Completed (EXCLUDES legacy items)\n const { count: activeTasksCompleted } = await supabase\n .from('roadmap_chunks')\n .select('*', { count: 'exact', head: true })\n .eq('project_id', projectId)\n .eq('status', 'COMPLETED')\n .or('is_legacy.is.null,is_legacy.eq.false');\n\n // C: Legacy Foundations Count (for separate reporting)\n const { count: legacyCount } = await supabase\n .from('roadmap_chunks')\n .select('*', { count: 'exact', head: true })\n .eq('project_id', projectId)\n .eq('is_legacy', true);\n\n // D: Quality - Fetch from intelligence_trends\n const { data: trends } = await supabase\n .from('intelligence_trends')\n .select('correction_count')\n .order('week_start', { ascending: false })\n .limit(2);\n\n let trendDir = 'stable';\n if (trends && trends.length === 2) {\n const latest = trends[0].correction_count;\n const prev = trends[1].correction_count;\n if (latest < prev) trendDir = 'improving';\n else if (latest > prev) trendDir = 'declining';\n }\n const qualityStr = `Quality trend is ${trendDir}` +\n (legacyCount && legacyCount > 0 ? `. Built on ${legacyCount} established foundations.` : '');\n\n // E: Risk - Count PING/CHECK rows\n const { count: riskCount } = await supabase\n .from('agent_bridge')\n .select('*', { count: 'exact', head: true })\n .eq('project_id', projectId)\n .or('proposal.ilike.%PING%,proposal.ilike.%CHECK%,summary.ilike.%PING%,summary.ilike.%CHECK%');\n\n // F: Enhanced Risk - Check for RLS\n const { count: rlsCount } = await supabase.from('pg_policies').select('*', { count: 'exact', head: true }).eq('schemaname', 'public');\n\n const riskMitigation = (riskCount || 0) > 0 || (rlsCount || 0) > 0\n ? `Security posture reinforced by ${rlsCount || 0} RLS policies and ${riskCount || 0} active guardian pings. All access is audited.`\n : \"Security controls inactive. Immediate RLS audit recommended.\";\n\n return {\n velocity: velocityStr,\n qualityTrend: qualityStr,\n riskScore: riskCount || 0,\n riskMitigation,\n activeTasksCompleted: activeTasksCompleted || 0,\n legacyFoundations: legacyCount || 0\n };\n}\n\n\n/**\n * Interpolates common variables into the Scribe's prompt.\n */\nexport function interpolateScribePrompt(\n basePrompt: string,\n vars: { projectName: string; velocity?: string; quality?: string; riskMitigation?: string }\n): string {\n let result = basePrompt;\n result = result.replace(/{{project_name}}/g, vars.projectName);\n if (vars.velocity) result = result.replace(/{{velocity}}/g, vars.velocity);\n if (vars.quality) result = result.replace(/{{quality}}/g, vars.quality);\n if (vars.riskMitigation) result = result.replace(/{{risk_mitigation}}/g, vars.riskMitigation);\n return result;\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { getScribePersona, interpolateScribePrompt, calculateScribeMetrics } from '../agents/the-scribe.js';\n\nexport async function generateProfessionalPdf(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n reportType: 'SYSTEM_MANIFEST' | 'INVESTOR_REPORT'\n) {\n console.error(`🖋️ The Scribe is preparing a ${reportType} briefing for project ${projectId}...`);\n\n // 1. Fetch persona from Prompt CMS (via Scribe Adapter)\n const persona = await getScribePersona(supabase);\n\n // 2. Fetch Project Metadata (expanded)\n const { data: project } = await supabase\n .from('projects')\n .select('name, description, project_type, detected_stack')\n .eq('id', projectId)\n .single();\n\n const projectName = project?.name || 'Rigstate Project';\n const projectDescription = project?.description || 'A cutting-edge software project built with modern architecture.';\n const projectType = project?.project_type || 'Web Application';\n const detectedStack = project?.detected_stack || {};\n\n // 3. Fetch COMPREHENSIVE Real Context & Metrics\n const [\n metrics,\n dnaStatsResponse,\n recentDecisions,\n roadmapData,\n councilSessions,\n tableList\n ] = await Promise.all([\n calculateScribeMetrics(supabase, projectId),\n supabase.rpc('get_project_dna_stats', { p_project_id: projectId }),\n supabase.from('project_memories')\n .select('summary, category, created_at')\n .eq('project_id', projectId)\n .eq('category', 'decision')\n .order('created_at', { ascending: false })\n .limit(5),\n supabase.from('roadmap_chunks')\n .select('title, status, priority')\n .eq('project_id', projectId)\n .order('priority', { ascending: true }),\n supabase.from('council_sessions')\n .select('executive_summary, created_at')\n .eq('project_id', projectId)\n .order('created_at', { ascending: false })\n .limit(2),\n supabase.rpc('get_public_tables_list')\n ]);\n\n const dnaStats = dnaStatsResponse.data || { total_tables: 0, rls_tables: 0, rls_policies: 0 };\n const tables = tableList.data || [];\n\n // 4. Process Roadmap Data - Separate legacy from active\n const roadmapSteps = roadmapData.data || [];\n const allCompletedSteps = roadmapSteps.filter(s => s.status === 'COMPLETED');\n const legacySteps = roadmapSteps.filter((s: any) => s.is_legacy === true);\n const activeCompletedSteps = allCompletedSteps.filter((s: any) => s.is_legacy !== true);\n const activeStep = roadmapSteps.find(s => s.status === 'ACTIVE');\n const lockedSteps = roadmapSteps.filter(s => s.status === 'LOCKED');\n\n // Progress based on ALL steps (legacy count towards completion but are clearly marked)\n const totalNonLegacy = roadmapSteps.filter((s: any) => s.is_legacy !== true).length;\n const progress = totalNonLegacy > 0 ? Math.round((activeCompletedSteps.length / totalNonLegacy) * 100) : 0;\n\n // 5. Build Tech Stack Summary\n const deps = detectedStack.dependencies || {};\n const devDeps = detectedStack.devDependencies || {};\n const allDeps = { ...deps, ...devDeps };\n const techStackItems: string[] = [];\n\n if (allDeps['next']) techStackItems.push(`Next.js ${allDeps['next']}`);\n if (allDeps['react']) techStackItems.push(`React ${allDeps['react']}`);\n if (allDeps['@supabase/supabase-js']) techStackItems.push('Supabase');\n if (allDeps['tailwindcss']) techStackItems.push('Tailwind CSS');\n if (allDeps['typescript']) techStackItems.push('TypeScript');\n if (allDeps['zod']) techStackItems.push('Zod Validation');\n if (allDeps['@react-pdf/renderer']) techStackItems.push('React-PDF');\n if (allDeps['sonner']) techStackItems.push('Sonner Toasts');\n\n const techStackSummary = techStackItems.length > 0\n ? techStackItems.join(' • ')\n : 'Stack detection pending. Run repository indexing to populate.';\n\n // 6. Build ADRs Summary\n const adrList = recentDecisions.data?.map(d => `• ${d.summary}`) || [];\n const adrContent = adrList.length > 0\n ? adrList.join('\\n')\n : '• No architectural decisions recorded yet. Use the Council or save decisions via chat.';\n\n // 7. Build Roadmap Details - Separate legacy from active\n const legacyTitles = legacySteps.length > 0\n ? `Established Foundations (${legacySteps.length}):\\n${legacySteps.map((s: any) => `📚 ${s.title}`).join('\\n')}`\n : '';\n const activeTitles = activeCompletedSteps.map((s: any) => `✓ ${s.title}`).join('\\n');\n const activeTitle = activeStep ? `→ IN PROGRESS: ${activeStep.title}` : '';\n const nextUpTitles = lockedSteps.slice(0, 3).map((s: any) => `○ ${s.title}`).join('\\n');\n\n const roadmapDetails = [\n legacyTitles,\n activeTitles ? `\\nRecent Completions:\\n${activeTitles}` : '',\n activeTitle,\n nextUpTitles ? `\\nNext Up:\\n${nextUpTitles}` : ''\n ].filter(Boolean).join('\\n');\n\n\n // 8. Build Council Insights\n const councilInsights = councilSessions.data?.map(s => s.executive_summary).filter(Boolean).slice(0, 2) || [];\n const councilSummary = councilInsights.length > 0\n ? councilInsights.map(i => `• ${i}`).join('\\n')\n : 'No council sessions recorded yet.';\n\n // 9. Build Security Analysis (Comprehensive)\n const securedTables = dnaStats.rls_tables || 0;\n const totalTables = dnaStats.total_tables || tables.length || 0;\n const rlsPolicies = dnaStats.rls_policies || 0;\n const securityScore = totalTables > 0 ? Math.round((securedTables / totalTables) * 100) : 0;\n\n const securityAnalysis = `\nSecurity Score: ${securityScore}% of public tables secured with RLS.\n• Total Public Tables: ${totalTables}\n• Tables with RLS Enabled: ${securedTables}\n• Active RLS Policies: ${rlsPolicies}\n• Guardian Pings (Monitoring): ${metrics.riskScore} detected\n\n${securityScore >= 90 ? '✓ EXCELLENT: All critical tables are protected.' :\n securityScore >= 70 ? '⚠ STABLE: Most tables protected. Review remaining exposures.' :\n '⛔ AT RISK: Immediate RLS audit recommended.'}\n`.trim();\n\n // 10. Interpolate variables\n const interpolatedPrompt = interpolateScribePrompt(persona.content, {\n projectName,\n velocity: metrics.velocity,\n quality: metrics.qualityTrend,\n riskMitigation: metrics.riskMitigation\n });\n\n // 11. Structure MANIFEST report data\n const manifestData = {\n type: 'MANIFEST',\n projectName: projectName,\n sections: [\n {\n title: 'Project Overview',\n content: `${projectDescription}\\n\\nProject Type: ${projectType}\\nTech Stack: ${techStackSummary}`\n },\n {\n title: 'Codebase DNA (Real-time Scan)',\n content: `System consists of ${totalTables} tables with ${rlsPolicies} active RLS security policies.\\n\\nDatabase integrity is rated as ${securityScore >= 90 ? 'EXCELLENT' : securityScore >= 70 ? 'STABLE' : 'NEEDS ATTENTION'}.\\n\\nKey Tables Detected:\\n${tables.slice(0, 10).map((t: any) => `• ${t.table_name}`).join('\\n') || '• Run database scan to populate'}`\n },\n {\n title: 'Architectural Decisions (ADRs)',\n content: adrContent\n },\n {\n title: 'Roadmap Execution',\n content: `Development Progress: ${progress}% (${activeCompletedSteps.length} active / ${legacySteps.length} legacy foundations)\\n\\nVelocity: ${metrics.velocity}\\n\\n${roadmapDetails || 'No roadmap steps configured yet.'}`\n },\n {\n title: 'Council Insights',\n content: councilSummary\n },\n {\n title: 'Security & Risk Assessment',\n content: securityAnalysis\n },\n {\n title: 'Quality & Compliance',\n content: `Quality Trend: ${metrics.qualityTrend}\\n\\nGuard Clauses:\\n• Strict Type Checks (No Any)\\n• Mandatory Supabase RLS Enforcement\\n• Line Limit Enforcement: TS (400) / TSX (250)\\n• All API routes require authentication\\n• CORS policies enforced on public endpoints`\n }\n ],\n agent: persona.display_name,\n job_title: persona.job_title,\n metrics: {\n velocity: metrics.velocity,\n qualityTrend: metrics.qualityTrend,\n progress: `${progress}%`,\n securityScore: `${securityScore}%`,\n totalTables: totalTables,\n rlsPolicies: rlsPolicies\n }\n };\n\n // 12. Structure INVESTOR report data\n const investorData = {\n type: 'INVESTOR',\n projectName: projectName,\n data: {\n velocity: metrics.velocity,\n healthScore: Math.min(100, 70 + (activeCompletedSteps.length * 3) + (legacySteps.length * 2) + (progress / 5) + (securityScore / 10)),\n qualityTrend: metrics.qualityTrend,\n roadmapProgress: `${progress}% (${activeCompletedSteps.length} completed, ${legacySteps.length} established foundations)`,\n projectType: projectType,\n techStack: techStackSummary,\n keyAchievements: [\n ...activeCompletedSteps.slice(0, 3).map((s: any) => `Completed: ${s.title}`),\n ...(legacySteps.length > 0 ? [`Built on ${legacySteps.length} established foundations`] : []),\n ...(recentDecisions.data?.slice(0, 2).map((d: any) => d.summary) || [])\n ].slice(0, 5),\n currentFocus: activeStep?.title || 'Planning next phase',\n upcomingMilestones: lockedSteps.slice(0, 3).map(s => s.title),\n riskMitigation: metrics.riskMitigation,\n securityPosture: {\n score: `${securityScore}%`,\n status: securityScore >= 90 ? 'Excellent' : securityScore >= 70 ? 'Stable' : 'Needs Attention',\n rlsPolicies: rlsPolicies,\n protectedTables: securedTables,\n totalTables: totalTables\n },\n councilInsights: councilInsights.slice(0, 2)\n },\n agent: persona.display_name,\n job_title: persona.job_title\n };\n\n const reportData = reportType === 'SYSTEM_MANIFEST' ? manifestData : investorData;\n\n // 13. Return data to caller\n return {\n success: true,\n message: `${reportType} briefing is ready.`,\n data: reportData,\n debug_prompt_snippet: interpolatedPrompt.substring(0, 500)\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport {\n generateRuleContent,\n generateRuleFiles,\n fetchLegacyStats,\n fetchActiveAgents,\n fetchProjectTechStack,\n getFileNameForIDE,\n IDEProvider,\n RuleFile\n} from '@rigstate/rules-engine';\n\n/**\n * Sync IDE rules for a project.\n * Uses the centralized rules-engine for consistent generation across all consumers.\n * \n * @param supabase - Supabase client instance\n * @param projectId - The project ID to generate rules for\n * @returns Object with fileName, content, and the new modular files[] array\n */\nexport async function syncIdeRules(\n supabase: SupabaseClient,\n projectId: string\n): Promise<{ fileName: string; content: string; files: RuleFile[] }> {\n // 1. Fetch Project & Preferred IDE\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('*')\n .eq('id', projectId)\n .single();\n\n if (projectError || !project) {\n throw new Error(`Project ${projectId} not found.`);\n }\n\n // 2. Determine IDE (Preference -> Fallback)\n const ide: IDEProvider = (project.preferred_ide as IDEProvider) || 'cursor';\n\n // 3. Fetch Context Data (Parallel for speed)\n const [stack, roadmapRes, legacyStats, activeAgents] = await Promise.all([\n fetchProjectTechStack(supabase, projectId),\n supabase\n .from('roadmap_chunks')\n .select('step_number, title, status, sprint_focus, prompt_content, is_legacy')\n .eq('project_id', projectId),\n fetchLegacyStats(supabase, projectId),\n fetchActiveAgents(supabase)\n ]);\n\n // 4. Generate Content (Mono-file)\n const content = generateRuleContent(\n { ...project, id: projectId },\n stack,\n roadmapRes.data || [],\n ide,\n legacyStats,\n activeAgents\n );\n\n // 5. Generate Modular Files (v3.0)\n const fileResult = generateRuleFiles(\n { ...project, id: projectId },\n stack,\n roadmapRes.data || [],\n ide,\n legacyStats,\n activeAgents\n );\n\n return {\n fileName: getFileNameForIDE(ide),\n content,\n files: fileResult.files\n };\n}\n\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\n\n/**\n * Brynjar's Archaeological Scan Tool\n * \n * Analyzes Git history and file structure to reconstruct\n * a project's historical context and generate \"Ghost Features\"\n * that represent completed work.\n */\n\nexport interface GitCommit {\n hash: string;\n message: string;\n date: string;\n author: string;\n}\n\nexport interface DiscoveredFeature {\n id: string;\n title: string;\n description: string;\n status: 'COMPLETED';\n source: 'git' | 'filesystem' | 'combined';\n evidence: string[];\n estimatedCompletionDate: string;\n priority: number;\n}\n\nexport interface ArchaeologicalReport {\n projectId: string;\n scanDate: string;\n gitAnalysis: {\n totalCommits: number;\n analyzedCommits: number;\n milestones: { date: string; summary: string; commits: string[] }[];\n };\n filesystemAnalysis: {\n totalDirectories: number;\n featureDirectories: string[];\n configFiles: string[];\n };\n discoveredFeatures: DiscoveredFeature[];\n recommendations: string[];\n}\n\n/**\n * Fetch Brynjar's persona from the system_prompts table\n */\nexport async function getBrynjarPersona(supabase: SupabaseClient) {\n const { data: persona, error } = await supabase\n .from('system_prompts')\n .select('*')\n .eq('slug', 'brynjar')\n .single();\n\n if (error || !persona) {\n return {\n display_name: 'Brynjar',\n job_title: 'The Librarian / Project Archivist',\n content: 'You are Brynjar, the Project Archivist specialized in reconstructing project history.'\n };\n }\n\n return persona;\n}\n\n/**\n * Parse git log output into structured commits\n */\nfunction parseGitLog(logOutput: string): GitCommit[] {\n const commits: GitCommit[] = [];\n const entries = logOutput.split('\\n---COMMIT---\\n').filter(Boolean);\n\n for (const entry of entries) {\n const lines = entry.trim().split('\\n');\n if (lines.length >= 3) {\n commits.push({\n hash: lines[0]?.replace('hash:', '').trim() || '',\n date: lines[1]?.replace('date:', '').trim() || '',\n author: lines[2]?.replace('author:', '').trim() || '',\n message: lines.slice(3).join('\\n').trim()\n });\n }\n }\n\n return commits;\n}\n\n/**\n * Analyze commits to identify major milestones\n */\nfunction identifyMilestones(commits: GitCommit[]): { date: string; summary: string; commits: string[] }[] {\n const milestones: { date: string; summary: string; commits: string[] }[] = [];\n\n // Keywords that indicate significant features\n const featurePatterns = [\n { pattern: /\\b(auth|authentication|login|signup|oauth)\\b/i, category: 'Authentication System' },\n { pattern: /\\b(database|schema|migration|supabase|postgres)\\b/i, category: 'Database Setup' },\n { pattern: /\\b(api|endpoint|route)\\b/i, category: 'API Development' },\n { pattern: /\\b(ui|component|layout|design|tailwind)\\b/i, category: 'UI/Component Development' },\n { pattern: /\\b(test|spec|jest|vitest)\\b/i, category: 'Testing Infrastructure' },\n { pattern: /\\b(deploy|ci|cd|github|vercel|docker)\\b/i, category: 'DevOps & Deployment' },\n { pattern: /\\b(feature|implement|add|create|build)\\b/i, category: 'Feature Implementation' },\n { pattern: /\\b(fix|bug|patch|resolve)\\b/i, category: 'Bug Fixes & Patches' },\n { pattern: /\\b(refactor|clean|optimize|improve)\\b/i, category: 'Code Quality Improvements' },\n { pattern: /\\b(docs|readme|documentation)\\b/i, category: 'Documentation' },\n { pattern: /\\b(config|setup|init|scaffold)\\b/i, category: 'Project Configuration' },\n { pattern: /\\b(agent|mcp|ai|llm|openai)\\b/i, category: 'AI/Agent Integration' },\n { pattern: /\\b(roadmap|milestone|chunk)\\b/i, category: 'Roadmap System' },\n { pattern: /\\b(report|pdf|manifest|governance)\\b/i, category: 'Reporting & Governance' },\n ];\n\n // Group commits by category\n const categoryMap = new Map<string, { commits: GitCommit[]; latestDate: string }>();\n\n for (const commit of commits) {\n for (const { pattern, category } of featurePatterns) {\n if (pattern.test(commit.message)) {\n if (!categoryMap.has(category)) {\n categoryMap.set(category, { commits: [], latestDate: commit.date });\n }\n const entry = categoryMap.get(category)!;\n entry.commits.push(commit);\n if (new Date(commit.date) > new Date(entry.latestDate)) {\n entry.latestDate = commit.date;\n }\n break; // Only categorize each commit once\n }\n }\n }\n\n // Convert to milestones (only include categories with 2+ commits)\n for (const [category, data] of categoryMap.entries()) {\n if (data.commits.length >= 2) {\n milestones.push({\n date: data.latestDate,\n summary: `${category} (${data.commits.length} commits)`,\n commits: data.commits.slice(0, 5).map(c => c.message.split('\\n')[0].substring(0, 80))\n });\n }\n }\n\n // Sort by date descending\n milestones.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());\n\n return milestones;\n}\n\n/**\n * Map directory structure to potential features\n */\nfunction analyzeFilesystem(tree: string[]): { featureDirectories: string[]; configFiles: string[] } {\n const featurePatterns = [\n /^(apps|packages)\\/[^/]+\\/src\\/(components|features|modules)\\/[^/]+$/,\n /^(apps|packages)\\/[^/]+\\/src\\/app\\/[^/]+$/,\n /^src\\/(components|features|modules|pages)\\/[^/]+$/,\n /^(apps|packages)\\/[^/]+$/,\n ];\n\n const configPatterns = [\n /package\\.json$/,\n /tsconfig.*\\.json$/,\n /\\.env.*$/,\n /next\\.config\\./,\n /tailwind\\.config\\./,\n /supabase.*\\.toml$/,\n ];\n\n const featureDirectories = tree.filter(path =>\n featurePatterns.some(pattern => pattern.test(path))\n );\n\n const configFiles = tree.filter(path =>\n configPatterns.some(pattern => pattern.test(path))\n );\n\n return {\n featureDirectories: [...new Set(featureDirectories)].slice(0, 20),\n configFiles: [...new Set(configFiles)].slice(0, 10)\n };\n}\n\n/**\n * Generate discovered features from milestones and filesystem\n */\nfunction generateDiscoveredFeatures(\n milestones: { date: string; summary: string; commits: string[] }[],\n filesystemAnalysis: { featureDirectories: string[]; configFiles: string[] }\n): DiscoveredFeature[] {\n const features: DiscoveredFeature[] = [];\n let priority = 1;\n\n // From Git milestones\n for (const milestone of milestones.slice(0, 10)) {\n const id = `ghost-${Date.now()}-${priority}`;\n features.push({\n id,\n title: milestone.summary.split('(')[0].trim(),\n description: `Reconstructed from ${milestone.commits.length} commits. Last activity: ${new Date(milestone.date).toLocaleDateString()}`,\n status: 'COMPLETED',\n source: 'git',\n evidence: milestone.commits,\n estimatedCompletionDate: milestone.date,\n priority: priority++\n });\n }\n\n // From filesystem (major directories as features)\n const directoryFeatures = filesystemAnalysis.featureDirectories\n .filter(dir => dir.includes('src/') || dir.startsWith('apps/') || dir.startsWith('packages/'))\n .slice(0, 5);\n\n for (const dir of directoryFeatures) {\n const name = dir.split('/').pop() || dir;\n const id = `ghost-fs-${Date.now()}-${priority}`;\n\n // Skip if we already have a similar feature from git\n if (features.some(f => f.title.toLowerCase().includes(name.toLowerCase()))) {\n continue;\n }\n\n features.push({\n id,\n title: `${name.charAt(0).toUpperCase() + name.slice(1)} Module`,\n description: `Detected from directory structure: ${dir}`,\n status: 'COMPLETED',\n source: 'filesystem',\n evidence: [dir],\n estimatedCompletionDate: new Date().toISOString(),\n priority: priority++\n });\n }\n\n return features;\n}\n\n/**\n * Main archaeological scan function\n * Called by the MCP server when Brynjar is invoked\n */\nexport async function performArchaeologicalScan(\n supabase: SupabaseClient,\n projectId: string,\n gitLog: string,\n fileTree: string[]\n): Promise<ArchaeologicalReport> {\n console.error(`🏛️ Brynjar is performing an archaeological scan for project ${projectId}...`);\n\n // Parse git history\n const commits = parseGitLog(gitLog);\n const milestones = identifyMilestones(commits);\n\n // Analyze filesystem\n const filesystemAnalysis = analyzeFilesystem(fileTree);\n\n // Generate ghost features\n const discoveredFeatures = generateDiscoveredFeatures(milestones, filesystemAnalysis);\n\n // Generate recommendations\n const recommendations: string[] = [];\n\n if (milestones.length === 0) {\n recommendations.push('No significant milestones detected. Consider adding more descriptive commit messages.');\n }\n if (filesystemAnalysis.featureDirectories.length < 3) {\n recommendations.push('Project structure appears simple. This may be intentional or early-stage.');\n }\n if (discoveredFeatures.length > 0) {\n recommendations.push(`${discoveredFeatures.length} ghost features ready for import into the roadmap.`);\n }\n if (!filesystemAnalysis.configFiles.some(f => f.includes('supabase'))) {\n recommendations.push('No Supabase configuration detected. Database integration may be pending.');\n }\n\n const report: ArchaeologicalReport = {\n projectId,\n scanDate: new Date().toISOString(),\n gitAnalysis: {\n totalCommits: commits.length,\n analyzedCommits: Math.min(commits.length, 100),\n milestones\n },\n filesystemAnalysis: {\n totalDirectories: fileTree.filter(f => !f.includes('.')).length,\n ...filesystemAnalysis\n },\n discoveredFeatures,\n recommendations\n };\n\n console.error(`🏛️ Brynjar found ${discoveredFeatures.length} ghost features and ${milestones.length} milestones.`);\n\n return report;\n}\n\n/**\n * Import ghost features into the roadmap as COMPLETED chunks\n */\nexport async function importGhostFeatures(\n supabase: SupabaseClient,\n projectId: string,\n features: DiscoveredFeature[]\n): Promise<{ success: boolean; imported: number; errors: string[] }> {\n console.error(`🏛️ Brynjar is importing ${features.length} ghost features into the roadmap...`);\n\n const errors: string[] = [];\n let imported = 0;\n\n for (const feature of features) {\n const { error } = await supabase\n .from('roadmap_chunks')\n .insert({\n project_id: projectId,\n title: feature.title,\n description: feature.description,\n status: 'COMPLETED',\n priority: feature.priority,\n is_legacy: true, // Mark as reconstructed historical feature\n completed_at: feature.estimatedCompletionDate, // Original completion date from Git\n created_at: new Date().toISOString(), // Import timestamp\n updated_at: new Date().toISOString()\n });\n\n if (error) {\n errors.push(`Failed to import \"${feature.title}\": ${error.message}`);\n } else {\n imported++;\n }\n }\n\n console.error(`🏛️ Brynjar imported ${imported}/${features.length} ghost features.`);\n\n return { success: errors.length === 0, imported, errors };\n}\n","import { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { AnalyzeDependencyGraphInput } from '../lib/types.js';\n\n/**\n * Einar's Tool: Architecture Integrity Scanner\n * Scans the codebase for circular dependencies and structural violations.\n */\nexport async function analyzeDependencyGraph(input: AnalyzeDependencyGraphInput) {\n // Determine root. Input path is relative to CWD usually.\n // If input.path is absolute, use it. Otherwise resolve from CWD.\n const searchPath = path.isAbsolute(input.path)\n ? input.path\n : path.resolve(process.cwd(), input.path);\n\n try {\n await fs.access(searchPath);\n } catch {\n return {\n error: `Directory not found: ${searchPath}. Ensure you are running the MCP server in the project root or provide an absolute path.`\n };\n }\n\n // 1. Scan files\n const allFiles = await getAllFiles(searchPath);\n const tsFiles = allFiles.filter(f => /\\.(ts|tsx|js|jsx)$/.test(f) && !f.includes('node_modules') && !f.includes('.next') && !f.includes('dist'));\n\n // 2. Build Graph\n const graph: Record<string, string[]> = {};\n const fileSet = new Set(tsFiles);\n\n for (const file of tsFiles) {\n const content = await fs.readFile(file, 'utf-8');\n const imports = extractImports(content);\n\n const validDeps: string[] = [];\n\n for (const imp of imports) {\n const resolved = resolveImport(file, imp, searchPath);\n if (resolved && fileSet.has(resolved)) {\n validDeps.push(resolved);\n }\n }\n\n // Use relative paths for the graph to make it readable\n const relFile = path.relative(searchPath, file);\n graph[relFile] = validDeps.map(d => path.relative(searchPath, d));\n }\n\n // 3. Detect Cycles\n const cycles = detectCycles(graph);\n\n return {\n timestamp: new Date().toISOString(),\n analyzedPath: searchPath,\n metrics: {\n totalFiles: tsFiles.length,\n circularDependencies: cycles.length\n },\n cycles: cycles,\n status: cycles.length > 0 ? 'VIOLATION' : 'PASS',\n summary: cycles.length > 0\n ? `FAILED. Detected ${cycles.length} circular dependencies. These must be resolved to maintain architectural integrity.`\n : `PASSED. No circular dependencies detected in ${tsFiles.length} files.`\n };\n}\n\n// --- Helpers ---\n\nasync function getAllFiles(dir: string): Promise<string[]> {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const files = await Promise.all(entries.map(async (entry) => {\n const res = path.resolve(dir, entry.name);\n return entry.isDirectory() ? getAllFiles(res) : res;\n }));\n return files.flat();\n}\n\n/**\n * Simple regex extraction of import statements.\n * Matches: import ... from '...'\n * Matches: import '...'\n * Matches: export ... from '...'\n */\nfunction extractImports(content: string): string[] {\n const regex = /from\\s+['\"]([^'\"]+)['\"]|import\\s+['\"]([^'\"]+)['\"]/g;\n const imports: string[] = [];\n let match;\n while ((match = regex.exec(content)) !== null) {\n // match[1] is 'from \"...\"; match[2] is import \"...\";\n imports.push(match[1] || match[2]);\n }\n return imports;\n}\n\n/**\n * Naive resolver.\n * Handles:\n * - Relative: ./foo, ../bar\n * - Alias: @/ -> searchPath/ (Assumes Next.js style)\n * - Extensions: tries .ts, .tsx, .js, index.ts, etc.\n */\nfunction resolveImport(importer: string, importPath: string, root: string): string | null {\n if (!importPath.startsWith('.') && !importPath.startsWith('@/')) {\n return null; // Ignore node_modules\n }\n\n let searchDir = path.dirname(importer);\n let target = importPath;\n\n if (importPath.startsWith('@/')) {\n target = importPath.replace('@/', '');\n searchDir = root; // Assume root is where @/ points to (src or project root)\n // Adjust for src if root includes src, ensuring we don't double dip? \n // Actually, usually @/ maps to src/ or root. We'll try relative to 'root'.\n }\n\n const startPath = path.resolve(searchDir, target);\n\n // Try extensions\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js', ''];\n for (const ext of extensions) {\n const candidate = startPath + ext;\n if (require('fs').existsSync(candidate) && !require('fs').statSync(candidate).isDirectory()) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction detectCycles(graph: Record<string, string[]>): string[][] {\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n const cycles: string[][] = [];\n\n function dfs(node: string, path: string[]) {\n visited.add(node);\n recursionStack.add(node);\n path.push(node);\n\n const deps = graph[node] || [];\n for (const dep of deps) {\n if (!visited.has(dep)) {\n dfs(dep, path);\n } else if (recursionStack.has(dep)) {\n // Cycle detected\n const cycleStart = path.indexOf(dep);\n if (cycleStart !== -1) {\n cycles.push([...path.slice(cycleStart), dep]);\n }\n }\n }\n\n recursionStack.delete(node);\n path.pop();\n }\n\n for (const node of Object.keys(graph)) {\n if (!visited.has(node)) {\n dfs(node, []);\n }\n }\n\n return cycles;\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { AuditRlsStatusInput } from '../lib/types.js';\n\n/**\n * Sven's Tool: Security Shield\n * Audits the database to ensure Row Level Security (RLS) is enforced.\n */\nexport async function auditRlsStatus(\n supabase: SupabaseClient,\n input: AuditRlsStatusInput\n) {\n try {\n // Query pg_tables to check rowsecurity status\n const { data, error } = await supabase.rpc('execute_sql', {\n query: `\n SELECT tablename, rowsecurity \n FROM pg_tables \n WHERE schemaname = 'public' \n ORDER BY tablename;\n `\n });\n\n // Fallback if generic execute_sql isn't available (it's often a custom RPC in these setups)\n // If RPC fails, try generic postgres connection? \n // MCP usually connects via HTTP API (PostgREST). PostgREST doesn't expose pg_tables directly unless allowed.\n // HOWEVER, the user instruction implies we CAN run this. \"Utfør en SQL-spørring...\"\n // If using Supabase JS client, we can't run raw SQL unless we use an RPC wrapper.\n // I will assume an RPC 'execute_sql' exists (common in AI setups) OR I have to trust the instruction \n // implies I have a way.\n\n // Alternative: Use the 'mcp_supabase-mcp-server_execute_sql' pattern? No, we ARE the MCP server.\n // If we don't have an RPC, we might struggle.\n // Let's implement a robust check.\n\n if (error) {\n // Try direct fetch if exposed, which is rare for system tables\n throw new Error(`Database query failed: ${error.message}`);\n }\n\n // Parse result (assuming result comes back as array of objects)\n // If data is null/empty but no error?\n const tables = data as Array<{ tablename: string, rowsecurity: boolean }>;\n\n if (!tables) {\n // If RPC returns void or strange shape, try to warn.\n return {\n status: 'ERROR',\n message: 'Could not fetch table list. Ensure execute_sql RPC is available or pg_tables is accessible.'\n };\n }\n\n const unsecuredTables = tables.filter(t => !t.rowsecurity);\n const securedTables = tables.filter(t => t.rowsecurity);\n\n const score = tables.length > 0\n ? Math.round((securedTables.length / tables.length) * 100)\n : 100;\n\n return {\n timestamp: new Date().toISOString(),\n projectId: input.projectId,\n securityScore: score,\n metrics: {\n totalTables: tables.length,\n securedTables: securedTables.length,\n unsecuredTables: unsecuredTables.length\n },\n unsecuredTables: unsecuredTables.map(t => t.tablename),\n status: unsecuredTables.length === 0 ? 'SECURE' : 'VULNERABLE',\n summary: unsecuredTables.length === 0\n ? `PASSED. All ${tables.length} tables have RLS enabled. Sven approves.`\n : `CRITICAL. ${unsecuredTables.length} tables are missing RLS: ${unsecuredTables.map(t => t.tablename).join(', ')}. Immediate action required.`\n };\n\n } catch (err: any) {\n // Fallback: If we can't reach the DB\n return {\n status: 'ERROR',\n message: `Sven could not reach the database structure. Error: ${err.message || err}. check connection strings.`\n };\n }\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { QueryProjectBrainInput, FetchPackageHealthInput } from '../lib/types.js';\n\n/**\n * Maja's Tool: Project Brain Query\n * Searches for ADRs, architecture decisions, and memories with a focus on \"Why\".\n */\nexport async function queryProjectBrain(\n supabase: SupabaseClient,\n userId: string,\n input: QueryProjectBrainInput\n) {\n const { projectId, query, limit = 5 } = input;\n\n // Verify access\n const { data: project, error: pError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (pError || !project) throw new Error('Access denied or project not found');\n\n // Simple keyword search\n const terms = query.toLowerCase().split(/\\s+/).filter(t => t.length > 2);\n\n let queryBuilder = supabase\n .from('project_memories')\n .select('id, content, category, tags, importance, created_at')\n .eq('project_id', projectId)\n .eq('is_active', true);\n\n if (terms.length > 0) {\n // Search content. \n // Ideally we search tags too, but PostgREST filter for array-contains-text-ILIKE is complex.\n // We rely on content search, which includes the Title (markdown header) and body.\n const orParams = terms.map(t => `content.ilike.%${t}%`).join(',');\n queryBuilder = queryBuilder.or(orParams);\n }\n\n const { data, error } = await queryBuilder\n .order('importance', { ascending: false }) // Prioritize High Importance (ADRs)\n .order('created_at', { ascending: false })\n .limit(limit);\n\n if (error) throw new Error(`Brain query failed: ${error.message}`);\n\n const results = (data || []).map(m => ({\n id: m.id,\n category: m.category,\n tags: m.tags,\n importance: m.importance,\n preview: m.content.substring(0, 200) + '...',\n fullContent: m.content,\n date: new Date(m.created_at).toLocaleDateString()\n }));\n\n return {\n query,\n matchCount: results.length,\n results\n };\n}\n\n/**\n * Astrid's Tool: NPM Package Health Check\n * Evaluates a library's maturity and safety.\n */\nexport async function fetchPackageHealth(input: FetchPackageHealthInput) {\n const { packageName } = input;\n\n try {\n // 1. Registry Metadata\n const res = await fetch(`https://registry.npmjs.org/${packageName}`);\n if (!res.ok) {\n if (res.status === 404) return { status: 'NOT_FOUND', message: 'Package does not exist.' };\n throw new Error(`Registry error: ${res.statusText}`);\n }\n const data = (await res.json()) as any;\n\n const latestVersion = data['dist-tags']?.latest;\n if (!latestVersion) throw new Error('No latest version found');\n\n const versionData = data.versions[latestVersion];\n const lastPublish = data.time[latestVersion];\n\n // 2. Download Stats\n // Use exact range 'last-week'\n const dlRes = await fetch(`https://api.npmjs.org/downloads/point/last-week/${packageName}`);\n let downloads = 0;\n if (dlRes.ok) {\n const dlData = (await dlRes.json()) as any;\n downloads = dlData.downloads || 0;\n }\n\n // 3. Analysis\n const lastDate = new Date(lastPublish);\n const now = new Date();\n const ageCodeDays = (now.getTime() - lastDate.getTime()) / (1000 * 3600 * 24);\n\n let healthScore = 'MODERATE';\n let recommendation = 'Usable, but verify.';\n let riskFactors: string[] = [];\n\n if (data.deprecated) {\n healthScore = 'CRITICAL';\n recommendation = 'DO NOT USE. Package is deprecated.';\n riskFactors.push(`Deprecated: ${data.deprecated}`);\n }\n\n if (ageCodeDays > 730) { // 2 years\n healthScore = 'STAGNANT';\n recommendation = 'Consider alternatives. No updates in 2+ years.';\n riskFactors.push('Mainteinance mode? (Old)');\n }\n\n if (downloads < 50) {\n healthScore = 'LOW_ADOPTION';\n riskFactors.push('Very low downloads (<50/week)');\n if (healthScore !== 'CRITICAL') recommendation = 'High risk. Barely used.';\n } else if (downloads > 100000 && ageCodeDays < 180) {\n healthScore = 'EXCELLENT';\n recommendation = 'Strongly recommended. Industry standard.';\n } else if (downloads > 5000 && ageCodeDays < 365) {\n healthScore = 'HEALTHY';\n recommendation = 'Safe to use.';\n }\n\n return {\n packageName,\n latestVersion,\n lastPublished: lastPublish,\n downloadsLastWeek: downloads,\n license: versionData.license || 'Unknown',\n description: data.description,\n healthScore,\n recommendation,\n riskFactors,\n maintainers: data.maintainers?.length || 0\n };\n\n } catch (e: any) {\n return {\n status: 'ERROR',\n message: `Analysis failed: ${e.message}`\n };\n }\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\n\nexport interface CompleteRoadmapTaskResponse {\n success: boolean;\n taskId: string;\n message: string;\n}\n\nexport async function completeRoadmapTask(\n supabase: SupabaseClient,\n projectId: string,\n summary: string,\n taskId?: string,\n gitDiff?: string\n): Promise<CompleteRoadmapTaskResponse> {\n\n // 1. Identify the task\n let targetTaskId = taskId;\n\n if (!targetTaskId) {\n // Infer: Find the first IN_PROGRESS or ACTIVE task\n const { data: activeTask } = await supabase\n .from('roadmap_chunks')\n .select('id, title')\n .eq('project_id', projectId)\n .in('status', ['IN_PROGRESS', 'ACTIVE'])\n .order('step_number', { ascending: true })\n .limit(1)\n .single();\n\n if (activeTask) {\n targetTaskId = activeTask.id;\n } else {\n throw new Error('No active task found to complete. Please provide a specific taskId.');\n }\n }\n\n // 2. Update the Task Status\n const { error: updateError } = await supabase\n .from('roadmap_chunks')\n .update({\n status: 'COMPLETED',\n completed_at: new Date().toISOString(),\n // We could store the summary directly on the chunk if there's a column, \n // but mission_reports is the proper place for detailed logs.\n // Let's check if we can update metadata or similar.\n // For now, let's assume mission_reports is the way.\n })\n .eq('id', targetTaskId);\n\n if (updateError) {\n throw new Error(`Failed to update task status: ${updateError.message}`);\n }\n\n // 3. Create a Mission Report entry\n // Check if 'mission_reports' table exists and has the schema we expect.\n // Based on previous code in index.ts (Frank Watcher):\n /*\n await supabase.from('mission_reports').insert({\n bridge_id: task.id, // We might not have a bridge_id if this is direct from IDE\n project_id: task.project_id,\n task_id: task.task_id,\n human_summary: humanSummary,\n technical_summary: technicalSummary,\n ...\n });\n */\n\n // We'll insert a report. Since we don't have a bridge_id (this didn't come from the agent bridge queue),\n // we'll leave it null if allowed, or we might need to create a dummy bridge entry?\n // Let's assume bridge_id is nullable or we just skip it.\n // If bridge_id is required, we might need to fake one or just log to a 'notes' field on roadmap_chunk if available.\n // Let's try to insert into mission_reports first.\n\n const { error: reportError } = await supabase\n .from('mission_reports')\n .insert({\n project_id: projectId,\n task_id: targetTaskId,\n human_summary: summary,\n technical_summary: gitDiff || 'Completed via IDE Direct Connection.',\n // bridge_id: null // Assuming nullable\n });\n\n if (reportError) {\n console.warn('Failed to save mission report:', reportError.message);\n // Fallback: Add a comment/note to the chunk?\n // We'll just return a warning in the message.\n }\n\n return {\n success: true,\n taskId: targetTaskId!,\n message: `Task completed successfully! Summary saved.`\n };\n}\n","import { z } from 'zod';\nimport { ToolDefinition } from '../lib/tool-registry.js';\n\n/**\n * Input Schema for List Features\n */\nconst InputSchema = z.object({\n projectId: z.string().uuid().describe('The UUID of the Rigstate project')\n});\n\n/**\n * Tool Definition: list_features\n */\nexport const listFeaturesTool: ToolDefinition<typeof InputSchema> = {\n name: 'list_features',\n description: `Lists all high-level features (epics) for a project.\nUseful for understanding the strategic context and major milestones.`,\n schema: InputSchema,\n handler: async ({ projectId }, { supabase, userId }) => {\n // 1. Verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // 2. Fetch features\n const { data: features, error } = await supabase\n .from('features')\n .select('id, name, description, priority, status')\n .eq('project_id', projectId)\n .neq('status', 'ARCHIVED')\n .order('created_at', { ascending: false }); // Sort by newest (or priority if column existed properly typed)\n\n // Note: 'horizon' was not in my simple schema mental model, removed to be safe or use 'status' as proxy.\n // Assuming strict schema adherence.\n // If priority column is text, sorting by it strictly might be weird if not enum. \n // Let's trust 'created_at' for stability for now.\n\n if (error) {\n throw new Error(`Failed to fetch features: ${error.message}`);\n }\n\n // 3. Format response\n const formatted = (features || []).length > 0\n ? (features || []).map(f => {\n const priorityStr = f.priority === 'MVP' ? '[MVP] ' : '';\n return `- ${priorityStr}${f.name} (${f.status})`;\n }).join('\\n')\n : 'No active features found.';\n\n return {\n content: [\n {\n type: 'text',\n text: formatted\n }\n ]\n };\n }\n};\n\n","import { z } from 'zod';\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Context provided to every tool execution.\n * Contains authentication and database access.\n */\nexport interface ToolContext {\n supabase: SupabaseClient;\n userId: string;\n}\n\n/**\n * A generic definition of a Tool.\n * T corresponds to the Zod schema for input validation.\n */\nexport interface ToolDefinition<T extends z.ZodType> {\n /** The unique name of the tool (e.g., 'list_features') */\n name: string;\n /** A helpful description for the AI */\n description: string;\n /** The Zod schema for input validation */\n schema: T;\n /** The function that executes the tool logic */\n handler: (args: z.infer<T>, context: ToolContext) => Promise<{ content: Array<{ type: string; text: string }> }>;\n}\n\n/**\n * The central registry for all MCP tools.\n * Handles registration, listing, and execution.\n */\nclass ToolRegistry {\n private tools: Map<string, ToolDefinition<any>> = new Map();\n\n /**\n * Registers a tool logic with the system.\n */\n register<T extends z.ZodType>(tool: ToolDefinition<T>) {\n if (this.tools.has(tool.name)) {\n console.warn(`Tool '${tool.name}' is already registered. Overwriting.`);\n }\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Returns the list of tools formatted for the MCP 'ListTools' request.\n * Converts Zod schemas to JSON Schemas implicitly via manual type mapping or libraries.\n * For now, we manually map 'inputSchema' as 'object' in the index.ts, \n * but here we prepare the definitions.\n */\n getTools(): Tool[] {\n return Array.from(this.tools.values()).map(tool => {\n // Very basic Zod -> JSON Schema mapping. \n // In a real robust system, use 'zod-to-json-schema'.\n // Here we rely on the tool definer to keep it simple or we expand later.\n // For now, we assume standard object schema.\n\n // To avoid complex zod-to-json-schema dependency issues for now,\n // we will construct a basic JSON schema representation \n // from the Zod shape if possible, or expect the tool to provide it?\n // Let's rely on zod-to-json-schema if installed, or do a simple conversion.\n // Actually, let's keep it simple: We just return the Tool interface required by MCP SDK.\n\n // Hack for MVP: We assume the top level is always an object with properties.\n // We can improve this reflection later.\n\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: this.zodToJsonSchema(tool.schema)\n };\n });\n }\n\n /**\n * Executes a tool by name.\n * Validates input against schema before execution.\n */\n async callTool(name: string, args: any, context: ToolContext) {\n const tool = this.tools.get(name);\n if (!tool) {\n throw new Error(`Tool '${name}' not found.`);\n }\n\n const parseResult = tool.schema.safeParse(args);\n if (!parseResult.success) {\n throw new Error(`Invalid arguments for tool '${name}': ${parseResult.error.message}`);\n }\n\n return await tool.handler(parseResult.data, context);\n }\n\n /**\n * Basic helper to convert Zod Object to JSON Schema.\n * Note: This is a simplified version. For complex types, use 'zod-to-json-schema'.\n */\n private zodToJsonSchema(schema: z.ZodType): any {\n if (schema instanceof z.ZodObject) {\n const shape = schema.shape;\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const key in shape) {\n const field = shape[key];\n // Accessing description if available in Zod (requires extended Zod or casting)\n // Basic type mapping:\n let type = 'string';\n let description = field.description; // Leverages Zod's .describe()\n\n if (field instanceof z.ZodNumber) type = 'number';\n if (field instanceof z.ZodBoolean) type = 'boolean';\n if (field instanceof z.ZodArray) type = 'array';\n\n // Determine if optional\n if (!field.isOptional()) {\n required.push(key);\n }\n\n properties[key] = { type, description };\n }\n\n return {\n type: 'object',\n properties,\n required\n };\n }\n // Fallback or other types\n return { type: 'object', properties: {} };\n }\n}\n\nexport const registry = new ToolRegistry();\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { AnalyzeUiComponentInput, ApplyDesignSystemInput, FetchUiLibraryDocsInput } from '../lib/types.js';\n\n/**\n * Linus's Tool: Analyze UI Component\n * Checks for design deviations, hardcoded values, and accessibility gaps.\n */\nexport async function analyzeUiComponent(input: AnalyzeUiComponentInput) {\n const { filePath } = input;\n\n if (!await fileExists(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const content = await fs.readFile(filePath, 'utf-8');\n const issues: string[] = [];\n const score = 100;\n\n // 1. Check for Hardcoded Hex Colors\n // Regex matches text-[#...], bg-[#...], or just #... inside classNames often\n const hexRegex = /#([0-9A-Fa-f]{3}){1,2}\\b/g;\n const hexMatches = content.match(hexRegex);\n if (hexMatches) {\n // Filter out ID selectors in CSS if file is .css\n const isCss = filePath.endsWith('.css');\n const uniqueHex = [...new Set(hexMatches)];\n\n for (const hex of uniqueHex) {\n // In CSS, #id is valid. In TSX className, usually implies hardcoded color.\n if (!isCss || content.includes(`color: ${hex}`) || content.includes(`background: ${hex}`)) {\n issues.push(`Hardcoded color found: ${hex}. Use design tokens (e.g., bg-background, text-primary).`);\n }\n }\n }\n\n // 2. Check for missing Alt text on images (TSX only)\n if (filePath.endsWith('.tsx')) {\n const imgRegex = /<img(?![^>]*\\balt=)[^>]*>/g;\n if (imgRegex.test(content)) {\n issues.push('Accessibility: <img> tag detected without \"alt\" attribute.');\n }\n\n // Check for Image component (Next.js)\n const nextImgRegex = /<Image(?![^>]*\\balt=)[^>]*>/g;\n if (nextImgRegex.test(content)) {\n issues.push('Accessibility: <Image> component missing \"alt\" prop.');\n }\n }\n\n // 3. Check for arbitrary values (Tailwind)\n // Matches w-[123px] or p-[10px] etc.\n const arbitraryRegex = /\\w-\\[\\d+px\\]/g;\n if (arbitraryRegex.test(content)) {\n issues.push('maintainability: Arbitrary pixel values detected (e.g., w-[50px]). Use standard spacing scale (w-12).');\n }\n\n return {\n filePath: path.basename(filePath),\n issueCount: issues.length,\n issues: issues.length > 0 ? issues : ['✅ No obvious design violations found. Great job!']\n };\n}\n\n/**\n * Linus's Tool: Apply Design System\n * Auto-fixes common design system violations (e.g. replacing hardcoded logic).\n */\nexport async function applyDesignSystem(input: ApplyDesignSystemInput) {\n const { filePath } = input;\n\n if (!await fileExists(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n let content = await fs.readFile(filePath, 'utf-8');\n let replacements = 0;\n\n // Mapping of hardcoded values to System Tokens\n // Determine context (light/dark agnostic logic)\n const adjustments = [\n // Text Colors\n { pattern: /text-\\[#000000\\]/g, replacement: 'text-foreground' },\n { pattern: /text-\\[#000\\]/g, replacement: 'text-foreground' },\n { pattern: /text-\\[#ffffff\\]/g, replacement: 'text-primary-foreground' },\n { pattern: /text-\\[#fff\\]/g, replacement: 'text-primary-foreground' },\n\n // Backgrounds\n { pattern: /bg-\\[#ffffff\\]/g, replacement: 'bg-background' },\n { pattern: /bg-\\[#fff\\]/g, replacement: 'bg-background' },\n { pattern: /bg-\\[#000000\\]/g, replacement: 'bg-black' }, // Or bg-foreground? keeping bg-black safe.\n\n // Borders\n { pattern: /border-\\[#e5e7eb\\]/g, replacement: 'border-border' }, // Common gray\n { pattern: /border-\\[#d1d5db\\]/g, replacement: 'border-border' },\n ];\n\n for (const adj of adjustments) {\n if (adj.pattern.test(content)) {\n const matches = content.match(adj.pattern);\n replacements += matches ? matches.length : 0;\n content = content.replace(adj.pattern, adj.replacement);\n }\n }\n\n if (replacements > 0) {\n await fs.writeFile(filePath, content, 'utf-8');\n return {\n success: true,\n filesFixed: 1,\n replacementsCount: replacements,\n message: `Applied design system: Replaced ${replacements} hardcoded values with tokens in ${path.basename(filePath)}.`\n };\n }\n\n return {\n success: true,\n filesFixed: 0,\n replacementsCount: 0,\n message: 'No automatic replacements could be applied. Manual review may be needed.'\n };\n}\n\n/**\n * Astrid's Tool: Fetch UI Library Docs\n * Retrieves reference code for components (Shadcn/UI).\n */\nexport async function fetchUiLibraryDocs(input: FetchUiLibraryDocsInput) {\n const { componentName, library } = input;\n\n if (library === 'shadcn') {\n // Try to find the component in apps/web/src/components/ui\n // We scan for the file.\n // Assuming typical monorepo path from root.\n const basePaths = [\n '/Users/steinhofve/Documents/Nowhere/CURSOR/Rigstate/apps/web/src/components/ui',\n path.resolve(process.cwd(), 'apps/web/src/components/ui')\n ];\n\n for (const basePath of basePaths) {\n if (await dirExists(basePath)) {\n // Try .tsx and .ts\n const variations = [`${componentName}.tsx`, `${componentName}.ts`, `${componentName}/index.tsx`];\n\n for (const variant of variations) {\n const fullPath = path.join(basePath, variant);\n if (await fileExists(fullPath)) {\n const content = await fs.readFile(fullPath, 'utf-8');\n // Return a truncated/summarized version or full?\n // Full is better for \"Copy syntax\".\n return {\n found: true,\n source: 'Local Component Definition',\n path: fullPath,\n content: content\n };\n }\n }\n }\n }\n\n return {\n found: false,\n message: `Component \"${componentName}\" not found in local Shadcn UI directory.`\n };\n }\n\n return {\n found: false,\n message: `Library \"${library}\" docs access not implemented yet.`\n };\n}\n\n// Helpers\nasync function fileExists(path: string) {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function dirExists(path: string) {\n try {\n const stat = await fs.stat(path);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n","/**\n * Tool: get_pending_tasks\n * \n * Gets tasks from the agent_bridge table that have been APPROVED by the user\n * and are ready for Frank to execute. Also includes update_task_status for \n * marking tasks as EXECUTING or COMPLETED.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PendingTask {\n id: string;\n project_id: string;\n task_id: string | null; // Reference to roadmap_chunks\n status: string;\n objective: string; // Mapped from proposal or roadmap_chunks.title\n technical_context: string; // Mapped from roadmap_chunks.prompt_content\n constraints: string[]; // Extracted from verification_criteria\n definition_of_done: string; // Mapped from verification_criteria\n created_at: string;\n}\n\nexport interface GetPendingTasksResponse {\n success: boolean;\n tasks: PendingTask[];\n message: string;\n}\n\nexport interface UpdateTaskStatusResponse {\n success: boolean;\n task_id: string;\n previous_status: string;\n new_status: string;\n message: string;\n}\n\n// =============================================================================\n// GET PENDING TASKS\n// =============================================================================\n\n/**\n * Fetches tasks that have been APPROVED by the user through the dashboard\n * and are ready for the AI agent (Frank) to execute.\n */\nexport async function getPendingTasks(\n supabase: SupabaseClient,\n projectId: string\n): Promise<GetPendingTasksResponse> {\n\n // Fetch APPROVED tasks that are ready for execution\n const { data: tasks, error } = await supabase\n .from('agent_bridge')\n .select(`\n id,\n project_id,\n task_id,\n status,\n proposal,\n summary,\n created_at,\n roadmap_chunks (\n title,\n prompt_content,\n verification_criteria,\n summary\n )\n `)\n .eq('project_id', projectId)\n .eq('status', 'APPROVED')\n .order('created_at', { ascending: true });\n\n if (error) {\n throw new Error(`Failed to fetch pending tasks: ${error.message}`);\n }\n\n if (!tasks || tasks.length === 0) {\n return {\n success: true,\n tasks: [],\n message: 'No approved tasks waiting for execution. 🎉'\n };\n }\n\n // Transform to the expected format\n const pendingTasks: PendingTask[] = tasks.map((task: any) => {\n const roadmap = task.roadmap_chunks;\n\n // Extract constraints from verification_criteria if available\n let constraints: string[] = [];\n let definitionOfDone = 'Complete the task as described.';\n\n if (roadmap?.verification_criteria) {\n const criteria = roadmap.verification_criteria;\n if (typeof criteria === 'string') {\n definitionOfDone = criteria;\n // Try to extract bullet-point constraints\n constraints = criteria\n .split('\\n')\n .filter((line: string) => line.trim().startsWith('-') || line.trim().startsWith('•'))\n .map((line: string) => line.replace(/^[-•]\\s*/, '').trim());\n } else if (Array.isArray(criteria)) {\n constraints = criteria;\n definitionOfDone = criteria.join('\\n');\n }\n }\n\n return {\n id: task.id,\n project_id: task.project_id,\n task_id: task.task_id,\n status: task.status,\n objective: task.proposal || roadmap?.title || task.summary || 'Unnamed Task',\n technical_context: roadmap?.prompt_content || roadmap?.summary || 'No additional context provided.',\n constraints: constraints,\n definition_of_done: definitionOfDone,\n created_at: task.created_at\n };\n });\n\n return {\n success: true,\n tasks: pendingTasks,\n message: `Found ${pendingTasks.length} approved task(s) ready for execution.`\n };\n}\n\n// =============================================================================\n// UPDATE TASK STATUS\n// =============================================================================\n\n/**\n * Updates the status of an agent_bridge task.\n * Allowed transitions:\n * - APPROVED → EXECUTING (when Frank starts working)\n * - EXECUTING → COMPLETED (when Frank finishes successfully)\n * - EXECUTING → FAILED (if something goes wrong)\n * \n * Also updates the linked roadmap_chunk if the task is COMPLETED.\n */\nexport async function updateTaskStatus(\n supabase: SupabaseClient,\n projectId: string,\n taskId: string,\n newStatus: 'EXECUTING' | 'COMPLETED' | 'FAILED',\n executionSummary?: string\n): Promise<UpdateTaskStatusResponse> {\n\n // 1. Fetch the current task state\n const { data: currentTask, error: fetchError } = await supabase\n .from('agent_bridge')\n .select('status, task_id')\n .eq('id', taskId)\n .eq('project_id', projectId)\n .single();\n\n if (fetchError || !currentTask) {\n throw new Error(`Task not found: ${taskId}`);\n }\n\n const previousStatus = currentTask.status;\n\n // 2. Validate state transition\n const validTransitions: Record<string, string[]> = {\n 'APPROVED': ['EXECUTING'],\n 'EXECUTING': ['COMPLETED', 'FAILED']\n };\n\n if (!validTransitions[previousStatus]?.includes(newStatus)) {\n throw new Error(\n `Invalid status transition: ${previousStatus} → ${newStatus}. ` +\n `Allowed from ${previousStatus}: ${validTransitions[previousStatus]?.join(', ') || 'none'}`\n );\n }\n\n // 3. Build update payload\n const updateData: Record<string, any> = {\n status: newStatus,\n updated_at: new Date().toISOString()\n };\n\n if (newStatus === 'COMPLETED') {\n if (!executionSummary) {\n throw new Error('execution_summary is REQUIRED when setting status to COMPLETED.');\n }\n updateData.execution_summary = executionSummary;\n updateData.completed_at = new Date().toISOString();\n } else if (executionSummary) {\n updateData.summary = executionSummary;\n }\n\n // 4. Update the agent_bridge task\n const { error: updateError } = await supabase\n .from('agent_bridge')\n .update(updateData)\n .eq('id', taskId)\n .eq('project_id', projectId);\n\n if (updateError) {\n throw new Error(`Failed to update task status: ${updateError.message}`);\n }\n\n // 5. If COMPLETED, also mark the roadmap_chunk as COMPLETED\n if (newStatus === 'COMPLETED' && currentTask.task_id) {\n const { error: roadmapError } = await supabase\n .from('roadmap_chunks')\n .update({\n status: 'COMPLETED',\n completed_at: new Date().toISOString()\n })\n .eq('id', currentTask.task_id);\n\n if (roadmapError) {\n console.error(`Warning: Failed to update roadmap_chunk status: ${roadmapError.message}`);\n }\n }\n\n return {\n success: true,\n task_id: taskId,\n previous_status: previousStatus,\n new_status: newStatus,\n message: `Task ${taskId} status updated from ${previousStatus} → ${newStatus}.`\n };\n}\n"],"mappings":"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","names":["fs","path","error","path","fs","path","z","z","fs","path","resolve","taskTitle","fs","path","args"]}