@rigstate/mcp 0.4.2 → 0.4.4

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 (57) hide show
  1. package/.agent/skills/client-side-notification-logger/SKILL.md +139 -0
  2. package/.agent/skills/react-state-counter/SKILL.md +73 -0
  3. package/.agent/skills/rigstate-evolutionary-refactor/SKILL.md +40 -0
  4. package/.agent/skills/rigstate-integrity-gate/SKILL.md +55 -0
  5. package/.agent/skills/rigstate-legacy-renovator/SKILL.md +12 -0
  6. package/.agent/skills/sec-auth-04/SKILL.md +22 -0
  7. package/.agent/skills/sec-key-01/SKILL.md +21 -0
  8. package/.agent/skills/sec-rls-01/SKILL.md +22 -0
  9. package/.agent/skills/sec-sql-01/SKILL.md +23 -0
  10. package/.agent/skills/sec-ui-01/SKILL.md +21 -0
  11. package/.cursor/rules/rigstate-database.mdc +89 -0
  12. package/.cursor/rules/rigstate-guardian.mdc +43 -0
  13. package/.cursor/rules/rigstate-identity.mdc +45 -0
  14. package/.cursor/rules/rigstate-roadmap.mdc +9 -0
  15. package/.cursor/rules/rigstate-workflow.mdc +323 -0
  16. package/.cursorrules +402 -0
  17. package/AGENTS.md +34 -0
  18. package/dist/index.js +2604 -3067
  19. package/dist/index.js.map +1 -1
  20. package/package.json +3 -3
  21. package/roadmap.json +815 -21
  22. package/src/index.ts +16 -1765
  23. package/src/lib/context-engine.ts +85 -0
  24. package/src/lib/curator/actions/fortress.ts +77 -0
  25. package/src/lib/curator/actions/query.ts +73 -0
  26. package/src/lib/curator/actions/stats.ts +70 -0
  27. package/src/lib/curator/actions/submit.ts +190 -0
  28. package/src/lib/curator/index.ts +10 -0
  29. package/src/lib/curator/schemas.ts +37 -0
  30. package/src/lib/schemas.ts +191 -0
  31. package/src/lib/types.ts +102 -261
  32. package/src/server/core.ts +40 -0
  33. package/src/server/factory.ts +78 -0
  34. package/src/server/telemetry.ts +122 -0
  35. package/src/server/types.ts +21 -0
  36. package/src/tools/analyze-database-performance.ts +157 -0
  37. package/src/tools/arch-tools.ts +16 -0
  38. package/src/tools/audit-integrity-gate.ts +166 -0
  39. package/src/tools/check-rules-sync.ts +20 -0
  40. package/src/tools/complete-roadmap-task.ts +88 -31
  41. package/src/tools/curator-tools.ts +74 -0
  42. package/src/tools/get-latest-decisions.ts +23 -1
  43. package/src/tools/get-next-roadmap-step.ts +21 -0
  44. package/src/tools/get-project-context.ts +35 -1
  45. package/src/tools/index.ts +7 -0
  46. package/src/tools/list-features.ts +4 -1
  47. package/src/tools/list-roadmap-tasks.ts +21 -0
  48. package/src/tools/planning-tools.ts +40 -0
  49. package/src/tools/query-brain.ts +25 -1
  50. package/src/tools/run-architecture-audit.ts +23 -0
  51. package/src/tools/save-decision.ts +26 -0
  52. package/src/tools/security-checks.ts +241 -0
  53. package/src/tools/security-tools.ts +88 -18
  54. package/src/tools/submit-idea.ts +25 -0
  55. package/src/tools/sync-ide-rules.ts +35 -3
  56. package/src/tools/teacher-mode.ts +92 -13
  57. package/src/tools/update-roadmap.ts +24 -0
