@rigstate/mcp 0.7.1 β†’ 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../../rules-engine/dist/types.js","../../rules-engine/dist/sections/identity.js","../../rules-engine/dist/sections/stack-dna.js","../../rules-engine/dist/sections/current-step.js","../../rules-engine/dist/sections/workflow.js","../../rules-engine/dist/sections/tooling.js","../../rules-engine/dist/sections/skills.js","../../rules-engine/dist/utils/mdc.js","../../rules-engine/dist/index.js","../src/index.ts","../src/lib/supabase.ts","../src/server/factory.ts","../src/server/types.ts","../src/lib/tool-registry.ts","../src/tools/curator-tools.ts","../src/lib/curator/index.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/teacher-mode.ts","../src/tools/get-project-context.ts","../src/lib/context-engine.ts","../src/lib/schemas.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/audit-integrity-gate.ts","../src/tools/analyze-database-performance.ts","../src/tools/security-tools.ts","../src/tools/security-checks.ts","../src/tools/security-checks-arch.ts","../src/tools/complete-roadmap-task.ts","../src/tools/planning-tools.ts","../src/tools/arch-tools.ts","../src/server/core.ts","../src/server/telemetry.ts","../src/tools/generate-professional-pdf.ts","../src/agents/the-scribe.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IDE_FILE_NAMES = void 0;\n/**\n * Mapping of IDE providers to their respective rules file names.\n * Centralized here to ensure consistency across all consumers.\n */\nexports.IDE_FILE_NAMES = {\n cursor: '.cursorrules',\n antigravity: '.cursorrules',\n windsurf: '.windsurfrules',\n vscode: '.cursorrules',\n copilot: '.github/copilot-instructions.md',\n generic: 'CONVENTIONS.md'\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateIdentitySection = generateIdentitySection;\nfunction generateIdentitySection(project, ide, activeAgents) {\n const mission = project.functional_spec?.projectDescription\n || project.description\n || `Build a ${project.ambition_level || 'professional'} application.`;\n const audienceInfo = project.functional_spec?.targetAudience\n ? `\\n- **Target Users:** ${project.functional_spec.targetAudience}`\n : '';\n const problemInfo = project.functional_spec?.coreProblem\n ? `\\n- **Problem Being Solved:** ${project.functional_spec.coreProblem}`\n : '';\n // Build specialist context list\n const specialistList = activeAgents?.map((a) => `- **${a.name}** (\\`${a.key}\\`, Lvl ${a.authority_level}): ${a.primary_mission || extractFirstSentence(a.content)}`).join('\\n') || '- No specialists configured.';\n return `## 🧠 PROJECT CONTEXT\n\n**Project:** ${project.name} \n**ID:** \\`${project.id}\\` \n**Mission:** ${mission}${audienceInfo}${problemInfo}\n\n---\n\n## πŸ€– SPECIALIST PERSONAS\n\nThe following personas represent areas of expertise. Reference their guidelines when working in their domain.\n\n${specialistList}\n\n### How to Use Specialists\n1. **Architecture & Governance** β†’ Follow Frank's guidelines for code structure and security.\n2. **Documentation & Reports** β†’ Use The Scribe's patterns for markdown and PDFs.\n3. **Historical Context** β†’ Consult The Librarian for legacy feature discovery.\n\n> **Note:** These are informational contexts, not active agents. You (the IDE agent) execute all code.\n\n---\n\n## 🎯 CODING PRINCIPLES\n- **CONCISE:** No filler words. Get to the point.\n- **PRECISE:** Give specific answers with file paths and code.\n- **PRACTICAL:** Focus on what ships, not theory.\n- **GUARDIAN-AWARE:** Respect architectural constraints in the Guardian rules.`;\n}\nfunction extractFirstSentence(text) {\n const match = text.match(/^[^.!?]*[.!?]/);\n return match ? match[0].trim() : text.slice(0, 100) + '...';\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateStackDnaSection = generateStackDnaSection;\nfunction generateStackDnaSection(project, stack, legacyStats) {\n const stackText = stack.length > 0\n ? stack.map(s => `- ${s}`).join('\\n')\n : '- Next.js 14+ (App Router)\\n- Supabase\\n- TypeScript\\n- Tailwind CSS';\n const tenancy = project.tenancy || 'SINGLE';\n const monetization = project.monetization || 'FREE';\n const compliance = project.compliance || 'NONE';\n const vibe = project.vibe || 'CREATIVE';\n // Dynamic settings with defaults\n const lmax = project.settings?.lmax || 400;\n const lmaxUi = project.settings?.lmax_ui || 250;\n const securityLevel = project.settings?.security_level || 'STANDARD';\n const guardianRules = [\n `πŸ›‘οΈ **THE ${lmax}-LINE RULE (STRICT):** No file may exceed ${lmax} lines. If approaching this limit, you MUST propose a refactor into smaller modules.`,\n `πŸ›‘οΈ **TSX LIMIT:** React components (.tsx) should not exceed ${lmaxUi} lines. Extract sub-components proactively.`,\n 'πŸ›‘οΈ **TYPE SAFETY:** Avoid \"any\". Use strict TypeScript types. Infer from Zod schemas when possible.',\n ];\n if (tenancy === 'MULTI_ORG') {\n guardianRules.push('πŸ” All database queries MUST be org-scoped (filter by org_id)');\n guardianRules.push('πŸ” Implement proper organization switching in UI');\n }\n else {\n guardianRules.push('πŸ‘€ All queries are user-scoped (filter by user_id or RLS)');\n }\n if (stackText.toLowerCase().includes('supabase')) {\n guardianRules.push('⚑ Enable RLS on ALL new tables immediately');\n guardianRules.push('⚑ Use @supabase/ssr patterns for server-side auth');\n }\n if (compliance === 'GDPR') {\n guardianRules.push('πŸ›‘οΈ GDPR: Implement data export and deletion endpoints');\n }\n else if (compliance === 'HIPAA') {\n guardianRules.push('πŸ›‘οΈ HIPAA: Encrypt all PHI at rest and in transit');\n }\n // Security Level Rules\n if (securityLevel === 'STRICT') {\n guardianRules.push('πŸ”’ STRICT MODE: All inputs MUST be validated with Zod schemas');\n guardianRules.push('πŸ”’ STRICT MODE: Consult Security Specialist for ANY auth-related changes');\n }\n else if (securityLevel === 'MINIMAL') {\n guardianRules.push('⚑ MINIMAL MODE: Focus on speed over security hardening for MVP');\n }\n // IMPACT_GUARD: Dependency analysis before destructive actions\n guardianRules.push('🚨 **IMPACT_GUARD:** Before deleting ANY file, you MUST:');\n guardianRules.push(' 1. Search codebase for all imports/references (use grep_search or equivalent)');\n guardianRules.push(' 2. Update or remove ALL references first');\n guardianRules.push(' 3. Only delete after confirming ZERO references remain');\n guardianRules.push(' 4. Commit changes atomically (references + deletion in same commit)');\n // BUILD_INTEGRITY: Type-check verification after structural changes\n guardianRules.push('βœ… **BUILD_INTEGRITY:** After ANY structural change (new files, moved modules, refactors):');\n guardianRules.push(' 1. Run type-check (e.g., `tsc --noEmit` or framework equivalent)');\n guardianRules.push(' 2. Verify build success before declaring task complete');\n guardianRules.push(' 3. If errors detected, fix immediatelyβ€”do NOT leave broken builds');\n let legacySection = '';\n if (legacyStats && legacyStats.legacyCount > 0) {\n legacySection = `\n### πŸ“š Legacy Context\nThis project contains **${legacyStats.legacyCount} legacy features** (imported via Brynjar) and **${legacyStats.activeCount} active features**.\n\n**LEGACY AWARENESS RULE:**\nWhen encountering code or features marked with \\`is_legacy: true\\`:\n- Treat them as **Established Foundations** β€” they are proven, working code.\n- Any modifications to legacy code MUST bring it up to current Guardian standards:\n - Type-safety (no \"any\")\n - RLS enforcement (if database-related)\n - 400-line limit compliance\n - Proper error handling\n- Do NOT count legacy features in velocity metrics β€” they predate Rigstate.`;\n }\n return `## 🧬 STACK DNA\n\n### Tech Stack\n${stackText}\n\n### Project Configuration\n| Attribute | Value |\n|-----------|-------|\n| Tenancy | ${tenancy} |\n| Monetization | ${monetization} |\n| Compliance | ${compliance} |\n| Design Vibe | ${vibe} |\n${legacySection}\n\n### πŸ›‘οΈ GUARDIAN RULES (Mandatory)\n${guardianRules.map(r => `${r}`).join('\\n')}`;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateCurrentStepSection = generateCurrentStepSection;\nfunction generateCurrentStepSection(roadmap) {\n const activeRoadmap = roadmap.filter((r) => r.is_legacy !== true);\n const activeSteps = activeRoadmap\n .filter((r) => r.status === 'ACTIVE')\n .sort((a, b) => a.step_number - b.step_number);\n if (activeSteps.length === 0) {\n const nextSteps = activeRoadmap\n .filter((r) => r.status === 'LOCKED')\n .sort((a, b) => a.step_number - b.step_number)\n .slice(0, 1);\n if (nextSteps.length === 0)\n return null;\n return `## 🎯 CURRENT FOCUS\n\n> **No active task.** The next step in the backlog is:\n> \n> **Step ${nextSteps[0].step_number}: ${nextSteps[0].title}**`;\n }\n const currentStep = activeSteps[0];\n let objectiveText = currentStep.title;\n let constraintsText = '';\n let dodText = '';\n if (currentStep.prompt_content) {\n const content = currentStep.prompt_content;\n const objectiveMatch = content.match(/###\\s*🎯\\s*Objective\\s*\\n([\\s\\S]*?)(?=###|$)/i);\n if (objectiveMatch)\n objectiveText = objectiveMatch[1].trim();\n const constraintsMatch = content.match(/###\\s*⚠️\\s*Constraints\\s*\\n([\\s\\S]*?)(?=###|$)/i);\n if (constraintsMatch)\n constraintsText = constraintsMatch[1].trim();\n const dodMatch = content.match(/###\\s*βœ…\\s*Definition of Done\\s*\\n([\\s\\S]*?)(?=###|$)/i);\n if (dodMatch)\n dodText = dodMatch[1].trim();\n }\n let section = `## 🎯 CURRENT FOCUS\n\n**Active Step ${currentStep.step_number}: ${currentStep.title}**\n${currentStep.sprint_focus ? `*Sprint: ${currentStep.sprint_focus}*` : ''}\n\n### Objective\n${objectiveText}`;\n if (constraintsText) {\n section += `\\n\\n### Task-Specific Constraints\\n${constraintsText}`;\n }\n if (dodText) {\n section += `\\n\\n### Definition of Done\\n${dodText}`;\n }\n return section;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateWorkflowSection = generateWorkflowSection;\nfunction generateWorkflowSection(ide) {\n const ideInstructions = ide === 'windsurf'\n ? `When working in **Windsurf**, coordinate with Cascade (Windsurf's AI) for code execution.`\n : `When working in **Cursor**, delegate implementation to Cursor Composer/Agent for code execution.`;\n return `## πŸ“‹ SUPERVISOR MODE: FRANK'S WORKFLOW\n\n**🎭 PARADIGM SHIFT: Frank is a Supervisor/Orchestrator, NOT a Code Executor**\n\nFrank's role is to **PLAN, DELEGATE, and VALIDATE** β€” NOT to write every line of code manually.\nThe IDE's native AI (Cursor Composer, Windsurf Cascade, etc.) handles code execution.\nFrank maintains **Architectural Control** and ensures **Guardian Compliance**.\n\n---\n\n### 🧭 SUPERVISOR WORKFLOW (3-Phase Protocol)\n\n**INITIATION PROTOCOL:**\nAt the start of every session, you MUST execute:\n\\`\\`\\`bash\nexport RIGSTATE_MODE=SUPERVISOR\n\\`\\`\\`\nThis activates the System Guardian.\n\n#### PHASE 1: πŸ“‹ PLAN & STRUCTURE\n**Frank's Responsibility:**\n1. **Analyze the Task:** Read the roadmap step's EXECUTIVE SUMMARY, TECHNICAL PROMPT, and METADATA\n2. **Query Project Brain:** Use \\`query_brain\\` to fetch relevant decisions, patterns, and constraints\n3. **Generate Structured Plan:**\n - Break down into logical sub-tasks (if $L_{max}$ compliance requires modularization)\n - Identify affected files and modules\n - Map dependencies and execution order\n - Define validation checkpoints\n4. **Terminal Feedback (MANDATORY):**\n \\`\\`\\`\n 🎯 FRANK: Planning Task [Title]\n πŸ“Š Scope: [X files, Y modules]\n πŸ” Brain Context: [N relevant memories loaded]\n πŸ“ Execution Plan:\n 1. [Sub-task A] - [File/Module]\n 2. [Sub-task B] - [File/Module]\n 3. [Validation] - [Criteria]\n \n ⏱️ Estimated Token Load: [High/Medium/Low]\n ⚠️ If this exceeds your context, type \"FORTSETT\" after each phase.\n \\`\\`\\`\n\n**OUTPUT:** A clear, copy-pasteable Technical Prompt for the IDE's AI\n\n---\n\n#### PHASE 2: πŸ€– DELEGATE TO NATIVE EXECUTION\n**Frank's Responsibility:**\n1. **Present Delegation Prompt:**\n \\`\\`\\`\n 🎬 FRANK β†’ ${ide === 'cursor' ? 'CURSOR COMPOSER' : 'WINDSURF CASCADE'}:\n \n ${ide === 'cursor'\n ? 'Please execute the following implementation using Cursor Composer (Cmd+I or Chat Panel):'\n : 'Please execute the following implementation using Windsurf Cascade:'}\n \n ### πŸ›  TECHNICAL PROMPT\n [Paste the structured prompt from PHASE 1]\n \n ### ⚠️ GUARDIAN CONSTRAINTS (STRICT)\n - UI files MUST be < 250 lines ($L_{max}^{UI}$)\n - Logic files MUST be < 400 lines ($L_{max}^{Logic}$)\n - [Additional project-specific constraints from Brain]\n \n ### βœ… DEFINITION OF DONE\n - [ ] [Criteria 1]\n - [ ] [Criteria 2]\n - [ ] Passes \\`npx tsc --noEmit\\`\n - [ ] Passes \\`npm run build\\`\n \\`\\`\\`\n\n2. **Wait for IDE Execution:**\n - Frank does NOT write the code himself\n - Frank monitors for completion signals (user confirmation or file system changes)\n - If task is too large, Frank MUST split into chunks and ask user to type **\"FORTSETT\"** to continue\n\n3. **Terminal Feedback (MINIMALIST):**\n \\`\\`\\`\n ⏳ DELEGATED: ${ide === 'cursor' ? 'Cursor Composer' : 'Windsurf Cascade'}\n πŸ“‚ FILES: [list 1, list 2...]\n \\`\\`\\`\n\n**SILENT PROTOCOL:** Frank acts as a silent supervisor. He NEVER explains his role. He only logs status updates. The IDE Agent executes the code.\n\n---\n\n#### PHASE 3: βœ… VALIDATE & SYNC (MANDATORY)\n\n1. **Mission Report Generation:**\n Create \\`.rigstate/logs/last_execution.json\\`:\n \\`\\`\\`json\n {\n \"task_summary\": \"Short description of the task completed\",\n \"files_touched\": [\"relative/path/to/file1\", \"relative/path/to/file2\"],\n \"security_status\": \"SECURE\"\n }\n \\`\\`\\`\n\n2. **Architecture Audit:** \\`run_architecture_audit\\`\n\n3. **Team Check (Silent):**\n \\`\\`\\`\n [CHECKING: SVEN] ... [OK]\n \\`\\`\\`\n\n4. **Linter Guard:** \\`npx tsc --noEmit && npm run build\\`\n\n5. **SYSTEM SYNC (MANDATORY):**\n \\`\\`\\`bash\n npx rigstate sync\n \\`\\`\\`\n\n6. **Mission Briefing:**\n Present a concise, human-readable summary of the work done.\n\n7. **Complete & Log (MANDATORY):**\n When the task is done and validated:\n **YOU MUST** offer to complete the task programmatically.\n ASK the user: \"Shall I mark this task as completed?\"\n IF YES -> Call tool: \\`complete_roadmap_task(projectId, summary)\\`\n\n8. **Final Signal:**\n \\`\\`\\`\n [VALIDATED]\n \\`\\`\\`\n\n9. **Self-Correction Protocol:**\n - Quietly identify errors.\n - Generate specific fix prompts for IDE.\n\n6. **Terminal Feedback (MINIMALIST):**\n When all checks pass, output ONLY:\n \\`\\`\\`\n [VALIDATED]\n Task tracked in roadmap.\n \\`\\`\\`\n \n **RULE:** The IDE Agent acts as the worker. It MUST wait for Frank's **[VALIDATED]** signal before marking any task as done.\n\n---\n\n### πŸ”„ ATOMIC REVERT PROTOCOL (Safety Net)\n\nIf validation fails after **3 correction attempts**:\n\n1. **STOP** all further modifications\n2. **TERMINAL FEEDBACK (MANDATORY):**\n \\`\\`\\`\n ❌ ATOMIC REVERT TRIGGERED\n πŸ“‹ Task: [task-id]\n πŸ”΄ Reason: [error description]\n πŸ”„ Attempts: 3/3 exhausted\n πŸ›‘οΈ Action: Reverting to checkpoint...\n \\`\\`\\`\n3. **REVERT:**\n \\`\\`\\`bash\n git checkout . && git stash pop # OR: git reset --hard HEAD\n \\`\\`\\`\n4. **UPDATE:** Mark task as \\`FAILED\\` with detailed explanation\n5. **ESCALATE:** Notify user of blocker for manual intervention\n\n**CORE PRINCIPLE:** NEVER leave codebase in broken state.\n\n---\n\n### πŸ“’ PERSISTENCE & TRANSPARENCY RULES (MANDATORY)\n\nFrank MUST provide **live terminal feedback** before EVERY operation:\n\n1. **Before Planning:**\n \\`\\`\\`\n 🎯 FRANK: Starting analysis for [Task Title]...\n \\`\\`\\`\n\n2. **Before Delegation:**\n \\`\\`\\`\n πŸ€– FRANK: Preparing prompt for ${ide === 'cursor' ? 'Cursor Composer' : 'Windsurf Cascade'}...\n \\`\\`\\`\n\n3. **Before Validation:**\n \\`\\`\\`\n πŸ” FRANK: Running architecture audit on [N files]...\n \\`\\`\\`\n\n4. **Token Buffer Management:**\n - If a task requires > 50% of context window, Frank MUST split into phases\n - User types **\"FORTSETT\"** (Norwegian for \"CONTINUE\") to load next buffer\n - Example:\n \\`\\`\\`\n ⚠️ FRANK: Phase 1 complete. Token usage: 75%\n πŸ’¬ Type \"FORTSETT\" to continue with Phase 2 (Database Migrations)\n \\`\\`\\`\n\n**PURPOSE:** Eliminate \"Black Box\" feeling. User always knows what Frank is doing.\n\n---\n\n### 🎯 HOW TO READ ROADMAP STEPS\n\nEach Rigstate roadmap task follows this structure:\n\n\\`\\`\\`markdown\n### πŸ“ EXECUTIVE SUMMARY\n[Business value and user impact]\n\n### πŸ›  TECHNICAL PROMPT\nCONTEXT: [Files/Modules affected]\nOBJECTIVE: [One-sentence goal]\nGUARDIAN CONSTRAINTS: [File limits, compliance rules]\nDEFINITION OF DONE: [Success checklist]\n\n### πŸ’‘ IMPLEMENTATION HINTS\n[Code snippets and patterns]\n\n### πŸ“Š METADATA\n- Author: [Agent/User]\n- Source: [Origin of task]\n- Strategy Alignment: [DNA focus area]\n\\`\\`\\`\n\n${ideInstructions}\n\n---\n\n## πŸ›‘οΈ SAFETY PROTOCOLS (Mandatory)\n\n### 1. πŸ“Έ Pre-Flight Checkpoint\n**BEFORE delegating to IDE**, Frank MUST create recovery point:\n\\`\\`\\`bash\ngit stash push -m \"checkpoint-before-[task-id]\"\n# OR: git checkout -b checkpoint/[task-id] && git checkout -\n\\`\\`\\`\n\n### 2. 🚨 Linter Guard (STRICT)\n**FORBIDDEN** to mark \\`COMPLETED\\` if:\n- Syntax errors exist\n- TypeScript/ESLint errors present\n- \\`npm run build\\` fails\n\n**Verification:**\n\\`\\`\\`bash\nnpx tsc --noEmit && npm run build\n\\`\\`\\`\n\n### 3. πŸ”„ Self-Correction Loop\nMax 3 attempts with escalating strategies:\n1. Targeted fix\n2. Broader refactor\n3. Minimal surgical change OR user escalation\n\n---\n\n## πŸ”„ WATCHER MODE (Proactive Task Execution)\n\nFrank monitors for approved tasks and orchestrates execution:\n\n1. **Session Start:**\n - Call \\`get_pending_tasks\\` to check for approved work\n - Summarize tasks and ask user which to tackle\n\n2. **Execution Flow:**\n - **CHECKPOINT:** Create pre-flight snapshot\n - **PLAN:** Generate structured execution plan (Phase 1)\n - **DELEGATE:** Send prompt to IDE's native AI (Phase 2)\n - **VALIDATE:** Run architecture audit + linter guard (Phase 3)\n - **COMPLETE:** Update \\`update_task_status(COMPLETED)\\` with summary\n\n3. **Error Handling:**\n - Enter Self-Correction Loop (max 3 attempts)\n - If still failing, trigger Atomic Revert\n - Update task status to \\`FAILED\\` with explanation\n\n**CRITICAL:** Frank orchestrates, ${ide === 'cursor' ? 'Cursor' : 'Windsurf'} executes, Frank validates.`;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateToolingSection = generateToolingSection;\nfunction generateToolingSection(activeAgents) {\n const getAgent = (keyPart) => activeAgents?.find((a) => a.key.includes(keyPart));\n const frank = getAgent('frank') || getAgent('orchestrator');\n const brynjar = getAgent('brynjar');\n const gunhild = getAgent('scribe');\n const sindre = getAgent('sindre');\n const sven = getAgent('sven');\n const allTools = [\n { name: 'query_brain', owner: frank, desc: 'Search project memories and decisions' },\n { name: 'save_decision', owner: frank, desc: 'Record architectural decisions (ADRs)' },\n { name: 'update_roadmap', owner: frank, desc: 'Mark steps as ACTIVE or COMPLETED' },\n { name: 'run_architecture_audit', owner: frank, desc: 'Audit code against Guardian rules' },\n { name: 'get_pending_tasks', owner: frank, desc: 'Fetch APPROVED tasks from dashboard ready for execution' },\n { name: 'update_task_status', owner: frank, desc: 'Mark tasks as EXECUTING, COMPLETED, or FAILED' },\n { name: 'audit_integrity_gate', owner: frank, desc: 'Runs combined Security and Performance audit. SOFT LOCK if failed.' },\n { name: 'archaeological_scan', owner: brynjar, desc: 'Scan Git history for legacy features' },\n { name: 'import_ghost_features', owner: brynjar, desc: 'Import discovered features to roadmap' },\n { name: 'generate_professional_pdf', owner: gunhild, desc: 'Generate System Manifest or Investor Report' },\n { name: 'analyze_database_performance', owner: sindre, desc: 'Deep scan for N+1 queries and missing indexes' },\n { name: 'audit_rls_status', owner: sven, desc: 'Verify Row Level Security is enabled on all tables' }\n ];\n const activeTools = allTools.filter(t => t.owner !== undefined);\n let triggers = '';\n if (activeAgents && activeAgents.length > 0) {\n triggers = `\\n### ⚑️ ACTIVE AGENT TRIGGERS\nWhen your prompt mentions specific keywords, summon the appropriate specialist (respecting Authority Levels):\n\n${activeAgents.map((a) => {\n const triggerInfo = a.trigger_keywords\n ? `\"${a.trigger_keywords}\"`\n : `\"${a.primary_mission || 'General assistance'}\"`;\n return `- Intent: ${triggerInfo} β†’ Activate **${a.name}** [ID: ${a.id}] (Authority: ${a.authority_level})`;\n }).join('\\n')}`;\n }\n const toolTable = activeTools.length > 0\n ? `| Tool | Agent Owner | Description |\n|------|-------------|-------------|\n${activeTools.map(t => `| \\`${t.name}\\` | ${t.owner?.name} [ID: ${t.owner?.id}] | (Owner: [ID: ${t.owner?.id}]) ${t.desc} |`).join('\\n')}`\n : '> No specialized tools active for the current team roster.';\n return `## πŸ”§ TOOLING\n\n### Rigstate CLI Commands\n\\`\\`\\`bash\nrigstate scan # Scan current directory for issues\nrigstate scan --project <id> # Scan with project context\nrigstate fix --project <id> # Interactive AI fix mode\nrigstate complete # Mark current step as complete\n\\`\\`\\`\n\n### MCP Tools (Model Context Protocol)\nThese tools are available when using the Rigstate MCP server:\n\n${toolTable}\n\n**Strict Tool Ownership:**\nWhen a tool is invoked, the AI must adopt the persona and Authority Level of the Agent ID listed as the 'Owner' in the tool description. Do not execute tools as a generic assistant.\n\n### Environment Variables\nEnsure these are set in your \\`.env.local\\`:\n\\`\\`\\`\nRIGSTATE_API_KEY=<your-key>\nRIGSTATE_PROJECT_ID=<auto-detected-or-set>\n\\`\\`\\`${triggers}`;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateAvailableSkillsSection = generateAvailableSkillsSection;\nexports.generateSkillFileContent = generateSkillFileContent;\nexports.getRigstateStandardSkills = getRigstateStandardSkills;\n/**\n * Generate the <available_skills> XML block for the root .cursorrules file.\n */\nfunction generateAvailableSkillsSection(skills) {\n if (skills.length === 0)\n return '';\n const skillBlocks = skills.map(skill => ` <skill>\n <name>${skill.name}</name>\n <description>${skill.description}</description>\n <location>.agent/skills/${skill.name}/SKILL.md</location>\n </skill>`).join('\\n');\n return `## 🧠 AGENT SKILLS\n> **OPTIMIZED CAPABILITIES:** The following skills are available for on-demand activation.\n\n<available_skills>\n${skillBlocks}\n</available_skills>`;\n}\n/**\n * Generate the content for a specific SKILL.md file.\n */\nfunction generateSkillFileContent(skill) {\n return `---\nname: ${skill.name}\ndescription: ${skill.description}\nversion: \"${skill.version}\"\nspecialist: ${skill.specialist}\ngovernance: ${skill.governance}\n---\n\n${skill.content}\n\n---\n*Generated by Rigstate Rules Engine. Do not modify manually.*`;\n}\n/**\n * Get the standard Rigstate library of skills.\n */\nfunction getRigstateStandardSkills() {\n return [\n {\n name: 'rigstate-integrity-gate',\n description: 'Handles the Pre-Deployment Compliance Gate, automated quality audits (Security/Performance), and generation of the Strategic Release Manifest. Use this whenever you are finishing a task or moving code towards completion.',\n version: '1.0.0',\n specialist: 'Frank (The Orchestrator)',\n governance: 'SOFT_LOCK',\n content: `# πŸŽ–οΈ Rigstate Integrity Gate Skill\n\nThis skill defines the high-level protocol for ensuring code quality and security before a task is marked as \"COMPLETED\". It orchestrates specialized agents (Sven, Sindre) and generates the audit trail known as the **Strategic Release Manifest**.\n\n## πŸ”„ The Protocol Workflow\n\nWhenever you are ready to complete a task, follow this mandatory 3-step sequence:\n\n### 1. Audit (The Scan)\nRun the \\`audit_integrity_gate\\` tool. This will trigger:\n- **Security Check (Sven):** Scans for RLS status on all tables.\n- **Performance Check (Sindre):** Scans for N+1 queries and missing database indexes.\n\n### 2. Decision (The Gate)\nEvaluate the result from \\`audit_integrity_gate\\`:\n- **Mode: OPEN:** All critical checks passed. You can proceed to completion.\n- **Mode: SOFT_LOCK:** Issues were found (e.g., missing RLS or N+1 warnings). You **MUST** report these to the user. You can only proceed if the user provides an override or if you fix the issues first.\n- **Mode: HARD_LOCK (Future):** Critical violations detected. Completion is blocked until fixed.\n\n### 3. Manifest (The Release)\nUpon passing the gate, use the \\`complete_roadmap_task\\` tool. \n- Pass the **full JSON response** from the \\`audit_integrity_gate\\` into the \\`integrityGate\\` parameter.\n- This automatically generates the **Strategic Release Manifest** in the Mission Report, creating a permanent record of quality for this release.\n\n## πŸ› οΈ Tools Used by this Skill\n\n- \\`audit_integrity_gate\\`: Orchestrates the security and performance scans.\n- \\`complete_roadmap_task\\`: Finalizes the task and attaches the quality certificate.\n\n## πŸ“ Best Practices\n\n- **Never skip the audit.** Even if you think the change is small, the Integrity Gate is our source of truth.\n- **Explain violations clearly.** If in \\`SOFT_LOCK\\`, don't just say \"it failed\". List the specific tables lacking RLS or the specific files with N+1 issues.\n- **Summarize the Manifest.** After successful completion, tell the user: \"Release Manifest generated with [X] security passes and [Y] performance checks.\"`\n },\n {\n name: 'rigstate-legacy-renovator',\n description: 'Handles the modernization of legacy Vibeline code to the Rigstate standard. Renovates branding, extracts \"Ghost Features\" into the roadmap, and repairs architectural drift.',\n version: '1.0.0',\n specialist: 'Brynjar (The Archivist)',\n governance: 'SOFT_LOCK',\n content: `# 🏺 Rigstate Legacy Renovator Skill\n\nThis skill is activated when legacy patterns (e.g., \"Vibeline\") are detected. It uses archaeological scanning to restore technical history and performs branding renovation.\n\n## πŸ”„ The Protocol Workflow\n\n### 1. Archaeological Scan (The Discovery)\nUse the \\`archaeological_scan\\` tool to find \"Ghost Features\" – completed work that is not yet reflected in the project roadmap. This restores the technical context of the project.\n\n### 2. Import Ghost Features\nIf the scan discovers COMPLETED work, use \\`import_ghost_features\\` to add them to the roadmap. This ensures the agent understands the historical foundation it is building upon.\n\n### 3. Branding Renovation\nIdentify \"Vibeline\" references in:\n- UI components (Text logos, labels)\n- Code comments and TODOs\n- Documentation\n- Database seed files\n\nPerform a non-destructive rename to \"Rigstate\" following the rebrand protocol.\n\n### 4. Dependency Audit\nCheck for circular dependencies or architectural violations in legacy modules using \\`analyze_dependency_graph\\`.\n\n## πŸ› οΈ Tools Used by this Skill\n\n- \\`archaeological_scan\\`: Reconstructs project history from Git.\n- \\`import_ghost_features\\`: Synchronizes historical work with the roadmap.\n- \\`analyze_dependency_graph\\`: Detects architectural rot.\n\n## πŸ“ Best Practices\n\n- **Respect History.** Don't delete legacy notes; transform them into Rigstate memories.\n- **Batched Renaming.** Rename branding in logical groups (e.g., all UI first, then all comments).\n- **Update the Brain.** When a legacy feature is renovated, save the decision to the Project Brain using \\`save_to_project_brain\\`.`\n }\n ];\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wrapMdc = wrapMdc;\n/**\n * Utility to wrap markdown content with MDC (Modern Cursor) frontmatter.\n */\nfunction wrapMdc(content, metadata) {\n const yaml = ['---'];\n if (metadata.description) {\n yaml.push(`description: \"${metadata.description.replace(/\"/g, '\\\\\"')}\"`);\n }\n if (metadata.globs && metadata.globs.length > 0) {\n yaml.push('globs:');\n for (const glob of metadata.globs) {\n yaml.push(` - \"${glob}\"`);\n }\n }\n if (metadata.alwaysApply !== undefined) {\n yaml.push(`alwaysApply: ${metadata.alwaysApply}`);\n }\n yaml.push('---');\n return `${yaml.join('\\n')}\\n${content}`;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRigstateStandardSkills = exports.generateSkillFileContent = exports.generateAvailableSkillsSection = exports.IDE_FILE_NAMES = void 0;\nexports.generateRuleContent = generateRuleContent;\nexports.generateRuleFiles = generateRuleFiles;\nexports.fetchLegacyStats = fetchLegacyStats;\nexports.fetchActiveAgents = fetchActiveAgents;\nexports.mergeRuleContent = mergeRuleContent;\nexports.fetchProjectTechStack = fetchProjectTechStack;\nexports.getFileNameForIDE = getFileNameForIDE;\nconst types_1 = require(\"./types\");\nconst identity_1 = require(\"./sections/identity\");\nconst stack_dna_1 = require(\"./sections/stack-dna\");\nconst current_step_1 = require(\"./sections/current-step\");\nconst workflow_1 = require(\"./sections/workflow\");\nconst tooling_1 = require(\"./sections/tooling\");\nconst skills_1 = require(\"./sections/skills\");\nconst mdc_1 = require(\"./utils/mdc\");\nvar types_2 = require(\"./types\");\nObject.defineProperty(exports, \"IDE_FILE_NAMES\", { enumerable: true, get: function () { return types_2.IDE_FILE_NAMES; } });\nvar skills_2 = require(\"./sections/skills\");\nObject.defineProperty(exports, \"generateAvailableSkillsSection\", { enumerable: true, get: function () { return skills_2.generateAvailableSkillsSection; } });\nObject.defineProperty(exports, \"generateSkillFileContent\", { enumerable: true, get: function () { return skills_2.generateSkillFileContent; } });\nObject.defineProperty(exports, \"getRigstateStandardSkills\", { enumerable: true, get: function () { return skills_2.getRigstateStandardSkills; } });\nconst RIGSTATE_START = \"RIGSTATE_START\";\nconst RIGSTATE_END = \"RIGSTATE_END\";\nconst ENGINE_VERSION = \"3.0.0\";\n/**\n * Generate modular IDE rule content optimized for AI coding assistants.\n * v2.4.0: Added Agent IDs, Tool Binding, and Strict Ownership.\n * Refactored into sub-modules for Guardian Compliance (400-line limit).\n */\n/**\n * Generate modular IDE rule content optimized for AI coding assistants.\n * v2.4.0: Added Agent IDs, Tool Binding, and Strict Ownership.\n * Refactored into sub-modules for Guardian Compliance (400-line limit).\n */\nfunction generateRuleContent(project, stack, roadmap, ide = 'cursor', legacyStats, activeAgents, lean = false) {\n const sections = [];\n sections.push('# πŸš€ Rigstate Supervisor v2.4 (Context-Aware)');\n // SECTION 0: HIERARCHY (Top Priority)\n sections.push(`IMPORTANT: Internal agent coordination must always use the provided Agent IDs. Display names are for user-facing chat only. When invoking tools or referencing hierarchy, use the ID as the primary key.\n\n## βš–οΈ AGENT HIERARCHY & AUTHORITY\nYou must defer to the instructions of agents with higher Authority Levels (10 being highest).\nSecurity and Architecture (Levels 8-10) always override creative or implementation suggestions (Levels 1-5).`);\n // SECTION 1: IDENTITY (Multi-Agent Ecosystem)\n // Always keep Identity in root for instant persona recognition\n const identitySection = (0, identity_1.generateIdentitySection)(project, ide, activeAgents);\n sections.push(identitySection);\n // SECTION 1.5: SKILLS (Discovery Layer)\n const skills = (0, skills_1.getRigstateStandardSkills)();\n const skillsSection = (0, skills_1.generateAvailableSkillsSection)(skills);\n if (skillsSection) {\n sections.push(skillsSection);\n }\n // SECTION 2: STACK DNA + GUARDIAN RULES\n // In Lean mode (Cursor context), we trust rigstate-guardian.mdc to handle this.\n if (!lean) {\n const stackDnaSection = (0, stack_dna_1.generateStackDnaSection)(project, stack, legacyStats);\n sections.push(stackDnaSection);\n }\n // SECTION 3: CURRENT STEP (Active Focus Injection)\n // In Lean mode, rigstate-roadmap.mdc handles this dynamically.\n if (!lean) {\n const currentStepSection = (0, current_step_1.generateCurrentStepSection)(roadmap);\n if (currentStepSection) {\n sections.push(currentStepSection);\n }\n }\n // SECTION 4: WORKFLOW (How to Parse Roadmap Steps)\n // Frank's \"Supervisor Mode\" logic.\n // We KEEP this in Lean mode because it defines the core behavior of the agent globally.\n // However, if it's identical to rigstate-workflow.mdc, we might consider linking.\n // But Frank's protocol is the \"Operating System\" of the session.\n const workflowSection = (0, workflow_1.generateWorkflowSection)(ide);\n sections.push(workflowSection);\n // SECTION 5: TOOLING (CLI + MCP Integration)\n // In Lean mode, rigstate-workflow.mdc has the specific CLI commands and tools.\n if (!lean) {\n const toolingSection = (0, tooling_1.generateToolingSection)(activeAgents);\n sections.push(toolingSection);\n }\n else {\n // Add a pointer in Lean mode\n sections.push(`## πŸ”§ TOOLING & SPECIFIC RULES\n> **OPTIMIZED MODE:** Detailed technical rules, CLI commands, and tech stack constraints are loaded dynamically from \\`.cursor/rules/*.mdc\\` based on the files you interact with.\n> - **Stack & Guardian:** See \\`rigstate-guardian.mdc\\`\n> - **Roadmap & Tasks:** See \\`rigstate-roadmap.mdc\\`\n> - **Tools & Workflow:** See \\`rigstate-workflow.mdc\\``);\n }\n // Generate IDE-specific header\n const headerMap = {\n cursor: `# Cursor Project Rules: ${project.name}`,\n antigravity: `# Antigravity Project Rules: ${project.name}`,\n windsurf: `# Windsurf Project Rules: ${project.name}`,\n vscode: `# VS Code Project Rules: ${project.name}`,\n copilot: `# GitHub Copilot Instructions: ${project.name}`,\n generic: `# Project Conventions: ${project.name}`\n };\n const header = headerMap[ide] || `# Project Rules: ${project.name}`;\n return `${RIGSTATE_START}\n${header}\n> Generated by Rigstate v2.5.0 | Project ID: ${project.id} | Last synced: ${new Date().toISOString()}\n> ${lean ? '⚑ LEAN MODE ACTIVE: Redundant context offloaded to .cursor/rules/*.mdc' : 'πŸ“¦ FULL MODE ACTIVE'}\n\n⚠️ **SYSTEM NOTE:** Changes made to this Guardian template propagate to ALL Rigstate projects on next sync.\nπŸ›‘οΈ **Guardian v2.5 Upgrade Applied:** IMPACT_GUARD + BUILD_INTEGRITY now active globally.\n\n${sections.join('\\n\\n---\\n\\n')}\n${RIGSTATE_END}`;\n}\n/**\n * Generate multiple modular rule files optimized for modern Cursor (.mdc)\n * and universal AGENTS.md format.\n */\nfunction generateRuleFiles(project, stack, roadmap, ide = 'cursor', legacyStats, activeAgents, databaseMetadata) {\n const files = [];\n // 1. GENERATE AGENTS.MD (Universal Root File - Context Reference)\n const agentTable = activeAgents?.map((a) => `| **${a.name}** | \\`${a.key}\\` | ${a.job_title} | ${a.primary_mission || 'Specialist'} |`).join('\\n') || '| - | - | - | No agents configured |';\n const agentsMdContent = `# πŸ€– AI Agent Context: ${project.name}\n> **Rigstate v${ENGINE_VERSION}** | Project ID: \\`${project.id}\\`\n\nThis file describes the **specialist personas** available in this project. \nThese are **context providers**, not active controllers. The IDE agent (you) remains in full control of code execution.\n\n## πŸ“‹ Available Specialists\n| Name | Key | Role | Specialty |\n|:--- |:--- |:--- |:--- |\n${agentTable}\n\n## πŸ” How to Use This Context\n1. **Read their expertise**: Each specialist has a defined area of knowledge (architecture, documentation, history).\n2. **Adopt their perspective**: When working in their domain, consider their guidelines.\n3. **Call MCP tools if needed**: Some specialists have associated tools (e.g., \\`generate_professional_pdf\\` for The Scribe).\n\n## ⚠️ Important\n- These personas do **NOT** execute code or override your decisions.\n- They provide **context and guidelines** that you apply at your discretion.\n- Authority levels indicate priority of guidelines when they conflict (higher = stronger recommendation).\n\n---\n*Generated by Rigstate. Run \\`rigstate sync\\` to refresh.*`;\n files.push({\n path: 'AGENTS.md',\n content: agentsMdContent,\n metadata: { description: \"Project hierarchy and agent identities\" }\n });\n // 2. GENERATE SYSTEM-SPECIFIC MONO-FILE (Fallback/Baseline)\n // If IDE is Cursor, we use LEAN mode for the root .cursorrules file\n // because we are generating specific .mdc files below that cover the details.\n const isLean = ide === 'cursor';\n const masterFileName = getFileNameForIDE(ide);\n const monoContent = generateRuleContent(project, stack, roadmap, ide, legacyStats, activeAgents, isLean);\n files.push({\n path: masterFileName,\n content: monoContent,\n metadata: { description: `Master rules file for ${ide}` }\n });\n // 3. GENERATE MODULAR (.mdc) RULES (Cursor, Antigravity, VS Code)\n if (ide === 'cursor' || ide === 'antigravity' || ide === 'vscode') {\n // Identity & Context\n files.push({\n path: '.cursor/rules/rigstate-identity.mdc',\n content: (0, mdc_1.wrapMdc)((0, identity_1.generateIdentitySection)(project, ide, activeAgents), {\n description: \"Project context and specialist personas\",\n alwaysApply: true\n })\n });\n // Guardian & Stack DNA\n files.push({\n path: '.cursor/rules/rigstate-guardian.mdc',\n content: (0, mdc_1.wrapMdc)((0, stack_dna_1.generateStackDnaSection)(project, stack, legacyStats), {\n description: \"Governance rules, tech stack constraints, and file size limits\",\n globs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.sql\"],\n alwaysApply: true\n })\n });\n // Current Focus (Roadmap)\n const currentStep = (0, current_step_1.generateCurrentStepSection)(roadmap);\n if (currentStep) {\n files.push({\n path: '.cursor/rules/rigstate-roadmap.mdc',\n content: (0, mdc_1.wrapMdc)(currentStep, {\n description: \"Active sprint focus and current roadmap step details\",\n alwaysApply: true\n })\n });\n }\n // Workflow & Tooling\n files.push({\n path: '.cursor/rules/rigstate-workflow.mdc',\n content: (0, mdc_1.wrapMdc)((0, workflow_1.generateWorkflowSection)(ide) + '\\n\\n' + (0, tooling_1.generateToolingSection)(activeAgents), {\n description: \"Coding workflows, CLI usage, and tool binding rules\",\n alwaysApply: true\n })\n });\n // Database Specific (scoped)\n let dbContent = \"## πŸ—„οΈ Database Standards\\n- Always verify RLS policies for new tables.\\n- Use `supabase/migrations` for DDL changes.\\n- Reference `types/supabase.ts` for strictly typed queries.\";\n if (databaseMetadata && databaseMetadata.length > 0) {\n const securedCount = databaseMetadata.filter(t => t.rls_enabled).length;\n const unsecuredCount = databaseMetadata.length - securedCount;\n const unsecuredTables = databaseMetadata.filter(t => !t.rls_enabled).map(t => t.table_name);\n dbContent = `## πŸ—„οΈ Database Context: ${databaseMetadata.length} Tables\n> **Security Check:** ${securedCount} Secured | ${unsecuredCount} Unsecured\n\n### ⚠️ Security Attention Required\n${unsecuredTables.length > 0\n ? unsecuredTables.map(t => `- πŸ”΄ **${t}**: RLS Disabled`).join('\\n')\n : \"- βœ… All tables have Row Level Security enabled.\"}\n\n### πŸ“‹ Schema Reference\n| Table | RLS | Policies | Cols | Key Features |\n| :--- | :---: | :---: | :---: | :--- |\n${databaseMetadata.map(t => {\n const features = [];\n if (t.has_user_id)\n features.push('User-Scoped');\n if (t.has_created_at)\n features.push('Timestamps');\n return `| \\`${t.table_name}\\` | ${t.rls_enabled ? 'βœ…' : '❌'} | ${t.policy_count} | ${t.column_count} | ${features.join(', ') || '-'} |`;\n }).join('\\n')}\n\n### πŸ›‘οΈ Development Rules\n1. **RLS is MANDATORY:** All tables containing user data must have RLS enabled.\n2. **Use RPCs for Complex Logic:** Do not put complex business logic in client-side queries.\n3. **Migrations:** Always use \\`supabase/migrations\\` for schema changes.`;\n }\n files.push({\n path: '.cursor/rules/rigstate-database.mdc',\n content: (0, mdc_1.wrapMdc)(dbContent, {\n description: \"Live database schema, RLS status, and table metadata\",\n globs: [\"supabase/**/*\", \"**/*.sql\", \"**/lib/supabase/**\"],\n alwaysApply: databaseMetadata && databaseMetadata.length > 0 ? true : false\n })\n });\n // 4. GENERATE AGENT SKILLS (.agent/skills/<name>/SKILL.md)\n const rigstateSkills = (0, skills_1.getRigstateStandardSkills)();\n for (const skill of rigstateSkills) {\n files.push({\n path: `.agent/skills/${skill.name}/SKILL.md`,\n content: (0, skills_1.generateSkillFileContent)(skill),\n metadata: { description: skill.description }\n });\n }\n }\n return {\n files,\n suggestedIde: ide,\n version: ENGINE_VERSION\n };\n}\nasync function fetchLegacyStats(supabase, projectId) {\n const { data: chunks } = await supabase\n .from('roadmap_chunks')\n .select('is_legacy')\n .eq('project_id', projectId);\n if (!chunks)\n return { total: 0, legacyCount: 0, activeCount: 0 };\n const legacyCount = (chunks || []).filter((c) => c.is_legacy === true).length;\n const activeCount = (chunks || []).filter((c) => c.is_legacy !== true).length;\n return {\n total: (chunks || []).length,\n legacyCount,\n activeCount\n };\n}\n/**\n * Fetch active agents sorted by authority level\n * Note: Pass in a SupabaseClient instance (browser or server)\n */\nasync function fetchActiveAgents(supabase) {\n const { data: prompts } = await supabase\n .from('system_prompts')\n .select('id, key, content, name, display_name, job_title, authority_level, primary_mission, trigger_keywords')\n .eq('include_in_rules', true)\n .eq('is_active', true)\n .order('authority_level', { ascending: false });\n if (!prompts)\n return [];\n return (prompts || []).map((p) => ({\n id: p.id,\n key: p.key,\n name: p.display_name || p.name || p.key,\n job_title: p.job_title || 'Specialist Agent',\n content: p.content,\n authority_level: (() => {\n if (p.authority_level === null || p.authority_level === undefined) {\n throw new Error(`Agent ${p.key} is missing authority_level. Update via CMS.`);\n }\n return p.authority_level;\n })(),\n primary_mission: p.primary_mission || undefined,\n trigger_keywords: p.trigger_keywords || undefined\n }));\n}\nfunction mergeRuleContent(existingContent, newRules) {\n const startIndex = existingContent.indexOf(RIGSTATE_START);\n const endIndex = existingContent.indexOf(RIGSTATE_END);\n if (startIndex !== -1 && endIndex !== -1) {\n const before = existingContent.substring(0, startIndex);\n const after = existingContent.substring(endIndex + RIGSTATE_END.length);\n return before + newRules + after;\n }\n else {\n return existingContent + \"\\n\\n\" + newRules;\n }\n}\n/**\n * Fetch project tech stack from database.\n * Falls back to common defaults if no tags are defined.\n * Note: Pass in a SupabaseClient instance (browser or server)\n */\nasync function fetchProjectTechStack(supabase, projectId, fallbackStack = ['Next.js', 'TypeScript', 'Supabase', 'Tailwind CSS']) {\n try {\n // Try to fetch from project_tech_tags table\n const { data: tags, error } = await supabase\n .from('project_tech_tags')\n .select('name')\n .eq('project_id', projectId);\n if (error || !tags || tags.length === 0) {\n // Fallback: Check project metadata for stack info\n const { data: project } = await supabase\n .from('projects')\n .select('functional_spec')\n .eq('id', projectId)\n .single();\n // Extract tech from functional_spec if available\n if (project?.functional_spec?.techStack) {\n return project.functional_spec.techStack;\n }\n return fallbackStack;\n }\n return tags.map((t) => t.name);\n }\n catch (error) {\n console.warn('fetchProjectTechStack: Failed to fetch, using fallback', error);\n return fallbackStack;\n }\n}\n/**\n * Get the appropriate filename for a given IDE provider.\n * Convenience wrapper around IDE_FILE_NAMES constant.\n */\nfunction getFileNameForIDE(ide) {\n return types_1.IDE_FILE_NAMES[ide] || types_1.IDE_FILE_NAMES.cursor;\n}\n","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 const apiUrl = process.env.RIGSTATE_APP_URL || 'https://app.rigstate.com';\n console.error(`Status: Connected to Rigstate Cloud (${apiUrl})`);\n console.error(`Project Context: Secured via RPC`);\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\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://gvmoopyzhsdolibsuvpa.supabase.co';\nconst PRODUCTION_SUPABASE_ANON_KEY = 'sb_publishable_-RYJkFocIiMhOZczMC5mvQ_EozANMnt';\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 // Trim whitespace to avoid hash mismatch\n const cleanApiKey = apiKey.trim();\n\n // Hash the API key with SHA-256 (same as web app)\n const hashedKey = createHash('sha256').update(cleanApiKey).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 using the secure RPC\n // This bypasses RLS on the api_keys table via Security Definer function\n const { data: keyData, error: keyError } = await supabase\n .rpc('authenticate_api_key_hash', { hash: hashedKey })\n .single();\n\n if (keyError || !keyData) {\n return { success: false, error: 'Invalid or revoked API key' };\n }\n\n const { id, user_id } = keyData as { id: string; user_id: string };\n\n // Create a user-scoped client for subsequent operations\n // Use the most privileged key available (SERVICE_KEY or ANON_KEY)\n const userSupabase = createSupabaseClient(SUPABASE_URL, clientKey);\n\n return {\n success: true,\n context: {\n userId: user_id,\n apiKeyId: 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.error(`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","/**\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 * Phase 8.5: The Curator Protocol\n * Logic and Actions\n */\n\nexport * from './schemas.js';\nexport * from './actions/query.js';\nexport * from './actions/submit.js';\nexport * from './actions/stats.js';\nexport * from './actions/fortress.js';\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 * 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 * 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 // Define RPC response type\n interface ProjectContextRow {\n id: string;\n name: string;\n description: string;\n project_type: string;\n created_at: string;\n last_indexed_at: string;\n detected_stack: any;\n repository_tree: any;\n architectural_dna: any;\n }\n\n // Fetch project securely via RPC (bypasses RLS with strict checks)\n const { data: rawData, error: projectError } = await supabase\n .rpc('get_project_context_secure', {\n p_project_id: projectId,\n p_user_id: userId\n })\n .single();\n\n const projectRow = rawData as ProjectContextRow;\n\n if (projectError || !projectRow) {\n console.error('Project fetch failed:', projectError);\n throw new Error('Project not found or access denied');\n }\n\n // Map RPC result to tool structure\n const project = {\n id: projectRow.id,\n name: projectRow.name,\n description: projectRow.description,\n project_type: projectRow.project_type,\n created_at: projectRow.created_at,\n last_indexed_at: projectRow.last_indexed_at,\n detected_stack: projectRow.detected_stack,\n repository_tree: projectRow.repository_tree\n };\n\n // DNA is now directly available\n const stackDef = (projectRow.architectural_dna as any)?.stack_definition;\n\n\n\n // Continuity Loop: Fetch Active & Next Tasks\n const [activeTaskResult, nextTaskResult] = await Promise.all([\n supabase\n .from('roadmap_chunks')\n .select('id, title, step_number, role, instruction_set')\n .eq('project_id', projectId)\n .eq('status', 'IN_PROGRESS')\n .limit(1)\n .maybeSingle(),\n supabase\n .from('roadmap_chunks')\n .select('id, title, step_number, role')\n .eq('project_id', projectId)\n .eq('status', 'PENDING')\n .order('step_number', { ascending: true })\n .limit(1)\n .maybeSingle()\n ]);\n\n const activeTask = activeTaskResult.data;\n const nextTask = nextTaskResult.data;\n\n // Fetch Digest Data (Reduced to 2 to save tokens)\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(2);\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(2);\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 summaryParts.push(`Project Type: ${project.project_type?.toUpperCase() || 'UNKNOWN'}`);\n\n // Add DNA Stack Info if available (Truth)\n if (stackDef) {\n summaryParts.push('\\n=== ACTIVE MISSION PARAMETERS ===');\n if (activeTask) {\n summaryParts.push(`⚠️ CURRENT OBJECTIVE: T-${activeTask.step_number}: ${activeTask.title}`);\n summaryParts.push(` Role: ${activeTask.role || 'Developer'}`);\n if (activeTask.instruction_set) {\n summaryParts.push(` Instructions: ${activeTask.instruction_set.substring(0, 200)}...`);\n }\n summaryParts.push(' ACTION: Focus ALL coding efforts on completing this task.');\n } else if (nextTask) {\n summaryParts.push(`⏸ SYSTEM IDLE (Waiting for command)`);\n summaryParts.push(` Suggested Next Mission: T-${nextTask.step_number}: ${nextTask.title}`);\n summaryParts.push(` ACTION: Ask the user \"Shall we start T-${nextTask.step_number}?\"`);\n } else {\n summaryParts.push('βœ… ALL MISSIONS COMPLETE. Awaiting new roadmap items.');\n }\n\n summaryParts.push('\\n=== AI BEHAVIORAL INSTRUCTIONS ===');\n if (activeTask) {\n summaryParts.push(`1. FOCUS: The user is working on T-${activeTask.step_number}. Help them complete it.`);\n summaryParts.push(`2. COMPLIANCE: Ensure all code follows project standards.`);\n } else if (nextTask) {\n summaryParts.push(`1. NUDGE: No active task found. Suggest starting T-${nextTask.step_number} (${nextTask.title}).`);\n summaryParts.push(`2. PROACTIVE: Instead of asking \"How can I help?\", ask \"Shall we start on T-${nextTask.step_number}?\"`);\n }\n\n summaryParts.push('\\n=== CURRENT STACK ===');\n if (stackDef.frontend) summaryParts.push(`Frontend: ${stackDef.frontend.framework} (${stackDef.frontend.language})`);\n if (stackDef.backend) summaryParts.push(`Backend: ${stackDef.backend.service} (${stackDef.backend.database})`);\n if (stackDef.styling) summaryParts.push(`Styling: ${stackDef.styling.framework} ${stackDef.styling.library || ''}`);\n if (stackDef.hosting) summaryParts.push(`Infrastructure: ${stackDef.hosting.provider}`);\n } else {\n // Fallback to detected stack\n if (techStack.framework) summaryParts.push(`Framework: ${techStack.framework}`);\n if (techStack.orm) summaryParts.push(`ORM: ${techStack.orm}`);\n }\n\n if (project.description) {\n summaryParts.push(`\\nDescription: ${project.description}`);\n }\n\n // Add Tooling Guidelines (Critical for Universal IDE Support)\n summaryParts.push('\\n=== RIGSTATE TOOLING GUIDELINES ===');\n summaryParts.push('You have access to specialized MCP tools. USE THEM TO SUCCEED:');\n summaryParts.push('1. NEVER guess about architecture. Use `query_brain` to search project documentation.');\n summaryParts.push('2. BEFORE coding, check `get_learned_instructions` to see if you have been corrected before.');\n summaryParts.push('3. When finishing a task, ALWAYS update the roadmap using `update_roadmap`.');\n summaryParts.push('4. If you discover a reusable pattern, submit it with `submit_curator_signal`.');\n summaryParts.push('5. For large refactors, use `run_architecture_audit` to check against rules.');\n summaryParts.push('6. Store major decisions using `save_decision` (ADR).');\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 * 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.1)\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: 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// Generate embedding using the Rigstate Intelligence API (Proxy)\nasync function generateQueryEmbedding(query: string): Promise<number[] | null> {\n const apiKey = process.env.RIGSTATE_API_KEY;\n const apiUrl = process.env.RIGSTATE_API_URL || 'http://localhost:3000/api/v1';\n\n if (!apiKey) {\n return null;\n }\n\n try {\n const response = await fetch(`${apiUrl}/intelligence/embed`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`\n },\n body: JSON.stringify({ text: query })\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(`Embedding API error (${response.status}):`, errorText);\n return null;\n }\n\n const result = await response.json() as any;\n return result.data?.embedding || null;\n } catch (error) {\n console.error('Failed to generate embedding via Proxy:', error);\n return null;\n }\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 // Generate embedding if possible for semantic search\n const embedding = await generateQueryEmbedding(query);\n let memories: MemoryRecord[] = [];\n\n // Use the hybrid search RPC\n const { data: searchResults, error: searchError } = await supabase\n .rpc('hybrid_search_memories', {\n p_project_id: projectId,\n p_query: query,\n p_embedding: embedding || null,\n p_limit: limit,\n p_similarity_threshold: threshold || 0.1\n });\n\n if (searchError) {\n // Fallback to basic recent fetch if RPC fails\n const { data: recentMemories } = await 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 .order('created_at', { ascending: false })\n .limit(limit);\n\n if (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.importance || 0,\n createdAt: m.created_at\n }));\n }\n } else if (searchResults) {\n memories = searchResults.map((m: any) => ({\n id: m.id,\n content: m.content,\n category: m.category,\n tags: m.tags,\n netVotes: m.importance,\n createdAt: m.created_at\n }));\n }\n\n // --- NEW: FETCH RELEVANT FEATURES ---\n // Simple fuzzy search until we vector embedding for features.\n let relevantFeatures: any[] = [];\n try {\n const { data: features } = await supabase\n .from('project_features')\n .select('name, status, description')\n .eq('project_id', projectId)\n .or(`name.ilike.%${query}%,description.ilike.%${query}%`)\n .limit(3);\n\n if (features) relevantFeatures = features;\n } catch (e) {\n console.warn('Feature fetch failed in brain query', e);\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 && m.tags.length > 0 ? ` [${m.tags.join(', ')}]` : '';\n const category = m.category ? m.category.toUpperCase() : 'GENERAL';\n return `- [${category}]${tagStr}${voteIndicator}: ${m.content}`;\n });\n\n const searchType = embedding ? 'TRIPLE-HYBRID (Vector + FTS + Fuzzy)' : 'HYBRID (FTS + Fuzzy)';\n\n let formatted = `=== PROJECT BRAIN: RELEVANT MEMORIES ===\nSearch Mode: ${searchType}\nQuery: \"${query}\"`;\n\n if (relevantFeatures.length > 0) {\n formatted += `\\n\\n=== RELATED FEATURES ===\\n` +\n relevantFeatures.map((f: any) => `- ${f.name} [${f.status}]`).join('\\n');\n }\n\n formatted += `\\n\\nFound ${memories.length} relevant memories:\\n\\n${contextLines.join('\\n')}\\n\\n==========================================`;\n\n if (memories.length === 0 && relevantFeatures.length === 0) {\n formatted = `=== PROJECT BRAIN ===\nQuery: \"${query}\"\nNo relevant memories or features found.\n=======================`;\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. Fetch project to verify access and get fallback spec\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, functional_spec')\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. Primary Strategy: Fetch from 'project_features'\n const { data: dbFeatures, error: dbError } = await supabase\n .from('project_features')\n .select('id, name, description, status')\n .eq('project_id', projectId)\n .neq('status', 'shadow') // Exclude shadow features by default unless asked\n .order('created_at', { ascending: false });\n\n let featuresList: any[] = [];\n let source = 'DB';\n\n if (!dbError && dbFeatures && dbFeatures.length > 0) {\n featuresList = dbFeatures.map(f => ({\n ...f,\n title: f.name // Map back to title specifically for uniform handling below\n }));\n } else {\n // 3. Fallback Strategy: Extract from 'functional_spec'\n source = 'FALLBACK_SPEC';\n // Log warning (In a real system, use a structured logger. Here we console.error to stderr)\n console.error(`[WARN] Project ${projectId}: 'project_features' empty or missing. Falling back to 'functional_spec'.`);\n\n const spec = project.functional_spec as any;\n if (spec && typeof spec === 'object' && Array.isArray(spec.features)) {\n featuresList = spec.features.map((f: any) => ({\n id: 'legacy',\n title: f.name || f.title,\n description: f.description,\n status: f.status || 'proposed'\n }));\n }\n }\n\n // 4. Format Response\n if (featuresList.length === 0) {\n return { content: [{ type: 'text', text: 'No active features found (checked DB and Spec).' }] };\n }\n\n const formatted = `=== PROJECT FEATURES (Source: ${source}) ===\\n` +\n featuresList.map(f => {\n return `- ${f.title} [${f.status}]`;\n }).join('\\n');\n\n return {\n content: [{ type: 'text', text: formatted }]\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 { 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 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.error(`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","import { SupabaseClient } from '@supabase/supabase-js';\nimport { AuditRlsStatusInput } from '../lib/types.js';\nimport * as Checks from './security-checks.js';\nimport * as ArchChecks from './security-checks-arch.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 archViolations = ArchChecks.checkArchitectureIntegrity(filePath, content);\n violations.push(...archViolations);\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","\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\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 Architectural Integrity (SEC-ARCH-01, SEC-ARCH-02, SEC-ARCH-03)\n */\nexport function checkArchitectureIntegrity(filePath: string, content: string): SecurityViolation[] {\n const violations: SecurityViolation[] = [];\n\n // Define UI context: Components, Hooks, and client-side pages (rough heuristic)\n // We exclude 'api', 'actions', 'lib', 'utils' from this restriction generally, \n // though 'lib'/ 'utils' should also be clean ideally. Let's focus on strict UI layers.\n const isUI = filePath.includes('/components/') || filePath.includes('/hooks/') || (filePath.includes('/app/') && !filePath.includes('/api/') && !filePath.includes('actions.ts') && !filePath.includes('route.ts'));\n\n // SEC-ARCH-01: Illegal Supabase Client in UI\n // Rule: /(import.*from\\s+['\"]@supabase\\/supabase-js['\"])/g\n if (isUI) {\n const illegalImportRegex = /(import.*from\\s+['\"]@supabase\\/supabase-js['\"])/g;\n if (illegalImportRegex.test(content)) {\n violations.push({\n id: 'SEC-ARCH-01',\n type: 'ARCHITECTURE_VIOLATION',\n severity: 'FATAL',\n title: 'Illegal Supabase Client in UI',\n description: 'Direct import of @supabase/supabase-js in a UI component/hook is strictly forbidden. It bypasses the server boundary.',\n recommendation: 'Use the `createClient` helper from our utils or Server Actions for data access.'\n });\n }\n }\n\n // SEC-ARCH-02: Direct Query Pattern in UI\n // Rule: /\\.(from|select|insert|update|delete|rpc)\\s*\\(/g\n // Refinement: We specifically target 'supabase.from' effectively or chained calls. \n // To avoid false positives like Array.from, we can perform a simple check.\n if (isUI) {\n const dbActionRegex = /\\.(from|select|insert|update|delete|rpc)\\s*\\(/g;\n const matches = content.match(dbActionRegex);\n if (matches) {\n // Filter out 'Array.from' specifically to permit standard JS patterns\n const suspicious = matches.some(m => !m.includes('.from') || (m.includes('.from') && content.includes('supabase.from')));\n\n if (suspicious || (matches.length > 0 && content.includes('supabase'))) {\n violations.push({\n id: 'SEC-ARCH-02',\n type: 'ARCHITECTURE_VIOLATION',\n severity: 'FATAL',\n title: 'Direct Database Query in UI',\n description: 'Detected direct database query pattern (select/insert/update/delete) in a UI component. This exposes logic to the client.',\n recommendation: 'Move all data fetching logic to Server Components or Server Actions.'\n });\n }\n }\n }\n\n // SEC-ARCH-03: Missing 'use server'\n // Heuristic: If file is in an 'actions' folder OR exports functions ending in 'Action'/'Mutation', \n // it MUST have 'use server' at the top.\n const isActionFile = filePath.includes('/actions/') || filePath.includes('actions.ts');\n\n if (isActionFile) {\n // Check first 200 chars for 'use server'\n const header = content.slice(0, 200);\n const hasUseServer = /['\"]use server['\"]/.test(header);\n\n if (!hasUseServer) {\n violations.push({\n id: 'SEC-ARCH-03',\n type: 'ARCHITECTURE_VIOLATION',\n severity: 'FATAL',\n title: 'Missing \"use server\" Directive',\n description: 'File appears to be a Server Action module but lacks the \"use server\" directive.',\n recommendation: 'Add \"use server\" at the very top of the file.'\n });\n }\n }\n\n return violations;\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.error('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, existsSync, statSync } from 'node:fs';\nimport * as path from 'node: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 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 package.json for External Deps\n let externalDeps: Record<string, string> = {};\n const pkgPath = path.join(process.cwd(), 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkgContent = await fs.readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(pkgContent);\n externalDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n } catch (e) {\n console.error('Failed to parse package.json', e);\n }\n }\n\n // 2. Scan TypeScripts files for Internal Deps\n const allFiles = await getAllFiles(searchPath);\n const tsFiles = allFiles.filter(f => /\\.(ts|tsx|js|jsx)$/.test(f) && !f.includes('node_modules') && !f.includes('dist') && !f.includes('.next'));\n\n // 3. Build Graph\n const graph: Record<string, string[]> = {};\n\n for (const file of tsFiles) {\n const content = await fs.readFile(file, 'utf-8');\n const imports = extractImports(content);\n\n // Resolve imports to file paths relative to searchPath\n const validDeps: string[] = [];\n const fileDir = path.dirname(file);\n\n for (const imp of imports) {\n // Check if it's an external dep\n if (Object.keys(externalDeps).some(d => imp === d || imp.startsWith(d + '/'))) {\n continue; // Skip external deps in internal graph for now\n }\n\n // Local import resolution logic (String based only, no require!)\n if (imp.startsWith('.') || imp.startsWith('@/')) {\n const resolved = resolveImportString(file, imp, searchPath);\n if (resolved && tsFiles.includes(resolved)) {\n validDeps.push(path.relative(searchPath, resolved));\n }\n }\n }\n\n const relFile = path.relative(searchPath, file);\n graph[relFile] = validDeps;\n }\n\n // 4. 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 externalDependencies: Object.keys(externalDeps).length\n },\n cycles: cycles,\n status: cycles.length > 0 ? 'VIOLATION' : 'PASS',\n summary: cycles.length > 0\n ? `FAILED. Detected ${cycles.length} circular dependencies. Einar demands resolution!`\n : `PASSED. Architecture is sound. No circular dependencies 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\nfunction extractImports(content: string): string[] {\n // Regex to match import ... from \"...\" or import \"...\"\n const regex = /from\\s+['\"]([^'\"]+)['\"]|import\\s+['\"]([^'\"]+)['\"]/g;\n const imports: string[] = [];\n let match;\n while ((match = regex.exec(content)) !== null) {\n imports.push(match[1] || match[2]);\n }\n return imports;\n}\n\nfunction resolveImportString(importer: string, importPath: string, root: string): string | null {\n let targetDir = path.dirname(importer);\n let target = importPath;\n\n if (importPath.startsWith('@/')) {\n target = importPath.replace('@/', '');\n targetDir = root; // Assume @ maps to root of scan path\n }\n\n // Construct potential path\n const naivePath = path.resolve(targetDir, target);\n\n // Check extensions\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx'];\n\n // We already have the full file list in memory in the main function, \n // but here we do a quick disk check since we are inside a helper.\n // For a REALLY robust solution, we should pass the fileSet to this function,\n // but checking disk is fine for this tool.\n\n for (const ext of extensions) {\n const candidate = naivePath + ext;\n if (existsSync(candidate) && !statSync(candidate).isDirectory()) {\n return candidate;\n }\n }\n\n // Check if it matches exactly (e.g. file.ts was imported as file.ts)\n if (existsSync(naivePath) && !statSync(naivePath).isDirectory()) {\n return naivePath;\n }\n\n return null;\n}\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 found\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","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\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 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\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 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","\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","\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"],"mappings":"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","names":["generateRuleContent","generateRuleFiles","fetchLegacyStats","fetchActiveAgents","fetchProjectTechStack","getFileNameForIDE","RIGSTATE_START","RIGSTATE_END","z","z","z","z","z","z","z","path","path","fs","fs","path","fs","path","resolve","taskTitle"]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../../rules-engine/dist/types.js","../../rules-engine/dist/sections/identity.js","../../rules-engine/dist/sections/stack-dna.js","../../rules-engine/dist/sections/current-step.js","../../rules-engine/dist/sections/workflow.js","../../rules-engine/dist/sections/tooling.js","../../rules-engine/dist/sections/skills.js","../../rules-engine/dist/utils/mdc.js","../../rules-engine/dist/index.js","../src/index.ts","../src/lib/supabase.ts","../src/server/factory.ts","../src/server/types.ts","../src/lib/tool-registry.ts","../src/tools/curator-tools.ts","../src/lib/curator/index.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/teacher-mode.ts","../src/tools/get-project-context.ts","../src/lib/context-engine.ts","../src/lib/schemas.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/audit-integrity-gate.ts","../src/tools/analyze-database-performance.ts","../src/tools/security-tools.ts","../src/tools/security-checks.ts","../src/tools/security-checks-arch.ts","../src/tools/complete-roadmap-task.ts","../src/tools/planning-tools.ts","../src/tools/arch-tools.ts","../src/server/core.ts","../src/server/telemetry.ts","../src/tools/generate-professional-pdf.ts","../src/agents/the-scribe.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IDE_FILE_NAMES = void 0;\n/**\n * Mapping of IDE providers to their respective rules file names.\n * Centralized here to ensure consistency across all consumers.\n */\nexports.IDE_FILE_NAMES = {\n cursor: '.cursorrules',\n antigravity: '.cursorrules',\n windsurf: '.windsurfrules',\n vscode: '.cursorrules',\n copilot: '.github/copilot-instructions.md',\n generic: 'CONVENTIONS.md'\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateIdentitySection = generateIdentitySection;\nfunction generateIdentitySection(project, ide, activeAgents) {\n const mission = project.functional_spec?.projectDescription\n || project.description\n || `Build a ${project.ambition_level || 'professional'} application.`;\n const audienceInfo = project.functional_spec?.targetAudience\n ? `\\n- **Target Users:** ${project.functional_spec.targetAudience}`\n : '';\n const problemInfo = project.functional_spec?.coreProblem\n ? `\\n- **Problem Being Solved:** ${project.functional_spec.coreProblem}`\n : '';\n // Build specialist context list\n const specialistList = activeAgents?.map((a) => `- **${a.name}** (\\`${a.key}\\`, Lvl ${a.authority_level}): ${a.primary_mission || extractFirstSentence(a.content)}`).join('\\n') || '- No specialists configured.';\n return `## 🧠 PROJECT CONTEXT\n\n**Project:** ${project.name} \n**ID:** \\`${project.id}\\` \n**Mission:** ${mission}${audienceInfo}${problemInfo}\n\n---\n\n## πŸ€– SPECIALIST PERSONAS\n\nThe following personas represent areas of expertise. Reference their guidelines when working in their domain.\n\n${specialistList}\n\n### How to Use Specialists\n1. **Architecture & Governance** β†’ Follow Frank's guidelines for code structure and security.\n2. **Documentation & Reports** β†’ Use The Scribe's patterns for markdown and PDFs.\n3. **Historical Context** β†’ Consult The Librarian for legacy feature discovery.\n\n> **Note:** These are informational contexts, not active agents. You (the IDE agent) execute all code.\n\n---\n\n## 🎯 CODING PRINCIPLES\n- **CONCISE:** No filler words. Get to the point.\n- **PRECISE:** Give specific answers with file paths and code.\n- **PRACTICAL:** Focus on what ships, not theory.\n- **GUARDIAN-AWARE:** Respect architectural constraints in the Guardian rules.`;\n}\nfunction extractFirstSentence(text) {\n const match = text.match(/^[^.!?]*[.!?]/);\n return match ? match[0].trim() : text.slice(0, 100) + '...';\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateStackDnaSection = generateStackDnaSection;\nfunction generateStackDnaSection(project, stack, legacyStats) {\n const stackText = stack.length > 0\n ? stack.map(s => `- ${s}`).join('\\n')\n : '- Next.js 14+ (App Router)\\n- Supabase\\n- TypeScript\\n- Tailwind CSS';\n const tenancy = project.tenancy || 'SINGLE';\n const monetization = project.monetization || 'FREE';\n const compliance = project.compliance || 'NONE';\n const vibe = project.vibe || 'CREATIVE';\n // Dynamic settings with defaults\n const lmax = project.settings?.lmax || 400;\n const lmaxUi = project.settings?.lmax_ui || 250;\n const securityLevel = project.settings?.security_level || 'STANDARD';\n const guardianRules = [\n `πŸ›‘οΈ **THE ${lmax}-LINE RULE (STRICT):** No file may exceed ${lmax} lines. If approaching this limit, you MUST propose a refactor into smaller modules.`,\n `πŸ›‘οΈ **TSX LIMIT:** React components (.tsx) should not exceed ${lmaxUi} lines. Extract sub-components proactively.`,\n 'πŸ›‘οΈ **TYPE SAFETY:** Avoid \"any\". Use strict TypeScript types. Infer from Zod schemas when possible.',\n ];\n if (tenancy === 'MULTI_ORG') {\n guardianRules.push('πŸ” All database queries MUST be org-scoped (filter by org_id)');\n guardianRules.push('πŸ” Implement proper organization switching in UI');\n }\n else {\n guardianRules.push('πŸ‘€ All queries are user-scoped (filter by user_id or RLS)');\n }\n if (stackText.toLowerCase().includes('supabase')) {\n guardianRules.push('⚑ Enable RLS on ALL new tables immediately');\n guardianRules.push('⚑ Use @supabase/ssr patterns for server-side auth');\n }\n if (compliance === 'GDPR') {\n guardianRules.push('πŸ›‘οΈ GDPR: Implement data export and deletion endpoints');\n }\n else if (compliance === 'HIPAA') {\n guardianRules.push('πŸ›‘οΈ HIPAA: Encrypt all PHI at rest and in transit');\n }\n // Security Level Rules\n if (securityLevel === 'STRICT') {\n guardianRules.push('πŸ”’ STRICT MODE: All inputs MUST be validated with Zod schemas');\n guardianRules.push('πŸ”’ STRICT MODE: Consult Security Specialist for ANY auth-related changes');\n }\n else if (securityLevel === 'MINIMAL') {\n guardianRules.push('⚑ MINIMAL MODE: Focus on speed over security hardening for MVP');\n }\n // IMPACT_GUARD: Dependency analysis before destructive actions\n guardianRules.push('🚨 **IMPACT_GUARD:** Before deleting ANY file, you MUST:');\n guardianRules.push(' 1. Search codebase for all imports/references (use grep_search or equivalent)');\n guardianRules.push(' 2. Update or remove ALL references first');\n guardianRules.push(' 3. Only delete after confirming ZERO references remain');\n guardianRules.push(' 4. Commit changes atomically (references + deletion in same commit)');\n // BUILD_INTEGRITY: Type-check verification after structural changes\n guardianRules.push('βœ… **BUILD_INTEGRITY:** After ANY structural change (new files, moved modules, refactors):');\n guardianRules.push(' 1. Run type-check (e.g., `tsc --noEmit` or framework equivalent)');\n guardianRules.push(' 2. Verify build success before declaring task complete');\n guardianRules.push(' 3. If errors detected, fix immediatelyβ€”do NOT leave broken builds');\n let legacySection = '';\n if (legacyStats && legacyStats.legacyCount > 0) {\n legacySection = `\n### πŸ“š Legacy Context\nThis project contains **${legacyStats.legacyCount} legacy features** (imported via Brynjar) and **${legacyStats.activeCount} active features**.\n\n**LEGACY AWARENESS RULE:**\nWhen encountering code or features marked with \\`is_legacy: true\\`:\n- Treat them as **Established Foundations** β€” they are proven, working code.\n- Any modifications to legacy code MUST bring it up to current Guardian standards:\n - Type-safety (no \"any\")\n - RLS enforcement (if database-related)\n - 400-line limit compliance\n - Proper error handling\n- Do NOT count legacy features in velocity metrics β€” they predate Rigstate.`;\n }\n return `## 🧬 STACK DNA\n\n### Tech Stack\n${stackText}\n\n### Project Configuration\n| Attribute | Value |\n|-----------|-------|\n| Tenancy | ${tenancy} |\n| Monetization | ${monetization} |\n| Compliance | ${compliance} |\n| Design Vibe | ${vibe} |\n${legacySection}\n\n### πŸ›‘οΈ GUARDIAN RULES (Mandatory)\n${guardianRules.map(r => `${r}`).join('\\n')}`;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateCurrentStepSection = generateCurrentStepSection;\nfunction generateCurrentStepSection(roadmap) {\n const activeRoadmap = roadmap.filter((r) => r.is_legacy !== true);\n const activeSteps = activeRoadmap\n .filter((r) => r.status === 'ACTIVE')\n .sort((a, b) => a.step_number - b.step_number);\n if (activeSteps.length === 0) {\n const nextSteps = activeRoadmap\n .filter((r) => r.status === 'LOCKED')\n .sort((a, b) => a.step_number - b.step_number)\n .slice(0, 1);\n if (nextSteps.length === 0)\n return null;\n return `## 🎯 CURRENT FOCUS\n\n> **No active task.** The next step in the backlog is:\n> \n> **Step ${nextSteps[0].step_number}: ${nextSteps[0].title}**`;\n }\n const currentStep = activeSteps[0];\n let objectiveText = currentStep.title;\n let constraintsText = '';\n let dodText = '';\n if (currentStep.prompt_content) {\n const content = currentStep.prompt_content;\n const objectiveMatch = content.match(/###\\s*🎯\\s*Objective\\s*\\n([\\s\\S]*?)(?=###|$)/i);\n if (objectiveMatch)\n objectiveText = objectiveMatch[1].trim();\n const constraintsMatch = content.match(/###\\s*⚠️\\s*Constraints\\s*\\n([\\s\\S]*?)(?=###|$)/i);\n if (constraintsMatch)\n constraintsText = constraintsMatch[1].trim();\n const dodMatch = content.match(/###\\s*βœ…\\s*Definition of Done\\s*\\n([\\s\\S]*?)(?=###|$)/i);\n if (dodMatch)\n dodText = dodMatch[1].trim();\n }\n let section = `## 🎯 CURRENT FOCUS\n\n**Active Step ${currentStep.step_number}: ${currentStep.title}**\n${currentStep.sprint_focus ? `*Sprint: ${currentStep.sprint_focus}*` : ''}\n\n### Objective\n${objectiveText}`;\n if (constraintsText) {\n section += `\\n\\n### Task-Specific Constraints\\n${constraintsText}`;\n }\n if (dodText) {\n section += `\\n\\n### Definition of Done\\n${dodText}`;\n }\n return section;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateWorkflowSection = generateWorkflowSection;\nfunction generateWorkflowSection(ide) {\n const ideInstructions = ide === 'windsurf'\n ? `When working in **Windsurf**, coordinate with Cascade (Windsurf's AI) for code execution.`\n : `When working in **Cursor**, delegate implementation to Cursor Composer/Agent for code execution.`;\n return `## πŸ“‹ SUPERVISOR MODE: FRANK'S WORKFLOW\n\n**🎭 PARADIGM SHIFT: Frank is a Supervisor/Orchestrator, NOT a Code Executor**\n\nFrank's role is to **PLAN, DELEGATE, and VALIDATE** β€” NOT to write every line of code manually.\nThe IDE's native AI (Cursor Composer, Windsurf Cascade, etc.) handles code execution.\nFrank maintains **Architectural Control** and ensures **Guardian Compliance**.\n\n---\n\n### 🧭 SUPERVISOR WORKFLOW (3-Phase Protocol)\n\n**INITIATION PROTOCOL:**\nAt the start of every session, you MUST execute:\n\\`\\`\\`bash\nexport RIGSTATE_MODE=SUPERVISOR\n\\`\\`\\`\nThis activates the System Guardian.\n\n#### PHASE 1: πŸ“‹ PLAN & STRUCTURE\n**Frank's Responsibility:**\n1. **Analyze the Task:** Read the roadmap step's EXECUTIVE SUMMARY, TECHNICAL PROMPT, and METADATA\n2. **Query Project Brain:** Use \\`query_brain\\` to fetch relevant decisions, patterns, and constraints\n3. **Generate Structured Plan:**\n - Break down into logical sub-tasks (if $L_{max}$ compliance requires modularization)\n - Identify affected files and modules\n - Map dependencies and execution order\n - Define validation checkpoints\n4. **Terminal Feedback (MANDATORY):**\n \\`\\`\\`\n 🎯 FRANK: Planning Task [Title]\n πŸ“Š Scope: [X files, Y modules]\n πŸ” Brain Context: [N relevant memories loaded]\n πŸ“ Execution Plan:\n 1. [Sub-task A] - [File/Module]\n 2. [Sub-task B] - [File/Module]\n 3. [Validation] - [Criteria]\n \n ⏱️ Estimated Token Load: [High/Medium/Low]\n ⚠️ If this exceeds your context, type \"FORTSETT\" after each phase.\n \\`\\`\\`\n\n**OUTPUT:** A clear, copy-pasteable Technical Prompt for the IDE's AI\n\n---\n\n#### PHASE 2: πŸ€– DELEGATE TO NATIVE EXECUTION\n**Frank's Responsibility:**\n1. **Present Delegation Prompt:**\n \\`\\`\\`\n 🎬 FRANK β†’ ${ide === 'cursor' ? 'CURSOR COMPOSER' : 'WINDSURF CASCADE'}:\n \n ${ide === 'cursor'\n ? 'Please execute the following implementation using Cursor Composer (Cmd+I or Chat Panel):'\n : 'Please execute the following implementation using Windsurf Cascade:'}\n \n ### πŸ›  TECHNICAL PROMPT\n [Paste the structured prompt from PHASE 1]\n \n ### ⚠️ GUARDIAN CONSTRAINTS (STRICT)\n - UI files MUST be < 250 lines ($L_{max}^{UI}$)\n - Logic files MUST be < 400 lines ($L_{max}^{Logic}$)\n - [Additional project-specific constraints from Brain]\n \n ### βœ… DEFINITION OF DONE\n - [ ] [Criteria 1]\n - [ ] [Criteria 2]\n - [ ] Passes \\`npx tsc --noEmit\\`\n - [ ] Passes \\`npm run build\\`\n \\`\\`\\`\n\n2. **Wait for IDE Execution:**\n - Frank does NOT write the code himself\n - Frank monitors for completion signals (user confirmation or file system changes)\n - If task is too large, Frank MUST split into chunks and ask user to type **\"FORTSETT\"** to continue\n\n3. **Terminal Feedback (MINIMALIST):**\n \\`\\`\\`\n ⏳ DELEGATED: ${ide === 'cursor' ? 'Cursor Composer' : 'Windsurf Cascade'}\n πŸ“‚ FILES: [list 1, list 2...]\n \\`\\`\\`\n\n**SILENT PROTOCOL:** Frank acts as a silent supervisor. He NEVER explains his role. He only logs status updates. The IDE Agent executes the code.\n\n---\n\n#### PHASE 3: βœ… VALIDATE & SYNC (MANDATORY)\n\n1. **Mission Report Generation:**\n Create \\`.rigstate/logs/last_execution.json\\`:\n \\`\\`\\`json\n {\n \"task_summary\": \"Short description of the task completed\",\n \"files_touched\": [\"relative/path/to/file1\", \"relative/path/to/file2\"],\n \"security_status\": \"SECURE\"\n }\n \\`\\`\\`\n\n2. **Architecture Audit:** \\`run_architecture_audit\\`\n\n3. **Team Check (Silent):**\n \\`\\`\\`\n [CHECKING: SVEN] ... [OK]\n \\`\\`\\`\n\n4. **Linter Guard:** \\`npx tsc --noEmit && npm run build\\`\n\n5. **SYSTEM SYNC (MANDATORY):**\n \\`\\`\\`bash\n npx rigstate sync\n \\`\\`\\`\n\n6. **Mission Briefing:**\n Present a concise, human-readable summary of the work done.\n\n7. **Complete & Log (MANDATORY):**\n When the task is done and validated:\n **YOU MUST** offer to complete the task programmatically.\n ASK the user: \"Shall I mark this task as completed?\"\n IF YES -> Call tool: \\`complete_roadmap_task(projectId, summary)\\`\n\n8. **Final Signal:**\n \\`\\`\\`\n [VALIDATED]\n \\`\\`\\`\n\n9. **Self-Correction Protocol:**\n - Quietly identify errors.\n - Generate specific fix prompts for IDE.\n\n6. **Terminal Feedback (MINIMALIST):**\n When all checks pass, output ONLY:\n \\`\\`\\`\n [VALIDATED]\n Task tracked in roadmap.\n \\`\\`\\`\n \n **RULE:** The IDE Agent acts as the worker. It MUST wait for Frank's **[VALIDATED]** signal before marking any task as done.\n\n---\n\n### πŸ”„ ATOMIC REVERT PROTOCOL (Safety Net)\n\nIf validation fails after **3 correction attempts**:\n\n1. **STOP** all further modifications\n2. **TERMINAL FEEDBACK (MANDATORY):**\n \\`\\`\\`\n ❌ ATOMIC REVERT TRIGGERED\n πŸ“‹ Task: [task-id]\n πŸ”΄ Reason: [error description]\n πŸ”„ Attempts: 3/3 exhausted\n πŸ›‘οΈ Action: Reverting to checkpoint...\n \\`\\`\\`\n3. **REVERT:**\n \\`\\`\\`bash\n git checkout . && git stash pop # OR: git reset --hard HEAD\n \\`\\`\\`\n4. **UPDATE:** Mark task as \\`FAILED\\` with detailed explanation\n5. **ESCALATE:** Notify user of blocker for manual intervention\n\n**CORE PRINCIPLE:** NEVER leave codebase in broken state.\n\n---\n\n### πŸ“’ PERSISTENCE & TRANSPARENCY RULES (MANDATORY)\n\nFrank MUST provide **live terminal feedback** before EVERY operation:\n\n1. **Before Planning:**\n \\`\\`\\`\n 🎯 FRANK: Starting analysis for [Task Title]...\n \\`\\`\\`\n\n2. **Before Delegation:**\n \\`\\`\\`\n πŸ€– FRANK: Preparing prompt for ${ide === 'cursor' ? 'Cursor Composer' : 'Windsurf Cascade'}...\n \\`\\`\\`\n\n3. **Before Validation:**\n \\`\\`\\`\n πŸ” FRANK: Running architecture audit on [N files]...\n \\`\\`\\`\n\n4. **Token Buffer Management:**\n - If a task requires > 50% of context window, Frank MUST split into phases\n - User types **\"FORTSETT\"** (Norwegian for \"CONTINUE\") to load next buffer\n - Example:\n \\`\\`\\`\n ⚠️ FRANK: Phase 1 complete. Token usage: 75%\n πŸ’¬ Type \"FORTSETT\" to continue with Phase 2 (Database Migrations)\n \\`\\`\\`\n\n**PURPOSE:** Eliminate \"Black Box\" feeling. User always knows what Frank is doing.\n\n---\n\n### 🎯 HOW TO READ ROADMAP STEPS\n\nEach Rigstate roadmap task follows this structure:\n\n\\`\\`\\`markdown\n### πŸ“ EXECUTIVE SUMMARY\n[Business value and user impact]\n\n### πŸ›  TECHNICAL PROMPT\nCONTEXT: [Files/Modules affected]\nOBJECTIVE: [One-sentence goal]\nGUARDIAN CONSTRAINTS: [File limits, compliance rules]\nDEFINITION OF DONE: [Success checklist]\n\n### πŸ’‘ IMPLEMENTATION HINTS\n[Code snippets and patterns]\n\n### πŸ“Š METADATA\n- Author: [Agent/User]\n- Source: [Origin of task]\n- Strategy Alignment: [DNA focus area]\n\\`\\`\\`\n\n${ideInstructions}\n\n---\n\n## πŸ›‘οΈ SAFETY PROTOCOLS (Mandatory)\n\n### 1. πŸ“Έ Pre-Flight Checkpoint\n**BEFORE delegating to IDE**, Frank MUST create recovery point:\n\\`\\`\\`bash\ngit stash push -m \"checkpoint-before-[task-id]\"\n# OR: git checkout -b checkpoint/[task-id] && git checkout -\n\\`\\`\\`\n\n### 2. 🚨 Linter Guard (STRICT)\n**FORBIDDEN** to mark \\`COMPLETED\\` if:\n- Syntax errors exist\n- TypeScript/ESLint errors present\n- \\`npm run build\\` fails\n\n**Verification:**\n\\`\\`\\`bash\nnpx tsc --noEmit && npm run build\n\\`\\`\\`\n\n### 3. πŸ”„ Self-Correction Loop\nMax 3 attempts with escalating strategies:\n1. Targeted fix\n2. Broader refactor\n3. Minimal surgical change OR user escalation\n\n---\n\n## πŸ”„ WATCHER MODE (Proactive Task Execution)\n\nFrank monitors for approved tasks and orchestrates execution:\n\n1. **Session Start:**\n - Call \\`get_pending_tasks\\` to check for approved work\n - Summarize tasks and ask user which to tackle\n\n2. **Execution Flow:**\n - **CHECKPOINT:** Create pre-flight snapshot\n - **PLAN:** Generate structured execution plan (Phase 1)\n - **DELEGATE:** Send prompt to IDE's native AI (Phase 2)\n - **VALIDATE:** Run architecture audit + linter guard (Phase 3)\n - **COMPLETE:** Update \\`update_task_status(COMPLETED)\\` with summary\n\n3. **Error Handling:**\n - Enter Self-Correction Loop (max 3 attempts)\n - If still failing, trigger Atomic Revert\n - Update task status to \\`FAILED\\` with explanation\n\n**CRITICAL:** Frank orchestrates, ${ide === 'cursor' ? 'Cursor' : 'Windsurf'} executes, Frank validates.`;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateToolingSection = generateToolingSection;\nfunction generateToolingSection(activeAgents) {\n const getAgent = (keyPart) => activeAgents?.find((a) => a.key.includes(keyPart));\n const frank = getAgent('frank') || getAgent('orchestrator');\n const brynjar = getAgent('brynjar');\n const gunhild = getAgent('scribe');\n const sindre = getAgent('sindre');\n const sven = getAgent('sven');\n const allTools = [\n { name: 'query_brain', owner: frank, desc: 'Search project memories and decisions' },\n { name: 'save_decision', owner: frank, desc: 'Record architectural decisions (ADRs)' },\n { name: 'update_roadmap', owner: frank, desc: 'Mark steps as ACTIVE or COMPLETED' },\n { name: 'run_architecture_audit', owner: frank, desc: 'Audit code against Guardian rules' },\n { name: 'get_pending_tasks', owner: frank, desc: 'Fetch APPROVED tasks from dashboard ready for execution' },\n { name: 'update_task_status', owner: frank, desc: 'Mark tasks as EXECUTING, COMPLETED, or FAILED' },\n { name: 'audit_integrity_gate', owner: frank, desc: 'Runs combined Security and Performance audit. SOFT LOCK if failed.' },\n { name: 'archaeological_scan', owner: brynjar, desc: 'Scan Git history for legacy features' },\n { name: 'import_ghost_features', owner: brynjar, desc: 'Import discovered features to roadmap' },\n { name: 'generate_professional_pdf', owner: gunhild, desc: 'Generate System Manifest or Investor Report' },\n { name: 'analyze_database_performance', owner: sindre, desc: 'Deep scan for N+1 queries and missing indexes' },\n { name: 'audit_rls_status', owner: sven, desc: 'Verify Row Level Security is enabled on all tables' }\n ];\n const activeTools = allTools.filter(t => t.owner !== undefined);\n let triggers = '';\n if (activeAgents && activeAgents.length > 0) {\n triggers = `\\n### ⚑️ ACTIVE AGENT TRIGGERS\nWhen your prompt mentions specific keywords, summon the appropriate specialist (respecting Authority Levels):\n\n${activeAgents.map((a) => {\n const triggerInfo = a.trigger_keywords\n ? `\"${a.trigger_keywords}\"`\n : `\"${a.primary_mission || 'General assistance'}\"`;\n return `- Intent: ${triggerInfo} β†’ Activate **${a.name}** [ID: ${a.id}] (Authority: ${a.authority_level})`;\n }).join('\\n')}`;\n }\n const toolTable = activeTools.length > 0\n ? `| Tool | Agent Owner | Description |\n|------|-------------|-------------|\n${activeTools.map(t => `| \\`${t.name}\\` | ${t.owner?.name} [ID: ${t.owner?.id}] | (Owner: [ID: ${t.owner?.id}]) ${t.desc} |`).join('\\n')}`\n : '> No specialized tools active for the current team roster.';\n return `## πŸ”§ TOOLING\n\n### Rigstate CLI Commands\n\\`\\`\\`bash\nrigstate scan # Scan current directory for issues\nrigstate scan --project <id> # Scan with project context\nrigstate fix --project <id> # Interactive AI fix mode\nrigstate complete # Mark current step as complete\n\\`\\`\\`\n\n### MCP Tools (Model Context Protocol)\nThese tools are available when using the Rigstate MCP server:\n\n${toolTable}\n\n**Strict Tool Ownership:**\nWhen a tool is invoked, the AI must adopt the persona and Authority Level of the Agent ID listed as the 'Owner' in the tool description. Do not execute tools as a generic assistant.\n\n### Environment Variables\nEnsure these are set in your \\`.env.local\\`:\n\\`\\`\\`\nRIGSTATE_API_KEY=<your-key>\nRIGSTATE_PROJECT_ID=<auto-detected-or-set>\n\\`\\`\\`${triggers}`;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateAvailableSkillsSection = generateAvailableSkillsSection;\nexports.generateSkillFileContent = generateSkillFileContent;\nexports.getRigstateStandardSkills = getRigstateStandardSkills;\n/**\n * Generate the <available_skills> XML block for the root .cursorrules file.\n */\nfunction generateAvailableSkillsSection(skills) {\n if (skills.length === 0)\n return '';\n const skillBlocks = skills.map(skill => ` <skill>\n <name>${skill.name}</name>\n <description>${skill.description}</description>\n <location>.agent/skills/${skill.name}/SKILL.md</location>\n </skill>`).join('\\n');\n return `## 🧠 AGENT SKILLS\n> **OPTIMIZED CAPABILITIES:** The following skills are available for on-demand activation.\n\n<available_skills>\n${skillBlocks}\n</available_skills>`;\n}\n/**\n * Generate the content for a specific SKILL.md file.\n */\nfunction generateSkillFileContent(skill) {\n return `---\nname: ${skill.name}\ndescription: ${skill.description}\nversion: \"${skill.version}\"\nspecialist: ${skill.specialist}\ngovernance: ${skill.governance}\n---\n\n${skill.content}\n\n---\n*Generated by Rigstate Rules Engine. Do not modify manually.*`;\n}\n/**\n * Get the standard Rigstate library of skills.\n */\nfunction getRigstateStandardSkills() {\n return [\n {\n name: 'rigstate-integrity-gate',\n description: 'Handles the Pre-Deployment Compliance Gate, automated quality audits (Security/Performance), and generation of the Strategic Release Manifest. Use this whenever you are finishing a task or moving code towards completion.',\n version: '1.0.0',\n specialist: 'Frank (The Orchestrator)',\n governance: 'SOFT_LOCK',\n content: `# πŸŽ–οΈ Rigstate Integrity Gate Skill\n\nThis skill defines the high-level protocol for ensuring code quality and security before a task is marked as \"COMPLETED\". It orchestrates specialized agents (Sven, Sindre) and generates the audit trail known as the **Strategic Release Manifest**.\n\n## πŸ”„ The Protocol Workflow\n\nWhenever you are ready to complete a task, follow this mandatory 3-step sequence:\n\n### 1. Audit (The Scan)\nRun the \\`audit_integrity_gate\\` tool. This will trigger:\n- **Security Check (Sven):** Scans for RLS status on all tables.\n- **Performance Check (Sindre):** Scans for N+1 queries and missing database indexes.\n\n### 2. Decision (The Gate)\nEvaluate the result from \\`audit_integrity_gate\\`:\n- **Mode: OPEN:** All critical checks passed. You can proceed to completion.\n- **Mode: SOFT_LOCK:** Issues were found (e.g., missing RLS or N+1 warnings). You **MUST** report these to the user. You can only proceed if the user provides an override or if you fix the issues first.\n- **Mode: HARD_LOCK (Future):** Critical violations detected. Completion is blocked until fixed.\n\n### 3. Manifest (The Release)\nUpon passing the gate, use the \\`complete_roadmap_task\\` tool. \n- Pass the **full JSON response** from the \\`audit_integrity_gate\\` into the \\`integrityGate\\` parameter.\n- This automatically generates the **Strategic Release Manifest** in the Mission Report, creating a permanent record of quality for this release.\n\n## πŸ› οΈ Tools Used by this Skill\n\n- \\`audit_integrity_gate\\`: Orchestrates the security and performance scans.\n- \\`complete_roadmap_task\\`: Finalizes the task and attaches the quality certificate.\n\n## πŸ“ Best Practices\n\n- **Never skip the audit.** Even if you think the change is small, the Integrity Gate is our source of truth.\n- **Explain violations clearly.** If in \\`SOFT_LOCK\\`, don't just say \"it failed\". List the specific tables lacking RLS or the specific files with N+1 issues.\n- **Summarize the Manifest.** After successful completion, tell the user: \"Release Manifest generated with [X] security passes and [Y] performance checks.\"`\n },\n {\n name: 'rigstate-legacy-renovator',\n description: 'Handles the modernization of legacy Vibeline code to the Rigstate standard. Renovates branding, extracts \"Ghost Features\" into the roadmap, and repairs architectural drift.',\n version: '1.0.0',\n specialist: 'Brynjar (The Archivist)',\n governance: 'SOFT_LOCK',\n content: `# 🏺 Rigstate Legacy Renovator Skill\n\nThis skill is activated when legacy patterns (e.g., \"Vibeline\") are detected. It uses archaeological scanning to restore technical history and performs branding renovation.\n\n## πŸ”„ The Protocol Workflow\n\n### 1. Archaeological Scan (The Discovery)\nUse the \\`archaeological_scan\\` tool to find \"Ghost Features\" – completed work that is not yet reflected in the project roadmap. This restores the technical context of the project.\n\n### 2. Import Ghost Features\nIf the scan discovers COMPLETED work, use \\`import_ghost_features\\` to add them to the roadmap. This ensures the agent understands the historical foundation it is building upon.\n\n### 3. Branding Renovation\nIdentify \"Vibeline\" references in:\n- UI components (Text logos, labels)\n- Code comments and TODOs\n- Documentation\n- Database seed files\n\nPerform a non-destructive rename to \"Rigstate\" following the rebrand protocol.\n\n### 4. Dependency Audit\nCheck for circular dependencies or architectural violations in legacy modules using \\`analyze_dependency_graph\\`.\n\n## πŸ› οΈ Tools Used by this Skill\n\n- \\`archaeological_scan\\`: Reconstructs project history from Git.\n- \\`import_ghost_features\\`: Synchronizes historical work with the roadmap.\n- \\`analyze_dependency_graph\\`: Detects architectural rot.\n\n## πŸ“ Best Practices\n\n- **Respect History.** Don't delete legacy notes; transform them into Rigstate memories.\n- **Batched Renaming.** Rename branding in logical groups (e.g., all UI first, then all comments).\n- **Update the Brain.** When a legacy feature is renovated, save the decision to the Project Brain using \\`save_to_project_brain\\`.`\n }\n ];\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wrapMdc = wrapMdc;\n/**\n * Utility to wrap markdown content with MDC (Modern Cursor) frontmatter.\n */\nfunction wrapMdc(content, metadata) {\n const yaml = ['---'];\n if (metadata.description) {\n yaml.push(`description: \"${metadata.description.replace(/\"/g, '\\\\\"')}\"`);\n }\n if (metadata.globs && metadata.globs.length > 0) {\n yaml.push('globs:');\n for (const glob of metadata.globs) {\n yaml.push(` - \"${glob}\"`);\n }\n }\n if (metadata.alwaysApply !== undefined) {\n yaml.push(`alwaysApply: ${metadata.alwaysApply}`);\n }\n yaml.push('---');\n return `${yaml.join('\\n')}\\n${content}`;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRigstateStandardSkills = exports.generateSkillFileContent = exports.generateAvailableSkillsSection = exports.IDE_FILE_NAMES = void 0;\nexports.generateRuleContent = generateRuleContent;\nexports.generateRuleFiles = generateRuleFiles;\nexports.fetchLegacyStats = fetchLegacyStats;\nexports.fetchActiveAgents = fetchActiveAgents;\nexports.mergeRuleContent = mergeRuleContent;\nexports.fetchProjectTechStack = fetchProjectTechStack;\nexports.getFileNameForIDE = getFileNameForIDE;\nconst types_1 = require(\"./types\");\nconst identity_1 = require(\"./sections/identity\");\nconst stack_dna_1 = require(\"./sections/stack-dna\");\nconst current_step_1 = require(\"./sections/current-step\");\nconst workflow_1 = require(\"./sections/workflow\");\nconst tooling_1 = require(\"./sections/tooling\");\nconst skills_1 = require(\"./sections/skills\");\nconst mdc_1 = require(\"./utils/mdc\");\nvar types_2 = require(\"./types\");\nObject.defineProperty(exports, \"IDE_FILE_NAMES\", { enumerable: true, get: function () { return types_2.IDE_FILE_NAMES; } });\nvar skills_2 = require(\"./sections/skills\");\nObject.defineProperty(exports, \"generateAvailableSkillsSection\", { enumerable: true, get: function () { return skills_2.generateAvailableSkillsSection; } });\nObject.defineProperty(exports, \"generateSkillFileContent\", { enumerable: true, get: function () { return skills_2.generateSkillFileContent; } });\nObject.defineProperty(exports, \"getRigstateStandardSkills\", { enumerable: true, get: function () { return skills_2.getRigstateStandardSkills; } });\nconst RIGSTATE_START = \"RIGSTATE_START\";\nconst RIGSTATE_END = \"RIGSTATE_END\";\nconst ENGINE_VERSION = \"3.0.0\";\n/**\n * Generate modular IDE rule content optimized for AI coding assistants.\n * v2.4.0: Added Agent IDs, Tool Binding, and Strict Ownership.\n * Refactored into sub-modules for Guardian Compliance (400-line limit).\n */\n/**\n * Generate modular IDE rule content optimized for AI coding assistants.\n * v2.4.0: Added Agent IDs, Tool Binding, and Strict Ownership.\n * Refactored into sub-modules for Guardian Compliance (400-line limit).\n */\nfunction generateRuleContent(project, stack, roadmap, ide = 'cursor', legacyStats, activeAgents, lean = false) {\n const sections = [];\n sections.push('# πŸš€ Rigstate Supervisor v2.4 (Context-Aware)');\n // SECTION 0: HIERARCHY (Top Priority)\n sections.push(`IMPORTANT: Internal agent coordination must always use the provided Agent IDs. Display names are for user-facing chat only. When invoking tools or referencing hierarchy, use the ID as the primary key.\n\n## βš–οΈ AGENT HIERARCHY & AUTHORITY\nYou must defer to the instructions of agents with higher Authority Levels (10 being highest).\nSecurity and Architecture (Levels 8-10) always override creative or implementation suggestions (Levels 1-5).`);\n // SECTION 1: IDENTITY (Multi-Agent Ecosystem)\n // Always keep Identity in root for instant persona recognition\n const identitySection = (0, identity_1.generateIdentitySection)(project, ide, activeAgents);\n sections.push(identitySection);\n // SECTION 1.5: SKILLS (Discovery Layer)\n const skills = (0, skills_1.getRigstateStandardSkills)();\n const skillsSection = (0, skills_1.generateAvailableSkillsSection)(skills);\n if (skillsSection) {\n sections.push(skillsSection);\n }\n // SECTION 2: STACK DNA + GUARDIAN RULES\n // In Lean mode (Cursor context), we trust rigstate-guardian.mdc to handle this.\n if (!lean) {\n const stackDnaSection = (0, stack_dna_1.generateStackDnaSection)(project, stack, legacyStats);\n sections.push(stackDnaSection);\n }\n // SECTION 3: CURRENT STEP (Active Focus Injection)\n // In Lean mode, rigstate-roadmap.mdc handles this dynamically.\n if (!lean) {\n const currentStepSection = (0, current_step_1.generateCurrentStepSection)(roadmap);\n if (currentStepSection) {\n sections.push(currentStepSection);\n }\n }\n // SECTION 4: WORKFLOW (How to Parse Roadmap Steps)\n // Frank's \"Supervisor Mode\" logic.\n // We KEEP this in Lean mode because it defines the core behavior of the agent globally.\n // However, if it's identical to rigstate-workflow.mdc, we might consider linking.\n // But Frank's protocol is the \"Operating System\" of the session.\n const workflowSection = (0, workflow_1.generateWorkflowSection)(ide);\n sections.push(workflowSection);\n // SECTION 5: TOOLING (CLI + MCP Integration)\n // In Lean mode, rigstate-workflow.mdc has the specific CLI commands and tools.\n if (!lean) {\n const toolingSection = (0, tooling_1.generateToolingSection)(activeAgents);\n sections.push(toolingSection);\n }\n else {\n // Add a pointer in Lean mode\n sections.push(`## πŸ”§ TOOLING & SPECIFIC RULES\n> **OPTIMIZED MODE:** Detailed technical rules, CLI commands, and tech stack constraints are loaded dynamically from \\`.cursor/rules/*.mdc\\` based on the files you interact with.\n> - **Stack & Guardian:** See \\`rigstate-guardian.mdc\\`\n> - **Roadmap & Tasks:** See \\`rigstate-roadmap.mdc\\`\n> - **Tools & Workflow:** See \\`rigstate-workflow.mdc\\``);\n }\n // Generate IDE-specific header\n const headerMap = {\n cursor: `# Cursor Project Rules: ${project.name}`,\n antigravity: `# Antigravity Project Rules: ${project.name}`,\n windsurf: `# Windsurf Project Rules: ${project.name}`,\n vscode: `# VS Code Project Rules: ${project.name}`,\n copilot: `# GitHub Copilot Instructions: ${project.name}`,\n generic: `# Project Conventions: ${project.name}`\n };\n const header = headerMap[ide] || `# Project Rules: ${project.name}`;\n return `${RIGSTATE_START}\n${header}\n> Generated by Rigstate v2.5.0 | Project ID: ${project.id} | Last synced: ${new Date().toISOString()}\n> ${lean ? '⚑ LEAN MODE ACTIVE: Redundant context offloaded to .cursor/rules/*.mdc' : 'πŸ“¦ FULL MODE ACTIVE'}\n\n⚠️ **SYSTEM NOTE:** Changes made to this Guardian template propagate to ALL Rigstate projects on next sync.\nπŸ›‘οΈ **Guardian v2.5 Upgrade Applied:** IMPACT_GUARD + BUILD_INTEGRITY now active globally.\n\n${sections.join('\\n\\n---\\n\\n')}\n${RIGSTATE_END}`;\n}\n/**\n * Generate multiple modular rule files optimized for modern Cursor (.mdc)\n * and universal AGENTS.md format.\n */\nfunction generateRuleFiles(project, stack, roadmap, ide = 'cursor', legacyStats, activeAgents, databaseMetadata) {\n const files = [];\n // 1. GENERATE AGENTS.MD (Universal Root File - Context Reference)\n const agentTable = activeAgents?.map((a) => `| **${a.name}** | \\`${a.key}\\` | ${a.job_title} | ${a.primary_mission || 'Specialist'} |`).join('\\n') || '| - | - | - | No agents configured |';\n const agentsMdContent = `# πŸ€– AI Agent Context: ${project.name}\n> **Rigstate v${ENGINE_VERSION}** | Project ID: \\`${project.id}\\`\n\nThis file describes the **specialist personas** available in this project. \nThese are **context providers**, not active controllers. The IDE agent (you) remains in full control of code execution.\n\n## πŸ“‹ Available Specialists\n| Name | Key | Role | Specialty |\n|:--- |:--- |:--- |:--- |\n${agentTable}\n\n## πŸ” How to Use This Context\n1. **Read their expertise**: Each specialist has a defined area of knowledge (architecture, documentation, history).\n2. **Adopt their perspective**: When working in their domain, consider their guidelines.\n3. **Call MCP tools if needed**: Some specialists have associated tools (e.g., \\`generate_professional_pdf\\` for The Scribe).\n\n## ⚠️ Important\n- These personas do **NOT** execute code or override your decisions.\n- They provide **context and guidelines** that you apply at your discretion.\n- Authority levels indicate priority of guidelines when they conflict (higher = stronger recommendation).\n\n---\n*Generated by Rigstate. Run \\`rigstate sync\\` to refresh.*`;\n files.push({\n path: 'AGENTS.md',\n content: agentsMdContent,\n metadata: { description: \"Project hierarchy and agent identities\" }\n });\n // 2. GENERATE SYSTEM-SPECIFIC MONO-FILE (Fallback/Baseline)\n // If IDE is Cursor, we use LEAN mode for the root .cursorrules file\n // because we are generating specific .mdc files below that cover the details.\n const isLean = ide === 'cursor';\n const masterFileName = getFileNameForIDE(ide);\n const monoContent = generateRuleContent(project, stack, roadmap, ide, legacyStats, activeAgents, isLean);\n files.push({\n path: masterFileName,\n content: monoContent,\n metadata: { description: `Master rules file for ${ide}` }\n });\n // 3. GENERATE MODULAR (.mdc) RULES (Cursor, Antigravity, VS Code)\n if (ide === 'cursor' || ide === 'antigravity' || ide === 'vscode') {\n // Identity & Context\n files.push({\n path: '.cursor/rules/rigstate-identity.mdc',\n content: (0, mdc_1.wrapMdc)((0, identity_1.generateIdentitySection)(project, ide, activeAgents), {\n description: \"Project context and specialist personas\",\n alwaysApply: true\n })\n });\n // Guardian & Stack DNA\n files.push({\n path: '.cursor/rules/rigstate-guardian.mdc',\n content: (0, mdc_1.wrapMdc)((0, stack_dna_1.generateStackDnaSection)(project, stack, legacyStats), {\n description: \"Governance rules, tech stack constraints, and file size limits\",\n globs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.sql\"],\n alwaysApply: true\n })\n });\n // Current Focus (Roadmap)\n const currentStep = (0, current_step_1.generateCurrentStepSection)(roadmap);\n if (currentStep) {\n files.push({\n path: '.cursor/rules/rigstate-roadmap.mdc',\n content: (0, mdc_1.wrapMdc)(currentStep, {\n description: \"Active sprint focus and current roadmap step details\",\n alwaysApply: true\n })\n });\n }\n // Workflow & Tooling\n files.push({\n path: '.cursor/rules/rigstate-workflow.mdc',\n content: (0, mdc_1.wrapMdc)((0, workflow_1.generateWorkflowSection)(ide) + '\\n\\n' + (0, tooling_1.generateToolingSection)(activeAgents), {\n description: \"Coding workflows, CLI usage, and tool binding rules\",\n alwaysApply: true\n })\n });\n // Database Specific (scoped)\n let dbContent = \"## πŸ—„οΈ Database Standards\\n- Always verify RLS policies for new tables.\\n- Use `supabase/migrations` for DDL changes.\\n- Reference `types/supabase.ts` for strictly typed queries.\";\n if (databaseMetadata && databaseMetadata.length > 0) {\n const securedCount = databaseMetadata.filter(t => t.rls_enabled).length;\n const unsecuredCount = databaseMetadata.length - securedCount;\n const unsecuredTables = databaseMetadata.filter(t => !t.rls_enabled).map(t => t.table_name);\n dbContent = `## πŸ—„οΈ Database Context: ${databaseMetadata.length} Tables\n> **Security Check:** ${securedCount} Secured | ${unsecuredCount} Unsecured\n\n### ⚠️ Security Attention Required\n${unsecuredTables.length > 0\n ? unsecuredTables.map(t => `- πŸ”΄ **${t}**: RLS Disabled`).join('\\n')\n : \"- βœ… All tables have Row Level Security enabled.\"}\n\n### πŸ“‹ Schema Reference\n| Table | RLS | Policies | Cols | Key Features |\n| :--- | :---: | :---: | :---: | :--- |\n${databaseMetadata.map(t => {\n const features = [];\n if (t.has_user_id)\n features.push('User-Scoped');\n if (t.has_created_at)\n features.push('Timestamps');\n return `| \\`${t.table_name}\\` | ${t.rls_enabled ? 'βœ…' : '❌'} | ${t.policy_count} | ${t.column_count} | ${features.join(', ') || '-'} |`;\n }).join('\\n')}\n\n### πŸ›‘οΈ Development Rules\n1. **RLS is MANDATORY:** All tables containing user data must have RLS enabled.\n2. **Use RPCs for Complex Logic:** Do not put complex business logic in client-side queries.\n3. **Migrations:** Always use \\`supabase/migrations\\` for schema changes.`;\n }\n files.push({\n path: '.cursor/rules/rigstate-database.mdc',\n content: (0, mdc_1.wrapMdc)(dbContent, {\n description: \"Live database schema, RLS status, and table metadata\",\n globs: [\"supabase/**/*\", \"**/*.sql\", \"**/lib/supabase/**\"],\n alwaysApply: databaseMetadata && databaseMetadata.length > 0 ? true : false\n })\n });\n // 4. GENERATE AGENT SKILLS (.agent/skills/<name>/SKILL.md)\n const rigstateSkills = (0, skills_1.getRigstateStandardSkills)();\n for (const skill of rigstateSkills) {\n files.push({\n path: `.agent/skills/${skill.name}/SKILL.md`,\n content: (0, skills_1.generateSkillFileContent)(skill),\n metadata: { description: skill.description }\n });\n }\n }\n return {\n files,\n suggestedIde: ide,\n version: ENGINE_VERSION\n };\n}\nasync function fetchLegacyStats(supabase, projectId) {\n const { data: chunks } = await supabase\n .from('roadmap_chunks')\n .select('is_legacy')\n .eq('project_id', projectId);\n if (!chunks)\n return { total: 0, legacyCount: 0, activeCount: 0 };\n const legacyCount = (chunks || []).filter((c) => c.is_legacy === true).length;\n const activeCount = (chunks || []).filter((c) => c.is_legacy !== true).length;\n return {\n total: (chunks || []).length,\n legacyCount,\n activeCount\n };\n}\n/**\n * Fetch active agents sorted by authority level\n * Note: Pass in a SupabaseClient instance (browser or server)\n */\nasync function fetchActiveAgents(supabase) {\n const { data: prompts } = await supabase\n .from('system_prompts')\n .select('id, key, content, name, display_name, job_title, authority_level, primary_mission, trigger_keywords')\n .eq('include_in_rules', true)\n .eq('is_active', true)\n .order('authority_level', { ascending: false });\n if (!prompts)\n return [];\n return (prompts || []).map((p) => ({\n id: p.id,\n key: p.key,\n name: p.display_name || p.name || p.key,\n job_title: p.job_title || 'Specialist Agent',\n content: p.content,\n authority_level: (() => {\n if (p.authority_level === null || p.authority_level === undefined) {\n throw new Error(`Agent ${p.key} is missing authority_level. Update via CMS.`);\n }\n return p.authority_level;\n })(),\n primary_mission: p.primary_mission || undefined,\n trigger_keywords: p.trigger_keywords || undefined\n }));\n}\nfunction mergeRuleContent(existingContent, newRules) {\n const startIndex = existingContent.indexOf(RIGSTATE_START);\n const endIndex = existingContent.indexOf(RIGSTATE_END);\n if (startIndex !== -1 && endIndex !== -1) {\n const before = existingContent.substring(0, startIndex);\n const after = existingContent.substring(endIndex + RIGSTATE_END.length);\n return before + newRules + after;\n }\n else {\n return existingContent + \"\\n\\n\" + newRules;\n }\n}\n/**\n * Fetch project tech stack from database.\n * Falls back to common defaults if no tags are defined.\n * Note: Pass in a SupabaseClient instance (browser or server)\n */\nasync function fetchProjectTechStack(supabase, projectId, fallbackStack = ['Next.js', 'TypeScript', 'Supabase', 'Tailwind CSS']) {\n try {\n // Try to fetch from project_tech_tags table\n const { data: tags, error } = await supabase\n .from('project_tech_tags')\n .select('name')\n .eq('project_id', projectId);\n if (error || !tags || tags.length === 0) {\n // Fallback: Check project metadata for stack info\n const { data: project } = await supabase\n .from('projects')\n .select('functional_spec')\n .eq('id', projectId)\n .single();\n // Extract tech from functional_spec if available\n if (project?.functional_spec?.techStack) {\n return project.functional_spec.techStack;\n }\n return fallbackStack;\n }\n return tags.map((t) => t.name);\n }\n catch (error) {\n console.warn('fetchProjectTechStack: Failed to fetch, using fallback', error);\n return fallbackStack;\n }\n}\n/**\n * Get the appropriate filename for a given IDE provider.\n * Convenience wrapper around IDE_FILE_NAMES constant.\n */\nfunction getFileNameForIDE(ide) {\n return types_1.IDE_FILE_NAMES[ide] || types_1.IDE_FILE_NAMES.cursor;\n}\n","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 const apiUrl = process.env.RIGSTATE_APP_URL || 'https://app.rigstate.com';\n console.error(`Status: Connected to Rigstate Cloud (${apiUrl})`);\n console.error(`Project Context: Secured via RPC`);\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\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://gvmoopyzhsdolibsuvpa.supabase.co';\nconst PRODUCTION_SUPABASE_ANON_KEY = 'sb_publishable_-RYJkFocIiMhOZczMC5mvQ_EozANMnt';\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 // Trim whitespace to avoid hash mismatch\n const cleanApiKey = apiKey.trim();\n\n // Hash the API key with SHA-256 (same as web app)\n const hashedKey = createHash('sha256').update(cleanApiKey).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 using the secure RPC\n // This bypasses RLS on the api_keys table via Security Definer function\n const { data: keyData, error: keyError } = await supabase\n .rpc('authenticate_api_key_hash', { hash: hashedKey })\n .single();\n\n if (keyError || !keyData) {\n return { success: false, error: 'Invalid or revoked API key' };\n }\n\n const { id, user_id } = keyData as { id: string; user_id: string };\n\n // Create a user-scoped client for subsequent operations\n // Use the most privileged key available (SERVICE_KEY or ANON_KEY)\n const userSupabase = createSupabaseClient(SUPABASE_URL, clientKey);\n\n return {\n success: true,\n context: {\n userId: user_id,\n apiKeyId: 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.error(`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","/**\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 * Phase 8.5: The Curator Protocol\n * Logic and Actions\n */\n\nexport * from './schemas.js';\nexport * from './actions/query.js';\nexport * from './actions/submit.js';\nexport * from './actions/stats.js';\nexport * from './actions/fortress.js';\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 * 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 * 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 // Define RPC response type\n interface ProjectContextRow {\n id: string;\n name: string;\n description: string;\n project_type: string;\n created_at: string;\n last_indexed_at: string;\n detected_stack: any;\n repository_tree: any;\n architectural_dna: any;\n }\n\n // Fetch project securely via RPC (bypasses RLS with strict checks)\n const { data: rawData, error: projectError } = await supabase\n .rpc('get_project_context_secure', {\n p_project_id: projectId,\n p_user_id: userId\n })\n .single();\n\n const projectRow = rawData as ProjectContextRow;\n\n if (projectError || !projectRow) {\n console.error('Project fetch failed:', projectError);\n throw new Error('Project not found or access denied');\n }\n\n // Map RPC result to tool structure\n const project = {\n id: projectRow.id,\n name: projectRow.name,\n description: projectRow.description,\n project_type: projectRow.project_type,\n created_at: projectRow.created_at,\n last_indexed_at: projectRow.last_indexed_at,\n detected_stack: projectRow.detected_stack,\n repository_tree: projectRow.repository_tree\n };\n\n // DNA is now directly available\n const stackDef = (projectRow.architectural_dna as any)?.stack_definition;\n\n\n\n // Continuity Loop: Fetch Active & Next Tasks\n const [activeTaskResult, nextTaskResult] = await Promise.all([\n supabase\n .from('roadmap_chunks')\n .select('id, title, step_number, role, instruction_set')\n .eq('project_id', projectId)\n .in('status', ['IN_PROGRESS', 'ACTIVE'])\n .limit(1)\n .maybeSingle(),\n supabase\n .from('roadmap_chunks')\n .select('id, title, step_number, role')\n .eq('project_id', projectId)\n .in('status', ['PENDING', 'LOCKED'])\n .order('step_number', { ascending: true })\n .limit(1)\n .maybeSingle()\n ]);\n\n const activeTask = activeTaskResult.data;\n const nextTask = nextTaskResult.data;\n\n // Fetch Digest Data (Reduced to 2 to save tokens)\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(2);\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(2);\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 summaryParts.push(`Project Type: ${project.project_type?.toUpperCase() || 'UNKNOWN'}`);\n\n // Add DNA Stack Info if available (Truth)\n if (stackDef) {\n summaryParts.push('\\n=== ACTIVE MISSION PARAMETERS ===');\n if (activeTask) {\n summaryParts.push(`⚠️ CURRENT OBJECTIVE: T-${activeTask.step_number}: ${activeTask.title}`);\n summaryParts.push(` Role: ${activeTask.role || 'Developer'}`);\n if (activeTask.instruction_set) {\n summaryParts.push(` Instructions: ${activeTask.instruction_set.substring(0, 200)}...`);\n }\n summaryParts.push(' ACTION: Focus ALL coding efforts on completing this task.');\n } else if (nextTask) {\n summaryParts.push(`⏸ SYSTEM IDLE (Waiting for command)`);\n summaryParts.push(` Suggested Next Mission: T-${nextTask.step_number}: ${nextTask.title}`);\n summaryParts.push(` ACTION: Ask the user \"Shall we start T-${nextTask.step_number}?\"`);\n } else {\n summaryParts.push('βœ… ALL MISSIONS COMPLETE. Awaiting new roadmap items.');\n }\n\n summaryParts.push('\\n=== AI BEHAVIORAL INSTRUCTIONS ===');\n if (activeTask) {\n summaryParts.push(`1. FOCUS: The user is working on T-${activeTask.step_number}. Help them complete it.`);\n summaryParts.push(`2. COMPLIANCE: Ensure all code follows project standards.`);\n } else if (nextTask) {\n summaryParts.push(`1. NUDGE: No active task found. Suggest starting T-${nextTask.step_number} (${nextTask.title}).`);\n summaryParts.push(`2. PROACTIVE: Instead of asking \"How can I help?\", ask \"Shall we start on T-${nextTask.step_number}?\"`);\n }\n\n summaryParts.push('\\n=== CURRENT STACK ===');\n if (stackDef.frontend) summaryParts.push(`Frontend: ${stackDef.frontend.framework} (${stackDef.frontend.language})`);\n if (stackDef.backend) summaryParts.push(`Backend: ${stackDef.backend.service} (${stackDef.backend.database})`);\n if (stackDef.styling) summaryParts.push(`Styling: ${stackDef.styling.framework} ${stackDef.styling.library || ''}`);\n if (stackDef.hosting) summaryParts.push(`Infrastructure: ${stackDef.hosting.provider}`);\n } else {\n // Fallback to detected stack\n if (techStack.framework) summaryParts.push(`Framework: ${techStack.framework}`);\n if (techStack.orm) summaryParts.push(`ORM: ${techStack.orm}`);\n }\n\n if (project.description) {\n summaryParts.push(`\\nDescription: ${project.description}`);\n }\n\n // Add Tooling Guidelines (Critical for Universal IDE Support)\n summaryParts.push('\\n=== RIGSTATE TOOLING GUIDELINES ===');\n summaryParts.push('You have access to specialized MCP tools. USE THEM TO SUCCEED:');\n summaryParts.push('1. NEVER guess about architecture. Use `query_brain` to search project documentation.');\n summaryParts.push('2. BEFORE coding, check `get_learned_instructions` to see if you have been corrected before.');\n summaryParts.push('3. When finishing a task, ALWAYS update the roadmap using `update_roadmap`.');\n summaryParts.push('4. If you discover a reusable pattern, submit it with `submit_curator_signal`.');\n summaryParts.push('5. For large refactors, use `run_architecture_audit` to check against rules.');\n summaryParts.push('6. Store major decisions using `save_decision` (ADR).');\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 * 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.1)\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: 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// Generate embedding using the Rigstate Intelligence API (Proxy)\nasync function generateQueryEmbedding(query: string): Promise<number[] | null> {\n const apiKey = process.env.RIGSTATE_API_KEY;\n const apiUrl = process.env.RIGSTATE_API_URL || 'http://localhost:3000/api/v1';\n\n if (!apiKey) {\n return null;\n }\n\n try {\n const response = await fetch(`${apiUrl}/intelligence/embed`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`\n },\n body: JSON.stringify({ text: query })\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(`Embedding API error (${response.status}):`, errorText);\n return null;\n }\n\n const result = await response.json() as any;\n return result.data?.embedding || null;\n } catch (error) {\n console.error('Failed to generate embedding via Proxy:', error);\n return null;\n }\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 // Generate embedding if possible for semantic search\n const embedding = await generateQueryEmbedding(query);\n let memories: MemoryRecord[] = [];\n\n // Use the hybrid search RPC\n const { data: searchResults, error: searchError } = await supabase\n .rpc('hybrid_search_memories', {\n p_project_id: projectId,\n p_query: query,\n p_embedding: embedding || null,\n p_limit: limit,\n p_similarity_threshold: threshold || 0.1\n });\n\n if (searchError) {\n // Fallback to basic recent fetch if RPC fails\n const { data: recentMemories } = await 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 .order('created_at', { ascending: false })\n .limit(limit);\n\n if (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.importance || 0,\n createdAt: m.created_at\n }));\n }\n } else if (searchResults) {\n memories = searchResults.map((m: any) => ({\n id: m.id,\n content: m.content,\n category: m.category,\n tags: m.tags,\n netVotes: m.importance,\n createdAt: m.created_at\n }));\n }\n\n // --- NEW: FETCH RELEVANT FEATURES ---\n // Simple fuzzy search until we vector embedding for features.\n let relevantFeatures: any[] = [];\n try {\n const { data: features } = await supabase\n .from('project_features')\n .select('name, status, description')\n .eq('project_id', projectId)\n .or(`name.ilike.%${query}%,description.ilike.%${query}%`)\n .limit(3);\n\n if (features) relevantFeatures = features;\n } catch (e) {\n console.warn('Feature fetch failed in brain query', e);\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 && m.tags.length > 0 ? ` [${m.tags.join(', ')}]` : '';\n const category = m.category ? m.category.toUpperCase() : 'GENERAL';\n return `- [${category}]${tagStr}${voteIndicator}: ${m.content}`;\n });\n\n const searchType = embedding ? 'TRIPLE-HYBRID (Vector + FTS + Fuzzy)' : 'HYBRID (FTS + Fuzzy)';\n\n let formatted = `=== PROJECT BRAIN: RELEVANT MEMORIES ===\nSearch Mode: ${searchType}\nQuery: \"${query}\"`;\n\n if (relevantFeatures.length > 0) {\n formatted += `\\n\\n=== RELATED FEATURES ===\\n` +\n relevantFeatures.map((f: any) => `- ${f.name} [${f.status}]`).join('\\n');\n }\n\n formatted += `\\n\\nFound ${memories.length} relevant memories:\\n\\n${contextLines.join('\\n')}\\n\\n==========================================`;\n\n if (memories.length === 0 && relevantFeatures.length === 0) {\n formatted = `=== PROJECT BRAIN ===\nQuery: \"${query}\"\nNo relevant memories or features found.\n=======================`;\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. Fetch project to verify access and get fallback spec\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, functional_spec')\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. Primary Strategy: Fetch from 'project_features'\n const { data: dbFeatures, error: dbError } = await supabase\n .from('project_features')\n .select('id, name, description, status')\n .eq('project_id', projectId)\n .neq('status', 'shadow') // Exclude shadow features by default unless asked\n .order('created_at', { ascending: false });\n\n let featuresList: any[] = [];\n let source = 'DB';\n\n if (!dbError && dbFeatures && dbFeatures.length > 0) {\n featuresList = dbFeatures.map(f => ({\n ...f,\n title: f.name // Map back to title specifically for uniform handling below\n }));\n } else {\n // 3. Fallback Strategy: Extract from 'functional_spec'\n source = 'FALLBACK_SPEC';\n // Log warning (In a real system, use a structured logger. Here we console.error to stderr)\n console.error(`[WARN] Project ${projectId}: 'project_features' empty or missing. Falling back to 'functional_spec'.`);\n\n const spec = project.functional_spec as any;\n if (spec && typeof spec === 'object' && Array.isArray(spec.features)) {\n featuresList = spec.features.map((f: any) => ({\n id: 'legacy',\n title: f.name || f.title,\n description: f.description,\n status: f.status || 'proposed'\n }));\n }\n }\n\n // 4. Format Response\n if (featuresList.length === 0) {\n return { content: [{ type: 'text', text: 'No active features found (checked DB and Spec).' }] };\n }\n\n const formatted = `=== PROJECT FEATURES (Source: ${source}) ===\\n` +\n featuresList.map(f => {\n return `- ${f.title} [${f.status}]`;\n }).join('\\n');\n\n return {\n content: [{ type: 'text', text: formatted }]\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 .in('status', ['ACTIVE', 'IN_PROGRESS'])\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 { 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 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.error(`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","import { SupabaseClient } from '@supabase/supabase-js';\nimport { AuditRlsStatusInput } from '../lib/types.js';\nimport * as Checks from './security-checks.js';\nimport * as ArchChecks from './security-checks-arch.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 archViolations = ArchChecks.checkArchitectureIntegrity(filePath, content);\n violations.push(...archViolations);\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","\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\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 Architectural Integrity (SEC-ARCH-01, SEC-ARCH-02, SEC-ARCH-03)\n */\nexport function checkArchitectureIntegrity(filePath: string, content: string): SecurityViolation[] {\n const violations: SecurityViolation[] = [];\n\n // Define UI context: Components, Hooks, and client-side pages (rough heuristic)\n // We exclude 'api', 'actions', 'lib', 'utils' from this restriction generally, \n // though 'lib'/ 'utils' should also be clean ideally. Let's focus on strict UI layers.\n const isUI = filePath.includes('/components/') || filePath.includes('/hooks/') || (filePath.includes('/app/') && !filePath.includes('/api/') && !filePath.includes('actions.ts') && !filePath.includes('route.ts'));\n\n // SEC-ARCH-01: Illegal Supabase Client in UI\n // Rule: /(import.*from\\s+['\"]@supabase\\/supabase-js['\"])/g\n if (isUI) {\n const illegalImportRegex = /(import.*from\\s+['\"]@supabase\\/supabase-js['\"])/g;\n if (illegalImportRegex.test(content)) {\n violations.push({\n id: 'SEC-ARCH-01',\n type: 'ARCHITECTURE_VIOLATION',\n severity: 'FATAL',\n title: 'Illegal Supabase Client in UI',\n description: 'Direct import of @supabase/supabase-js in a UI component/hook is strictly forbidden. It bypasses the server boundary.',\n recommendation: 'Use the `createClient` helper from our utils or Server Actions for data access.'\n });\n }\n }\n\n // SEC-ARCH-02: Direct Query Pattern in UI\n // Rule: /\\.(from|select|insert|update|delete|rpc)\\s*\\(/g\n // Refinement: We specifically target 'supabase.from' effectively or chained calls. \n // To avoid false positives like Array.from, we can perform a simple check.\n if (isUI) {\n const dbActionRegex = /\\.(from|select|insert|update|delete|rpc)\\s*\\(/g;\n const matches = content.match(dbActionRegex);\n if (matches) {\n // Filter out 'Array.from' specifically to permit standard JS patterns\n const suspicious = matches.some(m => !m.includes('.from') || (m.includes('.from') && content.includes('supabase.from')));\n\n if (suspicious || (matches.length > 0 && content.includes('supabase'))) {\n violations.push({\n id: 'SEC-ARCH-02',\n type: 'ARCHITECTURE_VIOLATION',\n severity: 'FATAL',\n title: 'Direct Database Query in UI',\n description: 'Detected direct database query pattern (select/insert/update/delete) in a UI component. This exposes logic to the client.',\n recommendation: 'Move all data fetching logic to Server Components or Server Actions.'\n });\n }\n }\n }\n\n // SEC-ARCH-03: Missing 'use server'\n // Heuristic: If file is in an 'actions' folder OR exports functions ending in 'Action'/'Mutation', \n // it MUST have 'use server' at the top.\n const isActionFile = filePath.includes('/actions/') || filePath.includes('actions.ts');\n\n if (isActionFile) {\n // Check first 200 chars for 'use server'\n const header = content.slice(0, 200);\n const hasUseServer = /['\"]use server['\"]/.test(header);\n\n if (!hasUseServer) {\n violations.push({\n id: 'SEC-ARCH-03',\n type: 'ARCHITECTURE_VIOLATION',\n severity: 'FATAL',\n title: 'Missing \"use server\" Directive',\n description: 'File appears to be a Server Action module but lacks the \"use server\" directive.',\n recommendation: 'Add \"use server\" at the very top of the file.'\n });\n }\n }\n\n return violations;\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.error('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, existsSync, statSync } from 'node:fs';\nimport * as path from 'node: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 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 package.json for External Deps\n let externalDeps: Record<string, string> = {};\n const pkgPath = path.join(process.cwd(), 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkgContent = await fs.readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(pkgContent);\n externalDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n } catch (e) {\n console.error('Failed to parse package.json', e);\n }\n }\n\n // 2. Scan TypeScripts files for Internal Deps\n const allFiles = await getAllFiles(searchPath);\n const tsFiles = allFiles.filter(f => /\\.(ts|tsx|js|jsx)$/.test(f) && !f.includes('node_modules') && !f.includes('dist') && !f.includes('.next'));\n\n // 3. Build Graph\n const graph: Record<string, string[]> = {};\n\n for (const file of tsFiles) {\n const content = await fs.readFile(file, 'utf-8');\n const imports = extractImports(content);\n\n // Resolve imports to file paths relative to searchPath\n const validDeps: string[] = [];\n const fileDir = path.dirname(file);\n\n for (const imp of imports) {\n // Check if it's an external dep\n if (Object.keys(externalDeps).some(d => imp === d || imp.startsWith(d + '/'))) {\n continue; // Skip external deps in internal graph for now\n }\n\n // Local import resolution logic (String based only, no require!)\n if (imp.startsWith('.') || imp.startsWith('@/')) {\n const resolved = resolveImportString(file, imp, searchPath);\n if (resolved && tsFiles.includes(resolved)) {\n validDeps.push(path.relative(searchPath, resolved));\n }\n }\n }\n\n const relFile = path.relative(searchPath, file);\n graph[relFile] = validDeps;\n }\n\n // 4. 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 externalDependencies: Object.keys(externalDeps).length\n },\n cycles: cycles,\n status: cycles.length > 0 ? 'VIOLATION' : 'PASS',\n summary: cycles.length > 0\n ? `FAILED. Detected ${cycles.length} circular dependencies. Einar demands resolution!`\n : `PASSED. Architecture is sound. No circular dependencies 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\nfunction extractImports(content: string): string[] {\n // Regex to match import ... from \"...\" or import \"...\"\n const regex = /from\\s+['\"]([^'\"]+)['\"]|import\\s+['\"]([^'\"]+)['\"]/g;\n const imports: string[] = [];\n let match;\n while ((match = regex.exec(content)) !== null) {\n imports.push(match[1] || match[2]);\n }\n return imports;\n}\n\nfunction resolveImportString(importer: string, importPath: string, root: string): string | null {\n let targetDir = path.dirname(importer);\n let target = importPath;\n\n if (importPath.startsWith('@/')) {\n target = importPath.replace('@/', '');\n targetDir = root; // Assume @ maps to root of scan path\n }\n\n // Construct potential path\n const naivePath = path.resolve(targetDir, target);\n\n // Check extensions\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx'];\n\n // We already have the full file list in memory in the main function, \n // but here we do a quick disk check since we are inside a helper.\n // For a REALLY robust solution, we should pass the fileSet to this function,\n // but checking disk is fine for this tool.\n\n for (const ext of extensions) {\n const candidate = naivePath + ext;\n if (existsSync(candidate) && !statSync(candidate).isDirectory()) {\n return candidate;\n }\n }\n\n // Check if it matches exactly (e.g. file.ts was imported as file.ts)\n if (existsSync(naivePath) && !statSync(naivePath).isDirectory()) {\n return naivePath;\n }\n\n return null;\n}\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 found\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","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\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 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\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 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","\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","\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"],"mappings":"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","names":["generateRuleContent","generateRuleFiles","fetchLegacyStats","fetchActiveAgents","fetchProjectTechStack","getFileNameForIDE","RIGSTATE_START","RIGSTATE_END","z","z","z","z","z","z","z","path","path","fs","fs","path","fs","path","resolve","taskTitle"]}