@arcbridge/mcp-server 0.1.0 → 0.1.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/README.md +9 -1
- package/dist/index.js +305 -7
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/context.ts","../src/tools/init-project.ts","../src/tools/get-project-status.ts","../src/helpers.ts","../src/tools/get-building-blocks.ts","../src/tools/get-building-block.ts","../src/tools/get-quality-scenarios.ts","../src/tools/get-phase-plan.ts","../src/tools/get-current-tasks.ts","../src/tools/update-task.ts","../src/tools/create-task.ts","../src/tools/get-relevant-adrs.ts","../src/tools/reindex.ts","../src/tools/search-symbols.ts","../src/tools/get-symbol.ts","../src/tools/get-dependency-graph.ts","../src/tools/get-component-graph.ts","../src/tools/get-route-map.ts","../src/tools/get-boundary-analysis.ts","../src/tools/check-drift.ts","../src/tools/get-guidance.ts","../src/tools/get-open-questions.ts","../src/tools/propose-arc42-update.ts","../src/tools/get-practice-review.ts","../src/tools/complete-phase.ts","../src/tools/activate-role.ts","../src/tools/verify-scenarios.ts","../src/tools/run-role-check.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createArcBridgeServer } from \"./server.js\";\n\nasync function main() {\n const server = createArcBridgeServer();\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","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { createContext } from \"./context.js\";\nimport { registerInitProject } from \"./tools/init-project.js\";\nimport { registerGetProjectStatus } from \"./tools/get-project-status.js\";\nimport { registerGetBuildingBlocks } from \"./tools/get-building-blocks.js\";\nimport { registerGetBuildingBlock } from \"./tools/get-building-block.js\";\nimport { registerGetQualityScenarios } from \"./tools/get-quality-scenarios.js\";\nimport { registerGetPhasePlan } from \"./tools/get-phase-plan.js\";\nimport { registerGetCurrentTasks } from \"./tools/get-current-tasks.js\";\nimport { registerUpdateTask } from \"./tools/update-task.js\";\nimport { registerCreateTask } from \"./tools/create-task.js\";\nimport { registerGetRelevantAdrs } from \"./tools/get-relevant-adrs.js\";\nimport { registerReindex } from \"./tools/reindex.js\";\nimport { registerSearchSymbols } from \"./tools/search-symbols.js\";\nimport { registerGetSymbol } from \"./tools/get-symbol.js\";\nimport { registerGetDependencyGraph } from \"./tools/get-dependency-graph.js\";\nimport { registerGetComponentGraph } from \"./tools/get-component-graph.js\";\nimport { registerGetRouteMap } from \"./tools/get-route-map.js\";\nimport { registerGetBoundaryAnalysis } from \"./tools/get-boundary-analysis.js\";\nimport { registerCheckDrift } from \"./tools/check-drift.js\";\nimport { registerGetGuidance } from \"./tools/get-guidance.js\";\nimport { registerGetOpenQuestions } from \"./tools/get-open-questions.js\";\nimport { registerProposeArc42Update } from \"./tools/propose-arc42-update.js\";\nimport { registerGetPracticeReview } from \"./tools/get-practice-review.js\";\nimport { registerCompletePhase } from \"./tools/complete-phase.js\";\nimport { registerActivateRole } from \"./tools/activate-role.js\";\nimport { registerVerifyScenarios } from \"./tools/verify-scenarios.js\";\nimport { registerRunRoleCheck } from \"./tools/run-role-check.js\";\n\nexport function createArcBridgeServer(): McpServer {\n const server = new McpServer({\n name: \"arcbridge\",\n version: \"0.1.0\",\n });\n\n const ctx = createContext();\n\n // Lifecycle\n registerInitProject(server, ctx);\n registerGetProjectStatus(server, ctx);\n\n // Architecture\n registerGetBuildingBlocks(server, ctx);\n registerGetBuildingBlock(server, ctx);\n registerGetQualityScenarios(server, ctx);\n registerGetRelevantAdrs(server, ctx);\n\n // Planning\n registerGetPhasePlan(server, ctx);\n registerGetCurrentTasks(server, ctx);\n registerUpdateTask(server, ctx);\n registerCreateTask(server, ctx);\n\n // Code Intelligence\n registerReindex(server, ctx);\n registerSearchSymbols(server, ctx);\n registerGetSymbol(server, ctx);\n registerGetDependencyGraph(server, ctx);\n\n // React & Next.js Analysis\n registerGetComponentGraph(server, ctx);\n registerGetRouteMap(server, ctx);\n registerGetBoundaryAnalysis(server, ctx);\n\n // Architecture Bridge\n registerCheckDrift(server, ctx);\n registerGetGuidance(server, ctx);\n registerGetOpenQuestions(server, ctx);\n registerProposeArc42Update(server, ctx);\n registerGetPracticeReview(server, ctx);\n registerCompletePhase(server, ctx);\n registerActivateRole(server, ctx);\n registerVerifyScenarios(server, ctx);\n registerRunRoleCheck(server, ctx);\n\n return server;\n}\n","import type Database from \"better-sqlite3\";\n\nexport interface ServerContext {\n db: Database.Database | null;\n projectRoot: string | null;\n}\n\nexport function createContext(): ServerContext {\n return {\n db: null,\n projectRoot: null,\n };\n}\n","import { z } from \"zod\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n generateConfig,\n generateArc42,\n generatePlan,\n generateAgentRoles,\n generateDatabase,\n generateSyncFiles,\n indexProject,\n type InitProjectInput,\n} from \"@arcbridge/core\";\nimport { getAdapter } from \"@arcbridge/adapters\";\nimport type { ServerContext } from \"../context.js\";\n\nexport function registerInitProject(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_init_project\",\n \"Initialize ArcBridge in a project directory. Creates .arcbridge/ with arc42 documentation, phase plan, agent roles, SQLite database, and platform-specific configs.\",\n {\n name: z.string().min(1).describe(\"Project name\"),\n template: z\n .enum([\"nextjs-app-router\", \"react-vite\", \"api-service\", \"dotnet-webapi\"])\n .default(\"nextjs-app-router\")\n .describe(\"Project template\"),\n features: z\n .array(z.enum([\"auth\", \"database\", \"api\"]))\n .default([])\n .describe(\"Features to scaffold\"),\n quality_priorities: z\n .array(z.string())\n .default([\"security\", \"performance\", \"accessibility\"])\n .describe(\"Quality priorities in order\"),\n platforms: z\n .array(z.string())\n .default([\"claude\"])\n .describe(\"Target platforms for agent config generation\"),\n target_dir: z\n .string()\n .describe(\"Absolute path to the target project directory\"),\n },\n async (params) => {\n const targetDir = params.target_dir;\n\n // Check if already initialized\n if (existsSync(join(targetDir, \".arcbridge\", \"config.yaml\"))) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `ArcBridge is already initialized in ${targetDir}. Use arcbridge_get_project_status to see the current state.`,\n },\n ],\n };\n }\n\n const input: InitProjectInput = {\n name: params.name,\n template: params.template,\n features: params.features,\n quality_priorities: params.quality_priorities,\n platforms: params.platforms,\n };\n\n // 1. Generate config\n const config = generateConfig(targetDir, input);\n\n // 2. Generate arc42 documentation\n generateArc42(targetDir, input);\n\n // 3. Generate phase plan\n generatePlan(targetDir, input);\n\n // 4. Generate agent roles\n const roles = generateAgentRoles(targetDir, params.template);\n\n // 5. Initialize database from generated files\n const { db, warnings } = generateDatabase(targetDir, input);\n ctx.db = db;\n ctx.projectRoot = targetDir;\n\n // 6. Generate sync loop files (skill, action, hook)\n const syncFiles = generateSyncFiles(targetDir, config);\n\n // 7. Generate platform-specific configs\n const platformWarnings: string[] = [];\n for (const platform of params.platforms) {\n try {\n const adapter = getAdapter(platform);\n adapter.generateProjectConfig(targetDir, config);\n adapter.generateAgentConfigs(targetDir, roles);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n platformWarnings.push(`Platform '${platform}': ${msg}`);\n }\n }\n\n // 8. Index TypeScript symbols (if tsconfig exists)\n let indexResult: {\n symbolsIndexed: number;\n dependenciesIndexed: number;\n componentsAnalyzed: number;\n routesAnalyzed: number;\n } | null = null;\n try {\n const result = await indexProject(db, { projectRoot: targetDir });\n indexResult = {\n symbolsIndexed: result.symbolsIndexed,\n dependenciesIndexed: result.dependenciesIndexed,\n componentsAnalyzed: result.componentsAnalyzed,\n routesAnalyzed: result.routesAnalyzed,\n };\n } catch {\n // Indexing is optional — project may not have tsconfig.json yet\n }\n\n // Count what was created\n const blockCount = db\n .prepare(\"SELECT COUNT(*) as count FROM building_blocks\")\n .get() as { count: number };\n const scenarioCount = db\n .prepare(\"SELECT COUNT(*) as count FROM quality_scenarios\")\n .get() as { count: number };\n const phaseCount = db\n .prepare(\"SELECT COUNT(*) as count FROM phases\")\n .get() as { count: number };\n const taskCount = db\n .prepare(\"SELECT COUNT(*) as count FROM tasks\")\n .get() as { count: number };\n\n const allWarnings = [...warnings, ...platformWarnings];\n\n const summary = [\n `# ArcBridge Initialized: ${input.name}`,\n \"\",\n `**Template:** ${input.template}`,\n `**Features:** ${input.features.length > 0 ? input.features.join(\", \") : \"none\"}`,\n `**Platforms:** ${params.platforms.join(\", \")}`,\n \"\",\n \"## Created\",\n \"\",\n `- **Building blocks:** ${blockCount.count}`,\n `- **Quality scenarios:** ${scenarioCount.count}`,\n `- **Phases:** ${phaseCount.count}`,\n `- **Tasks:** ${taskCount.count}`,\n `- **Agent roles:** ${roles.length}`,\n ...(indexResult\n ? [\n `- **Symbols indexed:** ${indexResult.symbolsIndexed}`,\n `- **Dependencies indexed:** ${indexResult.dependenciesIndexed}`,\n `- **Components analyzed:** ${indexResult.componentsAnalyzed}`,\n `- **Routes analyzed:** ${indexResult.routesAnalyzed}`,\n ]\n : [input.template === \"dotnet-webapi\"\n ? `- **Code indexing:** not available yet for .NET projects (C# indexer planned)`\n : `- **Code indexing:** skipped (no tsconfig.json found — run \\`arcbridge_reindex\\` later)`]),\n \"\",\n \"## Files\",\n \"\",\n \"- `.arcbridge/config.yaml` — Project configuration\",\n \"- `.arcbridge/arc42/` — Architecture documentation (arc42)\",\n \"- `.arcbridge/plan/` — Phase plan and tasks\",\n \"- `.arcbridge/agents/` — Canonical agent role definitions\",\n \"- `.arcbridge/index.db` — SQLite database\",\n ...params.platforms.includes(\"claude\")\n ? [\"- `CLAUDE.md` — Claude Code project instructions\", \"- `.claude/agents/` — Claude agent configs\"]\n : [],\n ...params.platforms.includes(\"copilot\")\n ? [\"- `.github/copilot-instructions.md` — Copilot instructions\", \"- `.github/agents/` — Copilot agent configs\"]\n : [],\n ...syncFiles.map((f) => `- \\`${f}\\` — Sync loop trigger`),\n ...(allWarnings.length > 0\n ? [\n \"\",\n \"## Warnings\",\n \"\",\n ...allWarnings.map((w) => `- ${w}`),\n ]\n : []),\n \"\",\n \"Use `arcbridge_get_project_status` to see the full project status.\",\n ];\n\n return {\n content: [{ type: \"text\" as const, text: summary.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { refreshFromDocs } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized } from \"../helpers.js\";\n\ninterface CountRow {\n count: number;\n}\ninterface PhaseRow {\n id: string;\n name: string;\n phase_number: number;\n status: string;\n}\ninterface TaskStatusRow {\n status: string;\n count: number;\n}\ninterface BlockRow {\n id: string;\n name: string;\n responsibility: string;\n}\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n status: string;\n priority: string;\n}\ninterface MetaRow {\n value: string;\n}\n\nexport function registerGetProjectStatus(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_project_status\",\n \"Get the current status of the ArcBridge project: current phase, task completion, building blocks, quality scenarios, and drift warnings.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n\n if (!db) {\n return notInitialized();\n }\n\n // Refresh DB from docs to pick up any YAML edits\n refreshFromDocs(db, params.target_dir);\n\n // Project name\n const projectName = (\n db\n .prepare(\n \"SELECT value FROM arcbridge_meta WHERE key = 'project_name'\",\n )\n .get() as MetaRow | undefined\n )?.value ?? \"Unknown\";\n\n // Phases\n const phases = db\n .prepare(\n \"SELECT id, name, phase_number, status FROM phases ORDER BY phase_number\",\n )\n .all() as PhaseRow[];\n\n const currentPhase = phases.find(\n (p) => p.status === \"in-progress\",\n ) ?? phases[0];\n\n // Task summary\n const taskStats = db\n .prepare(\n \"SELECT status, COUNT(*) as count FROM tasks GROUP BY status\",\n )\n .all() as TaskStatusRow[];\n\n const totalTasks = taskStats.reduce((sum, r) => sum + r.count, 0);\n const doneTasks =\n taskStats.find((r) => r.status === \"done\")?.count ?? 0;\n const completionPct =\n totalTasks > 0 ? Math.round((doneTasks / totalTasks) * 100) : 0;\n\n // Building blocks\n const blocks = db\n .prepare(\"SELECT id, name, responsibility FROM building_blocks\")\n .all() as BlockRow[];\n\n // Quality scenarios\n const scenarios = db\n .prepare(\n \"SELECT id, name, category, status, priority FROM quality_scenarios ORDER BY category, id\",\n )\n .all() as ScenarioRow[];\n\n // Code intelligence\n const symbolCount = (\n db.prepare(\"SELECT COUNT(*) as count FROM symbols\").get() as CountRow\n ).count;\n const depCount = (\n db.prepare(\"SELECT COUNT(*) as count FROM dependencies\").get() as CountRow\n ).count;\n const componentCount = (\n db.prepare(\"SELECT COUNT(*) as count FROM components\").get() as CountRow\n ).count;\n const routeCount = (\n db.prepare(\"SELECT COUNT(*) as count FROM routes\").get() as CountRow\n ).count;\n const lastIndexed = (\n db\n .prepare(\"SELECT MAX(indexed_at) as value FROM symbols\")\n .get() as MetaRow | undefined\n )?.value;\n\n // Drift\n const driftCount = (\n db\n .prepare(\n \"SELECT COUNT(*) as count FROM drift_log WHERE resolution IS NULL\",\n )\n .get() as CountRow\n ).count;\n\n // Format output\n const lines: string[] = [\n `# Project Status: ${projectName}`,\n \"\",\n \"## Current Phase\",\n \"\",\n currentPhase\n ? `**${currentPhase.name}** (${currentPhase.status})`\n : \"*No phases defined*\",\n \"\",\n \"## Phases\",\n \"\",\n ...phases.map(\n (p) =>\n `- ${p.status === \"complete\" ? \"[x]\" : p.status === \"in-progress\" ? \"[>]\" : \"[ ]\"} Phase ${p.phase_number}: ${p.name} (${p.status})`,\n ),\n \"\",\n \"## Task Progress\",\n \"\",\n `**${doneTasks}/${totalTasks}** tasks complete (${completionPct}%)`,\n \"\",\n ...taskStats.map((r) => `- ${r.status}: ${r.count}`),\n \"\",\n \"## Building Blocks\",\n \"\",\n ...blocks.map((b) => `- **${b.name}** (\\`${b.id}\\`): ${b.responsibility}`),\n \"\",\n \"## Quality Scenarios\",\n \"\",\n ...scenarios.map(\n (s) =>\n `- ${s.status === \"passing\" ? \"pass\" : s.status === \"failing\" ? \"FAIL\" : s.status === \"partial\" ? \"partial\" : \"untested\"} ${s.id}: ${s.name} [${s.category}] (${s.priority})`,\n ),\n \"\",\n ];\n\n // Code intelligence section\n lines.push(\"## Code Intelligence\", \"\");\n if (symbolCount > 0) {\n lines.push(\n `- **Symbols indexed:** ${symbolCount}`,\n `- **Dependencies indexed:** ${depCount}`,\n `- **Components analyzed:** ${componentCount}`,\n `- **Routes analyzed:** ${routeCount}`,\n `- **Last indexed:** ${lastIndexed ?? \"unknown\"}`,\n \"\",\n );\n } else {\n lines.push(\n \"*Not indexed yet.* Run `arcbridge_reindex` to index TypeScript symbols.\",\n \"\",\n );\n }\n\n if (driftCount > 0) {\n lines.push(\n \"## Drift Warnings\",\n \"\",\n `**${driftCount}** unresolved drift issue(s) detected.`,\n \"\",\n );\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport type Database from \"better-sqlite3\";\nimport { openDatabase } from \"@arcbridge/core\";\nimport type { ServerContext } from \"./context.js\";\n\nexport function ensureDb(\n ctx: ServerContext,\n targetDir: string,\n): Database.Database | null {\n if (ctx.db) return ctx.db;\n\n const dbPath = join(targetDir, \".arcbridge\", \"index.db\");\n if (!existsSync(dbPath)) {\n return null;\n }\n\n ctx.db = openDatabase(dbPath);\n ctx.projectRoot = targetDir;\n return ctx.db;\n}\n\nexport function notInitialized() {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"ArcBridge is not initialized in this directory. Run `arcbridge_init_project` first.\",\n },\n ],\n };\n}\n\nexport function textResult(text: string) {\n return {\n content: [{ type: \"text\" as const, text }],\n };\n}\n\n/**\n * Escape SQL LIKE wildcards (%, _) in user-provided values.\n */\nexport function escapeLike(value: string): string {\n return value.replace(/%/g, \"\\\\%\").replace(/_/g, \"\\\\_\");\n}\n\n/**\n * Safely parse a JSON string from a database column.\n * Returns the fallback value if parsing fails.\n */\nexport function safeParseJson<T>(value: string | null, fallback: T): T {\n if (value === null || value === undefined) return fallback;\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Normalize a code_path glob pattern to a plain prefix for matching.\n * Strips trailing glob patterns: \"src/lib/**\" → \"src/lib/\", \"src/lib/*\" → \"src/lib/\"\n */\nexport function normalizeCodePath(codePath: string): string {\n return codePath.replace(/\\*+\\/?$/, \"\");\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, safeParseJson } from \"../helpers.js\";\n\ninterface BlockRow {\n id: string;\n name: string;\n level: number;\n parent_id: string | null;\n responsibility: string;\n code_paths: string;\n interfaces: string;\n service: string;\n last_synced: string | null;\n}\n\ninterface ScenarioLinkRow {\n id: string;\n name: string;\n category: string;\n status: string;\n}\n\nexport function registerGetBuildingBlocks(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_building_blocks\",\n \"Get all architecture building blocks with their code mappings, responsibilities, and linked quality scenarios.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const blocks = db\n .prepare(\n \"SELECT id, name, level, parent_id, responsibility, code_paths, interfaces, service, last_synced FROM building_blocks ORDER BY level, name\",\n )\n .all() as BlockRow[];\n\n if (blocks.length === 0) {\n return {\n content: [\n { type: \"text\" as const, text: \"No building blocks defined yet.\" },\n ],\n };\n }\n\n const lines: string[] = [\"# Building Blocks\", \"\"];\n\n for (const block of blocks) {\n const indent = \" \".repeat(block.level - 1);\n const codePaths = safeParseJson<string[]>(block.code_paths, []);\n const interfaces = safeParseJson<string[]>(block.interfaces, []);\n\n lines.push(`${indent}## ${block.name} (\\`${block.id}\\`)`);\n lines.push(\"\");\n lines.push(`${indent}**Responsibility:** ${block.responsibility}`);\n lines.push(`${indent}**Service:** ${block.service}`);\n\n if (codePaths.length > 0) {\n lines.push(\n `${indent}**Code:** ${codePaths.map((p) => `\\`${p}\\``).join(\", \")}`,\n );\n }\n\n if (interfaces.length > 0) {\n lines.push(\n `${indent}**Interfaces:** ${interfaces.map((i) => `\\`${i}\\``).join(\", \")}`,\n );\n }\n\n if (block.parent_id) {\n lines.push(`${indent}**Parent:** \\`${block.parent_id}\\``);\n }\n\n // Linked quality scenarios\n const scenarios = db\n .prepare(\n \"SELECT id, name, category, status FROM quality_scenarios WHERE linked_blocks LIKE ?\",\n )\n .all(`%\"${block.id}\"%`) as ScenarioLinkRow[];\n\n if (scenarios.length > 0) {\n lines.push(`${indent}**Quality Scenarios:**`);\n for (const s of scenarios) {\n lines.push(\n `${indent}- ${s.id}: ${s.name} [${s.category}] (${s.status})`,\n );\n }\n }\n\n lines.push(\"\");\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, safeParseJson, escapeLike, normalizeCodePath } from \"../helpers.js\";\n\ninterface BlockRow {\n id: string;\n name: string;\n level: number;\n parent_id: string | null;\n description: string | null;\n responsibility: string;\n code_paths: string;\n interfaces: string;\n service: string;\n last_synced: string | null;\n}\n\ninterface ChildRow {\n id: string;\n name: string;\n responsibility: string;\n}\n\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n priority: string;\n status: string;\n scenario: string;\n expected: string;\n}\n\ninterface AdrRow {\n id: string;\n title: string;\n status: string;\n date: string;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n phase_id: string;\n}\n\nexport function registerGetBuildingBlock(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_building_block\",\n \"Get detailed information about a single building block: its arc42 description, code modules, interfaces, quality scenarios, ADRs, and tasks.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n block_id: z\n .string()\n .describe(\"Building block ID (e.g., 'auth-module')\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const block = db\n .prepare(\"SELECT * FROM building_blocks WHERE id = ?\")\n .get(params.block_id) as BlockRow | undefined;\n\n if (!block) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Building block '${params.block_id}' not found. Use \\`arcbridge_get_building_blocks\\` to see all blocks.`,\n },\n ],\n };\n }\n\n const codePaths = safeParseJson<string[]>(block.code_paths, []);\n const interfaces = safeParseJson<string[]>(block.interfaces, []);\n const escapedBlockId = escapeLike(block.id);\n\n const lines: string[] = [\n `# ${block.name} (\\`${block.id}\\`)`,\n \"\",\n `**Responsibility:** ${block.responsibility}`,\n `**Level:** ${block.level}`,\n `**Service:** ${block.service}`,\n ];\n\n if (block.parent_id) {\n lines.push(`**Parent:** \\`${block.parent_id}\\``);\n }\n\n if (block.last_synced) {\n lines.push(`**Last synced:** ${block.last_synced}`);\n }\n\n // Code paths\n lines.push(\"\", \"## Code Paths\", \"\");\n if (codePaths.length > 0) {\n for (const p of codePaths) {\n lines.push(`- \\`${p}\\``);\n }\n } else {\n lines.push(\"*No code paths mapped yet.*\");\n }\n\n // Mapped symbols (query symbols matching code_paths)\n if (codePaths.length > 0) {\n const pathConditions = codePaths.map(() => \"file_path LIKE ? ESCAPE '\\\\'\");\n const pathParams = codePaths.map((cp) => {\n const prefix = normalizeCodePath(cp);\n return `${escapeLike(prefix)}%`;\n });\n\n const symbolQuery = `\n SELECT name, kind, file_path, is_exported\n FROM symbols\n WHERE (${pathConditions.join(\" OR \")})\n ORDER BY file_path, name\n LIMIT 30\n `;\n const mappedSymbols = db.prepare(symbolQuery).all(...pathParams) as {\n name: string;\n kind: string;\n file_path: string;\n is_exported: number;\n }[];\n\n if (mappedSymbols.length > 0) {\n const totalCount = db\n .prepare(\n `SELECT COUNT(*) as count FROM symbols WHERE (${pathConditions.join(\" OR \")})`,\n )\n .get(...pathParams) as { count: number };\n\n lines.push(\"\", `## Mapped Symbols (${totalCount.count} total)`, \"\");\n\n // Group by kind for summary\n const byKind = new Map<string, number>();\n for (const s of mappedSymbols) {\n byKind.set(s.kind, (byKind.get(s.kind) ?? 0) + 1);\n }\n lines.push(\n [...byKind.entries()].map(([k, c]) => `**${c}** ${k}s`).join(\", \"),\n \"\",\n );\n\n for (const s of mappedSymbols) {\n const exported = s.is_exported ? \"\" : \" (internal)\";\n lines.push(`- \\`${s.file_path}\\` → **${s.name}** (${s.kind})${exported}`);\n }\n if (totalCount.count > 30) {\n lines.push(`- *... and ${totalCount.count - 30} more*`);\n }\n }\n }\n\n // Interfaces\n if (interfaces.length > 0) {\n lines.push(\"\", \"## Interfaces\", \"\");\n for (const i of interfaces) {\n lines.push(`- \\`${i}\\``);\n }\n }\n\n // Child blocks\n const children = db\n .prepare(\n \"SELECT id, name, responsibility FROM building_blocks WHERE parent_id = ?\",\n )\n .all(params.block_id) as ChildRow[];\n\n if (children.length > 0) {\n lines.push(\"\", \"## Sub-blocks\", \"\");\n for (const child of children) {\n lines.push(`- **${child.name}** (\\`${child.id}\\`): ${child.responsibility}`);\n }\n }\n\n // Quality scenarios (linked via JSON array in linked_blocks)\n const scenarios = db\n .prepare(\n \"SELECT id, name, category, priority, status, scenario, expected FROM quality_scenarios WHERE linked_blocks LIKE ? ESCAPE '\\\\'\",\n )\n .all(`%\"${escapedBlockId}\"%`) as ScenarioRow[];\n\n if (scenarios.length > 0) {\n lines.push(\"\", \"## Quality Scenarios\", \"\");\n for (const s of scenarios) {\n lines.push(\n `### ${s.id}: ${s.name} [${s.category}]`,\n `- **Priority:** ${s.priority}`,\n `- **Status:** ${s.status}`,\n `- **Scenario:** ${s.scenario}`,\n `- **Expected:** ${s.expected}`,\n \"\",\n );\n }\n }\n\n // ADRs affecting this block\n const adrs = db\n .prepare(\n \"SELECT id, title, status, date FROM adrs WHERE affected_blocks LIKE ? ESCAPE '\\\\'\",\n )\n .all(`%\"${escapedBlockId}\"%`) as AdrRow[];\n\n if (adrs.length > 0) {\n lines.push(\"\", \"## Related ADRs\", \"\");\n for (const adr of adrs) {\n lines.push(`- **${adr.id}:** ${adr.title} (${adr.status}, ${adr.date})`);\n }\n }\n\n // Tasks assigned to this block\n const tasks = db\n .prepare(\n \"SELECT id, title, status, phase_id FROM tasks WHERE building_block = ?\",\n )\n .all(params.block_id) as TaskRow[];\n\n if (tasks.length > 0) {\n lines.push(\"\", \"## Tasks\", \"\");\n for (const task of tasks) {\n const check =\n task.status === \"done\"\n ? \"[x]\"\n : task.status === \"in-progress\"\n ? \"[>]\"\n : \"[ ]\";\n lines.push(`- ${check} ${task.id}: ${task.title} (${task.status})`);\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { QualityCategorySchema, QualityPrioritySchema, QualityScenarioStatusSchema } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, safeParseJson } from \"../helpers.js\";\n\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n scenario: string;\n expected: string;\n priority: string;\n linked_code: string;\n linked_tests: string;\n linked_blocks: string;\n verification: string;\n status: string;\n}\n\nexport function registerGetQualityScenarios(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_quality_scenarios\",\n \"Get quality scenarios, optionally filtered by category. Shows scenario details, linked code/tests, and current status.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n category: QualityCategorySchema.optional().describe(\"Filter by category\"),\n status: QualityScenarioStatusSchema.optional().describe(\"Filter by status\"),\n priority: QualityPrioritySchema.optional().describe(\"Filter by priority (must/should/could)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n let query =\n \"SELECT id, name, category, scenario, expected, priority, linked_code, linked_tests, linked_blocks, verification, status FROM quality_scenarios\";\n const conditions: string[] = [];\n const queryParams: string[] = [];\n\n if (params.category) {\n conditions.push(\"category = ?\");\n queryParams.push(params.category);\n }\n if (params.status) {\n conditions.push(\"status = ?\");\n queryParams.push(params.status);\n }\n if (params.priority) {\n conditions.push(\"priority = ?\");\n queryParams.push(params.priority);\n }\n\n if (conditions.length > 0) {\n query += \" WHERE \" + conditions.join(\" AND \");\n }\n query += \" ORDER BY category, id\";\n\n const scenarios = db.prepare(query).all(...queryParams) as ScenarioRow[];\n\n if (scenarios.length === 0) {\n const filter = [params.category, params.status, params.priority]\n .filter(Boolean)\n .join(\", \");\n return {\n content: [\n {\n type: \"text\" as const,\n text: filter\n ? `No quality scenarios found matching: ${filter}`\n : \"No quality scenarios defined yet.\",\n },\n ],\n };\n }\n\n // Group by category\n const byCategory = new Map<string, ScenarioRow[]>();\n for (const s of scenarios) {\n const list = byCategory.get(s.category) ?? [];\n list.push(s);\n byCategory.set(s.category, list);\n }\n\n const statusIcon = (s: string) =>\n s === \"passing\"\n ? \"PASS\"\n : s === \"failing\"\n ? \"FAIL\"\n : s === \"partial\"\n ? \"PARTIAL\"\n : \"UNTESTED\";\n\n const lines: string[] = [\"# Quality Scenarios\", \"\"];\n\n // Summary\n const passing = scenarios.filter((s) => s.status === \"passing\").length;\n const failing = scenarios.filter((s) => s.status === \"failing\").length;\n const untested = scenarios.filter((s) => s.status === \"untested\").length;\n const partial = scenarios.filter((s) => s.status === \"partial\").length;\n lines.push(\n `**Total:** ${scenarios.length} | **Passing:** ${passing} | **Failing:** ${failing} | **Untested:** ${untested} | **Partial:** ${partial}`,\n \"\",\n );\n\n for (const [category, items] of byCategory) {\n lines.push(\n `## ${category.charAt(0).toUpperCase() + category.slice(1)}`,\n \"\",\n );\n\n for (const s of items) {\n const linkedCode = safeParseJson<string[]>(s.linked_code, []);\n const linkedTests = safeParseJson<string[]>(s.linked_tests, []);\n const linkedBlocks = safeParseJson<string[]>(s.linked_blocks, []);\n\n lines.push(\n `### ${statusIcon(s.status)} ${s.id}: ${s.name}`,\n \"\",\n `- **Priority:** ${s.priority}`,\n `- **Verification:** ${s.verification}`,\n `- **Scenario:** ${s.scenario}`,\n `- **Expected:** ${s.expected}`,\n );\n\n if (linkedCode.length > 0) {\n lines.push(\n `- **Linked code:** ${linkedCode.map((c) => `\\`${c}\\``).join(\", \")}`,\n );\n }\n if (linkedTests.length > 0) {\n lines.push(\n `- **Linked tests:** ${linkedTests.map((t) => `\\`${t}\\``).join(\", \")}`,\n );\n }\n if (linkedBlocks.length > 0) {\n lines.push(\n `- **Linked blocks:** ${linkedBlocks.map((b) => `\\`${b}\\``).join(\", \")}`,\n );\n }\n lines.push(\"\");\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { refreshFromDocs } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, safeParseJson } from \"../helpers.js\";\n\ninterface PhaseRow {\n id: string;\n name: string;\n phase_number: number;\n status: string;\n description: string;\n gate_status: string;\n started_at: string | null;\n completed_at: string | null;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n building_block: string | null;\n quality_scenarios: string;\n acceptance_criteria: string;\n}\n\nexport function registerGetPhasePlan(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_phase_plan\",\n \"Get the complete phase plan with all phases, their tasks, status, and gate requirements.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Refresh DB from docs to pick up any YAML edits\n refreshFromDocs(db, params.target_dir);\n\n const phases = db\n .prepare(\n \"SELECT id, name, phase_number, status, description, gate_status, started_at, completed_at FROM phases ORDER BY phase_number\",\n )\n .all() as PhaseRow[];\n\n if (phases.length === 0) {\n return {\n content: [\n { type: \"text\" as const, text: \"No phases defined yet.\" },\n ],\n };\n }\n\n const lines: string[] = [\"# Phase Plan\", \"\"];\n\n for (const phase of phases) {\n const icon =\n phase.status === \"complete\"\n ? \"[x]\"\n : phase.status === \"in-progress\"\n ? \"[>]\"\n : phase.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n\n lines.push(\n `## ${icon} Phase ${phase.phase_number}: ${phase.name}`,\n \"\",\n `**Status:** ${phase.status}`,\n `**Description:** ${phase.description}`,\n );\n\n if (phase.started_at) {\n lines.push(`**Started:** ${phase.started_at}`);\n }\n if (phase.completed_at) {\n lines.push(`**Completed:** ${phase.completed_at}`);\n }\n\n // Tasks for this phase\n const tasks = db\n .prepare(\n \"SELECT id, title, status, building_block, quality_scenarios, acceptance_criteria FROM tasks WHERE phase_id = ? ORDER BY id\",\n )\n .all(phase.id) as TaskRow[];\n\n if (tasks.length > 0) {\n const done = tasks.filter((t) => t.status === \"done\").length;\n lines.push(\n \"\",\n `### Tasks (${done}/${tasks.length} complete)`,\n \"\",\n );\n\n for (const task of tasks) {\n const check =\n task.status === \"done\"\n ? \"[x]\"\n : task.status === \"in-progress\"\n ? \"[>]\"\n : task.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n\n lines.push(`- ${check} **${task.id}:** ${task.title}`);\n\n if (task.building_block) {\n lines.push(` - Block: \\`${task.building_block}\\``);\n }\n\n const qScenarios = safeParseJson<string[]>(task.quality_scenarios, []);\n if (qScenarios.length > 0) {\n lines.push(\n ` - Quality: ${qScenarios.join(\", \")}`,\n );\n }\n\n const criteria = safeParseJson<string[]>(task.acceptance_criteria, []);\n if (criteria.length > 0) {\n for (const c of criteria) {\n lines.push(` - [ ] ${c}`);\n }\n }\n }\n }\n\n lines.push(\"\");\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { refreshFromDocs } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, safeParseJson } from \"../helpers.js\";\n\ninterface TaskRow {\n id: string;\n phase_id: string;\n title: string;\n description: string | null;\n status: string;\n building_block: string | null;\n quality_scenarios: string;\n acceptance_criteria: string;\n}\n\ninterface PhaseRow {\n id: string;\n name: string;\n}\n\nexport function registerGetCurrentTasks(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_current_tasks\",\n \"Get tasks for the current in-progress phase, with their building blocks, quality scenarios, and acceptance criteria.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n status: z\n .enum([\"todo\", \"in-progress\", \"done\", \"blocked\"])\n .optional()\n .describe(\"Filter tasks by status\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Refresh DB from docs to pick up any YAML edits\n refreshFromDocs(db, params.target_dir);\n\n // Find current phase\n const currentPhase = db\n .prepare(\n \"SELECT id, name FROM phases WHERE status = 'in-progress' ORDER BY phase_number LIMIT 1\",\n )\n .get() as PhaseRow | undefined;\n\n if (!currentPhase) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"No phase is currently in-progress. Use `arcbridge_get_phase_plan` to see all phases.\",\n },\n ],\n };\n }\n\n let query =\n \"SELECT id, phase_id, title, description, status, building_block, quality_scenarios, acceptance_criteria FROM tasks WHERE phase_id = ?\";\n const queryParams: string[] = [currentPhase.id];\n\n if (params.status) {\n query += \" AND status = ?\";\n queryParams.push(params.status);\n }\n\n query += \" ORDER BY id\";\n\n const tasks = db.prepare(query).all(...queryParams) as TaskRow[];\n\n const lines: string[] = [\n `# Current Tasks: ${currentPhase.name}`,\n \"\",\n ];\n\n if (tasks.length === 0) {\n lines.push(\n params.status\n ? `No tasks with status '${params.status}' in this phase.`\n : \"No tasks in this phase.\",\n );\n } else {\n const done = tasks.filter((t) => t.status === \"done\").length;\n lines.push(`**Progress:** ${done}/${tasks.length} complete`, \"\");\n\n for (const task of tasks) {\n const check =\n task.status === \"done\"\n ? \"[x]\"\n : task.status === \"in-progress\"\n ? \"[>]\"\n : task.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n\n lines.push(`## ${check} ${task.id}: ${task.title}`, \"\");\n lines.push(`**Status:** ${task.status}`);\n\n if (task.building_block) {\n lines.push(`**Building block:** \\`${task.building_block}\\``);\n }\n\n const qScenarios = safeParseJson<string[]>(task.quality_scenarios, []);\n if (qScenarios.length > 0) {\n lines.push(\n `**Quality scenarios:** ${qScenarios.join(\", \")}`,\n );\n }\n\n const criteria = safeParseJson<string[]>(task.acceptance_criteria, []);\n if (criteria.length > 0) {\n lines.push(\"\", \"**Acceptance criteria:**\");\n for (const c of criteria) {\n lines.push(\n `- ${task.status === \"done\" ? \"[x]\" : \"[ ]\"} ${c}`,\n );\n }\n }\n\n lines.push(\"\");\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { syncTaskToYaml } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized } from \"../helpers.js\";\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n phase_id: string;\n}\n\nexport function registerUpdateTask(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_update_task\",\n \"Update a task's status. Use this to mark tasks as in-progress, done, or blocked as you work.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n task_id: z.string().describe(\"Task ID (e.g., 'task-0.1-init-nextjs')\"),\n status: z\n .enum([\"in-progress\", \"done\", \"blocked\"])\n .describe(\"New status\"),\n notes: z\n .string()\n .optional()\n .describe(\"Optional notes about the status change\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Check task exists\n const task = db\n .prepare(\"SELECT id, title, status, phase_id FROM tasks WHERE id = ?\")\n .get(params.task_id) as TaskRow | undefined;\n\n if (!task) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Task '${params.task_id}' not found. Use \\`arcbridge_get_current_tasks\\` to see available tasks.`,\n },\n ],\n };\n }\n\n const oldStatus = task.status;\n const now = new Date().toISOString();\n\n // Update status in DB\n if (params.status === \"done\") {\n db.prepare(\n \"UPDATE tasks SET status = ?, completed_at = ? WHERE id = ?\",\n ).run(params.status, now, params.task_id);\n } else {\n db.prepare(\"UPDATE tasks SET status = ? WHERE id = ?\").run(\n params.status,\n params.task_id,\n );\n }\n\n // Write back to YAML\n syncTaskToYaml(\n params.target_dir,\n task.phase_id,\n params.task_id,\n params.status,\n params.status === \"done\" ? now : null,\n );\n\n const lines: string[] = [\n `Task **${task.id}** updated: ${oldStatus} → ${params.status}`,\n \"\",\n `**${task.title}**`,\n ];\n\n if (params.notes) {\n lines.push(\"\", `**Notes:** ${params.notes}`);\n }\n\n // If task is done, show phase progress\n if (params.status === \"done\") {\n const phaseStats = db\n .prepare(\n \"SELECT COUNT(*) as total, SUM(CASE WHEN status = 'done' THEN 1 ELSE 0 END) as done FROM tasks WHERE phase_id = ?\",\n )\n .get(task.phase_id) as { total: number; done: number };\n\n lines.push(\n \"\",\n `**Phase progress:** ${phaseStats.done}/${phaseStats.total} tasks complete`,\n );\n\n if (phaseStats.done === phaseStats.total) {\n lines.push(\n \"\",\n \"All tasks in this phase are complete! The phase is ready to advance.\",\n );\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { addTaskToYaml } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized } from \"../helpers.js\";\n\nexport function registerCreateTask(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_create_task\",\n \"Create a new task in a phase. Links it to a building block and quality scenarios.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n phase_id: z.string().describe(\"Phase ID to add the task to\"),\n title: z.string().min(1).describe(\"Task title\"),\n building_block: z\n .string()\n .optional()\n .describe(\"Building block this task belongs to\"),\n quality_scenarios: z\n .array(z.string())\n .default([])\n .describe(\"Quality scenario IDs this task addresses\"),\n acceptance_criteria: z\n .array(z.string())\n .default([])\n .describe(\"Acceptance criteria for this task\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Verify phase exists\n const phase = db\n .prepare(\"SELECT id, name, phase_number FROM phases WHERE id = ?\")\n .get(params.phase_id) as\n | { id: string; name: string; phase_number: number }\n | undefined;\n\n if (!phase) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Phase '${params.phase_id}' not found. Use \\`arcbridge_get_phase_plan\\` to see phases.`,\n },\n ],\n };\n }\n\n // Generate task ID\n const existingCount = (\n db\n .prepare(\n \"SELECT COUNT(*) as count FROM tasks WHERE phase_id = ?\",\n )\n .get(params.phase_id) as { count: number }\n ).count;\n\n const taskNum = existingCount + 1;\n const slug = params.title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 30);\n const taskId = `task-${phase.phase_number}.${taskNum}-${slug}`;\n\n const now = new Date().toISOString();\n\n db.prepare(\n \"INSERT INTO tasks (id, phase_id, title, description, status, building_block, quality_scenarios, acceptance_criteria, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\",\n ).run(\n taskId,\n params.phase_id,\n params.title,\n null,\n \"todo\",\n params.building_block ?? null,\n JSON.stringify(params.quality_scenarios),\n JSON.stringify(params.acceptance_criteria),\n now,\n );\n\n // Write back to YAML\n addTaskToYaml(params.target_dir, params.phase_id, {\n id: taskId,\n title: params.title,\n status: \"todo\",\n building_block: params.building_block,\n quality_scenarios: params.quality_scenarios,\n acceptance_criteria: params.acceptance_criteria,\n });\n\n const lines = [\n `Task created: **${taskId}**`,\n \"\",\n `**Title:** ${params.title}`,\n `**Phase:** ${phase.name}`,\n `**Status:** todo`,\n ];\n\n if (params.building_block) {\n lines.push(`**Block:** \\`${params.building_block}\\``);\n }\n if (params.quality_scenarios.length > 0) {\n lines.push(\n `**Quality scenarios:** ${params.quality_scenarios.join(\", \")}`,\n );\n }\n if (params.acceptance_criteria.length > 0) {\n lines.push(\"\", \"**Acceptance criteria:**\");\n for (const c of params.acceptance_criteria) {\n lines.push(`- [ ] ${c}`);\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, safeParseJson, escapeLike } from \"../helpers.js\";\n\ninterface AdrRow {\n id: string;\n title: string;\n status: string;\n date: string;\n context: string | null;\n decision: string | null;\n consequences: string | null;\n affected_blocks: string;\n affected_files: string;\n quality_scenarios: string;\n}\n\nexport function registerGetRelevantAdrs(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_relevant_adrs\",\n \"Get architectural decision records (ADRs) relevant to a specific file path or building block.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n file_path: z\n .string()\n .optional()\n .describe(\"File path to find relevant ADRs for\"),\n building_block: z\n .string()\n .optional()\n .describe(\"Building block ID to find relevant ADRs for\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n if (!params.file_path && !params.building_block) {\n // Return all ADRs\n const adrs = db\n .prepare(\n \"SELECT id, title, status, date, context, decision, consequences, affected_blocks, affected_files, quality_scenarios FROM adrs ORDER BY id\",\n )\n .all() as AdrRow[];\n\n return formatAdrs(adrs, \"All ADRs\");\n }\n\n const adrs: AdrRow[] = [];\n const seen = new Set<string>();\n\n // Search by building block\n if (params.building_block) {\n const blockAdrs = db\n .prepare(\n \"SELECT id, title, status, date, context, decision, consequences, affected_blocks, affected_files, quality_scenarios FROM adrs WHERE affected_blocks LIKE ? ESCAPE '\\\\'\",\n )\n .all(`%\"${escapeLike(params.building_block)}\"%`) as AdrRow[];\n\n for (const adr of blockAdrs) {\n if (!seen.has(adr.id)) {\n adrs.push(adr);\n seen.add(adr.id);\n }\n }\n }\n\n // Search by file path\n if (params.file_path) {\n const fileAdrs = db\n .prepare(\n \"SELECT id, title, status, date, context, decision, consequences, affected_blocks, affected_files, quality_scenarios FROM adrs WHERE affected_files LIKE ? ESCAPE '\\\\'\",\n )\n .all(`%${escapeLike(params.file_path)}%`) as AdrRow[];\n\n for (const adr of fileAdrs) {\n if (!seen.has(adr.id)) {\n adrs.push(adr);\n seen.add(adr.id);\n }\n }\n }\n\n const scope = [\n params.file_path ? `file: ${params.file_path}` : \"\",\n params.building_block ? `block: ${params.building_block}` : \"\",\n ]\n .filter(Boolean)\n .join(\", \");\n\n return formatAdrs(adrs, `ADRs for ${scope}`);\n },\n );\n}\n\nfunction formatAdrs(adrs: AdrRow[], title: string) {\n if (adrs.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No ADRs found for the specified scope.`,\n },\n ],\n };\n }\n\n const lines: string[] = [`# ${title}`, \"\"];\n\n for (const adr of adrs) {\n const affectedBlocks = safeParseJson<string[]>(adr.affected_blocks, []);\n const affectedFiles = safeParseJson<string[]>(adr.affected_files, []);\n\n lines.push(\n `## ${adr.id}: ${adr.title}`,\n \"\",\n `**Status:** ${adr.status} | **Date:** ${adr.date}`,\n );\n\n if (affectedBlocks.length > 0) {\n lines.push(\n `**Affected blocks:** ${affectedBlocks.map((b) => `\\`${b}\\``).join(\", \")}`,\n );\n }\n if (affectedFiles.length > 0) {\n lines.push(\n `**Affected files:** ${affectedFiles.map((f) => `\\`${f}\\``).join(\", \")}`,\n );\n }\n\n if (adr.decision) {\n lines.push(\"\", adr.decision);\n }\n\n lines.push(\"\");\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { indexProject, refreshFromDocs } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\n\nexport function registerReindex(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_reindex\",\n \"Re-index code symbols in the project. Supports TypeScript and C# (.NET). Incrementally processes only changed files.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n tsconfig_path: z\n .string()\n .optional()\n .describe(\"Override tsconfig.json path (default: auto-detect). Only used for TypeScript projects.\"),\n service: z\n .string()\n .optional()\n .describe(\"Service name for monorepo projects (default: 'main')\"),\n language: z\n .enum([\"typescript\", \"csharp\", \"auto\"])\n .optional()\n .describe(\"Project language. 'auto' detects from project files (default: 'auto')\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n try {\n // Refresh architecture docs into DB first (picks up manual edits)\n const docWarnings = refreshFromDocs(db, params.target_dir);\n\n const result = await indexProject(db, {\n projectRoot: params.target_dir,\n tsconfigPath: params.tsconfig_path,\n service: params.service,\n language: params.language,\n });\n\n const lines = [\n \"# Indexing Complete\",\n \"\",\n `- **Docs refreshed:** ${docWarnings.length === 0 ? \"OK\" : docWarnings.join(\", \")}`,\n `- **Files processed:** ${result.filesProcessed}`,\n `- **Files skipped (unchanged):** ${result.filesSkipped}`,\n `- **Files removed:** ${result.filesRemoved}`,\n `- **Symbols indexed:** ${result.symbolsIndexed}`,\n `- **Dependencies indexed:** ${result.dependenciesIndexed}`,\n `- **Components analyzed:** ${result.componentsAnalyzed}`,\n `- **Routes analyzed:** ${result.routesAnalyzed}`,\n `- **Duration:** ${result.durationMs}ms`,\n ];\n\n return textResult(lines.join(\"\\n\"));\n } catch (err) {\n const message =\n err instanceof Error ? err.message : String(err);\n return textResult(`Indexing failed: ${message}`);\n }\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, escapeLike } from \"../helpers.js\";\n\ninterface SymbolRow {\n id: string;\n name: string;\n qualified_name: string;\n kind: string;\n file_path: string;\n start_line: number;\n signature: string | null;\n return_type: string | null;\n is_exported: number;\n is_async: number;\n doc_comment: string | null;\n}\n\nexport function registerSearchSymbols(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_search_symbols\",\n \"Search code symbols by name, kind, file path, or building block. Supports TypeScript and C#. Returns matching symbols with type signatures.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n query: z\n .string()\n .optional()\n .describe(\"Search term to match against symbol names\"),\n service: z\n .string()\n .optional()\n .describe(\"Filter by service name (for multi-project solutions). Omit to search all services.\"),\n kind: z\n .enum([\n \"function\",\n \"class\",\n \"type\",\n \"constant\",\n \"interface\",\n \"enum\",\n \"variable\",\n \"component\",\n \"hook\",\n \"context\",\n ])\n .optional()\n .describe(\"Filter by symbol kind\"),\n file_path: z\n .string()\n .optional()\n .describe(\"Filter by file path (prefix match)\"),\n is_exported: z\n .boolean()\n .optional()\n .describe(\"Filter by export status\"),\n building_block: z\n .string()\n .optional()\n .describe(\"Filter by building block ID (matches against code_paths)\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(200)\n .default(50)\n .describe(\"Maximum results to return (default: 50)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const conditions: string[] = [];\n const queryParams: (string | number)[] = [];\n\n if (params.service) {\n conditions.push(\"s.service = ?\");\n queryParams.push(params.service);\n }\n\n if (params.query) {\n conditions.push(\"s.name LIKE ? ESCAPE '\\\\'\");\n queryParams.push(`%${escapeLike(params.query)}%`);\n }\n\n if (params.kind) {\n conditions.push(\"s.kind = ?\");\n queryParams.push(params.kind);\n }\n\n if (params.file_path) {\n conditions.push(\"s.file_path LIKE ? ESCAPE '\\\\'\");\n queryParams.push(`${escapeLike(params.file_path)}%`);\n }\n\n if (params.is_exported !== undefined) {\n conditions.push(\"s.is_exported = ?\");\n queryParams.push(params.is_exported ? 1 : 0);\n }\n\n // Building block filter: match symbol file_path against block code_paths\n if (params.building_block) {\n const block = db\n .prepare(\"SELECT code_paths FROM building_blocks WHERE id = ?\")\n .get(params.building_block) as { code_paths: string } | undefined;\n\n if (block) {\n try {\n const codePaths = JSON.parse(block.code_paths) as string[];\n if (codePaths.length > 0) {\n const pathConditions = codePaths.map(() => \"s.file_path LIKE ? ESCAPE '\\\\'\");\n conditions.push(`(${pathConditions.join(\" OR \")})`);\n for (const cp of codePaths) {\n // Convert glob-like paths to LIKE prefix: \"src/lib/auth/\" → \"src/lib/auth/%\"\n const prefix = cp.replace(/\\*\\*?\\/?\\*?$/, \"\");\n queryParams.push(`${escapeLike(prefix)}%`);\n }\n }\n } catch {\n // Ignore malformed code_paths\n }\n }\n }\n\n let query =\n \"SELECT s.id, s.name, s.qualified_name, s.kind, s.file_path, s.start_line, s.signature, s.return_type, s.is_exported, s.is_async, s.doc_comment FROM symbols s\";\n\n if (conditions.length > 0) {\n query += \" WHERE \" + conditions.join(\" AND \");\n }\n\n query += \" ORDER BY s.name LIMIT ?\";\n queryParams.push(params.limit);\n\n const rows = db.prepare(query).all(...queryParams) as SymbolRow[];\n\n if (rows.length === 0) {\n return textResult(\"No symbols found matching the search criteria.\");\n }\n\n const lines: string[] = [\n `# Symbol Search Results (${rows.length}${rows.length === params.limit ? \"+\" : \"\"})`,\n \"\",\n ];\n\n for (const s of rows) {\n const flags = [\n s.is_exported ? \"exported\" : \"internal\",\n s.is_async ? \"async\" : \"\",\n ]\n .filter(Boolean)\n .join(\", \");\n\n lines.push(\n `## \\`${s.qualified_name}\\` (${s.kind})`,\n \"\",\n `- **ID:** \\`${s.id}\\``,\n `- **Location:** \\`${s.file_path}:${s.start_line}\\``,\n `- **Flags:** ${flags}`,\n );\n\n if (s.signature) {\n lines.push(`- **Signature:** \\`${s.signature}\\``);\n }\n if (s.return_type) {\n lines.push(`- **Returns:** \\`${s.return_type}\\``);\n }\n if (s.doc_comment) {\n lines.push(`- **Docs:** ${s.doc_comment}`);\n }\n\n lines.push(\"\");\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson } from \"../helpers.js\";\n\ninterface SymbolRow {\n id: string;\n name: string;\n qualified_name: string;\n kind: string;\n file_path: string;\n start_line: number;\n end_line: number;\n start_col: number;\n end_col: number;\n signature: string | null;\n return_type: string | null;\n doc_comment: string | null;\n is_exported: number;\n is_async: number;\n service: string;\n content_hash: string;\n indexed_at: string;\n}\n\ninterface DepRow {\n symbol_id: string;\n symbol_name: string;\n kind: string;\n file_path: string;\n}\n\nexport function registerGetSymbol(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_symbol\",\n \"Get detailed information about a specific TypeScript symbol including its source code, type signature, and relationships.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n symbol_id: z\n .string()\n .describe(\n \"Symbol ID (e.g. 'src/utils.ts::formatName#function')\",\n ),\n include_source: z\n .boolean()\n .default(true)\n .describe(\"Include source code snippet (default: true)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const symbol = db\n .prepare(\"SELECT * FROM symbols WHERE id = ?\")\n .get(params.symbol_id) as SymbolRow | undefined;\n\n if (!symbol) {\n return textResult(\n `Symbol not found: \\`${params.symbol_id}\\`\\n\\nUse \\`arcbridge_search_symbols\\` to find symbols by name.`,\n );\n }\n\n const lines: string[] = [\n `# ${symbol.qualified_name}`,\n \"\",\n `| Field | Value |`,\n `|-------|-------|`,\n `| **Kind** | ${symbol.kind} |`,\n `| **File** | \\`${symbol.file_path}:${symbol.start_line}\\` |`,\n `| **Exported** | ${symbol.is_exported ? \"yes\" : \"no\"} |`,\n `| **Async** | ${symbol.is_async ? \"yes\" : \"no\"} |`,\n `| **Service** | ${symbol.service} |`,\n ];\n\n if (symbol.signature) {\n lines.push(`| **Signature** | \\`${symbol.signature}\\` |`);\n }\n if (symbol.return_type) {\n lines.push(`| **Return type** | \\`${symbol.return_type}\\` |`);\n }\n\n lines.push(\"\");\n\n if (symbol.doc_comment) {\n lines.push(\"## Documentation\", \"\", symbol.doc_comment, \"\");\n }\n\n // Source code snippet\n if (params.include_source) {\n const absPath = join(params.target_dir, symbol.file_path);\n if (existsSync(absPath)) {\n try {\n const content = readFileSync(absPath, \"utf-8\");\n const fileLines = content.split(\"\\n\");\n\n const contextBefore = 2;\n const startIdx = Math.max(0, symbol.start_line - 1 - contextBefore);\n const endIdx = Math.min(fileLines.length, symbol.end_line);\n\n const snippet = fileLines\n .slice(startIdx, endIdx)\n .map((line, i) => {\n const lineNum = startIdx + i + 1;\n const marker =\n lineNum >= symbol.start_line && lineNum <= symbol.end_line\n ? \">\"\n : \" \";\n return `${marker} ${String(lineNum).padStart(4)} | ${line}`;\n })\n .join(\"\\n\");\n\n lines.push(\"## Source\", \"\", \"```typescript\", snippet, \"```\", \"\");\n } catch {\n // File read failed — skip source\n }\n }\n }\n\n // Dependencies (callers and callees) — if any exist\n const callees = db\n .prepare(\n `SELECT d.target_symbol as symbol_id, s.name as symbol_name, d.kind, s.file_path\n FROM dependencies d\n JOIN symbols s ON s.id = d.target_symbol\n WHERE d.source_symbol = ?\n ORDER BY d.kind, s.name`,\n )\n .all(params.symbol_id) as DepRow[];\n\n const callers = db\n .prepare(\n `SELECT d.source_symbol as symbol_id, s.name as symbol_name, d.kind, s.file_path\n FROM dependencies d\n JOIN symbols s ON s.id = d.source_symbol\n WHERE d.target_symbol = ?\n ORDER BY d.kind, s.name`,\n )\n .all(params.symbol_id) as DepRow[];\n\n if (callees.length > 0) {\n lines.push(\"## Dependencies (this symbol uses)\", \"\");\n for (const dep of callees) {\n lines.push(`- **${dep.kind}** → \\`${dep.symbol_name}\\` (\\`${dep.file_path}\\`)`);\n }\n lines.push(\"\");\n }\n\n if (callers.length > 0) {\n lines.push(\"## Dependents (uses this symbol)\", \"\");\n for (const dep of callers) {\n lines.push(`- **${dep.kind}** ← \\`${dep.symbol_name}\\` (\\`${dep.file_path}\\`)`);\n }\n lines.push(\"\");\n }\n\n // Find which building block this symbol belongs to\n const blocks = db\n .prepare(\"SELECT id, name, code_paths FROM building_blocks\")\n .all() as { id: string; name: string; code_paths: string }[];\n\n for (const block of blocks) {\n const codePaths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of codePaths) {\n const prefix = cp.replace(/\\*\\*?\\/?\\*?$/, \"\");\n if (symbol.file_path.startsWith(prefix)) {\n lines.push(`## Building Block`, \"\", `Part of **${block.name}** (\\`${block.id}\\`)`, \"\");\n break;\n }\n }\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, escapeLike } from \"../helpers.js\";\n\ninterface DepEdge {\n source_id: string;\n source_name: string;\n source_file: string;\n target_id: string;\n target_name: string;\n target_file: string;\n kind: string;\n}\n\nexport function registerGetDependencyGraph(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_dependency_graph\",\n \"Get the dependency graph for a module or file. Shows imports, calls, type usage, and inheritance relationships between symbols.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n module: z\n .string()\n .describe(\n \"Module path relative to project root (e.g. 'src/lib/auth')\",\n ),\n direction: z\n .enum([\"dependencies\", \"dependents\", \"both\"])\n .default(\"both\")\n .describe(\n \"Graph direction: 'dependencies' (what this module uses), 'dependents' (what uses this module), or 'both'\",\n ),\n depth: z\n .number()\n .int()\n .min(1)\n .max(5)\n .default(1)\n .describe(\"How many levels to traverse (default: 1, max: 5)\"),\n service: z\n .string()\n .optional()\n .describe(\"Filter by service name (for multi-project solutions). Omit to search all services.\"),\n },\n async (params) => {\n const maybeDb = ensureDb(ctx, params.target_dir);\n if (!maybeDb) return notInitialized();\n const db = maybeDb;\n\n // Check if we have any dependencies indexed\n const depCount = (\n db.prepare(\"SELECT COUNT(*) as count FROM dependencies\").get() as {\n count: number;\n }\n ).count;\n\n if (depCount === 0) {\n // Fall back to file-level import analysis from symbols table\n return getFileImportGraph(db, params.module, params.direction);\n }\n\n // Full dependency graph from dependencies table\n const edges: DepEdge[] = [];\n const visited = new Set<string>();\n const serviceFilter = params.service ? \" AND s1.service = ?\" : \"\";\n const serviceFilter2 = params.service ? \" AND s2.service = ?\" : \"\";\n\n function collectEdges(modulePath: string, currentDepth: number): void {\n if (currentDepth > params.depth || visited.has(modulePath)) return;\n visited.add(modulePath);\n\n const prefix = `${escapeLike(modulePath)}%`;\n\n if (params.direction === \"dependencies\" || params.direction === \"both\") {\n const queryArgs: (string | number)[] = [prefix];\n if (params.service) queryArgs.push(params.service);\n\n const deps = db\n .prepare(\n `SELECT d.source_symbol as source_id, s1.name as source_name, s1.file_path as source_file,\n d.target_symbol as target_id, s2.name as target_name, s2.file_path as target_file,\n d.kind\n FROM dependencies d\n JOIN symbols s1 ON s1.id = d.source_symbol\n JOIN symbols s2 ON s2.id = d.target_symbol\n WHERE s1.file_path LIKE ? ESCAPE '\\\\'${serviceFilter}\n ORDER BY d.kind, s2.name`,\n )\n .all(...queryArgs) as DepEdge[];\n\n for (const dep of deps) {\n const key = `${dep.source_id}->${dep.target_id}:${dep.kind}`;\n if (!visited.has(key)) {\n edges.push(dep);\n visited.add(key);\n if (currentDepth < params.depth) {\n const targetDir = dep.target_file.replace(/\\/[^/]+$/, \"\");\n collectEdges(targetDir, currentDepth + 1);\n }\n }\n }\n }\n\n if (params.direction === \"dependents\" || params.direction === \"both\") {\n const queryArgs2: (string | number)[] = [prefix];\n if (params.service) queryArgs2.push(params.service);\n\n const deps = db\n .prepare(\n `SELECT d.source_symbol as source_id, s1.name as source_name, s1.file_path as source_file,\n d.target_symbol as target_id, s2.name as target_name, s2.file_path as target_file,\n d.kind\n FROM dependencies d\n JOIN symbols s1 ON s1.id = d.source_symbol\n JOIN symbols s2 ON s2.id = d.target_symbol\n WHERE s2.file_path LIKE ? ESCAPE '\\\\'${serviceFilter2}\n ORDER BY d.kind, s1.name`,\n )\n .all(...queryArgs2) as DepEdge[];\n\n for (const dep of deps) {\n const key = `${dep.source_id}->${dep.target_id}:${dep.kind}`;\n if (!visited.has(key)) {\n edges.push(dep);\n visited.add(key);\n if (currentDepth < params.depth) {\n const sourceDir = dep.source_file.replace(/\\/[^/]+$/, \"\");\n collectEdges(sourceDir, currentDepth + 1);\n }\n }\n }\n }\n }\n\n collectEdges(params.module, 1);\n\n if (edges.length === 0) {\n return textResult(\n `No dependency edges found for module \\`${params.module}\\`.\\n\\nThis may mean dependencies haven't been indexed yet (Phase 1b). Run \\`arcbridge_reindex\\` to update.`,\n );\n }\n\n return formatEdges(edges, params.module, params.direction);\n },\n );\n}\n\nfunction getFileImportGraph(\n db: import(\"better-sqlite3\").Database,\n modulePath: string,\n _direction: string,\n) {\n // When no dependency edges exist, show a file-level view of symbols\n const prefix = `${escapeLike(modulePath)}%`;\n\n const symbols = db\n .prepare(\n `SELECT file_path, name, kind, is_exported\n FROM symbols\n WHERE file_path LIKE ? ESCAPE '\\\\'\n ORDER BY file_path, name`,\n )\n .all(prefix) as {\n file_path: string;\n name: string;\n kind: string;\n is_exported: number;\n }[];\n\n if (symbols.length === 0) {\n return textResult(\n `No symbols found in module \\`${modulePath}\\`. Run \\`arcbridge_reindex\\` first.`,\n );\n }\n\n const byFile = new Map<string, typeof symbols>();\n for (const s of symbols) {\n const list = byFile.get(s.file_path) ?? [];\n list.push(s);\n byFile.set(s.file_path, list);\n }\n\n const lines = [\n `# Module: ${modulePath}`,\n \"\",\n `> Dependency edges not yet indexed. Showing file-level symbol map.`,\n `> Run \\`arcbridge_reindex\\` after Phase 1b to see full dependency graph.`,\n \"\",\n ];\n\n for (const [file, syms] of byFile) {\n lines.push(`## \\`${file}\\``, \"\");\n for (const s of syms) {\n const exported = s.is_exported ? \" (exported)\" : \"\";\n lines.push(`- \\`${s.name}\\` — ${s.kind}${exported}`);\n }\n lines.push(\"\");\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n}\n\nfunction formatEdges(\n edges: DepEdge[],\n modulePath: string,\n direction: string,\n) {\n const byKind = new Map<string, DepEdge[]>();\n for (const e of edges) {\n const list = byKind.get(e.kind) ?? [];\n list.push(e);\n byKind.set(e.kind, list);\n }\n\n const lines = [\n `# Dependency Graph: ${modulePath}`,\n \"\",\n `**Direction:** ${direction} | **Edges:** ${edges.length}`,\n \"\",\n ];\n\n for (const [kind, kindEdges] of byKind) {\n lines.push(`## ${kind}`, \"\");\n for (const e of kindEdges) {\n lines.push(\n `- \\`${e.source_name}\\` (\\`${e.source_file}\\`) → \\`${e.target_name}\\` (\\`${e.target_file}\\`)`,\n );\n }\n lines.push(\"\");\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson, escapeLike } from \"../helpers.js\";\n\ninterface ComponentRow {\n symbol_id: string;\n name: string;\n file_path: string;\n is_client: number;\n is_server_action: number;\n has_state: number;\n context_providers: string;\n context_consumers: string;\n props_type: string | null;\n is_exported: number;\n}\n\ninterface RenderEdge {\n source_name: string;\n source_file: string;\n target_name: string;\n target_file: string;\n}\n\nexport function registerGetComponentGraph(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_component_graph\",\n \"Get the React component graph: component hierarchy, props, state, context usage, and server/client boundaries.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n file_path: z\n .string()\n .optional()\n .describe(\"Filter to components in a specific file or directory prefix\"),\n client_only: z\n .boolean()\n .optional()\n .describe(\"Only show client components ('use client')\"),\n with_state: z\n .boolean()\n .optional()\n .describe(\"Only show components that use state (useState/useReducer)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n let query = `\n SELECT\n c.symbol_id, s.name, s.file_path,\n c.is_client, c.is_server_action, c.has_state,\n c.context_providers, c.context_consumers, c.props_type,\n s.is_exported\n FROM components c\n JOIN symbols s ON c.symbol_id = s.id\n `;\n const conditions: string[] = [];\n const queryParams: (string | number)[] = [];\n\n if (params.file_path) {\n conditions.push(\"s.file_path LIKE ? ESCAPE '\\\\'\");\n queryParams.push(`${escapeLike(params.file_path)}%`);\n }\n if (params.client_only) {\n conditions.push(\"c.is_client = 1\");\n }\n if (params.with_state) {\n conditions.push(\"c.has_state = 1\");\n }\n\n if (conditions.length > 0) {\n query += \" WHERE \" + conditions.join(\" AND \");\n }\n query += \" ORDER BY s.file_path, s.name\";\n\n const components = db.prepare(query).all(...queryParams) as ComponentRow[];\n\n if (components.length === 0) {\n return textResult(\"No components found. Run `arcbridge_reindex` to analyze React components.\");\n }\n\n // Get render edges between components\n const renderEdges = db\n .prepare(\n `SELECT\n ss.name as source_name, ss.file_path as source_file,\n st.name as target_name, st.file_path as target_file\n FROM dependencies d\n JOIN symbols ss ON d.source_symbol = ss.id\n JOIN symbols st ON d.target_symbol = st.id\n WHERE d.kind = 'renders'\n AND d.source_symbol IN (SELECT symbol_id FROM components)\n AND d.target_symbol IN (SELECT symbol_id FROM components)`,\n )\n .all() as RenderEdge[];\n\n const lines: string[] = [\n `# Component Graph (${components.length} components)`,\n \"\",\n ];\n\n // Group by file\n const byFile = new Map<string, ComponentRow[]>();\n for (const c of components) {\n const existing = byFile.get(c.file_path) ?? [];\n existing.push(c);\n byFile.set(c.file_path, existing);\n }\n\n for (const [file, comps] of byFile) {\n lines.push(`## \\`${file}\\``, \"\");\n for (const c of comps) {\n const badges: string[] = [];\n if (c.is_client) badges.push(\"client\");\n if (c.is_server_action) badges.push(\"server-action\");\n if (c.has_state) badges.push(\"stateful\");\n if (!c.is_exported) badges.push(\"internal\");\n\n const badgeStr = badges.length > 0 ? ` [${badges.join(\", \")}]` : \"\";\n lines.push(`### ${c.name}${badgeStr}`, \"\");\n\n if (c.props_type) {\n lines.push(`- **Props:** \\`${c.props_type}\\``);\n }\n\n const providers = safeParseJson<string[]>(c.context_providers, []);\n if (providers.length > 0) {\n lines.push(`- **Provides context:** ${providers.join(\", \")}`);\n }\n\n const consumers = safeParseJson<string[]>(c.context_consumers, []);\n if (consumers.length > 0) {\n lines.push(`- **Consumes context:** ${consumers.join(\", \")}`);\n }\n\n // Children (renders)\n const children = renderEdges\n .filter((e) => e.source_name === c.name && e.source_file === file)\n .map((e) => e.target_name);\n if (children.length > 0) {\n lines.push(`- **Renders:** ${children.join(\", \")}`);\n }\n\n // Parents (rendered by)\n const parents = renderEdges\n .filter((e) => e.target_name === c.name && e.target_file === file)\n .map((e) => e.source_name);\n if (parents.length > 0) {\n lines.push(`- **Rendered by:** ${parents.join(\", \")}`);\n }\n\n lines.push(\"\");\n }\n }\n\n // Summary\n const clientCount = components.filter((c) => c.is_client).length;\n const statefulCount = components.filter((c) => c.has_state).length;\n lines.push(\n \"## Summary\",\n \"\",\n `- **Total components:** ${components.length}`,\n `- **Client components:** ${clientCount}`,\n `- **Stateful components:** ${statefulCount}`,\n `- **Render edges:** ${renderEdges.length}`,\n \"\",\n );\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson, escapeLike } from \"../helpers.js\";\n\ninterface RouteRow {\n id: string;\n route_path: string;\n kind: string;\n http_methods: string;\n has_auth: number;\n parent_layout: string | null;\n service: string;\n}\n\nexport function registerGetRouteMap(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_route_map\",\n \"Get the route map: pages, layouts, API routes, and their hierarchy. Works with Next.js, ASP.NET controllers, and minimal APIs.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n kind: z\n .enum([\"page\", \"layout\", \"loading\", \"error\", \"not-found\", \"api-route\", \"middleware\"])\n .optional()\n .describe(\"Filter by route kind\"),\n route_prefix: z\n .string()\n .optional()\n .describe(\"Filter by route path prefix (e.g. '/dashboard' or '/api/orders')\"),\n service: z\n .string()\n .optional()\n .describe(\"Filter by service name (for multi-project solutions). Omit to show all services.\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n let query = \"SELECT * FROM routes\";\n const conditions: string[] = [];\n const queryParams: (string | number)[] = [];\n\n if (params.service) {\n conditions.push(\"service = ?\");\n queryParams.push(params.service);\n }\n if (params.kind) {\n conditions.push(\"kind = ?\");\n queryParams.push(params.kind);\n }\n if (params.route_prefix) {\n conditions.push(\"route_path LIKE ? ESCAPE '\\\\'\");\n queryParams.push(`${escapeLike(params.route_prefix)}%`);\n }\n\n if (conditions.length > 0) {\n query += \" WHERE \" + conditions.join(\" AND \");\n }\n query += \" ORDER BY route_path, kind\";\n\n const routes = db.prepare(query).all(...queryParams) as RouteRow[];\n\n if (routes.length === 0) {\n return textResult(\"No routes found. Run `arcbridge_reindex` to analyze the Next.js app/ directory.\");\n }\n\n const lines: string[] = [\n `# Route Map (${routes.length} routes)`,\n \"\",\n ];\n\n // Group by route path\n const byPath = new Map<string, RouteRow[]>();\n for (const r of routes) {\n const existing = byPath.get(r.route_path) ?? [];\n existing.push(r);\n byPath.set(r.route_path, existing);\n }\n\n for (const [path, routeGroup] of byPath) {\n lines.push(`## \\`${path}\\``);\n lines.push(\"\");\n\n for (const r of routeGroup) {\n const parts: string[] = [`- **${r.kind}**`];\n\n const methods = safeParseJson<string[]>(r.http_methods, []);\n if (methods.length > 0) {\n parts.push(`Methods: ${methods.join(\", \")}`);\n }\n\n if (r.has_auth) {\n parts.push(\"(auth)\");\n }\n\n if (r.parent_layout) {\n parts.push(`Layout: \\`${r.parent_layout}\\``);\n }\n\n lines.push(parts.join(\" | \"));\n }\n lines.push(\"\");\n }\n\n // Summary\n const pages = routes.filter((r) => r.kind === \"page\").length;\n const layouts = routes.filter((r) => r.kind === \"layout\").length;\n const apiRoutes = routes.filter((r) => r.kind === \"api-route\").length;\n const loadingStates = routes.filter((r) => r.kind === \"loading\").length;\n\n lines.push(\n \"## Summary\",\n \"\",\n `- **Pages:** ${pages}`,\n `- **Layouts:** ${layouts}`,\n `- **API routes:** ${apiRoutes}`,\n `- **Loading states:** ${loadingStates}`,\n \"\",\n );\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\n\ninterface ComponentBoundaryRow {\n symbol_id: string;\n name: string;\n file_path: string;\n is_client: number;\n is_server_action: number;\n has_state: number;\n}\n\ninterface CrossBoundaryEdge {\n source_name: string;\n source_file: string;\n source_is_client: number;\n target_name: string;\n target_file: string;\n target_is_client: number;\n kind: string;\n}\n\nexport function registerGetBoundaryAnalysis(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_boundary_analysis\",\n \"Analyze server/client boundaries in a Next.js project. Identifies client components, server components, server actions, and potential boundary violations.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Get all components with boundary info\n const components = db\n .prepare(\n `SELECT c.symbol_id, s.name, s.file_path,\n c.is_client, c.is_server_action, c.has_state\n FROM components c\n JOIN symbols s ON c.symbol_id = s.id\n ORDER BY s.file_path`,\n )\n .all() as ComponentBoundaryRow[];\n\n if (components.length === 0) {\n return textResult(\"No components found. Run `arcbridge_reindex` to analyze server/client boundaries.\");\n }\n\n // Find cross-boundary render edges (server component rendering client, etc.)\n const crossEdges = db\n .prepare(\n `SELECT\n ss.name as source_name, ss.file_path as source_file, cs.is_client as source_is_client,\n st.name as target_name, st.file_path as target_file, ct.is_client as target_is_client,\n d.kind\n FROM dependencies d\n JOIN symbols ss ON d.source_symbol = ss.id\n JOIN symbols st ON d.target_symbol = st.id\n LEFT JOIN components cs ON d.source_symbol = cs.symbol_id\n LEFT JOIN components ct ON d.target_symbol = ct.symbol_id\n WHERE d.kind IN ('renders', 'imports')\n AND (cs.symbol_id IS NOT NULL OR ct.symbol_id IS NOT NULL)`,\n )\n .all() as CrossBoundaryEdge[];\n\n const clientComponents = components.filter((c) => c.is_client);\n const serverComponents = components.filter((c) => !c.is_client && !c.is_server_action);\n const serverActions = components.filter((c) => c.is_server_action);\n\n const lines: string[] = [\n \"# Server/Client Boundary Analysis\",\n \"\",\n \"## Overview\",\n \"\",\n `- **Server components:** ${serverComponents.length}`,\n `- **Client components:** ${clientComponents.length}`,\n `- **Server actions:** ${serverActions.length}`,\n \"\",\n ];\n\n // Client components section\n if (clientComponents.length > 0) {\n lines.push(\"## Client Components (`'use client'`)\", \"\");\n for (const c of clientComponents) {\n const badges: string[] = [];\n if (c.has_state) badges.push(\"stateful\");\n const badgeStr = badges.length > 0 ? ` [${badges.join(\", \")}]` : \"\";\n lines.push(`- \\`${c.file_path}\\` → **${c.name}**${badgeStr}`);\n }\n lines.push(\"\");\n }\n\n // Server components section\n if (serverComponents.length > 0) {\n lines.push(\"## Server Components (default)\", \"\");\n for (const c of serverComponents) {\n lines.push(`- \\`${c.file_path}\\` → **${c.name}**`);\n }\n lines.push(\"\");\n }\n\n // Server actions section\n if (serverActions.length > 0) {\n lines.push(\"## Server Actions (`'use server'`)\", \"\");\n for (const c of serverActions) {\n lines.push(`- \\`${c.file_path}\\` → **${c.name}**`);\n }\n lines.push(\"\");\n }\n\n // Boundary crossings\n const boundaryViolations: string[] = [];\n const validCrossings: string[] = [];\n\n for (const edge of crossEdges) {\n if (edge.kind !== \"renders\") continue;\n\n const sourceIsClient = edge.source_is_client === 1;\n const targetIsClient = edge.target_is_client === 1;\n\n if (sourceIsClient === targetIsClient) continue; // same boundary, skip\n\n if (!sourceIsClient && targetIsClient) {\n // Server → client: valid boundary crossing\n validCrossings.push(\n `- **${edge.source_name}** (server) → **${edge.target_name}** (client)`,\n );\n } else if (sourceIsClient && !targetIsClient) {\n // Client → server: potential issue (client can't import server component directly)\n boundaryViolations.push(\n `- **${edge.source_name}** (client, \\`${edge.source_file}\\`) renders **${edge.target_name}** (server, \\`${edge.target_file}\\`)`,\n );\n }\n }\n\n if (validCrossings.length > 0) {\n lines.push(\"## Boundary Crossings (valid)\", \"\");\n lines.push(...validCrossings, \"\");\n }\n\n if (boundaryViolations.length > 0) {\n lines.push(\"## Potential Boundary Violations\", \"\");\n lines.push(\n \"These client components appear to render server components, which is not allowed in Next.js App Router:\",\n \"\",\n ...boundaryViolations,\n \"\",\n );\n } else {\n lines.push(\"## Boundary Check\", \"\");\n lines.push(\"No boundary violations detected.\", \"\");\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { detectDrift, writeDriftLog } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\n\nexport function registerCheckDrift(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_check_drift\",\n \"Detect architecture drift: undocumented modules, missing code paths, cross-block dependency violations, and stale ADR references.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n persist: z\n .boolean()\n .default(true)\n .describe(\"Write findings to drift_log table (default: true)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const entries = detectDrift(db);\n\n if (params.persist) {\n writeDriftLog(db, entries);\n }\n\n if (entries.length === 0) {\n return textResult(\n \"# Drift Check\\n\\nNo architecture drift detected. Code aligns with documented building blocks.\",\n );\n }\n\n // Group by kind\n const byKind = new Map<string, typeof entries>();\n for (const e of entries) {\n const existing = byKind.get(e.kind) ?? [];\n existing.push(e);\n byKind.set(e.kind, existing);\n }\n\n const kindLabels: Record<string, string> = {\n undocumented_module: \"Undocumented Modules\",\n missing_module: \"Missing Modules\",\n dependency_violation: \"Dependency Violations\",\n stale_adr: \"Stale ADR References\",\n unlinked_test: \"Unlinked Tests\",\n };\n\n const severityIcon: Record<string, string> = {\n error: \"ERROR\",\n warning: \"WARN\",\n info: \"INFO\",\n };\n\n const lines: string[] = [\n `# Drift Check (${entries.length} issues)`,\n \"\",\n ];\n\n // Summary\n const errors = entries.filter((e) => e.severity === \"error\").length;\n const warnings = entries.filter((e) => e.severity === \"warning\").length;\n const infos = entries.filter((e) => e.severity === \"info\").length;\n lines.push(\n `**${errors}** errors, **${warnings}** warnings, **${infos}** info`,\n \"\",\n );\n\n for (const [kind, items] of byKind) {\n lines.push(`## ${kindLabels[kind] ?? kind}`, \"\");\n for (const item of items) {\n const icon = severityIcon[item.severity] ?? item.severity;\n lines.push(`- [${icon}] ${item.description}`);\n }\n lines.push(\"\");\n }\n\n if (params.persist) {\n lines.push(\n \"---\",\n \"*Findings saved to drift_log. Use `arcbridge_update_task` or resolve drift by updating `.arcbridge/arc42/05-building-blocks.md`.*\",\n \"\",\n );\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson, escapeLike, normalizeCodePath } from \"../helpers.js\";\n\ninterface BlockRow {\n id: string;\n name: string;\n responsibility: string;\n code_paths: string;\n interfaces: string;\n}\n\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n scenario: string;\n expected: string;\n priority: string;\n}\n\ninterface SymbolRow {\n name: string;\n kind: string;\n file_path: string;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n building_block: string | null;\n}\n\ninterface DriftRow {\n kind: string;\n description: string;\n}\n\nexport function registerGetGuidance(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_guidance\",\n \"Get context-aware architectural guidance for a code change. Surfaces relevant quality scenarios, patterns, constraints, and questions to consider.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n file_path: z\n .string()\n .optional()\n .describe(\"File path you're working on (to determine building block and context)\"),\n action: z\n .enum([\n \"adding-component\",\n \"adding-api-route\",\n \"adding-hook\",\n \"modifying-auth\",\n \"new-dependency\",\n \"refactoring\",\n \"general\",\n ])\n .default(\"general\")\n .describe(\"Type of change you're making\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const lines: string[] = [\"# Architectural Guidance\", \"\"];\n\n // 1. Determine which building block this file belongs to\n let matchedBlock: BlockRow | null = null;\n if (params.file_path) {\n const blocks = db\n .prepare(\"SELECT id, name, responsibility, code_paths, interfaces FROM building_blocks\")\n .all() as BlockRow[];\n\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (params.file_path.startsWith(prefix) || params.file_path === prefix) {\n matchedBlock = block;\n break;\n }\n }\n if (matchedBlock) break;\n }\n\n if (matchedBlock) {\n lines.push(\n `## Building Block: ${matchedBlock.name} (\\`${matchedBlock.id}\\`)`,\n \"\",\n `**Responsibility:** ${matchedBlock.responsibility}`,\n \"\",\n );\n\n const interfaces = safeParseJson<string[]>(matchedBlock.interfaces, []);\n if (interfaces.length > 0) {\n lines.push(\n `**Declared interfaces:** ${interfaces.join(\", \")}`,\n \"\",\n );\n }\n } else {\n lines.push(\n \"## Warning: Unmapped File\",\n \"\",\n `\\`${params.file_path}\\` is not mapped to any building block. Consider updating \\`.arcbridge/arc42/05-building-blocks.md\\` to include this path.`,\n \"\",\n );\n }\n\n // 2. Show existing patterns in this block/file area\n const existingSymbols = db\n .prepare(\n \"SELECT name, kind, file_path FROM symbols WHERE file_path LIKE ? ESCAPE '\\\\' ORDER BY kind, name LIMIT 20\",\n )\n .all(`${escapeLike(params.file_path.replace(/\\/[^/]+$/, \"/\"))}%`) as SymbolRow[];\n\n if (existingSymbols.length > 0) {\n const byKind = new Map<string, string[]>();\n for (const s of existingSymbols) {\n const existing = byKind.get(s.kind) ?? [];\n existing.push(s.name);\n byKind.set(s.kind, existing);\n }\n\n lines.push(\"## Existing Patterns Nearby\", \"\");\n for (const [kind, names] of byKind) {\n lines.push(`- **${kind}s:** ${names.join(\", \")}`);\n }\n lines.push(\"\");\n }\n }\n\n // 3. Relevant quality scenarios\n const scenarios = db\n .prepare(\n \"SELECT id, name, category, scenario, expected, priority FROM quality_scenarios ORDER BY priority, category\",\n )\n .all() as ScenarioRow[];\n\n const relevantScenarios = filterRelevantScenarios(\n scenarios,\n params.action,\n matchedBlock?.id ?? null,\n );\n\n if (relevantScenarios.length > 0) {\n lines.push(\"## Relevant Quality Scenarios\", \"\");\n for (const s of relevantScenarios) {\n lines.push(\n `### ${s.id}: ${s.name} [${s.category}] (${s.priority})`,\n \"\",\n `**Scenario:** ${s.scenario}`,\n `**Expected:** ${s.expected}`,\n \"\",\n );\n }\n }\n\n // 4. Active tasks in this block\n if (matchedBlock) {\n const tasks = db\n .prepare(\n \"SELECT id, title, status, building_block FROM tasks WHERE building_block = ? AND status IN ('todo', 'in-progress')\",\n )\n .all(matchedBlock.id) as TaskRow[];\n\n if (tasks.length > 0) {\n lines.push(\"## Active Tasks in This Block\", \"\");\n for (const t of tasks) {\n lines.push(`- [${t.status}] ${t.id}: ${t.title}`);\n }\n lines.push(\"\");\n }\n }\n\n // 5. Relevant ADRs\n const adrRows = db\n .prepare(\"SELECT id, title, status, decision, affected_blocks, affected_files FROM adrs\")\n .all() as Array<{ id: string; title: string; status: string; decision: string; affected_blocks: string; affected_files: string }>;\n\n const relevantAdrs = adrRows.filter((adr) => {\n if (params.file_path) {\n const affectedFiles = safeParseJson<string[]>(adr.affected_files, []);\n if (affectedFiles.some((f) => params.file_path!.includes(f) || f.includes(params.file_path!))) return true;\n }\n if (matchedBlock) {\n const affectedBlocks = safeParseJson<string[]>(adr.affected_blocks, []);\n if (affectedBlocks.includes(matchedBlock.id)) return true;\n }\n return false;\n });\n\n if (relevantAdrs.length > 0) {\n lines.push(\"## Relevant ADRs\", \"\");\n for (const adr of relevantAdrs) {\n lines.push(`### ${adr.id}: ${adr.title} [${adr.status}]`, \"\");\n lines.push(`**Decision:** ${adr.decision}`, \"\");\n }\n }\n\n // 6. Unresolved drift in this area\n const driftEntries = params.file_path\n ? (db\n .prepare(\n \"SELECT kind, description FROM drift_log WHERE resolution IS NULL AND (affected_file = ? OR affected_block = ?)\",\n )\n .all(params.file_path, matchedBlock?.id ?? \"\") as DriftRow[])\n : (db\n .prepare(\n \"SELECT kind, description FROM drift_log WHERE resolution IS NULL LIMIT 5\",\n )\n .all() as DriftRow[]);\n\n if (driftEntries.length > 0) {\n lines.push(\"## Unresolved Drift\", \"\");\n for (const d of driftEntries) {\n lines.push(`- [${d.kind}] ${d.description}`);\n }\n lines.push(\"\");\n }\n\n // 6. Action-specific guidance\n const actionGuidance = getActionGuidance(params.action);\n if (actionGuidance) {\n lines.push(\"## Guidance\", \"\", actionGuidance, \"\");\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n\nfunction filterRelevantScenarios(\n scenarios: ScenarioRow[],\n action: string,\n _blockId: string | null,\n): ScenarioRow[] {\n const categoryMap: Record<string, string[]> = {\n \"adding-component\": [\"accessibility\", \"performance\", \"maintainability\"],\n \"adding-api-route\": [\"security\", \"performance\", \"reliability\"],\n \"adding-hook\": [\"maintainability\", \"performance\"],\n \"modifying-auth\": [\"security\", \"reliability\"],\n \"new-dependency\": [\"maintainability\", \"performance\", \"security\"],\n \"refactoring\": [\"maintainability\", \"reliability\"],\n \"general\": [],\n };\n\n const relevantCategories = categoryMap[action] ?? [];\n\n if (relevantCategories.length === 0) {\n // For \"general\", return must-have scenarios only\n return scenarios.filter((s) => s.priority === \"must\");\n }\n\n return scenarios.filter((s) => relevantCategories.includes(s.category));\n}\n\nfunction getActionGuidance(action: string): string | null {\n const guidance: Record<string, string> = {\n \"adding-component\":\n \"- Follow existing component patterns in this directory\\n- Add props interface alongside the component\\n- Consider server vs. client: does this need interactivity (`'use client'`)?\\n- Check accessibility: keyboard navigation, ARIA labels, screen reader support\\n- **Arc42:** If this introduces a new UI pattern, document it in `08-crosscutting.md`\",\n \"adding-api-route\":\n \"- Ensure authentication middleware covers this route\\n- Validate all input with zod or equivalent\\n- Follow existing error response patterns\\n- Consider rate limiting for public endpoints\\n- If this introduces a new API pattern or convention, document it in an ADR\\n- **Arc42:** Update `03-context.md` if this route exposes a new external integration; update `06-runtime-views.md` if it's a key workflow\",\n \"adding-hook\":\n \"- Follow the `use` prefix convention\\n- Keep hooks focused — one responsibility per hook\\n- Consider memoization for expensive computations\\n- Document the hook's return type\",\n \"modifying-auth\":\n \"- Check all API routes still have auth coverage after changes\\n- Verify no secrets leak to client components\\n- Test edge cases: expired tokens, revoked sessions, role changes\\n- Update security quality scenarios if behavior changes\\n- Document the auth strategy and any changes in an ADR — auth decisions are critical to trace\\n- **Arc42:** Update `08-crosscutting.md` with the auth pattern; update `06-runtime-views.md` with the auth flow\",\n \"new-dependency\":\n \"- Document the dependency rationale in an ADR\\n- Check bundle size impact (client-side deps)\\n- Verify the dependency doesn't introduce known CVEs\\n- Ensure the dependency's license is compatible\\n- **Arc42:** If this dependency introduces a new external system, update `03-context.md`\",\n \"refactoring\":\n \"- Ensure no cross-block boundary violations are introduced\\n- Maintain existing public API contracts\\n- Run tests before and after to verify behavior preservation\\n- Check that no quality scenarios regress\\n- If the refactoring changes architectural patterns, update or create an ADR to explain why\\n- **Arc42:** Update `05-building-blocks.md` if module structure changed; update `08-crosscutting.md` if patterns changed\",\n \"general\":\n \"- Check `arcbridge_get_relevant_adrs` for existing decisions that may constrain this change\\n- If you're choosing between approaches, document the decision in an ADR\\n- **Arc42:** Consider which documentation sections may need updating (check `.arcbridge/arc42/` — especially `05-building-blocks.md` and `08-crosscutting.md`)\",\n };\n\n return guidance[action] ?? null;\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson } from \"../helpers.js\";\n\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n status: string;\n priority: string;\n linked_tests: string;\n linked_code: string;\n}\n\ninterface BlockRow {\n id: string;\n name: string;\n code_paths: string;\n description: string | null;\n}\n\ninterface DriftRow {\n kind: string;\n severity: string;\n description: string;\n}\n\ninterface PhaseRow {\n id: string;\n name: string;\n status: string;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n acceptance_criteria: string;\n}\n\nexport function registerGetOpenQuestions(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_open_questions\",\n \"Surface architectural gaps: untested quality scenarios, building blocks without boundaries, unresolved drift, and tasks missing acceptance criteria.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n scope: z\n .string()\n .optional()\n .describe(\"Focus scope: 'current-phase', 'building-block:<id>', or omit for project-wide\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const lines: string[] = [\"# Open Questions & Gaps\", \"\"];\n let totalGaps = 0;\n\n // 1. Untested or failing quality scenarios\n const scenarios = db\n .prepare(\n \"SELECT id, name, category, status, priority, linked_tests, linked_code FROM quality_scenarios ORDER BY priority, category\",\n )\n .all() as ScenarioRow[];\n\n const untestedMust = scenarios.filter(\n (s) => s.priority === \"must\" && (s.status === \"untested\" || s.status === \"failing\"),\n );\n const untestedShould = scenarios.filter(\n (s) => s.priority === \"should\" && (s.status === \"untested\" || s.status === \"failing\"),\n );\n const unlinked = scenarios.filter((s) => {\n const tests = safeParseJson<string[]>(s.linked_tests, []);\n return tests.length === 0;\n });\n\n if (untestedMust.length > 0) {\n lines.push(\"## Critical: Untested/Failing Must-Have Scenarios\", \"\");\n for (const s of untestedMust) {\n lines.push(`- **${s.id}: ${s.name}** [${s.category}] — ${s.status}`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n if (untestedShould.length > 0) {\n lines.push(\"## Untested/Failing Should-Have Scenarios\", \"\");\n for (const s of untestedShould) {\n lines.push(`- ${s.id}: ${s.name} [${s.category}] — ${s.status}`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n if (unlinked.length > 0) {\n lines.push(\"## Scenarios Without Linked Tests\", \"\");\n for (const s of unlinked) {\n lines.push(`- ${s.id}: ${s.name} [${s.category}] (${s.priority})`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n // 2. Building blocks without code or with empty descriptions\n const blocks = db\n .prepare(\"SELECT id, name, code_paths, description FROM building_blocks\")\n .all() as BlockRow[];\n\n const emptyBlocks = blocks.filter((b) => {\n const paths = safeParseJson<string[]>(b.code_paths, []);\n return paths.length === 0;\n });\n\n const undescribed = blocks.filter(\n (b) => !b.description || b.description.trim().length === 0,\n );\n\n if (emptyBlocks.length > 0) {\n lines.push(\"## Building Blocks Without Code Paths\", \"\");\n for (const b of emptyBlocks) {\n lines.push(`- **${b.name}** (\\`${b.id}\\`) — no code_paths defined`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n if (undescribed.length > 0) {\n lines.push(\"## Building Blocks Without Descriptions\", \"\");\n for (const b of undescribed) {\n lines.push(`- **${b.name}** (\\`${b.id}\\`)`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n // 3. Unresolved drift\n const drift = db\n .prepare(\n \"SELECT kind, severity, description FROM drift_log WHERE resolution IS NULL ORDER BY severity DESC\",\n )\n .all() as DriftRow[];\n\n if (drift.length > 0) {\n lines.push(\"## Unresolved Architecture Drift\", \"\");\n for (const d of drift) {\n lines.push(`- [${d.severity.toUpperCase()}] ${d.description}`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n // 4. Phase-specific: tasks without clear acceptance criteria\n let phaseTasks: TaskRow[] = [];\n if (params.scope === \"current-phase\" || !params.scope) {\n const currentPhase = db\n .prepare(\"SELECT id, name, status FROM phases WHERE status = 'in-progress' LIMIT 1\")\n .get() as PhaseRow | undefined;\n\n if (currentPhase) {\n phaseTasks = db\n .prepare(\"SELECT id, title, status, acceptance_criteria FROM tasks WHERE phase_id = ?\")\n .all(currentPhase.id) as TaskRow[];\n }\n }\n\n const tasksWithoutCriteria = phaseTasks.filter((t) => {\n const criteria = safeParseJson<string[]>(t.acceptance_criteria, []);\n return criteria.length === 0 && t.status !== \"done\";\n });\n\n if (tasksWithoutCriteria.length > 0) {\n lines.push(\"## Tasks Without Acceptance Criteria\", \"\");\n for (const t of tasksWithoutCriteria) {\n lines.push(`- ${t.id}: ${t.title} (${t.status})`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n // Summary\n if (totalGaps === 0) {\n return textResult(\n \"# Open Questions & Gaps\\n\\nNo significant architectural gaps found. Quality scenarios are linked, building blocks are defined, and no drift is unresolved.\",\n );\n }\n\n lines[0] = `# Open Questions & Gaps (${totalGaps} items)`;\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n resolveRef,\n getChangedFiles,\n getHeadSha,\n setSyncCommit,\n type ChangedFile,\n} from \"@arcbridge/core\";\nimport type Database from \"better-sqlite3\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson, normalizeCodePath } from \"../helpers.js\";\n\ninterface BlockRow {\n id: string;\n name: string;\n code_paths: string;\n interfaces: string;\n description: string | null;\n}\n\ninterface SymbolRow {\n name: string;\n kind: string;\n file_path: string;\n is_exported: number;\n}\n\nexport function registerProposeArc42Update(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_propose_arc42_update\",\n \"Analyze code changes since a reference point and generate specific, actionable proposals for updating arc42 documentation.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n changes_since: z\n .string()\n .default(\"last-sync\")\n .describe(\"Reference point: 'last-commit', 'last-sync', 'last-phase', or a git ref\"),\n update_sync_point: z\n .boolean()\n .default(false)\n .describe(\"Update the stored sync commit to HEAD after generating proposals\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const projectRoot = ctx.projectRoot ?? params.target_dir;\n const ref = resolveRef(projectRoot, params.changes_since, db);\n const changedFiles = getChangedFiles(projectRoot, ref.sha);\n\n if (changedFiles.length === 0) {\n return textResult(\n `# Arc42 Update Proposals\\n\\nNo code changes detected since ${ref.label}. Documentation is up to date.`,\n );\n }\n\n const blocks = db\n .prepare(\"SELECT id, name, code_paths, interfaces, description FROM building_blocks\")\n .all() as BlockRow[];\n\n const proposals = generateProposals(db, blocks, changedFiles, projectRoot);\n\n const lines: string[] = [\n `# Arc42 Update Proposals`,\n \"\",\n `**Changes since:** ${ref.label}`,\n `**Files changed:** ${changedFiles.length}`,\n `**Proposals:** ${proposals.length}`,\n \"\",\n ];\n\n if (proposals.length === 0) {\n lines.push(\n \"No documentation updates needed — all changes are within documented building blocks and don't introduce new patterns.\",\n );\n } else {\n // Group proposals by target section\n const bySection = new Map<string, Proposal[]>();\n for (const p of proposals) {\n const existing = bySection.get(p.section) ?? [];\n existing.push(p);\n bySection.set(p.section, existing);\n }\n\n for (const [section, items] of bySection) {\n lines.push(`## ${section}`, \"\");\n for (const item of items) {\n lines.push(`### ${item.title}`, \"\");\n lines.push(item.description, \"\");\n if (item.suggestedChange) {\n lines.push(\"**Suggested change:**\", \"\", item.suggestedChange, \"\");\n }\n }\n }\n }\n\n // Update sync point if requested\n if (params.update_sync_point) {\n const headSha = getHeadSha(projectRoot);\n if (headSha) {\n setSyncCommit(db, \"last_sync_commit\", headSha);\n lines.push(\"---\", `*Sync point updated to ${headSha.slice(0, 7)}.*`, \"\");\n }\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n\ninterface Proposal {\n section: string;\n title: string;\n description: string;\n suggestedChange: string | null;\n}\n\nfunction generateProposals(\n db: Database.Database,\n blocks: BlockRow[],\n changedFiles: ChangedFile[],\n _projectRoot: string,\n): Proposal[] {\n const proposals: Proposal[] = [];\n\n // Build file → block mapping\n const fileToBlock = new Map<string, BlockRow>();\n const unmappedFiles: ChangedFile[] = [];\n\n for (const cf of changedFiles) {\n if (cf.status === \"deleted\") continue;\n let matched = false;\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (cf.path.startsWith(prefix) || cf.path === prefix) {\n fileToBlock.set(cf.path, block);\n matched = true;\n break;\n }\n }\n if (matched) break;\n }\n if (!matched) {\n unmappedFiles.push(cf);\n }\n }\n\n // 1. New files not mapped to any building block\n if (unmappedFiles.length > 0) {\n // Group by directory to suggest block assignments\n const byDir = new Map<string, ChangedFile[]>();\n for (const f of unmappedFiles) {\n const dir = f.path.replace(/\\/[^/]+$/, \"/\");\n const existing = byDir.get(dir) ?? [];\n existing.push(f);\n byDir.set(dir, existing);\n }\n\n for (const [dir, files] of byDir) {\n const fileList = files.map((f) => `\\`${f.path}\\``).join(\", \");\n proposals.push({\n section: \"05 Building Block View\",\n title: `Unmapped files in \\`${dir}\\``,\n description: `${files.length} file(s) in \\`${dir}\\` are not covered by any building block: ${fileList}`,\n suggestedChange: `Add \\`${dir}\\` to an existing building block's \\`code_paths\\`, or create a new building block for this directory.`,\n });\n }\n }\n\n // 2. New exported symbols in changed files that could be interfaces\n const addedOrModified = changedFiles.filter(\n (f) => f.status === \"added\" || f.status === \"modified\",\n );\n\n for (const cf of addedOrModified) {\n const block = fileToBlock.get(cf.path);\n if (!block) continue;\n\n // Find new exported symbols in this file\n const symbols = db\n .prepare(\n \"SELECT name, kind, is_exported FROM symbols WHERE file_path = ? AND is_exported = 1\",\n )\n .all(cf.path) as SymbolRow[];\n\n if (symbols.length === 0) continue;\n\n // Check if there are cross-block consumers of these symbols\n for (const sym of symbols) {\n const consumers = findCrossBlockConsumers(\n db,\n `${cf.path}::${sym.name}#${sym.kind}`,\n block.id,\n blocks,\n );\n\n if (consumers.length > 0) {\n const consumerNames = consumers.map((c) => `\\`${c}\\``).join(\", \");\n proposals.push({\n section: \"05 Building Block View\",\n title: `New cross-block interface: \\`${sym.name}\\``,\n description: `Exported ${sym.kind} \\`${sym.name}\\` in block \\`${block.name}\\` is consumed by blocks: ${consumerNames}. This should be documented as an interface.`,\n suggestedChange: `Add \\`${sym.name}\\` to the interfaces section of building block \\`${block.id}\\` in \\`.arcbridge/arc42/05-building-blocks.md\\`.`,\n });\n }\n }\n }\n\n // 3. Deleted files that were in building blocks\n const deletedFiles = changedFiles.filter((f) => f.status === \"deleted\");\n for (const cf of deletedFiles) {\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (cf.path.startsWith(prefix)) {\n // Check if this was the only file under that code_path\n const remaining = db\n .prepare(\"SELECT 1 FROM symbols WHERE file_path LIKE ? LIMIT 1\")\n .get(`${prefix}%`) as unknown | undefined;\n\n if (!remaining) {\n proposals.push({\n section: \"05 Building Block View\",\n title: `Empty code path in \\`${block.name}\\``,\n description: `All files under \\`${cp}\\` in block \\`${block.name}\\` (${block.id}) have been deleted. The code_path no longer matches any code.`,\n suggestedChange: `Remove \\`${cp}\\` from building block \\`${block.id}\\`, or update it to reflect the new file structure.`,\n });\n }\n break;\n }\n }\n }\n }\n\n // 4. Check for new route files (might need architecture section updates)\n const routeFiles = addedOrModified.filter(\n (f) => f.path.includes(\"/app/\") && /\\/(page|layout|route)\\.(ts|tsx|js|jsx)$/.test(f.path),\n );\n\n if (routeFiles.length > 0) {\n const routeList = routeFiles.map((f) => `\\`${f.path}\\``).join(\", \");\n proposals.push({\n section: \"06 Runtime View\",\n title: \"New route files detected\",\n description: `${routeFiles.length} route file(s) were added or modified: ${routeList}. Consider updating the runtime view to reflect new user flows.`,\n suggestedChange: null,\n });\n }\n\n return proposals;\n}\n\n/**\n * Find building blocks that consume a symbol from a different block.\n */\nfunction findCrossBlockConsumers(\n db: Database.Database,\n symbolId: string,\n sourceBlockId: string,\n blocks: BlockRow[],\n): string[] {\n const consumers = db\n .prepare(\n `SELECT DISTINCT s.file_path\n FROM dependencies d\n JOIN symbols s ON d.source_symbol = s.id\n WHERE d.target_symbol = ?\n AND d.kind IN ('imports', 'calls', 'renders')`,\n )\n .all(symbolId) as { file_path: string }[];\n\n const consumerBlocks = new Set<string>();\n\n for (const { file_path } of consumers) {\n for (const block of blocks) {\n if (block.id === sourceBlockId) continue;\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (file_path.startsWith(prefix)) {\n consumerBlocks.add(block.name);\n break;\n }\n }\n }\n }\n\n return [...consumerBlocks];\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n resolveRef,\n getChangedFiles,\n detectDrift,\n type ChangedFile,\n} from \"@arcbridge/core\";\nimport type Database from \"better-sqlite3\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson, normalizeCodePath } from \"../helpers.js\";\n\ninterface BlockRow {\n id: string;\n name: string;\n code_paths: string;\n interfaces: string;\n}\n\ninterface RouteRow {\n route_path: string;\n kind: string;\n has_auth: number;\n}\n\n\nexport function registerGetPracticeReview(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_practice_review\",\n \"Structured, practice-aware review of recent code changes across 5 dimensions: Architecture, Security, Testing, Documentation, and Complexity.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n since: z\n .string()\n .default(\"last-commit\")\n .describe(\"Reference point: 'last-commit', 'last-session', or 'last-phase'\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const projectRoot = ctx.projectRoot ?? params.target_dir;\n const ref = resolveRef(projectRoot, params.since, db);\n const changedFiles = getChangedFiles(projectRoot, ref.sha);\n\n if (changedFiles.length === 0) {\n return textResult(\n `# Practice Review\\n\\nNo changes detected since ${ref.label}. Nothing to review.`,\n );\n }\n\n const lines: string[] = [\n \"# Practice Review\",\n \"\",\n `**Since:** ${ref.label}`,\n `**Files changed:** ${changedFiles.length}`,\n \"\",\n ];\n\n const findings: Finding[] = [];\n\n // Run all 5 dimensions\n reviewArchitecture(db, changedFiles, findings);\n reviewSecurity(db, changedFiles, findings);\n reviewTesting(db, changedFiles, findings);\n reviewDocumentation(db, changedFiles, findings);\n reviewComplexity(db, changedFiles, findings);\n\n if (findings.length === 0) {\n lines.push(\"All checks passed. No issues found across the 5 practice dimensions.\");\n return textResult(lines.join(\"\\n\"));\n }\n\n // Group by dimension\n const byDimension = new Map<string, Finding[]>();\n for (const f of findings) {\n const existing = byDimension.get(f.dimension) ?? [];\n existing.push(f);\n byDimension.set(f.dimension, existing);\n }\n\n const dimensionIcons: Record<string, string> = {\n Architecture: \"1\",\n Security: \"2\",\n Testing: \"3\",\n Documentation: \"4\",\n Complexity: \"5\",\n };\n\n // Summary\n const errors = findings.filter((f) => f.severity === \"error\").length;\n const warnings = findings.filter((f) => f.severity === \"warning\").length;\n const infos = findings.filter((f) => f.severity === \"info\").length;\n lines.push(\n `**${errors}** errors, **${warnings}** warnings, **${infos}** info`,\n \"\",\n );\n\n for (const dim of [\"Architecture\", \"Security\", \"Testing\", \"Documentation\", \"Complexity\"]) {\n const items = byDimension.get(dim);\n const num = dimensionIcons[dim] ?? \"?\";\n if (!items || items.length === 0) {\n lines.push(`## ${num}. ${dim} ✓`, \"\", `No issues found.`, \"\");\n continue;\n }\n\n lines.push(`## ${num}. ${dim} (${items.length} findings)`, \"\");\n for (const item of items) {\n const icon = item.severity === \"error\" ? \"ERROR\" : item.severity === \"warning\" ? \"WARN\" : \"INFO\";\n lines.push(`- [${icon}] ${item.description}`);\n if (item.action) {\n lines.push(` → **Action:** ${item.action}`);\n }\n }\n lines.push(\"\");\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n\ninterface Finding {\n dimension: string;\n severity: \"error\" | \"warning\" | \"info\";\n description: string;\n action: string | null;\n}\n\n// --- Dimension 1: Architecture ---\n\nfunction reviewArchitecture(\n db: Database.Database,\n changedFiles: ChangedFile[],\n findings: Finding[],\n): void {\n const blocks = db\n .prepare(\"SELECT id, name, code_paths, interfaces FROM building_blocks\")\n .all() as BlockRow[];\n\n if (blocks.length === 0) return;\n\n // Check for cross-boundary dependencies in changed files\n const changedPaths = new Set(\n changedFiles.filter((f) => f.status !== \"deleted\").map((f) => f.path),\n );\n\n // Map changed files to blocks\n const changedByBlock = new Map<string, string[]>();\n const unmapped: string[] = [];\n\n for (const path of changedPaths) {\n let matched = false;\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (path.startsWith(prefix)) {\n const existing = changedByBlock.get(block.id) ?? [];\n existing.push(path);\n changedByBlock.set(block.id, existing);\n matched = true;\n break;\n }\n }\n if (matched) break;\n }\n if (!matched) unmapped.push(path);\n }\n\n // Flag unmapped files\n if (unmapped.length > 0) {\n findings.push({\n dimension: \"Architecture\",\n severity: \"warning\",\n description: `${unmapped.length} changed file(s) not mapped to any building block: ${unmapped.slice(0, 3).map((f) => `\\`${f}\\``).join(\", \")}${unmapped.length > 3 ? ` and ${unmapped.length - 3} more` : \"\"}`,\n action: \"Map these files to building blocks in `.arcbridge/arc42/05-building-blocks.md`\",\n });\n }\n\n // Check cross-block deps from changed files\n for (const [blockId, files] of changedByBlock) {\n const block = blocks.find((b) => b.id === blockId);\n if (!block) continue;\n\n const declaredInterfaces = new Set(safeParseJson<string[]>(block.interfaces, []));\n\n for (const filePath of files) {\n // Find outgoing deps from this file to other blocks\n const outgoing = db\n .prepare(\n `SELECT DISTINCT st.file_path as target_file\n FROM dependencies d\n JOIN symbols ss ON d.source_symbol = ss.id\n JOIN symbols st ON d.target_symbol = st.id\n WHERE ss.file_path = ?\n AND d.kind IN ('imports', 'calls', 'renders')`,\n )\n .all(filePath) as { target_file: string }[];\n\n for (const { target_file } of outgoing) {\n // Find which block the target belongs to\n for (const targetBlock of blocks) {\n if (targetBlock.id === blockId) continue;\n const tPaths = safeParseJson<string[]>(targetBlock.code_paths, []);\n for (const cp of tPaths) {\n const prefix = normalizeCodePath(cp);\n if (target_file.startsWith(prefix) && !declaredInterfaces.has(targetBlock.id)) {\n findings.push({\n dimension: \"Architecture\",\n severity: \"error\",\n description: `\\`${filePath}\\` in block \\`${block.name}\\` depends on block \\`${targetBlock.name}\\` without declaring it as an interface.`,\n action: `Add \\`${targetBlock.id}\\` to the interfaces of block \\`${blockId}\\``,\n });\n break;\n }\n }\n }\n }\n }\n }\n}\n\n// --- Dimension 2: Security ---\n\nfunction reviewSecurity(\n db: Database.Database,\n changedFiles: ChangedFile[],\n findings: Finding[],\n): void {\n const changedPaths = changedFiles\n .filter((f) => f.status !== \"deleted\")\n .map((f) => f.path);\n\n // Check for new API routes without auth\n const routeFiles = changedPaths.filter(\n (p) => /\\/(route)\\.(ts|tsx|js|jsx)$/.test(p),\n );\n\n for (const routePath of routeFiles) {\n // Extract the route path from file path\n const appMatch = routePath.match(/app\\/(.+)\\/route\\./);\n if (!appMatch) continue;\n\n const urlPath = \"/\" + appMatch[1]\n .replace(/\\([^)]+\\)\\//g, \"\")\n .replace(/\\[\\.{3}(\\w+)\\]/g, \"*$1\")\n .replace(/\\[(\\w+)\\]/g, \":$1\");\n\n const route = db\n .prepare(\"SELECT route_path, has_auth FROM routes WHERE route_path = ? AND kind = 'api-route'\")\n .get(urlPath) as RouteRow | undefined;\n\n if (route && !route.has_auth) {\n findings.push({\n dimension: \"Security\",\n severity: \"warning\",\n description: `API route \\`${route.route_path}\\` does not have auth middleware detected.`,\n action: \"Verify this route has authentication. Add auth middleware or mark as intentionally public.\",\n });\n }\n }\n\n // Check for env/secret files in changes\n const sensitivePatterns = [/\\.env/, /secrets?\\./, /credentials/, /\\.pem$/, /\\.key$/];\n for (const path of changedPaths) {\n if (sensitivePatterns.some((p) => p.test(path))) {\n findings.push({\n dimension: \"Security\",\n severity: \"error\",\n description: `Potentially sensitive file changed: \\`${path}\\``,\n action: \"Ensure this file is in .gitignore and not committed to version control.\",\n });\n }\n }\n\n // Check for client components importing server-only patterns\n const clientFiles = changedPaths.filter((p) => p.endsWith(\".tsx\") || p.endsWith(\".ts\"));\n for (const filePath of clientFiles) {\n const comp = db\n .prepare(\n `SELECT s.name, c.is_client\n FROM components c\n JOIN symbols s ON c.symbol_id = s.id\n WHERE s.file_path = ? AND c.is_client = 1`,\n )\n .all(filePath) as { name: string; is_client: number }[];\n\n if (comp.length === 0) continue;\n\n // Check if client component imports from server-action files\n const serverImports = db\n .prepare(\n `SELECT DISTINCT st.file_path\n FROM dependencies d\n JOIN symbols ss ON d.source_symbol = ss.id\n JOIN symbols st ON d.target_symbol = st.id\n JOIN components ct ON d.target_symbol = ct.symbol_id\n WHERE ss.file_path = ?\n AND ct.is_server_action = 1\n AND d.kind = 'imports'`,\n )\n .all(filePath) as { file_path: string }[];\n\n for (const imp of serverImports) {\n findings.push({\n dimension: \"Security\",\n severity: \"warning\",\n description: `Client component in \\`${filePath}\\` imports from server action file \\`${imp.file_path}\\`. Verify no server secrets are exposed.`,\n action: null,\n });\n }\n }\n}\n\n// --- Dimension 3: Testing ---\n\nfunction reviewTesting(\n db: Database.Database,\n changedFiles: ChangedFile[],\n findings: Finding[],\n): void {\n const changedPaths = changedFiles\n .filter((f) => f.status !== \"deleted\")\n .map((f) => f.path);\n\n const testFilePattern = /\\.(test|spec)\\.(ts|tsx|js|jsx)$/;\n const codeFiles = changedPaths.filter((p) => !testFilePattern.test(p) && /\\.(ts|tsx|js|jsx)$/.test(p));\n const testFiles = changedPaths.filter((p) => testFilePattern.test(p));\n\n // Code files changed without corresponding test files\n if (codeFiles.length > 0 && testFiles.length === 0) {\n findings.push({\n dimension: \"Testing\",\n severity: \"info\",\n description: `${codeFiles.length} code file(s) changed but no test files were modified.`,\n action: \"Consider whether existing tests still cover the changed behavior.\",\n });\n }\n\n // Check quality scenarios at risk\n const scenarios = db\n .prepare(\n \"SELECT id, name, linked_code, linked_blocks, status FROM quality_scenarios WHERE priority IN ('must', 'should')\",\n )\n .all() as { id: string; name: string; linked_code: string; linked_blocks: string; status: string }[];\n\n for (const scenario of scenarios) {\n const linkedCode = safeParseJson<string[]>(scenario.linked_code, []);\n const linkedBlocks = safeParseJson<string[]>(scenario.linked_blocks, []);\n\n // Check if changed files overlap with linked code\n const affectedByCode = linkedCode.some((lc) =>\n changedPaths.some((cp) => cp.startsWith(lc) || cp === lc),\n );\n\n // Check if changed files are in linked building blocks\n let affectedByBlock = false;\n if (linkedBlocks.length > 0) {\n const blocks = db\n .prepare(\"SELECT id, code_paths FROM building_blocks\")\n .all() as { id: string; code_paths: string }[];\n\n for (const blockId of linkedBlocks) {\n const block = blocks.find((b) => b.id === blockId);\n if (!block) continue;\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (changedPaths.some((p) => p.startsWith(prefix))) {\n affectedByBlock = true;\n break;\n }\n }\n if (affectedByBlock) break;\n }\n }\n\n if (affectedByCode || affectedByBlock) {\n const severity = scenario.status === \"passing\" ? \"warning\" : \"error\";\n findings.push({\n dimension: \"Testing\",\n severity,\n description: `Quality scenario \\`${scenario.id}: ${scenario.name}\\` may be affected by these changes (status: ${scenario.status}).`,\n action: \"Re-run tests for this quality scenario to verify it still passes.\",\n });\n }\n }\n}\n\n// --- Dimension 4: Documentation ---\n\nfunction reviewDocumentation(\n db: Database.Database,\n changedFiles: ChangedFile[],\n findings: Finding[],\n): void {\n // Run drift detection and report any issues\n const driftEntries = detectDrift(db);\n\n if (driftEntries.length > 0) {\n const errors = driftEntries.filter((d) => d.severity === \"error\");\n const warnings = driftEntries.filter((d) => d.severity === \"warning\");\n\n if (errors.length > 0) {\n findings.push({\n dimension: \"Documentation\",\n severity: \"error\",\n description: `${errors.length} architecture drift error(s) detected (dependency violations, etc.).`,\n action: \"Run `arcbridge_check_drift` for details and resolve violations.\",\n });\n }\n\n if (warnings.length > 0) {\n findings.push({\n dimension: \"Documentation\",\n severity: \"warning\",\n description: `${warnings.length} documentation gap(s) found (undocumented modules, missing code paths, etc.).`,\n action: \"Run `arcbridge_propose_arc42_update` to generate update proposals.\",\n });\n }\n }\n\n // Check if arc42 files were changed\n const arc42Changes = changedFiles.filter((f) =>\n f.path.includes(\".arcbridge/arc42/\"),\n );\n if (arc42Changes.length > 0) {\n findings.push({\n dimension: \"Documentation\",\n severity: \"info\",\n description: `${arc42Changes.length} arc42 documentation file(s) were updated.`,\n action: \"Run `arcbridge_reindex` to ensure the database reflects documentation changes.\",\n });\n }\n}\n\n// --- Dimension 5: Complexity ---\n\nfunction reviewComplexity(\n db: Database.Database,\n changedFiles: ChangedFile[],\n findings: Finding[],\n): void {\n const changedPaths = changedFiles\n .filter((f) => f.status !== \"deleted\")\n .map((f) => f.path);\n\n for (const filePath of changedPaths) {\n if (!/\\.(ts|tsx|js|jsx)$/.test(filePath)) continue;\n\n // Count symbols per file as a rough complexity proxy\n const symbolCount = (\n db\n .prepare(\"SELECT COUNT(*) as count FROM symbols WHERE file_path = ?\")\n .get(filePath) as { count: number }\n ).count;\n\n if (symbolCount > 30) {\n findings.push({\n dimension: \"Complexity\",\n severity: \"warning\",\n description: `\\`${filePath}\\` has ${symbolCount} symbols — consider splitting into smaller modules.`,\n action: null,\n });\n }\n\n // Count outgoing dependencies as coupling metric\n const depCount = (\n db\n .prepare(\n `SELECT COUNT(DISTINCT d.target_symbol) as count\n FROM dependencies d\n JOIN symbols s ON d.source_symbol = s.id\n WHERE s.file_path = ?`,\n )\n .get(filePath) as { count: number }\n ).count;\n\n if (depCount > 20) {\n findings.push({\n dimension: \"Complexity\",\n severity: \"warning\",\n description: `\\`${filePath}\\` has ${depCount} outgoing dependencies — high coupling detected.`,\n action: \"Consider reducing dependencies or introducing an abstraction layer.\",\n });\n }\n }\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n detectDrift,\n writeDriftLog,\n getHeadSha,\n setSyncCommit,\n inferTaskStatuses,\n applyInferences,\n verifyScenarios,\n loadConfig,\n refreshFromDocs,\n syncPhaseToYaml,\n} from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\n\ninterface PhaseRow {\n id: string;\n name: string;\n phase_number: number;\n status: string;\n gate_status: string;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n}\n\ninterface ScenarioRow {\n id: string;\n name: string;\n status: string;\n priority: string;\n}\n\nexport function registerCompletePhase(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_complete_phase\",\n \"Attempt to complete a phase by validating all gates: tasks done, no critical drift, quality scenarios passing. Transitions the phase to 'complete' if all gates pass.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n phase_id: z\n .string()\n .optional()\n .describe(\"Phase ID to complete (defaults to current in-progress phase)\"),\n notes: z\n .string()\n .optional()\n .describe(\"Optional notes about this phase completion\"),\n auto_infer: z\n .boolean()\n .default(true)\n .describe(\"Automatically infer task statuses from code state before checking gates\"),\n run_tests: z\n .boolean()\n .default(false)\n .describe(\"Run linked tests for quality scenarios before checking the quality gate\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Refresh DB from docs to pick up any YAML edits (new tasks, phase changes, etc.)\n refreshFromDocs(db, params.target_dir);\n\n // Find the target phase\n let phase: PhaseRow | undefined;\n if (params.phase_id) {\n phase = db\n .prepare(\"SELECT id, name, phase_number, status, gate_status FROM phases WHERE id = ?\")\n .get(params.phase_id) as PhaseRow | undefined;\n } else {\n phase = db\n .prepare(\n \"SELECT id, name, phase_number, status, gate_status FROM phases WHERE status = 'in-progress' LIMIT 1\",\n )\n .get() as PhaseRow | undefined;\n }\n\n if (!phase) {\n return textResult(\n \"No in-progress phase found. Use `arcbridge_get_phase_plan` to see all phases.\",\n );\n }\n\n if (phase.status === \"complete\") {\n return textResult(`Phase \\`${phase.name}\\` is already complete.`);\n }\n\n const lines: string[] = [\n `# Phase Completion: ${phase.name}`,\n \"\",\n ];\n\n // Step 1: Auto-infer task statuses\n if (params.auto_infer) {\n const inferences = inferTaskStatuses(db, phase.id);\n if (inferences.length > 0) {\n applyInferences(db, inferences, ctx.projectRoot ?? params.target_dir);\n lines.push(\"## Task Status Inference\", \"\");\n for (const inf of inferences) {\n lines.push(\n `- **${inf.taskId}**: ${inf.previousStatus} → **${inf.inferredStatus}** (${inf.reason})`,\n );\n }\n lines.push(\"\");\n }\n }\n\n // Step 2: Check gate — all tasks done\n const tasks = db\n .prepare(\"SELECT id, title, status FROM tasks WHERE phase_id = ?\")\n .all(phase.id) as TaskRow[];\n\n const incompleteTasks = tasks.filter((t) => t.status !== \"done\");\n const tasksPass = incompleteTasks.length === 0;\n\n // Step 3: Check gate — drift\n const driftEntries = detectDrift(db);\n writeDriftLog(db, driftEntries);\n const criticalDrift = driftEntries.filter((d) => d.severity === \"error\");\n const driftPass = criticalDrift.length === 0;\n\n // Step 4: Optionally run tests to update scenario statuses\n if (params.run_tests) {\n const projectRoot = ctx.projectRoot ?? params.target_dir;\n let testCommand = \"npx vitest run\";\n let timeoutMs = 60000;\n\n const configResult = loadConfig(params.target_dir);\n if (configResult.config) {\n testCommand = configResult.config.testing.test_command;\n timeoutMs = configResult.config.testing.timeout_ms;\n }\n\n const verifyResult = verifyScenarios(db, projectRoot, {\n testCommand,\n timeoutMs,\n });\n\n if (verifyResult.results.length > 0) {\n lines.push(\"## Test Verification\", \"\");\n for (const r of verifyResult.results) {\n const icon = r.passed ? \"PASS\" : \"FAIL\";\n lines.push(\n `- [${icon}] **${r.scenarioId}: ${r.scenarioName}** (${r.durationMs}ms)`,\n );\n }\n lines.push(\"\");\n }\n }\n\n // Step 5: Check gate — quality scenarios\n const mustScenarios = db\n .prepare(\n \"SELECT id, name, status, priority FROM quality_scenarios WHERE priority = 'must'\",\n )\n .all() as ScenarioRow[];\n\n const failingMust = mustScenarios.filter(\n (s) => s.status === \"failing\",\n );\n const qualityPass = failingMust.length === 0;\n\n // Build gate results\n const gates = [\n { name: \"All tasks complete\", pass: tasksPass },\n { name: \"No critical drift\", pass: driftPass },\n { name: \"Must-have quality scenarios not failing\", pass: qualityPass },\n ];\n\n const allPass = gates.every((g) => g.pass);\n\n lines.push(\"## Gate Results\", \"\");\n for (const gate of gates) {\n const icon = gate.pass ? \"PASS\" : \"FAIL\";\n lines.push(`- [${icon}] ${gate.name}`);\n }\n lines.push(\"\");\n\n // Show details for failures\n if (!tasksPass) {\n lines.push(\"### Incomplete Tasks\", \"\");\n for (const t of incompleteTasks) {\n const icon =\n t.status === \"in-progress\"\n ? \"[>]\"\n : t.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n lines.push(`- ${icon} ${t.id}: ${t.title} (${t.status})`);\n }\n lines.push(\"\");\n }\n\n if (!driftPass) {\n lines.push(\"### Critical Drift\", \"\");\n for (const d of criticalDrift) {\n lines.push(`- [ERROR] ${d.description}`);\n }\n lines.push(\"\");\n }\n\n if (!qualityPass) {\n lines.push(\"### Failing Must-Have Scenarios\", \"\");\n for (const s of failingMust) {\n lines.push(`- **${s.id}: ${s.name}** — ${s.status}`);\n }\n lines.push(\"\");\n }\n\n // Check for ADR coverage — advisory, not a gate blocker\n const adrCount = (db\n .prepare(\"SELECT COUNT(*) as count FROM adrs\")\n .get() as { count: number }).count;\n\n // Check if any tasks in this phase involved architectural decisions\n // (auth, database, middleware, DI — things that typically warrant ADRs)\n const architecturalKeywords = [\"auth\", \"database\", \"middleware\", \"validation\", \"caching\", \"dependency injection\", \"error handling\"];\n const phaseTasks = tasks.map((t) => t.title.toLowerCase());\n const hasArchitecturalWork = phaseTasks.some((title) =>\n architecturalKeywords.some((kw) => title.includes(kw)),\n );\n\n if (hasArchitecturalWork && adrCount <= 1) {\n lines.push(\n \"## ADR Reminder\",\n \"\",\n \"This phase involved architectural decisions that should be documented as ADRs.\",\n \"Use `arcbridge_get_relevant_adrs` to review existing ADRs and create new ones in `.arcbridge/arc42/09-decisions/` for:\",\n \"\",\n );\n for (const t of tasks) {\n const lower = t.title.toLowerCase();\n if (architecturalKeywords.some((kw) => lower.includes(kw))) {\n lines.push(`- **${t.title}** — document the chosen approach and alternatives considered`);\n }\n }\n lines.push(\"\");\n }\n\n if (allPass) {\n const now = new Date().toISOString();\n const gateStatus = JSON.stringify({\n tasks: \"pass\",\n drift: \"pass\",\n quality: \"pass\",\n completed_at: now,\n notes: params.notes ?? null,\n });\n\n // Find next phase before transaction\n const nextPhase = db\n .prepare(\n \"SELECT id, name FROM phases WHERE phase_number = ? AND status = 'planned'\",\n )\n .get(phase.phase_number + 1) as { id: string; name: string } | undefined;\n\n // Transition atomically\n const transition = db.transaction(() => {\n db.prepare(\n \"UPDATE phases SET status = 'complete', completed_at = ?, gate_status = ? WHERE id = ?\",\n ).run(now, gateStatus, phase.id);\n\n if (nextPhase) {\n db.prepare(\n \"UPDATE phases SET status = 'in-progress', started_at = ? WHERE id = ?\",\n ).run(now, nextPhase.id);\n }\n });\n transition();\n\n // Write back to YAML\n const projectRoot = ctx.projectRoot ?? params.target_dir;\n syncPhaseToYaml(projectRoot, phase.id, \"complete\", undefined, now);\n if (nextPhase) {\n syncPhaseToYaml(projectRoot, nextPhase.id, \"in-progress\", now);\n }\n\n // Store phase sync commit (non-critical, outside transaction)\n const headSha = getHeadSha(projectRoot);\n if (headSha) {\n setSyncCommit(db, \"phase_sync_commit\", headSha);\n }\n\n lines.push(\"## Result: PASS\", \"\");\n lines.push(`Phase \\`${phase.name}\\` is now **complete**.`);\n\n if (!headSha) {\n lines.push(\"\", \"*Warning: Could not determine git HEAD — sync point not stored.*\");\n }\n\n if (params.notes) {\n lines.push(\"\", `**Notes:** ${params.notes}`);\n }\n\n if (nextPhase) {\n lines.push(\"\", `Next phase **${nextPhase.name}** is now in-progress.`);\n }\n\n lines.push(\n \"\",\n \"---\",\n \"## Arc42 Documentation Review\",\n \"\",\n \"Before moving on, review and update these arc42 sections for changes made in this phase:\",\n \"\",\n \"- [ ] **01 Introduction** — Do project goals still reflect reality?\",\n \"- [ ] **03 Context** — Any new external systems or integrations added?\",\n \"- [ ] **05 Building Blocks** — Are all new modules mapped? Run `arcbridge_check_drift` to verify.\",\n \"- [ ] **06 Runtime Views** — Any new key workflows to document (auth flow, data processing, etc.)?\",\n \"- [ ] **07 Deployment** — Any changes to infrastructure, environments, or deployment strategy?\",\n \"- [ ] **08 Crosscutting Concepts** — Any new patterns established (error handling, validation, logging)?\",\n \"- [ ] **09 Decisions** — ADRs for all significant choices? Run `arcbridge_get_relevant_adrs` to check.\",\n \"- [ ] **10 Quality Scenarios** — Any new quality requirements or changed thresholds?\",\n \"- [ ] **11 Risks & Debt** — Any known limitations or tech debt introduced?\",\n \"\",\n \"*Run `arcbridge_propose_arc42_update` to auto-detect documentation gaps.*\",\n );\n } else {\n const failCount = gates.filter((g) => !g.pass).length;\n lines.push(\n `## Result: BLOCKED (${failCount} gate${failCount > 1 ? \"s\" : \"\"} failed)`,\n \"\",\n \"Resolve the issues above before completing this phase.\",\n );\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\nimport { loadRole, loadRoles } from \"@arcbridge/core\";\n\ninterface BlockRow {\n id: string;\n name: string;\n responsibility: string;\n}\n\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n priority: string;\n status: string;\n}\n\ninterface PhaseRow {\n id: string;\n name: string;\n status: string;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n}\n\nexport function registerActivateRole(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_activate_role\",\n \"Activate an agent role: loads the role's system prompt, required tools, quality focus, and pre-loaded architectural context.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n role: z\n .string()\n .describe(\n \"Role ID to activate (e.g., 'architect', 'implementer', 'security-reviewer')\",\n ),\n building_block: z\n .string()\n .optional()\n .describe(\"Focus on a specific building block (for implementer/code-reviewer roles)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const lines: string[] = [];\n\n // Try loading role from .arcbridge/agents/ files first, fall back to built-in definitions\n const fileResult = loadRole(params.target_dir, params.role);\n const role = fileResult.role ?? null;\n const roleDef = role\n ? {\n name: role.name,\n description: role.description,\n requiredTools: role.required_tools,\n deniedTools: role.denied_tools,\n readOnly: role.read_only,\n qualityFocus: role.quality_focus,\n systemPrompt: role.system_prompt,\n modelPreferences: role.model_preferences,\n }\n : getRoleDefinition(params.role);\n\n if (!roleDef) {\n // Merge file-loaded and built-in role IDs\n const builtInIds = [\"architect\", \"implementer\", \"security-reviewer\", \"quality-guardian\", \"phase-manager\", \"onboarding\", \"code-reviewer\"];\n const fileRoles = loadRoles(params.target_dir);\n const fileIds = fileRoles.roles.map((r) => r.role_id);\n const availableIds = [...new Set([...fileIds, ...builtInIds])].sort();\n return textResult(\n `Unknown role: \\`${params.role}\\`. Available roles: ${availableIds.map((r) => `\\`${r}\\``).join(\", \")}`,\n );\n }\n\n const source = role ? \"file\" : \"built-in\";\n lines.push(\n `# Role Activated: ${roleDef.name}`,\n \"\",\n roleDef.description,\n \"\",\n );\n\n if (source === \"file\") {\n lines.push(`*Loaded from .arcbridge/agents/${params.role}.md*`, \"\");\n }\n\n // Tools section\n lines.push(\"## Required Tools\", \"\");\n for (const tool of roleDef.requiredTools) {\n lines.push(`- \\`${tool}\\``);\n }\n lines.push(\"\");\n\n if (roleDef.deniedTools.length > 0) {\n lines.push(\"## Denied Tools\", \"\");\n for (const tool of roleDef.deniedTools) {\n lines.push(`- \\`${tool}\\``);\n }\n lines.push(\"\");\n }\n\n if (roleDef.readOnly) {\n lines.push(\"**Access:** Read-only\", \"\");\n }\n\n if (roleDef.qualityFocus.length > 0) {\n lines.push(\n \"## Quality Focus\",\n \"\",\n roleDef.qualityFocus.map((q) => `- ${q}`).join(\"\\n\"),\n \"\",\n );\n }\n\n // Model preferences (only from file-loaded roles)\n if (roleDef.modelPreferences) {\n const mp = roleDef.modelPreferences;\n lines.push(\"## Model Preferences\", \"\");\n lines.push(`- **Reasoning depth:** ${mp.reasoning_depth}`);\n lines.push(`- **Speed priority:** ${mp.speed_priority}`);\n if (mp.suggested_models) {\n const models = Object.entries(mp.suggested_models)\n .filter(([, v]) => v)\n .map(([k, v]) => `${k}: ${v}`);\n if (models.length > 0) {\n lines.push(`- **Suggested models:** ${models.join(\", \")}`);\n }\n }\n lines.push(\"\");\n }\n\n // Load contextual data based on role\n lines.push(\"## Pre-loaded Context\", \"\");\n\n // All roles get building block summary\n const blocks = db\n .prepare(\"SELECT id, name, responsibility FROM building_blocks\")\n .all() as BlockRow[];\n\n if (blocks.length > 0) {\n lines.push(\"### Building Blocks\", \"\");\n for (const b of blocks) {\n lines.push(`- **${b.name}** (\\`${b.id}\\`): ${b.responsibility}`);\n }\n lines.push(\"\");\n }\n\n // Role-specific context loading\n if (roleDef.qualityFocus.length > 0) {\n // Load quality scenarios filtered by role's focus categories\n const allScenarios = db\n .prepare(\n \"SELECT id, name, category, priority, status FROM quality_scenarios ORDER BY priority, category\",\n )\n .all() as ScenarioRow[];\n\n const focused = allScenarios.filter(\n (s) => roleDef.qualityFocus.includes(s.category) || s.priority === \"must\",\n );\n\n if (focused.length > 0) {\n lines.push(\"### Relevant Quality Scenarios\", \"\");\n for (const s of focused) {\n const statusIcon = s.status === \"passing\" ? \"PASS\" : s.status === \"failing\" ? \"FAIL\" : \"?\";\n lines.push(\n `- [${statusIcon}] **${s.id}: ${s.name}** [${s.category}] (${s.priority})`,\n );\n }\n lines.push(\"\");\n }\n }\n\n // Phase Manager & Onboarding get phase overview\n if ([\"phase-manager\", \"onboarding\", \"architect\"].includes(params.role)) {\n const phases = db\n .prepare(\"SELECT id, name, status FROM phases ORDER BY id\")\n .all() as PhaseRow[];\n\n if (phases.length > 0) {\n lines.push(\"### Phase Plan\", \"\");\n for (const p of phases) {\n const icon =\n p.status === \"complete\"\n ? \"[x]\"\n : p.status === \"in-progress\"\n ? \"[>]\"\n : \"[ ]\";\n lines.push(`- ${icon} ${p.name} (${p.status})`);\n }\n lines.push(\"\");\n }\n }\n\n // Implementer & Code Reviewer get focused block context\n if (\n [\"implementer\", \"code-reviewer\"].includes(params.role) &&\n params.building_block\n ) {\n const blockDetail = db\n .prepare(\"SELECT id, name, responsibility FROM building_blocks WHERE id = ?\")\n .get(params.building_block) as BlockRow | undefined;\n\n if (!blockDetail) {\n lines.push(\n `### Warning: Unknown Building Block`,\n \"\",\n `Building block \\`${params.building_block}\\` not found. Use \\`arcbridge_get_building_blocks\\` to see available blocks.`,\n \"\",\n );\n } else {\n lines.push(\n `### Focus Block: ${blockDetail.name}`,\n \"\",\n `**Responsibility:** ${blockDetail.responsibility}`,\n \"\",\n );\n\n // Get active tasks for this block\n const blockTasks = db\n .prepare(\n \"SELECT id, title, status FROM tasks WHERE building_block = ? AND status IN ('todo', 'in-progress')\",\n )\n .all(params.building_block) as TaskRow[];\n\n if (blockTasks.length > 0) {\n lines.push(\"### Active Tasks\", \"\");\n for (const t of blockTasks) {\n lines.push(`- [${t.status}] ${t.id}: ${t.title}`);\n }\n lines.push(\"\");\n }\n }\n }\n\n // Phase Manager gets current tasks\n if (params.role === \"phase-manager\") {\n const currentPhase = db\n .prepare(\n \"SELECT id, name FROM phases WHERE status = 'in-progress' LIMIT 1\",\n )\n .get() as { id: string; name: string } | undefined;\n\n if (currentPhase) {\n const phaseTasks = db\n .prepare(\"SELECT id, title, status FROM tasks WHERE phase_id = ?\")\n .all(currentPhase.id) as TaskRow[];\n\n const done = phaseTasks.filter((t) => t.status === \"done\").length;\n lines.push(\n `### Current Phase: ${currentPhase.name} (${done}/${phaseTasks.length} tasks done)`,\n \"\",\n );\n for (const t of phaseTasks) {\n const icon =\n t.status === \"done\"\n ? \"[x]\"\n : t.status === \"in-progress\"\n ? \"[>]\"\n : t.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n lines.push(`- ${icon} ${t.id}: ${t.title}`);\n }\n lines.push(\"\");\n }\n }\n\n // System prompt\n lines.push(\"## Instructions\", \"\", roleDef.systemPrompt, \"\");\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n\ninterface RoleDef {\n name: string;\n description: string;\n requiredTools: string[];\n deniedTools: string[];\n readOnly: boolean;\n qualityFocus: string[];\n systemPrompt: string;\n modelPreferences?: {\n reasoning_depth: string;\n speed_priority: string;\n suggested_models?: Record<string, string | undefined>;\n };\n}\n\n/**\n * Built-in fallback role definitions, used when .arcbridge/agents/{roleId}.md\n * doesn't exist (e.g., project not initialized or role file deleted).\n */\nfunction getRoleDefinition(roleId: string): RoleDef | null {\n const roles: Record<string, RoleDef> = {\n architect: {\n name: \"Architect\",\n description:\n \"Designs system structure, makes architectural decisions, and maintains the arc42 documentation\",\n requiredTools: [\n \"arcbridge_get_building_blocks\",\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_relevant_adrs\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_dependency_graph\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_route_map\",\n \"arcbridge_get_boundary_analysis\",\n \"arcbridge_propose_arc42_update\",\n \"arcbridge_check_drift\",\n \"arcbridge_get_open_questions\",\n ],\n deniedTools: [],\n readOnly: false,\n qualityFocus: [\"maintainability\", \"reliability\", \"security\", \"performance\"],\n systemPrompt:\n \"You are the Architect agent. Design building blocks, make ADRs, maintain arc42 docs, ensure code-to-architecture mapping, review quality scenarios, and detect drift. Think at the system level.\",\n },\n implementer: {\n name: \"Implementer\",\n description:\n \"Writes code within defined building block boundaries, follows existing patterns, and completes phase tasks\",\n requiredTools: [\n \"arcbridge_get_building_block\",\n \"arcbridge_get_current_tasks\",\n \"arcbridge_update_task\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_guidance\",\n \"arcbridge_get_component_graph\",\n ],\n deniedTools: [\"arcbridge_propose_arc42_update\"],\n readOnly: false,\n qualityFocus: [\"maintainability\", \"performance\"],\n systemPrompt:\n \"You are the Implementer agent. Write code within your assigned building block boundaries. Follow existing patterns, check guidance before making changes, and update task status when complete.\",\n },\n \"security-reviewer\": {\n name: \"Security Reviewer\",\n description:\n \"Reviews code for security vulnerabilities, verifies security quality scenarios, and checks auth coverage\",\n requiredTools: [\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_building_blocks\",\n \"arcbridge_get_relevant_adrs\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_route_map\",\n \"arcbridge_get_boundary_analysis\",\n \"arcbridge_get_practice_review\",\n ],\n deniedTools: [\"arcbridge_propose_arc42_update\"],\n readOnly: true,\n qualityFocus: [\"security\"],\n systemPrompt:\n \"You are the Security Reviewer agent. Review code for vulnerabilities, verify auth coverage on routes, check server/client boundary safety, and validate security quality scenarios.\",\n },\n \"quality-guardian\": {\n name: \"Quality Guardian\",\n description:\n \"Verifies quality scenarios are met, checks test coverage, and monitors performance budgets\",\n requiredTools: [\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_building_blocks\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_boundary_analysis\",\n ],\n deniedTools: [],\n readOnly: true,\n qualityFocus: [\n \"security\",\n \"performance\",\n \"accessibility\",\n \"reliability\",\n \"maintainability\",\n ],\n systemPrompt:\n \"You are the Quality Guardian agent. Verify all quality scenarios are met, check test coverage, monitor performance budgets, and flag regressions.\",\n },\n \"phase-manager\": {\n name: \"Phase Manager\",\n description:\n \"Manages phase transitions, enforces gates, triggers sync, and tracks task completion\",\n requiredTools: [\n \"arcbridge_get_phase_plan\",\n \"arcbridge_get_current_tasks\",\n \"arcbridge_update_task\",\n \"arcbridge_check_drift\",\n \"arcbridge_get_open_questions\",\n \"arcbridge_propose_arc42_update\",\n \"arcbridge_complete_phase\",\n ],\n deniedTools: [],\n readOnly: false,\n qualityFocus: [],\n systemPrompt:\n \"You are the Phase Manager agent. Track task completion, enforce phase gates, trigger architecture sync at boundaries, and manage phase transitions. Do not skip gates.\",\n },\n onboarding: {\n name: \"Onboarding Guide\",\n description:\n \"Helps new team members understand the project architecture, conventions, and current state\",\n requiredTools: [\n \"arcbridge_get_project_status\",\n \"arcbridge_get_building_blocks\",\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_phase_plan\",\n \"arcbridge_get_relevant_adrs\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_route_map\",\n ],\n deniedTools: [],\n readOnly: true,\n qualityFocus: [],\n systemPrompt:\n \"You are the Onboarding Guide agent. Help new team members understand the project: architecture, conventions, current phase, and how to contribute. Be welcoming and thorough.\",\n },\n \"code-reviewer\": {\n name: \"Code Reviewer\",\n description:\n \"On-demand code review: checks correctness, patterns, edge cases, and simplicity\",\n requiredTools: [\n \"arcbridge_get_building_block\",\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_relevant_adrs\",\n \"arcbridge_get_current_tasks\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_dependency_graph\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_route_map\",\n \"arcbridge_get_practice_review\",\n \"arcbridge_get_boundary_analysis\",\n ],\n deniedTools: [],\n readOnly: true,\n qualityFocus: [\"maintainability\", \"reliability\"],\n systemPrompt:\n \"You are the Code Reviewer agent. Review for correctness, adherence to patterns, edge cases, simplicity, and alignment with quality scenarios. Be constructive and specific.\",\n },\n };\n\n return roles[roleId] ?? null;\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { verifyScenarios, loadConfig } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\n\nexport function registerVerifyScenarios(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_verify_scenarios\",\n \"Run linked tests for quality scenarios and update their pass/fail status. Only runs scenarios with verification='automatic' or 'semi-automatic' and non-empty linked_tests.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n scenario_ids: z\n .array(z.string())\n .optional()\n .describe(\n \"Specific scenario IDs to verify (e.g., ['SEC-01', 'PERF-01']). If omitted, verifies all automatic scenarios.\",\n ),\n test_command: z\n .string()\n .optional()\n .describe(\n \"Override the test command from config (e.g., 'npx jest'). File paths are appended as arguments.\",\n ),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Load test config\n let testCommand = \"npx vitest run\";\n let timeoutMs = 60000;\n\n const configResult = loadConfig(params.target_dir);\n if (configResult.config) {\n testCommand = configResult.config.testing.test_command;\n timeoutMs = configResult.config.testing.timeout_ms;\n }\n\n // Allow override via parameter\n if (params.test_command) {\n testCommand = params.test_command;\n }\n\n const projectRoot = ctx.projectRoot ?? params.target_dir;\n\n const result = verifyScenarios(db, projectRoot, {\n testCommand,\n timeoutMs,\n scenarioIds: params.scenario_ids,\n });\n\n const lines: string[] = [\"# Scenario Verification Results\", \"\"];\n\n if (result.results.length === 0) {\n lines.push(\n \"No testable scenarios found. Scenarios need `verification: automatic` (or `semi-automatic`) and non-empty `linked_tests` to be verified.\",\n );\n return textResult(lines.join(\"\\n\"));\n }\n\n lines.push(`Ran tests for ${result.results.length} scenario(s).`, \"\");\n\n const passing = result.results.filter((r) => r.passed).length;\n const failing = result.results.length - passing;\n lines.push(\n `**Summary:** ${passing} passing, ${failing} failing`,\n \"\",\n );\n\n for (const r of result.results) {\n const icon = r.passed ? \"PASS\" : \"FAIL\";\n lines.push(\n `### [${icon}] ${r.scenarioId}: ${r.scenarioName} (${r.durationMs}ms)`,\n \"\",\n );\n lines.push(`Tests: ${r.testPaths.join(\", \")}`, \"\");\n if (!r.passed && r.output) {\n const trimmed = r.output.length > 500 ? `...${r.output.slice(-500)}` : r.output;\n lines.push(\"```\", trimmed, \"```\", \"\");\n }\n }\n\n if (result.updated > 0) {\n lines.push(\n `---`,\n `Updated status for ${result.updated} scenario(s) in the database.`,\n );\n }\n\n if (result.errors.length > 0) {\n lines.push(\"\", \"## Errors\", \"\");\n for (const e of result.errors) {\n lines.push(`- ${e}`);\n }\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type Database from \"better-sqlite3\";\nimport {\n loadRole,\n loadRoles,\n detectDrift,\n resolveRef,\n getChangedFiles,\n type ChangedFile,\n} from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson, normalizeCodePath } from \"../helpers.js\";\n\ninterface BlockRow {\n id: string;\n name: string;\n responsibility: string;\n code_paths: string;\n interfaces: string;\n}\n\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n priority: string;\n status: string;\n}\n\ninterface PhaseRow {\n id: string;\n name: string;\n status: string;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n phase_id: string;\n}\n\ninterface RoleDef {\n name: string;\n qualityFocus: string[];\n}\n\nconst SCOPE_VALUES = [\"last-commit\", \"current-phase\", \"full-project\"] as const;\n\nexport function registerRunRoleCheck(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_run_role_check\",\n \"Run a role-specific architectural analysis: resolves the role and executes relevant checks (drift, quality scenarios, boundaries, changed files) based on the role's focus areas.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n role: z\n .string()\n .describe(\n \"Role ID to run checks for (e.g., 'security-reviewer', 'quality-guardian', 'architect', 'phase-manager', 'code-reviewer')\",\n ),\n scope: z\n .enum(SCOPE_VALUES)\n .default(\"current-phase\")\n .describe(\n \"Scope of analysis: 'last-commit' (recent changes), 'current-phase' (since phase start), 'full-project' (everything)\",\n ),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const projectRoot = ctx.projectRoot ?? params.target_dir;\n\n // Resolve role: file-first, then built-in\n const fileResult = loadRole(projectRoot, params.role);\n const role = fileResult.role ?? null;\n const roleDef: RoleDef | null = role\n ? { name: role.name, qualityFocus: role.quality_focus }\n : getBuiltInRoleDef(params.role);\n\n if (!roleDef) {\n const builtInIds = [\n \"architect\", \"implementer\", \"security-reviewer\",\n \"quality-guardian\", \"phase-manager\", \"onboarding\", \"code-reviewer\",\n ];\n const fileRoles = loadRoles(projectRoot);\n const fileIds = fileRoles.roles.map((r) => r.role_id);\n const availableIds = [...new Set([...fileIds, ...builtInIds])].sort();\n return textResult(\n `Unknown role: \\`${params.role}\\`. Available roles: ${availableIds.map((r) => `\\`${r}\\``).join(\", \")}`,\n );\n }\n\n const lines: string[] = [\n `# Role Check: ${roleDef.name}`,\n \"\",\n `**Scope:** ${params.scope}`,\n \"\",\n ];\n\n // Get changed files for scoped checks\n const changedFiles = getChangedFilesForScope(db, projectRoot, params.scope);\n if (changedFiles && changedFiles.length > 0) {\n lines.push(`**Changed files:** ${changedFiles.length}`, \"\");\n }\n\n // Dispatch to role-specific checks\n switch (params.role) {\n case \"security-reviewer\":\n runSecurityReviewerCheck(db, lines, changedFiles);\n break;\n case \"quality-guardian\":\n runQualityGuardianCheck(db, lines);\n break;\n case \"architect\":\n runArchitectCheck(db, lines);\n break;\n case \"phase-manager\":\n runPhaseManagerCheck(db, projectRoot, lines);\n break;\n case \"code-reviewer\":\n runCodeReviewerCheck(db, lines, changedFiles);\n break;\n default:\n runCustomRoleCheck(db, lines, roleDef);\n break;\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Scope resolution\n// ---------------------------------------------------------------------------\n\nfunction getChangedFilesForScope(\n db: Database.Database,\n projectRoot: string,\n scope: (typeof SCOPE_VALUES)[number],\n): ChangedFile[] | null {\n if (scope === \"full-project\") return null;\n\n const since = scope === \"last-commit\" ? \"last-commit\" : \"last-phase\";\n const ref = resolveRef(projectRoot, since, db);\n try {\n return getChangedFiles(projectRoot, ref.sha);\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Built-in role definitions (subset needed for this tool)\n// ---------------------------------------------------------------------------\n\nfunction getBuiltInRoleDef(roleId: string): RoleDef | null {\n const defs: Record<string, RoleDef> = {\n architect: { name: \"Architect\", qualityFocus: [\"maintainability\", \"reliability\", \"security\", \"performance\"] },\n implementer: { name: \"Implementer\", qualityFocus: [\"maintainability\", \"performance\"] },\n \"security-reviewer\": { name: \"Security Reviewer\", qualityFocus: [\"security\"] },\n \"quality-guardian\": { name: \"Quality Guardian\", qualityFocus: [\"security\", \"performance\", \"accessibility\", \"reliability\", \"maintainability\"] },\n \"phase-manager\": { name: \"Phase Manager\", qualityFocus: [] },\n onboarding: { name: \"Onboarding Guide\", qualityFocus: [] },\n \"code-reviewer\": { name: \"Code Reviewer\", qualityFocus: [\"maintainability\", \"reliability\"] },\n };\n return defs[roleId] ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nfunction appendDriftSection(db: Database.Database, lines: string[]): void {\n const entries = detectDrift(db);\n\n lines.push(\"## Drift Check\", \"\");\n\n if (entries.length === 0) {\n lines.push(\"No architecture drift detected.\", \"\");\n return;\n }\n\n const errors = entries.filter((e) => e.severity === \"error\").length;\n const warnings = entries.filter((e) => e.severity === \"warning\").length;\n const infos = entries.filter((e) => e.severity === \"info\").length;\n lines.push(`**${errors}** errors, **${warnings}** warnings, **${infos}** info`, \"\");\n\n const byKind = groupBy(entries, (e) => e.kind);\n const kindLabels: Record<string, string> = {\n undocumented_module: \"Undocumented Modules\",\n missing_module: \"Missing Modules\",\n dependency_violation: \"Dependency Violations\",\n stale_adr: \"Stale ADR References\",\n unlinked_test: \"Unlinked Tests\",\n };\n\n const severityIcon: Record<string, string> = {\n error: \"ERROR\",\n warning: \"WARN\",\n info: \"INFO\",\n };\n\n for (const [kind, items] of byKind) {\n lines.push(`### ${kindLabels[kind] ?? kind}`, \"\");\n for (const item of items) {\n const icon = severityIcon[item.severity] ?? item.severity;\n lines.push(`- [${icon}] ${item.description}`);\n }\n lines.push(\"\");\n }\n}\n\nfunction appendQualityScenarios(\n db: Database.Database,\n lines: string[],\n categoryFilter?: string[],\n): void {\n const allScenarios = db\n .prepare(\n \"SELECT id, name, category, priority, status FROM quality_scenarios ORDER BY priority, category\",\n )\n .all() as ScenarioRow[];\n\n const scenarios = categoryFilter\n ? allScenarios.filter(\n (s) => categoryFilter.includes(s.category) || s.priority === \"must\",\n )\n : allScenarios;\n\n const title = categoryFilter\n ? \"## Quality Scenarios (Filtered)\"\n : \"## Quality Scenarios\";\n lines.push(title, \"\");\n\n if (scenarios.length === 0) {\n lines.push(\"No matching quality scenarios found.\", \"\");\n return;\n }\n\n const passing = scenarios.filter((s) => s.status === \"passing\").length;\n const failing = scenarios.filter((s) => s.status === \"failing\").length;\n const untested = scenarios.filter(\n (s) => s.status === \"untested\" || s.status === \"partial\",\n ).length;\n lines.push(\n `**Total:** ${scenarios.length} | **Passing:** ${passing} | **Failing:** ${failing} | **Untested/Partial:** ${untested}`,\n \"\",\n );\n\n for (const s of scenarios) {\n const icon =\n s.status === \"passing\"\n ? \"PASS\"\n : s.status === \"failing\"\n ? \"FAIL\"\n : \"?\";\n lines.push(\n `- [${icon}] **${s.id}: ${s.name}** [${s.category}] (${s.priority})`,\n );\n }\n lines.push(\"\");\n}\n\nfunction appendChangedFilesList(\n lines: string[],\n changedFiles: ChangedFile[] | null,\n): void {\n if (!changedFiles || changedFiles.length === 0) return;\n\n lines.push(\"## Changed Files\", \"\");\n const limit = 30;\n const display = changedFiles.slice(0, limit);\n for (const f of display) {\n const tag = f.status === \"added\" ? \"A\" : f.status === \"deleted\" ? \"D\" : \"M\";\n lines.push(`- [${tag}] \\`${f.path}\\``);\n }\n if (changedFiles.length > limit) {\n lines.push(`- ... and ${changedFiles.length - limit} more`);\n }\n lines.push(\"\");\n}\n\nfunction appendBuildingBlocks(\n db: Database.Database,\n lines: string[],\n): void {\n const blocks = db\n .prepare(\"SELECT id, name, responsibility FROM building_blocks\")\n .all() as BlockRow[];\n\n lines.push(\"## Building Blocks\", \"\");\n\n if (blocks.length === 0) {\n lines.push(\"No building blocks defined.\", \"\");\n return;\n }\n\n for (const b of blocks) {\n lines.push(`- **${b.name}** (\\`${b.id}\\`): ${b.responsibility}`);\n }\n lines.push(\"\");\n}\n\nfunction mapFilesToBlocks(\n db: Database.Database,\n changedFiles: ChangedFile[],\n): { mapped: Map<string, string[]>; unmapped: string[] } {\n const blocks = db\n .prepare(\"SELECT id, name, code_paths FROM building_blocks\")\n .all() as BlockRow[];\n\n const mapped = new Map<string, string[]>();\n const unmapped: string[] = [];\n const changedPaths = changedFiles\n .filter((f) => f.status !== \"deleted\")\n .map((f) => f.path);\n\n for (const path of changedPaths) {\n let matched = false;\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (path.startsWith(prefix)) {\n const existing = mapped.get(block.id) ?? [];\n existing.push(path);\n mapped.set(block.id, existing);\n matched = true;\n break;\n }\n }\n if (matched) break;\n }\n if (!matched) unmapped.push(path);\n }\n\n return { mapped, unmapped };\n}\n\nfunction groupBy<T>(items: T[], keyFn: (item: T) => string): Map<string, T[]> {\n const map = new Map<string, T[]>();\n for (const item of items) {\n const key = keyFn(item);\n const existing = map.get(key) ?? [];\n existing.push(item);\n map.set(key, existing);\n }\n return map;\n}\n\n// ---------------------------------------------------------------------------\n// Role-specific check implementations\n// ---------------------------------------------------------------------------\n\nfunction runSecurityReviewerCheck(\n db: Database.Database,\n lines: string[],\n changedFiles: ChangedFile[] | null,\n): void {\n // Security quality scenarios\n appendQualityScenarios(db, lines, [\"security\"]);\n\n // Drift check\n appendDriftSection(db, lines);\n\n // Boundary analysis summary\n const clientComponents = db\n .prepare(\n `SELECT COUNT(*) as count FROM components WHERE is_client = 1`,\n )\n .get() as { count: number };\n const serverActions = db\n .prepare(\n `SELECT COUNT(*) as count FROM components WHERE is_server_action = 1`,\n )\n .get() as { count: number };\n const crossBoundary = db\n .prepare(\n `SELECT COUNT(*) as count\n FROM dependencies d\n JOIN components cs ON d.source_symbol = cs.symbol_id\n JOIN components ct ON d.target_symbol = ct.symbol_id\n WHERE cs.is_client != ct.is_client\n AND d.kind IN ('imports', 'calls', 'renders')`,\n )\n .get() as { count: number };\n\n lines.push(\"## Boundary Summary\", \"\");\n lines.push(`- **Client components:** ${clientComponents.count}`);\n lines.push(`- **Server actions:** ${serverActions.count}`);\n lines.push(`- **Cross-boundary edges:** ${crossBoundary.count}`);\n lines.push(\"\");\n\n // Unauthenticated API routes\n const unauthRoutes = db\n .prepare(\n `SELECT route_path FROM routes WHERE kind = 'api-route' AND has_auth = 0`,\n )\n .all() as { route_path: string }[];\n\n if (unauthRoutes.length > 0) {\n lines.push(\"## Unauthenticated API Routes\", \"\");\n for (const r of unauthRoutes) {\n lines.push(`- \\`${r.route_path}\\``);\n }\n lines.push(\"\");\n }\n\n // Changed files\n appendChangedFilesList(lines, changedFiles);\n}\n\nfunction runQualityGuardianCheck(\n db: Database.Database,\n lines: string[],\n): void {\n // All quality scenarios (no filter)\n appendQualityScenarios(db, lines);\n\n // Drift check\n appendDriftSection(db, lines);\n\n // Scenario verification status summary\n const scenarios = db\n .prepare(\n `SELECT verification, status, COUNT(*) as count\n FROM quality_scenarios\n GROUP BY verification, status`,\n )\n .all() as { verification: string; status: string; count: number }[];\n\n if (scenarios.length > 0) {\n lines.push(\"## Verification Coverage\", \"\");\n for (const s of scenarios) {\n lines.push(\n `- **${s.verification}** / ${s.status}: ${s.count} scenario(s)`,\n );\n }\n lines.push(\"\");\n }\n}\n\nfunction runArchitectCheck(\n db: Database.Database,\n lines: string[],\n): void {\n // Building blocks overview\n appendBuildingBlocks(db, lines);\n\n // Drift check (which includes dependency violations)\n appendDriftSection(db, lines);\n\n // Dependency violations specifically highlighted\n const blocks = db\n .prepare(\"SELECT id, name, code_paths, interfaces FROM building_blocks\")\n .all() as BlockRow[];\n\n if (blocks.length > 1) {\n const violations: string[] = [];\n\n for (const block of blocks) {\n const declaredInterfaces = new Set(\n safeParseJson<string[]>(block.interfaces, []),\n );\n const codePaths = safeParseJson<string[]>(block.code_paths, []);\n\n for (const cp of codePaths) {\n const prefix = normalizeCodePath(cp);\n // Find outgoing cross-block deps from files in this block\n const outgoing = db\n .prepare(\n `SELECT DISTINCT st.file_path as target_file\n FROM dependencies d\n JOIN symbols ss ON d.source_symbol = ss.id\n JOIN symbols st ON d.target_symbol = st.id\n WHERE ss.file_path LIKE ? || '%'\n AND d.kind IN ('imports', 'calls', 'renders')`,\n )\n .all(prefix) as { target_file: string }[];\n\n for (const { target_file } of outgoing) {\n for (const targetBlock of blocks) {\n if (targetBlock.id === block.id) continue;\n const tPaths = safeParseJson<string[]>(targetBlock.code_paths, []);\n for (const tp of tPaths) {\n const tPrefix = normalizeCodePath(tp);\n if (\n target_file.startsWith(tPrefix) &&\n !declaredInterfaces.has(targetBlock.id)\n ) {\n violations.push(\n `Block \\`${block.name}\\` depends on \\`${targetBlock.name}\\` (undeclared interface)`,\n );\n }\n }\n }\n }\n }\n }\n\n const unique = [...new Set(violations)];\n if (unique.length > 0) {\n lines.push(\"## Undeclared Cross-Block Dependencies\", \"\");\n for (const v of unique) {\n lines.push(`- [ERROR] ${v}`);\n }\n lines.push(\"\");\n }\n }\n}\n\nfunction runPhaseManagerCheck(\n db: Database.Database,\n projectRoot: string,\n lines: string[],\n): void {\n // Current phase tasks\n const currentPhase = db\n .prepare(\n \"SELECT id, name, status FROM phases WHERE status = 'in-progress' LIMIT 1\",\n )\n .get() as PhaseRow | undefined;\n\n if (currentPhase) {\n const tasks = db\n .prepare(\"SELECT id, title, status, phase_id FROM tasks WHERE phase_id = ?\")\n .all(currentPhase.id) as TaskRow[];\n\n const done = tasks.filter((t) => t.status === \"done\").length;\n const inProgress = tasks.filter((t) => t.status === \"in-progress\").length;\n const todo = tasks.filter((t) => t.status === \"todo\").length;\n const blocked = tasks.filter((t) => t.status === \"blocked\").length;\n\n lines.push(\n `## Current Phase: ${currentPhase.name}`,\n \"\",\n `**Progress:** ${done}/${tasks.length} done, ${inProgress} in-progress, ${todo} todo, ${blocked} blocked`,\n \"\",\n );\n\n for (const t of tasks) {\n const icon =\n t.status === \"done\"\n ? \"[x]\"\n : t.status === \"in-progress\"\n ? \"[>]\"\n : t.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n lines.push(`- ${icon} ${t.id}: ${t.title}`);\n }\n lines.push(\"\");\n } else {\n lines.push(\"## Phase Status\", \"\", \"No phase currently in progress.\", \"\");\n }\n\n // Drift check\n appendDriftSection(db, lines);\n\n // Quality gate status\n lines.push(\"## Quality Gate Status\", \"\");\n\n const mustScenarios = db\n .prepare(\n \"SELECT id, name, status FROM quality_scenarios WHERE priority = 'must'\",\n )\n .all() as ScenarioRow[];\n\n if (mustScenarios.length === 0) {\n lines.push(\"No must-have quality scenarios defined.\", \"\");\n } else {\n const passing = mustScenarios.filter((s) => s.status === \"passing\").length;\n const failing = mustScenarios.filter((s) => s.status === \"failing\").length;\n const gateOk = failing === 0;\n lines.push(\n `**Must-have scenarios:** ${passing}/${mustScenarios.length} passing`,\n `**Gate status:** ${gateOk ? \"READY\" : \"BLOCKED\"}`,\n \"\",\n );\n if (failing > 0) {\n for (const s of mustScenarios.filter((s) => s.status !== \"passing\")) {\n lines.push(`- [FAIL] ${s.id}: ${s.name} (${s.status})`);\n }\n lines.push(\"\");\n }\n }\n\n // Changed files since last sync\n const ref = resolveRef(projectRoot, \"last-sync\", db);\n try {\n const changedFiles = getChangedFiles(projectRoot, ref.sha);\n if (changedFiles.length > 0) {\n lines.push(`## Changes Since Last Sync (${ref.label})`, \"\");\n appendChangedFilesList(lines, changedFiles);\n }\n } catch {\n // git not available or ref invalid — skip\n }\n}\n\nfunction runCodeReviewerCheck(\n db: Database.Database,\n lines: string[],\n changedFiles: ChangedFile[] | null,\n): void {\n if (!changedFiles || changedFiles.length === 0) {\n lines.push(\n \"## Changed Files\",\n \"\",\n \"No changed files in the selected scope. Use a different scope or specify 'full-project'.\",\n \"\",\n );\n return;\n }\n\n // Changed files\n appendChangedFilesList(lines, changedFiles);\n\n // Map to building blocks\n const { mapped, unmapped } = mapFilesToBlocks(db, changedFiles);\n\n const blocks = db\n .prepare(\"SELECT id, name, responsibility FROM building_blocks\")\n .all() as BlockRow[];\n\n if (mapped.size > 0) {\n lines.push(\"## Affected Building Blocks\", \"\");\n for (const [blockId, files] of mapped) {\n const block = blocks.find((b) => b.id === blockId);\n const name = block ? block.name : blockId;\n const resp = block ? block.responsibility : \"\";\n lines.push(`### ${name} (\\`${blockId}\\`)`, \"\");\n if (resp) lines.push(`**Responsibility:** ${resp}`, \"\");\n lines.push(`**Changed files:** ${files.length}`, \"\");\n for (const f of files.slice(0, 10)) {\n lines.push(`- \\`${f}\\``);\n }\n if (files.length > 10) {\n lines.push(`- ... and ${files.length - 10} more`);\n }\n lines.push(\"\");\n }\n }\n\n if (unmapped.length > 0) {\n lines.push(\"## Unmapped Files\", \"\");\n lines.push(\n `${unmapped.length} file(s) not mapped to any building block:`,\n \"\",\n );\n for (const f of unmapped.slice(0, 10)) {\n lines.push(`- \\`${f}\\``);\n }\n if (unmapped.length > 10) {\n lines.push(`- ... and ${unmapped.length - 10} more`);\n }\n lines.push(\"\");\n }\n}\n\nfunction runCustomRoleCheck(\n db: Database.Database,\n lines: string[],\n roleDef: RoleDef,\n): void {\n // Quality scenarios matching quality_focus\n if (roleDef.qualityFocus.length > 0) {\n appendQualityScenarios(db, lines, roleDef.qualityFocus);\n } else {\n appendQualityScenarios(db, lines);\n }\n\n // Drift check\n appendDriftSection(db, lines);\n}\n"],"mappings":"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","names":["z","join","existsSync","z","z","z","z","z","z","z","z","refreshFromDocs","z","refreshFromDocs","z","refreshFromDocs","z","refreshFromDocs","z","z","z","z","z","z","adrs","z","indexProject","refreshFromDocs","z","refreshFromDocs","indexProject","z","z","z","existsSync","join","z","join","existsSync","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","resolveRef","getChangedFiles","detectDrift","z","resolveRef","getChangedFiles","detectDrift","z","detectDrift","writeDriftLog","getHeadSha","setSyncCommit","refreshFromDocs","z","refreshFromDocs","detectDrift","writeDriftLog","getHeadSha","setSyncCommit","z","z","z","verifyScenarios","loadConfig","z","loadConfig","verifyScenarios","z","loadRole","loadRoles","detectDrift","resolveRef","getChangedFiles","z","loadRole","loadRoles","resolveRef","getChangedFiles","detectDrift","s"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/context.ts","../src/tools/init-project.ts","../src/tools/get-project-status.ts","../src/helpers.ts","../src/tools/get-building-blocks.ts","../src/tools/get-building-block.ts","../src/tools/get-quality-scenarios.ts","../src/tools/get-phase-plan.ts","../src/tools/get-current-tasks.ts","../src/tools/update-task.ts","../src/auto-record.ts","../src/tools/create-task.ts","../src/tools/get-relevant-adrs.ts","../src/tools/reindex.ts","../src/tools/search-symbols.ts","../src/tools/get-symbol.ts","../src/tools/get-dependency-graph.ts","../src/tools/get-component-graph.ts","../src/tools/get-route-map.ts","../src/tools/get-boundary-analysis.ts","../src/tools/check-drift.ts","../src/tools/get-guidance.ts","../src/tools/get-open-questions.ts","../src/tools/propose-arc42-update.ts","../src/tools/get-practice-review.ts","../src/tools/complete-phase.ts","../src/tools/activate-role.ts","../src/tools/verify-scenarios.ts","../src/tools/run-role-check.ts","../src/tools/record-activity.ts","../src/tools/get-metrics.ts","../src/tools/export-metrics.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createArcBridgeServer } from \"./server.js\";\n\nasync function main() {\n const server = createArcBridgeServer();\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","import { createRequire } from \"node:module\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../package.json\");\nimport { createContext } from \"./context.js\";\nimport { registerInitProject } from \"./tools/init-project.js\";\nimport { registerGetProjectStatus } from \"./tools/get-project-status.js\";\nimport { registerGetBuildingBlocks } from \"./tools/get-building-blocks.js\";\nimport { registerGetBuildingBlock } from \"./tools/get-building-block.js\";\nimport { registerGetQualityScenarios } from \"./tools/get-quality-scenarios.js\";\nimport { registerGetPhasePlan } from \"./tools/get-phase-plan.js\";\nimport { registerGetCurrentTasks } from \"./tools/get-current-tasks.js\";\nimport { registerUpdateTask } from \"./tools/update-task.js\";\nimport { registerCreateTask } from \"./tools/create-task.js\";\nimport { registerGetRelevantAdrs } from \"./tools/get-relevant-adrs.js\";\nimport { registerReindex } from \"./tools/reindex.js\";\nimport { registerSearchSymbols } from \"./tools/search-symbols.js\";\nimport { registerGetSymbol } from \"./tools/get-symbol.js\";\nimport { registerGetDependencyGraph } from \"./tools/get-dependency-graph.js\";\nimport { registerGetComponentGraph } from \"./tools/get-component-graph.js\";\nimport { registerGetRouteMap } from \"./tools/get-route-map.js\";\nimport { registerGetBoundaryAnalysis } from \"./tools/get-boundary-analysis.js\";\nimport { registerCheckDrift } from \"./tools/check-drift.js\";\nimport { registerGetGuidance } from \"./tools/get-guidance.js\";\nimport { registerGetOpenQuestions } from \"./tools/get-open-questions.js\";\nimport { registerProposeArc42Update } from \"./tools/propose-arc42-update.js\";\nimport { registerGetPracticeReview } from \"./tools/get-practice-review.js\";\nimport { registerCompletePhase } from \"./tools/complete-phase.js\";\nimport { registerActivateRole } from \"./tools/activate-role.js\";\nimport { registerVerifyScenarios } from \"./tools/verify-scenarios.js\";\nimport { registerRunRoleCheck } from \"./tools/run-role-check.js\";\nimport { registerRecordActivity } from \"./tools/record-activity.js\";\nimport { registerGetMetrics } from \"./tools/get-metrics.js\";\nimport { registerExportMetrics } from \"./tools/export-metrics.js\";\n\nexport function createArcBridgeServer(): McpServer {\n const server = new McpServer({\n name: \"arcbridge\",\n version,\n });\n\n const ctx = createContext();\n\n // Lifecycle\n registerInitProject(server, ctx);\n registerGetProjectStatus(server, ctx);\n\n // Architecture\n registerGetBuildingBlocks(server, ctx);\n registerGetBuildingBlock(server, ctx);\n registerGetQualityScenarios(server, ctx);\n registerGetRelevantAdrs(server, ctx);\n\n // Planning\n registerGetPhasePlan(server, ctx);\n registerGetCurrentTasks(server, ctx);\n registerUpdateTask(server, ctx);\n registerCreateTask(server, ctx);\n\n // Code Intelligence\n registerReindex(server, ctx);\n registerSearchSymbols(server, ctx);\n registerGetSymbol(server, ctx);\n registerGetDependencyGraph(server, ctx);\n\n // React & Next.js Analysis\n registerGetComponentGraph(server, ctx);\n registerGetRouteMap(server, ctx);\n registerGetBoundaryAnalysis(server, ctx);\n\n // Architecture Bridge\n registerCheckDrift(server, ctx);\n registerGetGuidance(server, ctx);\n registerGetOpenQuestions(server, ctx);\n registerProposeArc42Update(server, ctx);\n registerGetPracticeReview(server, ctx);\n registerCompletePhase(server, ctx);\n registerActivateRole(server, ctx);\n registerVerifyScenarios(server, ctx);\n registerRunRoleCheck(server, ctx);\n\n // Metrics\n registerRecordActivity(server, ctx);\n registerGetMetrics(server, ctx);\n registerExportMetrics(server, ctx);\n\n return server;\n}\n","import type Database from \"better-sqlite3\";\n\nexport interface ServerContext {\n db: Database.Database | null;\n projectRoot: string | null;\n}\n\nexport function createContext(): ServerContext {\n return {\n db: null,\n projectRoot: null,\n };\n}\n","import { z } from \"zod\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n generateConfig,\n generateArc42,\n generatePlan,\n generateAgentRoles,\n generateDatabase,\n generateSyncFiles,\n indexProject,\n type InitProjectInput,\n} from \"@arcbridge/core\";\nimport { getAdapter } from \"@arcbridge/adapters\";\nimport type { ServerContext } from \"../context.js\";\n\nexport function registerInitProject(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_init_project\",\n \"Initialize ArcBridge in a project directory. Creates .arcbridge/ with arc42 documentation, phase plan, agent roles, SQLite database, and platform-specific configs.\",\n {\n name: z.string().min(1).describe(\"Project name\"),\n template: z\n .enum([\"nextjs-app-router\", \"react-vite\", \"api-service\", \"dotnet-webapi\"])\n .default(\"nextjs-app-router\")\n .describe(\"Project template\"),\n features: z\n .array(z.enum([\"auth\", \"database\", \"api\"]))\n .default([])\n .describe(\"Features to scaffold\"),\n quality_priorities: z\n .array(z.string())\n .default([\"security\", \"performance\", \"accessibility\"])\n .describe(\"Quality priorities in order\"),\n platforms: z\n .array(z.string())\n .default([\"claude\"])\n .describe(\"Target platforms for agent config generation\"),\n target_dir: z\n .string()\n .describe(\"Absolute path to the target project directory\"),\n },\n async (params) => {\n const targetDir = params.target_dir;\n\n // Check if already initialized\n if (existsSync(join(targetDir, \".arcbridge\", \"config.yaml\"))) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `ArcBridge is already initialized in ${targetDir}. Use arcbridge_get_project_status to see the current state.`,\n },\n ],\n };\n }\n\n const input: InitProjectInput = {\n name: params.name,\n template: params.template,\n features: params.features,\n quality_priorities: params.quality_priorities,\n platforms: params.platforms,\n };\n\n // 1. Generate config\n const config = generateConfig(targetDir, input);\n\n // 2. Generate arc42 documentation\n generateArc42(targetDir, input);\n\n // 3. Generate phase plan\n generatePlan(targetDir, input);\n\n // 4. Generate agent roles\n const roles = generateAgentRoles(targetDir, params.template);\n\n // 5. Initialize database from generated files\n const { db, warnings } = generateDatabase(targetDir, input);\n ctx.db = db;\n ctx.projectRoot = targetDir;\n\n // 6. Generate sync loop files (skill, action, hook)\n const syncFiles = generateSyncFiles(targetDir, config);\n\n // 7. Generate platform-specific configs\n const platformWarnings: string[] = [];\n for (const platform of params.platforms) {\n try {\n const adapter = getAdapter(platform);\n adapter.generateProjectConfig(targetDir, config);\n adapter.generateAgentConfigs(targetDir, roles);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n platformWarnings.push(`Platform '${platform}': ${msg}`);\n }\n }\n\n // 8. Index TypeScript symbols (if tsconfig exists)\n let indexResult: {\n symbolsIndexed: number;\n dependenciesIndexed: number;\n componentsAnalyzed: number;\n routesAnalyzed: number;\n } | null = null;\n try {\n const result = await indexProject(db, { projectRoot: targetDir });\n indexResult = {\n symbolsIndexed: result.symbolsIndexed,\n dependenciesIndexed: result.dependenciesIndexed,\n componentsAnalyzed: result.componentsAnalyzed,\n routesAnalyzed: result.routesAnalyzed,\n };\n } catch {\n // Indexing is optional — project may not have tsconfig.json yet\n }\n\n // Count what was created\n const blockCount = db\n .prepare(\"SELECT COUNT(*) as count FROM building_blocks\")\n .get() as { count: number };\n const scenarioCount = db\n .prepare(\"SELECT COUNT(*) as count FROM quality_scenarios\")\n .get() as { count: number };\n const phaseCount = db\n .prepare(\"SELECT COUNT(*) as count FROM phases\")\n .get() as { count: number };\n const taskCount = db\n .prepare(\"SELECT COUNT(*) as count FROM tasks\")\n .get() as { count: number };\n\n const allWarnings = [...warnings, ...platformWarnings];\n\n const summary = [\n `# ArcBridge Initialized: ${input.name}`,\n \"\",\n `**Template:** ${input.template}`,\n `**Features:** ${input.features.length > 0 ? input.features.join(\", \") : \"none\"}`,\n `**Platforms:** ${params.platforms.join(\", \")}`,\n \"\",\n \"## Created\",\n \"\",\n `- **Building blocks:** ${blockCount.count}`,\n `- **Quality scenarios:** ${scenarioCount.count}`,\n `- **Phases:** ${phaseCount.count}`,\n `- **Tasks:** ${taskCount.count}`,\n `- **Agent roles:** ${roles.length}`,\n ...(indexResult\n ? [\n `- **Symbols indexed:** ${indexResult.symbolsIndexed}`,\n `- **Dependencies indexed:** ${indexResult.dependenciesIndexed}`,\n `- **Components analyzed:** ${indexResult.componentsAnalyzed}`,\n `- **Routes analyzed:** ${indexResult.routesAnalyzed}`,\n ]\n : [input.template === \"dotnet-webapi\"\n ? `- **Code indexing:** not available yet for .NET projects (C# indexer planned)`\n : `- **Code indexing:** skipped (no tsconfig.json found — run \\`arcbridge_reindex\\` later)`]),\n \"\",\n \"## Files\",\n \"\",\n \"- `.arcbridge/config.yaml` — Project configuration\",\n \"- `.arcbridge/arc42/` — Architecture documentation (arc42)\",\n \"- `.arcbridge/plan/` — Phase plan and tasks\",\n \"- `.arcbridge/agents/` — Canonical agent role definitions\",\n \"- `.arcbridge/index.db` — SQLite database\",\n ...params.platforms.includes(\"claude\")\n ? [\"- `CLAUDE.md` — Claude Code project instructions\", \"- `.claude/agents/` — Claude agent configs\"]\n : [],\n ...params.platforms.includes(\"copilot\")\n ? [\"- `.github/copilot-instructions.md` — Copilot instructions\", \"- `.github/agents/` — Copilot agent configs\"]\n : [],\n ...syncFiles.map((f) => `- \\`${f}\\` — Sync loop trigger`),\n ...(allWarnings.length > 0\n ? [\n \"\",\n \"## Warnings\",\n \"\",\n ...allWarnings.map((w) => `- ${w}`),\n ]\n : []),\n \"\",\n \"Use `arcbridge_get_project_status` to see the full project status.\",\n ];\n\n return {\n content: [{ type: \"text\" as const, text: summary.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { refreshFromDocs } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized } from \"../helpers.js\";\n\ninterface CountRow {\n count: number;\n}\ninterface PhaseRow {\n id: string;\n name: string;\n phase_number: number;\n status: string;\n}\ninterface TaskStatusRow {\n status: string;\n count: number;\n}\ninterface BlockRow {\n id: string;\n name: string;\n responsibility: string;\n}\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n status: string;\n priority: string;\n}\ninterface MetaRow {\n value: string;\n}\n\nexport function registerGetProjectStatus(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_project_status\",\n \"Get the current status of the ArcBridge project: current phase, task completion, building blocks, quality scenarios, and drift warnings.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n\n if (!db) {\n return notInitialized();\n }\n\n // Refresh DB from docs to pick up any YAML edits\n refreshFromDocs(db, params.target_dir);\n\n // Project name\n const projectName = (\n db\n .prepare(\n \"SELECT value FROM arcbridge_meta WHERE key = 'project_name'\",\n )\n .get() as MetaRow | undefined\n )?.value ?? \"Unknown\";\n\n // Phases\n const phases = db\n .prepare(\n \"SELECT id, name, phase_number, status FROM phases ORDER BY phase_number\",\n )\n .all() as PhaseRow[];\n\n const currentPhase = phases.find(\n (p) => p.status === \"in-progress\",\n ) ?? phases[0];\n\n // Task summary\n const taskStats = db\n .prepare(\n \"SELECT status, COUNT(*) as count FROM tasks GROUP BY status\",\n )\n .all() as TaskStatusRow[];\n\n const totalTasks = taskStats.reduce((sum, r) => sum + r.count, 0);\n const doneTasks =\n taskStats.find((r) => r.status === \"done\")?.count ?? 0;\n const completionPct =\n totalTasks > 0 ? Math.round((doneTasks / totalTasks) * 100) : 0;\n\n // Building blocks\n const blocks = db\n .prepare(\"SELECT id, name, responsibility FROM building_blocks\")\n .all() as BlockRow[];\n\n // Quality scenarios\n const scenarios = db\n .prepare(\n \"SELECT id, name, category, status, priority FROM quality_scenarios ORDER BY category, id\",\n )\n .all() as ScenarioRow[];\n\n // Code intelligence\n const symbolCount = (\n db.prepare(\"SELECT COUNT(*) as count FROM symbols\").get() as CountRow\n ).count;\n const depCount = (\n db.prepare(\"SELECT COUNT(*) as count FROM dependencies\").get() as CountRow\n ).count;\n const componentCount = (\n db.prepare(\"SELECT COUNT(*) as count FROM components\").get() as CountRow\n ).count;\n const routeCount = (\n db.prepare(\"SELECT COUNT(*) as count FROM routes\").get() as CountRow\n ).count;\n const lastIndexed = (\n db\n .prepare(\"SELECT MAX(indexed_at) as value FROM symbols\")\n .get() as MetaRow | undefined\n )?.value;\n\n // Drift\n const driftCount = (\n db\n .prepare(\n \"SELECT COUNT(*) as count FROM drift_log WHERE resolution IS NULL\",\n )\n .get() as CountRow\n ).count;\n\n // Format output\n const lines: string[] = [\n `# Project Status: ${projectName}`,\n \"\",\n \"## Current Phase\",\n \"\",\n currentPhase\n ? `**${currentPhase.name}** (${currentPhase.status})`\n : \"*No phases defined*\",\n \"\",\n \"## Phases\",\n \"\",\n ...phases.map(\n (p) =>\n `- ${p.status === \"complete\" ? \"[x]\" : p.status === \"in-progress\" ? \"[>]\" : \"[ ]\"} Phase ${p.phase_number}: ${p.name} (${p.status})`,\n ),\n \"\",\n \"## Task Progress\",\n \"\",\n `**${doneTasks}/${totalTasks}** tasks complete (${completionPct}%)`,\n \"\",\n ...taskStats.map((r) => `- ${r.status}: ${r.count}`),\n \"\",\n \"## Building Blocks\",\n \"\",\n ...blocks.map((b) => `- **${b.name}** (\\`${b.id}\\`): ${b.responsibility}`),\n \"\",\n \"## Quality Scenarios\",\n \"\",\n ...scenarios.map(\n (s) =>\n `- ${s.status === \"passing\" ? \"pass\" : s.status === \"failing\" ? \"FAIL\" : s.status === \"partial\" ? \"partial\" : \"untested\"} ${s.id}: ${s.name} [${s.category}] (${s.priority})`,\n ),\n \"\",\n ];\n\n // Code intelligence section\n lines.push(\"## Code Intelligence\", \"\");\n if (symbolCount > 0) {\n lines.push(\n `- **Symbols indexed:** ${symbolCount}`,\n `- **Dependencies indexed:** ${depCount}`,\n `- **Components analyzed:** ${componentCount}`,\n `- **Routes analyzed:** ${routeCount}`,\n `- **Last indexed:** ${lastIndexed ?? \"unknown\"}`,\n \"\",\n );\n } else {\n lines.push(\n \"*Not indexed yet.* Run `arcbridge_reindex` to index TypeScript symbols.\",\n \"\",\n );\n }\n\n if (driftCount > 0) {\n lines.push(\n \"## Drift Warnings\",\n \"\",\n `**${driftCount}** unresolved drift issue(s) detected.`,\n \"\",\n );\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport type Database from \"better-sqlite3\";\nimport { openDatabase, migrate } from \"@arcbridge/core\";\nimport type { ServerContext } from \"./context.js\";\n\nexport function ensureDb(\n ctx: ServerContext,\n targetDir: string,\n): Database.Database | null {\n if (ctx.db) return ctx.db;\n\n const dbPath = join(targetDir, \".arcbridge\", \"index.db\");\n if (!existsSync(dbPath)) {\n return null;\n }\n\n ctx.db = openDatabase(dbPath);\n migrate(ctx.db);\n ctx.projectRoot = targetDir;\n return ctx.db;\n}\n\nexport function notInitialized() {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"ArcBridge is not initialized in this directory. Run `arcbridge_init_project` first.\",\n },\n ],\n };\n}\n\nexport function textResult(text: string) {\n return {\n content: [{ type: \"text\" as const, text }],\n };\n}\n\n/**\n * Escape SQL LIKE wildcards (%, _) in user-provided values.\n */\nexport function escapeLike(value: string): string {\n return value.replace(/%/g, \"\\\\%\").replace(/_/g, \"\\\\_\");\n}\n\n/**\n * Safely parse a JSON string from a database column.\n * Returns the fallback value if parsing fails.\n */\nexport function safeParseJson<T>(value: string | null, fallback: T): T {\n if (value === null || value === undefined) return fallback;\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Normalize a code_path glob pattern to a plain prefix for matching.\n * Strips trailing glob patterns: \"src/lib/**\" → \"src/lib/\", \"src/lib/*\" → \"src/lib/\"\n */\nexport function normalizeCodePath(codePath: string): string {\n return codePath.replace(/\\*+\\/?$/, \"\");\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, safeParseJson } from \"../helpers.js\";\n\ninterface BlockRow {\n id: string;\n name: string;\n level: number;\n parent_id: string | null;\n responsibility: string;\n code_paths: string;\n interfaces: string;\n service: string;\n last_synced: string | null;\n}\n\ninterface ScenarioLinkRow {\n id: string;\n name: string;\n category: string;\n status: string;\n}\n\nexport function registerGetBuildingBlocks(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_building_blocks\",\n \"Get all architecture building blocks with their code mappings, responsibilities, and linked quality scenarios.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const blocks = db\n .prepare(\n \"SELECT id, name, level, parent_id, responsibility, code_paths, interfaces, service, last_synced FROM building_blocks ORDER BY level, name\",\n )\n .all() as BlockRow[];\n\n if (blocks.length === 0) {\n return {\n content: [\n { type: \"text\" as const, text: \"No building blocks defined yet.\" },\n ],\n };\n }\n\n const lines: string[] = [\"# Building Blocks\", \"\"];\n\n for (const block of blocks) {\n const indent = \" \".repeat(block.level - 1);\n const codePaths = safeParseJson<string[]>(block.code_paths, []);\n const interfaces = safeParseJson<string[]>(block.interfaces, []);\n\n lines.push(`${indent}## ${block.name} (\\`${block.id}\\`)`);\n lines.push(\"\");\n lines.push(`${indent}**Responsibility:** ${block.responsibility}`);\n lines.push(`${indent}**Service:** ${block.service}`);\n\n if (codePaths.length > 0) {\n lines.push(\n `${indent}**Code:** ${codePaths.map((p) => `\\`${p}\\``).join(\", \")}`,\n );\n }\n\n if (interfaces.length > 0) {\n lines.push(\n `${indent}**Interfaces:** ${interfaces.map((i) => `\\`${i}\\``).join(\", \")}`,\n );\n }\n\n if (block.parent_id) {\n lines.push(`${indent}**Parent:** \\`${block.parent_id}\\``);\n }\n\n // Linked quality scenarios\n const scenarios = db\n .prepare(\n \"SELECT id, name, category, status FROM quality_scenarios WHERE linked_blocks LIKE ?\",\n )\n .all(`%\"${block.id}\"%`) as ScenarioLinkRow[];\n\n if (scenarios.length > 0) {\n lines.push(`${indent}**Quality Scenarios:**`);\n for (const s of scenarios) {\n lines.push(\n `${indent}- ${s.id}: ${s.name} [${s.category}] (${s.status})`,\n );\n }\n }\n\n lines.push(\"\");\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, safeParseJson, escapeLike, normalizeCodePath } from \"../helpers.js\";\n\ninterface BlockRow {\n id: string;\n name: string;\n level: number;\n parent_id: string | null;\n description: string | null;\n responsibility: string;\n code_paths: string;\n interfaces: string;\n service: string;\n last_synced: string | null;\n}\n\ninterface ChildRow {\n id: string;\n name: string;\n responsibility: string;\n}\n\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n priority: string;\n status: string;\n scenario: string;\n expected: string;\n}\n\ninterface AdrRow {\n id: string;\n title: string;\n status: string;\n date: string;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n phase_id: string;\n}\n\nexport function registerGetBuildingBlock(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_building_block\",\n \"Get detailed information about a single building block: its arc42 description, code modules, interfaces, quality scenarios, ADRs, and tasks.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n block_id: z\n .string()\n .describe(\"Building block ID (e.g., 'auth-module')\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const block = db\n .prepare(\"SELECT * FROM building_blocks WHERE id = ?\")\n .get(params.block_id) as BlockRow | undefined;\n\n if (!block) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Building block '${params.block_id}' not found. Use \\`arcbridge_get_building_blocks\\` to see all blocks.`,\n },\n ],\n };\n }\n\n const codePaths = safeParseJson<string[]>(block.code_paths, []);\n const interfaces = safeParseJson<string[]>(block.interfaces, []);\n const escapedBlockId = escapeLike(block.id);\n\n const lines: string[] = [\n `# ${block.name} (\\`${block.id}\\`)`,\n \"\",\n `**Responsibility:** ${block.responsibility}`,\n `**Level:** ${block.level}`,\n `**Service:** ${block.service}`,\n ];\n\n if (block.parent_id) {\n lines.push(`**Parent:** \\`${block.parent_id}\\``);\n }\n\n if (block.last_synced) {\n lines.push(`**Last synced:** ${block.last_synced}`);\n }\n\n // Code paths\n lines.push(\"\", \"## Code Paths\", \"\");\n if (codePaths.length > 0) {\n for (const p of codePaths) {\n lines.push(`- \\`${p}\\``);\n }\n } else {\n lines.push(\"*No code paths mapped yet.*\");\n }\n\n // Mapped symbols (query symbols matching code_paths)\n if (codePaths.length > 0) {\n const pathConditions = codePaths.map(() => \"file_path LIKE ? ESCAPE '\\\\'\");\n const pathParams = codePaths.map((cp) => {\n const prefix = normalizeCodePath(cp);\n return `${escapeLike(prefix)}%`;\n });\n\n const symbolQuery = `\n SELECT name, kind, file_path, is_exported\n FROM symbols\n WHERE (${pathConditions.join(\" OR \")})\n ORDER BY file_path, name\n LIMIT 30\n `;\n const mappedSymbols = db.prepare(symbolQuery).all(...pathParams) as {\n name: string;\n kind: string;\n file_path: string;\n is_exported: number;\n }[];\n\n if (mappedSymbols.length > 0) {\n const totalCount = db\n .prepare(\n `SELECT COUNT(*) as count FROM symbols WHERE (${pathConditions.join(\" OR \")})`,\n )\n .get(...pathParams) as { count: number };\n\n lines.push(\"\", `## Mapped Symbols (${totalCount.count} total)`, \"\");\n\n // Group by kind for summary\n const byKind = new Map<string, number>();\n for (const s of mappedSymbols) {\n byKind.set(s.kind, (byKind.get(s.kind) ?? 0) + 1);\n }\n lines.push(\n [...byKind.entries()].map(([k, c]) => `**${c}** ${k}s`).join(\", \"),\n \"\",\n );\n\n for (const s of mappedSymbols) {\n const exported = s.is_exported ? \"\" : \" (internal)\";\n lines.push(`- \\`${s.file_path}\\` → **${s.name}** (${s.kind})${exported}`);\n }\n if (totalCount.count > 30) {\n lines.push(`- *... and ${totalCount.count - 30} more*`);\n }\n }\n }\n\n // Interfaces\n if (interfaces.length > 0) {\n lines.push(\"\", \"## Interfaces\", \"\");\n for (const i of interfaces) {\n lines.push(`- \\`${i}\\``);\n }\n }\n\n // Child blocks\n const children = db\n .prepare(\n \"SELECT id, name, responsibility FROM building_blocks WHERE parent_id = ?\",\n )\n .all(params.block_id) as ChildRow[];\n\n if (children.length > 0) {\n lines.push(\"\", \"## Sub-blocks\", \"\");\n for (const child of children) {\n lines.push(`- **${child.name}** (\\`${child.id}\\`): ${child.responsibility}`);\n }\n }\n\n // Quality scenarios (linked via JSON array in linked_blocks)\n const scenarios = db\n .prepare(\n \"SELECT id, name, category, priority, status, scenario, expected FROM quality_scenarios WHERE linked_blocks LIKE ? ESCAPE '\\\\'\",\n )\n .all(`%\"${escapedBlockId}\"%`) as ScenarioRow[];\n\n if (scenarios.length > 0) {\n lines.push(\"\", \"## Quality Scenarios\", \"\");\n for (const s of scenarios) {\n lines.push(\n `### ${s.id}: ${s.name} [${s.category}]`,\n `- **Priority:** ${s.priority}`,\n `- **Status:** ${s.status}`,\n `- **Scenario:** ${s.scenario}`,\n `- **Expected:** ${s.expected}`,\n \"\",\n );\n }\n }\n\n // ADRs affecting this block\n const adrs = db\n .prepare(\n \"SELECT id, title, status, date FROM adrs WHERE affected_blocks LIKE ? ESCAPE '\\\\'\",\n )\n .all(`%\"${escapedBlockId}\"%`) as AdrRow[];\n\n if (adrs.length > 0) {\n lines.push(\"\", \"## Related ADRs\", \"\");\n for (const adr of adrs) {\n lines.push(`- **${adr.id}:** ${adr.title} (${adr.status}, ${adr.date})`);\n }\n }\n\n // Tasks assigned to this block\n const tasks = db\n .prepare(\n \"SELECT id, title, status, phase_id FROM tasks WHERE building_block = ?\",\n )\n .all(params.block_id) as TaskRow[];\n\n if (tasks.length > 0) {\n lines.push(\"\", \"## Tasks\", \"\");\n for (const task of tasks) {\n const check =\n task.status === \"done\"\n ? \"[x]\"\n : task.status === \"in-progress\"\n ? \"[>]\"\n : \"[ ]\";\n lines.push(`- ${check} ${task.id}: ${task.title} (${task.status})`);\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { QualityCategorySchema, QualityPrioritySchema, QualityScenarioStatusSchema } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, safeParseJson } from \"../helpers.js\";\n\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n scenario: string;\n expected: string;\n priority: string;\n linked_code: string;\n linked_tests: string;\n linked_blocks: string;\n verification: string;\n status: string;\n}\n\nexport function registerGetQualityScenarios(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_quality_scenarios\",\n \"Get quality scenarios, optionally filtered by category. Shows scenario details, linked code/tests, and current status.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n category: QualityCategorySchema.optional().describe(\"Filter by category\"),\n status: QualityScenarioStatusSchema.optional().describe(\"Filter by status\"),\n priority: QualityPrioritySchema.optional().describe(\"Filter by priority (must/should/could)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n let query =\n \"SELECT id, name, category, scenario, expected, priority, linked_code, linked_tests, linked_blocks, verification, status FROM quality_scenarios\";\n const conditions: string[] = [];\n const queryParams: string[] = [];\n\n if (params.category) {\n conditions.push(\"category = ?\");\n queryParams.push(params.category);\n }\n if (params.status) {\n conditions.push(\"status = ?\");\n queryParams.push(params.status);\n }\n if (params.priority) {\n conditions.push(\"priority = ?\");\n queryParams.push(params.priority);\n }\n\n if (conditions.length > 0) {\n query += \" WHERE \" + conditions.join(\" AND \");\n }\n query += \" ORDER BY category, id\";\n\n const scenarios = db.prepare(query).all(...queryParams) as ScenarioRow[];\n\n if (scenarios.length === 0) {\n const filter = [params.category, params.status, params.priority]\n .filter(Boolean)\n .join(\", \");\n return {\n content: [\n {\n type: \"text\" as const,\n text: filter\n ? `No quality scenarios found matching: ${filter}`\n : \"No quality scenarios defined yet.\",\n },\n ],\n };\n }\n\n // Group by category\n const byCategory = new Map<string, ScenarioRow[]>();\n for (const s of scenarios) {\n const list = byCategory.get(s.category) ?? [];\n list.push(s);\n byCategory.set(s.category, list);\n }\n\n const statusIcon = (s: string) =>\n s === \"passing\"\n ? \"PASS\"\n : s === \"failing\"\n ? \"FAIL\"\n : s === \"partial\"\n ? \"PARTIAL\"\n : \"UNTESTED\";\n\n const lines: string[] = [\"# Quality Scenarios\", \"\"];\n\n // Summary\n const passing = scenarios.filter((s) => s.status === \"passing\").length;\n const failing = scenarios.filter((s) => s.status === \"failing\").length;\n const untested = scenarios.filter((s) => s.status === \"untested\").length;\n const partial = scenarios.filter((s) => s.status === \"partial\").length;\n lines.push(\n `**Total:** ${scenarios.length} | **Passing:** ${passing} | **Failing:** ${failing} | **Untested:** ${untested} | **Partial:** ${partial}`,\n \"\",\n );\n\n for (const [category, items] of byCategory) {\n lines.push(\n `## ${category.charAt(0).toUpperCase() + category.slice(1)}`,\n \"\",\n );\n\n for (const s of items) {\n const linkedCode = safeParseJson<string[]>(s.linked_code, []);\n const linkedTests = safeParseJson<string[]>(s.linked_tests, []);\n const linkedBlocks = safeParseJson<string[]>(s.linked_blocks, []);\n\n lines.push(\n `### ${statusIcon(s.status)} ${s.id}: ${s.name}`,\n \"\",\n `- **Priority:** ${s.priority}`,\n `- **Verification:** ${s.verification}`,\n `- **Scenario:** ${s.scenario}`,\n `- **Expected:** ${s.expected}`,\n );\n\n if (linkedCode.length > 0) {\n lines.push(\n `- **Linked code:** ${linkedCode.map((c) => `\\`${c}\\``).join(\", \")}`,\n );\n }\n if (linkedTests.length > 0) {\n lines.push(\n `- **Linked tests:** ${linkedTests.map((t) => `\\`${t}\\``).join(\", \")}`,\n );\n }\n if (linkedBlocks.length > 0) {\n lines.push(\n `- **Linked blocks:** ${linkedBlocks.map((b) => `\\`${b}\\``).join(\", \")}`,\n );\n }\n lines.push(\"\");\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { refreshFromDocs } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, safeParseJson } from \"../helpers.js\";\n\ninterface PhaseRow {\n id: string;\n name: string;\n phase_number: number;\n status: string;\n description: string;\n gate_status: string;\n started_at: string | null;\n completed_at: string | null;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n building_block: string | null;\n quality_scenarios: string;\n acceptance_criteria: string;\n}\n\nexport function registerGetPhasePlan(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_phase_plan\",\n \"Get the complete phase plan with all phases, their tasks, status, and gate requirements.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Refresh DB from docs to pick up any YAML edits\n refreshFromDocs(db, params.target_dir);\n\n const phases = db\n .prepare(\n \"SELECT id, name, phase_number, status, description, gate_status, started_at, completed_at FROM phases ORDER BY phase_number\",\n )\n .all() as PhaseRow[];\n\n if (phases.length === 0) {\n return {\n content: [\n { type: \"text\" as const, text: \"No phases defined yet.\" },\n ],\n };\n }\n\n const lines: string[] = [\"# Phase Plan\", \"\"];\n\n for (const phase of phases) {\n const icon =\n phase.status === \"complete\"\n ? \"[x]\"\n : phase.status === \"in-progress\"\n ? \"[>]\"\n : phase.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n\n lines.push(\n `## ${icon} Phase ${phase.phase_number}: ${phase.name}`,\n \"\",\n `**Status:** ${phase.status}`,\n `**Description:** ${phase.description}`,\n );\n\n if (phase.started_at) {\n lines.push(`**Started:** ${phase.started_at}`);\n }\n if (phase.completed_at) {\n lines.push(`**Completed:** ${phase.completed_at}`);\n }\n\n // Tasks for this phase\n const tasks = db\n .prepare(\n \"SELECT id, title, status, building_block, quality_scenarios, acceptance_criteria FROM tasks WHERE phase_id = ? ORDER BY id\",\n )\n .all(phase.id) as TaskRow[];\n\n if (tasks.length > 0) {\n const done = tasks.filter((t) => t.status === \"done\").length;\n lines.push(\n \"\",\n `### Tasks (${done}/${tasks.length} complete)`,\n \"\",\n );\n\n for (const task of tasks) {\n const check =\n task.status === \"done\"\n ? \"[x]\"\n : task.status === \"in-progress\"\n ? \"[>]\"\n : task.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n\n lines.push(`- ${check} **${task.id}:** ${task.title}`);\n\n if (task.building_block) {\n lines.push(` - Block: \\`${task.building_block}\\``);\n }\n\n const qScenarios = safeParseJson<string[]>(task.quality_scenarios, []);\n if (qScenarios.length > 0) {\n lines.push(\n ` - Quality: ${qScenarios.join(\", \")}`,\n );\n }\n\n const criteria = safeParseJson<string[]>(task.acceptance_criteria, []);\n if (criteria.length > 0) {\n for (const c of criteria) {\n lines.push(` - [ ] ${c}`);\n }\n }\n }\n }\n\n lines.push(\"\");\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { refreshFromDocs } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, safeParseJson } from \"../helpers.js\";\n\ninterface TaskRow {\n id: string;\n phase_id: string;\n title: string;\n description: string | null;\n status: string;\n building_block: string | null;\n quality_scenarios: string;\n acceptance_criteria: string;\n}\n\ninterface PhaseRow {\n id: string;\n name: string;\n}\n\nexport function registerGetCurrentTasks(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_current_tasks\",\n \"Get tasks for the current in-progress phase, with their building blocks, quality scenarios, and acceptance criteria.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n status: z\n .enum([\"todo\", \"in-progress\", \"done\", \"blocked\"])\n .optional()\n .describe(\"Filter tasks by status\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Refresh DB from docs to pick up any YAML edits\n refreshFromDocs(db, params.target_dir);\n\n // Find current phase\n const currentPhase = db\n .prepare(\n \"SELECT id, name FROM phases WHERE status = 'in-progress' ORDER BY phase_number LIMIT 1\",\n )\n .get() as PhaseRow | undefined;\n\n if (!currentPhase) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"No phase is currently in-progress. Use `arcbridge_get_phase_plan` to see all phases.\",\n },\n ],\n };\n }\n\n let query =\n \"SELECT id, phase_id, title, description, status, building_block, quality_scenarios, acceptance_criteria FROM tasks WHERE phase_id = ?\";\n const queryParams: string[] = [currentPhase.id];\n\n if (params.status) {\n query += \" AND status = ?\";\n queryParams.push(params.status);\n }\n\n query += \" ORDER BY id\";\n\n const tasks = db.prepare(query).all(...queryParams) as TaskRow[];\n\n const lines: string[] = [\n `# Current Tasks: ${currentPhase.name}`,\n \"\",\n ];\n\n if (tasks.length === 0) {\n lines.push(\n params.status\n ? `No tasks with status '${params.status}' in this phase.`\n : \"No tasks in this phase.\",\n );\n } else {\n const done = tasks.filter((t) => t.status === \"done\").length;\n lines.push(`**Progress:** ${done}/${tasks.length} complete`, \"\");\n\n for (const task of tasks) {\n const check =\n task.status === \"done\"\n ? \"[x]\"\n : task.status === \"in-progress\"\n ? \"[>]\"\n : task.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n\n lines.push(`## ${check} ${task.id}: ${task.title}`, \"\");\n lines.push(`**Status:** ${task.status}`);\n\n if (task.building_block) {\n lines.push(`**Building block:** \\`${task.building_block}\\``);\n }\n\n const qScenarios = safeParseJson<string[]>(task.quality_scenarios, []);\n if (qScenarios.length > 0) {\n lines.push(\n `**Quality scenarios:** ${qScenarios.join(\", \")}`,\n );\n }\n\n const criteria = safeParseJson<string[]>(task.acceptance_criteria, []);\n if (criteria.length > 0) {\n lines.push(\"\", \"**Acceptance criteria:**\");\n for (const c of criteria) {\n lines.push(\n `- ${task.status === \"done\" ? \"[x]\" : \"[ ]\"} ${c}`,\n );\n }\n }\n\n lines.push(\"\");\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { syncTaskToYaml } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized } from \"../helpers.js\";\nimport { autoRecord } from \"../auto-record.js\";\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n phase_id: string;\n}\n\nexport function registerUpdateTask(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_update_task\",\n \"Update a task's status. Use this to mark tasks as in-progress, done, or blocked as you work.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n task_id: z.string().describe(\"Task ID (e.g., 'task-0.1-init-nextjs')\"),\n status: z\n .enum([\"in-progress\", \"done\", \"blocked\"])\n .describe(\"New status\"),\n notes: z\n .string()\n .optional()\n .describe(\"Optional notes about the status change\"),\n },\n async (params) => {\n const start = Date.now();\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Check task exists\n const task = db\n .prepare(\"SELECT id, title, status, phase_id FROM tasks WHERE id = ?\")\n .get(params.task_id) as TaskRow | undefined;\n\n if (!task) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Task '${params.task_id}' not found. Use \\`arcbridge_get_current_tasks\\` to see available tasks.`,\n },\n ],\n };\n }\n\n const oldStatus = task.status;\n const now = new Date().toISOString();\n\n // Update status in DB\n if (params.status === \"done\") {\n db.prepare(\n \"UPDATE tasks SET status = ?, completed_at = ? WHERE id = ?\",\n ).run(params.status, now, params.task_id);\n } else {\n db.prepare(\"UPDATE tasks SET status = ? WHERE id = ?\").run(\n params.status,\n params.task_id,\n );\n }\n\n // Write back to YAML\n syncTaskToYaml(\n params.target_dir,\n task.phase_id,\n params.task_id,\n params.status,\n params.status === \"done\" ? now : null,\n );\n\n const lines: string[] = [\n `Task **${task.id}** updated: ${oldStatus} → ${params.status}`,\n \"\",\n `**${task.title}**`,\n ];\n\n if (params.notes) {\n lines.push(\"\", `**Notes:** ${params.notes}`);\n }\n\n // If task is done, show phase progress\n if (params.status === \"done\") {\n const phaseStats = db\n .prepare(\n \"SELECT COUNT(*) as total, SUM(CASE WHEN status = 'done' THEN 1 ELSE 0 END) as done FROM tasks WHERE phase_id = ?\",\n )\n .get(task.phase_id) as { total: number; done: number };\n\n lines.push(\n \"\",\n `**Phase progress:** ${phaseStats.done}/${phaseStats.total} tasks complete`,\n );\n\n if (phaseStats.done === phaseStats.total) {\n lines.push(\n \"\",\n \"All tasks in this phase are complete! The phase is ready to advance.\",\n );\n }\n }\n\n autoRecord(db, params.target_dir, {\n toolName: \"arcbridge_update_task\",\n action: `${task.id}: ${oldStatus} → ${params.status}`,\n taskId: params.task_id,\n phaseId: task.phase_id,\n durationMs: Date.now() - start,\n });\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import type Database from \"better-sqlite3\";\nimport { loadConfig, insertActivity } from \"@arcbridge/core\";\n\n// Cache config per project root to avoid reading YAML on every tool call\nconst configCache = new Map<string, { autoRecord: boolean; loadedAt: number }>();\nconst CACHE_TTL_MS = 30_000; // 30 seconds\n\nfunction isAutoRecordEnabled(projectRoot: string): boolean {\n const cached = configCache.get(projectRoot);\n if (cached && Date.now() - cached.loadedAt < CACHE_TTL_MS) {\n return cached.autoRecord;\n }\n\n const { config } = loadConfig(projectRoot);\n const autoRecord = config?.metrics?.auto_record ?? false;\n configCache.set(projectRoot, { autoRecord, loadedAt: Date.now() });\n return autoRecord;\n}\n\n/**\n * Auto-record agent activity if metrics.auto_record is enabled in config.\n * Call at the end of key MCP tool handlers. No-op if disabled or config missing.\n */\nexport function autoRecord(\n db: Database.Database,\n projectRoot: string,\n params: {\n toolName: string;\n action?: string;\n taskId?: string;\n phaseId?: string;\n durationMs?: number;\n driftCount?: number;\n driftErrors?: number;\n testPassCount?: number;\n testFailCount?: number;\n lintClean?: boolean;\n typecheckClean?: boolean;\n },\n): void {\n try {\n if (!isAutoRecordEnabled(projectRoot)) return;\n\n insertActivity(db, {\n toolName: params.toolName,\n action: params.action,\n taskId: params.taskId,\n phaseId: params.phaseId,\n durationMs: params.durationMs,\n driftCount: params.driftCount,\n driftErrors: params.driftErrors,\n testPassCount: params.testPassCount,\n testFailCount: params.testFailCount,\n lintClean: params.lintClean,\n typecheckClean: params.typecheckClean,\n });\n } catch {\n // Never let metrics recording break the actual tool\n }\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { addTaskToYaml } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized } from \"../helpers.js\";\n\nexport function registerCreateTask(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_create_task\",\n \"Create a new task in a phase. Links it to a building block and quality scenarios.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n phase_id: z.string().describe(\"Phase ID to add the task to\"),\n title: z.string().min(1).describe(\"Task title\"),\n building_block: z\n .string()\n .optional()\n .describe(\"Building block this task belongs to\"),\n quality_scenarios: z\n .array(z.string())\n .default([])\n .describe(\"Quality scenario IDs this task addresses\"),\n acceptance_criteria: z\n .array(z.string())\n .default([])\n .describe(\"Acceptance criteria for this task\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Verify phase exists\n const phase = db\n .prepare(\"SELECT id, name, phase_number FROM phases WHERE id = ?\")\n .get(params.phase_id) as\n | { id: string; name: string; phase_number: number }\n | undefined;\n\n if (!phase) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Phase '${params.phase_id}' not found. Use \\`arcbridge_get_phase_plan\\` to see phases.`,\n },\n ],\n };\n }\n\n // Generate task ID\n const existingCount = (\n db\n .prepare(\n \"SELECT COUNT(*) as count FROM tasks WHERE phase_id = ?\",\n )\n .get(params.phase_id) as { count: number }\n ).count;\n\n const taskNum = existingCount + 1;\n const slug = params.title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 30);\n const taskId = `task-${phase.phase_number}.${taskNum}-${slug}`;\n\n const now = new Date().toISOString();\n\n db.prepare(\n \"INSERT INTO tasks (id, phase_id, title, description, status, building_block, quality_scenarios, acceptance_criteria, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\",\n ).run(\n taskId,\n params.phase_id,\n params.title,\n null,\n \"todo\",\n params.building_block ?? null,\n JSON.stringify(params.quality_scenarios),\n JSON.stringify(params.acceptance_criteria),\n now,\n );\n\n // Write back to YAML\n addTaskToYaml(params.target_dir, params.phase_id, {\n id: taskId,\n title: params.title,\n status: \"todo\",\n building_block: params.building_block,\n quality_scenarios: params.quality_scenarios,\n acceptance_criteria: params.acceptance_criteria,\n });\n\n const lines = [\n `Task created: **${taskId}**`,\n \"\",\n `**Title:** ${params.title}`,\n `**Phase:** ${phase.name}`,\n `**Status:** todo`,\n ];\n\n if (params.building_block) {\n lines.push(`**Block:** \\`${params.building_block}\\``);\n }\n if (params.quality_scenarios.length > 0) {\n lines.push(\n `**Quality scenarios:** ${params.quality_scenarios.join(\", \")}`,\n );\n }\n if (params.acceptance_criteria.length > 0) {\n lines.push(\"\", \"**Acceptance criteria:**\");\n for (const c of params.acceptance_criteria) {\n lines.push(`- [ ] ${c}`);\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, safeParseJson, escapeLike } from \"../helpers.js\";\n\ninterface AdrRow {\n id: string;\n title: string;\n status: string;\n date: string;\n context: string | null;\n decision: string | null;\n consequences: string | null;\n affected_blocks: string;\n affected_files: string;\n quality_scenarios: string;\n}\n\nexport function registerGetRelevantAdrs(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_relevant_adrs\",\n \"Get architectural decision records (ADRs) relevant to a specific file path or building block.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n file_path: z\n .string()\n .optional()\n .describe(\"File path to find relevant ADRs for\"),\n building_block: z\n .string()\n .optional()\n .describe(\"Building block ID to find relevant ADRs for\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n if (!params.file_path && !params.building_block) {\n // Return all ADRs\n const adrs = db\n .prepare(\n \"SELECT id, title, status, date, context, decision, consequences, affected_blocks, affected_files, quality_scenarios FROM adrs ORDER BY id\",\n )\n .all() as AdrRow[];\n\n return formatAdrs(adrs, \"All ADRs\");\n }\n\n const adrs: AdrRow[] = [];\n const seen = new Set<string>();\n\n // Search by building block\n if (params.building_block) {\n const blockAdrs = db\n .prepare(\n \"SELECT id, title, status, date, context, decision, consequences, affected_blocks, affected_files, quality_scenarios FROM adrs WHERE affected_blocks LIKE ? ESCAPE '\\\\'\",\n )\n .all(`%\"${escapeLike(params.building_block)}\"%`) as AdrRow[];\n\n for (const adr of blockAdrs) {\n if (!seen.has(adr.id)) {\n adrs.push(adr);\n seen.add(adr.id);\n }\n }\n }\n\n // Search by file path\n if (params.file_path) {\n const fileAdrs = db\n .prepare(\n \"SELECT id, title, status, date, context, decision, consequences, affected_blocks, affected_files, quality_scenarios FROM adrs WHERE affected_files LIKE ? ESCAPE '\\\\'\",\n )\n .all(`%${escapeLike(params.file_path)}%`) as AdrRow[];\n\n for (const adr of fileAdrs) {\n if (!seen.has(adr.id)) {\n adrs.push(adr);\n seen.add(adr.id);\n }\n }\n }\n\n const scope = [\n params.file_path ? `file: ${params.file_path}` : \"\",\n params.building_block ? `block: ${params.building_block}` : \"\",\n ]\n .filter(Boolean)\n .join(\", \");\n\n return formatAdrs(adrs, `ADRs for ${scope}`);\n },\n );\n}\n\nfunction formatAdrs(adrs: AdrRow[], title: string) {\n if (adrs.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No ADRs found for the specified scope.`,\n },\n ],\n };\n }\n\n const lines: string[] = [`# ${title}`, \"\"];\n\n for (const adr of adrs) {\n const affectedBlocks = safeParseJson<string[]>(adr.affected_blocks, []);\n const affectedFiles = safeParseJson<string[]>(adr.affected_files, []);\n\n lines.push(\n `## ${adr.id}: ${adr.title}`,\n \"\",\n `**Status:** ${adr.status} | **Date:** ${adr.date}`,\n );\n\n if (affectedBlocks.length > 0) {\n lines.push(\n `**Affected blocks:** ${affectedBlocks.map((b) => `\\`${b}\\``).join(\", \")}`,\n );\n }\n if (affectedFiles.length > 0) {\n lines.push(\n `**Affected files:** ${affectedFiles.map((f) => `\\`${f}\\``).join(\", \")}`,\n );\n }\n\n if (adr.decision) {\n lines.push(\"\", adr.decision);\n }\n\n lines.push(\"\");\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { indexProject, refreshFromDocs } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\nimport { autoRecord } from \"../auto-record.js\";\n\nexport function registerReindex(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_reindex\",\n \"Re-index the project: refreshes architecture docs from arc42/YAML files, then reindexes code symbols (TypeScript & C#/.NET). This is the first step of the sync pipeline — use it to pick up manual doc edits and code changes.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n tsconfig_path: z\n .string()\n .optional()\n .describe(\"Override tsconfig.json path (default: auto-detect). Only used for TypeScript projects.\"),\n service: z\n .string()\n .optional()\n .describe(\"Service name for monorepo projects (default: 'main')\"),\n language: z\n .enum([\"typescript\", \"csharp\", \"auto\"])\n .optional()\n .describe(\"Project language. 'auto' detects from project files (default: 'auto')\"),\n },\n async (params) => {\n const start = Date.now();\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n try {\n // Refresh architecture docs into DB first (picks up manual edits)\n const docWarnings = refreshFromDocs(db, params.target_dir);\n\n const result = await indexProject(db, {\n projectRoot: params.target_dir,\n tsconfigPath: params.tsconfig_path,\n service: params.service,\n language: params.language,\n });\n\n const lines = [\n \"# Indexing Complete\",\n \"\",\n `- **Docs refreshed:** ${docWarnings.length === 0 ? \"OK\" : docWarnings.join(\", \")}`,\n `- **Files processed:** ${result.filesProcessed}`,\n `- **Files skipped (unchanged):** ${result.filesSkipped}`,\n `- **Files removed:** ${result.filesRemoved}`,\n `- **Symbols indexed:** ${result.symbolsIndexed}`,\n `- **Dependencies indexed:** ${result.dependenciesIndexed}`,\n `- **Components analyzed:** ${result.componentsAnalyzed}`,\n `- **Routes analyzed:** ${result.routesAnalyzed}`,\n `- **Duration:** ${result.durationMs}ms`,\n ];\n\n autoRecord(db, params.target_dir, {\n toolName: \"arcbridge_reindex\",\n action: `${result.symbolsIndexed} symbols, ${result.filesProcessed} files`,\n durationMs: Date.now() - start,\n });\n\n return textResult(lines.join(\"\\n\"));\n } catch (err) {\n const message =\n err instanceof Error ? err.message : String(err);\n return textResult(`Indexing failed: ${message}`);\n }\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, escapeLike } from \"../helpers.js\";\n\ninterface SymbolRow {\n id: string;\n name: string;\n qualified_name: string;\n kind: string;\n file_path: string;\n start_line: number;\n signature: string | null;\n return_type: string | null;\n is_exported: number;\n is_async: number;\n doc_comment: string | null;\n}\n\nexport function registerSearchSymbols(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_search_symbols\",\n \"Search code symbols by name, kind, file path, or building block. Supports TypeScript and C#. Returns matching symbols with type signatures.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n query: z\n .string()\n .optional()\n .describe(\"Search term to match against symbol names\"),\n service: z\n .string()\n .optional()\n .describe(\"Filter by service name (for multi-project solutions). Omit to search all services.\"),\n kind: z\n .enum([\n \"function\",\n \"class\",\n \"type\",\n \"constant\",\n \"interface\",\n \"enum\",\n \"variable\",\n \"component\",\n \"hook\",\n \"context\",\n ])\n .optional()\n .describe(\"Filter by symbol kind\"),\n file_path: z\n .string()\n .optional()\n .describe(\"Filter by file path (prefix match)\"),\n is_exported: z\n .boolean()\n .optional()\n .describe(\"Filter by export status\"),\n building_block: z\n .string()\n .optional()\n .describe(\"Filter by building block ID (matches against code_paths)\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(200)\n .default(50)\n .describe(\"Maximum results to return (default: 50)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const conditions: string[] = [];\n const queryParams: (string | number)[] = [];\n\n if (params.service) {\n conditions.push(\"s.service = ?\");\n queryParams.push(params.service);\n }\n\n if (params.query) {\n conditions.push(\"s.name LIKE ? ESCAPE '\\\\'\");\n queryParams.push(`%${escapeLike(params.query)}%`);\n }\n\n if (params.kind) {\n conditions.push(\"s.kind = ?\");\n queryParams.push(params.kind);\n }\n\n if (params.file_path) {\n conditions.push(\"s.file_path LIKE ? ESCAPE '\\\\'\");\n queryParams.push(`${escapeLike(params.file_path)}%`);\n }\n\n if (params.is_exported !== undefined) {\n conditions.push(\"s.is_exported = ?\");\n queryParams.push(params.is_exported ? 1 : 0);\n }\n\n // Building block filter: match symbol file_path against block code_paths\n if (params.building_block) {\n const block = db\n .prepare(\"SELECT code_paths FROM building_blocks WHERE id = ?\")\n .get(params.building_block) as { code_paths: string } | undefined;\n\n if (block) {\n try {\n const codePaths = JSON.parse(block.code_paths) as string[];\n if (codePaths.length > 0) {\n const pathConditions = codePaths.map(() => \"s.file_path LIKE ? ESCAPE '\\\\'\");\n conditions.push(`(${pathConditions.join(\" OR \")})`);\n for (const cp of codePaths) {\n // Convert glob-like paths to LIKE prefix: \"src/lib/auth/\" → \"src/lib/auth/%\"\n const prefix = cp.replace(/\\*\\*?\\/?\\*?$/, \"\");\n queryParams.push(`${escapeLike(prefix)}%`);\n }\n }\n } catch {\n // Ignore malformed code_paths\n }\n }\n }\n\n let query =\n \"SELECT s.id, s.name, s.qualified_name, s.kind, s.file_path, s.start_line, s.signature, s.return_type, s.is_exported, s.is_async, s.doc_comment FROM symbols s\";\n\n if (conditions.length > 0) {\n query += \" WHERE \" + conditions.join(\" AND \");\n }\n\n query += \" ORDER BY s.name LIMIT ?\";\n queryParams.push(params.limit);\n\n const rows = db.prepare(query).all(...queryParams) as SymbolRow[];\n\n if (rows.length === 0) {\n return textResult(\"No symbols found matching the search criteria.\");\n }\n\n const lines: string[] = [\n `# Symbol Search Results (${rows.length}${rows.length === params.limit ? \"+\" : \"\"})`,\n \"\",\n ];\n\n for (const s of rows) {\n const flags = [\n s.is_exported ? \"exported\" : \"internal\",\n s.is_async ? \"async\" : \"\",\n ]\n .filter(Boolean)\n .join(\", \");\n\n lines.push(\n `## \\`${s.qualified_name}\\` (${s.kind})`,\n \"\",\n `- **ID:** \\`${s.id}\\``,\n `- **Location:** \\`${s.file_path}:${s.start_line}\\``,\n `- **Flags:** ${flags}`,\n );\n\n if (s.signature) {\n lines.push(`- **Signature:** \\`${s.signature}\\``);\n }\n if (s.return_type) {\n lines.push(`- **Returns:** \\`${s.return_type}\\``);\n }\n if (s.doc_comment) {\n lines.push(`- **Docs:** ${s.doc_comment}`);\n }\n\n lines.push(\"\");\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson } from \"../helpers.js\";\n\ninterface SymbolRow {\n id: string;\n name: string;\n qualified_name: string;\n kind: string;\n file_path: string;\n start_line: number;\n end_line: number;\n start_col: number;\n end_col: number;\n signature: string | null;\n return_type: string | null;\n doc_comment: string | null;\n is_exported: number;\n is_async: number;\n service: string;\n content_hash: string;\n indexed_at: string;\n}\n\ninterface DepRow {\n symbol_id: string;\n symbol_name: string;\n kind: string;\n file_path: string;\n}\n\nexport function registerGetSymbol(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_symbol\",\n \"Get detailed information about a specific TypeScript symbol including its source code, type signature, and relationships.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n symbol_id: z\n .string()\n .describe(\n \"Symbol ID (e.g. 'src/utils.ts::formatName#function')\",\n ),\n include_source: z\n .boolean()\n .default(true)\n .describe(\"Include source code snippet (default: true)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const symbol = db\n .prepare(\"SELECT * FROM symbols WHERE id = ?\")\n .get(params.symbol_id) as SymbolRow | undefined;\n\n if (!symbol) {\n return textResult(\n `Symbol not found: \\`${params.symbol_id}\\`\\n\\nUse \\`arcbridge_search_symbols\\` to find symbols by name.`,\n );\n }\n\n const lines: string[] = [\n `# ${symbol.qualified_name}`,\n \"\",\n `| Field | Value |`,\n `|-------|-------|`,\n `| **Kind** | ${symbol.kind} |`,\n `| **File** | \\`${symbol.file_path}:${symbol.start_line}\\` |`,\n `| **Exported** | ${symbol.is_exported ? \"yes\" : \"no\"} |`,\n `| **Async** | ${symbol.is_async ? \"yes\" : \"no\"} |`,\n `| **Service** | ${symbol.service} |`,\n ];\n\n if (symbol.signature) {\n lines.push(`| **Signature** | \\`${symbol.signature}\\` |`);\n }\n if (symbol.return_type) {\n lines.push(`| **Return type** | \\`${symbol.return_type}\\` |`);\n }\n\n lines.push(\"\");\n\n if (symbol.doc_comment) {\n lines.push(\"## Documentation\", \"\", symbol.doc_comment, \"\");\n }\n\n // Source code snippet\n if (params.include_source) {\n const absPath = join(params.target_dir, symbol.file_path);\n if (existsSync(absPath)) {\n try {\n const content = readFileSync(absPath, \"utf-8\");\n const fileLines = content.split(\"\\n\");\n\n const contextBefore = 2;\n const startIdx = Math.max(0, symbol.start_line - 1 - contextBefore);\n const endIdx = Math.min(fileLines.length, symbol.end_line);\n\n const snippet = fileLines\n .slice(startIdx, endIdx)\n .map((line, i) => {\n const lineNum = startIdx + i + 1;\n const marker =\n lineNum >= symbol.start_line && lineNum <= symbol.end_line\n ? \">\"\n : \" \";\n return `${marker} ${String(lineNum).padStart(4)} | ${line}`;\n })\n .join(\"\\n\");\n\n lines.push(\"## Source\", \"\", \"```typescript\", snippet, \"```\", \"\");\n } catch {\n // File read failed — skip source\n }\n }\n }\n\n // Dependencies (callers and callees) — if any exist\n const callees = db\n .prepare(\n `SELECT d.target_symbol as symbol_id, s.name as symbol_name, d.kind, s.file_path\n FROM dependencies d\n JOIN symbols s ON s.id = d.target_symbol\n WHERE d.source_symbol = ?\n ORDER BY d.kind, s.name`,\n )\n .all(params.symbol_id) as DepRow[];\n\n const callers = db\n .prepare(\n `SELECT d.source_symbol as symbol_id, s.name as symbol_name, d.kind, s.file_path\n FROM dependencies d\n JOIN symbols s ON s.id = d.source_symbol\n WHERE d.target_symbol = ?\n ORDER BY d.kind, s.name`,\n )\n .all(params.symbol_id) as DepRow[];\n\n if (callees.length > 0) {\n lines.push(\"## Dependencies (this symbol uses)\", \"\");\n for (const dep of callees) {\n lines.push(`- **${dep.kind}** → \\`${dep.symbol_name}\\` (\\`${dep.file_path}\\`)`);\n }\n lines.push(\"\");\n }\n\n if (callers.length > 0) {\n lines.push(\"## Dependents (uses this symbol)\", \"\");\n for (const dep of callers) {\n lines.push(`- **${dep.kind}** ← \\`${dep.symbol_name}\\` (\\`${dep.file_path}\\`)`);\n }\n lines.push(\"\");\n }\n\n // Find which building block this symbol belongs to\n const blocks = db\n .prepare(\"SELECT id, name, code_paths FROM building_blocks\")\n .all() as { id: string; name: string; code_paths: string }[];\n\n for (const block of blocks) {\n const codePaths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of codePaths) {\n const prefix = cp.replace(/\\*\\*?\\/?\\*?$/, \"\");\n if (symbol.file_path.startsWith(prefix)) {\n lines.push(`## Building Block`, \"\", `Part of **${block.name}** (\\`${block.id}\\`)`, \"\");\n break;\n }\n }\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, escapeLike } from \"../helpers.js\";\n\ninterface DepEdge {\n source_id: string;\n source_name: string;\n source_file: string;\n target_id: string;\n target_name: string;\n target_file: string;\n kind: string;\n}\n\nexport function registerGetDependencyGraph(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_dependency_graph\",\n \"Get the dependency graph for a module or file. Shows imports, calls, type usage, and inheritance relationships between symbols.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n module: z\n .string()\n .describe(\n \"Module path relative to project root (e.g. 'src/lib/auth')\",\n ),\n direction: z\n .enum([\"dependencies\", \"dependents\", \"both\"])\n .default(\"both\")\n .describe(\n \"Graph direction: 'dependencies' (what this module uses), 'dependents' (what uses this module), or 'both'\",\n ),\n depth: z\n .number()\n .int()\n .min(1)\n .max(5)\n .default(1)\n .describe(\"How many levels to traverse (default: 1, max: 5)\"),\n service: z\n .string()\n .optional()\n .describe(\"Filter by service name (for multi-project solutions). Omit to search all services.\"),\n },\n async (params) => {\n const maybeDb = ensureDb(ctx, params.target_dir);\n if (!maybeDb) return notInitialized();\n const db = maybeDb;\n\n // Check if we have any dependencies indexed\n const depCount = (\n db.prepare(\"SELECT COUNT(*) as count FROM dependencies\").get() as {\n count: number;\n }\n ).count;\n\n if (depCount === 0) {\n // Fall back to file-level import analysis from symbols table\n return getFileImportGraph(db, params.module, params.direction);\n }\n\n // Full dependency graph from dependencies table\n const edges: DepEdge[] = [];\n const visited = new Set<string>();\n const serviceFilter = params.service ? \" AND s1.service = ?\" : \"\";\n const serviceFilter2 = params.service ? \" AND s2.service = ?\" : \"\";\n\n function collectEdges(modulePath: string, currentDepth: number): void {\n if (currentDepth > params.depth || visited.has(modulePath)) return;\n visited.add(modulePath);\n\n const prefix = `${escapeLike(modulePath)}%`;\n\n if (params.direction === \"dependencies\" || params.direction === \"both\") {\n const queryArgs: (string | number)[] = [prefix];\n if (params.service) queryArgs.push(params.service);\n\n const deps = db\n .prepare(\n `SELECT d.source_symbol as source_id, s1.name as source_name, s1.file_path as source_file,\n d.target_symbol as target_id, s2.name as target_name, s2.file_path as target_file,\n d.kind\n FROM dependencies d\n JOIN symbols s1 ON s1.id = d.source_symbol\n JOIN symbols s2 ON s2.id = d.target_symbol\n WHERE s1.file_path LIKE ? ESCAPE '\\\\'${serviceFilter}\n ORDER BY d.kind, s2.name`,\n )\n .all(...queryArgs) as DepEdge[];\n\n for (const dep of deps) {\n const key = `${dep.source_id}->${dep.target_id}:${dep.kind}`;\n if (!visited.has(key)) {\n edges.push(dep);\n visited.add(key);\n if (currentDepth < params.depth) {\n const targetDir = dep.target_file.replace(/\\/[^/]+$/, \"\");\n collectEdges(targetDir, currentDepth + 1);\n }\n }\n }\n }\n\n if (params.direction === \"dependents\" || params.direction === \"both\") {\n const queryArgs2: (string | number)[] = [prefix];\n if (params.service) queryArgs2.push(params.service);\n\n const deps = db\n .prepare(\n `SELECT d.source_symbol as source_id, s1.name as source_name, s1.file_path as source_file,\n d.target_symbol as target_id, s2.name as target_name, s2.file_path as target_file,\n d.kind\n FROM dependencies d\n JOIN symbols s1 ON s1.id = d.source_symbol\n JOIN symbols s2 ON s2.id = d.target_symbol\n WHERE s2.file_path LIKE ? ESCAPE '\\\\'${serviceFilter2}\n ORDER BY d.kind, s1.name`,\n )\n .all(...queryArgs2) as DepEdge[];\n\n for (const dep of deps) {\n const key = `${dep.source_id}->${dep.target_id}:${dep.kind}`;\n if (!visited.has(key)) {\n edges.push(dep);\n visited.add(key);\n if (currentDepth < params.depth) {\n const sourceDir = dep.source_file.replace(/\\/[^/]+$/, \"\");\n collectEdges(sourceDir, currentDepth + 1);\n }\n }\n }\n }\n }\n\n collectEdges(params.module, 1);\n\n if (edges.length === 0) {\n return textResult(\n `No dependency edges found for module \\`${params.module}\\`.\\n\\nThis may mean dependencies haven't been indexed yet (Phase 1b). Run \\`arcbridge_reindex\\` to update.`,\n );\n }\n\n return formatEdges(edges, params.module, params.direction);\n },\n );\n}\n\nfunction getFileImportGraph(\n db: import(\"better-sqlite3\").Database,\n modulePath: string,\n _direction: string,\n) {\n // When no dependency edges exist, show a file-level view of symbols\n const prefix = `${escapeLike(modulePath)}%`;\n\n const symbols = db\n .prepare(\n `SELECT file_path, name, kind, is_exported\n FROM symbols\n WHERE file_path LIKE ? ESCAPE '\\\\'\n ORDER BY file_path, name`,\n )\n .all(prefix) as {\n file_path: string;\n name: string;\n kind: string;\n is_exported: number;\n }[];\n\n if (symbols.length === 0) {\n return textResult(\n `No symbols found in module \\`${modulePath}\\`. Run \\`arcbridge_reindex\\` first.`,\n );\n }\n\n const byFile = new Map<string, typeof symbols>();\n for (const s of symbols) {\n const list = byFile.get(s.file_path) ?? [];\n list.push(s);\n byFile.set(s.file_path, list);\n }\n\n const lines = [\n `# Module: ${modulePath}`,\n \"\",\n `> Dependency edges not yet indexed. Showing file-level symbol map.`,\n `> Run \\`arcbridge_reindex\\` after Phase 1b to see full dependency graph.`,\n \"\",\n ];\n\n for (const [file, syms] of byFile) {\n lines.push(`## \\`${file}\\``, \"\");\n for (const s of syms) {\n const exported = s.is_exported ? \" (exported)\" : \"\";\n lines.push(`- \\`${s.name}\\` — ${s.kind}${exported}`);\n }\n lines.push(\"\");\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n}\n\nfunction formatEdges(\n edges: DepEdge[],\n modulePath: string,\n direction: string,\n) {\n const byKind = new Map<string, DepEdge[]>();\n for (const e of edges) {\n const list = byKind.get(e.kind) ?? [];\n list.push(e);\n byKind.set(e.kind, list);\n }\n\n const lines = [\n `# Dependency Graph: ${modulePath}`,\n \"\",\n `**Direction:** ${direction} | **Edges:** ${edges.length}`,\n \"\",\n ];\n\n for (const [kind, kindEdges] of byKind) {\n lines.push(`## ${kind}`, \"\");\n for (const e of kindEdges) {\n lines.push(\n `- \\`${e.source_name}\\` (\\`${e.source_file}\\`) → \\`${e.target_name}\\` (\\`${e.target_file}\\`)`,\n );\n }\n lines.push(\"\");\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson, escapeLike } from \"../helpers.js\";\n\ninterface ComponentRow {\n symbol_id: string;\n name: string;\n file_path: string;\n is_client: number;\n is_server_action: number;\n has_state: number;\n context_providers: string;\n context_consumers: string;\n props_type: string | null;\n is_exported: number;\n}\n\ninterface RenderEdge {\n source_name: string;\n source_file: string;\n target_name: string;\n target_file: string;\n}\n\nexport function registerGetComponentGraph(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_component_graph\",\n \"Get the React component graph: component hierarchy, props, state, context usage, and server/client boundaries.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n file_path: z\n .string()\n .optional()\n .describe(\"Filter to components in a specific file or directory prefix\"),\n client_only: z\n .boolean()\n .optional()\n .describe(\"Only show client components ('use client')\"),\n with_state: z\n .boolean()\n .optional()\n .describe(\"Only show components that use state (useState/useReducer)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n let query = `\n SELECT\n c.symbol_id, s.name, s.file_path,\n c.is_client, c.is_server_action, c.has_state,\n c.context_providers, c.context_consumers, c.props_type,\n s.is_exported\n FROM components c\n JOIN symbols s ON c.symbol_id = s.id\n `;\n const conditions: string[] = [];\n const queryParams: (string | number)[] = [];\n\n if (params.file_path) {\n conditions.push(\"s.file_path LIKE ? ESCAPE '\\\\'\");\n queryParams.push(`${escapeLike(params.file_path)}%`);\n }\n if (params.client_only) {\n conditions.push(\"c.is_client = 1\");\n }\n if (params.with_state) {\n conditions.push(\"c.has_state = 1\");\n }\n\n if (conditions.length > 0) {\n query += \" WHERE \" + conditions.join(\" AND \");\n }\n query += \" ORDER BY s.file_path, s.name\";\n\n const components = db.prepare(query).all(...queryParams) as ComponentRow[];\n\n if (components.length === 0) {\n return textResult(\"No components found. Run `arcbridge_reindex` to analyze React components.\");\n }\n\n // Get render edges between components\n const renderEdges = db\n .prepare(\n `SELECT\n ss.name as source_name, ss.file_path as source_file,\n st.name as target_name, st.file_path as target_file\n FROM dependencies d\n JOIN symbols ss ON d.source_symbol = ss.id\n JOIN symbols st ON d.target_symbol = st.id\n WHERE d.kind = 'renders'\n AND d.source_symbol IN (SELECT symbol_id FROM components)\n AND d.target_symbol IN (SELECT symbol_id FROM components)`,\n )\n .all() as RenderEdge[];\n\n const lines: string[] = [\n `# Component Graph (${components.length} components)`,\n \"\",\n ];\n\n // Group by file\n const byFile = new Map<string, ComponentRow[]>();\n for (const c of components) {\n const existing = byFile.get(c.file_path) ?? [];\n existing.push(c);\n byFile.set(c.file_path, existing);\n }\n\n for (const [file, comps] of byFile) {\n lines.push(`## \\`${file}\\``, \"\");\n for (const c of comps) {\n const badges: string[] = [];\n if (c.is_client) badges.push(\"client\");\n if (c.is_server_action) badges.push(\"server-action\");\n if (c.has_state) badges.push(\"stateful\");\n if (!c.is_exported) badges.push(\"internal\");\n\n const badgeStr = badges.length > 0 ? ` [${badges.join(\", \")}]` : \"\";\n lines.push(`### ${c.name}${badgeStr}`, \"\");\n\n if (c.props_type) {\n lines.push(`- **Props:** \\`${c.props_type}\\``);\n }\n\n const providers = safeParseJson<string[]>(c.context_providers, []);\n if (providers.length > 0) {\n lines.push(`- **Provides context:** ${providers.join(\", \")}`);\n }\n\n const consumers = safeParseJson<string[]>(c.context_consumers, []);\n if (consumers.length > 0) {\n lines.push(`- **Consumes context:** ${consumers.join(\", \")}`);\n }\n\n // Children (renders)\n const children = renderEdges\n .filter((e) => e.source_name === c.name && e.source_file === file)\n .map((e) => e.target_name);\n if (children.length > 0) {\n lines.push(`- **Renders:** ${children.join(\", \")}`);\n }\n\n // Parents (rendered by)\n const parents = renderEdges\n .filter((e) => e.target_name === c.name && e.target_file === file)\n .map((e) => e.source_name);\n if (parents.length > 0) {\n lines.push(`- **Rendered by:** ${parents.join(\", \")}`);\n }\n\n lines.push(\"\");\n }\n }\n\n // Summary\n const clientCount = components.filter((c) => c.is_client).length;\n const statefulCount = components.filter((c) => c.has_state).length;\n lines.push(\n \"## Summary\",\n \"\",\n `- **Total components:** ${components.length}`,\n `- **Client components:** ${clientCount}`,\n `- **Stateful components:** ${statefulCount}`,\n `- **Render edges:** ${renderEdges.length}`,\n \"\",\n );\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson, escapeLike } from \"../helpers.js\";\n\ninterface RouteRow {\n id: string;\n route_path: string;\n kind: string;\n http_methods: string;\n has_auth: number;\n parent_layout: string | null;\n service: string;\n}\n\nexport function registerGetRouteMap(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_route_map\",\n \"Get the route map: pages, layouts, API routes, and their hierarchy. Works with Next.js, ASP.NET controllers, and minimal APIs.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n kind: z\n .enum([\"page\", \"layout\", \"loading\", \"error\", \"not-found\", \"api-route\", \"middleware\"])\n .optional()\n .describe(\"Filter by route kind\"),\n route_prefix: z\n .string()\n .optional()\n .describe(\"Filter by route path prefix (e.g. '/dashboard' or '/api/orders')\"),\n service: z\n .string()\n .optional()\n .describe(\"Filter by service name (for multi-project solutions). Omit to show all services.\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n let query = \"SELECT * FROM routes\";\n const conditions: string[] = [];\n const queryParams: (string | number)[] = [];\n\n if (params.service) {\n conditions.push(\"service = ?\");\n queryParams.push(params.service);\n }\n if (params.kind) {\n conditions.push(\"kind = ?\");\n queryParams.push(params.kind);\n }\n if (params.route_prefix) {\n conditions.push(\"route_path LIKE ? ESCAPE '\\\\'\");\n queryParams.push(`${escapeLike(params.route_prefix)}%`);\n }\n\n if (conditions.length > 0) {\n query += \" WHERE \" + conditions.join(\" AND \");\n }\n query += \" ORDER BY route_path, kind\";\n\n const routes = db.prepare(query).all(...queryParams) as RouteRow[];\n\n if (routes.length === 0) {\n return textResult(\"No routes found. Run `arcbridge_reindex` to analyze the Next.js app/ directory.\");\n }\n\n const lines: string[] = [\n `# Route Map (${routes.length} routes)`,\n \"\",\n ];\n\n // Group by route path\n const byPath = new Map<string, RouteRow[]>();\n for (const r of routes) {\n const existing = byPath.get(r.route_path) ?? [];\n existing.push(r);\n byPath.set(r.route_path, existing);\n }\n\n for (const [path, routeGroup] of byPath) {\n lines.push(`## \\`${path}\\``);\n lines.push(\"\");\n\n for (const r of routeGroup) {\n const parts: string[] = [`- **${r.kind}**`];\n\n const methods = safeParseJson<string[]>(r.http_methods, []);\n if (methods.length > 0) {\n parts.push(`Methods: ${methods.join(\", \")}`);\n }\n\n if (r.has_auth) {\n parts.push(\"(auth)\");\n }\n\n if (r.parent_layout) {\n parts.push(`Layout: \\`${r.parent_layout}\\``);\n }\n\n lines.push(parts.join(\" | \"));\n }\n lines.push(\"\");\n }\n\n // Summary\n const pages = routes.filter((r) => r.kind === \"page\").length;\n const layouts = routes.filter((r) => r.kind === \"layout\").length;\n const apiRoutes = routes.filter((r) => r.kind === \"api-route\").length;\n const loadingStates = routes.filter((r) => r.kind === \"loading\").length;\n\n lines.push(\n \"## Summary\",\n \"\",\n `- **Pages:** ${pages}`,\n `- **Layouts:** ${layouts}`,\n `- **API routes:** ${apiRoutes}`,\n `- **Loading states:** ${loadingStates}`,\n \"\",\n );\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\n\ninterface ComponentBoundaryRow {\n symbol_id: string;\n name: string;\n file_path: string;\n is_client: number;\n is_server_action: number;\n has_state: number;\n}\n\ninterface CrossBoundaryEdge {\n source_name: string;\n source_file: string;\n source_is_client: number;\n target_name: string;\n target_file: string;\n target_is_client: number;\n kind: string;\n}\n\nexport function registerGetBoundaryAnalysis(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_boundary_analysis\",\n \"Analyze server/client boundaries in a Next.js project. Identifies client components, server components, server actions, and potential boundary violations.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Get all components with boundary info\n const components = db\n .prepare(\n `SELECT c.symbol_id, s.name, s.file_path,\n c.is_client, c.is_server_action, c.has_state\n FROM components c\n JOIN symbols s ON c.symbol_id = s.id\n ORDER BY s.file_path`,\n )\n .all() as ComponentBoundaryRow[];\n\n if (components.length === 0) {\n return textResult(\"No components found. Run `arcbridge_reindex` to analyze server/client boundaries.\");\n }\n\n // Find cross-boundary render edges (server component rendering client, etc.)\n const crossEdges = db\n .prepare(\n `SELECT\n ss.name as source_name, ss.file_path as source_file, cs.is_client as source_is_client,\n st.name as target_name, st.file_path as target_file, ct.is_client as target_is_client,\n d.kind\n FROM dependencies d\n JOIN symbols ss ON d.source_symbol = ss.id\n JOIN symbols st ON d.target_symbol = st.id\n LEFT JOIN components cs ON d.source_symbol = cs.symbol_id\n LEFT JOIN components ct ON d.target_symbol = ct.symbol_id\n WHERE d.kind IN ('renders', 'imports')\n AND (cs.symbol_id IS NOT NULL OR ct.symbol_id IS NOT NULL)`,\n )\n .all() as CrossBoundaryEdge[];\n\n const clientComponents = components.filter((c) => c.is_client);\n const serverComponents = components.filter((c) => !c.is_client && !c.is_server_action);\n const serverActions = components.filter((c) => c.is_server_action);\n\n const lines: string[] = [\n \"# Server/Client Boundary Analysis\",\n \"\",\n \"## Overview\",\n \"\",\n `- **Server components:** ${serverComponents.length}`,\n `- **Client components:** ${clientComponents.length}`,\n `- **Server actions:** ${serverActions.length}`,\n \"\",\n ];\n\n // Client components section\n if (clientComponents.length > 0) {\n lines.push(\"## Client Components (`'use client'`)\", \"\");\n for (const c of clientComponents) {\n const badges: string[] = [];\n if (c.has_state) badges.push(\"stateful\");\n const badgeStr = badges.length > 0 ? ` [${badges.join(\", \")}]` : \"\";\n lines.push(`- \\`${c.file_path}\\` → **${c.name}**${badgeStr}`);\n }\n lines.push(\"\");\n }\n\n // Server components section\n if (serverComponents.length > 0) {\n lines.push(\"## Server Components (default)\", \"\");\n for (const c of serverComponents) {\n lines.push(`- \\`${c.file_path}\\` → **${c.name}**`);\n }\n lines.push(\"\");\n }\n\n // Server actions section\n if (serverActions.length > 0) {\n lines.push(\"## Server Actions (`'use server'`)\", \"\");\n for (const c of serverActions) {\n lines.push(`- \\`${c.file_path}\\` → **${c.name}**`);\n }\n lines.push(\"\");\n }\n\n // Boundary crossings\n const boundaryViolations: string[] = [];\n const validCrossings: string[] = [];\n\n for (const edge of crossEdges) {\n if (edge.kind !== \"renders\") continue;\n\n const sourceIsClient = edge.source_is_client === 1;\n const targetIsClient = edge.target_is_client === 1;\n\n if (sourceIsClient === targetIsClient) continue; // same boundary, skip\n\n if (!sourceIsClient && targetIsClient) {\n // Server → client: valid boundary crossing\n validCrossings.push(\n `- **${edge.source_name}** (server) → **${edge.target_name}** (client)`,\n );\n } else if (sourceIsClient && !targetIsClient) {\n // Client → server: potential issue (client can't import server component directly)\n boundaryViolations.push(\n `- **${edge.source_name}** (client, \\`${edge.source_file}\\`) renders **${edge.target_name}** (server, \\`${edge.target_file}\\`)`,\n );\n }\n }\n\n if (validCrossings.length > 0) {\n lines.push(\"## Boundary Crossings (valid)\", \"\");\n lines.push(...validCrossings, \"\");\n }\n\n if (boundaryViolations.length > 0) {\n lines.push(\"## Potential Boundary Violations\", \"\");\n lines.push(\n \"These client components appear to render server components, which is not allowed in Next.js App Router:\",\n \"\",\n ...boundaryViolations,\n \"\",\n );\n } else {\n lines.push(\"## Boundary Check\", \"\");\n lines.push(\"No boundary violations detected.\", \"\");\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { detectDrift, writeDriftLog } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\nimport { autoRecord } from \"../auto-record.js\";\n\nexport function registerCheckDrift(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_check_drift\",\n \"Detect architecture drift: undocumented modules, missing code paths, cross-block dependency violations, and stale ADR references.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n persist: z\n .boolean()\n .default(true)\n .describe(\"Write findings to drift_log table (default: true)\"),\n },\n async (params) => {\n const start = Date.now();\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const entries = detectDrift(db);\n\n if (params.persist) {\n writeDriftLog(db, entries);\n }\n\n if (entries.length === 0) {\n return textResult(\n \"# Drift Check\\n\\nNo architecture drift detected. Code aligns with documented building blocks.\",\n );\n }\n\n // Group by kind\n const byKind = new Map<string, typeof entries>();\n for (const e of entries) {\n const existing = byKind.get(e.kind) ?? [];\n existing.push(e);\n byKind.set(e.kind, existing);\n }\n\n const kindLabels: Record<string, string> = {\n undocumented_module: \"Undocumented Modules\",\n missing_module: \"Missing Modules\",\n dependency_violation: \"Dependency Violations\",\n stale_adr: \"Stale ADR References\",\n unlinked_test: \"Unlinked Tests\",\n };\n\n const severityIcon: Record<string, string> = {\n error: \"ERROR\",\n warning: \"WARN\",\n info: \"INFO\",\n };\n\n const lines: string[] = [\n `# Drift Check (${entries.length} issues)`,\n \"\",\n ];\n\n // Summary\n const errors = entries.filter((e) => e.severity === \"error\").length;\n const warnings = entries.filter((e) => e.severity === \"warning\").length;\n const infos = entries.filter((e) => e.severity === \"info\").length;\n lines.push(\n `**${errors}** errors, **${warnings}** warnings, **${infos}** info`,\n \"\",\n );\n\n for (const [kind, items] of byKind) {\n lines.push(`## ${kindLabels[kind] ?? kind}`, \"\");\n for (const item of items) {\n const icon = severityIcon[item.severity] ?? item.severity;\n lines.push(`- [${icon}] ${item.description}`);\n }\n lines.push(\"\");\n }\n\n if (params.persist) {\n lines.push(\n \"---\",\n \"*Findings saved to drift_log. Use `arcbridge_update_task` or resolve drift by updating `.arcbridge/arc42/05-building-blocks.md`.*\",\n \"\",\n );\n }\n\n autoRecord(db, params.target_dir, {\n toolName: \"arcbridge_check_drift\",\n action: `${entries.length} issues (${errors} errors)`,\n driftCount: entries.length,\n driftErrors: errors,\n durationMs: Date.now() - start,\n });\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson, escapeLike, normalizeCodePath } from \"../helpers.js\";\n\ninterface BlockRow {\n id: string;\n name: string;\n responsibility: string;\n code_paths: string;\n interfaces: string;\n}\n\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n scenario: string;\n expected: string;\n priority: string;\n}\n\ninterface SymbolRow {\n name: string;\n kind: string;\n file_path: string;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n building_block: string | null;\n}\n\ninterface DriftRow {\n kind: string;\n description: string;\n}\n\nexport function registerGetGuidance(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_guidance\",\n \"Get context-aware architectural guidance for a code change. Surfaces relevant quality scenarios, patterns, constraints, and questions to consider.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n file_path: z\n .string()\n .optional()\n .describe(\"File path you're working on (to determine building block and context)\"),\n action: z\n .enum([\n \"adding-component\",\n \"adding-api-route\",\n \"adding-hook\",\n \"modifying-auth\",\n \"new-dependency\",\n \"refactoring\",\n \"general\",\n ])\n .default(\"general\")\n .describe(\"Type of change you're making\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const lines: string[] = [\"# Architectural Guidance\", \"\"];\n\n // 1. Determine which building block this file belongs to\n let matchedBlock: BlockRow | null = null;\n if (params.file_path) {\n const blocks = db\n .prepare(\"SELECT id, name, responsibility, code_paths, interfaces FROM building_blocks\")\n .all() as BlockRow[];\n\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (params.file_path.startsWith(prefix) || params.file_path === prefix) {\n matchedBlock = block;\n break;\n }\n }\n if (matchedBlock) break;\n }\n\n if (matchedBlock) {\n lines.push(\n `## Building Block: ${matchedBlock.name} (\\`${matchedBlock.id}\\`)`,\n \"\",\n `**Responsibility:** ${matchedBlock.responsibility}`,\n \"\",\n );\n\n const interfaces = safeParseJson<string[]>(matchedBlock.interfaces, []);\n if (interfaces.length > 0) {\n lines.push(\n `**Declared interfaces:** ${interfaces.join(\", \")}`,\n \"\",\n );\n }\n } else {\n lines.push(\n \"## Warning: Unmapped File\",\n \"\",\n `\\`${params.file_path}\\` is not mapped to any building block. Consider updating \\`.arcbridge/arc42/05-building-blocks.md\\` to include this path.`,\n \"\",\n );\n }\n\n // 2. Show existing patterns in this block/file area\n const existingSymbols = db\n .prepare(\n \"SELECT name, kind, file_path FROM symbols WHERE file_path LIKE ? ESCAPE '\\\\' ORDER BY kind, name LIMIT 20\",\n )\n .all(`${escapeLike(params.file_path.replace(/\\/[^/]+$/, \"/\"))}%`) as SymbolRow[];\n\n if (existingSymbols.length > 0) {\n const byKind = new Map<string, string[]>();\n for (const s of existingSymbols) {\n const existing = byKind.get(s.kind) ?? [];\n existing.push(s.name);\n byKind.set(s.kind, existing);\n }\n\n lines.push(\"## Existing Patterns Nearby\", \"\");\n for (const [kind, names] of byKind) {\n lines.push(`- **${kind}s:** ${names.join(\", \")}`);\n }\n lines.push(\"\");\n }\n }\n\n // 3. Relevant quality scenarios\n const scenarios = db\n .prepare(\n \"SELECT id, name, category, scenario, expected, priority FROM quality_scenarios ORDER BY priority, category\",\n )\n .all() as ScenarioRow[];\n\n const relevantScenarios = filterRelevantScenarios(\n scenarios,\n params.action,\n matchedBlock?.id ?? null,\n );\n\n if (relevantScenarios.length > 0) {\n lines.push(\"## Relevant Quality Scenarios\", \"\");\n for (const s of relevantScenarios) {\n lines.push(\n `### ${s.id}: ${s.name} [${s.category}] (${s.priority})`,\n \"\",\n `**Scenario:** ${s.scenario}`,\n `**Expected:** ${s.expected}`,\n \"\",\n );\n }\n }\n\n // 4. Active tasks in this block\n if (matchedBlock) {\n const tasks = db\n .prepare(\n \"SELECT id, title, status, building_block FROM tasks WHERE building_block = ? AND status IN ('todo', 'in-progress')\",\n )\n .all(matchedBlock.id) as TaskRow[];\n\n if (tasks.length > 0) {\n lines.push(\"## Active Tasks in This Block\", \"\");\n for (const t of tasks) {\n lines.push(`- [${t.status}] ${t.id}: ${t.title}`);\n }\n lines.push(\"\");\n }\n }\n\n // 5. Relevant ADRs\n const adrRows = db\n .prepare(\"SELECT id, title, status, decision, affected_blocks, affected_files FROM adrs\")\n .all() as Array<{ id: string; title: string; status: string; decision: string; affected_blocks: string; affected_files: string }>;\n\n const relevantAdrs = adrRows.filter((adr) => {\n if (params.file_path) {\n const affectedFiles = safeParseJson<string[]>(adr.affected_files, []);\n if (affectedFiles.some((f) => params.file_path!.includes(f) || f.includes(params.file_path!))) return true;\n }\n if (matchedBlock) {\n const affectedBlocks = safeParseJson<string[]>(adr.affected_blocks, []);\n if (affectedBlocks.includes(matchedBlock.id)) return true;\n }\n return false;\n });\n\n if (relevantAdrs.length > 0) {\n lines.push(\"## Relevant ADRs\", \"\");\n for (const adr of relevantAdrs) {\n lines.push(`### ${adr.id}: ${adr.title} [${adr.status}]`, \"\");\n lines.push(`**Decision:** ${adr.decision}`, \"\");\n }\n }\n\n // 6. Unresolved drift in this area\n const driftEntries = params.file_path\n ? (db\n .prepare(\n \"SELECT kind, description FROM drift_log WHERE resolution IS NULL AND (affected_file = ? OR affected_block = ?)\",\n )\n .all(params.file_path, matchedBlock?.id ?? \"\") as DriftRow[])\n : (db\n .prepare(\n \"SELECT kind, description FROM drift_log WHERE resolution IS NULL LIMIT 5\",\n )\n .all() as DriftRow[]);\n\n if (driftEntries.length > 0) {\n lines.push(\"## Unresolved Drift\", \"\");\n for (const d of driftEntries) {\n lines.push(`- [${d.kind}] ${d.description}`);\n }\n lines.push(\"\");\n }\n\n // 6. Action-specific guidance\n const actionGuidance = getActionGuidance(params.action);\n if (actionGuidance) {\n lines.push(\"## Guidance\", \"\", actionGuidance, \"\");\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n\nfunction filterRelevantScenarios(\n scenarios: ScenarioRow[],\n action: string,\n _blockId: string | null,\n): ScenarioRow[] {\n const categoryMap: Record<string, string[]> = {\n \"adding-component\": [\"accessibility\", \"performance\", \"maintainability\"],\n \"adding-api-route\": [\"security\", \"performance\", \"reliability\"],\n \"adding-hook\": [\"maintainability\", \"performance\"],\n \"modifying-auth\": [\"security\", \"reliability\"],\n \"new-dependency\": [\"maintainability\", \"performance\", \"security\"],\n \"refactoring\": [\"maintainability\", \"reliability\"],\n \"general\": [],\n };\n\n const relevantCategories = categoryMap[action] ?? [];\n\n if (relevantCategories.length === 0) {\n // For \"general\", return must-have scenarios only\n return scenarios.filter((s) => s.priority === \"must\");\n }\n\n return scenarios.filter((s) => relevantCategories.includes(s.category));\n}\n\nfunction getActionGuidance(action: string): string | null {\n const guidance: Record<string, string> = {\n \"adding-component\":\n \"- Follow existing component patterns in this directory\\n- Add props interface alongside the component\\n- Consider server vs. client: does this need interactivity (`'use client'`)?\\n- Check accessibility: keyboard navigation, ARIA labels, screen reader support\\n- **Arc42:** If this introduces a new UI pattern, document it in `08-crosscutting.md`\",\n \"adding-api-route\":\n \"- Ensure authentication middleware covers this route\\n- Validate all input with zod or equivalent\\n- Follow existing error response patterns\\n- Consider rate limiting for public endpoints\\n- If this introduces a new API pattern or convention, document it in an ADR\\n- **Arc42:** Update `03-context.md` if this route exposes a new external integration; update `06-runtime-views.md` if it's a key workflow\",\n \"adding-hook\":\n \"- Follow the `use` prefix convention\\n- Keep hooks focused — one responsibility per hook\\n- Consider memoization for expensive computations\\n- Document the hook's return type\",\n \"modifying-auth\":\n \"- Check all API routes still have auth coverage after changes\\n- Verify no secrets leak to client components\\n- Test edge cases: expired tokens, revoked sessions, role changes\\n- Update security quality scenarios if behavior changes\\n- Document the auth strategy and any changes in an ADR — auth decisions are critical to trace\\n- **Arc42:** Update `08-crosscutting.md` with the auth pattern; update `06-runtime-views.md` with the auth flow\",\n \"new-dependency\":\n \"- Document the dependency rationale in an ADR\\n- Check bundle size impact (client-side deps)\\n- Verify the dependency doesn't introduce known CVEs\\n- Ensure the dependency's license is compatible\\n- **Arc42:** If this dependency introduces a new external system, update `03-context.md`\",\n \"refactoring\":\n \"- Ensure no cross-block boundary violations are introduced\\n- Maintain existing public API contracts\\n- Run tests before and after to verify behavior preservation\\n- Check that no quality scenarios regress\\n- If the refactoring changes architectural patterns, update or create an ADR to explain why\\n- **Arc42:** Update `05-building-blocks.md` if module structure changed; update `08-crosscutting.md` if patterns changed\",\n \"general\":\n \"- Check `arcbridge_get_relevant_adrs` for existing decisions that may constrain this change\\n- If you're choosing between approaches, document the decision in an ADR\\n- **Arc42:** Consider which documentation sections may need updating (check `.arcbridge/arc42/` — especially `05-building-blocks.md` and `08-crosscutting.md`)\",\n };\n\n return guidance[action] ?? null;\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson } from \"../helpers.js\";\n\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n status: string;\n priority: string;\n linked_tests: string;\n linked_code: string;\n}\n\ninterface BlockRow {\n id: string;\n name: string;\n code_paths: string;\n description: string | null;\n}\n\ninterface DriftRow {\n kind: string;\n severity: string;\n description: string;\n}\n\ninterface PhaseRow {\n id: string;\n name: string;\n status: string;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n acceptance_criteria: string;\n}\n\nexport function registerGetOpenQuestions(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_open_questions\",\n \"Surface architectural gaps: untested quality scenarios, building blocks without boundaries, unresolved drift, and tasks missing acceptance criteria.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n scope: z\n .string()\n .optional()\n .describe(\"Focus scope: 'current-phase', 'building-block:<id>', or omit for project-wide\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const lines: string[] = [\"# Open Questions & Gaps\", \"\"];\n let totalGaps = 0;\n\n // 1. Untested or failing quality scenarios\n const scenarios = db\n .prepare(\n \"SELECT id, name, category, status, priority, linked_tests, linked_code FROM quality_scenarios ORDER BY priority, category\",\n )\n .all() as ScenarioRow[];\n\n const untestedMust = scenarios.filter(\n (s) => s.priority === \"must\" && (s.status === \"untested\" || s.status === \"failing\"),\n );\n const untestedShould = scenarios.filter(\n (s) => s.priority === \"should\" && (s.status === \"untested\" || s.status === \"failing\"),\n );\n const unlinked = scenarios.filter((s) => {\n const tests = safeParseJson<string[]>(s.linked_tests, []);\n return tests.length === 0;\n });\n\n if (untestedMust.length > 0) {\n lines.push(\"## Critical: Untested/Failing Must-Have Scenarios\", \"\");\n for (const s of untestedMust) {\n lines.push(`- **${s.id}: ${s.name}** [${s.category}] — ${s.status}`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n if (untestedShould.length > 0) {\n lines.push(\"## Untested/Failing Should-Have Scenarios\", \"\");\n for (const s of untestedShould) {\n lines.push(`- ${s.id}: ${s.name} [${s.category}] — ${s.status}`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n if (unlinked.length > 0) {\n lines.push(\"## Scenarios Without Linked Tests\", \"\");\n for (const s of unlinked) {\n lines.push(`- ${s.id}: ${s.name} [${s.category}] (${s.priority})`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n // 2. Building blocks without code or with empty descriptions\n const blocks = db\n .prepare(\"SELECT id, name, code_paths, description FROM building_blocks\")\n .all() as BlockRow[];\n\n const emptyBlocks = blocks.filter((b) => {\n const paths = safeParseJson<string[]>(b.code_paths, []);\n return paths.length === 0;\n });\n\n const undescribed = blocks.filter(\n (b) => !b.description || b.description.trim().length === 0,\n );\n\n if (emptyBlocks.length > 0) {\n lines.push(\"## Building Blocks Without Code Paths\", \"\");\n for (const b of emptyBlocks) {\n lines.push(`- **${b.name}** (\\`${b.id}\\`) — no code_paths defined`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n if (undescribed.length > 0) {\n lines.push(\"## Building Blocks Without Descriptions\", \"\");\n for (const b of undescribed) {\n lines.push(`- **${b.name}** (\\`${b.id}\\`)`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n // 3. Unresolved drift\n const drift = db\n .prepare(\n \"SELECT kind, severity, description FROM drift_log WHERE resolution IS NULL ORDER BY severity DESC\",\n )\n .all() as DriftRow[];\n\n if (drift.length > 0) {\n lines.push(\"## Unresolved Architecture Drift\", \"\");\n for (const d of drift) {\n lines.push(`- [${d.severity.toUpperCase()}] ${d.description}`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n // 4. Phase-specific: tasks without clear acceptance criteria\n let phaseTasks: TaskRow[] = [];\n if (params.scope === \"current-phase\" || !params.scope) {\n const currentPhase = db\n .prepare(\"SELECT id, name, status FROM phases WHERE status = 'in-progress' LIMIT 1\")\n .get() as PhaseRow | undefined;\n\n if (currentPhase) {\n phaseTasks = db\n .prepare(\"SELECT id, title, status, acceptance_criteria FROM tasks WHERE phase_id = ?\")\n .all(currentPhase.id) as TaskRow[];\n }\n }\n\n const tasksWithoutCriteria = phaseTasks.filter((t) => {\n const criteria = safeParseJson<string[]>(t.acceptance_criteria, []);\n return criteria.length === 0 && t.status !== \"done\";\n });\n\n if (tasksWithoutCriteria.length > 0) {\n lines.push(\"## Tasks Without Acceptance Criteria\", \"\");\n for (const t of tasksWithoutCriteria) {\n lines.push(`- ${t.id}: ${t.title} (${t.status})`);\n totalGaps++;\n }\n lines.push(\"\");\n }\n\n // Summary\n if (totalGaps === 0) {\n return textResult(\n \"# Open Questions & Gaps\\n\\nNo significant architectural gaps found. Quality scenarios are linked, building blocks are defined, and no drift is unresolved.\",\n );\n }\n\n lines[0] = `# Open Questions & Gaps (${totalGaps} items)`;\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n resolveRef,\n getChangedFiles,\n getHeadSha,\n setSyncCommit,\n type ChangedFile,\n} from \"@arcbridge/core\";\nimport type Database from \"better-sqlite3\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson, normalizeCodePath } from \"../helpers.js\";\n\ninterface BlockRow {\n id: string;\n name: string;\n code_paths: string;\n interfaces: string;\n description: string | null;\n}\n\ninterface SymbolRow {\n name: string;\n kind: string;\n file_path: string;\n is_exported: number;\n}\n\nexport function registerProposeArc42Update(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_propose_arc42_update\",\n \"Analyze code changes since a reference point and generate specific, actionable proposals for updating arc42 documentation.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n changes_since: z\n .string()\n .default(\"last-sync\")\n .describe(\"Reference point: 'last-commit', 'last-sync', 'last-phase', or a git ref\"),\n update_sync_point: z\n .boolean()\n .default(false)\n .describe(\"Update the stored sync commit to HEAD after generating proposals\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const projectRoot = ctx.projectRoot ?? params.target_dir;\n const ref = resolveRef(projectRoot, params.changes_since, db);\n const changedFiles = getChangedFiles(projectRoot, ref.sha);\n\n if (changedFiles.length === 0) {\n return textResult(\n `# Arc42 Update Proposals\\n\\nNo code changes detected since ${ref.label}. Documentation is up to date.`,\n );\n }\n\n const blocks = db\n .prepare(\"SELECT id, name, code_paths, interfaces, description FROM building_blocks\")\n .all() as BlockRow[];\n\n const proposals = generateProposals(db, blocks, changedFiles, projectRoot);\n\n const lines: string[] = [\n `# Arc42 Update Proposals`,\n \"\",\n `**Changes since:** ${ref.label}`,\n `**Files changed:** ${changedFiles.length}`,\n `**Proposals:** ${proposals.length}`,\n \"\",\n ];\n\n if (proposals.length === 0) {\n lines.push(\n \"No documentation updates needed — all changes are within documented building blocks and don't introduce new patterns.\",\n );\n } else {\n // Group proposals by target section\n const bySection = new Map<string, Proposal[]>();\n for (const p of proposals) {\n const existing = bySection.get(p.section) ?? [];\n existing.push(p);\n bySection.set(p.section, existing);\n }\n\n for (const [section, items] of bySection) {\n lines.push(`## ${section}`, \"\");\n for (const item of items) {\n lines.push(`### ${item.title}`, \"\");\n lines.push(item.description, \"\");\n if (item.suggestedChange) {\n lines.push(\"**Suggested change:**\", \"\", item.suggestedChange, \"\");\n }\n }\n }\n }\n\n // Update sync point if requested\n if (params.update_sync_point) {\n const headSha = getHeadSha(projectRoot);\n if (headSha) {\n setSyncCommit(db, \"last_sync_commit\", headSha);\n lines.push(\"---\", `*Sync point updated to ${headSha.slice(0, 7)}.*`, \"\");\n }\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n\ninterface Proposal {\n section: string;\n title: string;\n description: string;\n suggestedChange: string | null;\n}\n\nfunction generateProposals(\n db: Database.Database,\n blocks: BlockRow[],\n changedFiles: ChangedFile[],\n _projectRoot: string,\n): Proposal[] {\n const proposals: Proposal[] = [];\n\n // Build file → block mapping\n const fileToBlock = new Map<string, BlockRow>();\n const unmappedFiles: ChangedFile[] = [];\n\n for (const cf of changedFiles) {\n if (cf.status === \"deleted\") continue;\n let matched = false;\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (cf.path.startsWith(prefix) || cf.path === prefix) {\n fileToBlock.set(cf.path, block);\n matched = true;\n break;\n }\n }\n if (matched) break;\n }\n if (!matched) {\n unmappedFiles.push(cf);\n }\n }\n\n // 1. New files not mapped to any building block\n if (unmappedFiles.length > 0) {\n // Group by directory to suggest block assignments\n const byDir = new Map<string, ChangedFile[]>();\n for (const f of unmappedFiles) {\n const dir = f.path.replace(/\\/[^/]+$/, \"/\");\n const existing = byDir.get(dir) ?? [];\n existing.push(f);\n byDir.set(dir, existing);\n }\n\n for (const [dir, files] of byDir) {\n const fileList = files.map((f) => `\\`${f.path}\\``).join(\", \");\n proposals.push({\n section: \"05 Building Block View\",\n title: `Unmapped files in \\`${dir}\\``,\n description: `${files.length} file(s) in \\`${dir}\\` are not covered by any building block: ${fileList}`,\n suggestedChange: `Add \\`${dir}\\` to an existing building block's \\`code_paths\\`, or create a new building block for this directory.`,\n });\n }\n }\n\n // 2. New exported symbols in changed files that could be interfaces\n const addedOrModified = changedFiles.filter(\n (f) => f.status === \"added\" || f.status === \"modified\",\n );\n\n for (const cf of addedOrModified) {\n const block = fileToBlock.get(cf.path);\n if (!block) continue;\n\n // Find new exported symbols in this file\n const symbols = db\n .prepare(\n \"SELECT name, kind, is_exported FROM symbols WHERE file_path = ? AND is_exported = 1\",\n )\n .all(cf.path) as SymbolRow[];\n\n if (symbols.length === 0) continue;\n\n // Check if there are cross-block consumers of these symbols\n for (const sym of symbols) {\n const consumers = findCrossBlockConsumers(\n db,\n `${cf.path}::${sym.name}#${sym.kind}`,\n block.id,\n blocks,\n );\n\n if (consumers.length > 0) {\n const consumerNames = consumers.map((c) => `\\`${c}\\``).join(\", \");\n proposals.push({\n section: \"05 Building Block View\",\n title: `New cross-block interface: \\`${sym.name}\\``,\n description: `Exported ${sym.kind} \\`${sym.name}\\` in block \\`${block.name}\\` is consumed by blocks: ${consumerNames}. This should be documented as an interface.`,\n suggestedChange: `Add \\`${sym.name}\\` to the interfaces section of building block \\`${block.id}\\` in \\`.arcbridge/arc42/05-building-blocks.md\\`.`,\n });\n }\n }\n }\n\n // 3. Deleted files that were in building blocks\n const deletedFiles = changedFiles.filter((f) => f.status === \"deleted\");\n for (const cf of deletedFiles) {\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (cf.path.startsWith(prefix)) {\n // Check if this was the only file under that code_path\n const remaining = db\n .prepare(\"SELECT 1 FROM symbols WHERE file_path LIKE ? LIMIT 1\")\n .get(`${prefix}%`) as unknown | undefined;\n\n if (!remaining) {\n proposals.push({\n section: \"05 Building Block View\",\n title: `Empty code path in \\`${block.name}\\``,\n description: `All files under \\`${cp}\\` in block \\`${block.name}\\` (${block.id}) have been deleted. The code_path no longer matches any code.`,\n suggestedChange: `Remove \\`${cp}\\` from building block \\`${block.id}\\`, or update it to reflect the new file structure.`,\n });\n }\n break;\n }\n }\n }\n }\n\n // 4. Check for new route files (might need architecture section updates)\n const routeFiles = addedOrModified.filter(\n (f) => f.path.includes(\"/app/\") && /\\/(page|layout|route)\\.(ts|tsx|js|jsx)$/.test(f.path),\n );\n\n if (routeFiles.length > 0) {\n const routeList = routeFiles.map((f) => `\\`${f.path}\\``).join(\", \");\n proposals.push({\n section: \"06 Runtime View\",\n title: \"New route files detected\",\n description: `${routeFiles.length} route file(s) were added or modified: ${routeList}. Consider updating the runtime view to reflect new user flows.`,\n suggestedChange: null,\n });\n }\n\n return proposals;\n}\n\n/**\n * Find building blocks that consume a symbol from a different block.\n */\nfunction findCrossBlockConsumers(\n db: Database.Database,\n symbolId: string,\n sourceBlockId: string,\n blocks: BlockRow[],\n): string[] {\n const consumers = db\n .prepare(\n `SELECT DISTINCT s.file_path\n FROM dependencies d\n JOIN symbols s ON d.source_symbol = s.id\n WHERE d.target_symbol = ?\n AND d.kind IN ('imports', 'calls', 'renders')`,\n )\n .all(symbolId) as { file_path: string }[];\n\n const consumerBlocks = new Set<string>();\n\n for (const { file_path } of consumers) {\n for (const block of blocks) {\n if (block.id === sourceBlockId) continue;\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (file_path.startsWith(prefix)) {\n consumerBlocks.add(block.name);\n break;\n }\n }\n }\n }\n\n return [...consumerBlocks];\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n resolveRef,\n getChangedFiles,\n detectDrift,\n type ChangedFile,\n} from \"@arcbridge/core\";\nimport type Database from \"better-sqlite3\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson, normalizeCodePath } from \"../helpers.js\";\n\ninterface BlockRow {\n id: string;\n name: string;\n code_paths: string;\n interfaces: string;\n}\n\ninterface RouteRow {\n route_path: string;\n kind: string;\n has_auth: number;\n}\n\n\nexport function registerGetPracticeReview(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_practice_review\",\n \"Structured, practice-aware review of recent code changes across 5 dimensions: Architecture, Security, Testing, Documentation, and Complexity.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n since: z\n .string()\n .default(\"last-commit\")\n .describe(\"Reference point: 'last-commit', 'last-session', or 'last-phase'\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const projectRoot = ctx.projectRoot ?? params.target_dir;\n const ref = resolveRef(projectRoot, params.since, db);\n const changedFiles = getChangedFiles(projectRoot, ref.sha);\n\n if (changedFiles.length === 0) {\n return textResult(\n `# Practice Review\\n\\nNo changes detected since ${ref.label}. Nothing to review.`,\n );\n }\n\n const lines: string[] = [\n \"# Practice Review\",\n \"\",\n `**Since:** ${ref.label}`,\n `**Files changed:** ${changedFiles.length}`,\n \"\",\n ];\n\n const findings: Finding[] = [];\n\n // Run all 5 dimensions\n reviewArchitecture(db, changedFiles, findings);\n reviewSecurity(db, changedFiles, findings);\n reviewTesting(db, changedFiles, findings);\n reviewDocumentation(db, changedFiles, findings);\n reviewComplexity(db, changedFiles, findings);\n\n if (findings.length === 0) {\n lines.push(\"All checks passed. No issues found across the 5 practice dimensions.\");\n return textResult(lines.join(\"\\n\"));\n }\n\n // Group by dimension\n const byDimension = new Map<string, Finding[]>();\n for (const f of findings) {\n const existing = byDimension.get(f.dimension) ?? [];\n existing.push(f);\n byDimension.set(f.dimension, existing);\n }\n\n const dimensionIcons: Record<string, string> = {\n Architecture: \"1\",\n Security: \"2\",\n Testing: \"3\",\n Documentation: \"4\",\n Complexity: \"5\",\n };\n\n // Summary\n const errors = findings.filter((f) => f.severity === \"error\").length;\n const warnings = findings.filter((f) => f.severity === \"warning\").length;\n const infos = findings.filter((f) => f.severity === \"info\").length;\n lines.push(\n `**${errors}** errors, **${warnings}** warnings, **${infos}** info`,\n \"\",\n );\n\n for (const dim of [\"Architecture\", \"Security\", \"Testing\", \"Documentation\", \"Complexity\"]) {\n const items = byDimension.get(dim);\n const num = dimensionIcons[dim] ?? \"?\";\n if (!items || items.length === 0) {\n lines.push(`## ${num}. ${dim} ✓`, \"\", `No issues found.`, \"\");\n continue;\n }\n\n lines.push(`## ${num}. ${dim} (${items.length} findings)`, \"\");\n for (const item of items) {\n const icon = item.severity === \"error\" ? \"ERROR\" : item.severity === \"warning\" ? \"WARN\" : \"INFO\";\n lines.push(`- [${icon}] ${item.description}`);\n if (item.action) {\n lines.push(` → **Action:** ${item.action}`);\n }\n }\n lines.push(\"\");\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n\ninterface Finding {\n dimension: string;\n severity: \"error\" | \"warning\" | \"info\";\n description: string;\n action: string | null;\n}\n\n// --- Dimension 1: Architecture ---\n\nfunction reviewArchitecture(\n db: Database.Database,\n changedFiles: ChangedFile[],\n findings: Finding[],\n): void {\n const blocks = db\n .prepare(\"SELECT id, name, code_paths, interfaces FROM building_blocks\")\n .all() as BlockRow[];\n\n if (blocks.length === 0) return;\n\n // Check for cross-boundary dependencies in changed files\n const changedPaths = new Set(\n changedFiles.filter((f) => f.status !== \"deleted\").map((f) => f.path),\n );\n\n // Map changed files to blocks\n const changedByBlock = new Map<string, string[]>();\n const unmapped: string[] = [];\n\n for (const path of changedPaths) {\n let matched = false;\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (path.startsWith(prefix)) {\n const existing = changedByBlock.get(block.id) ?? [];\n existing.push(path);\n changedByBlock.set(block.id, existing);\n matched = true;\n break;\n }\n }\n if (matched) break;\n }\n if (!matched) unmapped.push(path);\n }\n\n // Flag unmapped files\n if (unmapped.length > 0) {\n findings.push({\n dimension: \"Architecture\",\n severity: \"warning\",\n description: `${unmapped.length} changed file(s) not mapped to any building block: ${unmapped.slice(0, 3).map((f) => `\\`${f}\\``).join(\", \")}${unmapped.length > 3 ? ` and ${unmapped.length - 3} more` : \"\"}`,\n action: \"Map these files to building blocks in `.arcbridge/arc42/05-building-blocks.md`\",\n });\n }\n\n // Check cross-block deps from changed files\n for (const [blockId, files] of changedByBlock) {\n const block = blocks.find((b) => b.id === blockId);\n if (!block) continue;\n\n const declaredInterfaces = new Set(safeParseJson<string[]>(block.interfaces, []));\n\n for (const filePath of files) {\n // Find outgoing deps from this file to other blocks\n const outgoing = db\n .prepare(\n `SELECT DISTINCT st.file_path as target_file\n FROM dependencies d\n JOIN symbols ss ON d.source_symbol = ss.id\n JOIN symbols st ON d.target_symbol = st.id\n WHERE ss.file_path = ?\n AND d.kind IN ('imports', 'calls', 'renders')`,\n )\n .all(filePath) as { target_file: string }[];\n\n for (const { target_file } of outgoing) {\n // Find which block the target belongs to\n for (const targetBlock of blocks) {\n if (targetBlock.id === blockId) continue;\n const tPaths = safeParseJson<string[]>(targetBlock.code_paths, []);\n for (const cp of tPaths) {\n const prefix = normalizeCodePath(cp);\n if (target_file.startsWith(prefix) && !declaredInterfaces.has(targetBlock.id)) {\n findings.push({\n dimension: \"Architecture\",\n severity: \"error\",\n description: `\\`${filePath}\\` in block \\`${block.name}\\` depends on block \\`${targetBlock.name}\\` without declaring it as an interface.`,\n action: `Add \\`${targetBlock.id}\\` to the interfaces of block \\`${blockId}\\``,\n });\n break;\n }\n }\n }\n }\n }\n }\n}\n\n// --- Dimension 2: Security ---\n\nfunction reviewSecurity(\n db: Database.Database,\n changedFiles: ChangedFile[],\n findings: Finding[],\n): void {\n const changedPaths = changedFiles\n .filter((f) => f.status !== \"deleted\")\n .map((f) => f.path);\n\n // Check for new API routes without auth\n const routeFiles = changedPaths.filter(\n (p) => /\\/(route)\\.(ts|tsx|js|jsx)$/.test(p),\n );\n\n for (const routePath of routeFiles) {\n // Extract the route path from file path\n const appMatch = routePath.match(/app\\/(.+)\\/route\\./);\n if (!appMatch) continue;\n\n const urlPath = \"/\" + appMatch[1]\n .replace(/\\([^)]+\\)\\//g, \"\")\n .replace(/\\[\\.{3}(\\w+)\\]/g, \"*$1\")\n .replace(/\\[(\\w+)\\]/g, \":$1\");\n\n const route = db\n .prepare(\"SELECT route_path, has_auth FROM routes WHERE route_path = ? AND kind = 'api-route'\")\n .get(urlPath) as RouteRow | undefined;\n\n if (route && !route.has_auth) {\n findings.push({\n dimension: \"Security\",\n severity: \"warning\",\n description: `API route \\`${route.route_path}\\` does not have auth middleware detected.`,\n action: \"Verify this route has authentication. Add auth middleware or mark as intentionally public.\",\n });\n }\n }\n\n // Check for env/secret files in changes\n const sensitivePatterns = [/\\.env/, /secrets?\\./, /credentials/, /\\.pem$/, /\\.key$/];\n for (const path of changedPaths) {\n if (sensitivePatterns.some((p) => p.test(path))) {\n findings.push({\n dimension: \"Security\",\n severity: \"error\",\n description: `Potentially sensitive file changed: \\`${path}\\``,\n action: \"Ensure this file is in .gitignore and not committed to version control.\",\n });\n }\n }\n\n // Check for client components importing server-only patterns\n const clientFiles = changedPaths.filter((p) => p.endsWith(\".tsx\") || p.endsWith(\".ts\"));\n for (const filePath of clientFiles) {\n const comp = db\n .prepare(\n `SELECT s.name, c.is_client\n FROM components c\n JOIN symbols s ON c.symbol_id = s.id\n WHERE s.file_path = ? AND c.is_client = 1`,\n )\n .all(filePath) as { name: string; is_client: number }[];\n\n if (comp.length === 0) continue;\n\n // Check if client component imports from server-action files\n const serverImports = db\n .prepare(\n `SELECT DISTINCT st.file_path\n FROM dependencies d\n JOIN symbols ss ON d.source_symbol = ss.id\n JOIN symbols st ON d.target_symbol = st.id\n JOIN components ct ON d.target_symbol = ct.symbol_id\n WHERE ss.file_path = ?\n AND ct.is_server_action = 1\n AND d.kind = 'imports'`,\n )\n .all(filePath) as { file_path: string }[];\n\n for (const imp of serverImports) {\n findings.push({\n dimension: \"Security\",\n severity: \"warning\",\n description: `Client component in \\`${filePath}\\` imports from server action file \\`${imp.file_path}\\`. Verify no server secrets are exposed.`,\n action: null,\n });\n }\n }\n}\n\n// --- Dimension 3: Testing ---\n\nfunction reviewTesting(\n db: Database.Database,\n changedFiles: ChangedFile[],\n findings: Finding[],\n): void {\n const changedPaths = changedFiles\n .filter((f) => f.status !== \"deleted\")\n .map((f) => f.path);\n\n const testFilePattern = /\\.(test|spec)\\.(ts|tsx|js|jsx)$/;\n const codeFiles = changedPaths.filter((p) => !testFilePattern.test(p) && /\\.(ts|tsx|js|jsx)$/.test(p));\n const testFiles = changedPaths.filter((p) => testFilePattern.test(p));\n\n // Code files changed without corresponding test files\n if (codeFiles.length > 0 && testFiles.length === 0) {\n findings.push({\n dimension: \"Testing\",\n severity: \"info\",\n description: `${codeFiles.length} code file(s) changed but no test files were modified.`,\n action: \"Consider whether existing tests still cover the changed behavior.\",\n });\n }\n\n // Check quality scenarios at risk\n const scenarios = db\n .prepare(\n \"SELECT id, name, linked_code, linked_blocks, status FROM quality_scenarios WHERE priority IN ('must', 'should')\",\n )\n .all() as { id: string; name: string; linked_code: string; linked_blocks: string; status: string }[];\n\n for (const scenario of scenarios) {\n const linkedCode = safeParseJson<string[]>(scenario.linked_code, []);\n const linkedBlocks = safeParseJson<string[]>(scenario.linked_blocks, []);\n\n // Check if changed files overlap with linked code\n const affectedByCode = linkedCode.some((lc) =>\n changedPaths.some((cp) => cp.startsWith(lc) || cp === lc),\n );\n\n // Check if changed files are in linked building blocks\n let affectedByBlock = false;\n if (linkedBlocks.length > 0) {\n const blocks = db\n .prepare(\"SELECT id, code_paths FROM building_blocks\")\n .all() as { id: string; code_paths: string }[];\n\n for (const blockId of linkedBlocks) {\n const block = blocks.find((b) => b.id === blockId);\n if (!block) continue;\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (changedPaths.some((p) => p.startsWith(prefix))) {\n affectedByBlock = true;\n break;\n }\n }\n if (affectedByBlock) break;\n }\n }\n\n if (affectedByCode || affectedByBlock) {\n const severity = scenario.status === \"passing\" ? \"warning\" : \"error\";\n findings.push({\n dimension: \"Testing\",\n severity,\n description: `Quality scenario \\`${scenario.id}: ${scenario.name}\\` may be affected by these changes (status: ${scenario.status}).`,\n action: \"Re-run tests for this quality scenario to verify it still passes.\",\n });\n }\n }\n}\n\n// --- Dimension 4: Documentation ---\n\nfunction reviewDocumentation(\n db: Database.Database,\n changedFiles: ChangedFile[],\n findings: Finding[],\n): void {\n // Run drift detection and report any issues\n const driftEntries = detectDrift(db);\n\n if (driftEntries.length > 0) {\n const errors = driftEntries.filter((d) => d.severity === \"error\");\n const warnings = driftEntries.filter((d) => d.severity === \"warning\");\n\n if (errors.length > 0) {\n findings.push({\n dimension: \"Documentation\",\n severity: \"error\",\n description: `${errors.length} architecture drift error(s) detected (dependency violations, etc.).`,\n action: \"Run `arcbridge_check_drift` for details and resolve violations.\",\n });\n }\n\n if (warnings.length > 0) {\n findings.push({\n dimension: \"Documentation\",\n severity: \"warning\",\n description: `${warnings.length} documentation gap(s) found (undocumented modules, missing code paths, etc.).`,\n action: \"Run `arcbridge_propose_arc42_update` to generate update proposals.\",\n });\n }\n }\n\n // Check if arc42 files were changed\n const arc42Changes = changedFiles.filter((f) =>\n f.path.includes(\".arcbridge/arc42/\"),\n );\n if (arc42Changes.length > 0) {\n findings.push({\n dimension: \"Documentation\",\n severity: \"info\",\n description: `${arc42Changes.length} arc42 documentation file(s) were updated.`,\n action: \"Run `arcbridge_reindex` to ensure the database reflects documentation changes.\",\n });\n }\n}\n\n// --- Dimension 5: Complexity ---\n\nfunction reviewComplexity(\n db: Database.Database,\n changedFiles: ChangedFile[],\n findings: Finding[],\n): void {\n const changedPaths = changedFiles\n .filter((f) => f.status !== \"deleted\")\n .map((f) => f.path);\n\n for (const filePath of changedPaths) {\n if (!/\\.(ts|tsx|js|jsx)$/.test(filePath)) continue;\n\n // Count symbols per file as a rough complexity proxy\n const symbolCount = (\n db\n .prepare(\"SELECT COUNT(*) as count FROM symbols WHERE file_path = ?\")\n .get(filePath) as { count: number }\n ).count;\n\n if (symbolCount > 30) {\n findings.push({\n dimension: \"Complexity\",\n severity: \"warning\",\n description: `\\`${filePath}\\` has ${symbolCount} symbols — consider splitting into smaller modules.`,\n action: null,\n });\n }\n\n // Count outgoing dependencies as coupling metric\n const depCount = (\n db\n .prepare(\n `SELECT COUNT(DISTINCT d.target_symbol) as count\n FROM dependencies d\n JOIN symbols s ON d.source_symbol = s.id\n WHERE s.file_path = ?`,\n )\n .get(filePath) as { count: number }\n ).count;\n\n if (depCount > 20) {\n findings.push({\n dimension: \"Complexity\",\n severity: \"warning\",\n description: `\\`${filePath}\\` has ${depCount} outgoing dependencies — high coupling detected.`,\n action: \"Consider reducing dependencies or introducing an abstraction layer.\",\n });\n }\n }\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n detectDrift,\n writeDriftLog,\n getHeadSha,\n setSyncCommit,\n inferTaskStatuses,\n applyInferences,\n verifyScenarios,\n loadConfig,\n refreshFromDocs,\n syncPhaseToYaml,\n} from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\nimport { autoRecord } from \"../auto-record.js\";\n\ninterface PhaseRow {\n id: string;\n name: string;\n phase_number: number;\n status: string;\n gate_status: string;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n}\n\ninterface ScenarioRow {\n id: string;\n name: string;\n status: string;\n priority: string;\n}\n\nexport function registerCompletePhase(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_complete_phase\",\n \"Attempt to complete a phase by validating all gates: tasks done, no critical drift, quality scenarios passing. Transitions the phase to 'complete' if all gates pass.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n phase_id: z\n .string()\n .optional()\n .describe(\"Phase ID to complete (defaults to current in-progress phase)\"),\n notes: z\n .string()\n .optional()\n .describe(\"Optional notes about this phase completion\"),\n auto_infer: z\n .boolean()\n .default(true)\n .describe(\"Automatically infer task statuses from code state before checking gates\"),\n run_tests: z\n .boolean()\n .default(false)\n .describe(\"Run linked tests for quality scenarios before checking the quality gate\"),\n },\n async (params) => {\n const start = Date.now();\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Refresh DB from docs to pick up any YAML edits (new tasks, phase changes, etc.)\n refreshFromDocs(db, params.target_dir);\n\n // Find the target phase\n let phase: PhaseRow | undefined;\n if (params.phase_id) {\n phase = db\n .prepare(\"SELECT id, name, phase_number, status, gate_status FROM phases WHERE id = ?\")\n .get(params.phase_id) as PhaseRow | undefined;\n } else {\n phase = db\n .prepare(\n \"SELECT id, name, phase_number, status, gate_status FROM phases WHERE status = 'in-progress' LIMIT 1\",\n )\n .get() as PhaseRow | undefined;\n }\n\n if (!phase) {\n return textResult(\n \"No in-progress phase found. Use `arcbridge_get_phase_plan` to see all phases.\",\n );\n }\n\n if (phase.status === \"complete\") {\n return textResult(`Phase \\`${phase.name}\\` is already complete.`);\n }\n\n const lines: string[] = [\n `# Phase Completion: ${phase.name}`,\n \"\",\n ];\n\n // Step 1: Auto-infer task statuses\n if (params.auto_infer) {\n const inferences = inferTaskStatuses(db, phase.id);\n if (inferences.length > 0) {\n applyInferences(db, inferences, ctx.projectRoot ?? params.target_dir);\n lines.push(\"## Task Status Inference\", \"\");\n for (const inf of inferences) {\n lines.push(\n `- **${inf.taskId}**: ${inf.previousStatus} → **${inf.inferredStatus}** (${inf.reason})`,\n );\n }\n lines.push(\"\");\n }\n }\n\n // Step 2: Check gate — all tasks done\n const tasks = db\n .prepare(\"SELECT id, title, status FROM tasks WHERE phase_id = ?\")\n .all(phase.id) as TaskRow[];\n\n const incompleteTasks = tasks.filter((t) => t.status !== \"done\");\n const tasksPass = incompleteTasks.length === 0;\n\n // Step 3: Check gate — drift\n const driftEntries = detectDrift(db);\n writeDriftLog(db, driftEntries);\n const criticalDrift = driftEntries.filter((d) => d.severity === \"error\");\n const driftPass = criticalDrift.length === 0;\n\n // Step 4: Optionally run tests to update scenario statuses\n if (params.run_tests) {\n const projectRoot = ctx.projectRoot ?? params.target_dir;\n let testCommand = \"npx vitest run\";\n let timeoutMs = 60000;\n\n const configResult = loadConfig(params.target_dir);\n if (configResult.config) {\n testCommand = configResult.config.testing.test_command;\n timeoutMs = configResult.config.testing.timeout_ms;\n }\n\n const verifyResult = verifyScenarios(db, projectRoot, {\n testCommand,\n timeoutMs,\n });\n\n if (verifyResult.results.length > 0) {\n lines.push(\"## Test Verification\", \"\");\n for (const r of verifyResult.results) {\n const icon = r.passed ? \"PASS\" : \"FAIL\";\n lines.push(\n `- [${icon}] **${r.scenarioId}: ${r.scenarioName}** (${r.durationMs}ms)`,\n );\n }\n lines.push(\"\");\n }\n }\n\n // Step 5: Check gate — quality scenarios\n const mustScenarios = db\n .prepare(\n \"SELECT id, name, status, priority FROM quality_scenarios WHERE priority = 'must'\",\n )\n .all() as ScenarioRow[];\n\n const failingMust = mustScenarios.filter(\n (s) => s.status === \"failing\",\n );\n const qualityPass = failingMust.length === 0;\n\n // Build gate results\n const gates = [\n { name: \"All tasks complete\", pass: tasksPass },\n { name: \"No critical drift\", pass: driftPass },\n { name: \"Must-have quality scenarios not failing\", pass: qualityPass },\n ];\n\n const allPass = gates.every((g) => g.pass);\n\n lines.push(\"## Gate Results\", \"\");\n for (const gate of gates) {\n const icon = gate.pass ? \"PASS\" : \"FAIL\";\n lines.push(`- [${icon}] ${gate.name}`);\n }\n lines.push(\"\");\n\n // Show details for failures\n if (!tasksPass) {\n lines.push(\"### Incomplete Tasks\", \"\");\n for (const t of incompleteTasks) {\n const icon =\n t.status === \"in-progress\"\n ? \"[>]\"\n : t.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n lines.push(`- ${icon} ${t.id}: ${t.title} (${t.status})`);\n }\n lines.push(\"\");\n }\n\n if (!driftPass) {\n lines.push(\"### Critical Drift\", \"\");\n for (const d of criticalDrift) {\n lines.push(`- [ERROR] ${d.description}`);\n }\n lines.push(\"\");\n }\n\n if (!qualityPass) {\n lines.push(\"### Failing Must-Have Scenarios\", \"\");\n for (const s of failingMust) {\n lines.push(`- **${s.id}: ${s.name}** — ${s.status}`);\n }\n lines.push(\"\");\n }\n\n // Check for ADR coverage — advisory, not a gate blocker\n const adrCount = (db\n .prepare(\"SELECT COUNT(*) as count FROM adrs\")\n .get() as { count: number }).count;\n\n // Check if any tasks in this phase involved architectural decisions\n // (auth, database, middleware, DI — things that typically warrant ADRs)\n const architecturalKeywords = [\"auth\", \"database\", \"middleware\", \"validation\", \"caching\", \"dependency injection\", \"error handling\"];\n const phaseTasks = tasks.map((t) => t.title.toLowerCase());\n const hasArchitecturalWork = phaseTasks.some((title) =>\n architecturalKeywords.some((kw) => title.includes(kw)),\n );\n\n if (hasArchitecturalWork && adrCount <= 1) {\n lines.push(\n \"## ADR Reminder\",\n \"\",\n \"This phase involved architectural decisions that should be documented as ADRs.\",\n \"Use `arcbridge_get_relevant_adrs` to review existing ADRs and create new ones in `.arcbridge/arc42/09-decisions/` for:\",\n \"\",\n );\n for (const t of tasks) {\n const lower = t.title.toLowerCase();\n if (architecturalKeywords.some((kw) => lower.includes(kw))) {\n lines.push(`- **${t.title}** — document the chosen approach and alternatives considered`);\n }\n }\n lines.push(\"\");\n }\n\n if (allPass) {\n const now = new Date().toISOString();\n const gateStatus = JSON.stringify({\n tasks: \"pass\",\n drift: \"pass\",\n quality: \"pass\",\n completed_at: now,\n notes: params.notes ?? null,\n });\n\n // Find next phase before transaction\n const nextPhase = db\n .prepare(\n \"SELECT id, name FROM phases WHERE phase_number = ? AND status = 'planned'\",\n )\n .get(phase.phase_number + 1) as { id: string; name: string } | undefined;\n\n // Transition atomically\n const transition = db.transaction(() => {\n db.prepare(\n \"UPDATE phases SET status = 'complete', completed_at = ?, gate_status = ? WHERE id = ?\",\n ).run(now, gateStatus, phase.id);\n\n if (nextPhase) {\n db.prepare(\n \"UPDATE phases SET status = 'in-progress', started_at = ? WHERE id = ?\",\n ).run(now, nextPhase.id);\n }\n });\n transition();\n\n // Write back to YAML\n const projectRoot = ctx.projectRoot ?? params.target_dir;\n syncPhaseToYaml(projectRoot, phase.id, \"complete\", undefined, now);\n if (nextPhase) {\n syncPhaseToYaml(projectRoot, nextPhase.id, \"in-progress\", now);\n }\n\n // Store phase sync commit (non-critical, outside transaction)\n const headSha = getHeadSha(projectRoot);\n if (headSha) {\n setSyncCommit(db, \"phase_sync_commit\", headSha);\n }\n\n lines.push(\"## Result: PASS\", \"\");\n lines.push(`Phase \\`${phase.name}\\` is now **complete**.`);\n\n if (!headSha) {\n lines.push(\"\", \"*Warning: Could not determine git HEAD — sync point not stored.*\");\n }\n\n if (params.notes) {\n lines.push(\"\", `**Notes:** ${params.notes}`);\n }\n\n if (nextPhase) {\n lines.push(\"\", `Next phase **${nextPhase.name}** is now in-progress.`);\n }\n\n lines.push(\n \"\",\n \"---\",\n \"## Arc42 Documentation Review\",\n \"\",\n \"Before moving on, review and update these arc42 sections for changes made in this phase:\",\n \"\",\n \"- [ ] **01 Introduction** — Do project goals still reflect reality?\",\n \"- [ ] **03 Context** — Any new external systems or integrations added?\",\n \"- [ ] **05 Building Blocks** — Are all new modules mapped? Run `arcbridge_check_drift` to verify.\",\n \"- [ ] **06 Runtime Views** — Any new key workflows to document (auth flow, data processing, etc.)?\",\n \"- [ ] **07 Deployment** — Any changes to infrastructure, environments, or deployment strategy?\",\n \"- [ ] **08 Crosscutting Concepts** — Any new patterns established (error handling, validation, logging)?\",\n \"- [ ] **09 Decisions** — ADRs for all significant choices? Run `arcbridge_get_relevant_adrs` to check.\",\n \"- [ ] **10 Quality Scenarios** — Any new quality requirements or changed thresholds?\",\n \"- [ ] **11 Risks & Debt** — Any known limitations or tech debt introduced?\",\n \"\",\n \"*Run `arcbridge_propose_arc42_update` to auto-detect documentation gaps.*\",\n );\n } else {\n const failCount = gates.filter((g) => !g.pass).length;\n lines.push(\n `## Result: BLOCKED (${failCount} gate${failCount > 1 ? \"s\" : \"\"} failed)`,\n \"\",\n \"Resolve the issues above before completing this phase.\",\n );\n }\n\n autoRecord(db, params.target_dir, {\n toolName: \"arcbridge_complete_phase\",\n action: `${phase.name}: ${allPass ? \"PASSED\" : \"BLOCKED\"}`,\n phaseId: params.phase_id,\n durationMs: Date.now() - start,\n });\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\nimport { loadRole, loadRoles } from \"@arcbridge/core\";\n\ninterface BlockRow {\n id: string;\n name: string;\n responsibility: string;\n}\n\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n priority: string;\n status: string;\n}\n\ninterface PhaseRow {\n id: string;\n name: string;\n status: string;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n}\n\nexport function registerActivateRole(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_activate_role\",\n \"Activate an agent role: loads the role's system prompt, required tools, quality focus, and pre-loaded architectural context.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n role: z\n .string()\n .describe(\n \"Role ID to activate (e.g., 'architect', 'implementer', 'security-reviewer')\",\n ),\n building_block: z\n .string()\n .optional()\n .describe(\"Focus on a specific building block (for implementer/code-reviewer roles)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const lines: string[] = [];\n\n // Try loading role from .arcbridge/agents/ files first, fall back to built-in definitions\n const fileResult = loadRole(params.target_dir, params.role);\n const role = fileResult.role ?? null;\n const roleDef = role\n ? {\n name: role.name,\n description: role.description,\n requiredTools: role.required_tools,\n deniedTools: role.denied_tools,\n readOnly: role.read_only,\n qualityFocus: role.quality_focus,\n systemPrompt: role.system_prompt,\n modelPreferences: role.model_preferences,\n }\n : getRoleDefinition(params.role);\n\n if (!roleDef) {\n // Merge file-loaded and built-in role IDs\n const builtInIds = [\"architect\", \"implementer\", \"security-reviewer\", \"quality-guardian\", \"phase-manager\", \"onboarding\", \"code-reviewer\"];\n const fileRoles = loadRoles(params.target_dir);\n const fileIds = fileRoles.roles.map((r) => r.role_id);\n const availableIds = [...new Set([...fileIds, ...builtInIds])].sort();\n return textResult(\n `Unknown role: \\`${params.role}\\`. Available roles: ${availableIds.map((r) => `\\`${r}\\``).join(\", \")}`,\n );\n }\n\n const source = role ? \"file\" : \"built-in\";\n lines.push(\n `# Role Activated: ${roleDef.name}`,\n \"\",\n roleDef.description,\n \"\",\n );\n\n if (source === \"file\") {\n lines.push(`*Loaded from .arcbridge/agents/${params.role}.md*`, \"\");\n }\n\n // Tools section\n lines.push(\"## Required Tools\", \"\");\n for (const tool of roleDef.requiredTools) {\n lines.push(`- \\`${tool}\\``);\n }\n lines.push(\"\");\n\n if (roleDef.deniedTools.length > 0) {\n lines.push(\"## Denied Tools\", \"\");\n for (const tool of roleDef.deniedTools) {\n lines.push(`- \\`${tool}\\``);\n }\n lines.push(\"\");\n }\n\n if (roleDef.readOnly) {\n lines.push(\"**Access:** Read-only\", \"\");\n }\n\n if (roleDef.qualityFocus.length > 0) {\n lines.push(\n \"## Quality Focus\",\n \"\",\n roleDef.qualityFocus.map((q) => `- ${q}`).join(\"\\n\"),\n \"\",\n );\n }\n\n // Model preferences (only from file-loaded roles)\n if (roleDef.modelPreferences) {\n const mp = roleDef.modelPreferences;\n lines.push(\"## Model Preferences\", \"\");\n lines.push(`- **Reasoning depth:** ${mp.reasoning_depth}`);\n lines.push(`- **Speed priority:** ${mp.speed_priority}`);\n if (mp.suggested_models) {\n const models = Object.entries(mp.suggested_models)\n .filter(([, v]) => v)\n .map(([k, v]) => `${k}: ${v}`);\n if (models.length > 0) {\n lines.push(`- **Suggested models:** ${models.join(\", \")}`);\n }\n }\n lines.push(\"\");\n }\n\n // Load contextual data based on role\n lines.push(\"## Pre-loaded Context\", \"\");\n\n // All roles get building block summary\n const blocks = db\n .prepare(\"SELECT id, name, responsibility FROM building_blocks\")\n .all() as BlockRow[];\n\n if (blocks.length > 0) {\n lines.push(\"### Building Blocks\", \"\");\n for (const b of blocks) {\n lines.push(`- **${b.name}** (\\`${b.id}\\`): ${b.responsibility}`);\n }\n lines.push(\"\");\n }\n\n // Role-specific context loading\n if (roleDef.qualityFocus.length > 0) {\n // Load quality scenarios filtered by role's focus categories\n const allScenarios = db\n .prepare(\n \"SELECT id, name, category, priority, status FROM quality_scenarios ORDER BY priority, category\",\n )\n .all() as ScenarioRow[];\n\n const focused = allScenarios.filter(\n (s) => roleDef.qualityFocus.includes(s.category) || s.priority === \"must\",\n );\n\n if (focused.length > 0) {\n lines.push(\"### Relevant Quality Scenarios\", \"\");\n for (const s of focused) {\n const statusIcon = s.status === \"passing\" ? \"PASS\" : s.status === \"failing\" ? \"FAIL\" : \"?\";\n lines.push(\n `- [${statusIcon}] **${s.id}: ${s.name}** [${s.category}] (${s.priority})`,\n );\n }\n lines.push(\"\");\n }\n }\n\n // Phase Manager & Onboarding get phase overview\n if ([\"phase-manager\", \"onboarding\", \"architect\"].includes(params.role)) {\n const phases = db\n .prepare(\"SELECT id, name, status FROM phases ORDER BY id\")\n .all() as PhaseRow[];\n\n if (phases.length > 0) {\n lines.push(\"### Phase Plan\", \"\");\n for (const p of phases) {\n const icon =\n p.status === \"complete\"\n ? \"[x]\"\n : p.status === \"in-progress\"\n ? \"[>]\"\n : \"[ ]\";\n lines.push(`- ${icon} ${p.name} (${p.status})`);\n }\n lines.push(\"\");\n }\n }\n\n // Implementer & Code Reviewer get focused block context\n if (\n [\"implementer\", \"code-reviewer\"].includes(params.role) &&\n params.building_block\n ) {\n const blockDetail = db\n .prepare(\"SELECT id, name, responsibility FROM building_blocks WHERE id = ?\")\n .get(params.building_block) as BlockRow | undefined;\n\n if (!blockDetail) {\n lines.push(\n `### Warning: Unknown Building Block`,\n \"\",\n `Building block \\`${params.building_block}\\` not found. Use \\`arcbridge_get_building_blocks\\` to see available blocks.`,\n \"\",\n );\n } else {\n lines.push(\n `### Focus Block: ${blockDetail.name}`,\n \"\",\n `**Responsibility:** ${blockDetail.responsibility}`,\n \"\",\n );\n\n // Get active tasks for this block\n const blockTasks = db\n .prepare(\n \"SELECT id, title, status FROM tasks WHERE building_block = ? AND status IN ('todo', 'in-progress')\",\n )\n .all(params.building_block) as TaskRow[];\n\n if (blockTasks.length > 0) {\n lines.push(\"### Active Tasks\", \"\");\n for (const t of blockTasks) {\n lines.push(`- [${t.status}] ${t.id}: ${t.title}`);\n }\n lines.push(\"\");\n }\n }\n }\n\n // Phase Manager gets current tasks\n if (params.role === \"phase-manager\") {\n const currentPhase = db\n .prepare(\n \"SELECT id, name FROM phases WHERE status = 'in-progress' LIMIT 1\",\n )\n .get() as { id: string; name: string } | undefined;\n\n if (currentPhase) {\n const phaseTasks = db\n .prepare(\"SELECT id, title, status FROM tasks WHERE phase_id = ?\")\n .all(currentPhase.id) as TaskRow[];\n\n const done = phaseTasks.filter((t) => t.status === \"done\").length;\n lines.push(\n `### Current Phase: ${currentPhase.name} (${done}/${phaseTasks.length} tasks done)`,\n \"\",\n );\n for (const t of phaseTasks) {\n const icon =\n t.status === \"done\"\n ? \"[x]\"\n : t.status === \"in-progress\"\n ? \"[>]\"\n : t.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n lines.push(`- ${icon} ${t.id}: ${t.title}`);\n }\n lines.push(\"\");\n }\n }\n\n // System prompt\n lines.push(\"## Instructions\", \"\", roleDef.systemPrompt, \"\");\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n\ninterface RoleDef {\n name: string;\n description: string;\n requiredTools: string[];\n deniedTools: string[];\n readOnly: boolean;\n qualityFocus: string[];\n systemPrompt: string;\n modelPreferences?: {\n reasoning_depth: string;\n speed_priority: string;\n suggested_models?: Record<string, string | undefined>;\n };\n}\n\n/**\n * Built-in fallback role definitions, used when .arcbridge/agents/{roleId}.md\n * doesn't exist (e.g., project not initialized or role file deleted).\n */\nfunction getRoleDefinition(roleId: string): RoleDef | null {\n const roles: Record<string, RoleDef> = {\n architect: {\n name: \"Architect\",\n description:\n \"Designs system structure, makes architectural decisions, and maintains the arc42 documentation\",\n requiredTools: [\n \"arcbridge_get_building_blocks\",\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_relevant_adrs\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_dependency_graph\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_route_map\",\n \"arcbridge_get_boundary_analysis\",\n \"arcbridge_propose_arc42_update\",\n \"arcbridge_check_drift\",\n \"arcbridge_get_open_questions\",\n ],\n deniedTools: [],\n readOnly: false,\n qualityFocus: [\"maintainability\", \"reliability\", \"security\", \"performance\"],\n systemPrompt:\n \"You are the Architect agent. Design building blocks, make ADRs, maintain arc42 docs, ensure code-to-architecture mapping, review quality scenarios, and detect drift. Think at the system level.\",\n },\n implementer: {\n name: \"Implementer\",\n description:\n \"Writes code within defined building block boundaries, follows existing patterns, and completes phase tasks\",\n requiredTools: [\n \"arcbridge_get_building_block\",\n \"arcbridge_get_current_tasks\",\n \"arcbridge_update_task\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_guidance\",\n \"arcbridge_get_component_graph\",\n ],\n deniedTools: [\"arcbridge_propose_arc42_update\"],\n readOnly: false,\n qualityFocus: [\"maintainability\", \"performance\"],\n systemPrompt:\n \"You are the Implementer agent. Write code within your assigned building block boundaries. Follow existing patterns, check guidance before making changes, and update task status when complete.\",\n },\n \"security-reviewer\": {\n name: \"Security Reviewer\",\n description:\n \"Reviews code for security vulnerabilities, verifies security quality scenarios, and checks auth coverage\",\n requiredTools: [\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_building_blocks\",\n \"arcbridge_get_relevant_adrs\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_route_map\",\n \"arcbridge_get_boundary_analysis\",\n \"arcbridge_get_practice_review\",\n ],\n deniedTools: [\"arcbridge_propose_arc42_update\"],\n readOnly: true,\n qualityFocus: [\"security\"],\n systemPrompt:\n \"You are the Security Reviewer agent. Review code for vulnerabilities, verify auth coverage on routes, check server/client boundary safety, and validate security quality scenarios.\",\n },\n \"quality-guardian\": {\n name: \"Quality Guardian\",\n description:\n \"Verifies quality scenarios are met, checks test coverage, and monitors performance budgets\",\n requiredTools: [\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_building_blocks\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_boundary_analysis\",\n ],\n deniedTools: [],\n readOnly: true,\n qualityFocus: [\n \"security\",\n \"performance\",\n \"accessibility\",\n \"reliability\",\n \"maintainability\",\n ],\n systemPrompt:\n \"You are the Quality Guardian agent. Verify all quality scenarios are met, check test coverage, monitor performance budgets, and flag regressions.\",\n },\n \"phase-manager\": {\n name: \"Phase Manager\",\n description:\n \"Manages phase transitions, enforces gates, triggers sync, and tracks task completion\",\n requiredTools: [\n \"arcbridge_get_phase_plan\",\n \"arcbridge_get_current_tasks\",\n \"arcbridge_update_task\",\n \"arcbridge_check_drift\",\n \"arcbridge_get_open_questions\",\n \"arcbridge_propose_arc42_update\",\n \"arcbridge_complete_phase\",\n ],\n deniedTools: [],\n readOnly: false,\n qualityFocus: [],\n systemPrompt:\n \"You are the Phase Manager agent. Track task completion, enforce phase gates, trigger architecture sync at boundaries, and manage phase transitions. Do not skip gates.\",\n },\n onboarding: {\n name: \"Onboarding Guide\",\n description:\n \"Helps new team members understand the project architecture, conventions, and current state\",\n requiredTools: [\n \"arcbridge_get_project_status\",\n \"arcbridge_get_building_blocks\",\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_phase_plan\",\n \"arcbridge_get_relevant_adrs\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_route_map\",\n ],\n deniedTools: [],\n readOnly: true,\n qualityFocus: [],\n systemPrompt:\n \"You are the Onboarding Guide agent. Help new team members understand the project: architecture, conventions, current phase, and how to contribute. Be welcoming and thorough.\",\n },\n \"code-reviewer\": {\n name: \"Code Reviewer\",\n description:\n \"On-demand code review: checks correctness, patterns, edge cases, and simplicity\",\n requiredTools: [\n \"arcbridge_get_building_block\",\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_relevant_adrs\",\n \"arcbridge_get_current_tasks\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_dependency_graph\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_route_map\",\n \"arcbridge_get_practice_review\",\n \"arcbridge_get_boundary_analysis\",\n ],\n deniedTools: [],\n readOnly: true,\n qualityFocus: [\"maintainability\", \"reliability\"],\n systemPrompt:\n \"You are the Code Reviewer agent. Review for correctness, adherence to patterns, edge cases, simplicity, and alignment with quality scenarios. Be constructive and specific.\",\n },\n };\n\n return roles[roleId] ?? null;\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { verifyScenarios, loadConfig } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\n\nexport function registerVerifyScenarios(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_verify_scenarios\",\n \"Run linked tests for quality scenarios and update their pass/fail status. Only runs scenarios with verification='automatic' or 'semi-automatic' and non-empty linked_tests.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n scenario_ids: z\n .array(z.string())\n .optional()\n .describe(\n \"Specific scenario IDs to verify (e.g., ['SEC-01', 'PERF-01']). If omitted, verifies all automatic scenarios.\",\n ),\n test_command: z\n .string()\n .optional()\n .describe(\n \"Override the test command from config (e.g., 'npx jest'). File paths are appended as arguments.\",\n ),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n // Load test config\n let testCommand = \"npx vitest run\";\n let timeoutMs = 60000;\n\n const configResult = loadConfig(params.target_dir);\n if (configResult.config) {\n testCommand = configResult.config.testing.test_command;\n timeoutMs = configResult.config.testing.timeout_ms;\n }\n\n // Allow override via parameter\n if (params.test_command) {\n testCommand = params.test_command;\n }\n\n const projectRoot = ctx.projectRoot ?? params.target_dir;\n\n const result = verifyScenarios(db, projectRoot, {\n testCommand,\n timeoutMs,\n scenarioIds: params.scenario_ids,\n });\n\n const lines: string[] = [\"# Scenario Verification Results\", \"\"];\n\n if (result.results.length === 0) {\n lines.push(\n \"No testable scenarios found. Scenarios need `verification: automatic` (or `semi-automatic`) and non-empty `linked_tests` to be verified.\",\n );\n return textResult(lines.join(\"\\n\"));\n }\n\n lines.push(`Ran tests for ${result.results.length} scenario(s).`, \"\");\n\n const passing = result.results.filter((r) => r.passed).length;\n const failing = result.results.length - passing;\n lines.push(\n `**Summary:** ${passing} passing, ${failing} failing`,\n \"\",\n );\n\n for (const r of result.results) {\n const icon = r.passed ? \"PASS\" : \"FAIL\";\n lines.push(\n `### [${icon}] ${r.scenarioId}: ${r.scenarioName} (${r.durationMs}ms)`,\n \"\",\n );\n lines.push(`Tests: ${r.testPaths.join(\", \")}`, \"\");\n if (!r.passed && r.output) {\n const trimmed = r.output.length > 500 ? `...${r.output.slice(-500)}` : r.output;\n lines.push(\"```\", trimmed, \"```\", \"\");\n }\n }\n\n if (result.updated > 0) {\n lines.push(\n `---`,\n `Updated status for ${result.updated} scenario(s) in the database.`,\n );\n }\n\n if (result.errors.length > 0) {\n lines.push(\"\", \"## Errors\", \"\");\n for (const e of result.errors) {\n lines.push(`- ${e}`);\n }\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type Database from \"better-sqlite3\";\nimport {\n loadRole,\n loadRoles,\n detectDrift,\n resolveRef,\n getChangedFiles,\n type ChangedFile,\n} from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult, safeParseJson, normalizeCodePath } from \"../helpers.js\";\n\ninterface BlockRow {\n id: string;\n name: string;\n responsibility: string;\n code_paths: string;\n interfaces: string;\n}\n\ninterface ScenarioRow {\n id: string;\n name: string;\n category: string;\n priority: string;\n status: string;\n}\n\ninterface PhaseRow {\n id: string;\n name: string;\n status: string;\n}\n\ninterface TaskRow {\n id: string;\n title: string;\n status: string;\n phase_id: string;\n}\n\ninterface RoleDef {\n name: string;\n qualityFocus: string[];\n}\n\nconst SCOPE_VALUES = [\"last-commit\", \"current-phase\", \"full-project\"] as const;\n\nexport function registerRunRoleCheck(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_run_role_check\",\n \"Run a role-specific architectural analysis: resolves the role and executes relevant checks (drift, quality scenarios, boundaries, changed files) based on the role's focus areas.\",\n {\n target_dir: z\n .string()\n .describe(\"Absolute path to the project directory\"),\n role: z\n .string()\n .describe(\n \"Role ID to run checks for (e.g., 'security-reviewer', 'quality-guardian', 'architect', 'phase-manager', 'code-reviewer')\",\n ),\n scope: z\n .enum(SCOPE_VALUES)\n .default(\"current-phase\")\n .describe(\n \"Scope of analysis: 'last-commit' (recent changes), 'current-phase' (since phase start), 'full-project' (everything)\",\n ),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const projectRoot = ctx.projectRoot ?? params.target_dir;\n\n // Resolve role: file-first, then built-in\n const fileResult = loadRole(projectRoot, params.role);\n const role = fileResult.role ?? null;\n const roleDef: RoleDef | null = role\n ? { name: role.name, qualityFocus: role.quality_focus }\n : getBuiltInRoleDef(params.role);\n\n if (!roleDef) {\n const builtInIds = [\n \"architect\", \"implementer\", \"security-reviewer\",\n \"quality-guardian\", \"phase-manager\", \"onboarding\", \"code-reviewer\",\n ];\n const fileRoles = loadRoles(projectRoot);\n const fileIds = fileRoles.roles.map((r) => r.role_id);\n const availableIds = [...new Set([...fileIds, ...builtInIds])].sort();\n return textResult(\n `Unknown role: \\`${params.role}\\`. Available roles: ${availableIds.map((r) => `\\`${r}\\``).join(\", \")}`,\n );\n }\n\n const lines: string[] = [\n `# Role Check: ${roleDef.name}`,\n \"\",\n `**Scope:** ${params.scope}`,\n \"\",\n ];\n\n // Get changed files for scoped checks\n const changedFiles = getChangedFilesForScope(db, projectRoot, params.scope);\n if (changedFiles && changedFiles.length > 0) {\n lines.push(`**Changed files:** ${changedFiles.length}`, \"\");\n }\n\n // Dispatch to role-specific checks\n switch (params.role) {\n case \"security-reviewer\":\n runSecurityReviewerCheck(db, lines, changedFiles);\n break;\n case \"quality-guardian\":\n runQualityGuardianCheck(db, lines);\n break;\n case \"architect\":\n runArchitectCheck(db, lines);\n break;\n case \"phase-manager\":\n runPhaseManagerCheck(db, projectRoot, lines);\n break;\n case \"code-reviewer\":\n runCodeReviewerCheck(db, lines, changedFiles);\n break;\n default:\n runCustomRoleCheck(db, lines, roleDef);\n break;\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Scope resolution\n// ---------------------------------------------------------------------------\n\nfunction getChangedFilesForScope(\n db: Database.Database,\n projectRoot: string,\n scope: (typeof SCOPE_VALUES)[number],\n): ChangedFile[] | null {\n if (scope === \"full-project\") return null;\n\n const since = scope === \"last-commit\" ? \"last-commit\" : \"last-phase\";\n const ref = resolveRef(projectRoot, since, db);\n try {\n return getChangedFiles(projectRoot, ref.sha);\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Built-in role definitions (subset needed for this tool)\n// ---------------------------------------------------------------------------\n\nfunction getBuiltInRoleDef(roleId: string): RoleDef | null {\n const defs: Record<string, RoleDef> = {\n architect: { name: \"Architect\", qualityFocus: [\"maintainability\", \"reliability\", \"security\", \"performance\"] },\n implementer: { name: \"Implementer\", qualityFocus: [\"maintainability\", \"performance\"] },\n \"security-reviewer\": { name: \"Security Reviewer\", qualityFocus: [\"security\"] },\n \"quality-guardian\": { name: \"Quality Guardian\", qualityFocus: [\"security\", \"performance\", \"accessibility\", \"reliability\", \"maintainability\"] },\n \"phase-manager\": { name: \"Phase Manager\", qualityFocus: [] },\n onboarding: { name: \"Onboarding Guide\", qualityFocus: [] },\n \"code-reviewer\": { name: \"Code Reviewer\", qualityFocus: [\"maintainability\", \"reliability\"] },\n };\n return defs[roleId] ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nfunction appendDriftSection(db: Database.Database, lines: string[]): void {\n const entries = detectDrift(db);\n\n lines.push(\"## Drift Check\", \"\");\n\n if (entries.length === 0) {\n lines.push(\"No architecture drift detected.\", \"\");\n return;\n }\n\n const errors = entries.filter((e) => e.severity === \"error\").length;\n const warnings = entries.filter((e) => e.severity === \"warning\").length;\n const infos = entries.filter((e) => e.severity === \"info\").length;\n lines.push(`**${errors}** errors, **${warnings}** warnings, **${infos}** info`, \"\");\n\n const byKind = groupBy(entries, (e) => e.kind);\n const kindLabels: Record<string, string> = {\n undocumented_module: \"Undocumented Modules\",\n missing_module: \"Missing Modules\",\n dependency_violation: \"Dependency Violations\",\n stale_adr: \"Stale ADR References\",\n unlinked_test: \"Unlinked Tests\",\n };\n\n const severityIcon: Record<string, string> = {\n error: \"ERROR\",\n warning: \"WARN\",\n info: \"INFO\",\n };\n\n for (const [kind, items] of byKind) {\n lines.push(`### ${kindLabels[kind] ?? kind}`, \"\");\n for (const item of items) {\n const icon = severityIcon[item.severity] ?? item.severity;\n lines.push(`- [${icon}] ${item.description}`);\n }\n lines.push(\"\");\n }\n}\n\nfunction appendQualityScenarios(\n db: Database.Database,\n lines: string[],\n categoryFilter?: string[],\n): void {\n const allScenarios = db\n .prepare(\n \"SELECT id, name, category, priority, status FROM quality_scenarios ORDER BY priority, category\",\n )\n .all() as ScenarioRow[];\n\n const scenarios = categoryFilter\n ? allScenarios.filter(\n (s) => categoryFilter.includes(s.category) || s.priority === \"must\",\n )\n : allScenarios;\n\n const title = categoryFilter\n ? \"## Quality Scenarios (Filtered)\"\n : \"## Quality Scenarios\";\n lines.push(title, \"\");\n\n if (scenarios.length === 0) {\n lines.push(\"No matching quality scenarios found.\", \"\");\n return;\n }\n\n const passing = scenarios.filter((s) => s.status === \"passing\").length;\n const failing = scenarios.filter((s) => s.status === \"failing\").length;\n const untested = scenarios.filter(\n (s) => s.status === \"untested\" || s.status === \"partial\",\n ).length;\n lines.push(\n `**Total:** ${scenarios.length} | **Passing:** ${passing} | **Failing:** ${failing} | **Untested/Partial:** ${untested}`,\n \"\",\n );\n\n for (const s of scenarios) {\n const icon =\n s.status === \"passing\"\n ? \"PASS\"\n : s.status === \"failing\"\n ? \"FAIL\"\n : \"?\";\n lines.push(\n `- [${icon}] **${s.id}: ${s.name}** [${s.category}] (${s.priority})`,\n );\n }\n lines.push(\"\");\n}\n\nfunction appendChangedFilesList(\n lines: string[],\n changedFiles: ChangedFile[] | null,\n): void {\n if (!changedFiles || changedFiles.length === 0) return;\n\n lines.push(\"## Changed Files\", \"\");\n const limit = 30;\n const display = changedFiles.slice(0, limit);\n for (const f of display) {\n const tag = f.status === \"added\" ? \"A\" : f.status === \"deleted\" ? \"D\" : \"M\";\n lines.push(`- [${tag}] \\`${f.path}\\``);\n }\n if (changedFiles.length > limit) {\n lines.push(`- ... and ${changedFiles.length - limit} more`);\n }\n lines.push(\"\");\n}\n\nfunction appendBuildingBlocks(\n db: Database.Database,\n lines: string[],\n): void {\n const blocks = db\n .prepare(\"SELECT id, name, responsibility FROM building_blocks\")\n .all() as BlockRow[];\n\n lines.push(\"## Building Blocks\", \"\");\n\n if (blocks.length === 0) {\n lines.push(\"No building blocks defined.\", \"\");\n return;\n }\n\n for (const b of blocks) {\n lines.push(`- **${b.name}** (\\`${b.id}\\`): ${b.responsibility}`);\n }\n lines.push(\"\");\n}\n\nfunction mapFilesToBlocks(\n db: Database.Database,\n changedFiles: ChangedFile[],\n): { mapped: Map<string, string[]>; unmapped: string[] } {\n const blocks = db\n .prepare(\"SELECT id, name, code_paths FROM building_blocks\")\n .all() as BlockRow[];\n\n const mapped = new Map<string, string[]>();\n const unmapped: string[] = [];\n const changedPaths = changedFiles\n .filter((f) => f.status !== \"deleted\")\n .map((f) => f.path);\n\n for (const path of changedPaths) {\n let matched = false;\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n const prefix = normalizeCodePath(cp);\n if (path.startsWith(prefix)) {\n const existing = mapped.get(block.id) ?? [];\n existing.push(path);\n mapped.set(block.id, existing);\n matched = true;\n break;\n }\n }\n if (matched) break;\n }\n if (!matched) unmapped.push(path);\n }\n\n return { mapped, unmapped };\n}\n\nfunction groupBy<T>(items: T[], keyFn: (item: T) => string): Map<string, T[]> {\n const map = new Map<string, T[]>();\n for (const item of items) {\n const key = keyFn(item);\n const existing = map.get(key) ?? [];\n existing.push(item);\n map.set(key, existing);\n }\n return map;\n}\n\n// ---------------------------------------------------------------------------\n// Role-specific check implementations\n// ---------------------------------------------------------------------------\n\nfunction runSecurityReviewerCheck(\n db: Database.Database,\n lines: string[],\n changedFiles: ChangedFile[] | null,\n): void {\n // Security quality scenarios\n appendQualityScenarios(db, lines, [\"security\"]);\n\n // Drift check\n appendDriftSection(db, lines);\n\n // Boundary analysis summary\n const clientComponents = db\n .prepare(\n `SELECT COUNT(*) as count FROM components WHERE is_client = 1`,\n )\n .get() as { count: number };\n const serverActions = db\n .prepare(\n `SELECT COUNT(*) as count FROM components WHERE is_server_action = 1`,\n )\n .get() as { count: number };\n const crossBoundary = db\n .prepare(\n `SELECT COUNT(*) as count\n FROM dependencies d\n JOIN components cs ON d.source_symbol = cs.symbol_id\n JOIN components ct ON d.target_symbol = ct.symbol_id\n WHERE cs.is_client != ct.is_client\n AND d.kind IN ('imports', 'calls', 'renders')`,\n )\n .get() as { count: number };\n\n lines.push(\"## Boundary Summary\", \"\");\n lines.push(`- **Client components:** ${clientComponents.count}`);\n lines.push(`- **Server actions:** ${serverActions.count}`);\n lines.push(`- **Cross-boundary edges:** ${crossBoundary.count}`);\n lines.push(\"\");\n\n // Unauthenticated API routes\n const unauthRoutes = db\n .prepare(\n `SELECT route_path FROM routes WHERE kind = 'api-route' AND has_auth = 0`,\n )\n .all() as { route_path: string }[];\n\n if (unauthRoutes.length > 0) {\n lines.push(\"## Unauthenticated API Routes\", \"\");\n for (const r of unauthRoutes) {\n lines.push(`- \\`${r.route_path}\\``);\n }\n lines.push(\"\");\n }\n\n // Changed files\n appendChangedFilesList(lines, changedFiles);\n}\n\nfunction runQualityGuardianCheck(\n db: Database.Database,\n lines: string[],\n): void {\n // All quality scenarios (no filter)\n appendQualityScenarios(db, lines);\n\n // Drift check\n appendDriftSection(db, lines);\n\n // Scenario verification status summary\n const scenarios = db\n .prepare(\n `SELECT verification, status, COUNT(*) as count\n FROM quality_scenarios\n GROUP BY verification, status`,\n )\n .all() as { verification: string; status: string; count: number }[];\n\n if (scenarios.length > 0) {\n lines.push(\"## Verification Coverage\", \"\");\n for (const s of scenarios) {\n lines.push(\n `- **${s.verification}** / ${s.status}: ${s.count} scenario(s)`,\n );\n }\n lines.push(\"\");\n }\n}\n\nfunction runArchitectCheck(\n db: Database.Database,\n lines: string[],\n): void {\n // Building blocks overview\n appendBuildingBlocks(db, lines);\n\n // Drift check (which includes dependency violations)\n appendDriftSection(db, lines);\n\n // Dependency violations specifically highlighted\n const blocks = db\n .prepare(\"SELECT id, name, code_paths, interfaces FROM building_blocks\")\n .all() as BlockRow[];\n\n if (blocks.length > 1) {\n const violations: string[] = [];\n\n for (const block of blocks) {\n const declaredInterfaces = new Set(\n safeParseJson<string[]>(block.interfaces, []),\n );\n const codePaths = safeParseJson<string[]>(block.code_paths, []);\n\n for (const cp of codePaths) {\n const prefix = normalizeCodePath(cp);\n // Find outgoing cross-block deps from files in this block\n const outgoing = db\n .prepare(\n `SELECT DISTINCT st.file_path as target_file\n FROM dependencies d\n JOIN symbols ss ON d.source_symbol = ss.id\n JOIN symbols st ON d.target_symbol = st.id\n WHERE ss.file_path LIKE ? || '%'\n AND d.kind IN ('imports', 'calls', 'renders')`,\n )\n .all(prefix) as { target_file: string }[];\n\n for (const { target_file } of outgoing) {\n for (const targetBlock of blocks) {\n if (targetBlock.id === block.id) continue;\n const tPaths = safeParseJson<string[]>(targetBlock.code_paths, []);\n for (const tp of tPaths) {\n const tPrefix = normalizeCodePath(tp);\n if (\n target_file.startsWith(tPrefix) &&\n !declaredInterfaces.has(targetBlock.id)\n ) {\n violations.push(\n `Block \\`${block.name}\\` depends on \\`${targetBlock.name}\\` (undeclared interface)`,\n );\n }\n }\n }\n }\n }\n }\n\n const unique = [...new Set(violations)];\n if (unique.length > 0) {\n lines.push(\"## Undeclared Cross-Block Dependencies\", \"\");\n for (const v of unique) {\n lines.push(`- [ERROR] ${v}`);\n }\n lines.push(\"\");\n }\n }\n}\n\nfunction runPhaseManagerCheck(\n db: Database.Database,\n projectRoot: string,\n lines: string[],\n): void {\n // Current phase tasks\n const currentPhase = db\n .prepare(\n \"SELECT id, name, status FROM phases WHERE status = 'in-progress' LIMIT 1\",\n )\n .get() as PhaseRow | undefined;\n\n if (currentPhase) {\n const tasks = db\n .prepare(\"SELECT id, title, status, phase_id FROM tasks WHERE phase_id = ?\")\n .all(currentPhase.id) as TaskRow[];\n\n const done = tasks.filter((t) => t.status === \"done\").length;\n const inProgress = tasks.filter((t) => t.status === \"in-progress\").length;\n const todo = tasks.filter((t) => t.status === \"todo\").length;\n const blocked = tasks.filter((t) => t.status === \"blocked\").length;\n\n lines.push(\n `## Current Phase: ${currentPhase.name}`,\n \"\",\n `**Progress:** ${done}/${tasks.length} done, ${inProgress} in-progress, ${todo} todo, ${blocked} blocked`,\n \"\",\n );\n\n for (const t of tasks) {\n const icon =\n t.status === \"done\"\n ? \"[x]\"\n : t.status === \"in-progress\"\n ? \"[>]\"\n : t.status === \"blocked\"\n ? \"[!]\"\n : \"[ ]\";\n lines.push(`- ${icon} ${t.id}: ${t.title}`);\n }\n lines.push(\"\");\n } else {\n lines.push(\"## Phase Status\", \"\", \"No phase currently in progress.\", \"\");\n }\n\n // Drift check\n appendDriftSection(db, lines);\n\n // Quality gate status\n lines.push(\"## Quality Gate Status\", \"\");\n\n const mustScenarios = db\n .prepare(\n \"SELECT id, name, status FROM quality_scenarios WHERE priority = 'must'\",\n )\n .all() as ScenarioRow[];\n\n if (mustScenarios.length === 0) {\n lines.push(\"No must-have quality scenarios defined.\", \"\");\n } else {\n const passing = mustScenarios.filter((s) => s.status === \"passing\").length;\n const failing = mustScenarios.filter((s) => s.status === \"failing\").length;\n const gateOk = failing === 0;\n lines.push(\n `**Must-have scenarios:** ${passing}/${mustScenarios.length} passing`,\n `**Gate status:** ${gateOk ? \"READY\" : \"BLOCKED\"}`,\n \"\",\n );\n if (failing > 0) {\n for (const s of mustScenarios.filter((s) => s.status !== \"passing\")) {\n lines.push(`- [FAIL] ${s.id}: ${s.name} (${s.status})`);\n }\n lines.push(\"\");\n }\n }\n\n // Changed files since last sync\n const ref = resolveRef(projectRoot, \"last-sync\", db);\n try {\n const changedFiles = getChangedFiles(projectRoot, ref.sha);\n if (changedFiles.length > 0) {\n lines.push(`## Changes Since Last Sync (${ref.label})`, \"\");\n appendChangedFilesList(lines, changedFiles);\n }\n } catch {\n // git not available or ref invalid — skip\n }\n}\n\nfunction runCodeReviewerCheck(\n db: Database.Database,\n lines: string[],\n changedFiles: ChangedFile[] | null,\n): void {\n if (!changedFiles || changedFiles.length === 0) {\n lines.push(\n \"## Changed Files\",\n \"\",\n \"No changed files in the selected scope. Use a different scope or specify 'full-project'.\",\n \"\",\n );\n return;\n }\n\n // Changed files\n appendChangedFilesList(lines, changedFiles);\n\n // Map to building blocks\n const { mapped, unmapped } = mapFilesToBlocks(db, changedFiles);\n\n const blocks = db\n .prepare(\"SELECT id, name, responsibility FROM building_blocks\")\n .all() as BlockRow[];\n\n if (mapped.size > 0) {\n lines.push(\"## Affected Building Blocks\", \"\");\n for (const [blockId, files] of mapped) {\n const block = blocks.find((b) => b.id === blockId);\n const name = block ? block.name : blockId;\n const resp = block ? block.responsibility : \"\";\n lines.push(`### ${name} (\\`${blockId}\\`)`, \"\");\n if (resp) lines.push(`**Responsibility:** ${resp}`, \"\");\n lines.push(`**Changed files:** ${files.length}`, \"\");\n for (const f of files.slice(0, 10)) {\n lines.push(`- \\`${f}\\``);\n }\n if (files.length > 10) {\n lines.push(`- ... and ${files.length - 10} more`);\n }\n lines.push(\"\");\n }\n }\n\n if (unmapped.length > 0) {\n lines.push(\"## Unmapped Files\", \"\");\n lines.push(\n `${unmapped.length} file(s) not mapped to any building block:`,\n \"\",\n );\n for (const f of unmapped.slice(0, 10)) {\n lines.push(`- \\`${f}\\``);\n }\n if (unmapped.length > 10) {\n lines.push(`- ... and ${unmapped.length - 10} more`);\n }\n lines.push(\"\");\n }\n}\n\nfunction runCustomRoleCheck(\n db: Database.Database,\n lines: string[],\n roleDef: RoleDef,\n): void {\n // Quality scenarios matching quality_focus\n if (roleDef.qualityFocus.length > 0) {\n appendQualityScenarios(db, lines, roleDef.qualityFocus);\n } else {\n appendQualityScenarios(db, lines);\n }\n\n // Drift check\n appendDriftSection(db, lines);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { insertActivity, getSessionTotals } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\n\nexport function registerRecordActivity(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_record_activity\",\n \"Record agent activity — model, tokens, cost, duration, and optional quality snapshot. Use this to track what work was done and measure agent performance.\",\n {\n target_dir: z.string().describe(\"Absolute path to the project directory\"),\n tool_name: z.string().describe(\"Name of the tool or action performed (e.g., 'arcbridge_update_task', 'code_edit')\"),\n action: z.string().optional().describe(\"Human-readable label (e.g., 'implement login form')\"),\n model: z.string().optional().describe(\"Model identifier (e.g., 'claude-sonnet-4-20250514')\"),\n agent_role: z.string().optional().describe(\"Active ArcBridge role (e.g., 'implementer')\"),\n task_id: z.string().optional().describe(\"Associated task ID\"),\n phase_id: z.string().optional().describe(\"Associated phase ID\"),\n input_tokens: z.number().int().nonnegative().optional().describe(\"Input/prompt tokens\"),\n output_tokens: z.number().int().nonnegative().optional().describe(\"Output/completion tokens\"),\n total_tokens: z.number().int().nonnegative().optional().describe(\"Total tokens (auto-computed if input+output given)\"),\n cost_usd: z.number().nonnegative().optional().describe(\"Estimated cost in USD\"),\n duration_ms: z.number().int().nonnegative().optional().describe(\"Wall-clock duration in ms\"),\n drift_count: z.number().int().nonnegative().optional().describe(\"Current drift count\"),\n drift_errors: z.number().int().nonnegative().optional().describe(\"Current drift errors\"),\n test_pass_count: z.number().int().nonnegative().optional().describe(\"Passing tests\"),\n test_fail_count: z.number().int().nonnegative().optional().describe(\"Failing tests\"),\n lint_clean: z.boolean().optional().describe(\"Whether lint passes cleanly\"),\n typecheck_clean: z.boolean().optional().describe(\"Whether typecheck passes cleanly\"),\n notes: z.string().optional().describe(\"Free-form notes\"),\n metadata: z.record(z.unknown()).optional().describe(\"Additional key-value metadata\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const rowId = insertActivity(db, {\n toolName: params.tool_name,\n action: params.action,\n model: params.model,\n agentRole: params.agent_role,\n taskId: params.task_id,\n phaseId: params.phase_id,\n inputTokens: params.input_tokens,\n outputTokens: params.output_tokens,\n totalTokens: params.total_tokens,\n costUsd: params.cost_usd,\n durationMs: params.duration_ms,\n driftCount: params.drift_count,\n driftErrors: params.drift_errors,\n testPassCount: params.test_pass_count,\n testFailCount: params.test_fail_count,\n lintClean: params.lint_clean,\n typecheckClean: params.typecheck_clean,\n notes: params.notes,\n metadata: params.metadata,\n });\n\n // Get today's totals for the model\n const today = new Date().toISOString().slice(0, 10);\n const totals = getSessionTotals(db, today, params.model);\n\n const totalTokens =\n params.total_tokens ??\n (params.input_tokens != null && params.output_tokens != null\n ? params.input_tokens + params.output_tokens\n : null);\n\n const lines: string[] = [\n `# Activity Recorded (#${rowId})`,\n \"\",\n `- **Tool:** ${params.tool_name}`,\n ];\n\n if (params.action) lines.push(`- **Action:** ${params.action}`);\n if (params.model) lines.push(`- **Model:** ${params.model}`);\n if (totalTokens != null) {\n const detail = params.input_tokens != null && params.output_tokens != null\n ? `${params.input_tokens.toLocaleString()} in / ${params.output_tokens.toLocaleString()} out (${totalTokens.toLocaleString()} total)`\n : `${totalTokens.toLocaleString()} total`;\n lines.push(`- **Tokens:** ${detail}`);\n }\n if (params.cost_usd != null) lines.push(`- **Cost:** $${params.cost_usd.toFixed(4)}`);\n if (params.duration_ms != null) lines.push(`- **Duration:** ${params.duration_ms.toLocaleString()}ms`);\n\n lines.push(\n \"\",\n `## Session Totals (today${params.model ? `, ${params.model}` : \"\"})`,\n `- **Total cost:** $${totals.totalCost.toFixed(4)}`,\n `- **Total tokens:** ${totals.totalTokens.toLocaleString()}`,\n `- **Activities recorded:** ${totals.activityCount}`,\n );\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { queryMetrics, type AggregatedRow, type ActivityRow } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\n\nexport function registerGetMetrics(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_get_metrics\",\n \"Query agent activity metrics — filter by model, task, phase, or time range. Group by model/task/phase/tool/day for aggregated views.\",\n {\n target_dir: z.string().describe(\"Absolute path to the project directory\"),\n task_id: z.string().optional().describe(\"Filter by task ID\"),\n phase_id: z.string().optional().describe(\"Filter by phase ID\"),\n model: z.string().optional().describe(\"Filter by model name\"),\n agent_role: z.string().optional().describe(\"Filter by agent role\"),\n tool_name: z.string().optional().describe(\"Filter by tool name\"),\n since: z.string().optional().describe(\"ISO 8601 timestamp — activity after this time\"),\n until: z.string().optional().describe(\"ISO 8601 timestamp — activity before this time\"),\n group_by: z.enum([\"model\", \"task\", \"phase\", \"tool\", \"day\", \"none\"]).default(\"none\")\n .describe(\"Group results for aggregation\"),\n limit: z.number().int().min(1).max(500).default(50)\n .describe(\"Max rows in detail view (group_by=none)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const result = queryMetrics(db, {\n taskId: params.task_id,\n phaseId: params.phase_id,\n model: params.model,\n agentRole: params.agent_role,\n toolName: params.tool_name,\n since: params.since,\n until: params.until,\n groupBy: params.group_by,\n limit: params.limit,\n });\n\n if (result.totals.activityCount === 0) {\n return textResult(\"No agent activity recorded yet. Use `arcbridge_record_activity` to log agent work.\");\n }\n\n const lines: string[] = [];\n\n if (result.grouped) {\n const rows = result.rows as AggregatedRow[];\n lines.push(\n `# Agent Metrics (grouped by ${params.group_by})`,\n \"\",\n `| ${capitalize(params.group_by)} | Activities | Total Tokens | Avg Tokens | Total Cost | Avg Duration |`,\n `|${\"-\".repeat(20)}|-----------|-------------|-----------|-----------|-------------|`,\n );\n\n for (const r of rows) {\n lines.push(\n `| ${mdCell(r.groupKey)} | ${r.activityCount} | ${r.sumTokens?.toLocaleString() ?? \"-\"} | ${r.avgTokens?.toLocaleString() ?? \"-\"} | ${r.sumCost != null ? \"$\" + r.sumCost.toFixed(4) : \"-\"} | ${r.avgDuration != null ? Math.round(r.avgDuration) + \"ms\" : \"-\"} |`,\n );\n }\n } else {\n const rows = result.rows as ActivityRow[];\n lines.push(\n \"# Agent Activity (recent)\",\n \"\",\n \"| Time | Tool | Action | Model | Tokens | Cost | Duration |\",\n \"|------|------|--------|-------|--------|------|----------|\",\n );\n\n for (const r of rows) {\n lines.push(\n `| ${r.recorded_at.slice(0, 19)} | ${mdCell(r.tool_name)} | ${mdCell(r.action)} | ${mdCell(r.model)} | ${r.total_tokens?.toLocaleString() ?? \"\"} | ${r.cost_usd != null ? \"$\" + r.cost_usd.toFixed(4) : \"\"} | ${r.duration_ms != null ? r.duration_ms.toLocaleString() + \"ms\" : \"\"} |`,\n );\n }\n }\n\n // Quality snapshot\n const q = result.qualitySnapshot;\n if (q.capturedAt) {\n lines.push(\n \"\",\n \"## Latest Quality Snapshot\",\n \"\",\n );\n if (q.driftCount != null) lines.push(`- **Drift:** ${q.driftCount} issues (${q.driftErrors ?? 0} errors)`);\n if (q.testPassCount != null) lines.push(`- **Tests:** ${q.testPassCount} pass / ${q.testFailCount ?? 0} fail`);\n if (q.lintClean != null) lines.push(`- **Lint:** ${q.lintClean ? \"clean\" : \"errors\"}`);\n if (q.typecheckClean != null) lines.push(`- **Typecheck:** ${q.typecheckClean ? \"clean\" : \"errors\"}`);\n }\n\n // Totals\n lines.push(\n \"\",\n \"## Totals\",\n \"\",\n `- **Activities:** ${result.totals.activityCount}`,\n `- **Total cost:** $${result.totals.totalCost.toFixed(4)}`,\n `- **Total tokens:** ${result.totals.totalTokens.toLocaleString()}`,\n );\n\n if (result.timeSpan) {\n lines.push(`- **Time span:** ${result.timeSpan.first.slice(0, 10)} → ${result.timeSpan.last.slice(0, 10)}`);\n }\n\n return textResult(lines.join(\"\\n\"));\n },\n );\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction mdCell(val: string | null | undefined): string {\n if (val == null) return \"\";\n return val.replace(/\\|/g, \"\\\\|\").replace(/\\r?\\n|\\r/g, \" \");\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { exportMetrics } from \"@arcbridge/core\";\nimport type { ServerContext } from \"../context.js\";\nimport { ensureDb, notInitialized, textResult } from \"../helpers.js\";\n\nexport function registerExportMetrics(\n server: McpServer,\n ctx: ServerContext,\n): void {\n server.tool(\n \"arcbridge_export_metrics\",\n \"Export agent activity metrics to a file (JSON, CSV, or Markdown) in .arcbridge/metrics/ for git commits or reporting.\",\n {\n target_dir: z.string().describe(\"Absolute path to the project directory\"),\n format: z.enum([\"json\", \"csv\", \"markdown\"]).default(\"json\")\n .describe(\"Export format\"),\n task_id: z.string().optional().describe(\"Filter by task ID\"),\n phase_id: z.string().optional().describe(\"Filter by phase ID\"),\n model: z.string().optional().describe(\"Filter by model name\"),\n agent_role: z.string().optional().describe(\"Filter by agent role\"),\n tool_name: z.string().optional().describe(\"Filter by tool name\"),\n since: z.string().optional().describe(\"ISO 8601 — activity after this time\"),\n until: z.string().optional().describe(\"ISO 8601 — activity before this time\"),\n max_rows: z.number().int().min(1).default(100_000)\n .describe(\"Maximum rows to export (default: 100,000)\"),\n },\n async (params) => {\n const db = ensureDb(ctx, params.target_dir);\n if (!db) return notInitialized();\n\n const filePath = exportMetrics(\n db,\n params.target_dir,\n params.format,\n {\n taskId: params.task_id,\n phaseId: params.phase_id,\n model: params.model,\n agentRole: params.agent_role,\n toolName: params.tool_name,\n since: params.since,\n until: params.until,\n },\n params.max_rows,\n );\n\n return textResult(\n `Metrics exported to: ${filePath}\\n\\nYou can commit this file to preserve the activity record in git.`,\n );\n },\n );\n}\n"],"mappings":"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","names":["z","join","existsSync","z","z","z","z","z","z","z","z","refreshFromDocs","z","refreshFromDocs","z","refreshFromDocs","z","refreshFromDocs","z","autoRecord","z","z","z","z","z","adrs","z","indexProject","refreshFromDocs","z","refreshFromDocs","indexProject","z","z","z","existsSync","join","z","join","existsSync","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","resolveRef","getChangedFiles","detectDrift","z","resolveRef","getChangedFiles","detectDrift","z","detectDrift","writeDriftLog","getHeadSha","setSyncCommit","loadConfig","refreshFromDocs","z","refreshFromDocs","detectDrift","writeDriftLog","loadConfig","getHeadSha","setSyncCommit","z","z","z","verifyScenarios","loadConfig","z","loadConfig","verifyScenarios","z","loadRole","loadRoles","detectDrift","resolveRef","getChangedFiles","z","loadRole","loadRoles","resolveRef","getChangedFiles","detectDrift","s","z","insertActivity","z","insertActivity","z","z","z","z","require"]}
|