package/dist/index.js.map CHANGED
@@ -1 +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"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/supabase.ts","../src/server/factory.ts","../src/server/types.ts","../src/lib/tool-registry.ts","../src/lib/curator/schemas.ts","../src/lib/curator/actions/query.ts","../src/lib/curator/actions/submit.ts","../src/lib/curator/actions/stats.ts","../src/lib/curator/actions/fortress.ts","../src/tools/curator-tools.ts","../src/tools/teacher-mode.ts","../src/lib/context-engine.ts","../src/lib/schemas.ts","../src/tools/get-project-context.ts","../src/tools/query-brain.ts","../src/tools/get-latest-decisions.ts","../src/tools/save-decision.ts","../src/tools/submit-idea.ts","../src/tools/update-roadmap.ts","../src/tools/run-architecture-audit.ts","../src/tools/sync-ide-rules.ts","../src/tools/list-features.ts","../src/tools/list-roadmap-tasks.ts","../src/tools/get-next-roadmap-step.ts","../src/tools/check-rules-sync.ts","../src/tools/analyze-database-performance.ts","../src/tools/security-checks.ts","../src/tools/security-tools.ts","../src/tools/audit-integrity-gate.ts","../src/tools/complete-roadmap-task.ts","../src/tools/planning-tools.ts","../src/tools/arch-tools.ts","../src/server/core.ts","../src/agents/the-scribe.ts","../src/tools/generate-professional-pdf.ts","../src/server/telemetry.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { authenticateApiKey } from './lib/supabase.js';\nimport { createMcpServer } from './server/factory.js';\nimport { setupToolHandlers } from './server/core.js';\nimport { startFrankWatcher } from './server/telemetry.js';\n\nasync function main() {\n const apiKey = process.env.RIGSTATE_API_KEY;\n\n if (!apiKey) {\n console.error('āŒ RIGSTATE_API_KEY environment variable is required');\n process.exit(1);\n }\n\n // 1. Authenticate\n const authResult = await authenticateApiKey(apiKey);\n if (!authResult.success || !authResult.context) {\n console.error(`āŒ Authentication failed: ${authResult.error}`);\n process.exit(1);\n }\n\n const { supabase, userId } = authResult.context;\n\n // 2. Start Telemetry (Frank Watcher)\n startFrankWatcher(supabase, userId);\n\n // 3. Create Server (Factory)\n const server = createMcpServer();\n\n // 4. Setup Handlers (Core)\n setupToolHandlers(server, { supabase, userId });\n\n // 5. Connect Transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error('šŸ›°ļø Rigstate MCP Server (Evolutionary) running on stdio');\n}\n\nmain().catch((error) => {\n console.error('FATAL ERROR:', error);\n process.exit(1);\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","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { ListToolsRequestSchema, ListResourcesRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { SERVER_NAME, SERVER_VERSION } from './types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { getProjectMorals } from '../resources/project-morals.js';\n\n// Import tool modules to trigger registration\nimport '../tools/curator-tools.js';\nimport '../tools/teacher-mode.js';\nimport '../tools/get-project-context.js';\nimport '../tools/query-brain.js';\nimport '../tools/get-latest-decisions.js';\nimport '../tools/save-decision.js';\nimport '../tools/submit-idea.js';\nimport '../tools/update-roadmap.js';\nimport '../tools/run-architecture-audit.js';\nimport '../tools/sync-ide-rules.ts';\nimport '../tools/list-features.js';\nimport '../tools/list-roadmap-tasks.js';\nimport '../tools/get-next-roadmap-step.js';\nimport '../tools/check-rules-sync.js';\nimport '../tools/audit-integrity-gate.js';\nimport '../tools/complete-roadmap-task.js';\nimport '../tools/planning-tools.js';\nimport '../tools/security-tools.js';\nimport '../tools/arch-tools.js';\n\nexport const TOOLS = [\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_agent_status',\n description: `Checks the status of the internal Frank Watcher agent.`,\n inputSchema: { type: 'object', properties: {} }\n }\n];\n\n\nexport const RESOURCES = [\n {\n uri: 'rigstate://project_morals',\n name: 'Project Morals & Sovereignty',\n mimeType: 'text/markdown',\n description: 'The core ethical and architectural DNA of the project.'\n }\n];\n\nexport function createMcpServer() {\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, resources: {} } }\n );\n\n // List Tools\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [...TOOLS, ...registry.getTools()]\n }));\n\n // List Resources\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: RESOURCES\n }));\n\n return server;\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\n\nexport interface WatcherState {\n isRunning: boolean;\n lastCheck: string | null;\n tasksFound: number;\n projectId: string | null;\n}\n\nexport interface McpServerConfig {\n name: string;\n version: string;\n}\n\nexport const SERVER_NAME = 'rigstate-mcp';\nexport const SERVER_VERSION = '0.5.0'; // Evolutionary Update\n\nexport interface AuthContext {\n supabase: SupabaseClient;\n userId: string;\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 { z } from 'zod';\n\n// ============================================\n// Input Schemas\n// ============================================\n\nexport const QueryGlobalAntidotesSchema = z.object({\n categories: z.array(z.string()).optional().describe('Filter by categories (SECURITY, ARCHITECTURE, UX, PERFORMANCE, ACCESSIBILITY, MAINTAINABILITY)'),\n severities: z.array(z.string()).optional().describe('Filter by severity (CRITICAL, HIGH, MEDIUM, LOW)'),\n framework_tags: z.array(z.string()).optional().describe('Filter by framework tags (e.g., [\"nextjs\", \"react\", \"supabase\"])'),\n min_trust_score: z.number().optional().describe('Minimum trust score (0-100)'),\n search_text: z.string().optional().describe('Search in title and instruction'),\n limit: z.number().optional().describe('Max results (default: 20)')\n});\n\nexport const SubmitSignalSchema = z.object({\n projectId: z.string().describe('The UUID of the Rigstate project'),\n title: z.string().min(10).max(100).describe('Short, descriptive title (10-100 chars)'),\n instruction: z.string().min(50).max(2000).describe('The canonical instruction (50-2000 chars)'),\n category: z.enum(['SECURITY', 'ARCHITECTURE', 'UX', 'PERFORMANCE', 'ACCESSIBILITY', 'MAINTAINABILITY']).describe('The category of this antidote'),\n severity: z.enum(['CRITICAL', 'HIGH', 'MEDIUM', 'LOW']).describe('Severity level'),\n example: z.string().optional().describe('Good example demonstrating the instruction'),\n anti_example: z.string().optional().describe('Bad example showing what NOT to do'),\n framework_tags: z.array(z.string()).optional().describe('Relevant framework tags'),\n reasoning: z.string().optional().describe('Why this signal should be added'),\n source_type: z.string().optional().describe('Internal source type override (e.g. TEACHER_MODE)')\n});\n\nexport const GetCuratorStatsSchema = z.object({\n projectId: z.string().optional().describe('Optional project ID for context')\n});\n\nexport const CheckFortressSchema = z.object({\n projectId: z.string().describe('The UUID of the Rigstate project'),\n instruction: z.string().describe('The instruction to check against fortress rules'),\n category: z.enum(['SECURITY', 'ARCHITECTURE', 'UX', 'PERFORMANCE', 'ACCESSIBILITY', 'MAINTAINABILITY']).describe('Category of instruction')\n});\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { z } from 'zod';\nimport { QueryGlobalAntidotesSchema } from '../schemas.js';\n\n/**\n * Sigrid's Tool: Query Global Antidotes\n * Search and retrieve antidotes from the global registry.\n */\nexport async function queryGlobalAntidotes(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof QueryGlobalAntidotesSchema>\n) {\n let query = supabase\n .from('global_antidotes')\n .select('id, slug, title, instruction, example, anti_example, category, severity, framework_tags, trust_score, occurrence_count, is_immutable')\n .eq('is_active', true);\n\n if (input.categories && input.categories.length > 0) {\n query = query.in('category', input.categories);\n }\n\n if (input.severities && input.severities.length > 0) {\n query = query.in('severity', input.severities);\n }\n\n if (input.framework_tags && input.framework_tags.length > 0) {\n query = query.overlaps('framework_tags', input.framework_tags);\n }\n\n if (input.min_trust_score !== undefined) {\n query = query.gte('trust_score', input.min_trust_score);\n }\n\n if (input.search_text) {\n query = query.or(`title.ilike.%${input.search_text}%,instruction.ilike.%${input.search_text}%`);\n }\n\n const { data, error } = await query\n .order('severity', { ascending: true }) // CRITICAL first\n .order('trust_score', { ascending: false })\n .limit(input.limit || 20);\n\n if (error) throw new Error(`Query failed: ${error.message}`);\n\n if (!data || data.length === 0) {\n return {\n antidotes: [],\n formatted: `=== GLOBAL ANTIDOTES REGISTRY ===\nNo antidotes found matching your criteria.\n================================`\n };\n }\n\n const formatted = data.map((a, i) => {\n const immutableBadge = a.is_immutable ? ' šŸ° FORTRESS' : '';\n const tags = a.framework_tags ? ` [${a.framework_tags.join(', ')}]` : '';\n return `${i + 1}. [${a.severity}] ${a.title}${immutableBadge}\n Category: ${a.category}${tags}\n Trust: ${a.trust_score}/100 | Occurrences: ${a.occurrence_count}\n ${a.instruction.substring(0, 200)}${a.instruction.length > 200 ? '...' : ''}`;\n }).join('\\n\\n');\n\n return {\n antidotes: data,\n formatted: `=== GLOBAL ANTIDOTES REGISTRY ===\nFound ${data.length} antidotes:\n\n${formatted}\n\n================================`\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { z } from 'zod';\nimport { SubmitSignalSchema } from '../schemas.js';\n\n/**\n * Sigrid's Tool: Submit Signal for Curation\n * Submit a new intelligence signal for processing through the curation pipeline.\n */\nexport async function submitSignal(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof SubmitSignalSchema>\n) {\n // 1. Verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', input.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. Simple fingerprint for deduplication check (basic version for MCP)\n const fingerprintBase = `${input.instruction}::${input.category}`.toLowerCase();\n const simpleHash = fingerprintBase.split('').reduce((a, b) => {\n a = ((a << 5) - a) + b.charCodeAt(0);\n return a & a;\n }, 0).toString(16);\n\n // 3. Check for existing similar antidotes\n const { data: existing } = await supabase\n .from('global_antidotes')\n .select('id, slug, title')\n .ilike('instruction', `%${input.instruction.substring(0, 100)}%`)\n .eq('is_active', true)\n .limit(1);\n\n if (existing && existing.length > 0) {\n return handleReinforcement(supabase, existing[0]);\n }\n\n // 4. Check against fortress rules\n const fortressResult = await checkFortressConflicts(supabase, userId, input, simpleHash);\n if (!fortressResult.success) {\n return fortressResult;\n }\n\n // 5. Submit to Quarantine\n return submitToQuarantine(supabase, userId, input, simpleHash);\n}\n\n// Helpers\nasync function handleReinforcement(supabase: SupabaseClient, existing: any) {\n // Signal reinforces existing antidote - update last reinforced timestamp\n await supabase\n .from('global_antidotes')\n .update({ last_reinforced_at: new Date().toISOString() })\n .eq('id', existing.id);\n\n return {\n success: true,\n action: 'reinforced',\n message: `āœ… Signal reinforces existing antidote: \"${existing.title}\" (${existing.slug}).\nThe occurrence count has been increased, boosting the antidote's authority.`,\n antidote_id: existing.id\n };\n}\n\nasync function checkFortressConflicts(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof SubmitSignalSchema>,\n hash: string\n) {\n const fortressKeywords = {\n rls_required: ['disable rls', 'skip rls', 'bypass rls', 'rls off'],\n no_client_secrets: ['api key in client', 'hardcode secret', 'embed api key'],\n input_validation: ['skip validation', 'trust input', 'no validation'],\n auth_required: ['skip auth', 'bypass auth', 'disable auth']\n };\n\n const instructionLower = input.instruction.toLowerCase();\n for (const [rule, keywords] of Object.entries(fortressKeywords)) {\n for (const keyword of keywords) {\n if (instructionLower.includes(keyword)) {\n // Log violation\n await supabase.from('fortress_violations').insert({\n fortress_rule_slug: rule,\n violated_by_signal_hash: hash,\n conflict_type: 'DIRECT_CONTRADICTION',\n severity: 'CRITICAL',\n conflicting_instruction: input.instruction,\n source_user_id: userId,\n source_project_id: input.projectId\n });\n\n return {\n success: false,\n action: 'blocked',\n message: `āŒ FORTRESS VIOLATION: Signal conflicts with immutable rule \"${rule}\".\nThis instruction attempts to weaken a core security principle and has been rejected.\nThe violation has been logged for security audit.`\n };\n }\n }\n }\n return { success: true };\n}\n\nasync function submitToQuarantine(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof SubmitSignalSchema>,\n hash: string\n) {\n // Calculate basic trust score (simplified)\n let trustScore = 50; // Base score\n if (input.example) trustScore += 10;\n if (input.anti_example) trustScore += 10;\n if (input.instruction.length > 100) trustScore += 5;\n if (input.reasoning) trustScore += 5;\n if (input.category === 'SECURITY' && input.severity === 'CRITICAL') trustScore += 10;\n\n // Add to quarantine for human review (signals from MCP always go to quarantine)\n const { data: quarantine, error: quarantineError } = await supabase\n .from('curation_quarantine')\n .insert({\n signal_hash: hash,\n signal_content: {\n title: input.title,\n instruction: input.instruction,\n category: input.category,\n severity: input.severity,\n example: input.example,\n anti_example: input.anti_example,\n framework_tags: input.framework_tags,\n source_type: input.source_type || 'mcp_submission',\n source_context: {\n user_id: userId,\n project_id: input.projectId,\n reasoning: input.reasoning\n }\n },\n trust_score: trustScore,\n trust_breakdown: {\n final_score: trustScore,\n components: {\n completeness: input.example && input.anti_example ? 25 : 15,\n source_trust: 20,\n semantic_quality: 15,\n reinforcement_bonus: 0\n }\n },\n reason: 'MCP_SUBMISSION',\n suggested_action: trustScore >= 70 ? 'APPROVE' : trustScore >= 50 ? 'MERGE' : 'REJECT',\n source_user_id: userId,\n source_project_id: input.projectId\n })\n .select('id')\n .single();\n\n if (quarantineError) throw new Error(`Failed to submit signal: ${quarantineError.message}`);\n\n // Log audit entry\n await supabase.from('curation_audit_log').insert({\n action: 'SIGNAL_SUBMITTED',\n reason: `MCP signal submitted: \"${input.title}\" (trust: ${trustScore})`,\n actor_type: 'SYSTEM',\n actor_id: userId,\n signal_hash: hash,\n quarantine_id: quarantine?.id,\n metadata: { projectId: input.projectId, category: input.category }\n });\n\n return {\n success: true,\n action: 'quarantined',\n trust_score: trustScore,\n quarantine_id: quarantine?.id,\n message: `āœ… Signal submitted for curation.\nTrust Score: ${trustScore}/100\nStatus: QUARANTINED (pending human review)\nSuggested Action: ${trustScore >= 70 ? 'APPROVE' : trustScore >= 50 ? 'MERGE' : 'NEEDS_REVIEW'}\n\nSigrid will process this signal and notify you of the result.`\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { z } from 'zod';\nimport { GetCuratorStatsSchema } from '../schemas.js';\n\n/**\n * Get Curator Statistics\n */\nexport async function getCuratorStats(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof GetCuratorStatsSchema>\n) {\n // Get antidote counts\n const { data: antidotes, count: totalCount } = await supabase\n .from('global_antidotes')\n .select('id, category, severity, is_immutable', { count: 'exact' })\n .eq('is_active', true);\n\n const fortressCount = antidotes?.filter(a => a.is_immutable).length || 0;\n\n // Get quarantine count\n const { count: quarantineCount } = await supabase\n .from('curation_quarantine')\n .select('id', { count: 'exact', head: true })\n .is('decision', null);\n\n // Get today's activity\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const { data: todayActivity } = await supabase\n .from('curation_audit_log')\n .select('action')\n .gte('created_at', today.toISOString());\n\n const activityCounts = todayActivity?.reduce((acc: Record<string, number>, log: any) => {\n acc[log.action] = (acc[log.action] || 0) + 1;\n return acc;\n }, {}) || {};\n\n // Category distribution\n const categoryDistribution = antidotes?.reduce((acc: Record<string, number>, a) => {\n acc[a.category] = (acc[a.category] || 0) + 1;\n return acc;\n }, {}) || {};\n\n return {\n stats: {\n total_antidotes: totalCount || 0,\n fortress_rules: fortressCount,\n pending_quarantine: quarantineCount || 0,\n today_approved: activityCounts['AUTO_APPROVED'] || 0,\n today_rejected: activityCounts['AUTO_REJECTED'] || 0,\n today_quarantined: activityCounts['QUARANTINE_ADDED'] || 0,\n categories: categoryDistribution\n },\n formatted: `=== CURATOR REGISTRY STATS ===\nšŸ“Š Global Antidotes: ${totalCount || 0}\nšŸ° Fortress Rules: ${fortressCount}\nā³ Pending Review: ${quarantineCount || 0}\n\nšŸ“… Today's Activity:\n āœ… Approved: ${activityCounts['AUTO_APPROVED'] || 0}\n āŒ Rejected: ${activityCounts['AUTO_REJECTED'] || 0}\n āøļø Quarantined: ${activityCounts['QUARANTINE_ADDED'] || 0}\n\nšŸ“ By Category:\n${Object.entries(categoryDistribution).map(([cat, count]) => ` • ${cat}: ${count}`).join('\\n')}\n==============================`\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { z } from 'zod';\nimport { CheckFortressSchema } from '../schemas.js';\n\n/**\n * Check instruction against fortress rules\n */\nexport async function checkFortress(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof CheckFortressSchema>\n) {\n // Load fortress rules\n const { data: fortressRules } = await supabase\n .from('global_antidotes')\n .select('slug, title, instruction')\n .eq('is_immutable', true)\n .eq('is_active', true);\n\n if (!fortressRules || fortressRules.length === 0) {\n return {\n passed: true,\n conflicts: [],\n message: 'āœ… No fortress rules configured. Instruction passes by default.'\n };\n }\n\n const conflicts: Array<{ rule: string; title: string; explanation: string }> = [];\n const instructionLower = input.instruction.toLowerCase();\n\n // Conflict patterns (simplified)\n const conflictPatterns: Record<string, RegExp[]> = {\n rls_required: [/disable\\s+r(ow\\s+level\\s+)?s(ecurity)?/i, /skip\\s+rls/i, /bypass\\s+rls/i],\n no_client_secrets: [/api\\s+keys?\\s+in\\s+(frontend|client)/i, /hardcode\\s+secret/i],\n input_validation: [/skip\\s+validation/i, /trust\\s+all\\s+input/i],\n auth_required: [/skip\\s+auth/i, /bypass\\s+auth/i, /disable\\s+auth/i]\n };\n\n for (const rule of fortressRules) {\n const patterns = conflictPatterns[rule.slug];\n if (patterns) {\n for (const pattern of patterns) {\n if (pattern.test(instructionLower)) {\n conflicts.push({\n rule: rule.slug,\n title: rule.title,\n explanation: `Instruction conflicts with fortress rule: ${rule.instruction.substring(0, 100)}...`\n });\n break;\n }\n }\n }\n }\n\n if (conflicts.length > 0) {\n return {\n passed: false,\n conflicts,\n message: `āŒ FORTRESS CONFLICT DETECTED\n\n${conflicts.length} conflict(s) found:\n${conflicts.map((c, i) => `${i + 1}. [${c.rule}] ${c.title}\n ${c.explanation}`).join('\\n\\n')}\n\nāš ļø This instruction cannot be added to the registry as it violates immutable security rules.`\n };\n }\n\n return {\n passed: true,\n conflicts: [],\n message: `āœ… FORTRESS CHECK PASSED\n\nInstruction does not conflict with any fortress rules.\nChecked against ${fortressRules.length} immutable rules.`\n };\n}\n","/**\n * Phase 8.5: The Curator Protocol\n * MCP Tools for Curator Operations\n * \n * Sigrid's Tools for Global Knowledge Curation.\n * These tools enable AI agents to contribute to and query the global antidote registry.\n */\n\nimport { registry } from '../lib/tool-registry.js';\nimport {\n queryGlobalAntidotes,\n submitSignal,\n getCuratorStats,\n checkFortress,\n QueryGlobalAntidotesSchema,\n SubmitSignalSchema,\n GetCuratorStatsSchema,\n CheckFortressSchema\n} from '../lib/curator/index.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'query_global_antidotes',\n description: `Sigrid's Tool: Query the Global Antidotes Registry.\nSearch for cross-platform intelligence signals (antidotes) that encode best practices.\nUse this to find relevant security, architecture, UX, and performance guidelines.`,\n schema: QueryGlobalAntidotesSchema,\n handler: async (args, context) => {\n const result = await queryGlobalAntidotes(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n\nregistry.register({\n name: 'submit_curator_signal',\n description: `Sigrid's Tool: Submit a new signal to the Curator Protocol.\nWhen you discover a best practice or anti-pattern during development, submit it as a signal.\nSignals are processed through a trust-scoring pipeline and may be promoted to global antidotes.\nNote: All submissions go through quarantine for human review.`,\n schema: SubmitSignalSchema,\n handler: async (args, context) => {\n const result = await submitSignal(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nregistry.register({\n name: 'get_curator_stats',\n description: `Get statistics about the Curator Registry.\nShows total antidotes, fortress rules, pending quarantine, and today's curation activity.`,\n schema: GetCuratorStatsSchema,\n handler: async (args, context) => {\n const result = await getCuratorStats(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n\nregistry.register({\n name: 'check_fortress_rules',\n description: `Sigrid's Tool: Check an instruction against Fortress Rules.\nBefore submitting a signal, use this to verify it doesn't conflict with immutable security rules.\nFortress rules can NEVER be overridden by any signal.`,\n schema: CheckFortressSchema,\n handler: async (args, context) => {\n const result = await checkFortress(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\n// Export functions for historical compatibility if any tests use them directly\nexport { queryGlobalAntidotes, submitSignal, getCuratorStats, checkFortress };\n","/**\n * Rigstate MCP Server - Teacher Mode Tools\n * \n * Allows Frank to send logic corrections and fetch learned behaviors.\n */\n\nimport { z } from 'zod';\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { v4 as uuidv4 } from 'uuid';\nimport { registry } from '../lib/tool-registry.js';\nimport { submitSignal } from '../lib/curator/index.js';\n\n// ============================================\n// Schemas\n// ============================================\n\nconst RefineLogicSchema = z.object({\n projectId: z.string().describe('The UUID of the Rigstate project'),\n originalReasoning: z.string().describe('What Frank originally said or did wrong'),\n userCorrection: z.string().describe('How Frank should handle this in the future'),\n scope: z.enum(['project', 'global']).default('project').describe('Whether this correction applies to this project only or all projects (default: project)')\n});\n\nconst GetLearnedInstructionsSchema = z.object({\n projectId: z.string().optional().describe('Optional project ID to include project-specific instructions')\n});\n\n// ============================================\n// Types\n// ============================================\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// Implementation\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 args: z.infer<typeof RefineLogicSchema>\n): Promise<RefineLogicResponse> {\n const { projectId, originalReasoning, userCorrection, scope } = args;\n\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('owner_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 to Raw Memory (ai_instructions)\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\n })\n .select('id')\n .single();\n\n if (insertError) {\n throw new Error(`Failed to save instruction: ${insertError.message}`);\n }\n\n let message = `āœ… Correction saved! Frank will apply this ${scope === 'global' ? 'globally' : 'to this project'}.`;\n\n // Phase 8.5.5 Integration: Global corrections trigger Curator Signal\n if (scope === 'global') {\n try {\n await submitSignal(supabase, userId, {\n projectId,\n title: `Teacher Correction: ${userCorrection.substring(0, 30)}...`,\n instruction: userCorrection,\n category: 'MAINTAINABILITY', // Default\n severity: 'MEDIUM',\n reasoning: `Teacher Mode correction (Trace: ${traceId}). Original reasoning: ${originalReasoning.substring(0, 100)}...`,\n source_type: 'TEACHER_MODE' // Using a tag via reasoning or title since source_type in schema is rigid?\n // actually check schema: framework_tags? No source_type is not in schema input, it's fixed in logic.\n // Wait, submitSignal implementation in curator/index.ts sets source_type: 'mcp_submission'.\n // I will update the reasoning to indicate Teacher Mode.\n });\n message += `\\n\\nšŸ›”ļø CURATOR PROTOCOL: Signal submitted to Sigrid for global verification.`;\n } catch (e: any) {\n console.error('Failed to auto-submit to curator:', e);\n message += `\\n(Note: Failed to submit to curator: ${e.message})`;\n }\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\n };\n}\n\n/**\n * Fetch learned behaviors from the database\n */\nexport async function getLearnedInstructions(\n supabase: SupabaseClient,\n userId: string,\n args: z.infer<typeof GetLearnedInstructionsSchema>\n): Promise<LearnedInstructionsResponse> {\n const { projectId } = args;\n\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: any) => g.instruction);\n\n // Format for context injection\n const instructions = (userInstructions || []).map((i: any) => ({\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: string) => `- ${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: any) => {\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// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\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 schema: RefineLogicSchema,\n handler: async (args, context) => {\n const result = await refineLogic(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nregistry.register({\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 schema: GetLearnedInstructionsSchema,\n handler: async (args, context) => {\n const result = await getLearnedInstructions(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n","/**\n * Phase 8.5.5: Context Engine\n * \n * Bridges the gap between the Curator Database and the Agent's working memory.\n * Performs semantic/keyword lookup to inject relevant rules into the context.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { queryGlobalAntidotes } from './curator/index.js';\n\nexport interface ContextInjectionInput {\n frameworks: string[];\n libraries: string[];\n taskDescription?: string; // Optional: for future task-specific lookup\n}\n\nexport async function injectGlobalContext(\n supabase: SupabaseClient,\n userId: string,\n input: ContextInjectionInput\n): Promise<string> {\n // 1. Identify relevant tags from stack\n const searchTags = [\n ...input.frameworks.map(f => f.split(' ')[0].toLowerCase()),\n ...input.libraries.map(l => l.split(' ')[0].toLowerCase())\n ].filter(Boolean);\n\n // 2. Query Curator for Critical/High severity antidotes matching tags\n // We want HIGH trust items (trust_score >= 80) or IMMUTABLE items.\n // Since queryGlobalAntidotes is a bit generic, we might want a more specialized query here\n // for \"Active Constraints\", but reusing it is a good MVP.\n\n // We fetch ALL Fortress Rules (Immutable) regardless of score/tags? \n // Usually Fortress Rules are universal or highly critical.\n\n const { data: fortressRules } = await supabase\n .from('global_antidotes')\n .select('title, instruction, slug')\n .eq('is_immutable', true)\n .eq('is_active', true);\n\n // Fetch High Trust Contextual Rules\n let contextQuery = supabase\n .from('global_antidotes')\n .select('title, instruction, framework_tags, severity')\n .eq('is_active', true)\n .gte('trust_score', 80) // High trust only\n .eq('is_immutable', false); // Exclude fortress (already fetched)\n\n if (searchTags.length > 0) {\n // PG operator for array overlap: framework_tags && searchTags\n contextQuery = contextQuery.overlaps('framework_tags', searchTags);\n } else {\n // If no tags, maybe just generic ones? Or skip?\n // Let's limit to generic if no tags\n contextQuery = contextQuery.is('framework_tags', null);\n }\n\n const { data: contextualRules } = await contextQuery.limit(5);\n\n // 3. Format Output\n let output = '';\n\n if (fortressRules && fortressRules.length > 0) {\n output += `\\n\\n## šŸ° FORTRESS RULES (NON-NEGOTIABLE)\\n`;\n output += `These rules are immutable and must be followed without exception:\\n`;\n fortressRules.forEach(rule => {\n output += `- **${rule.title}**: ${rule.instruction}\\n`;\n });\n }\n\n if (contextualRules && contextualRules.length > 0) {\n output += `\\n## šŸ›”ļø INTELLIGENT CONTEXT (High Trust Antidotes)\\n`;\n output += `Learned best practices for your stack (${searchTags.join(', ')}):\\n`;\n contextualRules.forEach(rule => {\n output += `- [${rule.severity}] **${rule.title}**: ${rule.instruction}\\n`;\n });\n }\n\n if (!output) {\n output = `\\n(No specific curator context found for stack: ${searchTags.join(', ')})`;\n }\n\n return output;\n}\n","import { z } from 'zod';\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\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\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\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()\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 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'),\n fileTree: z.array(z.string()).describe('File paths')\n});\n\nexport const ImportGhostFeaturesInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n features: z.array(z.any())\n});\n\nexport const AnalyzeDependencyGraphInputSchema = z.object({\n path: z.string().min(1).default('src')\n});\n\nexport const AuditRlsStatusInputSchema = z.object({\n projectId: z.string().uuid().optional()\n});\n\nexport const AuditSecurityIntegrityInputSchema = z.object({\n projectId: z.string().uuid(),\n filePath: z.string().min(1),\n content: z.string().min(1),\n rules: z.array(z.string()).optional()\n});\n\nexport const QueryProjectBrainInputSchema = QueryBrainInputSchema;\n\nexport const FetchPackageHealthInputSchema = z.object({\n packageName: z.string().min(1)\n});\n\nexport const SaveToProjectBrainInputSchema = z.object({\n projectId: z.string().uuid(),\n title: z.string().min(1),\n content: z.string().min(1),\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(),\n chunkId: z.string().uuid(),\n status: z.enum(['TODO', 'IN_PROGRESS', 'COMPLETED'])\n});\n\nexport const AddRoadmapChunkInputSchema = z.object({\n projectId: z.string().uuid(),\n title: z.string().min(1),\n description: z.string().optional(),\n featureId: z.string().optional(),\n priority: z.enum(['LOW', 'MEDIUM', 'HIGH']).default('MEDIUM')\n});\n\nexport const AnalyzeUiComponentInputSchema = z.object({\n filePath: z.string()\n});\n\nexport const ApplyDesignSystemInputSchema = z.object({\n filePath: z.string()\n});\n\nexport const FetchUiLibraryDocsInputSchema = z.object({\n componentName: z.string(),\n library: z.enum(['shadcn', 'lucide']).default('shadcn')\n});\n\nexport const GenerateCursorRulesInputSchema = z.object({\n projectId: z.string().uuid()\n});\n\nexport const AnalyzeDatabasePerformanceInputSchema = z.object({\n projectId: z.string().uuid(),\n filePaths: z.array(z.string())\n});\n\nexport const AuditIntegrityGateInputSchema = z.object({\n projectId: z.string().uuid(),\n filePaths: z.array(z.string()).optional().default([])\n});\n\nexport const CompleteRoadmapTaskInputSchema = z.object({\n projectId: z.string().uuid(),\n summary: z.string().min(1),\n taskId: z.string().uuid().optional(),\n gitDiff: z.string().optional(),\n integrityGate: z.any().optional()\n});\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';\nimport { injectGlobalContext } from '../lib/context-engine.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { GetProjectContextInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'get_project_context',\n description: `Returns the project type, tech stack, and high-level description for a Rigstate project.`,\n schema: GetProjectContextInputSchema,\n handler: async (args, context) => {\n const result = await getProjectContext(context.supabase, context.userId, args.projectId);\n return { content: [{ type: 'text', text: result.summary }] };\n }\n});\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 const response: ProjectContextResponse = {\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 // Phase 8.5.5: Inject Global Context (Curator)\n try {\n const curatorContext = await injectGlobalContext(supabase, userId, {\n frameworks: techStack.framework ? [techStack.framework] : [],\n libraries: techStack.keyLibraries\n });\n\n if (curatorContext) {\n response.summary += `\\n\\n=== CURATOR INTELLIGENCE ===${curatorContext}`;\n }\n } catch (e: any) {\n console.error('Failed to inject global context:', e);\n response.summary += `\\n\\n(Curator Context Unavailable: ${e.message})`;\n }\n\n return response;\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';\nimport { registry } from '../lib/tool-registry.js';\nimport { QueryBrainInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'query_brain',\n description: `Takes a natural language query and performs semantic search\nagainst the project's memories (RAG), returning relevant\narchitecture rules, decisions, and constraints.`,\n schema: QueryBrainInputSchema,\n handler: async (args, context) => {\n const result = await queryBrain(\n context.supabase,\n context.userId,\n args.projectId,\n args.query,\n args.limit,\n args.threshold\n );\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n\n// Simple embedding generation using text normalization\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';\nimport { registry } from '../lib/tool-registry.js';\nimport { GetLatestDecisionsInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'get_latest_decisions',\n description: `Fetches the most recent ADRs and decisions from The Council,\nincluding active roadmap steps and council session feedback.`,\n schema: GetLatestDecisionsInputSchema,\n handler: async (args, context) => {\n const result = await getLatestDecisions(\n context.supabase,\n context.userId,\n args.projectId,\n args.limit\n );\n return { content: [{ type: 'text', text: result.summary }] };\n }\n});\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: (Array.isArray(s.feedback_summary) ? 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 * Tool: save_decision\n * \n * Saves a new decision/ADR to the project's brain (project_memories).\n * High-importance memory for architectural decisions.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { SaveDecisionResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { SaveDecisionInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'save_decision',\n description: `Saves a new decision/ADR to the project's brain (project_memories).\nHigh-importance memory for architectural decisions.`,\n schema: SaveDecisionInputSchema,\n handler: async (args, context) => {\n const result = await saveDecision(\n context.supabase,\n context.userId,\n args.projectId,\n args.title,\n args.decision,\n args.rationale,\n args.category,\n args.tags\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport async function saveDecision(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n title: string,\n decision: string,\n rationale?: string,\n category: string = 'decision',\n tags: string[] = []\n): Promise<SaveDecisionResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\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 // Build the full content with title, decision, and rationale\n const contentParts = [`# ${title}`, '', decision];\n if (rationale) {\n contentParts.push('', '## Rationale', rationale);\n }\n const fullContent = contentParts.join('\\n');\n\n // Build summary (truncated version for quick context)\n const summary = decision.length > 150\n ? decision.substring(0, 147) + '...'\n : decision;\n\n // Insert the memory with high importance (ADR = 9/10)\n const { data: memory, error: insertError } = await supabase\n .from('project_memories')\n .insert({\n project_id: projectId,\n content: fullContent,\n summary: summary,\n category: category,\n tags: ['ADR', ...tags],\n importance: 9, // High importance for decisions\n source_type: 'mcp', // Track source as MCP\n is_active: true\n })\n .select('id')\n .single();\n\n if (insertError) {\n // Handle specific database errors\n if (insertError.code === '23503') {\n throw new Error('Project no longer exists');\n }\n if (insertError.code === '42501') {\n throw new Error('Permission denied: Cannot write to this project');\n }\n throw new Error(`Failed to save decision: ${insertError.message}`);\n }\n\n return {\n success: true,\n memoryId: memory.id,\n message: `āœ… Decision \"${title}\" saved to project \"${project.name}\" with importance 9/10`\n };\n}\n","/**\n * Tool: submit_idea\n * \n * Submits a new idea to the Idea Lab (saved_ideas table).\n * Ideas can later be reviewed, analyzed, and promoted to features.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { SubmitIdeaResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { SubmitIdeaInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'submit_idea',\n description: `Submits a new idea to the Idea Lab (saved_ideas table).\nIdeas can later be reviewed, analyzed, and promoted to features.`,\n schema: SubmitIdeaInputSchema,\n handler: async (args, context) => {\n const result = await submitIdea(\n context.supabase,\n context.userId,\n args.projectId,\n args.title,\n args.description,\n args.category,\n args.tags\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport async function submitIdea(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n title: string,\n description: string,\n category: string = 'feature',\n tags: string[] = []\n): Promise<SubmitIdeaResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\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 // Insert the idea into saved_ideas\n const { data: idea, error: insertError } = await supabase\n .from('saved_ideas')\n .insert({\n project_id: projectId,\n title: title,\n description: description,\n category: category,\n tags: ['mcp', ...tags],\n status: 'draft', // Start as draft for review\n // No session_id since this comes from MCP, not a lab session\n })\n .select('id')\n .single();\n\n if (insertError) {\n // Handle specific database errors\n if (insertError.code === '23503') {\n throw new Error('Project no longer exists');\n }\n if (insertError.code === '42501') {\n throw new Error('Permission denied: Cannot write to this project');\n }\n if (insertError.code === '23505') {\n throw new Error('An idea with this title already exists');\n }\n throw new Error(`Failed to submit idea: ${insertError.message}`);\n }\n\n return {\n success: true,\n ideaId: idea.id,\n message: `šŸ’” Idea \"${title}\" submitted to Idea Lab for project \"${project.name}\". Status: Draft (awaiting review)`\n };\n}\n","/**\n * Tool: update_roadmap\n * \n * Updates the status of a roadmap chunk (step).\n * Can search by chunk ID or by title.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { UpdateRoadmapResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { UpdateRoadmapInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'update_roadmap',\n description: `Updates the status of a roadmap chunk (step).\nCan search by chunk ID or by title.`,\n schema: UpdateRoadmapInputSchema,\n handler: async (args, context) => {\n const result = await updateRoadmap(\n context.supabase,\n context.userId,\n args.projectId,\n args.status,\n args.chunkId,\n args.title\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport async function updateRoadmap(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n status: 'LOCKED' | 'ACTIVE' | 'COMPLETED',\n chunkId?: string,\n title?: string\n): Promise<UpdateRoadmapResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\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 // Find the roadmap chunk\n let targetChunk: { id: string; title: string; status: string } | null = null;\n\n if (chunkId) {\n // Search by ID\n const { data, error } = await supabase\n .from('roadmap_chunks')\n .select('id, title, status')\n .eq('id', chunkId)\n .eq('project_id', projectId)\n .single();\n\n if (error || !data) {\n throw new Error(`Roadmap step with ID \"${chunkId}\" not found`);\n }\n targetChunk = data;\n } else if (title) {\n // Search by title (fuzzy match using ilike)\n const { data, error } = await supabase\n .from('roadmap_chunks')\n .select('id, title, status')\n .eq('project_id', projectId)\n .ilike('title', `%${title}%`)\n .limit(1)\n .single();\n\n if (error || !data) {\n throw new Error(`Roadmap step matching \"${title}\" not found`);\n }\n targetChunk = data;\n } else {\n throw new Error('Either chunkId or title must be provided');\n }\n\n const previousStatus = targetChunk.status;\n\n // Don't update if status is the same\n if (previousStatus === status) {\n return {\n success: true,\n chunkId: targetChunk.id,\n previousStatus,\n newStatus: status,\n message: `ā„¹ļø Roadmap step \"${targetChunk.title}\" is already ${status}`\n };\n }\n\n // Update the status\n const { error: updateError } = await supabase\n .from('roadmap_chunks')\n .update({ status })\n .eq('id', targetChunk.id);\n\n if (updateError) {\n if (updateError.code === '42501') {\n throw new Error('Permission denied: Cannot update this roadmap');\n }\n throw new Error(`Failed to update roadmap: ${updateError.message}`);\n }\n\n // Build status transition message\n const statusEmoji: Record<string, string> = {\n 'LOCKED': 'šŸ”’',\n 'ACTIVE': '🚧',\n 'COMPLETED': 'āœ…'\n };\n\n return {\n success: true,\n chunkId: targetChunk.id,\n previousStatus,\n newStatus: status,\n message: `${statusEmoji[status]} Roadmap step \"${targetChunk.title}\" updated: ${previousStatus} → ${status}`\n };\n}\n","/**\n * Tool: run_architecture_audit\n * \n * Audits code against project memories and architecture rules.\n * Returns violations or \"Pass\" status.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { ArchitectureAuditResponse, AuditViolation } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { RunArchitectureAuditInputSchema } from '../lib/schemas.js';\n\n// Vulnerability patterns for static analysis\nconst VULNERABILITY_PATTERNS: {\n type: string;\n severity: 'LOW' | 'MEDIUM' | 'HIGH';\n patterns: RegExp[];\n title: string;\n description: string;\n recommendation: string;\n}[] = [\n {\n type: 'SQL_INJECTION',\n severity: 'HIGH',\n patterns: [\n /\\$queryRaw\\s*`[^`]*\\$\\{/gi,\n /execute\\s*\\(\\s*[`'\"][^`'\"]*\\$\\{/gi,\n /query\\s*\\(\\s*[`'\"][^`'\"]*\\+/gi,\n ],\n title: 'Potential SQL Injection',\n description: 'String interpolation in raw SQL queries can lead to SQL injection.',\n recommendation: 'Use parameterized queries or prepared statements instead of string interpolation.'\n },\n {\n type: 'XSS',\n severity: 'HIGH',\n patterns: [\n /dangerouslySetInnerHTML\\s*=\\s*\\{\\s*\\{\\s*__html\\s*:/gi,\n /innerHTML\\s*=/gi,\n ],\n title: 'Potential XSS Vulnerability',\n description: 'Using dangerouslySetInnerHTML or innerHTML can expose your app to XSS attacks.',\n recommendation: 'Sanitize HTML content using a library like DOMPurify before rendering.'\n },\n {\n type: 'SECRETS_LEAK',\n severity: 'HIGH',\n patterns: [\n /['\"]sk_live_[a-zA-Z0-9]{20,}['\"]/gi,\n /['\"]sk_test_[a-zA-Z0-9]{20,}['\"]/gi,\n /api[_-]?key\\s*[:=]\\s*['\"][^'\"]{20,}['\"]/gi,\n /password\\s*[:=]\\s*['\"][^'\"]+['\"]/gi,\n ],\n title: 'Potential Secret Leak',\n description: 'Hardcoded secrets or API keys detected in source code.',\n recommendation: 'Use environment variables for secrets. Never commit credentials to version control.'\n },\n {\n type: 'UNVALIDATED_INPUT',\n severity: 'MEDIUM',\n patterns: [\n /['\"]use server['\"]\\s*[\\s\\S]*?export\\s+async\\s+function\\s+\\w+\\s*\\([^)]*:\\s*any\\)/gi,\n ],\n title: 'Unvalidated Server Action Input',\n description: 'Server action accepts untyped input, which may lead to injection attacks.',\n recommendation: 'Add Zod schema validation at the start of your server action.'\n },\n {\n type: 'MISSING_AUTH',\n severity: 'MEDIUM',\n patterns: [\n /export\\s+async\\s+function\\s+(GET|POST|PUT|DELETE|PATCH)\\s*\\([^)]*\\)\\s*\\{[^}]*(?!auth|session|getUser)/gi,\n ],\n title: 'Potentially Missing Authentication',\n description: 'API route handler may not be checking authentication.',\n recommendation: 'Add authentication check at the start of your API handler.'\n }\n ];\n\nfunction extractLineNumber(content: string, match: RegExpMatchArray): number {\n const upToMatch = content.substring(0, match.index || 0);\n return (upToMatch.match(/\\n/g) || []).length + 1;\n}\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'run_architecture_audit',\n description: `Audits code against project memories and architecture rules.\nReturns violations or \"Pass\" status.`,\n schema: RunArchitectureAuditInputSchema,\n handler: async (args, context) => {\n const result = await runArchitectureAudit(\n context.supabase,\n context.userId,\n args.projectId,\n args.filePath,\n args.content\n );\n return { content: [{ type: 'text', text: result.summary }] };\n }\n});\n\nexport async function runArchitectureAudit(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n filePath: string,\n content: string\n): Promise<ArchitectureAuditResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\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 const violations: AuditViolation[] = [];\n\n // Run static pattern analysis\n for (const pattern of VULNERABILITY_PATTERNS) {\n for (const regex of pattern.patterns) {\n const matches = content.matchAll(new RegExp(regex.source, regex.flags));\n for (const match of matches) {\n const lineNumber = extractLineNumber(content, match);\n violations.push({\n type: pattern.type,\n severity: pattern.severity,\n title: pattern.title,\n description: pattern.description,\n lineNumber,\n recommendation: pattern.recommendation\n });\n }\n }\n }\n\n // Fetch project memories for context-aware checks\n const { data: memories } = await supabase\n .from('project_memories')\n .select('content, category, tags')\n .eq('project_id', projectId)\n .eq('is_active', true)\n .in('category', ['constraint', 'architecture', 'tech_stack', 'decision'])\n .order('importance', { ascending: false })\n .limit(10);\n\n // Check against project constraints\n if (memories && memories.length > 0) {\n for (const memory of memories) {\n // Check for common constraint patterns\n const lowerContent = content.toLowerCase();\n const lowerMemory = memory.content.toLowerCase();\n\n // Check \"never use X\" patterns\n const neverMatch = lowerMemory.match(/never\\s+use\\s+(\\w+)/i);\n if (neverMatch && lowerContent.includes(neverMatch[1])) {\n violations.push({\n type: 'CONSTRAINT_VIOLATION',\n severity: 'MEDIUM',\n title: 'Project Constraint Violation',\n description: `Code may violate project constraint: \"${memory.content.substring(0, 100)}...\"`,\n recommendation: 'Review the project brain for architectural constraints.'\n });\n }\n\n // Check \"always use X\" patterns\n const alwaysMatch = lowerMemory.match(/always\\s+use\\s+(\\w+)/i);\n if (alwaysMatch && !lowerContent.includes(alwaysMatch[1])) {\n violations.push({\n type: 'CONSTRAINT_VIOLATION',\n severity: 'LOW',\n title: 'Missing Required Pattern',\n description: `Code may be missing required pattern: \"${memory.content.substring(0, 100)}...\"`,\n recommendation: 'Check if this file should follow the project standard.'\n });\n }\n }\n }\n\n // Calculate score (100 - penalties)\n let score = 100;\n for (const v of violations) {\n if (v.severity === 'HIGH') score -= 25;\n else if (v.severity === 'MEDIUM') score -= 10;\n else score -= 5;\n }\n score = Math.max(0, score);\n\n // Build summary\n const passed = violations.length === 0;\n let summary: string;\n\n if (passed) {\n summary = `āœ… PASSED - No violations found in ${filePath}\\nScore: ${score}/100`;\n } else {\n const highCount = violations.filter(v => v.severity === 'HIGH').length;\n const medCount = violations.filter(v => v.severity === 'MEDIUM').length;\n const lowCount = violations.filter(v => v.severity === 'LOW').length;\n\n summary = `āš ļø AUDIT FAILED - ${violations.length} violation(s) found in ${filePath}\nScore: ${score}/100\n• HIGH: ${highCount}\n• MEDIUM: ${medCount}\n• LOW: ${lowCount}\n\nViolations:\n${violations.map((v, i) => `${i + 1}. [${v.severity}] ${v.title}${v.lineNumber ? ` (line ${v.lineNumber})` : ''}\n ${v.description}\n → ${v.recommendation}`).join('\\n\\n')}`;\n }\n\n return {\n passed,\n score,\n violations,\n summary\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';\nimport { registry } from '../lib/tool-registry.js';\nimport { GenerateCursorRulesInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'sync_ide_rules',\n description: `Generates the appropriate rules file content (e.g. .cursorrules, .windsurfrules) \nbased on project context and user settings.`,\n schema: GenerateCursorRulesInputSchema,\n handler: async (args, context) => {\n const result = await syncIdeRules(context.supabase, args.projectId);\n\n // Format response: Main file content + information about modular files\n let responseText = `FileName: ${result.fileName}\\n\\nContent:\\n${result.content}`;\n\n if (result.files && result.files.length > 0) {\n responseText += `\\n\\n--- MODULAR FILES GENERATED (${result.files.length}) ---\\n`;\n responseText += result.files.map(f => `- ${f.path}`).join('\\n');\n responseText += `\\n\\nNote: Please ensure these modular files are also updated if your IDE is following the V3 Rules standard.`;\n }\n\n return { content: [{ type: 'text', text: responseText }] };\n }\n});\n\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, dbMetadataRes] = 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 supabase.rpc('get_table_metadata')\n ]);\n\n const databaseMetadata = dbMetadataRes.data || [];\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 databaseMetadata\n );\n\n return {\n fileName: getFileNameForIDE(ide),\n content,\n files: fileResult.files\n };\n}\n\n","import { z } from 'zod';\nimport { ToolDefinition, registry } 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\nregistry.register(listFeaturesTool);\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';\nimport { registry } from '../lib/tool-registry.js';\nimport { ListRoadmapTasksInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'list_roadmap_tasks',\n description: `Lists all actionable tasks for a project that are not yet COMPLETED.\nShows active and locked steps with their step numbers.`,\n schema: ListRoadmapTasksInputSchema,\n handler: async (args, context) => {\n const result = await listRoadmapTasks(\n context.supabase,\n context.userId,\n args.projectId\n );\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\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';\nimport { registry } from '../lib/tool-registry.js';\nimport { GetNextRoadmapStepInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'get_next_roadmap_step',\n description: `Fetches the next logical step from the roadmap for a project. \nUseful for transitioning between tasks.`,\n schema: GetNextRoadmapStepInputSchema,\n handler: async (args, context) => {\n const result = await getNextRoadmapStep(\n context.supabase,\n args.projectId,\n args.currentStepId\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\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';\nimport { CheckRulesSyncResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { CheckRulesSyncInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'check_rules_sync',\n description: `Verifies if the IDE rules are present and belong to the correct project.`,\n schema: CheckRulesSyncInputSchema,\n handler: async (args, context) => {\n const result = await checkRulesSync(\n context.supabase,\n args.projectId,\n args.currentRulesContent\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\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","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nexport interface AnalyzeDatabasePerformanceInput {\n projectId: string;\n filePaths: string[];\n}\n\ninterface PerformanceIssue {\n type: 'MISSING_INDEX' | 'N_PLUS_ONE' | 'UNOPTIMIZED_FILTER' | 'DEAD_TABLE';\n severity: 'HIGH' | 'MEDIUM' | 'LOW';\n file: string;\n line?: number;\n description: string;\n suggestion: string;\n codeSnippet?: string;\n}\n\ninterface TableMetadata {\n table_name: string;\n indexed_columns: string[];\n foreign_keys: { column: string, target_table: string }[];\n}\n\nexport async function analyzeDatabasePerformance(\n supabase: SupabaseClient,\n input: AnalyzeDatabasePerformanceInput\n): Promise<{ issues: PerformanceIssue[], summary: string }> {\n const issues: PerformanceIssue[] = [];\n\n // 1. Fetch Database Metadata\n const { data: rawMetadata, error } = await supabase.rpc('get_table_metadata', {\n p_project_id: input.projectId\n });\n\n if (error) {\n throw new Error(`Failed to fetch database metadata: ${error.message}`);\n }\n\n const metadata: TableMetadata[] = rawMetadata.map((t: any) => ({\n table_name: t.t_name || t.table_name,\n indexed_columns: t.indexed_columns || [],\n foreign_keys: t.foreign_keys || []\n }));\n\n // Map for quick lookup\n const tableMap = new Map<string, TableMetadata>();\n metadata.forEach(t => tableMap.set(t.table_name, t));\n\n // 2. Analyze Code Files\n for (const filePath of input.filePaths) {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n // --- ANALYSIS PATTERNS ---\n\n // A. Detect N+1 Danger Zones (Loops with Await)\n // Regex: .map(async ... await ... from('...'))\n // This is complex for regex, using simple line heuristics\n // If line contains 'await supabase' AND is inside a .map() block? Hard to detect scope.\n // Simplified: If we see `await supabase` inside a loop structure in the same snippet?\n // Let's stick to \"Single Line Heuristics\" for MVP robustness.\n\n // B. Detect Unindexed Filters\n // Pattern: .eq('column', val) or .filter('column', ...)\n // We need to know WHICH table is being queried.\n // Look for `from('tableName')` then track subsequent `.eq('col')`?\n // AST would be better, but regex state machine is feasible for simple chains.\n\n let currentTable: string | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // 1. Identify Table Context\n const fromMatch = line.match(/\\.from\\(['\"]([a-zA-Z0-9_]+)['\"]\\)/);\n if (fromMatch) {\n currentTable = fromMatch[1];\n }\n\n // Reset table context on semicolon (end of chain) mostly\n if (line.includes(';')) {\n currentTable = null; // Conservative reset\n }\n\n // 2. Check for Missing Indexes\n if (currentTable) {\n const eqMatch = line.match(/\\.(eq|match|not|gt|gte|lt|lte|like|ilike)\\(['\"]([a-zA-Z0-9_]+)['\"]/);\n if (eqMatch) {\n const colName = eqMatch[2];\n const tableMeta = tableMap.get(currentTable);\n\n if (tableMeta) {\n // Check if column is indexed\n // Note: Primary keys are usually indexed automatically, but get_table_metadata might typically return explicit indexes.\n // We should check if it's 'id' (usually PK) or in indexed_columns.\n const isIndexed = tableMeta.indexed_columns.includes(colName) || colName === 'id';\n const isForeignKey = tableMeta.foreign_keys.some(fk => fk.column === colName);\n\n if (!isIndexed) {\n issues.push({\n type: 'MISSING_INDEX',\n severity: isForeignKey ? 'HIGH' : 'MEDIUM', // Unindexed Foreign Keys are deadly\n file: filePath,\n line: i + 1,\n description: `Query filters on unindexed column '${colName}' in table '${currentTable}'.`,\n suggestion: `Create an index for '${currentTable}(${colName})'.`,\n codeSnippet: line.trim()\n });\n }\n }\n }\n }\n\n // 3. Check for N+1 (Crudely)\n if (line.includes('await supabase') && (line.includes('.map(') || lines[i - 1]?.includes('.map('))) {\n issues.push({\n type: 'N_PLUS_ONE',\n severity: 'HIGH',\n file: filePath,\n line: i + 1,\n description: `Potential N+1 Query detected. Await inside loop/map.`,\n suggestion: `Use Promise.all() or .in() operator instead of looping queries.`,\n codeSnippet: line.trim()\n });\n }\n }\n\n } catch (e) {\n console.warn(`Skipping file ${filePath}: ${e}`);\n }\n }\n\n // 3. Summary Report\n const highSev = issues.filter(i => i.severity === 'HIGH').length;\n const medSev = issues.filter(i => i.severity === 'MEDIUM').length;\n\n let summary = `## šŸ” Performance Audit Report\\n`;\n summary += `**Scanned Files:** ${input.filePaths.length}\\n`;\n summary += `**Issues Found:** ${issues.length} (šŸ”“ ${highSev} High, 🟔 ${medSev} Medium)\\n\\n`;\n\n if (issues.length === 0) {\n summary += `āœ… **Clean Scan:** No obvious performance bottlenecks detected based on current schema constraints.`;\n } else {\n summary += `### 🚨 Critical Findings\\n`;\n issues.filter(i => i.severity === 'HIGH').forEach(issue => {\n summary += `- **${issue.type}** in \\`${path.basename(issue.file)}:${issue.line}\\`\\n`;\n summary += ` - ${issue.description}\\n`;\n summary += ` - šŸ’” *Fix:* ${issue.suggestion}\\n`;\n });\n }\n\n return { issues, summary };\n}\n","\nexport interface SecurityViolation {\n id: string;\n type: string;\n severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'FATAL';\n title: string;\n description: string;\n recommendation: string;\n}\n\n/**\n * Checks for SQL Injection Vulnerabilities (SEC-SQL-01)\n */\nexport function checkSqlInjection(content: string): SecurityViolation | null {\n const sqlKeywords = ['from', 'select', 'insert', 'update', 'delete', 'rpc', 'execute', 'query'];\n const hasSqlKeywords = sqlKeywords.some(kw => content.toLowerCase().includes(kw));\n\n if (hasSqlKeywords) {\n const interpolationRegex = /`[^`]*\\${[^`]*`|['\"][^'\"]*\\$\\{[^'\"]*['\"]/;\n if (interpolationRegex.test(content)) {\n return {\n id: 'SEC-SQL-01',\n type: 'SQL_INJECTION',\n severity: 'HIGH',\n title: 'Potential SQL Injection (Dynamic String)',\n description: 'Detected dynamic string building in a context containing SQL keywords.',\n recommendation: 'Use prepared statements or the project-standard query builder. Never interpolate user input directly.'\n };\n }\n }\n return null;\n}\n\n/**\n * Checks for RLS in Migrations (SEC-RLS-01)\n */\nexport function checkRlsInMigration(filePath: string, content: string): SecurityViolation | null {\n if (filePath.includes('supabase/migrations/') && filePath.endsWith('.sql')) {\n const hasCreateTable = /CREATE\\s+TABLE/i.test(content);\n const hasEnableRls = /ENABLE\\s+ROW\\s+LEVEL\\s+SECURITY/i.test(content);\n\n if (hasCreateTable && !hasEnableRls) {\n return {\n id: 'SEC-RLS-01',\n type: 'DB_INTEGRITY',\n severity: 'HIGH',\n title: 'Missing Row Level Security (RLS)',\n description: 'Migration creates a table but does not enable RLS.',\n recommendation: 'Add ALTER TABLE \"public\".\"your_table\" ENABLE ROW LEVEL SECURITY; for every new table.'\n };\n }\n }\n return null;\n}\n\n/**\n * Checks for Hardcoded Secrets (SEC-KEY-01)\n */\nexport function checkHardcodedSecrets(filePath: string, content: string): SecurityViolation[] {\n const violations: SecurityViolation[] = [];\n const keyPatterns = [\n { pattern: /sk_live_[a-zA-Z0-9]{20,}/, name: 'Stripe Secret Key' },\n { pattern: /sb_publishable_[a-zA-Z0-9]{20,}/, name: 'Supabase Publishable Key' },\n { pattern: /AIza[0-9A-Za-z\\\\-_]{35}/, name: 'Google API Key' },\n { pattern: /\"([^\"]*(?:password|secret|key|token)[^\"]*)\"\\s*:\\s*\"[^\"]{10,}\"/i, name: 'Generic Secret' }\n ];\n\n for (const p of keyPatterns) {\n if (p.pattern.test(content) && !filePath.includes('.env')) {\n violations.push({\n id: 'SEC-KEY-01',\n type: 'SECRET_LEAKAGE',\n severity: 'FATAL',\n title: `Hardcoded Secret Detected (${p.name})`,\n description: `Found a potential secret or API key hardcoded in the source file.`,\n recommendation: 'Move all secrets to environment variables (.env.local) and use process.env.'\n });\n }\n }\n return violations;\n}\n\n/**\n * Checks for XSS Vulnerabilities (SEC-UI-01)\n */\nexport function checkXss(content: string): SecurityViolation | null {\n if (content.includes('dangerouslySetInnerHTML')) {\n return {\n id: 'SEC-UI-01',\n type: 'XSS_VULNERABILITY',\n severity: 'MEDIUM',\n title: 'Dangerous HTML Rendering',\n description: 'Detected use of dangerouslySetInnerHTML which can lead to XSS.',\n recommendation: 'Sanitize content with DOMPurify or use safer rendering methods.'\n };\n }\n return null;\n}\n\n/**\n * Checks for strict identity isolation (SEC-AUTH-04)\n */\nexport function checkIdentityIsolation(filePath: string, content: string): SecurityViolation | null {\n if ((filePath.includes('app/api/') || filePath.includes('actions/')) && (content.includes('supabase.from') || content.includes('db.select'))) {\n const hasOwnerFilter = /\\.eq\\(['\"](owner_id|user_id)['\"],/.test(content);\n if (!hasOwnerFilter) {\n return {\n id: 'SEC-AUTH-04',\n type: 'ISOLATION_FAILURE',\n severity: 'HIGH',\n title: 'Missing Identity Filter',\n description: 'Data query lacks a user_id or owner_id filter. Required for multi-tenancy isolation.',\n recommendation: 'Always filter tenant-specific data using .eq(\"owner_id\", userId).'\n };\n }\n }\n return null;\n}\n\n// ... Additional checks for Phase 7.4 rules ...\n\nexport function checkSensitiveLogging(content: string): SecurityViolation | null {\n if (content.includes('console.log') && (content.includes('env') || content.includes('process.env') || content.includes('password') || content.includes('user'))) {\n return {\n id: 'SEC-LOG-01',\n type: 'PII_LEAKAGE',\n severity: 'MEDIUM',\n title: 'Potential Log Leakage',\n description: 'Detected console.log of potentially sensitive objects (user, env, password).',\n recommendation: 'Use a structured logger and ensure sensitive fields are redacted before logging.'\n };\n }\n return null;\n}\n\nexport function checkRbac(filePath: string, content: string): SecurityViolation | null {\n if ((filePath.includes('app/api/') || filePath.includes('actions/')) && !content.includes('role') && !content.includes('permission') && !content.includes('isAdmin')) {\n return {\n id: 'SEC-RBAC-01',\n type: 'AUTHORIZATION_GATHERING',\n severity: 'MEDIUM',\n title: 'Missing RBAC Check',\n description: 'Route/Action seems to lack explicit role or permission-based access control.',\n recommendation: 'Verify user roles (e.g., admin, editor) before granting access to sensitive endpoints.'\n };\n }\n return null;\n}\n\nexport function checkInputValidation(filePath: string, content: string): SecurityViolation | null {\n if ((filePath.includes('app/api/') || filePath.includes('actions/')) && !content.includes('z.object') && !content.includes('parse')) {\n if (content.includes('.update(') || content.includes('.insert(')) {\n return {\n id: 'SEC-VAL-01',\n type: 'INPUT_VALIDATION',\n severity: 'HIGH',\n title: 'Missing Input Validation',\n description: 'Database mutation detected without Zod schema validation.',\n recommendation: 'Use Zod to validate all incoming data before passing it to the database.'\n };\n }\n }\n return null;\n}\n\nexport function checkCleanFailures(content: string): SecurityViolation | null {\n const errorLeakageRegex = /(?:res\\..*(?:error|message|status).*\\.message)|(?:throw new Error\\(.*\\.message\\))/;\n if (errorLeakageRegex.test(content) && content.includes('catch')) {\n return {\n id: 'SEC-ERR-01',\n type: 'ERROR_EXPOSURE',\n severity: 'MEDIUM',\n title: 'Raw Database Error Leakage',\n description: 'Detected raw error messages being sent/thrown to the client.',\n recommendation: 'Catch errors and return standardized, non-technical messages to the frontend.'\n };\n }\n return null;\n}\n\nexport function checkDependencies(filePath: string, content: string): SecurityViolation | null {\n if (filePath.endsWith('package.json')) {\n if (content.includes('\"*') || content.includes('\"latest\"')) {\n return {\n id: 'SEC-DEPS-01',\n type: 'DEPENDENCY_BLOAT',\n severity: 'HIGH',\n title: 'Unpinned Dependencies',\n description: 'package.json contains unpinned or \"latest\" versions.',\n recommendation: 'Always pin dependencies to specific versions for reproducibility and security.'\n };\n }\n }\n return null;\n}\n\n// ... Anti-Lazy checks ...\n\nexport function checkAntiLazy(filePath: string, content: string): SecurityViolation[] {\n const violations: SecurityViolation[] = [];\n\n // SEC-LAZY-01: No 'any'\n const anyRegex = /: any([,\\s)\\]\\}]|$)/g;\n if (anyRegex.test(content) && !filePath.includes('node_modules')) {\n violations.push({\n id: 'SEC-LAZY-01',\n type: 'TYPE_LAZINESS',\n severity: 'HIGH',\n title: 'Use of \"any\" Type detected',\n description: 'Detected use of the \"any\" type, which bypasses the TypeSytem safety checks.',\n recommendation: 'Replace \"any\" with a specific interface, type, or \"unknown\" with proper narrowing.'\n });\n }\n\n // SEC-LAZY-02: No empty catch\n const emptyCatchRegex = /catch\\s*\\([^)]*\\)\\s*{\\s*}/g;\n if (emptyCatchRegex.test(content)) {\n violations.push({\n id: 'SEC-LAZY-02',\n type: 'ERROR_SWALLOWING',\n severity: 'HIGH',\n title: 'Empty Catch Block detected',\n description: 'Detected a catch block that swallows errors without logging or handling them.',\n recommendation: 'Always log the error or handle it. Never leave a catch block empty.'\n });\n }\n\n // SEC-LAZY-03: No TODOs\n if (content.includes('TODO') || content.includes('FIXME')) {\n violations.push({\n id: 'SEC-LAZY-03',\n type: 'INCOMPLETE_WORK',\n severity: 'MEDIUM',\n title: 'Technical Debt remnant (TODO/FIXME)',\n description: 'Detected TODO or FIXME comments in a file being evaluated for completion.',\n recommendation: 'Resolve the task fully or move the TODO to the project roadmap before committing.'\n });\n }\n\n return violations;\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { AuditRlsStatusInput } from '../lib/types.js';\nimport * as Checks from './security-checks.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { AuditRlsStatusInputSchema, AuditSecurityIntegrityInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'audit_rls_status',\n description: `Sven's Tool: Security Shield. Audits the database to ensure Row Level Security (RLS) is enforced.`,\n schema: AuditRlsStatusInputSchema,\n handler: async (args, context) => {\n const result = await auditRlsStatus(context.supabase, args);\n return { content: [{ type: 'text', text: result.summary || 'No summary available' }] };\n }\n});\n\nregistry.register({\n name: 'audit_security_integrity',\n description: `Frank's Tool: Security Oracle. Performs a diagnostic security audit against the Fortress Matrix.`,\n schema: AuditSecurityIntegrityInputSchema,\n handler: async (args, context) => {\n const result = await auditSecurityIntegrity(context.supabase, args);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n }\n});\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 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 if (error) {\n throw new Error(`Database query failed: ${error.message}`);\n }\n\n const tables = data as Array<{ tablename: string, rowsecurity: boolean }>;\n\n if (!tables) {\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 return {\n status: 'ERROR',\n message: `Sven could not reach the database structure. Error: ${err.message || err}. check connection strings.`\n };\n }\n}\n\n/**\n * Frank's Tool: Security Oracle\n * Performs a diagnostic security audit against the Fortress Matrix.\n */\nexport async function auditSecurityIntegrity(\n supabase: SupabaseClient,\n input: { projectId: string, filePath: string, content: string }\n) {\n const violations: any[] = [];\n const { content, filePath } = input;\n\n // Use Modular Checks\n const sqlViolation = Checks.checkSqlInjection(content);\n if (sqlViolation) violations.push(sqlViolation);\n\n const rlsViolation = Checks.checkRlsInMigration(filePath, content);\n if (rlsViolation) violations.push(rlsViolation);\n\n const keyViolations = Checks.checkHardcodedSecrets(filePath, content);\n violations.push(...keyViolations);\n\n const xssViolation = Checks.checkXss(content);\n if (xssViolation) violations.push(xssViolation);\n\n const authViolation = Checks.checkIdentityIsolation(filePath, content);\n if (authViolation) violations.push(authViolation);\n\n const logViolation = Checks.checkSensitiveLogging(content);\n if (logViolation) violations.push(logViolation);\n\n const rbacViolation = Checks.checkRbac(filePath, content);\n if (rbacViolation) violations.push(rbacViolation);\n\n const valViolation = Checks.checkInputValidation(filePath, content);\n if (valViolation) violations.push(valViolation);\n\n const errViolation = Checks.checkCleanFailures(content);\n if (errViolation) violations.push(errViolation);\n\n const depViolation = Checks.checkDependencies(filePath, content);\n if (depViolation) violations.push(depViolation);\n\n const lazyViolations = Checks.checkAntiLazy(filePath, content);\n violations.push(...lazyViolations);\n\n const score = Math.max(0, 100 - (violations.length * 10));\n const passed = !violations.some((v: any) => v.severity === 'HIGH' || v.severity === 'FATAL');\n\n return {\n timestamp: new Date().toISOString(),\n projectId: input.projectId,\n filePath: input.filePath,\n passed,\n score,\n violations,\n summary: passed\n ? 'FRANK: Security audit PASSED. No critical Fortress violations detected.'\n : `FRANK: Security audit FAILED. Detected ${violations.length} violations against the Fortress Matrix.`\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { analyzeDatabasePerformance } from './analyze-database-performance.js';\nimport { auditRlsStatus, auditSecurityIntegrity } from './security-tools.js';\nimport { IntegrityGateResponse, IntegrityCheckResult, AuditIntegrityGateInput } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { AuditIntegrityGateInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'audit_integrity_gate',\n description: `Runs the full Integrity Gate (Security + Performance checks). \nCan trigger a SOFT LOCK if critical issues are found.`,\n schema: AuditIntegrityGateInputSchema,\n handler: async (args, context) => {\n const result = await runAuditIntegrityGate(context.supabase, args);\n return { content: [{ type: 'text', text: result.summary }] };\n }\n});\n\nexport async function runAuditIntegrityGate(\n supabase: SupabaseClient,\n input: AuditIntegrityGateInput\n): Promise<IntegrityGateResponse> {\n const checks: IntegrityCheckResult[] = [];\n let isSoftLocked = false;\n\n // 1. Run Guardian Security Audit (RLS)\n try {\n const rlsResult = await auditRlsStatus(supabase, { projectId: input.projectId });\n const unsecuredTables = rlsResult.unsecuredTables || [];\n\n if (unsecuredTables.length > 0) {\n isSoftLocked = true;\n checks.push({\n check: 'SECURITY',\n status: 'FAIL',\n message: `Found ${unsecuredTables.length} tables without RLS enabled.`,\n details: unsecuredTables\n });\n } else {\n checks.push({\n check: 'SECURITY',\n status: 'PASS',\n message: 'All tables have Row Level Security enabled.'\n });\n }\n } catch (e: any) {\n checks.push({\n check: 'SECURITY',\n status: 'WARN',\n message: `Failed to execute RLS audit: ${e.message}`\n });\n }\n\n // 2. Run Fortress Security Matrix (Phase 7)\n if (input.filePaths && input.filePaths.length > 0) {\n for (const path of input.filePaths) {\n try {\n // We need to read the file content here or pass it? \n // auditSecurityIntegrity requires 'content'. \n // But auditIntegrityGate only gets filePaths.\n // WE NEED TO READ THE FILE. \n // Since this runs on the server, we can use fs. \n // BUT we need to be careful about imports in this environment.\n // Ideally, auditSecurityIntegrity should accept a path and read it, \n // but currently it accepts { filePath, content }.\n\n // Let's assume we can read via fs if we are in Node environment (which MCP is).\n const fs = await import('fs/promises');\n const content = await fs.readFile(path, 'utf-8');\n\n const securityResult = await auditSecurityIntegrity(supabase, {\n projectId: input.projectId,\n filePath: path,\n content: content\n });\n\n if (!securityResult.passed) {\n isSoftLocked = true;\n checks.push({\n check: 'FORTRESS_MATRIX',\n status: 'FAIL',\n message: `Fortress Violations in ${path.split('/').pop()}`,\n details: securityResult.violations\n });\n } else {\n checks.push({\n check: 'FORTRESS_MATRIX',\n status: 'PASS',\n message: `Fortress Secured: ${path.split('/').pop()}`\n });\n }\n\n } catch (e: any) {\n checks.push({\n check: 'FORTRESS_MATRIX',\n status: 'WARN',\n message: `Failed to audit ${path}: ${e.message}`\n });\n }\n }\n }\n\n // 3. Run Sindre Performance Audit (Indexes & N+1)\n if (input.filePaths && input.filePaths.length > 0) {\n try {\n const perfResult = await analyzeDatabasePerformance(supabase, {\n projectId: input.projectId,\n filePaths: input.filePaths\n });\n\n const highSeverityIssues = perfResult.issues.filter(i => i.severity === 'HIGH');\n\n if (highSeverityIssues.length > 0) {\n isSoftLocked = true;\n checks.push({\n check: 'PERFORMANCE',\n status: 'FAIL',\n message: `Found ${highSeverityIssues.length} Critical Performance Issues (N+1 or Missing Indexes).`,\n details: highSeverityIssues\n });\n } else if (perfResult.issues.length > 0) {\n checks.push({\n check: 'PERFORMANCE',\n status: 'WARN',\n message: `Found ${perfResult.issues.length} non-critical performance hints.`,\n details: perfResult.issues\n });\n } else {\n checks.push({\n check: 'PERFORMANCE',\n status: 'PASS',\n message: 'No performance bottlenecks detected in scanned files.'\n });\n }\n } catch (e: any) {\n checks.push({\n check: 'PERFORMANCE',\n status: 'WARN',\n message: `Failed to execute Performance audit: ${e.message}`\n });\n }\n } else {\n checks.push({\n check: 'PERFORMANCE',\n status: 'WARN',\n message: 'Skipped performance scan (no file paths provided).'\n });\n }\n\n // 3. Construct Final Decision\n const summary = isSoftLocked\n ? `ā›” INTEGRITY GATE: SOFT LOCK ENGAGED. Critical issues found. Override required.`\n : `āœ… INTEGRITY GATE: PASSED. System is secure and optimized.`;\n\n return {\n passed: !isSoftLocked,\n mode: isSoftLocked ? 'SOFT_LOCK' : 'OPEN',\n checks,\n summary\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { IntegrityGateResponse, ReleaseManifest } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { CompleteRoadmapTaskInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'complete_roadmap_task',\n description: `Finalizes a roadmap task. Generates a Release Manifest and triggers the Sovereign Harvesting protocol.`,\n schema: CompleteRoadmapTaskInputSchema,\n handler: async (args, context) => {\n const result = await completeRoadmapTask(\n context.supabase,\n args.projectId,\n args.summary,\n args.taskId,\n args.gitDiff,\n args.integrityGate\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\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 integrityGate?: IntegrityGateResponse\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. Generate Release Manifest if Integrity Gate info is present\n let metadata: any = {};\n if (integrityGate) {\n const securityCheck = integrityGate.checks.find(c => (c as any).check === 'SECURITY');\n const performanceCheck = integrityGate.checks.find(c => (c as any).check === 'PERFORMANCE');\n\n const manifest: ReleaseManifest = {\n executive_summary: summary,\n security_certificate: {\n status: securityCheck?.status === 'PASS' ? 'PASSED' : (securityCheck?.status === 'FAIL' ? 'FAILED' : 'WARNING'),\n message: securityCheck?.message || 'No security audit performed.',\n unsecured_tables: securityCheck?.details || []\n },\n performance_report: {\n status: performanceCheck?.status === 'PASS' ? 'PASSED' : (performanceCheck?.status === 'FAIL' ? 'FAILED' : 'WARNING'),\n message: performanceCheck?.message || 'No performance audit performed.',\n issues_found: performanceCheck?.details ? (Array.isArray(performanceCheck.details) ? performanceCheck.details.length : 0) : 0\n },\n timestamp: new Date().toISOString()\n };\n\n metadata.release_manifest = manifest;\n }\n\n // 3. 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 })\n .eq('id', targetTaskId);\n\n if (updateError) {\n throw new Error(`Failed to update task status: ${updateError.message}`);\n }\n\n // 4. Create a Mission Report entry with the Manifest\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 metadata: metadata\n });\n\n if (reportError) {\n console.warn('Failed to save mission report:', reportError.message);\n }\n\n // 5. SOVEREIGN HARVESTING: Trigger Reflection & Skill Extraction (Brynjar)\n // Fire and forget - don't block completion on harvesting\n try {\n const apiKey = process.env.RIGSTATE_API_KEY;\n // Default to localhost for development if not set\n const apiUrl = process.env.RIGSTATE_API_URL || 'http://localhost:3000';\n\n // In local dev, we might not have an API key set, so we allow it if it's localhost\n const isLocal = apiUrl.includes('localhost') || apiUrl.includes('127.0.0.1');\n\n if (apiKey || isLocal) {\n fetch(`${apiUrl}/api/v1/skills/harvest`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'Authorization': `Bearer ${apiKey}` } : {})\n },\n body: JSON.stringify({\n projectId,\n taskId: targetTaskId,\n summary,\n technicalSummary: gitDiff || 'Completed via IDE Direct Connection.',\n metadata: metadata\n })\n }).catch(e => console.error('Harvesting failed (silent):', e));\n }\n } catch (e) {\n // Harvesting is non-critical, fail silently\n }\n\n return {\n success: true,\n taskId: targetTaskId!,\n message: integrityGate\n ? `Task completed! šŸŽ–ļø Release Manifest generated and attached.`\n : `Task completed successfully! Summary saved.`\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { SaveToProjectBrainInput, UpdateRoadmapStatusInput, AddRoadmapChunkInput } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport {\n SaveToProjectBrainInputSchema,\n UpdateRoadmapStatusInputSchema,\n AddRoadmapChunkInputSchema\n} from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'save_to_project_brain',\n description: `Maja's Tool: Persists knowledge, decisions, and lessons learned to the Project Brain.`,\n schema: SaveToProjectBrainInputSchema,\n handler: async (args, context) => {\n const result = await saveToProjectBrain(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nregistry.register({\n name: 'update_roadmap_status',\n description: `Kine's Tool: Updates the status of a roadmap task and notifies Scribe system.`,\n schema: UpdateRoadmapStatusInputSchema,\n handler: async (args, context) => {\n const result = await updateRoadmapStatus(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nregistry.register({\n name: 'add_roadmap_chunk',\n description: `Kine's Tool: Adds a new task/chunk to the roadmap for feature decomposition.`,\n schema: AddRoadmapChunkInputSchema,\n handler: async (args, context) => {\n const result = await addRoadmapChunk(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\n/**\n * Maja's Tool: Save to Project Brain\n * Persists knowledge, decisions, and notes.\n */\nexport async function saveToProjectBrain(\n supabase: SupabaseClient,\n userId: string,\n input: SaveToProjectBrainInput\n) {\n const { projectId, title, content, category, tags } = input;\n\n // Confirm project access\n const { data: p, error: pErr } = await supabase.from('projects').select('id').eq('id', projectId).eq('owner_id', userId).single();\n if (pErr || !p) throw new Error('Access denied');\n\n const fullContent = `# ${title}\\n\\n${content}`;\n\n const { data, error } = await supabase\n .from('project_memories')\n .insert({\n project_id: projectId,\n content: fullContent,\n category: category.toLowerCase(),\n tags: tags,\n importance: (category === 'DECISION' || category === 'ARCHITECTURE') ? 9 : 5,\n is_active: true,\n source_type: 'chat_manual'\n })\n .select('id')\n .single();\n\n if (error) throw new Error(`Failed to save memory: ${error.message}`);\n\n return {\n success: true,\n memoryId: data.id,\n message: `āœ… Saved [${category}] \"${title}\" to Project Brain.`\n };\n}\n\n/**\n * Kine's Tool: Update Roadmap Status\n * Updates task status and notifies Scribe system.\n */\nexport async function updateRoadmapStatus(\n supabase: SupabaseClient,\n userId: string,\n input: UpdateRoadmapStatusInput\n) {\n const { projectId, chunkId, status } = input;\n\n // Map status to DB enum: 'TODO' -> 'LOCKED' (Standard convention in Rigstate seems to be LOCKED/ACTIVE/COMPLETED)\n // If 'TODO' is meant to be 'PENDING', we check schema. Assuming 'LOCKED' is the backlog state.\n const dbStatus = status === 'TODO' ? 'LOCKED' : status === 'IN_PROGRESS' ? 'ACTIVE' : 'COMPLETED';\n\n const { error } = await supabase\n .from('roadmap_chunks')\n .update({ status: dbStatus })\n .eq('id', chunkId)\n .eq('project_id', projectId);\n\n if (error) throw new Error(`Update failed: ${error.message}`);\n\n let message = `Roadmap status updated to ${status} (${dbStatus}).`;\n\n if (status === 'COMPLETED') {\n // \"Notification\" to Gunhild\n message += \" šŸ“¢ Gunhild (Scribe) has been signaled. This completion will be reflected in the next report.\";\n } else if (status === 'IN_PROGRESS') {\n message += \" šŸš€ Work started.\";\n }\n\n return { success: true, status: dbStatus, message };\n}\n\n/**\n * Kine's Tool: Add Roadmap Chunk\n * Decomposes features into actionable chunks.\n */\nexport async function addRoadmapChunk(\n supabase: SupabaseClient,\n userId: string,\n input: AddRoadmapChunkInput\n) {\n const { projectId, title, description, priority } = input;\n\n // Get max step number\n const { data: maxStep } = await supabase\n .from('roadmap_chunks')\n .select('step_number')\n .eq('project_id', projectId)\n .order('step_number', { ascending: false })\n .limit(1)\n .single();\n\n const nextStepNum = (maxStep?.step_number || 0) + 1;\n\n const { data, error } = await supabase\n .from('roadmap_chunks')\n .insert({\n project_id: projectId,\n title: title,\n description: description || '',\n status: 'LOCKED', // Default state\n priority: priority,\n step_number: nextStepNum,\n sprint_focus: input.featureId ? `Feature: ${input.featureId}` : null\n })\n .select('id')\n .single();\n\n if (error) throw new Error(`Failed to add chunk: ${error.message}`);\n\n return {\n success: true,\n chunkId: data.id,\n stepNumber: nextStepNum,\n message: `āœ… Added new roadmap chunk: \"${title}\" (Step ${nextStepNum}).`\n };\n}\n","import { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { AnalyzeDependencyGraphInput } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { AnalyzeDependencyGraphInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'analyze_dependency_graph',\n description: `Einar's Tool: Architecture Integrity Scanner. Scans the codebase for circular dependencies and structural violations.`,\n schema: AnalyzeDependencyGraphInputSchema,\n handler: async (args, context) => {\n const result = await analyzeDependencyGraph(args);\n return { content: [{ type: 'text', text: (result as any).summary || 'Scan complete' }] };\n }\n});\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 { CallToolRequestSchema, McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { AuthContext } from './types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport {\n GetProjectContextInputSchema,\n AuditSecurityIntegrityInputSchema\n} from '../lib/types.js';\nimport { getProjectContext } from '../tools/get-project-context.js';\nimport { auditSecurityIntegrity } from '../tools/security-tools.js';\nimport { watcherState } from './telemetry.js';\n\nexport function setupToolHandlers(server: Server, authContext: AuthContext) {\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name } = request.params;\n const args = request.params.arguments as any;\n\n // 1. Check Registry (Modern Tools)\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?.includes(`Tool '${name}' not found`)) {\n throw new McpError(ErrorCode.InvalidParams, e.message);\n }\n }\n\n // 2. Legacy Switch (Modularized)\n switch (name) {\n case 'get_agent_status': {\n return { content: [{ type: 'text', text: JSON.stringify(watcherState, null, 2) }] };\n }\n\n default:\n throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);\n }\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 { WatcherState } from './types.js';\nimport { generateProfessionalPdf } from '../tools/generate-professional-pdf.js';\n\nexport let watcherState: WatcherState = {\n isRunning: false,\n lastCheck: null,\n tasksFound: 0,\n projectId: null\n};\n\nexport async 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 const { data: tasks, error } = await supabase\n .from('agent_bridge')\n .select('*')\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 // Heartbeat Logic\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 await supabase.from('agent_bridge').update({\n status: 'COMPLETED',\n summary: 'Pong! Frank is active and listening.',\n updated_at: new Date().toISOString()\n }).eq('id', task.id);\n return;\n }\n\n // Report Generation Logic\n if (task.proposal?.startsWith('report')) {\n const parts = task.proposal.split(':');\n const signalType = parts[1];\n const reportType = signalType === 'MANIFEST' ? 'SYSTEM_MANIFEST' : 'INVESTOR_REPORT';\n console.error(`\\nšŸ“„ Frank is generating ${reportType} report...`);\n\n try {\n const result = await generateProfessionalPdf(supabase, userId, task.project_id, reportType);\n await supabase.from('agent_bridge').update({\n status: 'COMPLETED',\n summary: `Report generated: ${reportType}.`,\n proposal: JSON.stringify(result.data),\n updated_at: new Date().toISOString()\n }).eq('id', task.id);\n } catch (genError: any) {\n await supabase.from('agent_bridge').update({\n status: 'FAILED',\n summary: `Generation failed: ${genError.message}`,\n updated_at: new Date().toISOString()\n }).eq('id', task.id);\n }\n return;\n }\n\n // Execution Logic\n if (task.status === 'APPROVED') {\n console.error(`\\nšŸ—ļø Worker: EXECUTING approved task: [${task.id}]`);\n await supabase.from('agent_bridge').update({ status: 'EXECUTING', updated_at: new Date().toISOString() }).eq('id', task.id);\n\n await new Promise(resolve => setTimeout(resolve, 2000));\n\n const taskTitle = (task.roadmap_chunks as any)?.title || 'manual objective';\n const technicalSummary = `Processed ${task.task_id || 'manual task'}. Applied architectural alignment.`;\n const humanSummary = `Mission Accomplished for \"${taskTitle}\". šŸš€`;\n\n await supabase.from('mission_reports').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 });\n\n await supabase.from('agent_bridge').update({\n status: 'COMPLETED',\n summary: humanSummary,\n execution_summary: technicalSummary,\n updated_at: new Date().toISOString(),\n completed_at: new Date().toISOString()\n }).eq('id', task.id);\n\n if (task.task_id) {\n await supabase.from('roadmap_chunks').update({ status: 'COMPLETED', completed_at: new Date().toISOString() }).eq('id', task.task_id);\n }\n return;\n }\n\n // Proposal Analysis Logic\n const taskTitle = (task.roadmap_chunks as any)?.title || '';\n let proposal = `Frank (Auto-Mode) has analyzed \"${taskTitle}\". Ready to proceed.`;\n\n await supabase.from('agent_bridge').update({\n status: 'AWAITING_APPROVAL',\n proposal,\n updated_at: new Date().toISOString()\n }).eq('id', task.id);\n }\n } catch (e) { }\n };\n\n const channel = supabase.channel('frank-watcher').on('postgres_changes', { event: '*', schema: 'public', table: 'agent_bridge' }, (payload: any) => {\n if (payload.new.status === 'PENDING' || payload.new.status === 'APPROVED') checkTasks();\n }).subscribe();\n\n setInterval(checkTasks, 5000);\n checkTasks();\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","path","fs","fs","path","fs","path","resolve","taskTitle"]}