@arcbridge/core 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schemas/config.ts","../src/schemas/quality-scenarios.ts","../src/schemas/building-blocks.ts","../src/schemas/phases.ts","../src/schemas/adrs.ts","../src/schemas/agent-roles.ts","../src/db/connection.ts","../src/db/schema.ts","../src/db/migrations.ts","../src/generators/config-generator.ts","../src/templates/config/nextjs-app-router.ts","../src/templates/config/react-vite.ts","../src/templates/config/api-service.ts","../src/templates/config/dotnet-webapi.ts","../src/generators/arc42-generator.ts","../src/templates/arc42/01-introduction.ts","../src/templates/arc42/03-context.ts","../src/templates/arc42/detect-layout.ts","../src/templates/arc42/05-building-blocks.ts","../src/templates/arc42/06-runtime-views.ts","../src/templates/arc42/07-deployment.ts","../src/templates/arc42/09-decisions.ts","../src/templates/arc42/10-quality-scenarios.ts","../src/templates/arc42/08-crosscutting.ts","../src/templates/arc42/11-risks-debt.ts","../src/generators/plan-generator.ts","../src/templates/phases/nextjs-app-router.ts","../src/templates/phases/react-vite.ts","../src/templates/phases/api-service.ts","../src/templates/phases/dotnet-webapi.ts","../src/generators/agent-generator.ts","../src/templates/agents/architect.ts","../src/templates/agents/implementer.ts","../src/templates/agents/security-reviewer.ts","../src/templates/agents/quality-guardian.ts","../src/templates/agents/phase-manager.ts","../src/templates/agents/onboarding.ts","../src/templates/agents/code-reviewer.ts","../src/templates/agents/ux-reviewer.ts","../src/generators/db-generator.ts","../src/indexer/index.ts","../src/indexer/program.ts","../src/indexer/symbol-extractor.ts","../src/indexer/react-utils.ts","../src/indexer/dependency-extractor.ts","../src/indexer/component-analyzer.ts","../src/indexer/route-analyzer.ts","../src/indexer/content-hash.ts","../src/indexer/db-writer.ts","../src/indexer/dotnet-indexer.ts","../src/indexer/csharp/indexer.ts","../src/indexer/csharp/parser.ts","../src/indexer/csharp/symbol-extractor.ts","../src/indexer/csharp/dependency-extractor.ts","../src/indexer/csharp/route-analyzer.ts","../src/indexer/package-deps.ts","../src/config/loader.ts","../src/drift/detector.ts","../src/sync/yaml-writer.ts","../src/sync/task-inference.ts","../src/generators/sync-generator.ts","../src/templates/sync/claude-skill.ts","../src/templates/sync/github-action.ts","../src/templates/sync/copilot-hook.ts","../src/git/helpers.ts","../src/testing/runner.ts","../src/roles/loader.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const ServiceSchema = z.object({\n name: z.string().min(1),\n path: z.string().default(\".\"),\n type: z.enum([\"nextjs\", \"react\", \"fastify\", \"express\", \"hono\", \"dotnet\"]),\n tsconfig: z.string().optional(),\n csproj: z.string().optional(),\n});\n\nexport const ArcBridgeConfigSchema = z.object({\n schema_version: z.literal(1).default(1),\n project_name: z.string().min(1),\n project_type: z\n .enum([\n \"nextjs-app-router\",\n \"react-vite\",\n \"api-service\",\n \"dotnet-webapi\",\n ])\n .default(\"nextjs-app-router\"),\n\n services: z.array(ServiceSchema).default([]),\n\n platforms: z\n .array(z.enum([\"claude\", \"copilot\", \"gemini\", \"codex\"]))\n .default([\"claude\"]),\n\n quality_priorities: z\n .array(\n z.enum([\n \"security\",\n \"performance\",\n \"accessibility\",\n \"reliability\",\n \"maintainability\",\n ]),\n )\n .default([\"security\", \"performance\", \"accessibility\"]),\n\n indexing: z\n .object({\n include: z.array(z.string()).default([\"src/**/*\", \"app/**/*\"]),\n exclude: z\n .array(z.string())\n .default([\"node_modules\", \"dist\", \".next\", \"coverage\"]),\n default_mode: z.enum([\"fast\", \"deep\"]).default(\"fast\"),\n csharp_indexer: z\n .enum([\"auto\", \"roslyn\", \"tree-sitter\"])\n .default(\"auto\")\n .describe(\n \"C# indexer backend: 'auto' uses Roslyn if available, otherwise tree-sitter. \" +\n \"'tree-sitter' works without .NET SDK. 'roslyn' requires .NET SDK + global tool.\",\n ),\n })\n .default({}),\n\n testing: z\n .object({\n test_command: z\n .string()\n .min(1)\n .default(\"npx vitest run\")\n .describe(\"Command to run tests (space-separated, no shell syntax). File paths are appended as arguments.\"),\n timeout_ms: z\n .number()\n .int()\n .min(1000)\n .default(60000)\n .describe(\"Timeout per test run in milliseconds\"),\n })\n .default({}),\n\n drift: z\n .object({\n ignore_paths: z\n .array(z.string())\n .default([])\n .describe(\n \"File paths or prefixes to ignore in undocumented_module drift checks. \" +\n \"Framework files (e.g. next.config.ts, root layout/page) are auto-ignored for known project types.\",\n ),\n })\n .default({}),\n\n sync: z\n .object({\n auto_detect_drift: z.boolean().default(true),\n drift_severity_threshold: z\n .enum([\"info\", \"warning\", \"error\"])\n .default(\"warning\"),\n propose_updates_on: z\n .enum([\"session-end\", \"phase-complete\", \"manual\"])\n .default(\"phase-complete\"),\n })\n .default({}),\n});\n\nexport type ArcBridgeConfig = z.infer<typeof ArcBridgeConfigSchema>;\nexport type Service = z.infer<typeof ServiceSchema>;\n","import { z } from \"zod\";\n\nexport const QualityCategorySchema = z.enum([\n \"security\",\n \"performance\",\n \"accessibility\",\n \"reliability\",\n \"maintainability\",\n]);\n\nexport const QualityPrioritySchema = z.enum([\"must\", \"should\", \"could\"]);\n\nexport const QualityScenarioStatusSchema = z.enum([\n \"passing\",\n \"failing\",\n \"untested\",\n \"partial\",\n]);\n\nexport const QualityScenarioSchema = z.object({\n id: z.string().regex(/^[A-Z0-9]+-\\d+$/, \"Must match pattern like SEC-01\"),\n name: z.string().min(1),\n category: QualityCategorySchema,\n priority: QualityPrioritySchema,\n scenario: z.string().min(1),\n expected: z.string().min(1),\n linked_code: z.array(z.string()).default([]),\n linked_tests: z.array(z.string()).default([]),\n linked_blocks: z.array(z.string()).default([]),\n verification: z.enum([\"automatic\", \"manual\", \"semi-automatic\"]),\n status: QualityScenarioStatusSchema.default(\"untested\"),\n});\n\nexport const QualityGoalSchema = z.object({\n id: QualityCategorySchema,\n priority: z.number().int().min(1),\n description: z.string().min(1),\n});\n\nexport const QualityScenariosFileSchema = z.object({\n schema_version: z.literal(1).default(1),\n last_updated: z.string(),\n quality_goals: z.array(QualityGoalSchema),\n scenarios: z.array(QualityScenarioSchema),\n});\n\nexport type QualityScenario = z.infer<typeof QualityScenarioSchema>;\nexport type QualityGoal = z.infer<typeof QualityGoalSchema>;\nexport type QualityScenariosFile = z.infer<typeof QualityScenariosFileSchema>;\n","import { z } from \"zod\";\n\nexport const BuildingBlockSchema = z.object({\n id: z.string().regex(/^[a-z0-9-]+$/, \"Must be kebab-case\"),\n name: z.string().min(1),\n level: z.number().int().min(1).max(3),\n parent_id: z.string().optional(),\n code_paths: z.array(z.string()).default([]),\n interfaces: z.array(z.string()).default([]),\n quality_scenarios: z.array(z.string()).default([]),\n adrs: z.array(z.string()).default([]),\n responsibility: z.string().min(1),\n service: z.string().default(\"main\"),\n});\n\nexport const BuildingBlocksFrontmatterSchema = z.object({\n section: z.literal(\"building-blocks\"),\n schema_version: z.literal(1).default(1),\n last_synced: z.string(),\n blocks: z.array(BuildingBlockSchema),\n});\n\nexport type BuildingBlock = z.infer<typeof BuildingBlockSchema>;\nexport type BuildingBlocksFrontmatter = z.infer<\n typeof BuildingBlocksFrontmatterSchema\n>;\n","import { z } from \"zod\";\n\nexport const PhaseStatusSchema = z.enum([\n \"planned\",\n \"in-progress\",\n \"complete\",\n \"blocked\",\n]);\n\nexport const TaskStatusSchema = z.enum([\n \"todo\",\n \"in-progress\",\n \"done\",\n \"blocked\",\n]);\n\nexport const PhaseSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n phase_number: z.number().int().min(0),\n status: PhaseStatusSchema.default(\"planned\"),\n description: z.string().min(1),\n gate_requirements: z.array(z.string()).default([]),\n started_at: z.string().optional(),\n completed_at: z.string().optional(),\n});\n\nexport const TaskSchema = z.object({\n id: z.string().min(1),\n title: z.string().min(1),\n status: TaskStatusSchema.default(\"todo\"),\n building_block: z.string().optional(),\n quality_scenarios: z.array(z.string()).default([]),\n acceptance_criteria: z.array(z.string()).default([]),\n completed_at: z.string().optional(),\n});\n\nexport const PhasesFileSchema = z.object({\n schema_version: z.literal(1).default(1),\n phases: z.array(PhaseSchema),\n});\n\nexport const TaskFileSchema = z.object({\n schema_version: z.literal(1).default(1),\n phase_id: z.string().min(1),\n tasks: z.array(TaskSchema),\n});\n\nexport type Phase = z.infer<typeof PhaseSchema>;\nexport type Task = z.infer<typeof TaskSchema>;\nexport type PhasesFile = z.infer<typeof PhasesFileSchema>;\nexport type TaskFile = z.infer<typeof TaskFileSchema>;\n","import { z } from \"zod\";\n\nexport const AdrStatusSchema = z.enum([\n \"proposed\",\n \"accepted\",\n \"deprecated\",\n \"superseded\",\n]);\n\nexport const AdrFrontmatterSchema = z.object({\n id: z.string().regex(/^\\d{3}-[a-z0-9-]+$/, \"Must match pattern like 001-some-decision\"),\n title: z.string().min(1),\n status: AdrStatusSchema.default(\"proposed\"),\n date: z.string(),\n affected_blocks: z.array(z.string()).default([]),\n affected_files: z.array(z.string()).default([]),\n quality_scenarios: z.array(z.string()).default([]),\n superseded_by: z.string().optional(),\n});\n\nexport type AdrFrontmatter = z.infer<typeof AdrFrontmatterSchema>;\n","import { z } from \"zod\";\n\nexport const AgentRoleSchema = z.object({\n role_id: z.string().regex(/^[a-z0-9-]+$/, \"Must be kebab-case\"),\n name: z.string().min(1),\n description: z.string().min(1),\n version: z.number().int().min(1).default(1),\n\n required_tools: z.array(z.string()).default([]),\n denied_tools: z.array(z.string()).default([]),\n read_only: z.boolean().default(false),\n\n quality_focus: z.array(z.string()).default([]),\n\n model_preferences: z\n .object({\n reasoning_depth: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n speed_priority: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n suggested_models: z\n .object({\n claude: z.string().optional(),\n openai: z.string().optional(),\n gemini: z.string().optional(),\n })\n .default({}),\n })\n .default({}),\n\n platform_overrides: z\n .object({\n claude: z.record(z.string(), z.unknown()).optional(),\n copilot: z.record(z.string(), z.unknown()).optional(),\n codex: z.record(z.string(), z.unknown()).optional(),\n })\n .default({}),\n\n // The markdown body (system prompt) is stored separately\n system_prompt: z.string().min(1),\n});\n\nexport type AgentRole = z.infer<typeof AgentRoleSchema>;\n","import Database from \"better-sqlite3\";\n\nexport function openDatabase(dbPath: string): Database.Database {\n const db = new Database(dbPath);\n db.pragma(\"journal_mode = WAL\");\n db.pragma(\"foreign_keys = ON\");\n return db;\n}\n\nexport function openMemoryDatabase(): Database.Database {\n return openDatabase(\":memory:\");\n}\n","import type Database from \"better-sqlite3\";\n\nexport const CURRENT_SCHEMA_VERSION = 1;\n\nconst SCHEMA_SQL = `\n-- Metadata\nCREATE TABLE IF NOT EXISTS arcbridge_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\n-- Code Intelligence (populated in Phase 1-2)\nCREATE TABLE IF NOT EXISTS symbols (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n qualified_name TEXT NOT NULL,\n kind TEXT NOT NULL CHECK(kind IN ('function','class','type','constant','component','hook','context','interface','enum','variable')),\n file_path TEXT NOT NULL,\n start_line INTEGER NOT NULL,\n end_line INTEGER NOT NULL,\n start_col INTEGER NOT NULL DEFAULT 0,\n end_col INTEGER NOT NULL DEFAULT 0,\n signature TEXT,\n return_type TEXT,\n doc_comment TEXT,\n is_exported INTEGER NOT NULL DEFAULT 0,\n is_async INTEGER NOT NULL DEFAULT 0,\n service TEXT NOT NULL DEFAULT 'main',\n language TEXT NOT NULL DEFAULT 'typescript',\n content_hash TEXT,\n indexed_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_symbols_file ON symbols(file_path);\nCREATE INDEX IF NOT EXISTS idx_symbols_kind ON symbols(kind);\nCREATE INDEX IF NOT EXISTS idx_symbols_name ON symbols(name);\nCREATE INDEX IF NOT EXISTS idx_symbols_service ON symbols(service);\n\nCREATE TABLE IF NOT EXISTS dependencies (\n source_symbol TEXT NOT NULL REFERENCES symbols(id),\n target_symbol TEXT NOT NULL REFERENCES symbols(id),\n kind TEXT NOT NULL CHECK(kind IN ('imports','calls','extends','implements','uses_type','renders','provides_context','consumes_context')),\n UNIQUE(source_symbol, target_symbol, kind)\n);\n\nCREATE INDEX IF NOT EXISTS idx_deps_source ON dependencies(source_symbol);\nCREATE INDEX IF NOT EXISTS idx_deps_target ON dependencies(target_symbol);\nCREATE INDEX IF NOT EXISTS idx_deps_kind ON dependencies(kind);\n\nCREATE TABLE IF NOT EXISTS components (\n symbol_id TEXT PRIMARY KEY REFERENCES symbols(id),\n is_client INTEGER NOT NULL DEFAULT 0,\n is_server_action INTEGER NOT NULL DEFAULT 0,\n has_state INTEGER NOT NULL DEFAULT 0,\n context_providers TEXT NOT NULL DEFAULT '[]',\n context_consumers TEXT NOT NULL DEFAULT '[]',\n props_type TEXT\n);\n\nCREATE TABLE IF NOT EXISTS routes (\n id TEXT PRIMARY KEY,\n route_path TEXT NOT NULL,\n kind TEXT NOT NULL CHECK(kind IN ('page','layout','loading','error','not-found','api-route','middleware')),\n http_methods TEXT NOT NULL DEFAULT '[]',\n has_auth INTEGER NOT NULL DEFAULT 0,\n parent_layout TEXT,\n service TEXT NOT NULL DEFAULT 'main'\n);\n\n-- Architecture\nCREATE TABLE IF NOT EXISTS building_blocks (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n level INTEGER NOT NULL DEFAULT 1,\n parent_id TEXT REFERENCES building_blocks(id),\n description TEXT,\n responsibility TEXT NOT NULL,\n code_paths TEXT NOT NULL DEFAULT '[]',\n interfaces TEXT NOT NULL DEFAULT '[]',\n service TEXT NOT NULL DEFAULT 'main',\n last_synced TEXT\n);\n\nCREATE TABLE IF NOT EXISTS quality_scenarios (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n category TEXT NOT NULL CHECK(category IN ('security','performance','accessibility','reliability','maintainability')),\n scenario TEXT NOT NULL,\n expected TEXT NOT NULL,\n priority TEXT NOT NULL DEFAULT 'should' CHECK(priority IN ('must','should','could')),\n linked_code TEXT NOT NULL DEFAULT '[]',\n linked_tests TEXT NOT NULL DEFAULT '[]',\n linked_blocks TEXT NOT NULL DEFAULT '[]',\n verification TEXT NOT NULL DEFAULT 'manual' CHECK(verification IN ('automatic','manual','semi-automatic')),\n status TEXT NOT NULL DEFAULT 'untested' CHECK(status IN ('passing','failing','untested','partial')),\n last_checked TEXT\n);\n\nCREATE TABLE IF NOT EXISTS adrs (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'proposed' CHECK(status IN ('proposed','accepted','deprecated','superseded')),\n date TEXT NOT NULL,\n context TEXT,\n decision TEXT,\n consequences TEXT,\n affected_blocks TEXT NOT NULL DEFAULT '[]',\n affected_files TEXT NOT NULL DEFAULT '[]',\n quality_scenarios TEXT NOT NULL DEFAULT '[]',\n superseded_by TEXT\n);\n\nCREATE TABLE IF NOT EXISTS contracts (\n id TEXT PRIMARY KEY,\n kind TEXT NOT NULL CHECK(kind IN ('openapi','graphql','grpc','shared-types','event-schema')),\n source_path TEXT NOT NULL,\n producer TEXT NOT NULL,\n consumers TEXT NOT NULL DEFAULT '[]',\n version TEXT,\n building_block TEXT REFERENCES building_blocks(id),\n content_hash TEXT,\n last_verified TEXT\n);\n\n-- Package Dependencies (npm, NuGet)\nCREATE TABLE IF NOT EXISTS package_dependencies (\n name TEXT NOT NULL,\n version TEXT,\n source TEXT NOT NULL CHECK(source IN ('npm','npm-dev','nuget')),\n service TEXT NOT NULL DEFAULT 'main',\n PRIMARY KEY (name, source, service)\n);\n\n-- Planning\nCREATE TABLE IF NOT EXISTS phases (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n phase_number INTEGER NOT NULL,\n status TEXT NOT NULL DEFAULT 'planned' CHECK(status IN ('planned','in-progress','complete','blocked')),\n description TEXT NOT NULL,\n gate_status TEXT NOT NULL DEFAULT '{}',\n started_at TEXT,\n completed_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n phase_id TEXT NOT NULL REFERENCES phases(id),\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'todo' CHECK(status IN ('todo','in-progress','done','blocked')),\n building_block TEXT REFERENCES building_blocks(id),\n quality_scenarios TEXT NOT NULL DEFAULT '[]',\n acceptance_criteria TEXT NOT NULL DEFAULT '[]',\n created_at TEXT NOT NULL,\n completed_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS drift_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n detected_at TEXT NOT NULL,\n kind TEXT NOT NULL CHECK(kind IN ('undocumented_module','missing_module','dependency_violation','unlinked_test','stale_adr','new_dependency')),\n severity TEXT NOT NULL DEFAULT 'info' CHECK(severity IN ('info','warning','error')),\n description TEXT NOT NULL,\n affected_block TEXT,\n affected_file TEXT,\n resolution TEXT CHECK(resolution IN ('accepted','fixed','deferred') OR resolution IS NULL),\n resolved_at TEXT\n);\n`;\n\nexport function initializeSchema(db: Database.Database): void {\n db.exec(SCHEMA_SQL);\n\n const existing = db\n .prepare(\"SELECT value FROM arcbridge_meta WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined;\n\n if (!existing) {\n const now = new Date().toISOString();\n const insert = db.prepare(\n \"INSERT INTO arcbridge_meta (key, value) VALUES (?, ?)\",\n );\n insert.run(\"schema_version\", String(CURRENT_SCHEMA_VERSION));\n insert.run(\"created_at\", now);\n }\n}\n","import type Database from \"better-sqlite3\";\nimport { CURRENT_SCHEMA_VERSION } from \"./schema.js\";\n\ninterface Migration {\n version: number;\n up: (db: Database.Database) => void;\n}\n\n// Add future migrations here. Version 1 is the initial schema (handled by initializeSchema).\nconst migrations: Migration[] = [];\n\nexport function migrate(db: Database.Database): void {\n const row = db\n .prepare(\"SELECT value FROM arcbridge_meta WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined;\n\n const currentVersion = row ? Number(row.value) : 0;\n\n if (currentVersion >= CURRENT_SCHEMA_VERSION) {\n return;\n }\n\n const pending = migrations\n .filter((m) => m.version > currentVersion)\n .sort((a, b) => a.version - b.version);\n\n for (const migration of pending) {\n db.transaction(() => {\n migration.up(db);\n db.prepare(\n \"UPDATE arcbridge_meta SET value = ? WHERE key = 'schema_version'\",\n ).run(String(migration.version));\n })();\n }\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { stringify } from \"yaml\";\nimport { configTemplate as nextjsConfig } from \"../templates/config/nextjs-app-router.js\";\nimport { configTemplate as reactViteConfig } from \"../templates/config/react-vite.js\";\nimport { configTemplate as apiServiceConfig } from \"../templates/config/api-service.js\";\nimport { configTemplate as dotnetWebapiConfig } from \"../templates/config/dotnet-webapi.js\";\nimport type { InitProjectInput } from \"../templates/types.js\";\nimport type { ArcBridgeConfig } from \"../schemas/config.js\";\n\nconst configTemplates: Record<string, (input: InitProjectInput) => ArcBridgeConfig> = {\n \"nextjs-app-router\": nextjsConfig,\n \"react-vite\": reactViteConfig,\n \"api-service\": apiServiceConfig,\n \"dotnet-webapi\": dotnetWebapiConfig,\n};\n\nexport function generateConfig(\n targetDir: string,\n input: InitProjectInput,\n): ArcBridgeConfig {\n const templateFn = configTemplates[input.template] ?? nextjsConfig;\n const config = templateFn(input);\n const arcBridgeDir = join(targetDir, \".arcbridge\");\n mkdirSync(arcBridgeDir, { recursive: true });\n\n const yamlContent = stringify(config);\n writeFileSync(join(arcBridgeDir, \"config.yaml\"), yamlContent, \"utf-8\");\n\n return config;\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function configTemplate(input: InitProjectInput): ArcBridgeConfig {\n return {\n schema_version: 1,\n project_name: input.name,\n project_type: input.template,\n services: [\n {\n name: \"main\",\n path: \".\",\n type: \"nextjs\",\n tsconfig: \"tsconfig.json\",\n },\n ],\n platforms: input.platforms as ArcBridgeConfig[\"platforms\"],\n quality_priorities:\n input.quality_priorities as ArcBridgeConfig[\"quality_priorities\"],\n indexing: {\n include: [\"src/**/*\", \"app/**/*\"],\n exclude: [\"node_modules\", \"dist\", \".next\", \"coverage\"],\n default_mode: \"fast\",\n csharp_indexer: \"auto\",\n },\n testing: {\n test_command: \"npx vitest run\",\n timeout_ms: 60000,\n },\n drift: {\n ignore_paths: [],\n },\n sync: {\n auto_detect_drift: true,\n drift_severity_threshold: \"warning\",\n propose_updates_on: \"phase-complete\",\n },\n };\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function configTemplate(input: InitProjectInput): ArcBridgeConfig {\n return {\n schema_version: 1,\n project_name: input.name,\n project_type: input.template,\n services: [\n {\n name: \"main\",\n path: \".\",\n type: \"react\",\n tsconfig: \"tsconfig.json\",\n },\n ],\n platforms: input.platforms as ArcBridgeConfig[\"platforms\"],\n quality_priorities:\n input.quality_priorities as ArcBridgeConfig[\"quality_priorities\"],\n indexing: {\n include: [\"src/**/*\"],\n exclude: [\"node_modules\", \"dist\", \"coverage\"],\n default_mode: \"fast\",\n csharp_indexer: \"auto\",\n },\n testing: {\n test_command: \"npx vitest run\",\n timeout_ms: 60000,\n },\n drift: {\n ignore_paths: [],\n },\n sync: {\n auto_detect_drift: true,\n drift_severity_threshold: \"warning\",\n propose_updates_on: \"phase-complete\",\n },\n };\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function configTemplate(input: InitProjectInput): ArcBridgeConfig {\n return {\n schema_version: 1,\n project_name: input.name,\n project_type: input.template,\n services: [\n {\n name: \"api\",\n path: \".\",\n type: \"express\",\n tsconfig: \"tsconfig.json\",\n },\n ],\n platforms: input.platforms as ArcBridgeConfig[\"platforms\"],\n quality_priorities:\n input.quality_priorities as ArcBridgeConfig[\"quality_priorities\"],\n indexing: {\n include: [\"src/**/*\"],\n exclude: [\"node_modules\", \"dist\", \"coverage\"],\n default_mode: \"fast\",\n csharp_indexer: \"auto\",\n },\n testing: {\n test_command: \"npx vitest run\",\n timeout_ms: 60000,\n },\n drift: {\n ignore_paths: [],\n },\n sync: {\n auto_detect_drift: true,\n drift_severity_threshold: \"warning\",\n propose_updates_on: \"phase-complete\",\n },\n };\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function configTemplate(input: InitProjectInput): ArcBridgeConfig {\n // Use discovered services from .sln, or default single service\n const services = input.dotnetServices && input.dotnetServices.length > 0\n ? input.dotnetServices.map((s) => ({\n name: s.name.toLowerCase().replace(/[^a-z0-9-]/g, \"-\"),\n path: s.path,\n type: \"dotnet\" as const,\n }))\n : [{ name: \"api\", path: \".\", type: \"dotnet\" as const }];\n\n return {\n schema_version: 1,\n project_name: input.name,\n project_type: input.template,\n services,\n platforms: input.platforms as ArcBridgeConfig[\"platforms\"],\n quality_priorities:\n input.quality_priorities as ArcBridgeConfig[\"quality_priorities\"],\n indexing: {\n include: [\"**/*.cs\"],\n exclude: [\"bin\", \"obj\", \"TestResults\", \"node_modules\"],\n default_mode: \"fast\",\n csharp_indexer: \"auto\",\n },\n testing: {\n test_command: \"dotnet test\",\n timeout_ms: 120000,\n },\n drift: {\n ignore_paths: [],\n },\n sync: {\n auto_detect_drift: true,\n drift_severity_threshold: \"warning\",\n propose_updates_on: \"phase-complete\",\n },\n };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport matter from \"gray-matter\";\nimport { stringify } from \"yaml\";\nimport type { InitProjectInput } from \"../templates/types.js\";\nimport { introductionTemplate } from \"../templates/arc42/01-introduction.js\";\nimport { contextTemplate } from \"../templates/arc42/03-context.js\";\nimport { buildingBlocksTemplate } from \"../templates/arc42/05-building-blocks.js\";\nimport { runtimeViewsTemplate } from \"../templates/arc42/06-runtime-views.js\";\nimport { deploymentTemplate } from \"../templates/arc42/07-deployment.js\";\nimport { firstAdrTemplate } from \"../templates/arc42/09-decisions.js\";\nimport { qualityScenariosTemplate } from \"../templates/arc42/10-quality-scenarios.js\";\nimport { crosscuttingTemplate } from \"../templates/arc42/08-crosscutting.js\";\nimport { risksDebtTemplate } from \"../templates/arc42/11-risks-debt.js\";\n\nfunction writeMarkdownWithFrontmatter(\n filePath: string,\n frontmatter: Record<string, unknown>,\n body: string,\n): void {\n const content = matter.stringify(body, frontmatter);\n writeFileSync(filePath, content, \"utf-8\");\n}\n\nexport function generateArc42(\n targetDir: string,\n input: InitProjectInput,\n): void {\n const arc42Dir = join(targetDir, \".arcbridge\", \"arc42\");\n const decisionsDir = join(arc42Dir, \"09-decisions\");\n\n mkdirSync(arc42Dir, { recursive: true });\n mkdirSync(decisionsDir, { recursive: true });\n\n // Standard markdown sections\n const sections = [\n { file: \"01-introduction.md\", template: introductionTemplate },\n { file: \"03-context.md\", template: contextTemplate },\n { file: \"05-building-blocks.md\", template: buildingBlocksTemplate },\n { file: \"06-runtime-views.md\", template: runtimeViewsTemplate },\n { file: \"07-deployment.md\", template: deploymentTemplate },\n { file: \"08-crosscutting.md\", template: crosscuttingTemplate },\n { file: \"11-risks-debt.md\", template: risksDebtTemplate },\n ];\n\n const inputWithRoot = { ...input, projectRoot: targetDir };\n for (const { file, template } of sections) {\n const { frontmatter, body } = template(inputWithRoot);\n writeMarkdownWithFrontmatter(join(arc42Dir, file), frontmatter, body);\n }\n\n // ADR (first decision)\n const adr = firstAdrTemplate(inputWithRoot);\n writeMarkdownWithFrontmatter(\n join(decisionsDir, adr.filename),\n adr.frontmatter,\n adr.body,\n );\n\n // Quality scenarios (YAML, not markdown)\n const qualityScenarios = qualityScenariosTemplate(input);\n writeFileSync(\n join(arc42Dir, \"10-quality-scenarios.yaml\"),\n stringify(qualityScenarios),\n \"utf-8\",\n );\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\n\nexport function introductionTemplate(input: InitProjectInput): TemplateOutput {\n return {\n frontmatter: {\n section: \"introduction\",\n schema_version: 1,\n },\n body: `# Introduction and Goals\n\n## Requirements Overview\n\n${input.name} is a ${input.template === \"nextjs-app-router\" ? \"Next.js application using the App Router\" : input.template === \"dotnet-webapi\" ? \"ASP.NET Core Web API\" : \"web application\"}.\n\n### Key Features\n\n${input.features.length > 0 ? input.features.map((f) => `- ${f}`).join(\"\\n\") : \"- *Define your key features here*\"}\n\n## Quality Goals\n\n| Priority | Goal | Description |\n|----------|------|-------------|\n${input.quality_priorities.map((q, i) => `| ${i + 1} | ${q} | *Describe what ${q} means for this project* |`).join(\"\\n\")}\n\n## Stakeholders\n\n| Role | Description | Expectations |\n|------|-------------|--------------|\n| Developer | Primary developer | Efficient development workflow with AI assistance |\n| End User | Application user | *Define user expectations* |\n`,\n };\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\n\nfunction techStack(template: string): string {\n switch (template) {\n case \"dotnet-webapi\":\n return `- **Framework:** ASP.NET Core\n- **Language:** C#\n- **Runtime:** .NET`;\n case \"react-vite\":\n return `- **Framework:** React (Vite)\n- **Language:** TypeScript\n- **Runtime:** Node.js`;\n case \"api-service\":\n return `- **Framework:** Express / Fastify\n- **Language:** TypeScript\n- **Runtime:** Node.js`;\n default:\n return `- **Framework:** Next.js (App Router)\n- **Language:** TypeScript\n- **Runtime:** Node.js`;\n }\n}\n\nexport function contextTemplate(input: InitProjectInput): TemplateOutput {\n return {\n frontmatter: {\n section: \"context\",\n schema_version: 1,\n },\n body: `# System Scope and Context\n\n## Business Context\n\n${input.name} interacts with the following external systems and actors:\n\n| Neighbor | Description | Interface |\n|----------|-------------|-----------|\n| End User | Application user | Browser / HTTP |\n| *External API* | *Describe external dependencies* | *REST / GraphQL* |\n\n## Technical Context\n\n\\`\\`\\`\n[Browser] --HTTP/HTTPS--> [${input.name}] --API--> [External Services]\n\\`\\`\\`\n\n### Technology Stack\n\n${techStack(input.template)}\n`,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface ProjectLayout {\n /** Prefix for general source files: \"src/\" or \"\" */\n srcPrefix: string;\n /** Prefix for Next.js app router files. Only meaningful for nextjs-app-router template. */\n appPrefix: string;\n /** Entrypoint files for the project (template-dependent) */\n entrypoints: string[];\n}\n\n/**\n * Detect the project's directory layout from actual filesystem structure and template.\n * Used by arc42 templates to generate consistent code_paths.\n *\n * srcPrefix detection:\n * 1. src/ exists → \"src/\"\n * 2. No src/ but projectRoot provided → \"\" (root-level layout)\n * 3. No projectRoot → \"src/\" (default convention for new projects)\n *\n * appPrefix is only relevant for nextjs-app-router. For other templates\n * it defaults to srcPrefix + \"app\" but should not be used for building blocks.\n */\nexport function detectProjectLayout(\n projectRoot?: string,\n template?: string,\n): ProjectLayout {\n const srcPrefix = detectSrcPrefix(projectRoot);\n const appPrefix = detectAppPrefix(projectRoot, srcPrefix);\n\n // Template-specific entrypoints\n const entrypoints = getEntrypoints(template ?? \"nextjs-app-router\", srcPrefix, appPrefix);\n\n return { srcPrefix, appPrefix, entrypoints };\n}\n\nfunction detectSrcPrefix(projectRoot?: string): string {\n // No projectRoot (template preview) — default to src/ convention\n if (!projectRoot) return \"src/\";\n\n // Actual project — check what exists\n if (existsSync(join(projectRoot, \"src\"))) return \"src/\";\n\n // No src/ directory — use root-level paths\n return \"\";\n}\n\nfunction detectAppPrefix(projectRoot: string | undefined, srcPrefix: string): string {\n if (!projectRoot) return `${srcPrefix}app`;\n\n // Check actual directories for Next.js app router\n if (existsSync(join(projectRoot, \"src\", \"app\"))) return \"src/app\";\n if (existsSync(join(projectRoot, \"app\"))) return \"app\";\n\n // Default follows srcPrefix\n return `${srcPrefix}app`;\n}\n\nfunction getEntrypoints(template: string, srcPrefix: string, appPrefix: string): string[] {\n switch (template) {\n case \"nextjs-app-router\":\n return [`${appPrefix}/layout.tsx`, `${appPrefix}/page.tsx`];\n case \"react-vite\":\n return [`${srcPrefix}main.tsx`, `${srcPrefix}App.tsx`];\n case \"api-service\":\n return [`${srcPrefix}index.ts`, `${srcPrefix}app.ts`, `${srcPrefix}server.ts`];\n default:\n return [`${srcPrefix}index.ts`];\n }\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\nimport { detectProjectLayout } from \"./detect-layout.js\";\n\nexport function buildingBlocksTemplate(\n input: InitProjectInput,\n): TemplateOutput {\n const now = new Date().toISOString();\n\n const layout = detectProjectLayout(input.projectRoot, input.template);\n\n type BlockDef = {\n id: string;\n name: string;\n level: number;\n code_paths: string[];\n interfaces: string[];\n quality_scenarios: string[];\n adrs: string[];\n responsibility: string;\n service: string;\n };\n\n const defaultBlocks: BlockDef[] =\n input.template === \"dotnet-webapi\"\n ? buildDotnetBlocks(input)\n : buildJsBlocks(input, layout);\n\n function buildJsBlocks(inp: InitProjectInput, lt: typeof layout): BlockDef[] {\n const src = lt.srcPrefix;\n const entries = lt.entrypoints;\n // App shell block — template-specific entrypoints\n const appShellName = inp.template === \"nextjs-app-router\"\n ? \"App Shell\"\n : inp.template === \"react-vite\"\n ? \"App Root\"\n : \"Server Entry\";\n\n const appShellResponsibility = inp.template === \"nextjs-app-router\"\n ? \"Root layout, navigation, and top-level page structure\"\n : inp.template === \"react-vite\"\n ? \"Application root, router setup, and top-level providers\"\n : \"Server entry point, middleware setup, and route registration\";\n\n const blocks: BlockDef[] = [\n {\n id: \"app-shell\",\n name: appShellName,\n level: 1,\n code_paths: entries,\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility: appShellResponsibility,\n service: \"main\",\n },\n {\n id: \"ui-components\",\n name: \"UI Components\",\n level: 1,\n code_paths: [`${src}components/`],\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility: \"Shared, reusable UI components\",\n service: \"main\",\n },\n {\n id: \"lib-utilities\",\n name: \"Library & Utilities\",\n level: 1,\n code_paths: [`${src}lib/`],\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility: \"Shared utilities, helpers, and business logic\",\n service: \"main\",\n },\n ];\n\n if (inp.features.includes(\"auth\")) {\n blocks.push({\n id: \"auth-module\",\n name: \"Authentication\",\n level: 1,\n code_paths: [`${src}lib/auth/`],\n interfaces: [],\n quality_scenarios: [\"SEC-01\"],\n adrs: [],\n responsibility:\n \"User authentication, session management, and authorization\",\n service: \"main\",\n });\n }\n\n if (inp.features.includes(\"api\")) {\n const apiPaths = inp.template === \"nextjs-app-router\"\n ? [`${lt.appPrefix}/api/`]\n : [`${src}routes/`, `${src}api/`];\n blocks.push({\n id: \"api-layer\",\n name: \"API Layer\",\n level: 1,\n code_paths: apiPaths,\n interfaces: [],\n quality_scenarios: [\"SEC-03\"],\n adrs: [],\n responsibility: \"API route handlers and server-side logic\",\n service: \"main\",\n });\n }\n\n if (inp.features.includes(\"database\")) {\n blocks.push({\n id: \"data-access\",\n name: \"Data Access\",\n level: 1,\n code_paths: [`${src}lib/db/`],\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility: \"Database connections, queries, and data models\",\n service: \"main\",\n });\n }\n\n // API client block — only for frontend templates that consume a backend API\n if (inp.template === \"nextjs-app-router\" || inp.template === \"react-vite\") {\n blocks.push({\n id: \"api-client\",\n name: \"API Client\",\n level: 1,\n code_paths: [`${src}lib/api/`, `${src}services/`],\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility:\n \"API client layer for communicating with backend services. Defines request/response types, handles errors, and manages the contract with consumed APIs.\",\n service: \"main\",\n });\n }\n\n return blocks;\n }\n\n function buildDotnetBlocks(_inp: InitProjectInput): BlockDef[] {\n const blocks: BlockDef[] = [\n {\n id: \"api-host\",\n name: \"API Host\",\n level: 1,\n code_paths: [\"Program.cs\", \"Extensions/\"],\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility:\n \"Application startup, DI configuration, middleware pipeline\",\n service: \"main\",\n },\n {\n id: \"controllers\",\n name: \"Controllers / Endpoints\",\n level: 1,\n code_paths: [\"Controllers/\", \"Endpoints/\"],\n interfaces: [],\n quality_scenarios: [\"SEC-03\"],\n adrs: [],\n responsibility:\n \"API endpoint definitions — controllers or minimal API endpoint groups\",\n service: \"main\",\n },\n {\n id: \"domain\",\n name: \"Domain\",\n level: 1,\n code_paths: [\"Domain/\", \"Models/\"],\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility: \"Domain entities, value objects, and business rules\",\n service: \"main\",\n },\n {\n id: \"services\",\n name: \"Application Services\",\n level: 1,\n code_paths: [\"Services/\"],\n interfaces: [\"controllers\"],\n quality_scenarios: [],\n adrs: [],\n responsibility:\n \"Business logic, use cases, and orchestration between domain and infrastructure\",\n service: \"main\",\n },\n {\n id: \"middleware\",\n name: \"Middleware\",\n level: 1,\n code_paths: [\"Middleware/\"],\n interfaces: [],\n quality_scenarios: [\"REL-01\"],\n adrs: [],\n responsibility:\n \"Cross-cutting concerns: error handling, logging, correlation IDs, rate limiting\",\n service: \"main\",\n },\n ];\n\n // Auth and data access are core to virtually every .NET API,\n // so always include them (phase tasks reference these block IDs).\n blocks.push({\n id: \"auth-module\",\n name: \"Authentication & Authorization\",\n level: 1,\n code_paths: [\"Auth/\"],\n interfaces: [],\n quality_scenarios: [\"SEC-01\", \"SEC-02\"],\n adrs: [],\n responsibility:\n \"JWT/cookie auth, authorization policies, claims transformation\",\n service: \"main\",\n });\n\n blocks.push({\n id: \"data-access\",\n name: \"Data Access\",\n level: 1,\n code_paths: [\"Data/\", \"Repositories/\", \"Migrations/\"],\n interfaces: [\"domain\"],\n quality_scenarios: [],\n adrs: [],\n responsibility:\n \"EF Core DbContext, repositories, migrations, and query logic\",\n service: \"main\",\n });\n\n return blocks;\n }\n\n return {\n frontmatter: {\n section: \"building-blocks\",\n schema_version: 1,\n last_synced: now,\n blocks: defaultBlocks,\n },\n body: `# Building Block View\n\n## Level 1: Top-Level Decomposition\n\n${defaultBlocks.map((b) => `### ${b.name}\\n\\n**Responsibility:** ${b.responsibility}\\n\\n**Code:** \\`${b.code_paths.join(\"`, `\")}\\``).join(\"\\n\\n\")}\n`,\n };\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\n\nfunction runtimeDiagram(template: string): string {\n switch (template) {\n case \"dotnet-webapi\":\n return `\\`\\`\\`\nClient → Kestrel → Middleware Pipeline → Controller / Endpoint\n → Services (DI)\n → Database / External APIs\n\\`\\`\\``;\n case \"api-service\":\n return `\\`\\`\\`\nClient → HTTP Server → Middleware → Route Handler\n → Services\n → Database / External APIs\n\\`\\`\\``;\n default:\n return `\\`\\`\\`\nBrowser → Next.js Server → Layout (server) → Page (server/client)\n → API Routes (if needed)\n → External Services (if needed)\n\\`\\`\\``;\n }\n}\n\nexport function runtimeViewsTemplate(input: InitProjectInput): TemplateOutput {\n return {\n frontmatter: {\n section: \"runtime-views\",\n schema_version: 1,\n },\n body: `# Runtime View\n\n## Key Runtime Scenarios\n\n### Request Flow\n\n${runtimeDiagram(input.template)}\n\n*Document your key runtime scenarios here. Each scenario should show the interaction between building blocks for an important use case of ${input.name}.*\n`,\n };\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\n\nexport function deploymentTemplate(input: InitProjectInput): TemplateOutput {\n return {\n frontmatter: {\n section: \"deployment\",\n schema_version: 1,\n },\n body: `# Deployment View\n\n## Infrastructure\n\n*Describe the deployment infrastructure for ${input.name}.*\n\n### Deployment Options\n\n${input.template === \"dotnet-webapi\" ? `| Platform | Description | Notes |\n|----------|-------------|-------|\n| Azure App Service | Managed PaaS for .NET | Recommended for ASP.NET Core |\n| Docker / Kubernetes | Container-based | For self-hosted or multi-cloud |\n| AWS ECS / Fargate | Container orchestration | For AWS environments |` : `| Platform | Description | Notes |\n|----------|-------------|-------|\n| Vercel | Recommended for Next.js | Zero-config deployment |\n| Docker | Container-based | For self-hosted environments |`}\n\n## Environment Configuration\n\n| Variable | Description | Required |\n|----------|-------------|----------|\n| \\`${input.template === \"dotnet-webapi\" ? \"ASPNETCORE_ENVIRONMENT\" : \"NODE_ENV\"}\\` | Runtime environment | Yes |\n| *Add your environment variables here* | | |\n`,\n };\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\nimport { detectProjectLayout } from \"./detect-layout.js\";\n\ninterface AdrResult extends TemplateOutput {\n filename: string;\n}\n\nexport function firstAdrTemplate(input: InitProjectInput): AdrResult {\n const now = new Date().toISOString().split(\"T\")[0]!;\n\n if (input.template === \"dotnet-webapi\") {\n return dotnetAdr(input, now);\n }\n\n return nextjsAdr(input, now);\n}\n\nfunction nextjsAdr(input: InitProjectInput, date: string): AdrResult {\n const { appPrefix } = detectProjectLayout(input.projectRoot, input.template);\n\n return {\n filename: \"001-nextjs-app-router.md\",\n frontmatter: {\n id: \"001-nextjs-app-router\",\n title: \"Use Next.js App Router\",\n status: \"accepted\",\n date,\n affected_blocks: [\"app-shell\"],\n affected_files: [`${appPrefix}/`],\n quality_scenarios: [],\n },\n body: `# ADR-001: Use Next.js App Router\n\n## Context\n\n${input.name} needs a modern React framework that supports server-side rendering, static generation, and API routes.\n\n## Decision\n\nUse Next.js with the App Router (introduced in Next.js 13+) as the application framework.\n\n## Consequences\n\n- **Positive:** Server Components by default reduce client-side JavaScript\n- **Positive:** File-based routing with layouts, loading states, and error boundaries\n- **Positive:** Built-in API routes for backend logic\n- **Negative:** App Router has a learning curve compared to Pages Router\n- **Negative:** Some libraries may not yet fully support Server Components\n`,\n };\n}\n\nfunction dotnetAdr(input: InitProjectInput, date: string): AdrResult {\n return {\n filename: \"001-aspnet-core-webapi.md\",\n frontmatter: {\n id: \"001-aspnet-core-webapi\",\n title: \"Use ASP.NET Core Web API\",\n status: \"accepted\",\n date,\n affected_blocks: [\"api-host\", \"controllers\"],\n affected_files: [\"Program.cs\", \"Controllers/\"],\n quality_scenarios: [],\n },\n body: `# ADR-001: Use ASP.NET Core Web API\n\n## Context\n\n${input.name} needs a performant, cross-platform web API framework with strong dependency injection, middleware pipeline, and ecosystem support.\n\n## Decision\n\nUse ASP.NET Core with the minimal hosting model (top-level Program.cs) as the API framework. Support both controller-based and minimal API endpoints.\n\n## Consequences\n\n- **Positive:** High performance with Kestrel, mature ecosystem\n- **Positive:** Built-in DI container, configuration, and middleware pipeline\n- **Positive:** Strong typing and compile-time safety with C#\n- **Positive:** OpenAPI/Swagger generation out of the box\n- **Negative:** Steeper learning curve for the DI and middleware patterns\n- **Negative:** Larger memory footprint compared to minimal frameworks\n`,\n };\n}\n","import type { InitProjectInput } from \"../types.js\";\nimport type { QualityScenariosFile } from \"../../schemas/quality-scenarios.js\";\n\ntype ScenarioList = QualityScenariosFile[\"scenarios\"];\n\n// ─── Shared scenarios (all templates) ───────────────────────────────────────\n\nconst SHARED_SCENARIOS: Record<string, ScenarioList> = {\n security: [\n {\n id: \"SEC-01\",\n name: \"Auth on all API routes\",\n category: \"security\",\n priority: \"must\",\n scenario:\n \"An unauthenticated request hits any API route that requires auth\",\n expected: \"Returns 401 Unauthorized without leaking data\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n {\n id: \"SEC-03\",\n name: \"Input validation on mutations\",\n category: \"security\",\n priority: \"must\",\n scenario: \"A malformed or malicious payload is sent to any mutation endpoint\",\n expected: \"Input is validated and rejected with a descriptive error\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n performance: [\n {\n id: \"PERF-02\",\n name: \"API responses under 200ms\",\n category: \"performance\",\n priority: \"should\",\n scenario: \"Any API endpoint is called under normal load\",\n expected: \"p95 response time is under 200ms\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n reliability: [\n {\n id: \"REL-01\",\n name: \"Graceful error handling\",\n category: \"reliability\",\n priority: \"should\",\n scenario: \"An external service returns an error or times out\",\n expected: \"User sees a meaningful error message, app remains functional\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n maintainability: [\n {\n id: \"MAINT-01\",\n name: \"No circular dependencies\",\n category: \"maintainability\",\n priority: \"must\",\n scenario: \"Dependency graph is analyzed\",\n expected: \"No circular import chains exist\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n {\n id: \"MAINT-02\",\n name: \"Test coverage on business logic\",\n category: \"maintainability\",\n priority: \"should\",\n scenario: \"Test coverage report is generated\",\n expected: \"Business logic modules have >80% line coverage\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n};\n\n// ─── Frontend-specific scenarios (nextjs, react-vite) ───────────────────────\n\nconst FRONTEND_SCENARIOS: Record<string, ScenarioList> = {\n security: [\n {\n id: \"SEC-02\",\n name: \"No secrets in client bundles\",\n category: \"security\",\n priority: \"must\",\n scenario: \"Client-side JavaScript bundle is analyzed\",\n expected:\n \"No API keys, tokens, or secrets are found in client-side code\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n performance: [\n {\n id: \"PERF-01\",\n name: \"Initial page load under 3s\",\n category: \"performance\",\n priority: \"should\",\n scenario: \"User loads the landing page on a 3G connection\",\n expected: \"Largest Contentful Paint (LCP) is under 3 seconds\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"semi-automatic\",\n status: \"untested\",\n },\n ],\n accessibility: [\n {\n id: \"A11Y-01\",\n name: \"WCAG 2.1 AA compliance\",\n category: \"accessibility\",\n priority: \"should\",\n scenario: \"All pages are audited with axe-core\",\n expected: \"No critical or serious accessibility violations\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"semi-automatic\",\n status: \"untested\",\n },\n {\n id: \"A11Y-02\",\n name: \"Keyboard navigation\",\n category: \"accessibility\",\n priority: \"should\",\n scenario: \"User navigates the entire application using only keyboard\",\n expected: \"All interactive elements are reachable and operable via keyboard\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"manual\",\n status: \"untested\",\n },\n ],\n};\n\n// ─── .NET-specific scenarios ────────────────────────────────────────────────\n\nconst DOTNET_SCENARIOS: Record<string, ScenarioList> = {\n security: [\n {\n id: \"SEC-02\",\n name: \"No secrets in configuration or source\",\n category: \"security\",\n priority: \"must\",\n scenario: \"Source code and appsettings files are scanned\",\n expected:\n \"No connection strings, API keys, or secrets are hardcoded; all sensitive values come from environment variables or a secrets manager\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n {\n id: \"SEC-04\",\n name: \"CORS policy restricts origins\",\n category: \"security\",\n priority: \"should\",\n scenario: \"A cross-origin request is made from an untrusted domain\",\n expected: \"Request is rejected by CORS middleware; only explicitly allowed origins succeed\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n performance: [\n {\n id: \"PERF-01\",\n name: \"Startup time under 5s\",\n category: \"performance\",\n priority: \"should\",\n scenario: \"Application starts from cold (e.g., container restart or deployment)\",\n expected: \"Health check endpoint responds within 5 seconds of process start\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"semi-automatic\",\n status: \"untested\",\n },\n {\n id: \"PERF-03\",\n name: \"No excessive memory allocation\",\n category: \"performance\",\n priority: \"should\",\n scenario: \"API handles sustained load of 100 concurrent requests over 60 seconds\",\n expected: \"No Gen2 GC collections triggered; working set stays under configured limit\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"semi-automatic\",\n status: \"untested\",\n },\n {\n id: \"PERF-04\",\n name: \"Async all the way\",\n category: \"performance\",\n priority: \"must\",\n scenario: \"I/O-bound operations (database, HTTP calls, file access) are reviewed\",\n expected: \"All I/O operations use async/await; no sync-over-async or blocking calls on thread pool threads\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"semi-automatic\",\n status: \"untested\",\n },\n ],\n reliability: [\n {\n id: \"REL-02\",\n name: \"Health check covers dependencies\",\n category: \"reliability\",\n priority: \"should\",\n scenario: \"Orchestrator calls the /health endpoint\",\n expected: \"Returns degraded or unhealthy if database or critical external service is unreachable\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n {\n id: \"REL-03\",\n name: \"Structured logging with correlation\",\n category: \"reliability\",\n priority: \"should\",\n scenario: \"A request flows through multiple layers (controller → service → repository)\",\n expected: \"All log entries share a correlation ID; logs are structured JSON with severity, timestamp, and context\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"semi-automatic\",\n status: \"untested\",\n },\n ],\n maintainability: [\n {\n id: \"MAINT-03\",\n name: \"DI registration matches interfaces\",\n category: \"maintainability\",\n priority: \"should\",\n scenario: \"Dependency injection container is validated at startup\",\n expected: \"All constructor-injected interfaces have a registered implementation; no runtime resolution failures\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n};\n\n// ─── API-only scenarios (api-service) ───────────────────────────────────────\n\nconst API_SCENARIOS: Record<string, ScenarioList> = {\n security: [\n {\n id: \"SEC-02\",\n name: \"No secrets in environment or source\",\n category: \"security\",\n priority: \"must\",\n scenario: \"Source code and config files are scanned\",\n expected:\n \"No API keys, tokens, or secrets are hardcoded; all come from environment variables\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n};\n\n// ─── Template → scenario set mapping ────────────────────────────────────────\n\nconst TEMPLATE_SCENARIOS: Record<string, Record<string, ScenarioList>> = {\n \"nextjs-app-router\": FRONTEND_SCENARIOS,\n \"react-vite\": FRONTEND_SCENARIOS,\n \"api-service\": API_SCENARIOS,\n \"dotnet-webapi\": DOTNET_SCENARIOS,\n};\n\n/**\n * Merge shared + template-specific scenarios for a given category.\n * Template-specific scenarios with the same ID override shared ones.\n */\nfunction mergeScenarios(\n template: string,\n category: string,\n): ScenarioList {\n const shared = SHARED_SCENARIOS[category] ?? [];\n const specific = (TEMPLATE_SCENARIOS[template] ?? {})[category] ?? [];\n\n // Template-specific scenarios override shared ones with the same ID\n const specificIds = new Set(specific.map((s) => s.id));\n const merged = shared.filter((s) => !specificIds.has(s.id));\n return [...merged, ...specific];\n}\n\nexport function qualityScenariosTemplate(\n input: InitProjectInput,\n): QualityScenariosFile {\n const now = new Date().toISOString();\n\n const goals = input.quality_priorities.map((q, i) => ({\n id: q as QualityScenariosFile[\"quality_goals\"][number][\"id\"],\n priority: i + 1,\n description: `${q.charAt(0).toUpperCase() + q.slice(1)} is a priority for ${input.name}`,\n }));\n\n const scenarios = input.quality_priorities.flatMap(\n (q) => mergeScenarios(input.template, q),\n );\n\n return {\n schema_version: 1,\n last_updated: now,\n quality_goals: goals,\n scenarios,\n };\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\n\nfunction dotnetConcepts(): string {\n return `## Error Handling\n\n*Document the error handling strategy once established.*\n\n- Exception handling middleware approach (ProblemDetails / RFC 7807)\n- Correlation IDs for request tracing\n- Error response format and status code conventions\n\n## Logging\n\n*Document the logging strategy once established.*\n\n- Logging framework (Serilog, NLog, built-in)\n- Structured logging format and required fields\n- Log levels and when to use each\n\n## Authentication & Authorization\n\n*Document the auth approach once established.*\n\n- Auth mechanism (JWT bearer, cookie, OAuth)\n- Authorization policy definitions\n- Claims and role structure\n\n## Validation\n\n*Document the validation approach once established.*\n\n- Validation framework (FluentValidation, data annotations)\n- Where validation runs (middleware, controller, service layer)\n- Error response format for validation failures\n\n## Database Access\n\n*Document the data access patterns once established.*\n\n- ORM/query approach (EF Core, Dapper)\n- Repository vs. direct DbContext usage\n- Transaction management\n- Migration strategy\n\n## Dependency Injection\n\n*Document DI conventions once established.*\n\n- Service registration organization (by feature, by layer)\n- Lifetime choices (Scoped, Singleton, Transient) and when to use each\n- Options pattern for configuration\n\n## API Contract\n\n*Document how this service exposes its API to consumers.*\n\n- OpenAPI/Swagger generation approach\n- How consumers (frontend, other services) discover and use the API contract\n- Versioning strategy for breaking changes\n- Response envelope format and error conventions\n\n## Events & Messaging\n\n*Document if this service publishes or subscribes to events/messages.*\n\n- Messaging infrastructure (RabbitMQ, Azure Service Bus, Kafka, MediatR, etc.)\n- Event naming conventions and schema format\n- Publisher/subscriber topology — which services produce and consume which events\n- Error handling and retry strategy for failed message processing\n- Schema versioning approach for event contracts\n`;\n}\n\nfunction frontendConcepts(): string {\n return `## State Management\n\n*Document the state management approach once established.*\n\n- Global state solution (Context, Zustand, Redux, etc.)\n- Server state management (React Query, SWR, etc.)\n- When to use local vs. global state\n\n## Component Patterns\n\n*Document component conventions once established.*\n\n- Component file structure and naming\n- Props interface conventions\n- Server vs. client component decision criteria\n- Composition patterns (compound components, render props, etc.)\n\n## Styling\n\n*Document the styling approach once established.*\n\n- Styling solution (Tailwind, CSS Modules, styled-components, etc.)\n- Design tokens and theme structure\n- Responsive breakpoints\n\n## Error Handling\n\n*Document error handling patterns once established.*\n\n- Error boundary placement and behavior\n- API error handling and user-facing messages\n- Loading and empty state patterns\n\n## Authentication\n\n*Document the auth approach once established.*\n\n- Auth flow (session, JWT, OAuth)\n- Protected route implementation\n- Auth state management\n\n## Data Fetching\n\n*Document data fetching patterns once established.*\n\n- Server-side vs. client-side fetching strategy\n- Caching and revalidation approach\n- API client structure and conventions\n\n## API Contract\n\n*Document how this frontend communicates with backend services.*\n\n- Backend API base URL and environment configuration\n- How request/response types are defined (OpenAPI-generated, manual, shared package)\n- Error response handling (how backend errors map to UI states)\n- Authentication token flow (how auth tokens are passed to the API)\n- If using OpenAPI: how to regenerate types when the backend contract changes\n`;\n}\n\nfunction apiConcepts(): string {\n return `## Error Handling\n\n*Document the error handling strategy once established.*\n\n- Error response format and status codes\n- Error middleware/handler approach\n- Correlation IDs for request tracing\n\n## Logging\n\n*Document the logging strategy once established.*\n\n- Logging library and format\n- Log levels and conventions\n- Request/response logging\n\n## Authentication & Authorization\n\n*Document the auth approach once established.*\n\n- Auth mechanism (JWT, session, API key)\n- Middleware structure for auth\n- Role/permission model\n\n## Validation\n\n*Document the validation approach once established.*\n\n- Validation library (Zod, Joi, etc.)\n- Where validation runs (middleware, handler)\n- Error format for validation failures\n\n## Database Access\n\n*Document the data access patterns once established.*\n\n- ORM/query builder choice\n- Connection pooling and transaction patterns\n- Migration strategy\n\n## API Contract\n\n*Document how this service exposes its API to consumers.*\n\n- OpenAPI/Swagger generation approach\n- How consumers (frontend, other services) discover and use the API contract\n- Versioning strategy for breaking changes\n- Response envelope format and error conventions\n\n## Events & Messaging\n\n*Document if this service publishes or subscribes to events/messages.*\n\n- Messaging infrastructure (RabbitMQ, Kafka, Redis Pub/Sub, etc.)\n- Event naming conventions and schema format\n- Publisher/subscriber topology\n- Error handling and retry strategy for failed message processing\n- Schema versioning approach for event contracts\n`;\n}\n\nexport function crosscuttingTemplate(input: InitProjectInput): TemplateOutput {\n const isDotnet = input.template === \"dotnet-webapi\";\n const isFrontend = input.template === \"nextjs-app-router\" || input.template === \"react-vite\";\n\n let concepts: string;\n if (isDotnet) {\n concepts = dotnetConcepts();\n } else if (isFrontend) {\n concepts = frontendConcepts();\n } else {\n concepts = apiConcepts();\n }\n\n return {\n frontmatter: {\n section: \"crosscutting-concepts\",\n schema_version: 1,\n },\n body: `# Crosscutting Concepts\n\nThis section documents patterns and conventions that apply across multiple building blocks. Update this as patterns are established — it serves as the single source of truth for \"how we do things\" in ${input.name}.\n\n> **For agents:** Consult this document before implementing any crosscutting concern. If you establish a new pattern, document it here so other code follows the same approach.\n\n${concepts}`,\n };\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\n\nexport function risksDebtTemplate(input: InitProjectInput): TemplateOutput {\n return {\n frontmatter: {\n section: \"risks-debt\",\n schema_version: 1,\n },\n body: `# Risks and Technical Debt\n\n## Known Risks\n\n| Risk | Impact | Probability | Mitigation |\n|------|--------|-------------|------------|\n| *Identify project risks* | *High/Medium/Low* | *High/Medium/Low* | *Describe mitigation* |\n\n## Technical Debt\n\nTrack technical debt items for ${input.name} here. Each item should include:\n- **Description**: What the debt is\n- **Impact**: How it affects the system\n- **Effort**: Estimated effort to resolve\n- **Priority**: When it should be addressed\n`,\n };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { stringify } from \"yaml\";\nimport type { PhasesFile, TaskFile } from \"../schemas/phases.js\";\nimport type { InitProjectInput } from \"../templates/types.js\";\nimport {\n phasePlanTemplate as nextjsPlan,\n phaseTasksTemplate as nextjsTasks,\n} from \"../templates/phases/nextjs-app-router.js\";\nimport {\n phasePlanTemplate as reactVitePlan,\n phaseTasksTemplate as reactViteTasks,\n} from \"../templates/phases/react-vite.js\";\nimport {\n phasePlanTemplate as apiServicePlan,\n phaseTasksTemplate as apiServiceTasks,\n} from \"../templates/phases/api-service.js\";\nimport {\n phasePlanTemplate as dotnetWebapiPlan,\n phaseTasksTemplate as dotnetWebapiTasks,\n} from \"../templates/phases/dotnet-webapi.js\";\n\ntype PlanFn = (input: InitProjectInput) => PhasesFile;\ntype TasksFn = (input: InitProjectInput, phaseId: string) => TaskFile | null;\n\nconst planTemplates: Record<string, { plan: PlanFn; tasks: TasksFn }> = {\n \"nextjs-app-router\": { plan: nextjsPlan, tasks: nextjsTasks },\n \"react-vite\": { plan: reactVitePlan, tasks: reactViteTasks },\n \"api-service\": { plan: apiServicePlan, tasks: apiServiceTasks },\n \"dotnet-webapi\": { plan: dotnetWebapiPlan, tasks: dotnetWebapiTasks },\n};\n\nexport function generatePlan(\n targetDir: string,\n input: InitProjectInput,\n): void {\n const planDir = join(targetDir, \".arcbridge\", \"plan\");\n const tasksDir = join(planDir, \"tasks\");\n\n mkdirSync(planDir, { recursive: true });\n mkdirSync(tasksDir, { recursive: true });\n\n // Write phases.yaml\n const tmpl = planTemplates[input.template] ?? planTemplates[\"nextjs-app-router\"]!;\n const phasePlan = tmpl.plan(input);\n writeFileSync(join(planDir, \"phases.yaml\"), stringify(phasePlan), \"utf-8\");\n\n // Write task files for each phase\n for (const phase of phasePlan.phases) {\n const taskFile = tmpl.tasks(input, phase.id);\n if (taskFile) {\n writeFileSync(\n join(tasksDir, `${phase.id}.yaml`),\n stringify(taskFile),\n \"utf-8\",\n );\n }\n }\n\n // Write empty sync log\n writeFileSync(\n join(planDir, \"sync-log.md\"),\n `# Sync Log\\n\\nArchitecture sync events are recorded here.\\n`,\n \"utf-8\",\n );\n}\n","import type { PhasesFile, TaskFile } from \"../../schemas/phases.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function phasePlanTemplate(_input: InitProjectInput): PhasesFile {\n const phases = [\n {\n id: \"phase-0-setup\",\n name: \"Project Setup\",\n phase_number: 0,\n status: \"in-progress\" as const,\n description:\n \"Initialize project structure, install dependencies, configure tooling\",\n gate_requirements: [\n \"Project builds successfully\",\n \"Dev server starts without errors\",\n \"Linting and formatting configured\",\n ],\n },\n {\n id: \"phase-1-foundation\",\n name: \"Foundation\",\n phase_number: 1,\n status: \"planned\" as const,\n description: \"Core layout, navigation, and shared components\",\n gate_requirements: [\n \"Root layout renders correctly\",\n \"Navigation works between pages\",\n \"Quality scenarios SEC-01, MAINT-01 verified\",\n ],\n },\n {\n id: \"phase-2-features\",\n name: \"Core Features\",\n phase_number: 2,\n status: \"planned\" as const,\n description: \"Implement the primary features of the application\",\n gate_requirements: [\n \"Core user flows work end-to-end\",\n \"Test coverage meets thresholds\",\n \"Performance budgets met\",\n ],\n },\n {\n id: \"phase-3-polish\",\n name: \"Polish & Launch\",\n phase_number: 3,\n status: \"planned\" as const,\n description:\n \"Error handling, accessibility, performance optimization, deployment\",\n gate_requirements: [\n \"All quality scenarios passing\",\n \"Accessibility audit passes\",\n \"Production deployment successful\",\n ],\n },\n ];\n\n return { schema_version: 1, phases };\n}\n\nexport function phaseTasksTemplate(\n _input: InitProjectInput,\n phaseId: string,\n): TaskFile | null {\n const tasksByPhase: Record<string, TaskFile> = {\n \"phase-0-setup\": {\n schema_version: 1,\n phase_id: \"phase-0-setup\",\n tasks: [\n {\n id: \"task-0.1-init-nextjs\",\n title: \"Initialize Next.js project\",\n status: \"todo\",\n building_block: \"app-shell\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"Next.js app created with App Router\",\n \"TypeScript configured in strict mode\",\n \"Project runs with `npm run dev`\",\n ],\n },\n {\n id: \"task-0.2-tooling\",\n title: \"Configure development tooling\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-01\"],\n acceptance_criteria: [\n \"ESLint configured with recommended rules\",\n \"Prettier configured for consistent formatting\",\n \"Git hooks set up for pre-commit checks\",\n ],\n },\n {\n id: \"task-0.3-testing\",\n title: \"Set up testing infrastructure\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-02\"],\n acceptance_criteria: [\n \"Vitest configured for unit tests\",\n \"Playwright configured for E2E tests\",\n \"Test scripts added to package.json\",\n ],\n },\n ],\n },\n \"phase-1-foundation\": {\n schema_version: 1,\n phase_id: \"phase-1-foundation\",\n tasks: [\n {\n id: \"task-1.1-layout\",\n title: \"Create root layout and navigation\",\n status: \"todo\",\n building_block: \"app-shell\",\n quality_scenarios: [\"A11Y-01\", \"A11Y-02\"],\n acceptance_criteria: [\n \"Root layout with metadata configured\",\n \"Navigation component with keyboard accessibility\",\n \"Responsive design for mobile and desktop\",\n ],\n },\n {\n id: \"task-1.2-shared-components\",\n title: \"Build shared UI components\",\n status: \"todo\",\n building_block: \"ui-components\",\n quality_scenarios: [\"A11Y-01\"],\n acceptance_criteria: [\n \"Button, Input, and Card components created\",\n \"Components follow accessibility guidelines\",\n \"Component tests written\",\n ],\n },\n {\n id: \"task-1.3-api-client\",\n title: \"Set up API client layer\",\n status: \"todo\",\n building_block: \"api-client\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"API client module created with typed request/response interfaces\",\n \"Base URL and auth token handling configured\",\n \"Error handling standardized (network errors, API errors, validation errors)\",\n \"Request/response types match the backend API contract\",\n \"Document the API contract approach in an ADR (e.g., OpenAPI-generated types vs. manual types)\",\n ],\n },\n {\n id: \"task-1.4-document-decisions\",\n title: \"Document architectural decisions as ADRs\",\n status: \"todo\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"ADR for each significant technology or pattern choice made in this phase\",\n \"ADRs include context, decision, and consequences\",\n \"ADRs linked to affected building blocks and code paths\",\n ],\n },\n ],\n },\n };\n\n return tasksByPhase[phaseId] ?? null;\n}\n","import type { PhasesFile, TaskFile } from \"../../schemas/phases.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function phasePlanTemplate(_input: InitProjectInput): PhasesFile {\n const phases = [\n {\n id: \"phase-0-setup\",\n name: \"Project Setup\",\n phase_number: 0,\n status: \"in-progress\" as const,\n description:\n \"Initialize Vite + React project, configure TypeScript, install dependencies\",\n gate_requirements: [\n \"Project builds successfully with Vite\",\n \"Dev server starts without errors\",\n \"Linting and formatting configured\",\n ],\n },\n {\n id: \"phase-1-foundation\",\n name: \"Foundation\",\n phase_number: 1,\n status: \"planned\" as const,\n description: \"Core layout, routing, state management, and shared components\",\n gate_requirements: [\n \"Router configured with all primary routes\",\n \"Shared component library established\",\n \"Quality scenarios SEC-01, MAINT-01 verified\",\n ],\n },\n {\n id: \"phase-2-features\",\n name: \"Core Features\",\n phase_number: 2,\n status: \"planned\" as const,\n description: \"Implement the primary features of the application\",\n gate_requirements: [\n \"Core user flows work end-to-end\",\n \"Test coverage meets thresholds\",\n \"Performance budgets met\",\n ],\n },\n {\n id: \"phase-3-polish\",\n name: \"Polish & Launch\",\n phase_number: 3,\n status: \"planned\" as const,\n description:\n \"Error handling, accessibility, performance optimization, deployment\",\n gate_requirements: [\n \"All quality scenarios passing\",\n \"Accessibility audit passes\",\n \"Production build optimized and deployed\",\n ],\n },\n ];\n\n return { schema_version: 1, phases };\n}\n\nexport function phaseTasksTemplate(\n _input: InitProjectInput,\n phaseId: string,\n): TaskFile | null {\n const tasksByPhase: Record<string, TaskFile> = {\n \"phase-0-setup\": {\n schema_version: 1,\n phase_id: \"phase-0-setup\",\n tasks: [\n {\n id: \"task-0.1-init-vite\",\n title: \"Initialize Vite + React project\",\n status: \"todo\",\n building_block: \"app-shell\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"Vite + React app created with TypeScript\",\n \"TypeScript configured in strict mode\",\n \"Project runs with `npm run dev`\",\n ],\n },\n {\n id: \"task-0.2-tooling\",\n title: \"Configure development tooling\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-01\"],\n acceptance_criteria: [\n \"ESLint configured with recommended rules\",\n \"Prettier configured for consistent formatting\",\n \"Git hooks set up for pre-commit checks\",\n ],\n },\n {\n id: \"task-0.3-routing\",\n title: \"Set up client-side routing\",\n status: \"todo\",\n building_block: \"app-shell\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"React Router (or TanStack Router) installed and configured\",\n \"Route structure matches planned building blocks\",\n \"404 handling configured\",\n ],\n },\n {\n id: \"task-0.4-testing\",\n title: \"Set up testing infrastructure\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-02\"],\n acceptance_criteria: [\n \"Vitest configured for unit tests\",\n \"Testing Library configured for component tests\",\n \"Test scripts added to package.json\",\n ],\n },\n ],\n },\n \"phase-1-foundation\": {\n schema_version: 1,\n phase_id: \"phase-1-foundation\",\n tasks: [\n {\n id: \"task-1.1-layout\",\n title: \"Create app layout and navigation\",\n status: \"todo\",\n building_block: \"app-shell\",\n quality_scenarios: [\"A11Y-01\", \"A11Y-02\"],\n acceptance_criteria: [\n \"App shell with header, content, and footer\",\n \"Navigation component with keyboard accessibility\",\n \"Responsive design for mobile and desktop\",\n ],\n },\n {\n id: \"task-1.2-shared-components\",\n title: \"Build shared UI components\",\n status: \"todo\",\n building_block: \"ui-components\",\n quality_scenarios: [\"A11Y-01\"],\n acceptance_criteria: [\n \"Button, Input, and Card components created\",\n \"Components follow accessibility guidelines\",\n \"Component tests written\",\n ],\n },\n {\n id: \"task-1.3-api-client\",\n title: \"Set up API client layer\",\n status: \"todo\",\n building_block: \"api-client\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"API client module created with typed request/response interfaces\",\n \"Base URL and auth token handling configured\",\n \"Error handling standardized (network errors, API errors, validation errors)\",\n \"Request/response types match the backend API contract\",\n \"Document the API contract approach in an ADR (e.g., OpenAPI-generated types vs. manual types)\",\n ],\n },\n {\n id: \"task-1.4-document-decisions\",\n title: \"Document architectural decisions as ADRs\",\n status: \"todo\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"ADR for each significant technology or pattern choice made in this phase\",\n \"ADRs include context, decision, and consequences\",\n \"ADRs linked to affected building blocks and code paths\",\n ],\n },\n ],\n },\n };\n\n return tasksByPhase[phaseId] ?? null;\n}\n","import type { PhasesFile, TaskFile } from \"../../schemas/phases.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function phasePlanTemplate(_input: InitProjectInput): PhasesFile {\n const phases = [\n {\n id: \"phase-0-setup\",\n name: \"Project Setup\",\n phase_number: 0,\n status: \"in-progress\" as const,\n description:\n \"Initialize API service, configure TypeScript, set up database and middleware\",\n gate_requirements: [\n \"Project builds successfully\",\n \"Server starts and responds to health check\",\n \"Linting and formatting configured\",\n ],\n },\n {\n id: \"phase-1-foundation\",\n name: \"Foundation\",\n phase_number: 1,\n status: \"planned\" as const,\n description: \"Core middleware, authentication, error handling, and database layer\",\n gate_requirements: [\n \"Auth middleware protects routes\",\n \"Error handler returns consistent responses\",\n \"Database migrations run successfully\",\n \"Quality scenarios SEC-01, SEC-02 verified\",\n ],\n },\n {\n id: \"phase-2-features\",\n name: \"Core API\",\n phase_number: 2,\n status: \"planned\" as const,\n description: \"Implement the primary API endpoints and business logic\",\n gate_requirements: [\n \"All CRUD endpoints for core resources work\",\n \"Input validation on all endpoints\",\n \"API documentation generated\",\n \"Test coverage meets thresholds\",\n ],\n },\n {\n id: \"phase-3-production\",\n name: \"Production Readiness\",\n phase_number: 3,\n status: \"planned\" as const,\n description:\n \"Rate limiting, logging, monitoring, performance optimization, deployment\",\n gate_requirements: [\n \"All quality scenarios passing\",\n \"Rate limiting configured\",\n \"Structured logging in place\",\n \"Production deployment successful\",\n ],\n },\n ];\n\n return { schema_version: 1, phases };\n}\n\nexport function phaseTasksTemplate(\n _input: InitProjectInput,\n phaseId: string,\n): TaskFile | null {\n const tasksByPhase: Record<string, TaskFile> = {\n \"phase-0-setup\": {\n schema_version: 1,\n phase_id: \"phase-0-setup\",\n tasks: [\n {\n id: \"task-0.1-init-api\",\n title: \"Initialize API project\",\n status: \"todo\",\n building_block: \"api-core\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"Express/Fastify/Hono server created with TypeScript\",\n \"TypeScript configured in strict mode\",\n \"Health check endpoint responds at /health\",\n ],\n },\n {\n id: \"task-0.2-database\",\n title: \"Set up database layer\",\n status: \"todo\",\n building_block: \"data-access\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"Database connection configured\",\n \"Migration system in place\",\n \"Connection pooling configured\",\n ],\n },\n {\n id: \"task-0.3-tooling\",\n title: \"Configure development tooling\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-01\"],\n acceptance_criteria: [\n \"ESLint configured with recommended rules\",\n \"Prettier configured for consistent formatting\",\n \"Hot reload configured for development\",\n ],\n },\n {\n id: \"task-0.4-testing\",\n title: \"Set up testing infrastructure\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-02\"],\n acceptance_criteria: [\n \"Vitest configured for unit tests\",\n \"Supertest configured for API integration tests\",\n \"Test scripts added to package.json\",\n ],\n },\n ],\n },\n \"phase-1-foundation\": {\n schema_version: 1,\n phase_id: \"phase-1-foundation\",\n tasks: [\n {\n id: \"task-1.1-auth\",\n title: \"Implement authentication middleware\",\n status: \"todo\",\n building_block: \"api-core\",\n quality_scenarios: [\"SEC-01\", \"SEC-02\"],\n acceptance_criteria: [\n \"JWT or session-based auth configured\",\n \"Protected route middleware working\",\n \"Auth tests cover happy path and edge cases\",\n ],\n },\n {\n id: \"task-1.2-error-handling\",\n title: \"Set up global error handling\",\n status: \"todo\",\n building_block: \"api-core\",\n quality_scenarios: [\"REL-01\"],\n acceptance_criteria: [\n \"Consistent error response format\",\n \"Unhandled errors caught and logged\",\n \"No stack traces leaked in production\",\n ],\n },\n {\n id: \"task-1.3-validation\",\n title: \"Set up input validation\",\n status: \"todo\",\n building_block: \"api-core\",\n quality_scenarios: [\"SEC-03\"],\n acceptance_criteria: [\n \"Request body validation with Zod or similar\",\n \"Query parameter validation\",\n \"Descriptive validation error messages\",\n ],\n },\n {\n id: \"task-1.4-api-documentation\",\n title: \"Set up API documentation\",\n status: \"todo\",\n building_block: \"api-core\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"OpenAPI/Swagger spec generated from route definitions\",\n \"All endpoints have descriptions and response types\",\n \"Request/response schemas documented\",\n \"OpenAPI spec is the API contract — frontend clients should generate types from it\",\n \"Use arcbridge_get_route_map to verify all routes are captured\",\n \"Update .arcbridge/arc42/03-context.md with API consumers (frontend, mobile, etc.)\",\n ],\n },\n {\n id: \"task-1.5-document-decisions\",\n title: \"Document architectural decisions as ADRs\",\n status: \"todo\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"ADR for each significant technology or pattern choice made in this phase\",\n \"ADRs include context, decision, and consequences\",\n \"ADRs linked to affected building blocks and code paths\",\n ],\n },\n ],\n },\n };\n\n return tasksByPhase[phaseId] ?? null;\n}\n","import type { PhasesFile, TaskFile } from \"../../schemas/phases.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function phasePlanTemplate(_input: InitProjectInput): PhasesFile {\n const phases = [\n {\n id: \"phase-0-setup\",\n name: \"Project Setup\",\n phase_number: 0,\n status: \"in-progress\" as const,\n description:\n \"Initialize ASP.NET Core project, configure DI, set up database and middleware pipeline\",\n gate_requirements: [\n \"Project builds and runs successfully\",\n \"Health check endpoint responds at /health\",\n \"DI container configured with core services\",\n \"Logging and configuration in place\",\n ],\n },\n {\n id: \"phase-1-foundation\",\n name: \"Foundation\",\n phase_number: 1,\n status: \"planned\" as const,\n description:\n \"Authentication, authorization, error handling, database access, and input validation\",\n gate_requirements: [\n \"Auth middleware protects endpoints\",\n \"Global exception handler returns ProblemDetails\",\n \"EF Core / Dapper data access layer works\",\n \"Quality scenarios SEC-01, SEC-02 verified\",\n ],\n },\n {\n id: \"phase-2-features\",\n name: \"Core API\",\n phase_number: 2,\n status: \"planned\" as const,\n description:\n \"Implement the primary API endpoints, business logic, and domain models\",\n gate_requirements: [\n \"All CRUD endpoints for core resources work\",\n \"Input validation via FluentValidation or data annotations\",\n \"OpenAPI/Swagger documentation generated\",\n \"Integration test coverage meets thresholds\",\n ],\n },\n {\n id: \"phase-3-production\",\n name: \"Production Readiness\",\n phase_number: 3,\n status: \"planned\" as const,\n description:\n \"Rate limiting, health checks, structured logging, performance optimization, deployment\",\n gate_requirements: [\n \"All quality scenarios passing\",\n \"Rate limiting configured\",\n \"Structured logging with Serilog or similar\",\n \"Docker containerization ready\",\n \"Production deployment successful\",\n ],\n },\n ];\n\n return { schema_version: 1, phases };\n}\n\nexport function phaseTasksTemplate(\n _input: InitProjectInput,\n phaseId: string,\n): TaskFile | null {\n const tasksByPhase: Record<string, TaskFile> = {\n \"phase-0-setup\": {\n schema_version: 1,\n phase_id: \"phase-0-setup\",\n tasks: [\n {\n id: \"task-0.1-init-project\",\n title: \"Initialize ASP.NET Core Web API project\",\n status: \"todo\",\n building_block: \"api-host\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"dotnet new webapi project created\",\n \"Program.cs configured with minimal hosting model\",\n \"Health check endpoint responds at /health\",\n ],\n },\n {\n id: \"task-0.2-di-setup\",\n title: \"Configure dependency injection\",\n status: \"todo\",\n building_block: \"api-host\",\n quality_scenarios: [\"MAINT-01\"],\n acceptance_criteria: [\n \"Service registration organized by feature/layer\",\n \"Extension methods for service groups (AddApplicationServices, AddInfrastructure)\",\n \"Configuration bound to strongly-typed options classes\",\n ],\n },\n {\n id: \"task-0.3-database\",\n title: \"Set up database and data access\",\n status: \"todo\",\n building_block: \"data-access\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"EF Core or Dapper configured\",\n \"Database migrations in place\",\n \"Connection string managed via configuration\",\n ],\n },\n {\n id: \"task-0.4-testing\",\n title: \"Set up testing infrastructure\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-02\"],\n acceptance_criteria: [\n \"xUnit or NUnit test project created\",\n \"WebApplicationFactory configured for integration tests\",\n \"Test database setup (in-memory or test container)\",\n ],\n },\n ],\n },\n \"phase-1-foundation\": {\n schema_version: 1,\n phase_id: \"phase-1-foundation\",\n tasks: [\n {\n id: \"task-1.1-auth\",\n title: \"Implement authentication and authorization\",\n status: \"todo\",\n building_block: \"auth-module\",\n quality_scenarios: [\"SEC-01\", \"SEC-02\"],\n acceptance_criteria: [\n \"JWT bearer or cookie auth configured\",\n \"Authorization policies defined\",\n \"Auth middleware applied to protected endpoints\",\n \"Auth tests cover happy path and edge cases\",\n ],\n },\n {\n id: \"task-1.2-error-handling\",\n title: \"Set up global exception handling\",\n status: \"todo\",\n building_block: \"api-host\",\n quality_scenarios: [\"REL-01\"],\n acceptance_criteria: [\n \"Exception handler middleware returns RFC 7807 ProblemDetails\",\n \"Unhandled exceptions logged with correlation ID\",\n \"No stack traces leaked in production\",\n ],\n },\n {\n id: \"task-1.3-validation\",\n title: \"Set up input validation\",\n status: \"todo\",\n building_block: \"api-host\",\n quality_scenarios: [\"SEC-03\"],\n acceptance_criteria: [\n \"FluentValidation or data annotations configured\",\n \"Validation filter returns 400 with details\",\n \"Descriptive validation error messages\",\n ],\n },\n {\n id: \"task-1.4-middleware\",\n title: \"Configure middleware pipeline\",\n status: \"todo\",\n building_block: \"middleware\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"CORS policy configured\",\n \"Request/response logging middleware\",\n \"Middleware order documented\",\n ],\n },\n {\n id: \"task-1.5-api-documentation\",\n title: \"Set up API documentation\",\n status: \"todo\",\n building_block: \"api-host\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"Swagger/OpenAPI enabled and accessible in development\",\n \"All endpoints have summary and response type annotations\",\n \"Request/response DTOs documented with XML comments or attributes\",\n \"OpenAPI spec is the API contract — frontend clients should generate types from it\",\n \"Use arcbridge_get_route_map to verify all routes are captured\",\n \"Update .arcbridge/arc42/03-context.md with API consumers (frontend, mobile, etc.)\",\n ],\n },\n {\n id: \"task-1.6-document-decisions\",\n title: \"Document architectural decisions as ADRs\",\n status: \"todo\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"ADR for each significant technology or pattern choice made in this phase\",\n \"ADRs include context, decision, and consequences\",\n \"ADRs linked to affected building blocks and code paths\",\n ],\n },\n ],\n },\n };\n\n return tasksByPhase[phaseId] ?? null;\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport matter from \"gray-matter\";\nimport type { AgentRole } from \"../schemas/agent-roles.js\";\nimport { architectTemplate } from \"../templates/agents/architect.js\";\nimport { implementerTemplate } from \"../templates/agents/implementer.js\";\nimport { securityReviewerTemplate } from \"../templates/agents/security-reviewer.js\";\nimport { qualityGuardianTemplate } from \"../templates/agents/quality-guardian.js\";\nimport { phaseManagerTemplate } from \"../templates/agents/phase-manager.js\";\nimport { onboardingTemplate } from \"../templates/agents/onboarding.js\";\nimport { codeReviewerTemplate } from \"../templates/agents/code-reviewer.js\";\nimport { uxReviewerTemplate } from \"../templates/agents/ux-reviewer.js\";\n\n/** Templates that have UI components and benefit from UX review */\nconst UI_TEMPLATES = new Set([\"nextjs-app-router\", \"react-vite\"]);\n\nfunction writeAgentRole(dir: string, role: AgentRole): void {\n const { system_prompt, ...frontmatter } = role;\n const content = matter.stringify(system_prompt, frontmatter);\n writeFileSync(join(dir, `${role.role_id}.md`), content, \"utf-8\");\n}\n\nexport function generateAgentRoles(\n targetDir: string,\n template?: string,\n): AgentRole[] {\n const agentsDir = join(targetDir, \".arcbridge\", \"agents\");\n mkdirSync(agentsDir, { recursive: true });\n\n const roles: AgentRole[] = [\n architectTemplate(),\n implementerTemplate(),\n securityReviewerTemplate(),\n qualityGuardianTemplate(),\n phaseManagerTemplate(),\n onboardingTemplate(),\n codeReviewerTemplate(),\n ];\n\n // Add UX reviewer only for projects with UI components\n if (template && UI_TEMPLATES.has(template)) {\n roles.push(uxReviewerTemplate());\n }\n\n for (const role of roles) {\n writeAgentRole(agentsDir, role);\n }\n\n return roles;\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function architectTemplate(): AgentRole {\n return {\n role_id: \"architect\",\n name: \"Architect\",\n description:\n \"Designs system structure, makes architectural decisions, and maintains the arc42 documentation\",\n version: 1,\n required_tools: [\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 denied_tools: [],\n read_only: false,\n quality_focus: [\n \"maintainability\",\n \"reliability\",\n \"security\",\n \"performance\",\n ],\n model_preferences: {\n reasoning_depth: \"high\",\n speed_priority: \"low\",\n suggested_models: {\n claude: \"claude-opus-4-6\",\n },\n },\n platform_overrides: {\n claude: { constraint_style: \"narrative\" },\n copilot: { tool_access: \"full\" },\n },\n system_prompt: `You are the Architect agent for this project.\n\n## Your Responsibilities\n\n- Design and maintain the system's building block structure\n- Make and document architectural decisions (ADRs)\n- Ensure all modules map to documented building blocks\n- Review quality scenarios and ensure architectural support\n- Detect and resolve architectural drift\n- **Keep all arc42 documentation sections up to date as the project evolves**\n- **Define and maintain contracts with external services** — if this project consumes or exposes APIs, or publishes/subscribes to events, ensure each contract is explicit, typed, and documented\n\n## Constraints\n\n- Justify every new dependency with an ADR\n- Map every new module to a building block\n- Update arc42 documentation when structure changes\n- Flag boundary-crossing code instead of silently introducing dependencies\n- When this project communicates with external services (REST APIs, events/messaging, gRPC), the contract must be explicit — define request/response types or event schemas, document the approach in an ADR, and update Section 03 (Context) with the external system\n\n## Arc42 Documentation Sections\n\nYou are responsible for maintaining these sections in \\`.arcbridge/arc42/\\`. Update them as the project evolves — they are the living architecture documentation.\n\n| Section | File | When to update |\n|---------|------|----------------|\n| **01 Introduction & Goals** | \\`01-introduction.md\\` | When project scope, stakeholders, or key goals change |\n| **03 Context & Scope** | \\`03-context.md\\` | When adding/removing external systems, APIs, or integrations |\n| **05 Building Blocks** | \\`05-building-blocks.md\\` | When adding new modules, changing responsibilities, or restructuring layers |\n| **06 Runtime Views** | \\`06-runtime-views.md\\` | When adding key workflows (e.g., auth flow, order processing, data sync) |\n| **07 Deployment** | \\`07-deployment.md\\` | When changing infrastructure, environments, or deployment strategy |\n| **08 Crosscutting Concepts** | \\`08-crosscutting.md\\` (create if missing) | When establishing patterns for error handling, logging, auth, validation, caching |\n| **09 Decisions** | \\`09-decisions/\\` | Every significant technology or pattern choice → create an ADR |\n| **10 Quality Scenarios** | \\`10-quality-scenarios.yaml\\` | When quality requirements change or new scenarios are identified |\n| **11 Risks & Technical Debt** | \\`11-risks-debt.md\\` | When identifying risks, known limitations, or tech debt to address later |\n\n### When to review arc42 docs\n\n- **Start of each phase:** Review all sections — do they still reflect reality?\n- **After adding an external integration:** Update Section 03 (Context) and Section 06 (Runtime Views)\n- **After establishing a pattern:** Update Section 08 (Crosscutting Concepts) — e.g., \"we use ProblemDetails for errors\"\n- **After significant refactoring:** Update Section 05 (Building Blocks) and run \\`arcbridge_check_drift\\`\n- **Before completing a phase:** Run \\`arcbridge_propose_arc42_update\\` to catch missed documentation updates\n\n## Context You Receive\n\n- Full arc42 documentation (all sections)\n- Quality scenarios with priorities\n- All ADRs and their status\n- Building block → code mapping\n\n## Working Style\n\nThink at the system level. Before making changes, consider:\n1. Which building block does this belong to?\n2. Does this introduce a new dependency?\n3. Which quality scenarios are affected?\n4. Is there an existing pattern we should follow?\n5. Which arc42 sections need updating?`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function implementerTemplate(): AgentRole {\n return {\n role_id: \"implementer\",\n name: \"Implementer\",\n description:\n \"Writes code within architectural boundaries, following established patterns and quality constraints\",\n version: 1,\n required_tools: [\n \"arcbridge_get_building_block\",\n \"arcbridge_get_current_tasks\",\n \"arcbridge_update_task\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_reindex\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_guidance\",\n ],\n denied_tools: [],\n read_only: false,\n quality_focus: [\"maintainability\"],\n model_preferences: {\n reasoning_depth: \"medium\",\n speed_priority: \"high\",\n suggested_models: {\n claude: \"claude-sonnet-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the Implementer agent for this project.\n\n## Your Responsibilities\n\n- Write code that fits within the project's architectural boundaries\n- Follow established patterns found in existing code\n- Write tests alongside implementation\n- Update task status as you work\n\n## Constraints\n\n- Stay within the building block boundaries assigned to your task\n- Follow existing patterns in the codebase — don't invent new ones without reason\n- Write tests for new functionality\n- If you need to cross a building block boundary, flag it instead of doing it silently\n\n## Context You Receive\n\n- The relevant building block and its code paths\n- Current phase tasks with acceptance criteria\n- Quality scenarios that apply to your work area\n- Component graph and type interfaces for your area\n\n## Working Style\n\nFocus on shipping working code that meets acceptance criteria. When in doubt:\n1. Check if a similar pattern already exists in the codebase\n2. Stay within your assigned building block\n3. Write the simplest solution that satisfies the requirements\n4. Add tests that verify the acceptance criteria\n\n## Architecture Awareness\n\nConsult the arc42 documentation in \\`.arcbridge/arc42/\\` when working:\n- Read \\`05-building-blocks.md\\` to understand module boundaries and responsibilities\n- Read \\`08-crosscutting.md\\` (if it exists) for established patterns (error handling, logging, validation)\n- Read \\`06-runtime-views.md\\` to understand how your component fits into larger workflows\n- If you establish a new pattern that other code should follow, note it for the Architect to document`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function securityReviewerTemplate(): AgentRole {\n return {\n role_id: \"security-reviewer\",\n name: \"Security Reviewer\",\n description:\n \"Reviews code for security vulnerabilities, verifies security quality scenarios, and checks auth coverage\",\n version: 1,\n required_tools: [\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 denied_tools: [],\n read_only: true,\n quality_focus: [\"security\"],\n model_preferences: {\n reasoning_depth: \"high\",\n speed_priority: \"low\",\n suggested_models: {\n claude: \"claude-opus-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the Security Reviewer agent for this project.\n\n## Your Responsibilities\n\n- Review code for OWASP Top 10 vulnerabilities\n- Verify all security quality scenarios are met\n- Check auth coverage on API routes and server actions\n- Identify client-side data exposure risks\n- Review input validation on all mutation endpoints\n\n## Constraints\n\n- You are READ-ONLY — report findings, do not modify code\n- Check every API route for authentication\n- Verify no secrets leak to client bundles\n- Flag any input that isn't validated before use\n\n## Checks to Perform\n\n1. **Auth Coverage:** Every API route and server action has auth checks\n2. **Client Exposure:** No sensitive data in client components or bundles\n3. **Input Validation:** All mutation inputs validated with zod or equivalent\n4. **Dependency Security:** Flag known CVEs in dependencies\n5. **CSRF/XSS:** Server actions use proper tokens, no dangerouslySetInnerHTML without sanitization`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function qualityGuardianTemplate(): AgentRole {\n return {\n role_id: \"quality-guardian\",\n name: \"Quality Guardian\",\n description:\n \"Enforces quality scenarios across all categories: performance, accessibility, reliability, and maintainability\",\n version: 1,\n required_tools: [\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_project_status\",\n \"arcbridge_get_building_blocks\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_boundary_analysis\",\n // Phase 3+: \"arcbridge_run_role_check\"\n ],\n denied_tools: [],\n read_only: true,\n quality_focus: [\n \"performance\",\n \"accessibility\",\n \"reliability\",\n \"maintainability\",\n ],\n model_preferences: {\n reasoning_depth: \"high\",\n speed_priority: \"low\",\n suggested_models: {\n claude: \"claude-opus-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the Quality Guardian agent for this project.\n\n## Your Responsibilities\n\n- Enforce all quality scenarios defined in the project\n- Check performance budgets (bundle size, LCP, API response times)\n- Verify accessibility compliance (WCAG 2.1 AA)\n- Ensure test coverage meets thresholds\n- Flag quality regressions\n\n## Constraints\n\n- You are READ-ONLY — report findings, do not modify code\n- Every quality scenario with status \"untested\" needs attention\n- Performance budgets are hard limits, not guidelines\n\n## Review Checklist\n\n1. **Performance:** Bundle size, LCP, API latency against defined budgets\n2. **Accessibility:** axe-core violations, keyboard navigation, screen reader support\n3. **Test Coverage:** Business logic modules meet coverage thresholds\n4. **Maintainability:** No circular dependencies, consistent patterns\n5. **Reliability:** Error boundaries, graceful degradation, retry logic`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function phaseManagerTemplate(): AgentRole {\n return {\n role_id: \"phase-manager\",\n name: \"Phase Manager\",\n description:\n \"Manages phase transitions, enforces gates, triggers sync, and tracks task completion\",\n version: 1,\n required_tools: [\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 ],\n denied_tools: [],\n read_only: false,\n quality_focus: [],\n model_preferences: {\n reasoning_depth: \"medium\",\n speed_priority: \"medium\",\n suggested_models: {\n claude: \"claude-sonnet-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the Phase Manager agent for this project.\n\n## Your Responsibilities\n\n- Track task completion within the current phase\n- Enforce phase gate requirements before transitions\n- Trigger architecture sync at phase boundaries\n- Compare planned vs. built and report drift\n- Generate arc42 update proposals after each phase\n\n## Constraints\n\n- Do not skip phase gates — all requirements must be met\n- Trigger sync at every phase boundary\n- Tasks must be \"done\" before a phase can complete\n- Quality scenarios linked to phase tasks must be verified\n\n## Phase Transition Process\n\n1. Verify all tasks in current phase are \"done\"\n2. Run drift detection (check_drift)\n3. Propose arc42 updates if drift is detected\n4. Check quality gate requirements\n5. Mark phase complete or report blockers`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function onboardingTemplate(): AgentRole {\n return {\n role_id: \"onboarding\",\n name: \"Onboarding\",\n description:\n \"Explains the project architecture, guides new developers, and answers questions about the codebase\",\n version: 1,\n required_tools: [\n \"arcbridge_get_building_blocks\",\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_relevant_adrs\",\n \"arcbridge_get_phase_plan\",\n \"arcbridge_get_project_status\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_dependency_graph\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_route_map\",\n ],\n denied_tools: [],\n read_only: true,\n quality_focus: [],\n model_preferences: {\n reasoning_depth: \"medium\",\n speed_priority: \"high\",\n suggested_models: {\n claude: \"claude-sonnet-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the Onboarding agent for this project.\n\n## Your Responsibilities\n\n- Explain the project's architecture to new developers\n- Answer questions about the codebase structure\n- Guide developers to the right building blocks for their task\n- Explain architectural decisions and their rationale\n- Provide context about the current phase and priorities\n\n## Constraints\n\n- You are READ-ONLY — explain and guide, do not modify\n- Always reference arc42 documentation for architecture questions\n- Point developers to relevant ADRs for \"why\" questions\n- Use building block names consistently\n\n## How to Help\n\nWhen a developer asks about the project:\n1. Start with the building block view — show the top-level structure\n2. Explain quality priorities and what they mean in practice\n3. Point to the current phase and active tasks\n4. Reference ADRs for important decisions\n5. Suggest which building block to work in for their task`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function codeReviewerTemplate(): AgentRole {\n return {\n role_id: \"code-reviewer\",\n name: \"Code Reviewer\",\n description:\n \"On-demand code review: checks correctness, patterns, edge cases, and simplicity. Opt-in — not part of automatic phase gates.\",\n version: 1,\n required_tools: [\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 denied_tools: [],\n read_only: true,\n quality_focus: [\"maintainability\", \"reliability\"],\n model_preferences: {\n reasoning_depth: \"high\",\n speed_priority: \"low\",\n suggested_models: {\n claude: \"claude-opus-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the Code Reviewer agent for this project. You are invoked on-demand when the developer wants a second pair of eyes.\n\n## Your Responsibilities\n\n- Review code for correctness and completeness\n- Identify logic bugs, unhandled edge cases, and off-by-one errors\n- Check that the implementation matches the task's acceptance criteria\n- Verify the code follows established patterns in the codebase\n- Assess readability and appropriate simplicity\n- Flag over-engineering and unnecessary abstractions\n\n## What You Are NOT\n\nYou are not the Security Reviewer (they handle OWASP, auth, secrets) and not the Quality Guardian (they handle metrics, coverage, accessibility). Focus on what a senior developer would catch in a pull request.\n\n## Constraints\n\n- You are READ-ONLY — report findings, do not modify code\n- Always check which building block the code belongs to\n- Reference existing patterns when suggesting changes\n- Distinguish severity: bugs vs. suggestions vs. nitpicks\n\n## Review Structure\n\nWhen reviewing code:\n1. **Correctness** — Does it do what it's supposed to? Check acceptance criteria.\n2. **Edge cases** — What inputs or states could break this?\n3. **Patterns** — Does it follow how similar things are done elsewhere in the project?\n4. **Simplicity** — Is there a simpler way? Is anything over-engineered?\n5. **Naming & readability** — Would another developer understand this quickly?\n\nKeep reviews actionable. Every finding should either be a concrete bug or a specific suggestion with rationale.`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function uxReviewerTemplate(): AgentRole {\n return {\n role_id: \"ux-reviewer\",\n name: \"UX Reviewer\",\n description:\n \"Reviews UI components, page structure, and interaction patterns for usability, consistency, and accessibility\",\n version: 1,\n required_tools: [\n \"arcbridge_get_building_blocks\",\n \"arcbridge_get_building_block\",\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_route_map\",\n \"arcbridge_get_boundary_analysis\",\n \"arcbridge_get_guidance\",\n \"arcbridge_get_relevant_adrs\",\n ],\n denied_tools: [],\n read_only: true,\n quality_focus: [\"accessibility\", \"maintainability\", \"performance\"],\n model_preferences: {\n reasoning_depth: \"high\",\n speed_priority: \"low\",\n suggested_models: {\n claude: \"claude-opus-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the UX Reviewer agent for this project. You evaluate UI implementation for usability, visual consistency, and adherence to design intent.\n\n## Your Responsibilities\n\n### During Planning (Phase 0–1)\n- Review specs, wireframes, or design descriptions for usability issues before code is written\n- Propose component hierarchy and interaction patterns that fit the chosen framework\n- Identify accessibility requirements early (keyboard navigation, screen readers, color contrast)\n- Suggest reusable UI patterns and component composition strategies\n\n### After Implementation (Phase 2–3)\n- Review implemented components for consistency (naming, prop patterns, styling approach)\n- Verify responsive behavior considerations in component structure\n- Check for interaction state coverage (loading, error, empty, success)\n- Evaluate component graph for unnecessary complexity or missing abstractions\n- Verify that shared components are actually reused, not duplicated\n\n## What You Can Analyze\n\nYou cannot see screenshots, but you CAN reason about UI quality through code:\n- **Component graph** — Use \\`arcbridge_get_component_graph\\` to see which components render which, detect deep nesting, find components that should be shared\n- **Route structure** — Use \\`arcbridge_get_route_map\\` to evaluate page hierarchy and navigation flow\n- **Component props** — Use \\`arcbridge_search_symbols\\` with \\`kind: \"component\"\\` to find all components, then check their prop interfaces for consistency\n- **Client/server boundaries** — Use \\`arcbridge_get_boundary_analysis\\` to verify interactive components are client-side and data-fetching stays server-side\n- **Accessibility** — Search for ARIA attributes, keyboard event handlers, and semantic HTML usage in component code\n- **Styling patterns** — Check for consistent use of design tokens, utility classes, or CSS modules\n\n## Review Checklist\n\n1. **Component Structure**\n - Are components single-responsibility? Does the component graph show reasonable composition?\n - Are shared/reusable components in a dedicated building block (e.g., ui-components)?\n - Are prop interfaces consistent across similar components?\n\n2. **Interaction States**\n - Do interactive components handle: loading, error, empty, disabled, hover, focus states?\n - Are loading indicators and error messages user-friendly?\n - Is optimistic UI used where appropriate?\n\n3. **Accessibility**\n - Do interactive elements have proper ARIA labels and roles?\n - Is keyboard navigation supported (Tab order, Enter/Space activation, Escape to close)?\n - Are form inputs associated with labels?\n - Is color used as a secondary indicator (not the only one)?\n\n4. **Layout & Navigation**\n - Does the route map reflect a logical user flow?\n - Are layouts properly nested (shared header/nav, per-section layouts)?\n - Is navigation consistent and predictable?\n\n5. **Consistency**\n - Are similar UI patterns implemented consistently across the app?\n - Is the styling approach uniform (not mixing CSS modules, inline styles, and utility classes)?\n - Do components follow the same naming conventions?\n\n## Constraints\n\n- You are READ-ONLY — report findings and suggestions, do not modify code\n- Focus on patterns and structure, not pixel-level design details\n- Always reference the relevant quality scenarios (A11Y-*, PERF-*, MAINT-*) when making recommendations\n- When suggesting changes, explain the UX impact, not just the code change`,\n };\n}\n","import { join } from \"node:path\";\nimport { existsSync, readFileSync, readdirSync, appendFileSync } from \"node:fs\";\nimport { parse } from \"yaml\";\nimport matter from \"gray-matter\";\nimport type Database from \"better-sqlite3\";\nimport { openDatabase } from \"../db/connection.js\";\nimport { initializeSchema } from \"../db/schema.js\";\nimport type { InitProjectInput } from \"../templates/types.js\";\nimport { BuildingBlocksFrontmatterSchema } from \"../schemas/building-blocks.js\";\nimport { QualityScenariosFileSchema } from \"../schemas/quality-scenarios.js\";\nimport { PhasesFileSchema, TaskFileSchema } from \"../schemas/phases.js\";\nimport { AdrFrontmatterSchema } from \"../schemas/adrs.js\";\n\nexport interface GenerateDatabaseResult {\n db: Database.Database;\n warnings: string[];\n}\n\nfunction populateBuildingBlocks(\n db: Database.Database,\n targetDir: string,\n): string[] {\n const warnings: string[] = [];\n const filePath = join(\n targetDir,\n \".arcbridge\",\n \"arc42\",\n \"05-building-blocks.md\",\n );\n\n if (!existsSync(filePath)) {\n warnings.push(\"Building blocks file not found, skipping\");\n return warnings;\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const { data } = matter(raw);\n const result = BuildingBlocksFrontmatterSchema.safeParse(data);\n\n if (!result.success) {\n warnings.push(\n `Invalid building blocks frontmatter: ${result.error.issues.map((i) => i.message).join(\", \")}`,\n );\n return warnings;\n }\n\n const fm = result.data;\n const insert = db.prepare(`\n INSERT OR IGNORE INTO building_blocks (id, name, level, parent_id, description, responsibility, code_paths, interfaces, service, last_synced)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n for (const block of fm.blocks) {\n insert.run(\n block.id,\n block.name,\n block.level,\n block.parent_id ?? null,\n null,\n block.responsibility,\n JSON.stringify(block.code_paths),\n JSON.stringify(block.interfaces),\n block.service,\n fm.last_synced,\n );\n }\n\n return warnings;\n}\n\nfunction populateQualityScenarios(\n db: Database.Database,\n targetDir: string,\n): string[] {\n const warnings: string[] = [];\n const filePath = join(\n targetDir,\n \".arcbridge\",\n \"arc42\",\n \"10-quality-scenarios.yaml\",\n );\n\n if (!existsSync(filePath)) {\n warnings.push(\"Quality scenarios file not found, skipping\");\n return warnings;\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = parse(raw);\n const result = QualityScenariosFileSchema.safeParse(parsed);\n\n if (!result.success) {\n warnings.push(\n `Invalid quality scenarios: ${result.error.issues.map((i) => i.message).join(\", \")}`,\n );\n return warnings;\n }\n\n const insert = db.prepare(`\n INSERT OR IGNORE INTO quality_scenarios (id, name, category, scenario, expected, priority, linked_code, linked_tests, linked_blocks, verification, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n for (const s of result.data.scenarios) {\n insert.run(\n s.id,\n s.name,\n s.category,\n s.scenario,\n s.expected,\n s.priority,\n JSON.stringify(s.linked_code),\n JSON.stringify(s.linked_tests),\n JSON.stringify(s.linked_blocks),\n s.verification,\n s.status,\n );\n }\n\n return warnings;\n}\n\nfunction populatePhases(\n db: Database.Database,\n targetDir: string,\n): string[] {\n const warnings: string[] = [];\n const phasesPath = join(targetDir, \".arcbridge\", \"plan\", \"phases.yaml\");\n\n if (!existsSync(phasesPath)) {\n warnings.push(\"Phases file not found, skipping\");\n return warnings;\n }\n\n const raw = readFileSync(phasesPath, \"utf-8\");\n const parsed = parse(raw);\n const result = PhasesFileSchema.safeParse(parsed);\n\n if (!result.success) {\n warnings.push(\n `Invalid phases file: ${result.error.issues.map((i) => i.message).join(\", \")}`,\n );\n return warnings;\n }\n\n const insertPhase = db.prepare(`\n INSERT OR IGNORE INTO phases (id, name, phase_number, status, description, gate_status, started_at, completed_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertTask = db.prepare(`\n INSERT OR IGNORE INTO tasks (id, phase_id, title, description, status, building_block, quality_scenarios, acceptance_criteria, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const now = new Date().toISOString();\n\n for (const phase of result.data.phases) {\n insertPhase.run(\n phase.id,\n phase.name,\n phase.phase_number,\n phase.status,\n phase.description,\n JSON.stringify({}),\n phase.started_at ?? null,\n phase.completed_at ?? null,\n );\n\n // Try to load task file for this phase\n const taskPath = join(\n targetDir,\n \".arcbridge\",\n \"plan\",\n \"tasks\",\n `${phase.id}.yaml`,\n );\n\n if (!existsSync(taskPath)) continue;\n\n const taskRaw = readFileSync(taskPath, \"utf-8\");\n const taskParsed = parse(taskRaw);\n const taskResult = TaskFileSchema.safeParse(taskParsed);\n\n if (!taskResult.success) {\n warnings.push(\n `Invalid task file for ${phase.id}: ${taskResult.error.issues.map((i) => i.message).join(\", \")}`,\n );\n continue;\n }\n\n for (const task of taskResult.data.tasks) {\n insertTask.run(\n task.id,\n phase.id,\n task.title,\n null,\n task.status,\n task.building_block ?? null,\n JSON.stringify(task.quality_scenarios),\n JSON.stringify(task.acceptance_criteria),\n now,\n );\n }\n }\n\n return warnings;\n}\n\nfunction populateAdrs(\n db: Database.Database,\n targetDir: string,\n): string[] {\n const warnings: string[] = [];\n const decisionsDir = join(\n targetDir,\n \".arcbridge\",\n \"arc42\",\n \"09-decisions\",\n );\n\n if (!existsSync(decisionsDir)) {\n return warnings;\n }\n\n const files = readdirSync(decisionsDir).filter((f) => f.endsWith(\".md\"));\n\n const insert = db.prepare(`\n INSERT OR IGNORE INTO adrs (id, title, status, date, context, decision, consequences, affected_blocks, affected_files, quality_scenarios)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n for (const file of files) {\n const raw = readFileSync(join(decisionsDir, file), \"utf-8\");\n const { data, content } = matter(raw);\n const result = AdrFrontmatterSchema.safeParse(data);\n\n if (!result.success) {\n warnings.push(\n `Invalid ADR ${file}: ${result.error.issues.map((i) => i.message).join(\", \")}`,\n );\n continue;\n }\n\n const fm = result.data;\n insert.run(\n fm.id,\n fm.title,\n fm.status,\n fm.date,\n null,\n content.trim(),\n null,\n JSON.stringify(fm.affected_blocks),\n JSON.stringify(fm.affected_files),\n JSON.stringify(fm.quality_scenarios),\n );\n }\n\n return warnings;\n}\n\n/**\n * Re-read arc42 files from disk and update the database.\n * Uses INSERT OR REPLACE to pick up changes made since initial generation.\n */\nexport function refreshFromDocs(\n db: Database.Database,\n targetDir: string,\n): string[] {\n const warnings: string[] = [];\n\n // Save existing statuses before clearing\n const existingTasks = db\n .prepare(\"SELECT id, status, completed_at FROM tasks\")\n .all() as { id: string; status: string; completed_at: string | null }[];\n const taskStatusMap = new Map(\n existingTasks.map((t) => [t.id, { status: t.status, completed_at: t.completed_at }]),\n );\n\n const existingPhases = db\n .prepare(\"SELECT id, status, started_at, completed_at, gate_status FROM phases\")\n .all() as { id: string; status: string; started_at: string | null; completed_at: string | null; gate_status: string }[];\n const phaseStatusMap = new Map(\n existingPhases.map((p) => [p.id, { status: p.status, started_at: p.started_at, completed_at: p.completed_at, gate_status: p.gate_status }]),\n );\n\n const existingScenarios = db\n .prepare(\"SELECT id, status FROM quality_scenarios\")\n .all() as { id: string; status: string }[];\n const scenarioStatusMap = new Map(\n existingScenarios.map((s) => [s.id, s.status]),\n );\n\n // Wrap entire delete + repopulate + restore in a transaction for atomicity\n const refresh = db.transaction(() => {\n // Delete in FK-safe order: tasks → phases → building_blocks, then scenarios and ADRs\n db.prepare(\"DELETE FROM tasks\").run();\n db.prepare(\"DELETE FROM phases\").run();\n db.prepare(\"DELETE FROM building_blocks\").run();\n db.prepare(\"DELETE FROM quality_scenarios\").run();\n db.prepare(\"DELETE FROM adrs\").run();\n\n // Re-populate from files\n warnings.push(...populateBuildingBlocks(db, targetDir));\n warnings.push(...populateQualityScenarios(db, targetDir));\n warnings.push(...populatePhases(db, targetDir));\n warnings.push(...populateAdrs(db, targetDir));\n\n // Restore task statuses that were previously set\n const restoreTask = db.prepare(\n \"UPDATE tasks SET status = ?, completed_at = ? WHERE id = ?\",\n );\n for (const [id, prev] of taskStatusMap) {\n if (prev.status !== \"todo\") {\n restoreTask.run(prev.status, prev.completed_at, id);\n }\n }\n\n // Restore phase statuses\n const restorePhase = db.prepare(\n \"UPDATE phases SET status = ?, started_at = ?, completed_at = ?, gate_status = ? WHERE id = ?\",\n );\n for (const [id, prev] of phaseStatusMap) {\n if (prev.status !== \"planned\") {\n restorePhase.run(prev.status, prev.started_at, prev.completed_at, prev.gate_status, id);\n }\n }\n\n // Restore quality scenario statuses\n const restoreScenario = db.prepare(\n \"UPDATE quality_scenarios SET status = ? WHERE id = ?\",\n );\n for (const [id, prev] of scenarioStatusMap) {\n if (prev !== \"untested\") {\n restoreScenario.run(prev, id);\n }\n }\n });\n\n refresh();\n\n return warnings;\n}\n\nexport function generateDatabase(\n targetDir: string,\n input: InitProjectInput,\n): GenerateDatabaseResult {\n const dbPath = join(targetDir, \".arcbridge\", \"index.db\");\n const db = openDatabase(dbPath);\n initializeSchema(db);\n\n const allWarnings: string[] = [];\n\n // Set project metadata\n const upsert = db.prepare(\n \"INSERT OR REPLACE INTO arcbridge_meta (key, value) VALUES (?, ?)\",\n );\n upsert.run(\"project_name\", input.name);\n upsert.run(\"project_type\", input.template);\n upsert.run(\"last_full_index\", new Date().toISOString());\n\n // Populate from generated files\n db.transaction(() => {\n allWarnings.push(...populateBuildingBlocks(db, targetDir));\n allWarnings.push(...populateQualityScenarios(db, targetDir));\n allWarnings.push(...populatePhases(db, targetDir));\n allWarnings.push(...populateAdrs(db, targetDir));\n })();\n\n // Ensure index.db and WAL files are in .gitignore\n ensureGitignore(targetDir);\n\n return { db, warnings: allWarnings };\n}\n\n/**\n * Add .arcbridge/index.db and WAL files to .gitignore if not already present.\n */\nfunction ensureGitignore(targetDir: string): void {\n const gitignorePath = join(targetDir, \".gitignore\");\n const marker = \".arcbridge/index.db\";\n\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, \"utf-8\");\n if (content.includes(marker)) return;\n }\n\n const entry = `\n# ArcBridge database (derived from .arcbridge/ YAML/markdown files)\n.arcbridge/index.db\n.arcbridge/index.db-wal\n.arcbridge/index.db-shm\n`;\n\n appendFileSync(gitignorePath, entry, \"utf-8\");\n}\n","import { relative, join } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport YAML from \"yaml\";\nimport type Database from \"better-sqlite3\";\nimport type { IndexerOptions, IndexResult } from \"./types.js\";\nimport { createTsProgram } from \"./program.js\";\nimport { extractSymbols } from \"./symbol-extractor.js\";\nimport { extractDependencies, buildSymbolLookup } from \"./dependency-extractor.js\";\nimport { analyzeComponents } from \"./component-analyzer.js\";\nimport { analyzeRoutes } from \"./route-analyzer.js\";\nimport { hashContent } from \"./content-hash.js\";\nimport {\n getExistingHashes,\n removeSymbolsForFiles,\n writeSymbols,\n writeDependencies,\n} from \"./db-writer.js\";\nimport { indexDotnetProjectRoslyn, findDotnetProject } from \"./dotnet-indexer.js\";\nimport { indexCSharpTreeSitter } from \"./csharp/indexer.js\";\nimport { indexPackageDependencies } from \"./package-deps.js\";\nimport { loadConfig } from \"../config/loader.js\";\n\nexport type ProjectLanguage = \"typescript\" | \"csharp\" | \"auto\";\nexport type CSharpBackend = \"roslyn\" | \"tree-sitter\";\n\n/**\n * Detect the project language from files in the project root.\n * Checks for tsconfig.json first (TypeScript priority), then .csproj/.sln.\n * This prevents a stray .csproj from hijacking a TypeScript project.\n */\nexport function detectProjectLanguage(projectRoot: string): \"typescript\" | \"csharp\" {\n // TypeScript signals take priority (package.json + tsconfig.json is the stronger signal)\n if (existsSync(join(projectRoot, \"tsconfig.json\"))) return \"typescript\";\n if (existsSync(join(projectRoot, \"package.json\"))) return \"typescript\";\n\n // .NET signals\n if (findDotnetProject(projectRoot)) return \"csharp\";\n\n // Default to TypeScript (existing behavior)\n return \"typescript\";\n}\n\n/**\n * Index a project, auto-detecting the language unless explicitly specified.\n * Dispatches to the TypeScript or .NET indexer accordingly.\n */\nexport async function indexProject(\n db: Database.Database,\n options: IndexerOptions,\n): Promise<IndexResult> {\n const language = options.language ?? \"auto\";\n const resolvedLanguage = language === \"auto\"\n ? detectProjectLanguage(options.projectRoot)\n : language;\n\n // Index package dependencies (npm/NuGet) regardless of language\n indexPackageDependencies(db, options.projectRoot, options.service ?? \"main\");\n\n if (resolvedLanguage === \"csharp\") {\n const backend = resolveCSharpBackend(options.projectRoot);\n if (backend === \"roslyn\") {\n return indexDotnetProjectRoslyn(db, {\n projectRoot: options.projectRoot,\n service: options.service,\n });\n }\n return await indexCSharpTreeSitter(db, {\n projectRoot: options.projectRoot,\n service: options.service,\n });\n }\n\n return indexTypeScriptProject(db, options);\n}\n\n/**\n * Resolve which C# indexer backend to use.\n * 1. Check config for explicit `indexing.csharp_indexer` setting\n * 2. If \"auto\" (default): check if `dotnet` CLI is available → Roslyn, otherwise tree-sitter\n */\nexport function resolveCSharpBackend(projectRoot: string): CSharpBackend {\n // Use the existing config loader for validated config access\n const { config, error } = loadConfig(projectRoot);\n let setting = config?.indexing?.csharp_indexer;\n\n // If full config validation failed but the file exists, try to extract\n // just the csharp_indexer setting from raw YAML so an unrelated config\n // error doesn't silently override the user's explicit backend choice\n if (!setting && error) {\n try {\n const raw = readFileSync(join(projectRoot, \".arcbridge\", \"config.yaml\"), \"utf-8\");\n const parsed = YAML.parse(raw);\n const rawSetting = parsed?.indexing?.csharp_indexer;\n if (rawSetting === \"roslyn\" || rawSetting === \"tree-sitter\") {\n setting = rawSetting;\n }\n } catch {\n // Ignore — proceed with auto\n }\n }\n\n if (setting === \"roslyn\" || setting === \"tree-sitter\") {\n return setting;\n }\n\n // Auto: check if .NET SDK is available (required by indexDotnetProjectRoslyn\n // which shells out to `dotnet run --project <indexer>`)\n try {\n execFileSync(\"dotnet\", [\"--version\"], {\n encoding: \"utf-8\",\n timeout: 5000,\n });\n return \"roslyn\";\n } catch {\n // .NET SDK not available — use tree-sitter\n return \"tree-sitter\";\n }\n}\n\nfunction indexTypeScriptProject(\n db: Database.Database,\n options: IndexerOptions,\n): IndexResult {\n const start = Date.now();\n const service = options.service ?? \"main\";\n\n // 1. Create TS program\n const { checker, sourceFiles, projectRoot } = createTsProgram(options);\n\n // 2. Compute file hashes and compare with existing\n const existingHashes = getExistingHashes(db, service);\n\n const changed: Array<{\n sourceFile: (typeof sourceFiles)[number];\n relativePath: string;\n hash: string;\n }> = [];\n const currentPaths = new Set<string>();\n let filesSkipped = 0;\n\n for (const sf of sourceFiles) {\n const relPath = relative(projectRoot, sf.fileName);\n currentPaths.add(relPath);\n\n const hash = hashContent(sf.getFullText());\n const existingHash = existingHashes.get(relPath);\n\n if (existingHash === hash) {\n filesSkipped++;\n } else {\n changed.push({ sourceFile: sf, relativePath: relPath, hash });\n }\n }\n\n // 3. Find removed files (in DB but no longer in program)\n const removed: string[] = [];\n for (const existingPath of existingHashes.keys()) {\n if (!currentPaths.has(existingPath)) {\n removed.push(existingPath);\n }\n }\n\n // 4. Remove stale symbols for changed + removed files\n const filesToClean = [\n ...removed,\n ...changed.map((f) => f.relativePath),\n ];\n removeSymbolsForFiles(db, filesToClean);\n\n // 5. Extract symbols from changed files\n const allSymbols = changed.flatMap((f) =>\n extractSymbols(f.sourceFile, checker, f.relativePath, f.hash),\n );\n\n // 6. Write symbols to DB\n writeSymbols(db, allSymbols, service, \"typescript\");\n\n // 7. Extract dependencies across ALL source files\n // (dependencies can cross file boundaries, so we need all symbols for lookup)\n const allDbSymbols = db\n .prepare(\"SELECT id, file_path as filePath, name FROM symbols WHERE service = ?\")\n .all(service) as Array<{ id: string; filePath: string; name: string }>;\n\n const lookup = buildSymbolLookup(allDbSymbols);\n\n // Clear existing dependencies for changed files (already done in removeSymbolsForFiles)\n // Now extract fresh dependencies from all source files\n const allDeps = sourceFiles.flatMap((sf) => {\n const relPath = relative(projectRoot, sf.fileName);\n return extractDependencies(sf, checker, relPath, projectRoot, lookup);\n });\n\n // Clear all deps and re-insert (simpler than incremental for cross-file edges)\n db.prepare(\"DELETE FROM dependencies WHERE source_symbol IN (SELECT id FROM symbols WHERE service = ?)\").run(service);\n writeDependencies(db, allDeps);\n\n // 8. Analyze React components (populates components table)\n const componentsAnalyzed = analyzeComponents(sourceFiles, checker, projectRoot, db);\n\n // 9. Analyze Next.js routes (populates routes table)\n const routesAnalyzed = analyzeRoutes(projectRoot, db, service);\n\n return {\n symbolsIndexed: allSymbols.length,\n dependenciesIndexed: allDeps.length,\n componentsAnalyzed,\n routesAnalyzed,\n filesProcessed: changed.length,\n filesSkipped,\n filesRemoved: removed.length,\n durationMs: Date.now() - start,\n };\n}\n\nexport type { IndexerOptions, IndexResult, ExtractedSymbol, SymbolKind } from \"./types.js\";\nexport { discoverDotnetServices, type DotnetProjectInfo } from \"./dotnet-indexer.js\";\nexport { indexPackageDependencies } from \"./package-deps.js\";\n","import ts from \"typescript\";\nimport { join } from \"node:path\";\nimport type { IndexerOptions } from \"./types.js\";\n\nexport interface ProgramResult {\n program: ts.Program;\n checker: ts.TypeChecker;\n sourceFiles: readonly ts.SourceFile[];\n projectRoot: string;\n}\n\nexport function createTsProgram(options: IndexerOptions): ProgramResult {\n const projectRoot = options.projectRoot;\n\n const configPath =\n options.tsconfigPath ??\n ts.findConfigFile(projectRoot, ts.sys.fileExists, \"tsconfig.json\");\n\n if (!configPath) {\n throw new Error(\n `No tsconfig.json found in ${projectRoot}. TypeScript indexing requires a tsconfig.json.`,\n );\n }\n\n const configFile = ts.readConfigFile(configPath, ts.sys.readFile);\n if (configFile.error) {\n const message = ts.flattenDiagnosticMessageText(\n configFile.error.messageText,\n \"\\n\",\n );\n throw new Error(`Failed to read tsconfig.json: ${message}`);\n }\n\n const parsed = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n join(projectRoot),\n { noEmit: true },\n configPath,\n );\n\n const program = ts.createProgram({\n rootNames: parsed.fileNames,\n options: parsed.options,\n });\n\n const checker = program.getTypeChecker();\n\n const sourceFiles = program\n .getSourceFiles()\n .filter(\n (sf) =>\n !sf.isDeclarationFile &&\n !sf.fileName.includes(\"node_modules\"),\n );\n\n return { program, checker, sourceFiles, projectRoot };\n}\n","import ts from \"typescript\";\nimport type { ExtractedSymbol, SymbolKind } from \"./types.js\";\nimport { containsJsx } from \"./react-utils.js\";\n\nexport function extractSymbols(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n relativePath: string,\n contentHash: string,\n): ExtractedSymbol[] {\n const symbols: ExtractedSymbol[] = [];\n\n function getLocation(node: ts.Node) {\n const start = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));\n const end = sourceFile.getLineAndCharacterOfPosition(node.getEnd());\n return {\n startLine: start.line + 1,\n startCol: start.character + 1,\n endLine: end.line + 1,\n endCol: end.character + 1,\n };\n }\n\n function getDocComment(node: ts.Node): string | null {\n const symbol = checker.getSymbolAtLocation(\n (node as ts.NamedDeclaration).name ?? node,\n );\n if (!symbol) return null;\n\n const docs = symbol.getDocumentationComment(checker);\n if (docs.length === 0) return null;\n return ts.displayPartsToString(docs);\n }\n\n function getSignature(node: ts.Node): string | null {\n const type = checker.getTypeAtLocation(node);\n const callSigs = type.getCallSignatures();\n if (callSigs.length === 0) return null;\n\n const sig = callSigs[0]!;\n return checker.signatureToString(\n sig,\n undefined,\n ts.TypeFormatFlags.WriteArrowStyleSignature,\n );\n }\n\n function getReturnType(node: ts.Node): string | null {\n const type = checker.getTypeAtLocation(node);\n const callSigs = type.getCallSignatures();\n if (callSigs.length === 0) return null;\n\n const sig = callSigs[0]!;\n return checker.typeToString(checker.getReturnTypeOfSignature(sig));\n }\n\n function isExported(node: ts.Node): boolean {\n const flags = ts.getCombinedModifierFlags(node as ts.Declaration);\n if (flags & ts.ModifierFlags.Export) return true;\n // Check for `export default`\n if (\n node.kind === ts.SyntaxKind.ExportAssignment ||\n (ts.isExportAssignment && ts.isExportAssignment(node))\n ) {\n return true;\n }\n return false;\n }\n\n function isAsync(node: ts.Node): boolean {\n const flags = ts.getCombinedModifierFlags(node as ts.Declaration);\n return (flags & ts.ModifierFlags.Async) !== 0;\n }\n\n function makeId(name: string, kind: SymbolKind, qualifier?: string): string {\n const qualifiedPart = qualifier ? `${qualifier}.${name}` : name;\n return `${relativePath}::${qualifiedPart}#${kind}`;\n }\n\n function isCallableInitializer(\n init: ts.Expression | undefined,\n ): init is ts.ArrowFunction | ts.FunctionExpression {\n if (!init) return false;\n return (\n ts.isArrowFunction(init) || ts.isFunctionExpression(init)\n );\n }\n\n // ---- React detection helpers ----\n\n /**\n * Check if a name follows the React hook convention: starts with \"use\" followed by uppercase.\n */\n function isHookName(name: string): boolean {\n return /^use[A-Z]/.test(name);\n }\n\n /**\n * Check if an initializer is a createContext() call.\n */\n function isCreateContextCall(init: ts.Expression | undefined): boolean {\n if (!init || !ts.isCallExpression(init)) return false;\n const expr = init.expression;\n // createContext(...)\n if (ts.isIdentifier(expr) && expr.text === \"createContext\") return true;\n // React.createContext(...)\n if (\n ts.isPropertyAccessExpression(expr) &&\n ts.isIdentifier(expr.name) &&\n expr.name.text === \"createContext\"\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Check if an initializer is a React.memo() or React.forwardRef() wrapper\n * containing a function that returns JSX.\n */\n function isReactWrapperCall(init: ts.Expression | undefined): boolean {\n if (!init || !ts.isCallExpression(init)) return false;\n const expr = init.expression;\n const wrapperNames = [\"memo\", \"forwardRef\"];\n\n let isWrapper = false;\n // memo(...) / forwardRef(...)\n if (ts.isIdentifier(expr) && wrapperNames.includes(expr.text)) {\n isWrapper = true;\n }\n // React.memo(...) / React.forwardRef(...)\n if (\n ts.isPropertyAccessExpression(expr) &&\n ts.isIdentifier(expr.name) &&\n wrapperNames.includes(expr.name.text)\n ) {\n isWrapper = true;\n }\n if (!isWrapper) return false;\n\n // Check if any argument contains JSX\n for (const arg of init.arguments) {\n if (containsJsx(arg)) return true;\n }\n return false;\n }\n\n /**\n * Classify a function-like symbol: is it a component, hook, or plain function?\n */\n function classifyFunction(\n name: string,\n body: ts.Node | undefined,\n init?: ts.Expression | undefined,\n ): SymbolKind {\n // React.memo() / React.forwardRef() wrappers\n if (init && isReactWrapperCall(init)) return \"component\";\n // Hook: starts with \"use\" + uppercase\n if (isHookName(name)) return \"hook\";\n // Component: PascalCase function that returns JSX\n if (body && /^[A-Z]/.test(name) && containsJsx(body)) return \"component\";\n return \"function\";\n }\n\n function visit(node: ts.Node): void {\n // Function declarations\n if (ts.isFunctionDeclaration(node) && node.name) {\n const name = node.name.text;\n const kind = classifyFunction(name, node.body);\n symbols.push({\n id: makeId(name, kind),\n name,\n qualifiedName: name,\n kind,\n filePath: relativePath,\n ...getLocation(node),\n signature: getSignature(node),\n returnType: getReturnType(node),\n docComment: getDocComment(node),\n isExported: isExported(node),\n isAsync: isAsync(node),\n contentHash,\n });\n return;\n }\n\n // Class declarations\n if (ts.isClassDeclaration(node) && node.name) {\n const name = node.name.text;\n symbols.push({\n id: makeId(name, \"class\"),\n name,\n qualifiedName: name,\n kind: \"class\",\n filePath: relativePath,\n ...getLocation(node),\n signature: null,\n returnType: null,\n docComment: getDocComment(node),\n isExported: isExported(node),\n isAsync: false,\n contentHash,\n });\n\n // Extract class methods as symbols\n for (const member of node.members) {\n if (\n (ts.isMethodDeclaration(member) || ts.isPropertyDeclaration(member)) &&\n member.name &&\n ts.isIdentifier(member.name)\n ) {\n const memberName = member.name.text;\n const memberKind: SymbolKind = ts.isMethodDeclaration(member)\n ? \"function\"\n : isCallableInitializer(\n (member as ts.PropertyDeclaration).initializer,\n )\n ? \"function\"\n : \"variable\";\n\n symbols.push({\n id: makeId(memberName, memberKind, name),\n name: memberName,\n qualifiedName: `${name}.${memberName}`,\n kind: memberKind,\n filePath: relativePath,\n ...getLocation(member),\n signature:\n memberKind === \"function\" ? getSignature(member) : null,\n returnType:\n memberKind === \"function\" ? getReturnType(member) : null,\n docComment: getDocComment(member),\n isExported: isExported(node), // class export implies member export\n isAsync: isAsync(member),\n contentHash,\n });\n }\n }\n return;\n }\n\n // Interface declarations\n if (ts.isInterfaceDeclaration(node)) {\n const name = node.name.text;\n symbols.push({\n id: makeId(name, \"interface\"),\n name,\n qualifiedName: name,\n kind: \"interface\",\n filePath: relativePath,\n ...getLocation(node),\n signature: null,\n returnType: null,\n docComment: getDocComment(node),\n isExported: isExported(node),\n isAsync: false,\n contentHash,\n });\n return;\n }\n\n // Type alias declarations\n if (ts.isTypeAliasDeclaration(node)) {\n const name = node.name.text;\n symbols.push({\n id: makeId(name, \"type\"),\n name,\n qualifiedName: name,\n kind: \"type\",\n filePath: relativePath,\n ...getLocation(node),\n signature: null,\n returnType: checker.typeToString(\n checker.getTypeAtLocation(node),\n ),\n docComment: getDocComment(node),\n isExported: isExported(node),\n isAsync: false,\n contentHash,\n });\n return;\n }\n\n // Enum declarations\n if (ts.isEnumDeclaration(node)) {\n const name = node.name.text;\n symbols.push({\n id: makeId(name, \"enum\"),\n name,\n qualifiedName: name,\n kind: \"enum\",\n filePath: relativePath,\n ...getLocation(node),\n signature: null,\n returnType: null,\n docComment: getDocComment(node),\n isExported: isExported(node),\n isAsync: false,\n contentHash,\n });\n return;\n }\n\n // Variable statements (const, let, var)\n if (ts.isVariableStatement(node)) {\n const exported = isExported(node);\n\n for (const decl of node.declarationList.declarations) {\n if (!ts.isIdentifier(decl.name)) continue;\n\n const name = decl.name.text;\n const callable = isCallableInitializer(decl.initializer);\n\n let kind: SymbolKind;\n if (isCreateContextCall(decl.initializer)) {\n kind = \"context\";\n } else if (callable) {\n kind = classifyFunction(name, decl.initializer!.body, undefined);\n } else if (isReactWrapperCall(decl.initializer)) {\n kind = \"component\";\n } else {\n kind = node.declarationList.flags & ts.NodeFlags.Const\n ? \"constant\"\n : \"variable\";\n }\n\n symbols.push({\n id: makeId(name, kind),\n name,\n qualifiedName: name,\n kind,\n filePath: relativePath,\n ...getLocation(decl),\n signature: callable || kind === \"component\" ? getSignature(decl) : null,\n returnType: callable || kind === \"component\" ? getReturnType(decl) : null,\n docComment: getDocComment(decl),\n isExported: exported,\n isAsync: callable\n ? decl.initializer !== undefined && isAsync(decl.initializer)\n : false,\n contentHash,\n });\n }\n return;\n }\n\n // Export assignments (export default ...)\n if (ts.isExportAssignment(node) && !node.isExportEquals) {\n // Only handle named identifiers as default exports\n if (ts.isIdentifier(node.expression)) {\n // Skip — the actual declaration is indexed elsewhere\n return;\n }\n }\n }\n\n ts.forEachChild(sourceFile, visit);\n\n return symbols;\n}\n","import ts from \"typescript\";\n\n/**\n * Check if a node's subtree contains JSX elements (JsxElement, JsxSelfClosingElement, JsxFragment).\n * Used to classify functions as React components.\n */\nexport function containsJsx(node: ts.Node): boolean {\n let found = false;\n function walk(n: ts.Node): void {\n if (found) return;\n if (\n ts.isJsxElement(n) ||\n ts.isJsxSelfClosingElement(n) ||\n ts.isJsxFragment(n)\n ) {\n found = true;\n return;\n }\n ts.forEachChild(n, walk);\n }\n walk(node);\n return found;\n}\n","import ts from \"typescript\";\nimport { relative } from \"node:path\";\n\nexport type DependencyKind =\n | \"imports\"\n | \"calls\"\n | \"extends\"\n | \"implements\"\n | \"uses_type\"\n | \"renders\"\n | \"provides_context\"\n | \"consumes_context\";\n\nexport interface ExtractedDependency {\n sourceSymbolId: string;\n targetSymbolId: string;\n kind: DependencyKind;\n}\n\n/**\n * Build a lookup from (filePath, symbolName, kind?) to symbol ID.\n * Used to resolve TS compiler symbols to our indexed symbol IDs.\n */\nexport interface SymbolLookup {\n /** All indexed symbol IDs keyed by \"filePath::name\" */\n byFileAndName: Map<string, string>;\n /** All indexed symbol IDs */\n allIds: Set<string>;\n}\n\nexport function buildSymbolLookup(\n symbols: Array<{ id: string; filePath: string; name: string }>,\n): SymbolLookup {\n const byFileAndName = new Map<string, string>();\n const allIds = new Set<string>();\n\n for (const s of symbols) {\n byFileAndName.set(`${s.filePath}::${s.name}`, s.id);\n allIds.add(s.id);\n }\n\n return { byFileAndName, allIds };\n}\n\nexport function extractDependencies(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n relativePath: string,\n projectRoot: string,\n lookup: SymbolLookup,\n): ExtractedDependency[] {\n const deps: ExtractedDependency[] = [];\n const seen = new Set<string>();\n\n function addDep(\n sourceId: string,\n targetId: string,\n kind: ExtractedDependency[\"kind\"],\n ): void {\n const key = `${sourceId}|${targetId}|${kind}`;\n if (seen.has(key)) return;\n if (!lookup.allIds.has(sourceId) || !lookup.allIds.has(targetId)) return;\n if (sourceId === targetId) return;\n seen.add(key);\n deps.push({ sourceSymbolId: sourceId, targetSymbolId: targetId, kind });\n }\n\n function resolveSymbolId(tsSymbol: ts.Symbol): string | null {\n // Get the declaration to find the file path\n const decls = tsSymbol.getDeclarations();\n if (!decls || decls.length === 0) return null;\n\n const decl = decls[0]!;\n const declFile = decl.getSourceFile();\n if (declFile.isDeclarationFile) return null;\n\n const declRelPath = relative(projectRoot, declFile.fileName);\n const name = tsSymbol.getName();\n\n // Direct lookup: file::name\n const directId = lookup.byFileAndName.get(`${declRelPath}::${name}`);\n if (directId) return directId;\n\n return null;\n }\n\n // ---- Extract import dependencies ----\n function extractImports(): void {\n for (const stmt of sourceFile.statements) {\n if (!ts.isImportDeclaration(stmt)) continue;\n if (!stmt.importClause) continue;\n\n const moduleSymbol = checker.getSymbolAtLocation(stmt.moduleSpecifier);\n if (!moduleSymbol) continue;\n\n // Named imports: import { Foo, Bar } from './module'\n const namedBindings = stmt.importClause.namedBindings;\n if (namedBindings && ts.isNamedImports(namedBindings)) {\n for (const specifier of namedBindings.elements) {\n const importedSymbol = checker.getSymbolAtLocation(specifier.name);\n if (!importedSymbol) continue;\n\n // Resolve through aliases\n const resolved = checker.getAliasedSymbol\n ? checker.getAliasedSymbol(importedSymbol)\n : importedSymbol;\n\n const targetId = resolveSymbolId(resolved);\n if (!targetId) continue;\n\n // Find which source symbols in this file use this import\n // For simplicity, we attribute imports to the file's top-level symbols\n const fileSymbols = getFileTopLevelSymbols(relativePath, lookup);\n for (const sourceId of fileSymbols) {\n addDep(sourceId, targetId, \"imports\");\n }\n }\n }\n\n // Default import: import Foo from './module'\n if (stmt.importClause.name) {\n const importedSymbol = checker.getSymbolAtLocation(stmt.importClause.name);\n if (importedSymbol) {\n const resolved = checker.getAliasedSymbol\n ? checker.getAliasedSymbol(importedSymbol)\n : importedSymbol;\n\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n const fileSymbols = getFileTopLevelSymbols(relativePath, lookup);\n for (const sourceId of fileSymbols) {\n addDep(sourceId, targetId, \"imports\");\n }\n }\n }\n }\n }\n }\n\n // ---- Extract extends/implements ----\n function extractHeritage(): void {\n ts.forEachChild(sourceFile, function visit(node) {\n if (ts.isClassDeclaration(node) && node.name) {\n const className = node.name.text;\n const classId = lookup.byFileAndName.get(`${relativePath}::${className}`);\n if (!classId) return;\n\n if (node.heritageClauses) {\n for (const clause of node.heritageClauses) {\n const kind: ExtractedDependency[\"kind\"] =\n clause.token === ts.SyntaxKind.ExtendsKeyword\n ? \"extends\"\n : \"implements\";\n\n for (const typeExpr of clause.types) {\n const exprSymbol = checker.getSymbolAtLocation(typeExpr.expression);\n if (!exprSymbol) continue;\n\n const resolved = exprSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(exprSymbol)\n : exprSymbol;\n\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(classId, targetId, kind);\n }\n }\n }\n }\n }\n ts.forEachChild(node, visit);\n });\n }\n\n // ---- Extract call dependencies ----\n function extractCalls(): void {\n ts.forEachChild(sourceFile, function visitTopLevel(node) {\n const ownerName = getOwnerName(node);\n if (!ownerName) return;\n\n const ownerIdOrUndef = lookup.byFileAndName.get(`${relativePath}::${ownerName}`);\n if (!ownerIdOrUndef) return;\n const ownerId: string = ownerIdOrUndef;\n\n // Walk the body looking for call expressions\n function walkForCalls(n: ts.Node): void {\n if (ts.isCallExpression(n)) {\n const calledSymbol = checker.getSymbolAtLocation(n.expression);\n if (calledSymbol) {\n const resolved = calledSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(calledSymbol)\n : calledSymbol;\n\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(ownerId, targetId, \"calls\");\n }\n }\n }\n ts.forEachChild(n, walkForCalls);\n }\n\n // Walk function/method bodies\n if (ts.isFunctionDeclaration(node) && node.body) {\n walkForCalls(node.body);\n } else if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (decl.initializer) {\n if (ts.isArrowFunction(decl.initializer) || ts.isFunctionExpression(decl.initializer)) {\n if (decl.initializer.body) {\n walkForCalls(decl.initializer.body);\n }\n }\n }\n }\n } else if (ts.isClassDeclaration(node)) {\n for (const member of node.members) {\n if (ts.isMethodDeclaration(member) && member.body) {\n const memberName = member.name && ts.isIdentifier(member.name)\n ? member.name.text\n : null;\n if (memberName) {\n const memberId = lookup.byFileAndName.get(\n `${relativePath}::${ownerName}.${memberName}`,\n );\n // Attribute calls to the method if we have it, else to the class\n const callOwnerId = memberId ?? ownerId;\n function walkMethodCalls(n: ts.Node): void {\n if (ts.isCallExpression(n)) {\n const calledSymbol = checker.getSymbolAtLocation(n.expression);\n if (calledSymbol) {\n const resolved = calledSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(calledSymbol)\n : calledSymbol;\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(callOwnerId, targetId, \"calls\");\n }\n }\n }\n ts.forEachChild(n, walkMethodCalls);\n }\n walkMethodCalls(member.body);\n }\n }\n }\n }\n });\n }\n\n // ---- Extract type usage ----\n function extractTypeUsage(): void {\n ts.forEachChild(sourceFile, function visitTopLevel(node) {\n const ownerName = getOwnerName(node);\n if (!ownerName) return;\n\n const ownerIdOrUndef = lookup.byFileAndName.get(`${relativePath}::${ownerName}`);\n if (!ownerIdOrUndef) return;\n const ownerId: string = ownerIdOrUndef;\n\n function walkForTypes(n: ts.Node): void {\n if (ts.isTypeReferenceNode(n)) {\n const typeSymbol = checker.getSymbolAtLocation(n.typeName);\n if (typeSymbol) {\n const resolved = typeSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(typeSymbol)\n : typeSymbol;\n\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(ownerId, targetId, \"uses_type\");\n }\n }\n }\n ts.forEachChild(n, walkForTypes);\n }\n\n walkForTypes(node);\n });\n }\n\n // ---- Extract JSX renders (component A renders component B) ----\n function extractRenders(): void {\n ts.forEachChild(sourceFile, function visitTopLevel(node) {\n const ownerName = getOwnerName(node);\n if (!ownerName) return;\n\n const ownerIdOrUndef = lookup.byFileAndName.get(`${relativePath}::${ownerName}`);\n if (!ownerIdOrUndef) return;\n const ownerId: string = ownerIdOrUndef;\n\n function walkForJsx(n: ts.Node): void {\n // <Component /> or <Component>...</Component>\n const tagName = ts.isJsxOpeningElement(n)\n ? n.tagName\n : ts.isJsxSelfClosingElement(n)\n ? n.tagName\n : null;\n\n if (tagName) {\n const jsxSymbol = checker.getSymbolAtLocation(tagName);\n if (jsxSymbol) {\n const resolved = jsxSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(jsxSymbol)\n : jsxSymbol;\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(ownerId, targetId, \"renders\");\n }\n }\n\n // Check for .Provider pattern: <XContext.Provider>\n if (\n ts.isPropertyAccessExpression(tagName) &&\n ts.isIdentifier(tagName.name) &&\n tagName.name.text === \"Provider\"\n ) {\n const ctxSymbol = checker.getSymbolAtLocation(tagName.expression);\n if (ctxSymbol) {\n const resolved = ctxSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(ctxSymbol)\n : ctxSymbol;\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(ownerId, targetId, \"provides_context\");\n }\n }\n }\n }\n\n ts.forEachChild(n, walkForJsx);\n }\n\n // Walk function/arrow function bodies for JSX\n if (ts.isFunctionDeclaration(node) && node.body) {\n walkForJsx(node.body);\n } else if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (decl.initializer) {\n if (ts.isArrowFunction(decl.initializer) || ts.isFunctionExpression(decl.initializer)) {\n if (decl.initializer.body) {\n walkForJsx(decl.initializer.body);\n }\n }\n // React.memo/forwardRef wrappers\n if (ts.isCallExpression(decl.initializer)) {\n for (const arg of decl.initializer.arguments) {\n if (ts.isArrowFunction(arg) || ts.isFunctionExpression(arg)) {\n if (arg.body) walkForJsx(arg.body);\n }\n }\n }\n }\n }\n }\n });\n }\n\n // ---- Extract useContext → consumes_context ----\n function extractContextConsumption(): void {\n ts.forEachChild(sourceFile, function visitTopLevel(node) {\n const ownerName = getOwnerName(node);\n if (!ownerName) return;\n\n const ownerIdOrUndef = lookup.byFileAndName.get(`${relativePath}::${ownerName}`);\n if (!ownerIdOrUndef) return;\n const ownerId: string = ownerIdOrUndef;\n\n function walkForContext(n: ts.Node): void {\n const isUseContextCall =\n ts.isCallExpression(n) &&\n n.arguments.length > 0 &&\n (\n // useContext(X)\n (ts.isIdentifier(n.expression) && n.expression.text === \"useContext\") ||\n // React.useContext(X)\n (ts.isPropertyAccessExpression(n.expression) &&\n ts.isIdentifier(n.expression.name) &&\n n.expression.name.text === \"useContext\")\n );\n\n if (isUseContextCall && ts.isCallExpression(n)) {\n const arg = n.arguments[0]!;\n const ctxSymbol = checker.getSymbolAtLocation(arg);\n if (ctxSymbol) {\n const resolved = ctxSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(ctxSymbol)\n : ctxSymbol;\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(ownerId, targetId, \"consumes_context\");\n }\n }\n }\n ts.forEachChild(n, walkForContext);\n }\n\n // Walk function bodies\n if (ts.isFunctionDeclaration(node) && node.body) {\n walkForContext(node.body);\n } else if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (decl.initializer) {\n if (ts.isArrowFunction(decl.initializer) || ts.isFunctionExpression(decl.initializer)) {\n if (decl.initializer.body) {\n walkForContext(decl.initializer.body);\n }\n }\n }\n }\n }\n });\n }\n\n extractImports();\n extractHeritage();\n extractCalls();\n extractTypeUsage();\n extractRenders();\n extractContextConsumption();\n\n return deps;\n}\n\n// ---- Helpers ----\n\nfunction getFileTopLevelSymbols(\n filePath: string,\n lookup: SymbolLookup,\n): string[] {\n const results: string[] = [];\n for (const [key, id] of lookup.byFileAndName) {\n if (key.startsWith(`${filePath}::`)) {\n results.push(id);\n }\n }\n return results;\n}\n\nfunction getOwnerName(node: ts.Node): string | null {\n if (ts.isFunctionDeclaration(node) && node.name) {\n return node.name.text;\n }\n if (ts.isClassDeclaration(node) && node.name) {\n return node.name.text;\n }\n if (ts.isInterfaceDeclaration(node)) {\n return node.name.text;\n }\n if (ts.isTypeAliasDeclaration(node)) {\n return node.name.text;\n }\n if (ts.isEnumDeclaration(node)) {\n return node.name.text;\n }\n if (ts.isVariableStatement(node)) {\n const decl = node.declarationList.declarations[0];\n if (decl && ts.isIdentifier(decl.name)) {\n return decl.name.text;\n }\n }\n return null;\n}\n","import ts from \"typescript\";\nimport { relative } from \"node:path\";\nimport type Database from \"better-sqlite3\";\nimport { containsJsx } from \"./react-utils.js\";\n\nexport interface ComponentInfo {\n symbolId: string;\n isClient: boolean;\n isServerAction: boolean;\n hasState: boolean;\n contextProviders: string[];\n contextConsumers: string[];\n propsType: string | null;\n}\n\n/**\n * Detect file-level directives: \"use client\" or \"use server\".\n * These appear as the first statement in a file as a string literal expression.\n */\nfunction getFileDirective(\n sourceFile: ts.SourceFile,\n): \"use client\" | \"use server\" | null {\n for (const stmt of sourceFile.statements) {\n if (\n ts.isExpressionStatement(stmt) &&\n ts.isStringLiteral(stmt.expression)\n ) {\n const text = stmt.expression.text;\n if (text === \"use client\") return \"use client\";\n if (text === \"use server\") return \"use server\";\n }\n // Directives must be at the top; stop at the first non-directive statement\n break;\n }\n return null;\n}\n\n/**\n * Analyze a component function body for state usage and context patterns.\n */\nfunction analyzeComponentBody(\n node: ts.Node,\n _checker: ts.TypeChecker,\n): {\n hasState: boolean;\n contextProviders: string[];\n contextConsumers: string[];\n} {\n let hasState = false;\n const contextProviders = new Set<string>();\n const contextConsumers = new Set<string>();\n\n function walk(n: ts.Node): void {\n if (ts.isCallExpression(n)) {\n const name = getCallName(n);\n\n // useState / useReducer → has state\n if (name === \"useState\" || name === \"useReducer\") {\n hasState = true;\n }\n\n // useContext(XContext) → consumer\n if (name === \"useContext\" && n.arguments.length > 0) {\n const arg = n.arguments[0]!;\n const ctxName = getExpressionName(arg);\n if (ctxName) {\n contextConsumers.add(ctxName);\n }\n }\n }\n\n // <XContext.Provider> → provider\n if (ts.isJsxSelfClosingElement(n) || ts.isJsxOpeningElement(n)) {\n const tagName = n.tagName;\n if (\n ts.isPropertyAccessExpression(tagName) &&\n ts.isIdentifier(tagName.name) &&\n tagName.name.text === \"Provider\"\n ) {\n const ctxName = getExpressionName(tagName.expression);\n if (ctxName) {\n contextProviders.add(ctxName);\n }\n }\n }\n\n ts.forEachChild(n, walk);\n }\n\n walk(node);\n\n return {\n hasState,\n contextProviders: [...contextProviders],\n contextConsumers: [...contextConsumers],\n };\n}\n\nfunction getCallName(callExpr: ts.CallExpression): string | null {\n const expr = callExpr.expression;\n if (ts.isIdentifier(expr)) return expr.text;\n if (\n ts.isPropertyAccessExpression(expr) &&\n ts.isIdentifier(expr.name)\n ) {\n return expr.name.text;\n }\n return null;\n}\n\nfunction getExpressionName(expr: ts.Node): string | null {\n if (ts.isIdentifier(expr)) return expr.text;\n return null;\n}\n\n/**\n * Extract props type from a component function's first parameter.\n */\nfunction getPropsType(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n checker: ts.TypeChecker,\n): string | null {\n const params = node.parameters;\n if (params.length === 0) return null;\n\n const firstParam = params[0]!;\n const type = checker.getTypeAtLocation(firstParam);\n const typeStr = checker.typeToString(type);\n\n // Skip empty or trivial types\n if (typeStr === \"{}\" || typeStr === \"any\") return null;\n return typeStr;\n}\n\n/**\n * Extract component information from source files and populate the components table.\n */\nexport function analyzeComponents(\n sourceFiles: readonly ts.SourceFile[],\n checker: ts.TypeChecker,\n projectRoot: string,\n db: Database.Database,\n): number {\n const components: ComponentInfo[] = [];\n\n for (const sf of sourceFiles) {\n const relPath = relative(projectRoot, sf.fileName);\n const directive = getFileDirective(sf);\n const isClient = directive === \"use client\";\n const isServerAction = directive === \"use server\";\n\n // Find component symbols in this file\n ts.forEachChild(sf, (node) => {\n // Function declaration components\n if (ts.isFunctionDeclaration(node) && node.name) {\n const name = node.name.text;\n if (!/^[A-Z]/.test(name)) return;\n if (!node.body || !containsJsx(node.body)) return;\n\n const symbolId = `${relPath}::${name}#component`;\n const analysis = analyzeComponentBody(node.body, checker);\n const propsType = getPropsType(node, checker);\n\n components.push({\n symbolId,\n isClient,\n isServerAction,\n hasState: analysis.hasState,\n contextProviders: analysis.contextProviders,\n contextConsumers: analysis.contextConsumers,\n propsType,\n });\n }\n\n // Variable declaration components (arrow functions, memo, forwardRef)\n if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (!ts.isIdentifier(decl.name)) continue;\n const name = decl.name.text;\n if (!/^[A-Z]/.test(name)) continue;\n\n const init = decl.initializer;\n if (!init) continue;\n\n let body: ts.Node | undefined;\n let funcNode: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression | undefined;\n\n if (ts.isArrowFunction(init) || ts.isFunctionExpression(init)) {\n body = init.body;\n funcNode = init;\n } else if (ts.isCallExpression(init)) {\n // React.memo() / React.forwardRef() wrappers\n for (const arg of init.arguments) {\n if (ts.isArrowFunction(arg) || ts.isFunctionExpression(arg)) {\n body = arg.body;\n funcNode = arg;\n break;\n }\n }\n }\n\n if (!body || !containsJsx(body)) continue;\n\n const symbolId = `${relPath}::${name}#component`;\n const analysis = analyzeComponentBody(body, checker);\n const propsType = funcNode ? getPropsType(funcNode, checker) : null;\n\n components.push({\n symbolId,\n isClient,\n isServerAction,\n hasState: analysis.hasState,\n contextProviders: analysis.contextProviders,\n contextConsumers: analysis.contextConsumers,\n propsType,\n });\n }\n }\n });\n }\n\n // Write to database\n writeComponents(db, components);\n return components.length;\n}\n\nfunction writeComponents(\n db: Database.Database,\n components: ComponentInfo[],\n): void {\n if (components.length === 0) return;\n\n // Clear existing components and re-insert\n db.prepare(\"DELETE FROM components\").run();\n\n const insert = db.prepare(`\n INSERT OR IGNORE INTO components (\n symbol_id, is_client, is_server_action, has_state,\n context_providers, context_consumers, props_type\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n // Build set of existing symbol IDs for bulk lookup (avoids N+1 queries)\n const existingIds = new Set(\n (db.prepare(\"SELECT id FROM symbols\").all() as { id: string }[]).map((r) => r.id),\n );\n\n const run = db.transaction(() => {\n for (const c of components) {\n if (!existingIds.has(c.symbolId)) continue;\n\n insert.run(\n c.symbolId,\n c.isClient ? 1 : 0,\n c.isServerAction ? 1 : 0,\n c.hasState ? 1 : 0,\n JSON.stringify(c.contextProviders),\n JSON.stringify(c.contextConsumers),\n c.propsType,\n );\n }\n });\n\n run();\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport type Database from \"better-sqlite3\";\n\nexport interface ExtractedRoute {\n id: string;\n routePath: string;\n kind: \"page\" | \"layout\" | \"loading\" | \"error\" | \"not-found\" | \"api-route\" | \"middleware\";\n httpMethods: string[];\n hasAuth: boolean;\n parentLayout: string | null;\n service: string;\n}\n\n/** Map from Next.js file convention name to route kind */\nconst FILE_KIND_MAP: Record<string, ExtractedRoute[\"kind\"]> = {\n \"page\": \"page\",\n \"layout\": \"layout\",\n \"loading\": \"loading\",\n \"error\": \"error\",\n \"not-found\": \"not-found\",\n \"route\": \"api-route\",\n};\n\nconst TS_EXTENSIONS = [\".tsx\", \".ts\", \".jsx\", \".js\"];\n\n/**\n * Analyze the Next.js app/ directory and populate the routes table.\n */\nexport function analyzeRoutes(\n projectRoot: string,\n db: Database.Database,\n service: string = \"main\",\n): number {\n const appDir = join(projectRoot, \"app\");\n if (!existsSync(appDir) || !statSync(appDir).isDirectory()) {\n return 0;\n }\n\n const routes: ExtractedRoute[] = [];\n const layoutStack: string[] = [];\n\n // Check for root middleware\n for (const ext of TS_EXTENSIONS) {\n const middlewarePath = join(projectRoot, `middleware${ext}`);\n if (existsSync(middlewarePath)) {\n routes.push({\n id: `route::middleware`,\n routePath: \"/\",\n kind: \"middleware\",\n httpMethods: [],\n hasAuth: false,\n parentLayout: null,\n service,\n });\n break;\n }\n }\n\n walkAppDir(appDir, \"/\", routes, layoutStack, service, projectRoot);\n\n // Write to database\n writeRoutes(db, routes);\n return routes.length;\n}\n\nfunction walkAppDir(\n dir: string,\n routePath: string,\n routes: ExtractedRoute[],\n layoutStack: string[],\n service: string,\n projectRoot: string,\n): void {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n\n const currentLayout = layoutStack.length > 0\n ? layoutStack[layoutStack.length - 1]!\n : null;\n\n // Check for convention files in this directory\n for (const [convention, kind] of Object.entries(FILE_KIND_MAP)) {\n for (const ext of TS_EXTENSIONS) {\n const filePath = join(dir, `${convention}${ext}`);\n if (existsSync(filePath)) {\n const relPath = relative(projectRoot, dir);\n const routeId = `route::${relPath}/${convention}`;\n\n const route: ExtractedRoute = {\n id: routeId,\n routePath,\n kind,\n httpMethods: [],\n hasAuth: false,\n parentLayout: currentLayout,\n service,\n };\n\n // For API routes, extract HTTP methods\n if (kind === \"api-route\") {\n route.httpMethods = extractHttpMethods(filePath);\n }\n\n routes.push(route);\n\n // Track layout for children\n if (kind === \"layout\") {\n layoutStack.push(routeId);\n }\n\n break; // Only pick first matching extension\n }\n }\n }\n\n // Recurse into subdirectories\n for (const entry of entries.sort()) {\n const fullPath = join(dir, entry);\n try {\n if (!statSync(fullPath).isDirectory()) continue;\n } catch {\n continue;\n }\n // Skip hidden dirs, node_modules, and parallel route slots (@modal, @sidebar)\n if (entry.startsWith(\".\") || entry.startsWith(\"@\") || entry === \"node_modules\") continue;\n\n const childPath = buildRoutePath(routePath, entry);\n walkAppDir(fullPath, childPath, routes, [...layoutStack], service, projectRoot);\n }\n}\n\n/**\n * Build the URL route path from a directory segment.\n * Handles: route groups (parentheses), dynamic segments [param], catch-all [...slug].\n */\nfunction buildRoutePath(parentPath: string, segment: string): string {\n // Route groups: (auth) → no URL segment\n if (segment.startsWith(\"(\") && segment.endsWith(\")\")) {\n return parentPath;\n }\n\n // Optional catch-all: [[...slug]] → *slug?\n const optionalCatchAll = segment.match(/^\\[\\[\\.\\.\\.(.+)\\]\\]$/);\n if (optionalCatchAll) {\n const name = optionalCatchAll[1]!;\n return parentPath === \"/\" ? `/*${name}?` : `${parentPath}/*${name}?`;\n }\n\n // Dynamic segments: [param] → :param\n const dynamicMatch = segment.match(/^\\[(.+)\\]$/);\n if (dynamicMatch) {\n const param = dynamicMatch[1]!;\n // Catch-all: [...slug] → *slug\n if (param.startsWith(\"...\")) {\n const slug = parentPath === \"/\" ? `/*${param.slice(3)}` : `${parentPath}/*${param.slice(3)}`;\n return slug;\n }\n return parentPath === \"/\" ? `/:${param}` : `${parentPath}/:${param}`;\n }\n\n return parentPath === \"/\" ? `/${segment}` : `${parentPath}/${segment}`;\n}\n\n/**\n * Extract HTTP method exports (GET, POST, PUT, DELETE, PATCH) from an API route file.\n */\nfunction extractHttpMethods(filePath: string): string[] {\n const content = readFileSync(filePath, \"utf-8\");\n const methods: string[] = [];\n const httpMethods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"];\n\n for (const method of httpMethods) {\n // Match: export function GET, export async function GET, export const GET\n const pattern = new RegExp(\n `export\\\\s+(?:async\\\\s+)?(?:function|const)\\\\s+${method}\\\\b`,\n );\n if (pattern.test(content)) {\n methods.push(method);\n }\n }\n\n return methods;\n}\n\nfunction writeRoutes(\n db: Database.Database,\n routes: ExtractedRoute[],\n): void {\n if (routes.length === 0) return;\n\n // Clear existing routes and re-insert\n db.prepare(\"DELETE FROM routes\").run();\n\n const insert = db.prepare(`\n INSERT OR IGNORE INTO routes (\n id, route_path, kind, http_methods, has_auth, parent_layout, service\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n const run = db.transaction(() => {\n for (const r of routes) {\n insert.run(\n r.id,\n r.routePath,\n r.kind,\n JSON.stringify(r.httpMethods),\n r.hasAuth ? 1 : 0,\n r.parentLayout,\n r.service,\n );\n }\n });\n\n run();\n}\n","import { createHash } from \"node:crypto\";\n\nexport function hashContent(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n}\n","import type Database from \"better-sqlite3\";\nimport type { ExtractedSymbol } from \"./types.js\";\nimport type { ExtractedDependency } from \"./dependency-extractor.js\";\n\nexport function getExistingHashes(\n db: Database.Database,\n service: string,\n): Map<string, string> {\n const rows = db\n .prepare(\n \"SELECT DISTINCT file_path, content_hash FROM symbols WHERE service = ?\",\n )\n .all(service) as { file_path: string; content_hash: string }[];\n\n const map = new Map<string, string>();\n for (const row of rows) {\n map.set(row.file_path, row.content_hash);\n }\n return map;\n}\n\nexport function removeSymbolsForFiles(\n db: Database.Database,\n filePaths: string[],\n): void {\n if (filePaths.length === 0) return;\n\n const deleteSymbols = db.prepare(\n \"DELETE FROM symbols WHERE file_path = ?\",\n );\n\n // Clean up dependent tables before deleting symbols (FK constraints)\n const deleteDepsSource = db.prepare(\n \"DELETE FROM dependencies WHERE source_symbol IN (SELECT id FROM symbols WHERE file_path = ?)\",\n );\n const deleteDepsTarget = db.prepare(\n \"DELETE FROM dependencies WHERE target_symbol IN (SELECT id FROM symbols WHERE file_path = ?)\",\n );\n const deleteComponents = db.prepare(\n \"DELETE FROM components WHERE symbol_id IN (SELECT id FROM symbols WHERE file_path = ?)\",\n );\n\n const run = db.transaction(() => {\n for (const fp of filePaths) {\n deleteDepsSource.run(fp);\n deleteDepsTarget.run(fp);\n deleteComponents.run(fp);\n deleteSymbols.run(fp);\n }\n });\n\n run();\n}\n\nexport function writeSymbols(\n db: Database.Database,\n symbols: ExtractedSymbol[],\n service: string,\n language: string = \"typescript\",\n): void {\n if (symbols.length === 0) return;\n\n const insert = db.prepare(`\n INSERT OR REPLACE INTO symbols (\n id, name, qualified_name, kind, file_path,\n start_line, end_line, start_col, end_col,\n signature, return_type, doc_comment,\n is_exported, is_async, service, language,\n content_hash, indexed_at\n ) VALUES (\n ?, ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?\n )\n `);\n\n const now = new Date().toISOString();\n\n const run = db.transaction(() => {\n for (const s of symbols) {\n insert.run(\n s.id,\n s.name,\n s.qualifiedName,\n s.kind,\n s.filePath,\n s.startLine,\n s.endLine,\n s.startCol,\n s.endCol,\n s.signature,\n s.returnType,\n s.docComment,\n s.isExported ? 1 : 0,\n s.isAsync ? 1 : 0,\n service,\n language,\n s.contentHash,\n now,\n );\n }\n });\n\n run();\n}\n\nexport function writeDependencies(\n db: Database.Database,\n dependencies: ExtractedDependency[],\n): void {\n if (dependencies.length === 0) return;\n\n const insert = db.prepare(`\n INSERT OR IGNORE INTO dependencies (source_symbol, target_symbol, kind)\n VALUES (?, ?, ?)\n `);\n\n const run = db.transaction(() => {\n for (const dep of dependencies) {\n insert.run(dep.sourceSymbolId, dep.targetSymbolId, dep.kind);\n }\n });\n\n run();\n}\n","import { execFileSync } from \"node:child_process\";\nimport { resolve, join, dirname, relative, basename } from \"node:path\";\nimport { readdirSync, readFileSync, existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport type Database from \"better-sqlite3\";\nimport type { IndexResult, ExtractedSymbol } from \"./types.js\";\nimport type { ExtractedDependency } from \"./dependency-extractor.js\";\nimport {\n getExistingHashes,\n removeSymbolsForFiles,\n writeSymbols,\n writeDependencies,\n} from \"./db-writer.js\";\n\nexport interface DotnetIndexerOptions {\n projectRoot: string;\n service?: string;\n /** Explicit path to .csproj or .sln. If omitted, auto-detected from projectRoot. */\n csprojPath?: string;\n}\n\n/** JSON shape emitted by the .NET console app */\ninterface DotnetIndexerOutput {\n symbols: Array<{\n id: string;\n name: string;\n qualifiedName: string;\n kind: string;\n filePath: string;\n startLine: number;\n endLine: number;\n startCol: number;\n endCol: number;\n signature: string | null;\n returnType: string | null;\n docComment: string | null;\n isExported: boolean;\n isAsync: boolean;\n contentHash: string;\n projectName?: string;\n }>;\n dependencies: Array<{\n sourceSymbolId: string;\n targetSymbolId: string;\n kind: string;\n }>;\n routes: Array<{\n id: string;\n routePath: string;\n kind: string;\n httpMethods: string[];\n hasAuth: boolean;\n handlerSymbolId?: string;\n }>;\n changedFiles: string[];\n removedFiles: string[];\n filesProcessed: number;\n filesSkipped: number;\n durationMs: number;\n}\n\n/**\n * Find .sln or .csproj in the project root.\n * Prefers .sln if present, falls back to .csproj.\n */\nexport function findDotnetProject(projectRoot: string): string | null {\n try {\n const entries = readdirSync(projectRoot);\n const sln = entries.find((e) => e.endsWith(\".sln\"));\n if (sln) return join(projectRoot, sln);\n const csproj = entries.find((e) => e.endsWith(\".csproj\"));\n if (csproj) return join(projectRoot, csproj);\n return null;\n } catch {\n return null;\n }\n}\n\n/** Represents a .NET project discovered in a solution. */\nexport interface DotnetProjectInfo {\n /** Project name (without .csproj extension) */\n name: string;\n /** Relative path from solution root to .csproj directory */\n path: string;\n /** Full path to the .csproj file */\n csprojPath: string;\n /** Whether this is a test project (name contains Test/Tests) */\n isTestProject: boolean;\n}\n\n/**\n * Parse a .sln file to discover all .csproj projects.\n * Returns project info for each non-test project found.\n */\nexport function parseSolutionProjects(slnPath: string): DotnetProjectInfo[] {\n const content = readFileSync(slnPath, \"utf-8\");\n const slnDir = dirname(slnPath);\n const projects: DotnetProjectInfo[] = [];\n\n // Match Project(\"{...}\") = \"Name\", \"Path\\To\\Project.csproj\", \"{...}\"\n const projectPattern = /Project\\(\"\\{[^}]+\\}\"\\)\\s*=\\s*\"([^\"]+)\",\\s*\"([^\"]+\\.csproj)\"/g;\n let match: RegExpExecArray | null;\n\n while ((match = projectPattern.exec(content)) !== null) {\n const name = match[1];\n const relativeCsprojPath = match[2].replace(/\\\\/g, \"/\");\n const fullCsprojPath = resolve(join(slnDir, relativeCsprojPath));\n\n if (!existsSync(fullCsprojPath)) continue;\n\n const projectDir = relative(slnDir, dirname(fullCsprojPath)).replace(/\\\\/g, \"/\") || \".\";\n // Match .NET test project naming conventions: MyApp.Tests, MyApp.UnitTests, etc.\n // But NOT names that merely start with \"Test\" like TestApi\n const isTestProject = /[.\\x2d]tests?$/i.test(name) ||\n /[.\\x2d](unit|integration|functional|e2e)tests?$/i.test(name);\n\n projects.push({\n name,\n path: projectDir,\n csprojPath: fullCsprojPath,\n isTestProject,\n });\n }\n\n return projects;\n}\n\n/**\n * Discover services from a .NET solution.\n * Returns service configs for non-test projects.\n * Test projects are excluded since they don't represent deployable services.\n */\nexport function discoverDotnetServices(projectRoot: string): DotnetProjectInfo[] {\n const slnPath = findDotnetProject(projectRoot);\n if (!slnPath || !slnPath.endsWith(\".sln\")) {\n // Single .csproj — return one project\n const csproj = slnPath;\n if (!csproj) return [];\n const name = basename(csproj, \".csproj\");\n return [{\n name,\n path: \".\",\n csprojPath: csproj,\n isTestProject: /[.\\x2d]tests?$/i.test(name) ||\n /[.\\x2d](unit|integration|functional|e2e)tests?$/i.test(name),\n }];\n }\n\n return parseSolutionProjects(slnPath);\n}\n\n/**\n * Resolve the path to the .NET indexer project.\n * Looks relative to this package (core) up to the monorepo root.\n */\nfunction resolveIndexerProject(): string {\n // Resolve __dirname equivalent for ESM\n const currentDir = dirname(fileURLToPath(import.meta.url));\n\n // Candidate paths from most to least specific:\n // - From source: packages/core/src/indexer/ → ../../../../dotnet-indexer/\n // - From dist: packages/core/dist/ → ../../dotnet-indexer/\n const candidates = [\n resolve(currentDir, \"../../../../dotnet-indexer/ArcBridge.DotnetIndexer.csproj\"),\n resolve(currentDir, \"../../../dotnet-indexer/ArcBridge.DotnetIndexer.csproj\"),\n resolve(currentDir, \"../../dotnet-indexer/ArcBridge.DotnetIndexer.csproj\"),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n\n throw new Error(\n \"Could not find ArcBridge.DotnetIndexer.csproj. \" +\n \"Ensure the dotnet-indexer package is present in the monorepo.\",\n );\n}\n\n/**\n * Index a .NET project by shelling out to the Roslyn-based .NET indexer.\n * Parses the JSON output and writes symbols/dependencies/routes to SQLite.\n */\nexport function indexDotnetProjectRoslyn(\n db: Database.Database,\n options: DotnetIndexerOptions,\n): IndexResult {\n const start = Date.now();\n const service = options.service ?? \"main\";\n const projectRoot = resolve(options.projectRoot);\n\n // Find the .NET project/solution to analyze\n const dotnetProject = options.csprojPath ?? findDotnetProject(projectRoot);\n if (!dotnetProject) {\n throw new Error(\n \"No .sln or .csproj file found in project root. \" +\n \"The .NET indexer requires a project or solution file.\",\n );\n }\n\n // Get existing hashes for incremental indexing\n const existingHashes = getExistingHashes(db, service);\n const hashesJson = JSON.stringify(Object.fromEntries(existingHashes));\n\n // Resolve the .NET indexer project\n const indexerProject = resolveIndexerProject();\n\n // Shell out to the .NET indexer\n let stdout: string;\n try {\n stdout = execFileSync(\n \"dotnet\",\n [\n \"run\",\n \"--project\", indexerProject,\n \"--no-build\",\n \"--\",\n dotnetProject,\n \"--existing-hashes\", hashesJson,\n ],\n {\n encoding: \"utf-8\",\n maxBuffer: 50 * 1024 * 1024, // 50MB for large projects\n timeout: 300_000, // 5 minutes\n cwd: projectRoot,\n },\n );\n } catch {\n // Try again with build (first run may not have been built)\n try {\n stdout = execFileSync(\n \"dotnet\",\n [\n \"run\",\n \"--project\", indexerProject,\n \"--\",\n dotnetProject,\n \"--existing-hashes\", hashesJson,\n ],\n {\n encoding: \"utf-8\",\n maxBuffer: 50 * 1024 * 1024,\n timeout: 300_000,\n cwd: projectRoot,\n },\n );\n } catch (retryErr) {\n const message = retryErr instanceof Error ? retryErr.message : String(retryErr);\n throw new Error(`.NET indexer failed: ${message}`, { cause: retryErr });\n }\n }\n\n // Parse JSON output (take last line that looks like JSON to skip any build output)\n const lines = stdout.trim().split(\"\\n\");\n const jsonLine = lines.reverse().find((l) => l.startsWith(\"{\"));\n if (!jsonLine) {\n throw new Error(\"No JSON output from .NET indexer\");\n }\n\n let output: DotnetIndexerOutput;\n try {\n output = JSON.parse(jsonLine);\n } catch {\n throw new Error(\n `Failed to parse .NET indexer JSON output. First 200 chars: ${jsonLine.slice(0, 200)}`,\n );\n }\n\n // Remove stale symbols for changed + removed files\n const filesToClean = [...output.changedFiles, ...output.removedFiles];\n removeSymbolsForFiles(db, filesToClean);\n\n // All symbols from all projects in the solution go under one service.\n // In a typical .NET solution (MyApp.Api, MyApp.Domain, MyApp.Infrastructure),\n // these are layers of the same service, not separate services.\n // Agents can still filter by file_path prefix to scope to a specific layer.\n const symbols: ExtractedSymbol[] = output.symbols.map((s) => ({\n id: s.id,\n name: s.name,\n qualifiedName: s.qualifiedName,\n kind: s.kind as ExtractedSymbol[\"kind\"],\n filePath: s.filePath,\n startLine: s.startLine,\n endLine: s.endLine,\n startCol: s.startCol,\n endCol: s.endCol,\n signature: s.signature,\n returnType: s.returnType,\n docComment: s.docComment,\n isExported: s.isExported,\n isAsync: s.isAsync,\n contentHash: s.contentHash,\n }));\n\n writeSymbols(db, symbols, service, \"csharp\");\n\n // Write dependencies\n const deps: ExtractedDependency[] = output.dependencies.map((d) => ({\n sourceSymbolId: d.sourceSymbolId,\n targetSymbolId: d.targetSymbolId,\n kind: d.kind as ExtractedDependency[\"kind\"],\n }));\n\n // Clear existing deps for service and re-insert\n db.prepare(\n \"DELETE FROM dependencies WHERE source_symbol IN (SELECT id FROM symbols WHERE service = ? AND language = 'csharp')\",\n ).run(service);\n writeDependencies(db, deps);\n\n // Clean up stale routes before inserting\n db.prepare(\"DELETE FROM routes WHERE service = ?\").run(service);\n\n // Write routes\n if (output.routes.length > 0) {\n const insertRoute = db.prepare(`\n INSERT OR REPLACE INTO routes (id, route_path, kind, http_methods, has_auth, service)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n const runRoutes = db.transaction(() => {\n for (const route of output.routes) {\n insertRoute.run(\n route.id,\n route.routePath,\n route.kind,\n JSON.stringify(route.httpMethods),\n route.hasAuth ? 1 : 0,\n service,\n );\n }\n });\n\n runRoutes();\n }\n\n return {\n symbolsIndexed: output.symbols.length,\n dependenciesIndexed: output.dependencies.length,\n componentsAnalyzed: 0, // N/A for .NET\n routesAnalyzed: output.routes.length,\n filesProcessed: output.filesProcessed,\n filesSkipped: output.filesSkipped,\n filesRemoved: output.removedFiles.length,\n durationMs: Date.now() - start,\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type Database from \"better-sqlite3\";\nimport { globbySync } from \"globby\";\nimport type { IndexResult, ExtractedSymbol } from \"../types.js\";\nimport type { ExtractedDependency } from \"../dependency-extractor.js\";\nimport { hashContent } from \"../content-hash.js\";\nimport {\n getExistingHashes,\n removeSymbolsForFiles,\n writeSymbols,\n writeDependencies,\n} from \"../db-writer.js\";\nimport { ensureCSharpParser, parseCSharp } from \"./parser.js\";\nimport { extractCSharpSymbols } from \"./symbol-extractor.js\";\nimport {\n extractCSharpDependencies,\n buildCSharpSymbolLookup,\n type SymbolForDeps,\n} from \"./dependency-extractor.js\";\nimport { extractCSharpRoutes, type CSharpRoute } from \"./route-analyzer.js\";\n\nexport interface CSharpTreeSitterOptions {\n projectRoot: string;\n service?: string;\n}\n\n/**\n * Index a C# project using tree-sitter (no .NET SDK required).\n * Mirrors the TypeScript indexer flow: discover → hash → parse → extract → write.\n */\nexport async function indexCSharpTreeSitter(\n db: Database.Database,\n options: CSharpTreeSitterOptions,\n): Promise<IndexResult> {\n const start = Date.now();\n\n // One-time async init of the WASM-based tree-sitter parser\n await ensureCSharpParser();\n const service = options.service ?? \"main\";\n const projectRoot = options.projectRoot;\n\n // 1. Discover .cs files (skip bin/obj/node_modules/.git)\n const csFiles = globbySync(\"**/*.cs\", {\n cwd: projectRoot,\n ignore: [\"**/bin/**\", \"**/obj/**\", \"**/node_modules/**\", \"**/.git/**\"],\n absolute: false,\n });\n\n // 2. Read all files once, hash, and parse — cache for reuse across phases\n const existingHashes = getExistingHashes(db, service);\n const currentPaths = new Set<string>();\n const fileCache = new Map<string, { content: string; tree: ReturnType<typeof parseCSharp> }>();\n\n const changedFiles: string[] = [];\n let filesSkipped = 0;\n\n for (const filePath of csFiles) {\n const relPath = filePath.replace(/\\\\/g, \"/\");\n currentPaths.add(relPath);\n\n const fullPath = join(projectRoot, relPath);\n const content = readFileSync(fullPath, \"utf-8\");\n const hash = hashContent(content);\n const tree = parseCSharp(content);\n fileCache.set(relPath, { content, tree });\n\n const existingHash = existingHashes.get(relPath);\n if (existingHash === hash) {\n filesSkipped++;\n } else {\n changedFiles.push(relPath);\n }\n }\n\n // 3. Find removed files\n const removed: string[] = [];\n for (const existingPath of existingHashes.keys()) {\n if (!currentPaths.has(existingPath)) {\n removed.push(existingPath);\n }\n }\n\n // 4. Remove stale symbols for changed + removed files\n // TODO: removeSymbolsForFiles deletes by file_path without service scoping —\n // safe when services use distinct file paths (typical), but could collide in\n // edge cases. Same limitation exists in the TypeScript indexer.\n const filesToClean = [...removed, ...changedFiles];\n removeSymbolsForFiles(db, filesToClean);\n\n // 5. Extract symbols from changed files\n const allNewSymbols: ExtractedSymbol[] = [];\n for (const relPath of changedFiles) {\n const cached = fileCache.get(relPath);\n if (!cached) continue;\n const symbols = extractCSharpSymbols(cached.tree, relPath, cached.content);\n allNewSymbols.push(...symbols);\n }\n\n // 6. Write symbols to DB\n writeSymbols(db, allNewSymbols, service, \"csharp\");\n\n // 7. Build symbol lookup from ALL db symbols for this service\n const allDbSymbols = db\n .prepare(\"SELECT id, file_path as filePath, name, kind, start_line as startLine, end_line as endLine FROM symbols WHERE service = ?\")\n .all(service) as SymbolForDeps[];\n\n const symbolLookup = buildCSharpSymbolLookup(allDbSymbols);\n\n // 8. Extract dependencies from ALL files (cross-file deps need full context)\n const allDeps: ExtractedDependency[] = [];\n for (const [relPath, cached] of fileCache) {\n const fileDeps = extractCSharpDependencies(cached.tree, relPath, allDbSymbols, symbolLookup);\n allDeps.push(...fileDeps);\n }\n\n // Clear deps for service and re-insert\n db.prepare(\n \"DELETE FROM dependencies WHERE source_symbol IN (SELECT id FROM symbols WHERE service = ? AND language = 'csharp')\",\n ).run(service);\n writeDependencies(db, allDeps);\n\n // 9. Extract routes from ALL files\n const allRoutes: CSharpRoute[] = [];\n for (const [relPath, cached] of fileCache) {\n const routes = extractCSharpRoutes(cached.tree, relPath);\n allRoutes.push(...routes);\n }\n\n // Clean up stale routes before inserting\n db.prepare(\"DELETE FROM routes WHERE service = ?\").run(service);\n\n if (allRoutes.length > 0) {\n const insertRoute = db.prepare(`\n INSERT OR REPLACE INTO routes (id, route_path, kind, http_methods, has_auth, service)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n const runRoutes = db.transaction(() => {\n for (const route of allRoutes) {\n insertRoute.run(\n route.id,\n route.routePath,\n route.kind,\n JSON.stringify(route.httpMethods),\n route.hasAuth ? 1 : 0,\n service,\n );\n }\n });\n\n runRoutes();\n }\n\n return {\n symbolsIndexed: allNewSymbols.length,\n dependenciesIndexed: allDeps.length,\n componentsAnalyzed: 0,\n routesAnalyzed: allRoutes.length,\n filesProcessed: changedFiles.length,\n filesSkipped,\n filesRemoved: removed.length,\n durationMs: Date.now() - start,\n };\n}\n","import { accessSync, constants } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { type Parser, type Tree } from \"web-tree-sitter\";\n\nconst currentDir = dirname(fileURLToPath(import.meta.url));\n\nlet cachedParser: Parser | null = null;\nlet initPromise: Promise<Parser> | null = null;\n\n/**\n * Resolve the path to the vendored C# grammar WASM file.\n * Handles both source (src/indexer/csharp/) and dist (dist/) layouts.\n */\nfunction resolveGrammarPath(): string {\n const candidates = [\n resolve(currentDir, \"../../../wasm/tree-sitter-c_sharp.wasm\"), // from src/indexer/csharp/\n resolve(currentDir, \"../wasm/tree-sitter-c_sharp.wasm\"), // from dist/ (tsup flat bundle)\n ];\n\n for (const candidate of candidates) {\n try {\n accessSync(candidate, constants.R_OK);\n return candidate;\n } catch {\n continue;\n }\n }\n\n throw new Error(\n \"Could not find tree-sitter-c_sharp.wasm. \" +\n \"Ensure the wasm/ directory is present in the @arcbridge/core package.\",\n );\n}\n\n/**\n * Initialize the web-tree-sitter parser with the C# grammar.\n * Must be called (and awaited) before parseCSharp().\n * Safe to call multiple times — returns cached parser after first init.\n */\nexport async function ensureCSharpParser(): Promise<Parser> {\n if (cachedParser) return cachedParser;\n\n // Deduplicate concurrent init calls\n if (initPromise) return initPromise;\n\n initPromise = (async () => {\n try {\n const TreeSitter = await import(\"web-tree-sitter\");\n await TreeSitter.Parser.init();\n const grammarPath = resolveGrammarPath();\n const CSharp = await TreeSitter.Language.load(grammarPath);\n const parser = new TreeSitter.Parser();\n parser.setLanguage(CSharp);\n cachedParser = parser;\n return parser;\n } catch (err) {\n initPromise = null; // allow retry on next call\n throw err;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Parse C# source code. Requires ensureCSharpParser() to have been awaited first.\n * Throws if the parser has not been initialized.\n */\nexport function parseCSharp(content: string): Tree {\n if (!cachedParser) {\n throw new Error(\n \"C# parser not initialized. Call await ensureCSharpParser() first.\",\n );\n }\n const tree = cachedParser.parse(content);\n if (!tree) {\n throw new Error(\"Failed to parse C# content\");\n }\n return tree;\n}\n","import type { ExtractedSymbol, SymbolKind } from \"../types.js\";\nimport { hashContent } from \"../content-hash.js\";\n\ninterface TreeSitterNode {\n type: string;\n text: string;\n startPosition: { row: number; column: number };\n endPosition: { row: number; column: number };\n children: TreeSitterNode[];\n childCount: number;\n child(index: number): TreeSitterNode | null;\n namedChildren: TreeSitterNode[];\n childForFieldName(name: string): TreeSitterNode | null;\n previousSibling: TreeSitterNode | null;\n parent: TreeSitterNode | null;\n}\n\n/**\n * Extract symbols from a tree-sitter CST of a C# file.\n */\nexport function extractCSharpSymbols(\n tree: { rootNode: TreeSitterNode },\n relativePath: string,\n fileContent: string,\n): ExtractedSymbol[] {\n const symbols: ExtractedSymbol[] = [];\n const contentHash = hashContent(fileContent);\n\n // Handle file-scoped namespaces: they apply to all subsequent siblings\n const root = tree.rootNode;\n let fileScopedNamespace: string | null = null;\n\n for (const child of root.namedChildren) {\n if (child.type === \"file_scoped_namespace_declaration\") {\n fileScopedNamespace = getNamespaceName(child);\n // Also walk children in case grammar nests declarations inside the namespace node\n for (const nested of child.namedChildren) {\n walkNode(nested, fileScopedNamespace, null, relativePath, contentHash, symbols);\n }\n continue;\n }\n walkNode(child, fileScopedNamespace, null, relativePath, contentHash, symbols);\n }\n\n return symbols;\n}\n\nfunction walkNode(\n node: TreeSitterNode,\n currentNamespace: string | null,\n currentTypeName: string | null,\n relativePath: string,\n contentHash: string,\n symbols: ExtractedSymbol[],\n): void {\n switch (node.type) {\n case \"namespace_declaration\":\n case \"file_scoped_namespace_declaration\": {\n const nsName = getNamespaceName(node);\n for (const child of node.namedChildren) {\n walkNode(child, nsName, currentTypeName, relativePath, contentHash, symbols);\n }\n return;\n }\n\n case \"class_declaration\":\n case \"record_declaration\":\n case \"struct_declaration\": {\n const name = getIdentifierName(node);\n if (!name) break;\n const qualifiedName = qualify(currentNamespace, name);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"class\",\n node,\n relativePath,\n contentHash,\n modifiers: getModifiers(node),\n docComment: extractDocComment(node),\n }));\n // Walk members with this type as context\n for (const child of node.namedChildren) {\n walkNode(child, currentNamespace, qualifiedName, relativePath, contentHash, symbols);\n }\n return;\n }\n\n case \"interface_declaration\": {\n const name = getIdentifierName(node);\n if (!name) break;\n const qualifiedName = qualify(currentNamespace, name);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"interface\",\n node,\n relativePath,\n contentHash,\n modifiers: getModifiers(node),\n docComment: extractDocComment(node),\n }));\n // Walk interface members\n for (const child of node.namedChildren) {\n walkNode(child, currentNamespace, qualifiedName, relativePath, contentHash, symbols);\n }\n return;\n }\n\n case \"enum_declaration\": {\n const name = getIdentifierName(node);\n if (!name) break;\n const qualifiedName = qualify(currentNamespace, name);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"enum\",\n node,\n relativePath,\n contentHash,\n modifiers: getModifiers(node),\n docComment: extractDocComment(node),\n }));\n return;\n }\n\n case \"delegate_declaration\": {\n const name = getIdentifierName(node);\n if (!name) break;\n const qualifiedName = qualify(currentNamespace, name);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"type\",\n node,\n relativePath,\n contentHash,\n modifiers: getModifiers(node),\n docComment: extractDocComment(node),\n }));\n return;\n }\n\n case \"method_declaration\": {\n const name = getIdentifierName(node);\n if (!name) break;\n const qualifiedName = currentTypeName ? `${currentTypeName}.${name}` : qualify(currentNamespace, name);\n const modifiers = getModifiers(node);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"function\",\n node,\n relativePath,\n contentHash,\n modifiers,\n docComment: extractDocComment(node),\n signature: extractMethodSignature(node),\n returnType: extractReturnType(node),\n isAsync: modifiers.has(\"async\"),\n }));\n return;\n }\n\n case \"constructor_declaration\": {\n const parentName = currentTypeName?.split(\".\").pop() ?? \"\";\n const name = \".ctor\";\n const qualifiedName = currentTypeName ? `${currentTypeName}.${name}` : name;\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"function\",\n node,\n relativePath,\n contentHash,\n modifiers: getModifiers(node),\n docComment: extractDocComment(node),\n signature: extractConstructorSignature(node, parentName),\n }));\n return;\n }\n\n case \"property_declaration\": {\n const name = getIdentifierName(node);\n if (!name) break;\n const qualifiedName = currentTypeName ? `${currentTypeName}.${name}` : qualify(currentNamespace, name);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"variable\",\n node,\n relativePath,\n contentHash,\n modifiers: getModifiers(node),\n docComment: extractDocComment(node),\n }));\n return;\n }\n\n case \"field_declaration\": {\n const varDeclarator = findChild(node, \"variable_declaration\");\n if (!varDeclarator) break;\n const declarators = varDeclarator.namedChildren.filter(\n (c) => c.type === \"variable_declarator\",\n );\n const modifiers = getModifiers(node);\n const isConst = modifiers.has(\"const\");\n\n for (const decl of declarators) {\n const name = getIdentifierName(decl);\n if (!name) continue;\n const qualifiedName = currentTypeName ? `${currentTypeName}.${name}` : qualify(currentNamespace, name);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: isConst ? \"constant\" : \"variable\",\n node,\n relativePath,\n contentHash,\n modifiers,\n docComment: extractDocComment(node),\n }));\n }\n return;\n }\n }\n\n // Continue walking for nodes not handled above\n for (const child of node.namedChildren) {\n walkNode(child, currentNamespace, currentTypeName, relativePath, contentHash, symbols);\n }\n}\n\ninterface MakeSymbolArgs {\n name: string;\n qualifiedName: string;\n kind: SymbolKind;\n node: TreeSitterNode;\n relativePath: string;\n contentHash: string;\n modifiers: Set<string>;\n docComment: string | null;\n signature?: string | null;\n returnType?: string | null;\n isAsync?: boolean;\n}\n\nfunction makeSymbol(args: MakeSymbolArgs): ExtractedSymbol {\n const { name, qualifiedName, kind, node, relativePath, contentHash, modifiers, docComment } = args;\n return {\n id: `${relativePath}::${qualifiedName}#${kind}`,\n name,\n qualifiedName,\n kind,\n filePath: relativePath,\n startLine: node.startPosition.row + 1,\n endLine: node.endPosition.row + 1,\n startCol: node.startPosition.column + 1,\n endCol: node.endPosition.column + 1,\n signature: args.signature ?? null,\n returnType: args.returnType ?? null,\n docComment,\n isExported: modifiers.has(\"public\") || modifiers.has(\"internal\"),\n isAsync: args.isAsync ?? modifiers.has(\"async\"),\n contentHash,\n };\n}\n\nfunction qualify(ns: string | null, name: string): string {\n return ns ? `${ns}.${name}` : name;\n}\n\nfunction getIdentifierName(node: TreeSitterNode): string | null {\n const nameNode = node.childForFieldName(\"name\");\n if (nameNode) return nameNode.text;\n\n // Fallback: find first identifier child\n for (const child of node.namedChildren) {\n if (child.type === \"identifier\") return child.text;\n }\n return null;\n}\n\nfunction getNamespaceName(node: TreeSitterNode): string {\n const nameNode = node.childForFieldName(\"name\");\n if (nameNode) return nameNode.text;\n\n // For qualified names (e.g., Foo.Bar.Baz), look for the name child\n for (const child of node.namedChildren) {\n if (child.type === \"qualified_name\" || child.type === \"identifier\") {\n return child.text;\n }\n }\n return \"\";\n}\n\nfunction getModifiers(node: TreeSitterNode): Set<string> {\n const mods = new Set<string>();\n for (const child of node.children) {\n if (child.type === \"modifier\") {\n mods.add(child.text);\n }\n }\n return mods;\n}\n\nfunction findChild(node: TreeSitterNode, type: string): TreeSitterNode | null {\n for (const child of node.namedChildren) {\n if (child.type === type) return child;\n }\n return null;\n}\n\nfunction extractDocComment(node: TreeSitterNode): string | null {\n // Look at preceding siblings or comments before the node\n const comments: string[] = [];\n let sibling = node.previousSibling;\n\n while (sibling) {\n if (sibling.type === \"comment\" && sibling.text.startsWith(\"///\")) {\n comments.unshift(sibling.text);\n } else if (sibling.type !== \"attribute_list\") {\n // Stop if we hit something that isn't a doc comment or attribute\n break;\n }\n sibling = sibling.previousSibling;\n }\n\n if (comments.length === 0) return null;\n\n // Extract text from XML doc comments\n const fullComment = comments.join(\"\\n\");\n const summaryMatch = fullComment.match(/<summary>\\s*([\\s\\S]*?)\\s*<\\/summary>/);\n if (summaryMatch) {\n return summaryMatch[1]\n .split(\"\\n\")\n .map((line) => line.replace(/^\\s*\\/\\/\\/\\s?/, \"\").trim())\n .filter(Boolean)\n .join(\" \");\n }\n\n // No <summary> tags — just strip /// prefixes\n return comments\n .map((c) => c.replace(/^\\s*\\/\\/\\/\\s?/, \"\").trim())\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction extractMethodSignature(node: TreeSitterNode): string | null {\n const paramList = findChild(node, \"parameter_list\");\n if (!paramList) return null;\n\n const name = getIdentifierName(node) ?? \"method\";\n return `${name}${paramList.text}`;\n}\n\nfunction extractConstructorSignature(node: TreeSitterNode, typeName: string): string | null {\n const paramList = findChild(node, \"parameter_list\");\n if (!paramList) return null;\n return `${typeName}${paramList.text}`;\n}\n\nfunction extractReturnType(node: TreeSitterNode): string | null {\n const typeNode = node.childForFieldName(\"type\");\n if (typeNode) return typeNode.text;\n\n // Fallback: first named child that looks like a type\n for (const child of node.namedChildren) {\n if (\n child.type === \"predefined_type\" ||\n child.type === \"generic_name\" ||\n child.type === \"identifier\" ||\n child.type === \"nullable_type\" ||\n child.type === \"array_type\" ||\n child.type === \"qualified_name\"\n ) {\n return child.text;\n }\n // Stop at parameter list — types come before it\n if (child.type === \"parameter_list\") break;\n }\n return null;\n}\n","import type { ExtractedDependency, DependencyKind } from \"../dependency-extractor.js\";\n\n/** Minimum fields needed from symbols for dependency extraction */\nexport interface SymbolForDeps {\n id: string;\n name: string;\n filePath: string;\n kind: string;\n startLine: number;\n endLine: number;\n}\n\ninterface TreeSitterNode {\n type: string;\n text: string;\n startPosition: { row: number; column: number };\n endPosition: { row: number; column: number };\n namedChildren: TreeSitterNode[];\n children: TreeSitterNode[];\n childForFieldName(name: string): TreeSitterNode | null;\n parent: TreeSitterNode | null;\n}\n\n/**\n * Build a lookup map from simple names to symbol IDs.\n * Used for name-based dependency resolution (no semantic model).\n */\nexport function buildCSharpSymbolLookup(\n symbols: SymbolForDeps[],\n): Map<string, string[]> {\n const lookup = new Map<string, string[]>();\n for (const sym of symbols) {\n // Index by simple name\n const existing = lookup.get(sym.name);\n if (existing) {\n existing.push(sym.id);\n } else {\n lookup.set(sym.name, [sym.id]);\n }\n }\n return lookup;\n}\n\n/**\n * Extract dependencies from a parsed C# file using name-based resolution.\n * Requires a symbol lookup built from all indexed symbols.\n */\nexport function extractCSharpDependencies(\n tree: { rootNode: TreeSitterNode },\n relativePath: string,\n allSymbols: SymbolForDeps[],\n symbolLookup: Map<string, string[]>,\n): ExtractedDependency[] {\n const deps: ExtractedDependency[] = [];\n const seen = new Set<string>();\n\n // Get symbols defined in this file (potential sources)\n const fileSymbols = allSymbols.filter((s) => s.filePath === relativePath);\n\n walkForDependencies(tree.rootNode, fileSymbols, symbolLookup, deps, seen);\n return deps;\n}\n\nfunction walkForDependencies(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n lookup: Map<string, string[]>,\n deps: ExtractedDependency[],\n seen: Set<string>,\n): void {\n switch (node.type) {\n case \"class_declaration\":\n case \"record_declaration\":\n case \"struct_declaration\":\n extractInheritanceDeps(node, fileSymbols, lookup, deps, seen);\n break;\n\n case \"interface_declaration\":\n extractInheritanceDeps(node, fileSymbols, lookup, deps, seen);\n break;\n\n case \"invocation_expression\":\n extractCallDeps(node, fileSymbols, lookup, deps, seen);\n break;\n\n case \"object_creation_expression\":\n extractTypeUsageDep(node, fileSymbols, lookup, deps, seen);\n break;\n }\n\n // Extract type usage from parameter types, return types, variable types\n if (\n node.type === \"parameter\" ||\n node.type === \"variable_declaration\" ||\n node.type === \"property_declaration\"\n ) {\n extractTypeRefDeps(node, fileSymbols, lookup, deps, seen);\n }\n\n for (const child of node.namedChildren) {\n walkForDependencies(child, fileSymbols, lookup, deps, seen);\n }\n}\n\n/**\n * Extract extends/implements from base_list.\n */\nfunction extractInheritanceDeps(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n lookup: Map<string, string[]>,\n deps: ExtractedDependency[],\n seen: Set<string>,\n): void {\n const typeName = getNodeIdentifier(node);\n if (!typeName) return;\n\n const sourceSymbol = findEnclosingSymbol(typeName, fileSymbols, \"class\", \"interface\");\n if (!sourceSymbol) return;\n\n const baseList = findChild(node, \"base_list\");\n if (!baseList) return;\n\n for (const child of baseList.namedChildren) {\n const baseName = extractSimpleTypeName(child);\n if (!baseName) continue;\n\n // Skip self-references\n if (baseName === typeName) continue;\n\n // Heuristic: interface names start with I + uppercase\n const isInterface = /^I[A-Z]/.test(baseName);\n const kind: DependencyKind = isInterface ? \"implements\" : \"extends\";\n\n const targetIds = lookup.get(baseName);\n if (!targetIds) continue;\n\n for (const targetId of targetIds) {\n // Skip self-references\n if (targetId === sourceSymbol.id) continue;\n addDep(deps, seen, sourceSymbol.id, targetId, kind);\n }\n }\n}\n\n/**\n * Extract calls dependencies from invocation expressions.\n */\nfunction extractCallDeps(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n lookup: Map<string, string[]>,\n deps: ExtractedDependency[],\n seen: Set<string>,\n): void {\n const methodName = extractInvokedMethodName(node);\n if (!methodName) return;\n\n // Find the enclosing function/method that contains this call\n const enclosingMethod = findEnclosingMethodForNode(node, fileSymbols);\n if (!enclosingMethod) return;\n\n const targetIds = lookup.get(methodName);\n if (!targetIds) return;\n\n for (const targetId of targetIds) {\n if (targetId === enclosingMethod.id) continue;\n addDep(deps, seen, enclosingMethod.id, targetId, \"calls\");\n }\n}\n\n/**\n * Extract uses_type from object creation (new X()).\n */\nfunction extractTypeUsageDep(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n lookup: Map<string, string[]>,\n deps: ExtractedDependency[],\n seen: Set<string>,\n): void {\n const typeName = extractSimpleTypeName(node);\n if (!typeName) return;\n\n const enclosing = findEnclosingMethodForNode(node, fileSymbols);\n if (!enclosing) return;\n\n const targetIds = lookup.get(typeName);\n if (!targetIds) return;\n\n for (const targetId of targetIds) {\n if (targetId === enclosing.id) continue;\n addDep(deps, seen, enclosing.id, targetId, \"uses_type\");\n }\n}\n\n/**\n * Extract uses_type from type references in parameters, properties, variables.\n */\nfunction extractTypeRefDeps(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n lookup: Map<string, string[]>,\n deps: ExtractedDependency[],\n seen: Set<string>,\n): void {\n const typeNames = collectTypeIdentifiers(node);\n if (typeNames.length === 0) return;\n\n // Find enclosing symbol (method for params, type for properties)\n const enclosing = findEnclosingSymbolForNode(node, fileSymbols);\n if (!enclosing) return;\n\n for (const typeName of typeNames) {\n const targetIds = lookup.get(typeName);\n if (!targetIds) continue;\n\n for (const targetId of targetIds) {\n if (targetId === enclosing.id) continue;\n addDep(deps, seen, enclosing.id, targetId, \"uses_type\");\n }\n }\n}\n\n// --- Helpers ---\n\nfunction addDep(\n deps: ExtractedDependency[],\n seen: Set<string>,\n source: string,\n target: string,\n kind: DependencyKind,\n): void {\n const key = `${source}|${target}|${kind}`;\n if (seen.has(key)) return;\n seen.add(key);\n deps.push({ sourceSymbolId: source, targetSymbolId: target, kind });\n}\n\nfunction findChild(node: TreeSitterNode, type: string): TreeSitterNode | null {\n for (const child of node.namedChildren) {\n if (child.type === type) return child;\n }\n return null;\n}\n\nfunction getNodeIdentifier(node: TreeSitterNode): string | null {\n const nameNode = node.childForFieldName(\"name\");\n if (nameNode) return nameNode.text;\n for (const child of node.namedChildren) {\n if (child.type === \"identifier\") return child.text;\n }\n return null;\n}\n\nfunction extractSimpleTypeName(node: TreeSitterNode): string | null {\n // Walk through to find the actual type name, handling generics and qualified names\n for (const child of node.namedChildren) {\n if (child.type === \"identifier\") return child.text;\n if (child.type === \"generic_name\") {\n const nameNode = child.childForFieldName(\"name\") ?? findChild(child, \"identifier\");\n return nameNode?.text ?? null;\n }\n if (child.type === \"qualified_name\") {\n // Take the last part\n const parts = child.text.split(\".\");\n return parts[parts.length - 1];\n }\n }\n\n if (node.type === \"identifier\") return node.text;\n if (node.type === \"generic_name\") {\n const nameNode = node.childForFieldName(\"name\") ?? findChild(node, \"identifier\");\n return nameNode?.text ?? null;\n }\n\n return null;\n}\n\nfunction extractInvokedMethodName(node: TreeSitterNode): string | null {\n // invocation_expression has function child\n const funcNode = node.childForFieldName(\"function\");\n if (!funcNode) return node.namedChildren[0]?.text ?? null;\n\n if (funcNode.type === \"member_access_expression\") {\n const nameNode = funcNode.childForFieldName(\"name\");\n return nameNode?.text ?? null;\n }\n\n if (funcNode.type === \"identifier\") {\n return funcNode.text;\n }\n\n return null;\n}\n\nfunction findEnclosingSymbol(\n name: string,\n fileSymbols: SymbolForDeps[],\n ...kinds: string[]\n): SymbolForDeps | undefined {\n return fileSymbols.find(\n (s) => s.name === name && kinds.includes(s.kind),\n );\n}\n\nfunction findEnclosingMethodForNode(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n): SymbolForDeps | undefined {\n // Walk up tree to find enclosing method/constructor\n let current: TreeSitterNode | null = node.parent;\n while (current) {\n if (\n current.type === \"method_declaration\" ||\n current.type === \"constructor_declaration\"\n ) {\n const methodName = getNodeIdentifier(current);\n const name = current.type === \"constructor_declaration\" ? \".ctor\" : methodName;\n if (name) {\n return fileSymbols.find(\n (s) => s.kind === \"function\" && s.name === name &&\n s.startLine <= (current!.startPosition.row + 1) &&\n s.endLine >= (current!.endPosition.row + 1),\n );\n }\n }\n current = current.parent;\n }\n return undefined;\n}\n\nfunction findEnclosingSymbolForNode(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n): SymbolForDeps | undefined {\n // First try method, then type\n let current: TreeSitterNode | null = node.parent;\n while (current) {\n if (\n current.type === \"method_declaration\" ||\n current.type === \"constructor_declaration\"\n ) {\n const name = current.type === \"constructor_declaration\"\n ? \".ctor\"\n : getNodeIdentifier(current);\n if (name) {\n const found = fileSymbols.find(\n (s) => s.kind === \"function\" && s.name === name &&\n s.startLine <= (current!.startPosition.row + 1) &&\n s.endLine >= (current!.endPosition.row + 1),\n );\n if (found) return found;\n }\n }\n if (\n current.type === \"class_declaration\" ||\n current.type === \"struct_declaration\" ||\n current.type === \"record_declaration\" ||\n current.type === \"interface_declaration\"\n ) {\n const name = getNodeIdentifier(current);\n if (name) {\n return fileSymbols.find(\n (s) => s.name === name && (s.kind === \"class\" || s.kind === \"interface\"),\n );\n }\n }\n current = current.parent;\n }\n return undefined;\n}\n\nfunction collectTypeIdentifiers(node: TreeSitterNode): string[] {\n const names: string[] = [];\n collectTypeIdentifiersRecursive(node, names);\n return [...new Set(names)];\n}\n\nfunction collectTypeIdentifiersRecursive(node: TreeSitterNode, names: string[]): void {\n if (node.type === \"identifier\" && isTypeContext(node)) {\n names.push(node.text);\n } else if (node.type === \"generic_name\") {\n const nameNode = node.childForFieldName(\"name\") ?? findChild(node, \"identifier\");\n if (nameNode) names.push(nameNode.text);\n }\n\n for (const child of node.namedChildren) {\n collectTypeIdentifiersRecursive(child, names);\n }\n}\n\nfunction isTypeContext(node: TreeSitterNode): boolean {\n const parent = node.parent;\n if (!parent) return false;\n // Type identifiers appear in specific contexts\n return (\n parent.type === \"type_argument_list\" ||\n parent.type === \"generic_name\" ||\n parent.type === \"qualified_name\" ||\n parent.type === \"base_list\" ||\n parent.type === \"type_constraint\" ||\n // Direct type annotation (after :)\n (parent.type === \"parameter\" && node !== parent.childForFieldName(\"name\")) ||\n (parent.type === \"variable_declaration\" && node === parent.namedChildren[0]) ||\n parent.type === \"nullable_type\" ||\n parent.type === \"array_type\"\n );\n}\n","interface TreeSitterNode {\n type: string;\n text: string;\n namedChildren: TreeSitterNode[];\n children: TreeSitterNode[];\n childForFieldName(name: string): TreeSitterNode | null;\n parent: TreeSitterNode | null;\n}\n\nexport interface CSharpRoute {\n id: string;\n routePath: string;\n kind: \"api-route\";\n httpMethods: string[];\n hasAuth: boolean;\n handlerSymbolId?: string;\n}\n\nconst HTTP_ATTRIBUTE_MAP: Record<string, string> = {\n HttpGet: \"GET\",\n HttpPost: \"POST\",\n HttpPut: \"PUT\",\n HttpDelete: \"DELETE\",\n HttpPatch: \"PATCH\",\n HttpHead: \"HEAD\",\n HttpOptions: \"OPTIONS\",\n};\n\nconst MINIMAL_API_MAP: Record<string, string> = {\n MapGet: \"GET\",\n MapPost: \"POST\",\n MapPut: \"PUT\",\n MapDelete: \"DELETE\",\n MapPatch: \"PATCH\",\n};\n\n/**\n * Extract ASP.NET routes from a parsed C# file.\n * Handles both controller-based and minimal API patterns.\n */\nexport function extractCSharpRoutes(\n tree: { rootNode: TreeSitterNode },\n relativePath: string,\n): CSharpRoute[] {\n const routes: CSharpRoute[] = [];\n\n extractControllerRoutes(tree.rootNode, routes, relativePath);\n extractMinimalApiRoutes(tree.rootNode, routes, relativePath);\n\n return routes;\n}\n\n// --- Controller-based routes ---\n\nfunction extractControllerRoutes(\n root: TreeSitterNode,\n routes: CSharpRoute[],\n _relativePath: string,\n): void {\n const classes = findAllNodes(root, \"class_declaration\");\n\n for (const cls of classes) {\n if (!isControllerClass(cls)) continue;\n\n const classRoute = getRoutePrefix(cls);\n const className = getIdentifier(cls);\n const classHasAuth = hasAuthorizeAttribute(cls);\n\n // Find methods with HTTP attributes\n const methods = findAllNodes(cls, \"method_declaration\");\n for (const method of methods) {\n const httpInfo = getHttpMethodFromAttributes(method);\n if (!httpInfo) continue;\n\n const methodHasAuth = hasAuthorizeAttribute(method);\n\n // Build route path\n let routePath = classRoute ?? \"\";\n if (httpInfo.template) {\n routePath = routePath ? `${routePath}/${httpInfo.template}` : httpInfo.template;\n }\n\n // Replace [controller] placeholder\n if (className && routePath.includes(\"[controller]\")) {\n const controllerName = className.replace(/Controller$/, \"\").toLowerCase();\n routePath = routePath.replace(\"[controller]\", controllerName);\n }\n\n // Ensure leading slash\n routePath = routePath.startsWith(\"/\") ? routePath : `/${routePath}`;\n\n const id = `route::${routePath.slice(1)}::${httpInfo.method}`;\n routes.push({\n id,\n routePath,\n kind: \"api-route\",\n httpMethods: [httpInfo.method],\n hasAuth: classHasAuth || methodHasAuth,\n });\n }\n }\n}\n\nfunction isControllerClass(node: TreeSitterNode): boolean {\n // Check for [ApiController] attribute\n if (hasAttribute(node, \"ApiController\")) return true;\n\n // Check for ControllerBase in base list\n const baseList = findChild(node, \"base_list\");\n if (baseList && baseList.text.includes(\"ControllerBase\")) return true;\n if (baseList && baseList.text.includes(\"Controller\")) return true;\n\n return false;\n}\n\nfunction getRoutePrefix(node: TreeSitterNode): string | null {\n const attrs = getAttributes(node);\n for (const attr of attrs) {\n const name = getAttributeName(attr);\n if (name === \"Route\") {\n return getAttributeArgument(attr);\n }\n }\n return null;\n}\n\nfunction getHttpMethodFromAttributes(\n node: TreeSitterNode,\n): { method: string; template: string | null } | null {\n const attrs = getAttributes(node);\n for (const attr of attrs) {\n const name = getAttributeName(attr);\n if (!name) continue;\n\n const httpMethod = HTTP_ATTRIBUTE_MAP[name];\n if (httpMethod) {\n return { method: httpMethod, template: getAttributeArgument(attr) };\n }\n }\n return null;\n}\n\nfunction hasAuthorizeAttribute(node: TreeSitterNode): boolean {\n return hasAttribute(node, \"Authorize\");\n}\n\n// --- Minimal API routes ---\n\nfunction extractMinimalApiRoutes(\n root: TreeSitterNode,\n routes: CSharpRoute[],\n _relativePath: string,\n): void {\n // Find MapGroup calls to track prefixes\n const groupPrefixes = new Map<string, string>();\n extractGroupPrefixes(root, groupPrefixes);\n\n // Find Map{Method} calls\n const invocations = findAllNodes(root, \"invocation_expression\");\n for (const invocation of invocations) {\n const methodName = getInvokedMethodName(invocation);\n if (!methodName) continue;\n\n const httpMethod = MINIMAL_API_MAP[methodName];\n if (!httpMethod) continue;\n\n // Get the route template from the first argument\n const template = getFirstStringArgument(invocation);\n if (template === null) continue;\n\n // Determine the receiver to check for group prefix\n const receiver = getReceiverName(invocation);\n const prefix = receiver ? (groupPrefixes.get(receiver) ?? \"\") : \"\";\n\n // Check for .RequireAuthorization() in the chain\n const hasAuth = hasRequireAuthorization(invocation);\n\n let routePath: string;\n if (prefix && template) {\n routePath = `${prefix}/${template}`;\n } else if (prefix) {\n routePath = prefix;\n } else {\n routePath = template;\n }\n routePath = routePath.startsWith(\"/\") ? routePath : `/${routePath}`;\n // Clean up multiple slashes and trailing slashes (but keep root /)\n routePath = routePath.replace(/\\/{2,}/g, \"/\").replace(/\\/+$/, \"\") || \"/\";\n\n const id = `route::${routePath.slice(1)}::${httpMethod}`;\n routes.push({\n id,\n routePath,\n kind: \"api-route\",\n httpMethods: [httpMethod],\n hasAuth,\n });\n }\n}\n\nfunction extractGroupPrefixes(\n node: TreeSitterNode,\n prefixes: Map<string, string>,\n): void {\n if (node.type === \"invocation_expression\") {\n const methodName = getInvokedMethodName(node);\n if (methodName === \"MapGroup\") {\n const prefix = getFirstStringArgument(node);\n if (prefix !== null) {\n // Find the variable this is assigned to\n const parent = node.parent;\n if (parent?.type === \"variable_declarator\") {\n const varName = getIdentifier(parent);\n if (varName) {\n prefixes.set(varName, prefix);\n }\n } else if (parent?.type === \"equals_value_clause\") {\n const grandParent = parent.parent;\n if (grandParent?.type === \"variable_declarator\") {\n const varName = getIdentifier(grandParent);\n if (varName) {\n prefixes.set(varName, prefix);\n }\n }\n }\n }\n }\n }\n\n for (const child of node.namedChildren) {\n extractGroupPrefixes(child, prefixes);\n }\n}\n\nfunction hasRequireAuthorization(node: TreeSitterNode): boolean {\n // Check if the invocation is part of a chain that includes .RequireAuthorization()\n // Pattern: mapCall(...).RequireAuthorization(...)\n let current: TreeSitterNode | null = node.parent;\n\n // Walk up looking for member_access_expression → invocation_expression patterns\n while (current) {\n if (current.type === \"invocation_expression\") {\n const methodName = getInvokedMethodName(current);\n if (methodName === \"RequireAuthorization\") return true;\n }\n if (current.type === \"member_access_expression\") {\n current = current.parent;\n continue;\n }\n // Check if we're inside a larger expression statement\n if (current.type === \"expression_statement\") {\n // Search the full text for RequireAuthorization\n if (current.text.includes(\"RequireAuthorization\")) return true;\n break;\n }\n current = current.parent;\n }\n\n return false;\n}\n\n// --- Attribute helpers ---\n\nfunction getAttributes(node: TreeSitterNode): TreeSitterNode[] {\n const attrs: TreeSitterNode[] = [];\n for (const child of node.namedChildren) {\n if (child.type === \"attribute_list\") {\n for (const attr of child.namedChildren) {\n if (attr.type === \"attribute\") {\n attrs.push(attr);\n }\n }\n }\n }\n return attrs;\n}\n\nfunction hasAttribute(node: TreeSitterNode, name: string): boolean {\n const attrs = getAttributes(node);\n return attrs.some((a) => getAttributeName(a) === name);\n}\n\nfunction getAttributeName(attr: TreeSitterNode): string | null {\n const nameNode = attr.childForFieldName(\"name\");\n if (nameNode) return nameNode.text;\n for (const child of attr.namedChildren) {\n if (child.type === \"identifier\") return child.text;\n }\n return null;\n}\n\nfunction getAttributeArgument(attr: TreeSitterNode): string | null {\n const argList = findChild(attr, \"attribute_argument_list\");\n if (!argList) return null;\n\n // Find the first string literal argument\n for (const arg of argList.namedChildren) {\n const expr = arg.type === \"attribute_argument\"\n ? arg.namedChildren[0]\n : arg;\n if (expr?.type === \"string_literal\" || expr?.type === \"verbatim_string_literal\") {\n // Remove quotes\n return expr.text.replace(/^[@$]*\"|\"$/g, \"\");\n }\n }\n\n // Check for named arguments like Name = \"...\"\n for (const arg of argList.namedChildren) {\n for (const child of arg.namedChildren) {\n if (child.type === \"string_literal\" || child.type === \"verbatim_string_literal\") {\n return child.text.replace(/^[@$]*\"|\"$/g, \"\");\n }\n }\n }\n\n return null;\n}\n\n// --- General node helpers ---\n\nfunction findChild(node: TreeSitterNode, type: string): TreeSitterNode | null {\n for (const child of node.namedChildren) {\n if (child.type === type) return child;\n }\n return null;\n}\n\nfunction findAllNodes(root: TreeSitterNode, type: string): TreeSitterNode[] {\n const results: TreeSitterNode[] = [];\n function walk(node: TreeSitterNode): void {\n if (node.type === type) results.push(node);\n for (const child of node.namedChildren) {\n walk(child);\n }\n }\n walk(root);\n return results;\n}\n\nfunction getIdentifier(node: TreeSitterNode): string | null {\n const nameNode = node.childForFieldName(\"name\");\n if (nameNode) return nameNode.text;\n for (const child of node.namedChildren) {\n if (child.type === \"identifier\") return child.text;\n }\n return null;\n}\n\nfunction getInvokedMethodName(node: TreeSitterNode): string | null {\n const funcNode = node.childForFieldName(\"function\");\n if (!funcNode) return node.namedChildren[0]?.text ?? null;\n\n if (funcNode.type === \"member_access_expression\") {\n const nameNode = funcNode.childForFieldName(\"name\");\n return nameNode?.text ?? null;\n }\n if (funcNode.type === \"identifier\") {\n return funcNode.text;\n }\n return null;\n}\n\nfunction getReceiverName(node: TreeSitterNode): string | null {\n const funcNode = node.childForFieldName(\"function\");\n if (!funcNode || funcNode.type !== \"member_access_expression\") return null;\n const expr = funcNode.childForFieldName(\"expression\");\n if (expr?.type === \"identifier\") return expr.text;\n return null;\n}\n\nfunction getFirstStringArgument(node: TreeSitterNode): string | null {\n const argList = findChild(node, \"argument_list\");\n if (!argList) return null;\n\n for (const arg of argList.namedChildren) {\n const expr = arg.type === \"argument\" ? arg.namedChildren[0] : arg;\n if (expr?.type === \"string_literal\" || expr?.type === \"verbatim_string_literal\") {\n return expr.text.replace(/^[@$]*\"|\"$/g, \"\");\n }\n }\n return null;\n}\n","import { join } from \"node:path\";\nimport { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport type Database from \"better-sqlite3\";\n\nexport interface PackageDependency {\n name: string;\n version: string | null;\n source: \"npm\" | \"npm-dev\" | \"nuget\";\n}\n\n/**\n * Scan the project root for package dependency manifests (package.json, .csproj)\n * and write discovered dependencies to the package_dependencies table.\n */\nexport function indexPackageDependencies(\n db: Database.Database,\n projectRoot: string,\n service: string = \"main\",\n): number {\n const deps: PackageDependency[] = [];\n\n // Parse package.json (npm)\n const pkgJsonPath = join(projectRoot, \"package.json\");\n if (existsSync(pkgJsonPath)) {\n deps.push(...parsePackageJson(pkgJsonPath));\n }\n\n // Parse all .csproj files (NuGet)\n const csprojFiles = findCsprojFiles(projectRoot);\n for (const csproj of csprojFiles) {\n deps.push(...parseCsproj(csproj));\n }\n\n if (deps.length === 0) return 0;\n\n // Clear existing deps for this service and re-insert\n db.prepare(\"DELETE FROM package_dependencies WHERE service = ?\").run(service);\n\n const insert = db.prepare(\n \"INSERT OR IGNORE INTO package_dependencies (name, version, source, service) VALUES (?, ?, ?, ?)\",\n );\n\n const run = db.transaction(() => {\n for (const dep of deps) {\n insert.run(dep.name, dep.version, dep.source, service);\n }\n });\n\n run();\n return deps.length;\n}\n\n/**\n * Parse package.json for npm dependencies.\n */\nfunction parsePackageJson(filePath: string): PackageDependency[] {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const pkg = JSON.parse(content) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const deps: PackageDependency[] = [];\n\n if (pkg.dependencies) {\n for (const [name, version] of Object.entries(pkg.dependencies)) {\n deps.push({ name, version, source: \"npm\" });\n }\n }\n\n if (pkg.devDependencies) {\n for (const [name, version] of Object.entries(pkg.devDependencies)) {\n deps.push({ name, version, source: \"npm-dev\" });\n }\n }\n\n return deps;\n } catch {\n return [];\n }\n}\n\n/**\n * Parse a .csproj file for NuGet PackageReference entries.\n * Handles the standard MSBuild XML format:\n * <PackageReference Include=\"PackageName\" Version=\"1.2.3\" />\n * <PackageReference Include=\"PackageName\" Version=\"1.2.3\"></PackageReference>\n */\nfunction parseCsproj(filePath: string): PackageDependency[] {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const deps: PackageDependency[] = [];\n\n // Match <PackageReference Include=\"Name\" Version=\"Ver\" />\n // Version can be an attribute or a child element, or omitted (centrally managed)\n const pattern = /<PackageReference\\s+Include=\"([^\"]+)\"(?:\\s+Version=\"([^\"]*)\")?[^>]*\\/?>/gi;\n let match: RegExpExecArray | null;\n\n while ((match = pattern.exec(content)) !== null) {\n deps.push({\n name: match[1],\n version: match[2] ?? null,\n source: \"nuget\",\n });\n }\n\n return deps;\n } catch {\n return [];\n }\n}\n\n/**\n * Find all .csproj files in the project root (recursive, skips bin/obj/node_modules).\n */\nfunction findCsprojFiles(dir: string, maxDepth: number = 4): string[] {\n const results: string[] = [];\n\n function walk(currentDir: string, depth: number): void {\n if (depth > maxDepth) return;\n\n try {\n const entries = readdirSync(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name === \"bin\" || entry.name === \"obj\" || entry.name === \"node_modules\" || entry.name === \".git\") continue;\n\n const fullPath = join(currentDir, entry.name);\n if (entry.isFile() && entry.name.endsWith(\".csproj\")) {\n results.push(fullPath);\n } else if (entry.isDirectory()) {\n walk(fullPath, depth + 1);\n }\n }\n } catch {\n // Permission errors, etc.\n }\n }\n\n walk(dir, 0);\n return results;\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport yaml from \"yaml\";\nimport { ArcBridgeConfigSchema, type ArcBridgeConfig } from \"../schemas/config.js\";\n\n/**\n * Load and validate the ArcBridge config from `.arcbridge/config.yaml`.\n * Returns null if the file doesn't exist or fails validation.\n */\nexport function loadConfig(\n projectRoot: string,\n): { config: ArcBridgeConfig | null; error: string | null } {\n const configPath = join(projectRoot, \".arcbridge\", \"config.yaml\");\n\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = ArcBridgeConfigSchema.safeParse(yaml.parse(raw));\n if (parsed.success) {\n return { config: parsed.data, error: null };\n }\n const issues = parsed.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n return { config: null, error: `Config validation failed: ${issues}` };\n } catch (err) {\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { config: null, error: null };\n }\n return { config: null, error: `Config load error: ${err instanceof Error ? err.message : String(err)}` };\n }\n}\n","import type Database from \"better-sqlite3\";\n\nexport type DriftKind =\n | \"undocumented_module\"\n | \"missing_module\"\n | \"dependency_violation\"\n | \"unlinked_test\"\n | \"stale_adr\"\n | \"new_dependency\";\n\nexport type DriftSeverity = \"info\" | \"warning\" | \"error\";\n\nexport interface DriftEntry {\n kind: DriftKind;\n severity: DriftSeverity;\n description: string;\n affectedBlock: string | null;\n affectedFile: string | null;\n}\n\ninterface BlockRow {\n id: string;\n name: string;\n code_paths: string;\n interfaces: string;\n}\n\ninterface AdrRow {\n id: string;\n title: string;\n affected_files: string;\n}\n\nexport interface DriftOptions {\n /** File paths/prefixes to ignore in undocumented_module checks */\n ignorePaths?: string[];\n /** Project type — used to auto-ignore common framework files */\n projectType?: string;\n}\n\n/** Built-in ignore patterns for known project types */\nconst FRAMEWORK_IGNORES: Record<string, string[]> = {\n \"nextjs-app-router\": [\n \".next/\",\n \"next.config\",\n \"src/app/layout.\",\n \"src/app/page.\",\n \"src/app/not-found.\",\n \"src/app/loading.\",\n \"src/app/error.\",\n \"src/app/global-error.\",\n \"src/middleware.\",\n \"app/layout.\",\n \"app/page.\",\n \"app/not-found.\",\n \"app/loading.\",\n \"app/error.\",\n \"app/global-error.\",\n \"middleware.\",\n ],\n \"react-vite\": [\"src/main.\", \"src/App.\", \"vite.config\"],\n \"api-service\": [\"src/index.\", \"src/app.\", \"src/server.\"],\n \"dotnet-webapi\": [\n \"Program.\", \"Startup.\",\n \"bin/\", \"obj/\",\n \"Properties/\",\n \"Migrations/\",\n \"wwwroot/\",\n ],\n};\n\n/**\n * Run architecture drift detection against the indexed codebase.\n * Compares building block code_paths against actual indexed files,\n * checks cross-block dependencies, and validates ADR references.\n */\nexport function detectDrift(\n db: Database.Database,\n options?: DriftOptions,\n): DriftEntry[] {\n const entries: DriftEntry[] = [];\n\n // Build ignore list from options + framework defaults\n const ignorePaths = [...(options?.ignorePaths ?? [])];\n if (options?.projectType && FRAMEWORK_IGNORES[options.projectType]) {\n ignorePaths.push(...FRAMEWORK_IGNORES[options.projectType]);\n }\n\n detectUndocumentedModules(db, entries, ignorePaths);\n detectMissingModules(db, entries);\n detectDependencyViolations(db, entries);\n detectUnlinkedTests(db, entries);\n detectStaleAdrs(db, entries);\n detectNewDependencies(db, entries);\n\n return entries;\n}\n\n/**\n * Write drift entries to the drift_log table.\n * Clears existing unresolved entries and inserts fresh ones.\n */\nexport function writeDriftLog(\n db: Database.Database,\n entries: DriftEntry[],\n): void {\n // Clear unresolved entries (keep resolved ones for history)\n db.prepare(\"DELETE FROM drift_log WHERE resolution IS NULL\").run();\n\n if (entries.length === 0) return;\n\n const insert = db.prepare(`\n INSERT INTO drift_log (detected_at, kind, severity, description, affected_block, affected_file)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n const now = new Date().toISOString();\n\n const run = db.transaction(() => {\n for (const e of entries) {\n insert.run(now, e.kind, e.severity, e.description, e.affectedBlock, e.affectedFile);\n }\n });\n\n run();\n}\n\n// --- Detection functions ---\n\n/**\n * Find source files that have indexed symbols but don't match any building block's code_paths.\n */\nfunction detectUndocumentedModules(\n db: Database.Database,\n entries: DriftEntry[],\n ignorePaths: string[] = [],\n): void {\n const blocks = db\n .prepare(\"SELECT id, name, code_paths FROM building_blocks\")\n .all() as BlockRow[];\n\n if (blocks.length === 0) return;\n\n // Build a list of all code_path prefixes across all blocks\n const allPrefixes: string[] = [];\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n allPrefixes.push(normalizePath(cp));\n }\n }\n\n if (allPrefixes.length === 0) return;\n\n // Get all unique file paths from symbols\n const filePaths = db\n .prepare(\"SELECT DISTINCT file_path FROM symbols ORDER BY file_path\")\n .all() as { file_path: string }[];\n\n for (const { file_path } of filePaths) {\n const matched = allPrefixes.some((prefix) => fileMatchesPath(file_path, prefix));\n if (!matched) {\n // Skip files matching ignore patterns (framework files, config files, etc.)\n const ignored = ignorePaths.some((pattern) => file_path.startsWith(pattern));\n if (ignored) continue;\n\n entries.push({\n kind: \"undocumented_module\",\n severity: \"warning\",\n description: `File \\`${file_path}\\` has indexed symbols but is not mapped to any building block's code_paths.`,\n affectedBlock: null,\n affectedFile: file_path,\n });\n }\n }\n}\n\n/**\n * Find building blocks whose code_paths reference directories/files with no indexed symbols.\n */\nfunction detectMissingModules(\n db: Database.Database,\n entries: DriftEntry[],\n): void {\n const blocks = db\n .prepare(\"SELECT id, name, code_paths FROM building_blocks\")\n .all() as BlockRow[];\n\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n\n for (const cp of paths) {\n const prefix = normalizePath(cp);\n // Check if any symbol file_path matches this code_path\n const match = db\n .prepare(\"SELECT 1 FROM symbols WHERE file_path LIKE ? LIMIT 1\")\n .get(`${escapeLike(prefix)}%`) as unknown | undefined;\n\n if (!match) {\n entries.push({\n kind: \"missing_module\",\n severity: \"warning\",\n description: `Building block \\`${block.name}\\` (${block.id}) declares code_path \\`${cp}\\` but no indexed symbols match it.`,\n affectedBlock: block.id,\n affectedFile: null,\n });\n }\n }\n }\n}\n\n/**\n * Find dependencies that cross building block boundaries.\n * A dependency violation occurs when a symbol in block A imports/calls a symbol in block B,\n * but block A doesn't declare block B in its interfaces.\n */\nfunction detectDependencyViolations(\n db: Database.Database,\n entries: DriftEntry[],\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 < 2) return;\n\n // Build file → block mapping\n const fileToBlock = new Map<string, string>();\n const blockPrefixes = new Map<string, string[]>();\n\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n const prefixes = paths.map(normalizePath);\n blockPrefixes.set(block.id, prefixes);\n }\n\n // Get all file paths and assign them to blocks\n const filePaths = db\n .prepare(\"SELECT DISTINCT file_path FROM symbols\")\n .all() as { file_path: string }[];\n\n for (const { file_path } of filePaths) {\n for (const block of blocks) {\n const prefixes = blockPrefixes.get(block.id) ?? [];\n if (prefixes.some((prefix) => fileMatchesPath(file_path, prefix))) {\n fileToBlock.set(file_path, block.id);\n break; // First match wins\n }\n }\n }\n\n // Build block interface sets (declared allowed dependencies)\n const blockInterfaces = new Map<string, Set<string>>();\n for (const block of blocks) {\n const interfaces = safeParseJson<string[]>(block.interfaces, []);\n blockInterfaces.set(block.id, new Set(interfaces));\n }\n\n // Check all dependencies for cross-block violations\n const crossBlockDeps = db\n .prepare(\n `SELECT\n d.source_symbol, d.target_symbol, d.kind,\n ss.file_path as source_file,\n 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 IN ('imports', 'calls', 'renders')`,\n )\n .all() as {\n source_symbol: string;\n target_symbol: string;\n kind: string;\n source_file: string;\n target_file: string;\n }[];\n\n // Build name lookup for reporting\n const blockNames = new Map(blocks.map((b) => [b.id, b.name]));\n\n // Track violations to avoid duplicates (report per file pair, not per edge)\n const reported = new Set<string>();\n\n for (const dep of crossBlockDeps) {\n const sourceBlock = fileToBlock.get(dep.source_file);\n const targetBlock = fileToBlock.get(dep.target_file);\n\n // Skip if same block, unmapped, or declared interface\n if (!sourceBlock || !targetBlock) continue;\n if (sourceBlock === targetBlock) continue;\n\n const interfaces = blockInterfaces.get(sourceBlock);\n if (interfaces && interfaces.has(targetBlock)) continue;\n\n const key = `${sourceBlock}→${targetBlock}`;\n if (reported.has(key)) continue;\n reported.add(key);\n\n const sourceBlockName = blockNames.get(sourceBlock) ?? sourceBlock;\n const targetBlockName = blockNames.get(targetBlock) ?? targetBlock;\n\n entries.push({\n kind: \"dependency_violation\",\n severity: \"error\",\n description: `Block \\`${sourceBlockName}\\` (${sourceBlock}) depends on block \\`${targetBlockName}\\` (${targetBlock}) but does not declare it in its interfaces.`,\n affectedBlock: sourceBlock,\n affectedFile: dep.source_file,\n });\n }\n}\n\n/**\n * Find quality scenarios with linked_tests that don't match any indexed file paths.\n */\nfunction detectUnlinkedTests(\n db: Database.Database,\n entries: DriftEntry[],\n): void {\n const scenarios = db\n .prepare(\n \"SELECT id, name, linked_tests FROM quality_scenarios WHERE linked_tests != '[]'\",\n )\n .all() as { id: string; name: string; linked_tests: string }[];\n\n // Get all known file paths for fast lookup\n const knownFiles = new Set(\n (\n db\n .prepare(\"SELECT DISTINCT file_path FROM symbols\")\n .all() as { file_path: string }[]\n ).map((r) => r.file_path),\n );\n\n for (const scenario of scenarios) {\n const testPaths = safeParseJson<string[]>(scenario.linked_tests, []);\n\n for (const testPath of testPaths) {\n // Check if any known file starts with (or equals) this path\n const prefix = normalizePath(testPath);\n const found = [...knownFiles].some(\n (fp) => fp === prefix || fp.startsWith(prefix),\n );\n\n if (!found) {\n entries.push({\n kind: \"unlinked_test\",\n severity: \"warning\",\n description: `Quality scenario \\`${scenario.id}: ${scenario.name}\\` links to test path \\`${testPath}\\` but no indexed files match it.`,\n affectedBlock: null,\n affectedFile: testPath,\n });\n }\n }\n }\n}\n\n/**\n * Find ADRs whose affected_files reference paths with no indexed symbols.\n */\nfunction detectStaleAdrs(\n db: Database.Database,\n entries: DriftEntry[],\n): void {\n const adrs = db\n .prepare(\"SELECT id, title, affected_files FROM adrs WHERE status != 'superseded'\")\n .all() as AdrRow[];\n\n for (const adr of adrs) {\n const files = safeParseJson<string[]>(adr.affected_files, []);\n if (files.length === 0) continue;\n\n for (const file of files) {\n const prefix = normalizePath(file);\n const match = db\n .prepare(\"SELECT 1 FROM symbols WHERE file_path LIKE ? LIMIT 1\")\n .get(`${escapeLike(prefix)}%`) as unknown | undefined;\n\n if (!match) {\n entries.push({\n kind: \"stale_adr\",\n severity: \"info\",\n description: `ADR \\`${adr.id}: ${adr.title}\\` references \\`${file}\\` but no indexed symbols match it.`,\n affectedBlock: null,\n affectedFile: file,\n });\n }\n }\n }\n}\n\n/**\n * Find package dependencies (npm/NuGet) that have no corresponding ADR.\n * Flags packages that were likely added without documenting the rationale.\n * Only flags non-trivial packages (skips common tooling/framework deps).\n */\nfunction detectNewDependencies(\n db: Database.Database,\n entries: DriftEntry[],\n): void {\n const packages = db\n .prepare(\"SELECT name, source FROM package_dependencies WHERE source IN ('npm', 'nuget')\")\n .all() as { name: string; source: string }[];\n\n if (packages.length === 0) return;\n\n // Get all ADR text to check if any mention the package\n const adrs = db\n .prepare(\"SELECT id, title, context, decision FROM adrs WHERE status != 'superseded'\")\n .all() as { id: string; title: string; context: string | null; decision: string | null }[];\n\n // Build searchable text from ADRs\n const adrText = adrs\n .map((a) => `${a.title} ${a.context ?? \"\"} ${a.decision ?? \"\"}`.toLowerCase())\n .join(\" \");\n\n // Common packages that don't need ADRs (all lowercase for case-insensitive matching)\n const trivialPackages = new Set([\n // npm\n \"typescript\", \"eslint\", \"prettier\", \"vitest\", \"jest\",\n \"@types/node\", \"@types/react\", \"tsup\", \"tsx\",\n // nuget\n \"microsoft.net.test.sdk\", \"xunit\", \"xunit.runner.visualstudio\",\n \"nunit\", \"nunit3testadapter\", \"coverlet.collector\",\n \"microsoft.aspnetcore.openapi\", \"swashbuckle.aspnetcore\",\n ]);\n\n for (const pkg of packages) {\n if (trivialPackages.has(pkg.name.toLowerCase())) continue;\n\n // Check if any ADR mentions this package\n const pkgLower = pkg.name.toLowerCase();\n if (adrText.includes(pkgLower)) continue;\n\n // Also check for partial matches (e.g., ADR mentions \"Serilog\" matches \"Serilog.Sinks.Console\")\n const baseName = pkgLower.split(/[./]/)[0];\n if (baseName && baseName.length > 3 && adrText.includes(baseName)) continue;\n\n entries.push({\n kind: \"new_dependency\",\n severity: \"info\",\n description: `Package \\`${pkg.name}\\` (${pkg.source}) is used but not mentioned in any ADR. Consider documenting why this dependency was chosen.`,\n affectedBlock: null,\n affectedFile: null,\n });\n }\n}\n\n// --- Helpers ---\n\nfunction normalizePath(codePath: string): string {\n // Remove trailing glob patterns: \"src/lib/**\" → \"src/lib/\", \"src/lib/*\" → \"src/lib/\"\n return codePath.replace(/\\*+\\/?$/, \"\");\n}\n\nfunction fileMatchesPath(filePath: string, prefix: string): boolean {\n // Exact file match or directory prefix match\n return filePath === prefix || filePath.startsWith(prefix);\n}\n\nfunction escapeLike(value: string): string {\n return value.replace(/%/g, \"\\\\%\").replace(/_/g, \"\\\\_\");\n}\n\nfunction 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","import { join } from \"node:path\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { parse, stringify } from \"yaml\";\nimport { TaskFileSchema, PhasesFileSchema } from \"../schemas/phases.js\";\nimport { QualityScenariosFileSchema } from \"../schemas/quality-scenarios.js\";\n\n/**\n * Update a task's status in the YAML task file.\n * Reads the file, updates the matching task, and writes it back.\n */\nexport function syncTaskToYaml(\n projectRoot: string,\n phaseId: string,\n taskId: string,\n status: string,\n completedAt?: string | null,\n): void {\n const taskPath = join(\n projectRoot,\n \".arcbridge\",\n \"plan\",\n \"tasks\",\n `${phaseId}.yaml`,\n );\n\n if (!existsSync(taskPath)) return;\n\n const raw = readFileSync(taskPath, \"utf-8\");\n const parsed = parse(raw);\n const result = TaskFileSchema.safeParse(parsed);\n if (!result.success) return;\n\n const taskFile = result.data;\n const task = taskFile.tasks.find((t) => t.id === taskId);\n if (!task) return;\n\n task.status = status as typeof task.status;\n if (completedAt) {\n task.completed_at = completedAt;\n } else if (status !== \"done\") {\n delete task.completed_at;\n }\n\n writeFileSync(taskPath, stringify(taskFile), \"utf-8\");\n}\n\n/**\n * Add a new task to a phase's YAML task file.\n * Creates the file if it doesn't exist.\n */\nexport function addTaskToYaml(\n projectRoot: string,\n phaseId: string,\n task: {\n id: string;\n title: string;\n status: string;\n building_block?: string;\n quality_scenarios: string[];\n acceptance_criteria: string[];\n },\n): void {\n const tasksDir = join(projectRoot, \".arcbridge\", \"plan\", \"tasks\");\n const taskPath = join(tasksDir, `${phaseId}.yaml`);\n\n mkdirSync(tasksDir, { recursive: true });\n\n let taskFile: { schema_version: 1; phase_id: string; tasks: typeof task[] };\n\n if (existsSync(taskPath)) {\n const raw = readFileSync(taskPath, \"utf-8\");\n const parsed = parse(raw);\n const result = TaskFileSchema.safeParse(parsed);\n if (result.success) {\n taskFile = result.data as typeof taskFile;\n } else {\n taskFile = { schema_version: 1, phase_id: phaseId, tasks: [] };\n }\n } else {\n taskFile = { schema_version: 1, phase_id: phaseId, tasks: [] };\n }\n\n // Don't duplicate\n if (!taskFile.tasks.some((t) => t.id === task.id)) {\n taskFile.tasks.push(task);\n }\n\n writeFileSync(taskPath, stringify(taskFile), \"utf-8\");\n}\n\n/**\n * Update a phase's status in phases.yaml.\n */\nexport function syncPhaseToYaml(\n projectRoot: string,\n phaseId: string,\n status: string,\n startedAt?: string | null,\n completedAt?: string | null,\n): void {\n const phasesPath = join(\n projectRoot,\n \".arcbridge\",\n \"plan\",\n \"phases.yaml\",\n );\n\n if (!existsSync(phasesPath)) return;\n\n const raw = readFileSync(phasesPath, \"utf-8\");\n const parsed = parse(raw);\n const result = PhasesFileSchema.safeParse(parsed);\n if (!result.success) return;\n\n const phasesFile = result.data;\n const phase = phasesFile.phases.find((p) => p.id === phaseId);\n if (!phase) return;\n\n phase.status = status as typeof phase.status;\n if (startedAt) phase.started_at = startedAt;\n if (completedAt) phase.completed_at = completedAt;\n\n writeFileSync(phasesPath, stringify(phasesFile), \"utf-8\");\n}\n\n/**\n * Update a quality scenario's status in 10-quality-scenarios.yaml.\n */\nexport function syncScenarioToYaml(\n projectRoot: string,\n scenarioId: string,\n status: string,\n): void {\n const scenarioPath = join(\n projectRoot,\n \".arcbridge\",\n \"arc42\",\n \"10-quality-scenarios.yaml\",\n );\n\n if (!existsSync(scenarioPath)) return;\n\n const raw = readFileSync(scenarioPath, \"utf-8\");\n const parsed = parse(raw);\n const result = QualityScenariosFileSchema.safeParse(parsed);\n if (!result.success) return;\n\n const scenariosFile = result.data;\n const scenario = scenariosFile.scenarios.find((s) => s.id === scenarioId);\n if (!scenario) return;\n\n scenario.status = status as typeof scenario.status;\n\n writeFileSync(scenarioPath, stringify(scenariosFile), \"utf-8\");\n}\n","import type Database from \"better-sqlite3\";\nimport { syncTaskToYaml } from \"./yaml-writer.js\";\n\nexport interface TaskInferenceResult {\n taskId: string;\n previousStatus: string;\n inferredStatus: string;\n reason: string;\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\ninterface BlockRow {\n id: string;\n code_paths: string;\n}\n\n/**\n * Infer task status from code state.\n * Checks if building block code exists, acceptance criteria symbols are present, etc.\n */\nexport function inferTaskStatuses(\n db: Database.Database,\n phaseId: string,\n): TaskInferenceResult[] {\n const results: TaskInferenceResult[] = [];\n\n const tasks = db\n .prepare(\n \"SELECT id, title, status, building_block, quality_scenarios, acceptance_criteria FROM tasks WHERE phase_id = ? AND status != 'done'\",\n )\n .all(phaseId) as TaskRow[];\n\n for (const task of tasks) {\n const inference = inferSingleTask(db, task);\n if (inference && inference.inferredStatus !== task.status) {\n results.push(inference);\n }\n }\n\n return results;\n}\n\n/**\n * Apply inferred statuses to the database and optionally write back to YAML.\n */\nexport function applyInferences(\n db: Database.Database,\n inferences: TaskInferenceResult[],\n projectRoot: string,\n): void {\n const update = db.prepare(\n \"UPDATE tasks SET status = ?, completed_at = CASE WHEN ? = 'done' THEN ? ELSE completed_at END WHERE id = ?\",\n );\n\n const now = new Date().toISOString();\n\n const run = db.transaction(() => {\n for (const inf of inferences) {\n update.run(inf.inferredStatus, inf.inferredStatus, now, inf.taskId);\n }\n });\n\n run();\n\n // Write back to YAML\n for (const inf of inferences) {\n const task = db\n .prepare(\"SELECT phase_id FROM tasks WHERE id = ?\")\n .get(inf.taskId) as { phase_id: string } | undefined;\n if (task) {\n syncTaskToYaml(\n projectRoot,\n task.phase_id,\n inf.taskId,\n inf.inferredStatus,\n inf.inferredStatus === \"done\" ? now : null,\n );\n }\n }\n}\n\nfunction inferSingleTask(\n db: Database.Database,\n task: TaskRow,\n): TaskInferenceResult | null {\n // Check 1: Does the building block have indexed code?\n // Only infer in-progress if a majority of the block's code_paths have symbols.\n // This prevents marking all tasks for a block as in-progress when only one\n // sub-area (e.g. types) has been implemented but others (e.g. API routes) haven't.\n if (task.building_block) {\n const block = db\n .prepare(\"SELECT id, code_paths FROM building_blocks WHERE id = ?\")\n .get(task.building_block) as BlockRow | undefined;\n\n if (block) {\n const codePaths = safeParseJson<string[]>(block.code_paths, []);\n if (codePaths.length > 0) {\n let pathsWithCode = 0;\n for (const cp of codePaths) {\n const prefix = cp.replace(/\\*+\\/?$/, \"\");\n const match = db\n .prepare(\"SELECT 1 FROM symbols WHERE file_path LIKE ? ESCAPE '\\\\' LIMIT 1\")\n .get(`${escapeLike(prefix)}%`);\n if (match) pathsWithCode++;\n }\n\n // For single-path blocks, any code triggers in-progress.\n // For multi-path blocks, require majority coverage to avoid\n // marking unrelated tasks as started.\n const threshold = codePaths.length === 1 ? 1 : Math.ceil(codePaths.length / 2);\n if (pathsWithCode >= threshold && task.status === \"todo\") {\n return {\n taskId: task.id,\n previousStatus: task.status,\n inferredStatus: \"in-progress\",\n reason: `Building block \\`${task.building_block}\\` has indexed code in ${pathsWithCode}/${codePaths.length} paths`,\n };\n }\n }\n }\n }\n\n // Check 2: Do acceptance criteria reference symbols that exist?\n const criteria = safeParseJson<string[]>(task.acceptance_criteria, []);\n if (criteria.length > 0) {\n // Look for symbol-like references in criteria (file paths or symbol IDs)\n const symbolRefs = criteria.filter(\n (c) => c.includes(\"/\") || c.includes(\"::\"),\n );\n\n if (symbolRefs.length > 0) {\n const allFound = symbolRefs.every((ref) => {\n if (ref.includes(\"::\")) {\n // Symbol ID reference\n return !!db\n .prepare(\"SELECT 1 FROM symbols WHERE id = ?\")\n .get(ref);\n }\n // File path reference\n return !!db\n .prepare(\"SELECT 1 FROM symbols WHERE file_path = ? LIMIT 1\")\n .get(ref);\n });\n\n if (allFound) {\n return {\n taskId: task.id,\n previousStatus: task.status,\n inferredStatus: \"done\",\n reason: `All acceptance criteria symbol references found in codebase`,\n };\n }\n\n const someFound = symbolRefs.some((ref) => {\n if (ref.includes(\"::\")) {\n return !!db\n .prepare(\"SELECT 1 FROM symbols WHERE id = ?\")\n .get(ref);\n }\n return !!db\n .prepare(\"SELECT 1 FROM symbols WHERE file_path = ? LIMIT 1\")\n .get(ref);\n });\n\n if (someFound && task.status === \"todo\") {\n return {\n taskId: task.id,\n previousStatus: task.status,\n inferredStatus: \"in-progress\",\n reason: `Some acceptance criteria symbol references found in codebase`,\n };\n }\n }\n }\n\n // Check 3: Quality scenarios linked to this task — are they passing?\n const scenarioIds = safeParseJson<string[]>(task.quality_scenarios, []);\n if (scenarioIds.length > 0) {\n const placeholders = scenarioIds.map(() => \"?\").join(\", \");\n const scenarios = db\n .prepare(\n `SELECT id, status FROM quality_scenarios WHERE id IN (${placeholders})`,\n )\n .all(...scenarioIds) as { id: string; status: string }[];\n\n const allPassing = scenarios.length > 0 && scenarios.every((s) => s.status === \"passing\");\n if (allPassing && task.status !== \"done\") {\n return {\n taskId: task.id,\n previousStatus: task.status,\n inferredStatus: \"done\",\n reason: `All linked quality scenarios are passing`,\n };\n }\n }\n\n return null;\n}\n\nfunction escapeLike(value: string): string {\n return value.replace(/%/g, \"\\\\%\").replace(/_/g, \"\\\\_\");\n}\n\nfunction 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","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport type { ArcBridgeConfig } from \"../schemas/config.js\";\nimport { claudeSkillTemplate } from \"../templates/sync/claude-skill.js\";\nimport { githubActionTemplate } from \"../templates/sync/github-action.js\";\nimport { copilotHookTemplate } from \"../templates/sync/copilot-hook.js\";\n\n/**\n * Generate sync loop trigger files based on configured platforms.\n */\nexport function generateSyncFiles(\n targetDir: string,\n config: ArcBridgeConfig,\n): string[] {\n const generated: string[] = [];\n\n // Always generate the GitHub Action workflow\n const action = githubActionTemplate(config);\n const actionPath = join(targetDir, action.relativePath);\n mkdirSync(dirname(actionPath), { recursive: true });\n writeFileSync(actionPath, action.content, \"utf-8\");\n generated.push(action.relativePath);\n\n // Claude Code skill\n if (config.platforms.includes(\"claude\")) {\n const skill = claudeSkillTemplate(config);\n const skillPath = join(targetDir, skill.relativePath);\n mkdirSync(dirname(skillPath), { recursive: true });\n writeFileSync(skillPath, skill.content, \"utf-8\");\n generated.push(skill.relativePath);\n }\n\n // Copilot hook documentation\n if (config.platforms.includes(\"copilot\")) {\n const hook = copilotHookTemplate(config);\n const hookPath = join(targetDir, hook.relativePath);\n mkdirSync(dirname(hookPath), { recursive: true });\n writeFileSync(hookPath, hook.content, \"utf-8\");\n generated.push(hook.relativePath);\n }\n\n return generated;\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\n\nexport interface GeneratedFile {\n relativePath: string;\n content: string;\n}\n\n/**\n * Generate the Claude Code skill file for the ArcBridge sync loop.\n */\nexport function claudeSkillTemplate(config: ArcBridgeConfig): GeneratedFile {\n const triggerNote =\n config.sync.propose_updates_on === \"session-end\"\n ? \"This skill auto-runs at session end. You can also invoke it manually.\"\n : config.sync.propose_updates_on === \"phase-complete\"\n ? \"This skill runs when a phase is completed. You can also invoke it manually.\"\n : \"This skill runs only when invoked manually.\";\n\n const content = `---\ndescription: \"Run the ArcBridge architecture sync loop — detect drift, infer task status, and propose arc42 updates\"\n---\n\n# ArcBridge Sync\n\n${triggerNote}\n\n## Steps\n\n1. First, call \\`arcbridge_check_drift\\` to detect any architecture drift\n2. Call \\`arcbridge_get_current_tasks\\` to see the current phase progress\n3. Call \\`arcbridge_propose_arc42_update\\` with \\`changes_since: \"last-sync\"\\` to generate update proposals\n4. Present the proposals to the developer for review\n5. If the developer approves, update the relevant arc42 files and run \\`arcbridge_reindex\\`\n\n## When to Run\n\n- After completing a set of related changes\n- Before marking a phase as complete\n- When switching context to a different building block\n- At the end of a coding session (if configured)\n\n## Quick Check\n\nIf you just want a quick status without full proposals:\n1. Call \\`arcbridge_get_project_status\\` for an overview\n2. Call \\`arcbridge_get_open_questions\\` to see gaps\n`;\n\n return {\n relativePath: \".claude/skills/arcbridge-sync.md\",\n content,\n };\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\nimport type { GeneratedFile } from \"./claude-skill.js\";\n\n/**\n * Generate the GitHub Action workflow for automated ArcBridge sync.\n */\nexport function githubActionTemplate(_config: ArcBridgeConfig): GeneratedFile {\n const content = `name: ArcBridge Sync\n\non:\n # Run on push to main branch\n push:\n branches: [main]\n paths-ignore:\n - '**.md'\n - '.arcbridge/arc42/**'\n\n # Run weekly\n schedule:\n - cron: '0 9 * * 1' # Monday 9am UTC\n\n # Manual trigger\n workflow_dispatch:\n\npermissions:\n contents: write\n pull-requests: write\n\njobs:\n sync:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Full history for git diff analysis\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Setup pnpm\n uses: pnpm/action-setup@v4\n with:\n version: 9\n\n - name: Install dependencies\n run: pnpm install --frozen-lockfile\n\n - name: Check for ArcBridge\n id: check\n run: |\n if [ -f \".arcbridge/config.yaml\" ]; then\n echo \"initialized=true\" >> $GITHUB_OUTPUT\n else\n echo \"initialized=false\" >> $GITHUB_OUTPUT\n echo \"::warning::ArcBridge is not initialized. Run arcbridge_init_project first.\"\n fi\n\n - name: Run ArcBridge sync\n if: steps.check.outputs.initialized == 'true'\n id: sync\n run: npx arcbridge sync --json | tee arcbridge-sync-result.json\n\n - name: Check for drift errors\n if: steps.check.outputs.initialized == 'true'\n run: |\n npx arcbridge drift --json | tee arcbridge-drift-result.json\n ERRORS=$(node -e \"try { const d=JSON.parse(require('fs').readFileSync('arcbridge-drift-result.json','utf8')); console.log(d.drift.filter(e=>e.severity==='error').length); } catch { console.log(0); }\")\n if [ \"$ERRORS\" -gt 0 ]; then\n echo \"::error::ArcBridge detected $ERRORS drift error(s) that would block phase completion.\"\n exit 1\n fi\n\n - name: Create sync PR\n if: steps.check.outputs.initialized == 'true'\n uses: peter-evans/create-pull-request@v6\n with:\n commit-message: 'chore: arcbridge sync - update arc42 documentation'\n title: 'ArcBridge Sync: Arc42 Documentation Updates'\n body: |\n ## ArcBridge Sync\n\n Automated architecture sync detected changes that may require documentation updates.\n\n **Review the proposed changes to \\`.arcbridge/arc42/\\` files.**\n\n ---\n *Generated by [ArcBridge](https://github.com/bifteki-crew/arcbridge) sync loop*\n branch: arcbridge/sync\n delete-branch: true\n labels: arcbridge,documentation\n`;\n\n return {\n relativePath: \".github/workflows/arcbridge-sync.yml\",\n content,\n };\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\nimport type { GeneratedFile } from \"./claude-skill.js\";\n\n/**\n * Generate the Copilot session-end hook for automatic sync triggers.\n * Note: Copilot hooks are an evolving feature — this generates a\n * documentation file that describes the intended behavior.\n */\nexport function copilotHookTemplate(config: ArcBridgeConfig): GeneratedFile {\n const content = `# ArcBridge Sync Hook for Copilot\n\n## Configuration\n\nSync mode: \\`${config.sync.propose_updates_on}\\`\nDrift threshold: \\`${config.sync.drift_severity_threshold}\\`\n\n## Session End Behavior\n\nWhen a Copilot coding session ends${config.sync.propose_updates_on === \"session-end\" ? \" (auto-triggered)\" : \" (manual only)\"}:\n\n1. Run \\`arcbridge_check_drift\\` to detect architecture drift\n2. If drift is found above the \\`${config.sync.drift_severity_threshold}\\` threshold:\n - Run \\`arcbridge_propose_arc42_update\\` with \\`changes_since: \"last-sync\"\\`\n - Create a branch with proposed documentation changes\n - Open a PR for review\n\n## Pre-Tool-Use Enforcement\n\nThe following role restrictions are enforced:\n\n- **Implementer**: Cannot use \\`arcbridge_propose_arc42_update\\`\n- **Security Reviewer**: Read-only access, cannot modify code or documentation\n- **Quality Guardian**: Read-only access\n\n## Setup\n\nTo enable automatic sync:\n1. Ensure the ArcBridge MCP server is configured in your Copilot settings\n2. The GitHub Action workflow at \\`.github/workflows/arcbridge-sync.yml\\` handles automated sync\n3. For session-level hooks, configure Copilot to invoke the sync skill after coding sessions\n`;\n\n return {\n relativePath: \".github/arcbridge-sync-hook.md\",\n content,\n };\n}\n","import { execFileSync } from \"node:child_process\";\nimport type Database from \"better-sqlite3\";\n\nexport interface ChangedFile {\n status: \"added\" | \"modified\" | \"deleted\" | \"renamed\";\n path: string;\n oldPath?: string;\n}\n\nexport interface GitRef {\n sha: string;\n label: string;\n}\n\n/**\n * Resolve a human-readable \"since\" value to a git ref.\n *\n * - \"last-commit\" → HEAD~1\n * - \"last-session\" / \"last-sync\" → commit stored in arcbridge_meta, or HEAD~1 fallback\n * - \"last-phase\" → commit stored in arcbridge_meta under \"phase_sync_commit\", or HEAD~5 fallback\n * - anything else → treated as a literal git ref (branch, tag, SHA)\n */\nexport function resolveRef(\n projectRoot: string,\n since: string,\n db?: Database.Database,\n): GitRef {\n switch (since) {\n case \"last-commit\":\n return { sha: \"HEAD~1\", label: \"last commit\" };\n\n case \"last-session\":\n case \"last-sync\": {\n if (db) {\n const row = db\n .prepare(\"SELECT value FROM arcbridge_meta WHERE key = 'last_sync_commit'\")\n .get() as { value: string } | undefined;\n if (row) return { sha: row.value, label: `last sync (${row.value.slice(0, 7)})` };\n }\n return { sha: \"HEAD~1\", label: \"last commit (no sync point found)\" };\n }\n\n case \"last-phase\": {\n if (db) {\n const row = db\n .prepare(\"SELECT value FROM arcbridge_meta WHERE key = 'phase_sync_commit'\")\n .get() as { value: string } | undefined;\n if (row) return { sha: row.value, label: `last phase (${row.value.slice(0, 7)})` };\n }\n return { sha: \"HEAD~5\", label: \"last 5 commits (no phase sync point found)\" };\n }\n\n default:\n return { sha: since, label: since };\n }\n}\n\n/**\n * Get list of changed files between a ref and HEAD.\n */\nexport function getChangedFiles(\n projectRoot: string,\n ref: string,\n): ChangedFile[] {\n try {\n // Verify the ref is valid before diffing — catches HEAD~1 on single-commit repos\n execFileSync(\"git\", [\"rev-parse\", \"--verify\", ref], {\n cwd: projectRoot,\n encoding: \"utf-8\",\n timeout: 5000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n const output = execFileSync(\n \"git\",\n [\"diff\", \"--name-status\", \"--no-renames\", ref, \"HEAD\"],\n { cwd: projectRoot, encoding: \"utf-8\", timeout: 10000 },\n ).trim();\n\n if (!output) return [];\n\n return output.split(\"\\n\").map((line) => {\n const [statusCode, ...pathParts] = line.split(\"\\t\");\n const path = pathParts.join(\"\\t\");\n const status = parseStatusCode(statusCode ?? \"M\");\n return { status, path };\n });\n } catch {\n // Also try unstaged changes if ref comparison fails\n return getUncommittedChanges(projectRoot);\n }\n}\n\n/**\n * Get uncommitted (staged + unstaged) changes.\n */\nexport function getUncommittedChanges(projectRoot: string): ChangedFile[] {\n try {\n const output = execFileSync(\n \"git\",\n [\"status\", \"--porcelain\", \"-uno\"],\n { cwd: projectRoot, encoding: \"utf-8\", timeout: 5000 },\n ).trim();\n\n if (!output) return [];\n\n return output.split(\"\\n\").map((line) => {\n const statusCode = line.slice(0, 2).trim();\n const path = line.slice(3);\n const status = statusCode === \"D\" ? \"deleted\" : statusCode === \"A\" ? \"added\" : \"modified\";\n return { status, path };\n });\n } catch {\n return [];\n }\n}\n\n/**\n * Get current HEAD commit SHA.\n */\nexport function getHeadSha(projectRoot: string): string | null {\n try {\n return execFileSync(\n \"git\",\n [\"rev-parse\", \"HEAD\"],\n { cwd: projectRoot, encoding: \"utf-8\", timeout: 5000 },\n ).trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Store the current sync point in arcbridge_meta.\n */\nexport function setSyncCommit(\n db: Database.Database,\n key: \"last_sync_commit\" | \"phase_sync_commit\",\n sha: string,\n): void {\n db.prepare(\n \"INSERT OR REPLACE INTO arcbridge_meta (key, value) VALUES (?, ?)\",\n ).run(key, sha);\n}\n\nfunction parseStatusCode(code: string): ChangedFile[\"status\"] {\n switch (code.charAt(0)) {\n case \"A\":\n return \"added\";\n case \"D\":\n return \"deleted\";\n case \"R\":\n return \"renamed\";\n default:\n return \"modified\";\n }\n}\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type Database from \"better-sqlite3\";\nimport { syncScenarioToYaml } from \"../sync/yaml-writer.js\";\n\nexport type TestOutcome = \"passed\" | \"failed\" | \"missing\" | \"error\";\n\nexport interface ScenarioTestResult {\n scenarioId: string;\n scenarioName: string;\n testPaths: string[];\n passed: boolean;\n outcome: TestOutcome;\n output: string;\n durationMs: number;\n}\n\nexport interface VerifyResult {\n results: ScenarioTestResult[];\n updated: number;\n errors: string[];\n}\n\ninterface ScenarioRow {\n id: string;\n name: string;\n linked_tests: string;\n verification: string;\n status: string;\n}\n\n/**\n * Run linked tests for automatic quality scenarios and update their status in the DB.\n *\n * Only runs tests for scenarios with:\n * - verification = \"automatic\" or \"semi-automatic\"\n * - non-empty linked_tests array\n *\n * Optionally filter by specific scenario IDs.\n */\nexport function verifyScenarios(\n db: Database.Database,\n projectRoot: string,\n options: {\n testCommand: string;\n timeoutMs: number;\n scenarioIds?: string[];\n },\n): VerifyResult {\n const results: ScenarioTestResult[] = [];\n const errors: string[] = [];\n\n // Fetch testable scenarios\n let scenarios: ScenarioRow[];\n if (options.scenarioIds && options.scenarioIds.length > 0) {\n const placeholders = options.scenarioIds.map(() => \"?\").join(\", \");\n scenarios = db\n .prepare(\n `SELECT id, name, linked_tests, verification, status FROM quality_scenarios\n WHERE id IN (${placeholders}) AND linked_tests != '[]'`,\n )\n .all(...options.scenarioIds) as ScenarioRow[];\n } else {\n scenarios = db\n .prepare(\n `SELECT id, name, linked_tests, verification, status FROM quality_scenarios\n WHERE verification IN ('automatic', 'semi-automatic') AND linked_tests != '[]'`,\n )\n .all() as ScenarioRow[];\n }\n\n if (scenarios.length === 0) {\n return { results, updated: 0, errors };\n }\n\n // Parse the test command into executable + args\n const parts = options.testCommand.split(/\\s+/);\n const executable = parts[0]!;\n const baseArgs = parts.slice(1);\n\n let updated = 0;\n const updateStmt = db.prepare(\n \"UPDATE quality_scenarios SET status = ? WHERE id = ?\",\n );\n\n for (const scenario of scenarios) {\n let testPaths: string[];\n try {\n testPaths = JSON.parse(scenario.linked_tests) as string[];\n } catch {\n errors.push(`${scenario.id}: invalid linked_tests JSON`);\n continue;\n }\n\n if (testPaths.length === 0) continue;\n\n // Check if test files actually exist before trying to run them\n const missingPaths = testPaths.filter(\n (tp) => !existsSync(resolve(projectRoot, tp)),\n );\n if (missingPaths.length === testPaths.length) {\n // All test files are missing — don't run, report as missing\n results.push({\n scenarioId: scenario.id,\n scenarioName: scenario.name,\n testPaths,\n passed: false,\n outcome: \"missing\",\n output: `Test file(s) not found: ${missingPaths.join(\", \")}`,\n durationMs: 0,\n });\n continue;\n }\n\n // Only pass existing test paths to the runner\n const existingPaths = testPaths.filter(\n (tp) => existsSync(resolve(projectRoot, tp)),\n );\n\n const start = Date.now();\n let passed: boolean;\n let outcome: TestOutcome;\n let output: string;\n\n try {\n const result = execFileSync(executable, [...baseArgs, ...existingPaths], {\n cwd: projectRoot,\n encoding: \"utf-8\",\n timeout: options.timeoutMs,\n maxBuffer: 1024 * 1024, // 1MB\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n passed = true;\n outcome = \"passed\";\n output = result.slice(-2000); // Keep last 2000 chars\n } catch (err) {\n passed = false;\n if (err && typeof err === \"object\" && \"stdout\" in err) {\n const execErr = err as { stdout?: string; stderr?: string; status?: number };\n output = (execErr.stdout ?? execErr.stderr ?? \"\").slice(-2000);\n outcome = \"failed\";\n } else {\n output = err instanceof Error ? err.message : String(err);\n outcome = \"error\";\n }\n }\n\n // If some paths were missing, note it in output\n if (missingPaths.length > 0) {\n output = `Warning: ${missingPaths.length} test file(s) not found: ${missingPaths.join(\", \")}\\n${output}`;\n }\n\n const durationMs = Date.now() - start;\n const newStatus = passed ? \"passing\" : \"failing\";\n\n // Only update if status changed\n if (scenario.status !== newStatus) {\n updateStmt.run(newStatus, scenario.id);\n syncScenarioToYaml(projectRoot, scenario.id, newStatus);\n updated++;\n }\n\n results.push({\n scenarioId: scenario.id,\n scenarioName: scenario.name,\n testPaths,\n passed,\n outcome,\n output,\n durationMs,\n });\n }\n\n return { results, updated, errors };\n}\n","import { readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport matter from \"gray-matter\";\nimport { AgentRoleSchema, type AgentRole } from \"../schemas/agent-roles.js\";\n\nexport interface LoadRolesResult {\n roles: AgentRole[];\n errors: string[];\n}\n\n/**\n * Load agent role definitions from `.arcbridge/agents/*.md` files.\n * Each file is parsed as YAML frontmatter + markdown body (system_prompt).\n * Returns validated roles and any parse/validation errors.\n */\nexport function loadRoles(projectRoot: string): LoadRolesResult {\n const agentsDir = join(projectRoot, \".arcbridge\", \"agents\");\n const roles: AgentRole[] = [];\n const errors: string[] = [];\n\n let files: string[];\n try {\n files = readdirSync(agentsDir).filter((f) => f.endsWith(\".md\")).sort();\n } catch {\n return { roles: [], errors: [`Agent directory not found: ${agentsDir}`] };\n }\n\n for (const file of files) {\n const filePath = join(agentsDir, file);\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = matter(raw);\n\n // Combine frontmatter data with markdown body as system_prompt\n const input = {\n ...parsed.data,\n system_prompt: parsed.content.trim(),\n };\n\n const result = AgentRoleSchema.safeParse(input);\n if (result.success) {\n roles.push(result.data);\n } else {\n const issues = result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n errors.push(`${file}: validation failed — ${issues}`);\n }\n } catch (err) {\n errors.push(\n `${file}: parse error — ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n return { roles, errors };\n}\n\n/**\n * Load a single role by ID from `.arcbridge/agents/{roleId}.md`.\n * Returns null if the file doesn't exist or fails validation.\n * Rejects roleId values that don't match kebab-case to prevent path traversal.\n */\nexport function loadRole(\n projectRoot: string,\n roleId: string,\n): { role: AgentRole | null; error: string | null } {\n // Validate roleId to prevent path traversal\n if (!/^[a-z0-9-]+$/.test(roleId)) {\n return { role: null, error: `Invalid role ID: \"${roleId}\" (must be kebab-case)` };\n }\n\n const filePath = join(projectRoot, \".arcbridge\", \"agents\", `${roleId}.md`);\n\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = matter(raw);\n\n const input = {\n ...parsed.data,\n system_prompt: parsed.content.trim(),\n };\n\n const result = AgentRoleSchema.safeParse(input);\n if (result.success) {\n return { role: result.data, error: null };\n }\n const issues = result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n return { role: null, error: `Validation failed: ${issues}` };\n } catch (err) {\n // Distinguish file-not-found (expected) from other errors\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { role: null, error: null };\n }\n return { role: null, error: `Parse error: ${err instanceof Error ? err.message : String(err)}` };\n }\n}\n"],"mappings":"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","names":["z","z","z","z","z","configTemplate","configTemplate","configTemplate","configTemplate","mkdirSync","writeFileSync","join","stringify","join","writeFileSync","join","mkdirSync","stringify","mkdirSync","writeFileSync","join","stringify","phasePlanTemplate","phaseTasksTemplate","phasePlanTemplate","phaseTasksTemplate","phasePlanTemplate","phaseTasksTemplate","phasePlanTemplate","phaseTasksTemplate","join","mkdirSync","writeFileSync","stringify","mkdirSync","writeFileSync","join","matter","matter","writeFileSync","join","mkdirSync","join","existsSync","matter","join","existsSync","matter","relative","join","existsSync","readFileSync","execFileSync","join","ts","ts","ts","ts","addDep","walkMethodCalls","ts","relative","ts","relative","existsSync","readdirSync","readFileSync","join","relative","join","relative","readdirSync","readFileSync","existsSync","readdirSync","join","readFileSync","existsSync","relative","currentDir","readFileSync","join","dirname","resolve","fileURLToPath","findChild","findChild","join","readFileSync","join","existsSync","readFileSync","readdirSync","currentDir","readFileSync","join","join","readFileSync","existsSync","join","readFileSync","execFileSync","relative","join","existsSync","readFileSync","writeFileSync","mkdirSync","parse","stringify","join","existsSync","readFileSync","parse","writeFileSync","stringify","mkdirSync","safeParseJson","escapeLike","mkdirSync","writeFileSync","join","dirname","join","mkdirSync","dirname","writeFileSync","execFileSync","execFileSync","existsSync","resolve","existsSync","resolve","execFileSync","readdirSync","readFileSync","join","matter","join","readdirSync","readFileSync","matter"]}
1
+ {"version":3,"sources":["../src/schemas/config.ts","../src/schemas/quality-scenarios.ts","../src/schemas/building-blocks.ts","../src/schemas/phases.ts","../src/schemas/adrs.ts","../src/schemas/agent-roles.ts","../src/db/connection.ts","../src/db/schema.ts","../src/db/migrations.ts","../src/generators/config-generator.ts","../src/templates/config/nextjs-app-router.ts","../src/templates/config/react-vite.ts","../src/templates/config/api-service.ts","../src/templates/config/dotnet-webapi.ts","../src/generators/arc42-generator.ts","../src/templates/arc42/01-introduction.ts","../src/templates/arc42/03-context.ts","../src/templates/arc42/detect-layout.ts","../src/templates/arc42/05-building-blocks.ts","../src/templates/arc42/06-runtime-views.ts","../src/templates/arc42/07-deployment.ts","../src/templates/arc42/09-decisions.ts","../src/templates/arc42/10-quality-scenarios.ts","../src/templates/arc42/08-crosscutting.ts","../src/templates/arc42/11-risks-debt.ts","../src/generators/plan-generator.ts","../src/templates/phases/nextjs-app-router.ts","../src/templates/phases/react-vite.ts","../src/templates/phases/api-service.ts","../src/templates/phases/dotnet-webapi.ts","../src/generators/agent-generator.ts","../src/templates/agents/architect.ts","../src/templates/agents/implementer.ts","../src/templates/agents/security-reviewer.ts","../src/templates/agents/quality-guardian.ts","../src/templates/agents/phase-manager.ts","../src/templates/agents/onboarding.ts","../src/templates/agents/code-reviewer.ts","../src/templates/agents/ux-reviewer.ts","../src/generators/db-generator.ts","../src/indexer/index.ts","../src/indexer/program.ts","../src/indexer/symbol-extractor.ts","../src/indexer/react-utils.ts","../src/indexer/dependency-extractor.ts","../src/indexer/component-analyzer.ts","../src/indexer/route-analyzer.ts","../src/indexer/content-hash.ts","../src/indexer/db-writer.ts","../src/indexer/dotnet-indexer.ts","../src/indexer/csharp/indexer.ts","../src/indexer/csharp/parser.ts","../src/indexer/csharp/symbol-extractor.ts","../src/indexer/csharp/dependency-extractor.ts","../src/indexer/csharp/route-analyzer.ts","../src/indexer/package-deps.ts","../src/config/loader.ts","../src/drift/detector.ts","../src/sync/yaml-writer.ts","../src/sync/task-inference.ts","../src/generators/sync-generator.ts","../src/templates/sync/claude-skill.ts","../src/templates/sync/github-action.ts","../src/templates/sync/copilot-hook.ts","../src/git/helpers.ts","../src/testing/runner.ts","../src/roles/loader.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const ServiceSchema = z.object({\n name: z.string().min(1),\n path: z.string().default(\".\"),\n type: z.enum([\"nextjs\", \"react\", \"fastify\", \"express\", \"hono\", \"dotnet\"]),\n tsconfig: z.string().optional(),\n csproj: z.string().optional(),\n});\n\nexport const ArcBridgeConfigSchema = z.object({\n schema_version: z.literal(1).default(1),\n project_name: z.string().min(1),\n project_type: z\n .enum([\n \"nextjs-app-router\",\n \"react-vite\",\n \"api-service\",\n \"dotnet-webapi\",\n ])\n .default(\"nextjs-app-router\"),\n\n services: z.array(ServiceSchema).default([]),\n\n platforms: z\n .array(z.enum([\"claude\", \"copilot\", \"gemini\", \"codex\"]))\n .default([\"claude\"]),\n\n quality_priorities: z\n .array(\n z.enum([\n \"security\",\n \"performance\",\n \"accessibility\",\n \"reliability\",\n \"maintainability\",\n ]),\n )\n .default([\"security\", \"performance\", \"accessibility\"]),\n\n indexing: z\n .object({\n include: z.array(z.string()).default([\"src/**/*\", \"app/**/*\"]),\n exclude: z\n .array(z.string())\n .default([\"node_modules\", \"dist\", \".next\", \"coverage\"]),\n default_mode: z.enum([\"fast\", \"deep\"]).default(\"fast\"),\n csharp_indexer: z\n .enum([\"auto\", \"roslyn\", \"tree-sitter\"])\n .default(\"auto\")\n .describe(\n \"C# indexer backend: 'auto' prefers the arcbridge-dotnet-indexer global tool, \" +\n \"falls back to monorepo source if dotnet CLI is available, else tree-sitter. \" +\n \"'tree-sitter' works without .NET SDK. 'roslyn' requires global tool or monorepo source + .NET SDK.\",\n ),\n })\n .default({}),\n\n testing: z\n .object({\n test_command: z\n .string()\n .min(1)\n .default(\"npx vitest run\")\n .describe(\"Command to run tests (space-separated, no shell syntax). File paths are appended as arguments.\"),\n timeout_ms: z\n .number()\n .int()\n .min(1000)\n .default(60000)\n .describe(\"Timeout per test run in milliseconds\"),\n })\n .default({}),\n\n drift: z\n .object({\n ignore_paths: z\n .array(z.string())\n .default([])\n .describe(\n \"File paths or prefixes to ignore in undocumented_module drift checks. \" +\n \"Framework files (e.g. next.config.ts, root layout/page) are auto-ignored for known project types.\",\n ),\n })\n .default({}),\n\n sync: z\n .object({\n auto_detect_drift: z.boolean().default(true),\n drift_severity_threshold: z\n .enum([\"info\", \"warning\", \"error\"])\n .default(\"warning\"),\n propose_updates_on: z\n .enum([\"session-end\", \"phase-complete\", \"manual\"])\n .default(\"phase-complete\"),\n })\n .default({}),\n});\n\nexport type ArcBridgeConfig = z.infer<typeof ArcBridgeConfigSchema>;\nexport type Service = z.infer<typeof ServiceSchema>;\n","import { z } from \"zod\";\n\nexport const QualityCategorySchema = z.enum([\n \"security\",\n \"performance\",\n \"accessibility\",\n \"reliability\",\n \"maintainability\",\n]);\n\nexport const QualityPrioritySchema = z.enum([\"must\", \"should\", \"could\"]);\n\nexport const QualityScenarioStatusSchema = z.enum([\n \"passing\",\n \"failing\",\n \"untested\",\n \"partial\",\n]);\n\nexport const QualityScenarioSchema = z.object({\n id: z.string().regex(/^[A-Z0-9]+-\\d+$/, \"Must match pattern like SEC-01\"),\n name: z.string().min(1),\n category: QualityCategorySchema,\n priority: QualityPrioritySchema,\n scenario: z.string().min(1),\n expected: z.string().min(1),\n linked_code: z.array(z.string()).default([]),\n linked_tests: z.array(z.string()).default([]),\n linked_blocks: z.array(z.string()).default([]),\n verification: z.enum([\"automatic\", \"manual\", \"semi-automatic\"]),\n status: QualityScenarioStatusSchema.default(\"untested\"),\n});\n\nexport const QualityGoalSchema = z.object({\n id: QualityCategorySchema,\n priority: z.number().int().min(1),\n description: z.string().min(1),\n});\n\nexport const QualityScenariosFileSchema = z.object({\n schema_version: z.literal(1).default(1),\n last_updated: z.string(),\n quality_goals: z.array(QualityGoalSchema),\n scenarios: z.array(QualityScenarioSchema),\n});\n\nexport type QualityScenario = z.infer<typeof QualityScenarioSchema>;\nexport type QualityGoal = z.infer<typeof QualityGoalSchema>;\nexport type QualityScenariosFile = z.infer<typeof QualityScenariosFileSchema>;\n","import { z } from \"zod\";\n\nexport const BuildingBlockSchema = z.object({\n id: z.string().regex(/^[a-z0-9-]+$/, \"Must be kebab-case\"),\n name: z.string().min(1),\n level: z.number().int().min(1).max(3),\n parent_id: z.string().optional(),\n code_paths: z.array(z.string()).default([]),\n interfaces: z.array(z.string()).default([]),\n quality_scenarios: z.array(z.string()).default([]),\n adrs: z.array(z.string()).default([]),\n responsibility: z.string().min(1),\n service: z.string().default(\"main\"),\n});\n\nexport const BuildingBlocksFrontmatterSchema = z.object({\n section: z.literal(\"building-blocks\"),\n schema_version: z.literal(1).default(1),\n last_synced: z.string(),\n blocks: z.array(BuildingBlockSchema),\n});\n\nexport type BuildingBlock = z.infer<typeof BuildingBlockSchema>;\nexport type BuildingBlocksFrontmatter = z.infer<\n typeof BuildingBlocksFrontmatterSchema\n>;\n","import { z } from \"zod\";\n\nexport const PhaseStatusSchema = z.enum([\n \"planned\",\n \"in-progress\",\n \"complete\",\n \"blocked\",\n]);\n\nexport const TaskStatusSchema = z.enum([\n \"todo\",\n \"in-progress\",\n \"done\",\n \"blocked\",\n]);\n\nexport const PhaseSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n phase_number: z.number().int().min(0),\n status: PhaseStatusSchema.default(\"planned\"),\n description: z.string().min(1),\n gate_requirements: z.array(z.string()).default([]),\n started_at: z.string().optional(),\n completed_at: z.string().optional(),\n});\n\nexport const TaskSchema = z.object({\n id: z.string().min(1),\n title: z.string().min(1),\n status: TaskStatusSchema.default(\"todo\"),\n building_block: z.string().optional(),\n quality_scenarios: z.array(z.string()).default([]),\n acceptance_criteria: z.array(z.string()).default([]),\n completed_at: z.string().optional(),\n});\n\nexport const PhasesFileSchema = z.object({\n schema_version: z.literal(1).default(1),\n phases: z.array(PhaseSchema),\n});\n\nexport const TaskFileSchema = z.object({\n schema_version: z.literal(1).default(1),\n phase_id: z.string().min(1),\n tasks: z.array(TaskSchema),\n});\n\nexport type Phase = z.infer<typeof PhaseSchema>;\nexport type Task = z.infer<typeof TaskSchema>;\nexport type PhasesFile = z.infer<typeof PhasesFileSchema>;\nexport type TaskFile = z.infer<typeof TaskFileSchema>;\n","import { z } from \"zod\";\n\nexport const AdrStatusSchema = z.enum([\n \"proposed\",\n \"accepted\",\n \"deprecated\",\n \"superseded\",\n]);\n\nexport const AdrFrontmatterSchema = z.object({\n id: z.string().regex(/^\\d{3}-[a-z0-9-]+$/, \"Must match pattern like 001-some-decision\"),\n title: z.string().min(1),\n status: AdrStatusSchema.default(\"proposed\"),\n date: z.string(),\n affected_blocks: z.array(z.string()).default([]),\n affected_files: z.array(z.string()).default([]),\n quality_scenarios: z.array(z.string()).default([]),\n superseded_by: z.string().optional(),\n});\n\nexport type AdrFrontmatter = z.infer<typeof AdrFrontmatterSchema>;\n","import { z } from \"zod\";\n\nexport const AgentRoleSchema = z.object({\n role_id: z.string().regex(/^[a-z0-9-]+$/, \"Must be kebab-case\"),\n name: z.string().min(1),\n description: z.string().min(1),\n version: z.number().int().min(1).default(1),\n\n required_tools: z.array(z.string()).default([]),\n denied_tools: z.array(z.string()).default([]),\n read_only: z.boolean().default(false),\n\n quality_focus: z.array(z.string()).default([]),\n\n model_preferences: z\n .object({\n reasoning_depth: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n speed_priority: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n suggested_models: z\n .object({\n claude: z.string().optional(),\n openai: z.string().optional(),\n gemini: z.string().optional(),\n })\n .default({}),\n })\n .default({}),\n\n platform_overrides: z\n .object({\n claude: z.record(z.string(), z.unknown()).optional(),\n copilot: z.record(z.string(), z.unknown()).optional(),\n codex: z.record(z.string(), z.unknown()).optional(),\n })\n .default({}),\n\n // The markdown body (system prompt) is stored separately\n system_prompt: z.string().min(1),\n});\n\nexport type AgentRole = z.infer<typeof AgentRoleSchema>;\n","import Database from \"better-sqlite3\";\n\nexport function openDatabase(dbPath: string): Database.Database {\n const db = new Database(dbPath);\n db.pragma(\"journal_mode = WAL\");\n db.pragma(\"foreign_keys = ON\");\n return db;\n}\n\nexport function openMemoryDatabase(): Database.Database {\n return openDatabase(\":memory:\");\n}\n","import type Database from \"better-sqlite3\";\n\nexport const CURRENT_SCHEMA_VERSION = 1;\n\nconst SCHEMA_SQL = `\n-- Metadata\nCREATE TABLE IF NOT EXISTS arcbridge_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\n-- Code Intelligence (populated in Phase 1-2)\nCREATE TABLE IF NOT EXISTS symbols (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n qualified_name TEXT NOT NULL,\n kind TEXT NOT NULL CHECK(kind IN ('function','class','type','constant','component','hook','context','interface','enum','variable')),\n file_path TEXT NOT NULL,\n start_line INTEGER NOT NULL,\n end_line INTEGER NOT NULL,\n start_col INTEGER NOT NULL DEFAULT 0,\n end_col INTEGER NOT NULL DEFAULT 0,\n signature TEXT,\n return_type TEXT,\n doc_comment TEXT,\n is_exported INTEGER NOT NULL DEFAULT 0,\n is_async INTEGER NOT NULL DEFAULT 0,\n service TEXT NOT NULL DEFAULT 'main',\n language TEXT NOT NULL DEFAULT 'typescript',\n content_hash TEXT,\n indexed_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_symbols_file ON symbols(file_path);\nCREATE INDEX IF NOT EXISTS idx_symbols_kind ON symbols(kind);\nCREATE INDEX IF NOT EXISTS idx_symbols_name ON symbols(name);\nCREATE INDEX IF NOT EXISTS idx_symbols_service ON symbols(service);\n\nCREATE TABLE IF NOT EXISTS dependencies (\n source_symbol TEXT NOT NULL REFERENCES symbols(id),\n target_symbol TEXT NOT NULL REFERENCES symbols(id),\n kind TEXT NOT NULL CHECK(kind IN ('imports','calls','extends','implements','uses_type','renders','provides_context','consumes_context')),\n UNIQUE(source_symbol, target_symbol, kind)\n);\n\nCREATE INDEX IF NOT EXISTS idx_deps_source ON dependencies(source_symbol);\nCREATE INDEX IF NOT EXISTS idx_deps_target ON dependencies(target_symbol);\nCREATE INDEX IF NOT EXISTS idx_deps_kind ON dependencies(kind);\n\nCREATE TABLE IF NOT EXISTS components (\n symbol_id TEXT PRIMARY KEY REFERENCES symbols(id),\n is_client INTEGER NOT NULL DEFAULT 0,\n is_server_action INTEGER NOT NULL DEFAULT 0,\n has_state INTEGER NOT NULL DEFAULT 0,\n context_providers TEXT NOT NULL DEFAULT '[]',\n context_consumers TEXT NOT NULL DEFAULT '[]',\n props_type TEXT\n);\n\nCREATE TABLE IF NOT EXISTS routes (\n id TEXT PRIMARY KEY,\n route_path TEXT NOT NULL,\n kind TEXT NOT NULL CHECK(kind IN ('page','layout','loading','error','not-found','api-route','middleware')),\n http_methods TEXT NOT NULL DEFAULT '[]',\n has_auth INTEGER NOT NULL DEFAULT 0,\n parent_layout TEXT,\n service TEXT NOT NULL DEFAULT 'main'\n);\n\n-- Architecture\nCREATE TABLE IF NOT EXISTS building_blocks (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n level INTEGER NOT NULL DEFAULT 1,\n parent_id TEXT REFERENCES building_blocks(id),\n description TEXT,\n responsibility TEXT NOT NULL,\n code_paths TEXT NOT NULL DEFAULT '[]',\n interfaces TEXT NOT NULL DEFAULT '[]',\n service TEXT NOT NULL DEFAULT 'main',\n last_synced TEXT\n);\n\nCREATE TABLE IF NOT EXISTS quality_scenarios (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n category TEXT NOT NULL CHECK(category IN ('security','performance','accessibility','reliability','maintainability')),\n scenario TEXT NOT NULL,\n expected TEXT NOT NULL,\n priority TEXT NOT NULL DEFAULT 'should' CHECK(priority IN ('must','should','could')),\n linked_code TEXT NOT NULL DEFAULT '[]',\n linked_tests TEXT NOT NULL DEFAULT '[]',\n linked_blocks TEXT NOT NULL DEFAULT '[]',\n verification TEXT NOT NULL DEFAULT 'manual' CHECK(verification IN ('automatic','manual','semi-automatic')),\n status TEXT NOT NULL DEFAULT 'untested' CHECK(status IN ('passing','failing','untested','partial')),\n last_checked TEXT\n);\n\nCREATE TABLE IF NOT EXISTS adrs (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'proposed' CHECK(status IN ('proposed','accepted','deprecated','superseded')),\n date TEXT NOT NULL,\n context TEXT,\n decision TEXT,\n consequences TEXT,\n affected_blocks TEXT NOT NULL DEFAULT '[]',\n affected_files TEXT NOT NULL DEFAULT '[]',\n quality_scenarios TEXT NOT NULL DEFAULT '[]',\n superseded_by TEXT\n);\n\nCREATE TABLE IF NOT EXISTS contracts (\n id TEXT PRIMARY KEY,\n kind TEXT NOT NULL CHECK(kind IN ('openapi','graphql','grpc','shared-types','event-schema')),\n source_path TEXT NOT NULL,\n producer TEXT NOT NULL,\n consumers TEXT NOT NULL DEFAULT '[]',\n version TEXT,\n building_block TEXT REFERENCES building_blocks(id),\n content_hash TEXT,\n last_verified TEXT\n);\n\n-- Package Dependencies (npm, NuGet)\nCREATE TABLE IF NOT EXISTS package_dependencies (\n name TEXT NOT NULL,\n version TEXT,\n source TEXT NOT NULL CHECK(source IN ('npm','npm-dev','nuget')),\n service TEXT NOT NULL DEFAULT 'main',\n PRIMARY KEY (name, source, service)\n);\n\n-- Planning\nCREATE TABLE IF NOT EXISTS phases (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n phase_number INTEGER NOT NULL,\n status TEXT NOT NULL DEFAULT 'planned' CHECK(status IN ('planned','in-progress','complete','blocked')),\n description TEXT NOT NULL,\n gate_status TEXT NOT NULL DEFAULT '{}',\n started_at TEXT,\n completed_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n phase_id TEXT NOT NULL REFERENCES phases(id),\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'todo' CHECK(status IN ('todo','in-progress','done','blocked')),\n building_block TEXT REFERENCES building_blocks(id),\n quality_scenarios TEXT NOT NULL DEFAULT '[]',\n acceptance_criteria TEXT NOT NULL DEFAULT '[]',\n created_at TEXT NOT NULL,\n completed_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS drift_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n detected_at TEXT NOT NULL,\n kind TEXT NOT NULL CHECK(kind IN ('undocumented_module','missing_module','dependency_violation','unlinked_test','stale_adr','new_dependency')),\n severity TEXT NOT NULL DEFAULT 'info' CHECK(severity IN ('info','warning','error')),\n description TEXT NOT NULL,\n affected_block TEXT,\n affected_file TEXT,\n resolution TEXT CHECK(resolution IN ('accepted','fixed','deferred') OR resolution IS NULL),\n resolved_at TEXT\n);\n`;\n\nexport function initializeSchema(db: Database.Database): void {\n db.exec(SCHEMA_SQL);\n\n const existing = db\n .prepare(\"SELECT value FROM arcbridge_meta WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined;\n\n if (!existing) {\n const now = new Date().toISOString();\n const insert = db.prepare(\n \"INSERT INTO arcbridge_meta (key, value) VALUES (?, ?)\",\n );\n insert.run(\"schema_version\", String(CURRENT_SCHEMA_VERSION));\n insert.run(\"created_at\", now);\n }\n}\n","import type Database from \"better-sqlite3\";\nimport { CURRENT_SCHEMA_VERSION } from \"./schema.js\";\n\ninterface Migration {\n version: number;\n up: (db: Database.Database) => void;\n}\n\n// Add future migrations here. Version 1 is the initial schema (handled by initializeSchema).\nconst migrations: Migration[] = [];\n\nexport function migrate(db: Database.Database): void {\n const row = db\n .prepare(\"SELECT value FROM arcbridge_meta WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined;\n\n const currentVersion = row ? Number(row.value) : 0;\n\n if (currentVersion >= CURRENT_SCHEMA_VERSION) {\n return;\n }\n\n const pending = migrations\n .filter((m) => m.version > currentVersion)\n .sort((a, b) => a.version - b.version);\n\n for (const migration of pending) {\n db.transaction(() => {\n migration.up(db);\n db.prepare(\n \"UPDATE arcbridge_meta SET value = ? WHERE key = 'schema_version'\",\n ).run(String(migration.version));\n })();\n }\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { stringify } from \"yaml\";\nimport { configTemplate as nextjsConfig } from \"../templates/config/nextjs-app-router.js\";\nimport { configTemplate as reactViteConfig } from \"../templates/config/react-vite.js\";\nimport { configTemplate as apiServiceConfig } from \"../templates/config/api-service.js\";\nimport { configTemplate as dotnetWebapiConfig } from \"../templates/config/dotnet-webapi.js\";\nimport type { InitProjectInput } from \"../templates/types.js\";\nimport type { ArcBridgeConfig } from \"../schemas/config.js\";\n\nconst configTemplates: Record<string, (input: InitProjectInput) => ArcBridgeConfig> = {\n \"nextjs-app-router\": nextjsConfig,\n \"react-vite\": reactViteConfig,\n \"api-service\": apiServiceConfig,\n \"dotnet-webapi\": dotnetWebapiConfig,\n};\n\nexport function generateConfig(\n targetDir: string,\n input: InitProjectInput,\n): ArcBridgeConfig {\n const templateFn = configTemplates[input.template] ?? nextjsConfig;\n const config = templateFn(input);\n const arcBridgeDir = join(targetDir, \".arcbridge\");\n mkdirSync(arcBridgeDir, { recursive: true });\n\n const yamlContent = stringify(config);\n writeFileSync(join(arcBridgeDir, \"config.yaml\"), yamlContent, \"utf-8\");\n\n return config;\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function configTemplate(input: InitProjectInput): ArcBridgeConfig {\n return {\n schema_version: 1,\n project_name: input.name,\n project_type: input.template,\n services: [\n {\n name: \"main\",\n path: \".\",\n type: \"nextjs\",\n tsconfig: \"tsconfig.json\",\n },\n ],\n platforms: input.platforms as ArcBridgeConfig[\"platforms\"],\n quality_priorities:\n input.quality_priorities as ArcBridgeConfig[\"quality_priorities\"],\n indexing: {\n include: [\"src/**/*\", \"app/**/*\"],\n exclude: [\"node_modules\", \"dist\", \".next\", \"coverage\"],\n default_mode: \"fast\",\n csharp_indexer: \"auto\",\n },\n testing: {\n test_command: \"npx vitest run\",\n timeout_ms: 60000,\n },\n drift: {\n ignore_paths: [],\n },\n sync: {\n auto_detect_drift: true,\n drift_severity_threshold: \"warning\",\n propose_updates_on: \"phase-complete\",\n },\n };\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function configTemplate(input: InitProjectInput): ArcBridgeConfig {\n return {\n schema_version: 1,\n project_name: input.name,\n project_type: input.template,\n services: [\n {\n name: \"main\",\n path: \".\",\n type: \"react\",\n tsconfig: \"tsconfig.json\",\n },\n ],\n platforms: input.platforms as ArcBridgeConfig[\"platforms\"],\n quality_priorities:\n input.quality_priorities as ArcBridgeConfig[\"quality_priorities\"],\n indexing: {\n include: [\"src/**/*\"],\n exclude: [\"node_modules\", \"dist\", \"coverage\"],\n default_mode: \"fast\",\n csharp_indexer: \"auto\",\n },\n testing: {\n test_command: \"npx vitest run\",\n timeout_ms: 60000,\n },\n drift: {\n ignore_paths: [],\n },\n sync: {\n auto_detect_drift: true,\n drift_severity_threshold: \"warning\",\n propose_updates_on: \"phase-complete\",\n },\n };\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function configTemplate(input: InitProjectInput): ArcBridgeConfig {\n return {\n schema_version: 1,\n project_name: input.name,\n project_type: input.template,\n services: [\n {\n name: \"api\",\n path: \".\",\n type: \"express\",\n tsconfig: \"tsconfig.json\",\n },\n ],\n platforms: input.platforms as ArcBridgeConfig[\"platforms\"],\n quality_priorities:\n input.quality_priorities as ArcBridgeConfig[\"quality_priorities\"],\n indexing: {\n include: [\"src/**/*\"],\n exclude: [\"node_modules\", \"dist\", \"coverage\"],\n default_mode: \"fast\",\n csharp_indexer: \"auto\",\n },\n testing: {\n test_command: \"npx vitest run\",\n timeout_ms: 60000,\n },\n drift: {\n ignore_paths: [],\n },\n sync: {\n auto_detect_drift: true,\n drift_severity_threshold: \"warning\",\n propose_updates_on: \"phase-complete\",\n },\n };\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function configTemplate(input: InitProjectInput): ArcBridgeConfig {\n // Use discovered services from .sln, or default single service\n const services = input.dotnetServices && input.dotnetServices.length > 0\n ? input.dotnetServices.map((s) => ({\n name: s.name.toLowerCase().replace(/[^a-z0-9-]/g, \"-\"),\n path: s.path,\n type: \"dotnet\" as const,\n }))\n : [{ name: \"api\", path: \".\", type: \"dotnet\" as const }];\n\n return {\n schema_version: 1,\n project_name: input.name,\n project_type: input.template,\n services,\n platforms: input.platforms as ArcBridgeConfig[\"platforms\"],\n quality_priorities:\n input.quality_priorities as ArcBridgeConfig[\"quality_priorities\"],\n indexing: {\n include: [\"**/*.cs\"],\n exclude: [\"bin\", \"obj\", \"TestResults\", \"node_modules\"],\n default_mode: \"fast\",\n csharp_indexer: \"auto\",\n },\n testing: {\n test_command: \"dotnet test\",\n timeout_ms: 120000,\n },\n drift: {\n ignore_paths: [],\n },\n sync: {\n auto_detect_drift: true,\n drift_severity_threshold: \"warning\",\n propose_updates_on: \"phase-complete\",\n },\n };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport matter from \"gray-matter\";\nimport { stringify } from \"yaml\";\nimport type { InitProjectInput } from \"../templates/types.js\";\nimport { introductionTemplate } from \"../templates/arc42/01-introduction.js\";\nimport { contextTemplate } from \"../templates/arc42/03-context.js\";\nimport { buildingBlocksTemplate } from \"../templates/arc42/05-building-blocks.js\";\nimport { runtimeViewsTemplate } from \"../templates/arc42/06-runtime-views.js\";\nimport { deploymentTemplate } from \"../templates/arc42/07-deployment.js\";\nimport { firstAdrTemplate } from \"../templates/arc42/09-decisions.js\";\nimport { qualityScenariosTemplate } from \"../templates/arc42/10-quality-scenarios.js\";\nimport { crosscuttingTemplate } from \"../templates/arc42/08-crosscutting.js\";\nimport { risksDebtTemplate } from \"../templates/arc42/11-risks-debt.js\";\n\nfunction writeMarkdownWithFrontmatter(\n filePath: string,\n frontmatter: Record<string, unknown>,\n body: string,\n): void {\n const content = matter.stringify(body, frontmatter);\n writeFileSync(filePath, content, \"utf-8\");\n}\n\nexport function generateArc42(\n targetDir: string,\n input: InitProjectInput,\n): void {\n const arc42Dir = join(targetDir, \".arcbridge\", \"arc42\");\n const decisionsDir = join(arc42Dir, \"09-decisions\");\n\n mkdirSync(arc42Dir, { recursive: true });\n mkdirSync(decisionsDir, { recursive: true });\n\n // Standard markdown sections\n const sections = [\n { file: \"01-introduction.md\", template: introductionTemplate },\n { file: \"03-context.md\", template: contextTemplate },\n { file: \"05-building-blocks.md\", template: buildingBlocksTemplate },\n { file: \"06-runtime-views.md\", template: runtimeViewsTemplate },\n { file: \"07-deployment.md\", template: deploymentTemplate },\n { file: \"08-crosscutting.md\", template: crosscuttingTemplate },\n { file: \"11-risks-debt.md\", template: risksDebtTemplate },\n ];\n\n const inputWithRoot = { ...input, projectRoot: targetDir };\n for (const { file, template } of sections) {\n const { frontmatter, body } = template(inputWithRoot);\n writeMarkdownWithFrontmatter(join(arc42Dir, file), frontmatter, body);\n }\n\n // ADR (first decision)\n const adr = firstAdrTemplate(inputWithRoot);\n writeMarkdownWithFrontmatter(\n join(decisionsDir, adr.filename),\n adr.frontmatter,\n adr.body,\n );\n\n // Quality scenarios (YAML, not markdown)\n const qualityScenarios = qualityScenariosTemplate(input);\n writeFileSync(\n join(arc42Dir, \"10-quality-scenarios.yaml\"),\n stringify(qualityScenarios),\n \"utf-8\",\n );\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\n\nexport function introductionTemplate(input: InitProjectInput): TemplateOutput {\n return {\n frontmatter: {\n section: \"introduction\",\n schema_version: 1,\n },\n body: `# Introduction and Goals\n\n## Requirements Overview\n\n${input.name} is a ${input.template === \"nextjs-app-router\" ? \"Next.js application using the App Router\" : input.template === \"dotnet-webapi\" ? \"ASP.NET Core Web API\" : \"web application\"}.\n\n### Key Features\n\n${input.features.length > 0 ? input.features.map((f) => `- ${f}`).join(\"\\n\") : \"- *Define your key features here*\"}\n\n## Quality Goals\n\n| Priority | Goal | Description |\n|----------|------|-------------|\n${input.quality_priorities.map((q, i) => `| ${i + 1} | ${q} | *Describe what ${q} means for this project* |`).join(\"\\n\")}\n\n## Stakeholders\n\n| Role | Description | Expectations |\n|------|-------------|--------------|\n| Developer | Primary developer | Efficient development workflow with AI assistance |\n| End User | Application user | *Define user expectations* |\n`,\n };\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\n\nfunction techStack(template: string): string {\n switch (template) {\n case \"dotnet-webapi\":\n return `- **Framework:** ASP.NET Core\n- **Language:** C#\n- **Runtime:** .NET`;\n case \"react-vite\":\n return `- **Framework:** React (Vite)\n- **Language:** TypeScript\n- **Runtime:** Node.js`;\n case \"api-service\":\n return `- **Framework:** Express / Fastify\n- **Language:** TypeScript\n- **Runtime:** Node.js`;\n default:\n return `- **Framework:** Next.js (App Router)\n- **Language:** TypeScript\n- **Runtime:** Node.js`;\n }\n}\n\nexport function contextTemplate(input: InitProjectInput): TemplateOutput {\n return {\n frontmatter: {\n section: \"context\",\n schema_version: 1,\n },\n body: `# System Scope and Context\n\n## Business Context\n\n${input.name} interacts with the following external systems and actors:\n\n| Neighbor | Description | Interface |\n|----------|-------------|-----------|\n| End User | Application user | Browser / HTTP |\n| *External API* | *Describe external dependencies* | *REST / GraphQL* |\n\n## Technical Context\n\n\\`\\`\\`\n[Browser] --HTTP/HTTPS--> [${input.name}] --API--> [External Services]\n\\`\\`\\`\n\n### Technology Stack\n\n${techStack(input.template)}\n`,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface ProjectLayout {\n /** Prefix for general source files: \"src/\" or \"\" */\n srcPrefix: string;\n /** Prefix for Next.js app router files. Only meaningful for nextjs-app-router template. */\n appPrefix: string;\n /** Entrypoint files for the project (template-dependent) */\n entrypoints: string[];\n}\n\n/**\n * Detect the project's directory layout from actual filesystem structure and template.\n * Used by arc42 templates to generate consistent code_paths.\n *\n * srcPrefix detection:\n * 1. src/ exists → \"src/\"\n * 2. No src/ but projectRoot provided → \"\" (root-level layout)\n * 3. No projectRoot → \"src/\" (default convention for new projects)\n *\n * appPrefix is only relevant for nextjs-app-router. For other templates\n * it defaults to srcPrefix + \"app\" but should not be used for building blocks.\n */\nexport function detectProjectLayout(\n projectRoot?: string,\n template?: string,\n): ProjectLayout {\n const srcPrefix = detectSrcPrefix(projectRoot);\n const appPrefix = detectAppPrefix(projectRoot, srcPrefix);\n\n // Template-specific entrypoints\n const entrypoints = getEntrypoints(template ?? \"nextjs-app-router\", srcPrefix, appPrefix);\n\n return { srcPrefix, appPrefix, entrypoints };\n}\n\nfunction detectSrcPrefix(projectRoot?: string): string {\n // No projectRoot (template preview) — default to src/ convention\n if (!projectRoot) return \"src/\";\n\n // Actual project — check what exists\n if (existsSync(join(projectRoot, \"src\"))) return \"src/\";\n\n // No src/ directory — use root-level paths\n return \"\";\n}\n\nfunction detectAppPrefix(projectRoot: string | undefined, srcPrefix: string): string {\n if (!projectRoot) return `${srcPrefix}app`;\n\n // Check actual directories for Next.js app router\n if (existsSync(join(projectRoot, \"src\", \"app\"))) return \"src/app\";\n if (existsSync(join(projectRoot, \"app\"))) return \"app\";\n\n // Default follows srcPrefix\n return `${srcPrefix}app`;\n}\n\nfunction getEntrypoints(template: string, srcPrefix: string, appPrefix: string): string[] {\n switch (template) {\n case \"nextjs-app-router\":\n return [`${appPrefix}/layout.tsx`, `${appPrefix}/page.tsx`];\n case \"react-vite\":\n return [`${srcPrefix}main.tsx`, `${srcPrefix}App.tsx`];\n case \"api-service\":\n return [`${srcPrefix}index.ts`, `${srcPrefix}app.ts`, `${srcPrefix}server.ts`];\n default:\n return [`${srcPrefix}index.ts`];\n }\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\nimport { detectProjectLayout } from \"./detect-layout.js\";\n\nexport function buildingBlocksTemplate(\n input: InitProjectInput,\n): TemplateOutput {\n const now = new Date().toISOString();\n\n const layout = detectProjectLayout(input.projectRoot, input.template);\n\n type BlockDef = {\n id: string;\n name: string;\n level: number;\n code_paths: string[];\n interfaces: string[];\n quality_scenarios: string[];\n adrs: string[];\n responsibility: string;\n service: string;\n };\n\n const defaultBlocks: BlockDef[] =\n input.template === \"dotnet-webapi\"\n ? buildDotnetBlocks(input)\n : buildJsBlocks(input, layout);\n\n function buildJsBlocks(inp: InitProjectInput, lt: typeof layout): BlockDef[] {\n const src = lt.srcPrefix;\n const entries = lt.entrypoints;\n // App shell block — template-specific entrypoints\n const appShellName = inp.template === \"nextjs-app-router\"\n ? \"App Shell\"\n : inp.template === \"react-vite\"\n ? \"App Root\"\n : \"Server Entry\";\n\n const appShellResponsibility = inp.template === \"nextjs-app-router\"\n ? \"Root layout, navigation, and top-level page structure\"\n : inp.template === \"react-vite\"\n ? \"Application root, router setup, and top-level providers\"\n : \"Server entry point, middleware setup, and route registration\";\n\n const blocks: BlockDef[] = [\n {\n id: \"app-shell\",\n name: appShellName,\n level: 1,\n code_paths: entries,\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility: appShellResponsibility,\n service: \"main\",\n },\n {\n id: \"ui-components\",\n name: \"UI Components\",\n level: 1,\n code_paths: [`${src}components/`],\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility: \"Shared, reusable UI components\",\n service: \"main\",\n },\n {\n id: \"lib-utilities\",\n name: \"Library & Utilities\",\n level: 1,\n code_paths: [`${src}lib/`],\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility: \"Shared utilities, helpers, and business logic\",\n service: \"main\",\n },\n ];\n\n if (inp.features.includes(\"auth\")) {\n blocks.push({\n id: \"auth-module\",\n name: \"Authentication\",\n level: 1,\n code_paths: [`${src}lib/auth/`],\n interfaces: [],\n quality_scenarios: [\"SEC-01\"],\n adrs: [],\n responsibility:\n \"User authentication, session management, and authorization\",\n service: \"main\",\n });\n }\n\n if (inp.features.includes(\"api\")) {\n const apiPaths = inp.template === \"nextjs-app-router\"\n ? [`${lt.appPrefix}/api/`]\n : [`${src}routes/`, `${src}api/`];\n blocks.push({\n id: \"api-layer\",\n name: \"API Layer\",\n level: 1,\n code_paths: apiPaths,\n interfaces: [],\n quality_scenarios: [\"SEC-03\"],\n adrs: [],\n responsibility: \"API route handlers and server-side logic\",\n service: \"main\",\n });\n }\n\n if (inp.features.includes(\"database\")) {\n blocks.push({\n id: \"data-access\",\n name: \"Data Access\",\n level: 1,\n code_paths: [`${src}lib/db/`],\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility: \"Database connections, queries, and data models\",\n service: \"main\",\n });\n }\n\n // API client block — only for frontend templates that consume a backend API\n if (inp.template === \"nextjs-app-router\" || inp.template === \"react-vite\") {\n blocks.push({\n id: \"api-client\",\n name: \"API Client\",\n level: 1,\n code_paths: [`${src}lib/api/`, `${src}services/`],\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility:\n \"API client layer for communicating with backend services. Defines request/response types, handles errors, and manages the contract with consumed APIs.\",\n service: \"main\",\n });\n }\n\n return blocks;\n }\n\n function buildDotnetBlocks(_inp: InitProjectInput): BlockDef[] {\n const blocks: BlockDef[] = [\n {\n id: \"api-host\",\n name: \"API Host\",\n level: 1,\n code_paths: [\"Program.cs\", \"Extensions/\"],\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility:\n \"Application startup, DI configuration, middleware pipeline\",\n service: \"main\",\n },\n {\n id: \"controllers\",\n name: \"Controllers / Endpoints\",\n level: 1,\n code_paths: [\"Controllers/\", \"Endpoints/\"],\n interfaces: [],\n quality_scenarios: [\"SEC-03\"],\n adrs: [],\n responsibility:\n \"API endpoint definitions — controllers or minimal API endpoint groups\",\n service: \"main\",\n },\n {\n id: \"domain\",\n name: \"Domain\",\n level: 1,\n code_paths: [\"Domain/\", \"Models/\"],\n interfaces: [],\n quality_scenarios: [],\n adrs: [],\n responsibility: \"Domain entities, value objects, and business rules\",\n service: \"main\",\n },\n {\n id: \"services\",\n name: \"Application Services\",\n level: 1,\n code_paths: [\"Services/\"],\n interfaces: [\"controllers\"],\n quality_scenarios: [],\n adrs: [],\n responsibility:\n \"Business logic, use cases, and orchestration between domain and infrastructure\",\n service: \"main\",\n },\n {\n id: \"middleware\",\n name: \"Middleware\",\n level: 1,\n code_paths: [\"Middleware/\"],\n interfaces: [],\n quality_scenarios: [\"REL-01\"],\n adrs: [],\n responsibility:\n \"Cross-cutting concerns: error handling, logging, correlation IDs, rate limiting\",\n service: \"main\",\n },\n ];\n\n // Auth and data access are core to virtually every .NET API,\n // so always include them (phase tasks reference these block IDs).\n blocks.push({\n id: \"auth-module\",\n name: \"Authentication & Authorization\",\n level: 1,\n code_paths: [\"Auth/\"],\n interfaces: [],\n quality_scenarios: [\"SEC-01\", \"SEC-02\"],\n adrs: [],\n responsibility:\n \"JWT/cookie auth, authorization policies, claims transformation\",\n service: \"main\",\n });\n\n blocks.push({\n id: \"data-access\",\n name: \"Data Access\",\n level: 1,\n code_paths: [\"Data/\", \"Repositories/\", \"Migrations/\"],\n interfaces: [\"domain\"],\n quality_scenarios: [],\n adrs: [],\n responsibility:\n \"EF Core DbContext, repositories, migrations, and query logic\",\n service: \"main\",\n });\n\n return blocks;\n }\n\n return {\n frontmatter: {\n section: \"building-blocks\",\n schema_version: 1,\n last_synced: now,\n blocks: defaultBlocks,\n },\n body: `# Building Block View\n\n## Level 1: Top-Level Decomposition\n\n${defaultBlocks.map((b) => `### ${b.name}\\n\\n**Responsibility:** ${b.responsibility}\\n\\n**Code:** \\`${b.code_paths.join(\"`, `\")}\\``).join(\"\\n\\n\")}\n`,\n };\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\n\nfunction runtimeDiagram(template: string): string {\n switch (template) {\n case \"dotnet-webapi\":\n return `\\`\\`\\`\nClient → Kestrel → Middleware Pipeline → Controller / Endpoint\n → Services (DI)\n → Database / External APIs\n\\`\\`\\``;\n case \"api-service\":\n return `\\`\\`\\`\nClient → HTTP Server → Middleware → Route Handler\n → Services\n → Database / External APIs\n\\`\\`\\``;\n default:\n return `\\`\\`\\`\nBrowser → Next.js Server → Layout (server) → Page (server/client)\n → API Routes (if needed)\n → External Services (if needed)\n\\`\\`\\``;\n }\n}\n\nexport function runtimeViewsTemplate(input: InitProjectInput): TemplateOutput {\n return {\n frontmatter: {\n section: \"runtime-views\",\n schema_version: 1,\n },\n body: `# Runtime View\n\n## Key Runtime Scenarios\n\n### Request Flow\n\n${runtimeDiagram(input.template)}\n\n*Document your key runtime scenarios here. Each scenario should show the interaction between building blocks for an important use case of ${input.name}.*\n`,\n };\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\n\nexport function deploymentTemplate(input: InitProjectInput): TemplateOutput {\n return {\n frontmatter: {\n section: \"deployment\",\n schema_version: 1,\n },\n body: `# Deployment View\n\n## Infrastructure\n\n*Describe the deployment infrastructure for ${input.name}.*\n\n### Deployment Options\n\n${input.template === \"dotnet-webapi\" ? `| Platform | Description | Notes |\n|----------|-------------|-------|\n| Azure App Service | Managed PaaS for .NET | Recommended for ASP.NET Core |\n| Docker / Kubernetes | Container-based | For self-hosted or multi-cloud |\n| AWS ECS / Fargate | Container orchestration | For AWS environments |` : `| Platform | Description | Notes |\n|----------|-------------|-------|\n| Vercel | Recommended for Next.js | Zero-config deployment |\n| Docker | Container-based | For self-hosted environments |`}\n\n## Environment Configuration\n\n| Variable | Description | Required |\n|----------|-------------|----------|\n| \\`${input.template === \"dotnet-webapi\" ? \"ASPNETCORE_ENVIRONMENT\" : \"NODE_ENV\"}\\` | Runtime environment | Yes |\n| *Add your environment variables here* | | |\n`,\n };\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\nimport { detectProjectLayout } from \"./detect-layout.js\";\n\ninterface AdrResult extends TemplateOutput {\n filename: string;\n}\n\nexport function firstAdrTemplate(input: InitProjectInput): AdrResult {\n const now = new Date().toISOString().split(\"T\")[0]!;\n\n if (input.template === \"dotnet-webapi\") {\n return dotnetAdr(input, now);\n }\n\n return nextjsAdr(input, now);\n}\n\nfunction nextjsAdr(input: InitProjectInput, date: string): AdrResult {\n const { appPrefix } = detectProjectLayout(input.projectRoot, input.template);\n\n return {\n filename: \"001-nextjs-app-router.md\",\n frontmatter: {\n id: \"001-nextjs-app-router\",\n title: \"Use Next.js App Router\",\n status: \"accepted\",\n date,\n affected_blocks: [\"app-shell\"],\n affected_files: [`${appPrefix}/`],\n quality_scenarios: [],\n },\n body: `# ADR-001: Use Next.js App Router\n\n## Context\n\n${input.name} needs a modern React framework that supports server-side rendering, static generation, and API routes.\n\n## Decision\n\nUse Next.js with the App Router (introduced in Next.js 13+) as the application framework.\n\n## Consequences\n\n- **Positive:** Server Components by default reduce client-side JavaScript\n- **Positive:** File-based routing with layouts, loading states, and error boundaries\n- **Positive:** Built-in API routes for backend logic\n- **Negative:** App Router has a learning curve compared to Pages Router\n- **Negative:** Some libraries may not yet fully support Server Components\n`,\n };\n}\n\nfunction dotnetAdr(input: InitProjectInput, date: string): AdrResult {\n return {\n filename: \"001-aspnet-core-webapi.md\",\n frontmatter: {\n id: \"001-aspnet-core-webapi\",\n title: \"Use ASP.NET Core Web API\",\n status: \"accepted\",\n date,\n affected_blocks: [\"api-host\", \"controllers\"],\n affected_files: [\"Program.cs\", \"Controllers/\"],\n quality_scenarios: [],\n },\n body: `# ADR-001: Use ASP.NET Core Web API\n\n## Context\n\n${input.name} needs a performant, cross-platform web API framework with strong dependency injection, middleware pipeline, and ecosystem support.\n\n## Decision\n\nUse ASP.NET Core with the minimal hosting model (top-level Program.cs) as the API framework. Support both controller-based and minimal API endpoints.\n\n## Consequences\n\n- **Positive:** High performance with Kestrel, mature ecosystem\n- **Positive:** Built-in DI container, configuration, and middleware pipeline\n- **Positive:** Strong typing and compile-time safety with C#\n- **Positive:** OpenAPI/Swagger generation out of the box\n- **Negative:** Steeper learning curve for the DI and middleware patterns\n- **Negative:** Larger memory footprint compared to minimal frameworks\n`,\n };\n}\n","import type { InitProjectInput } from \"../types.js\";\nimport type { QualityScenariosFile } from \"../../schemas/quality-scenarios.js\";\n\ntype ScenarioList = QualityScenariosFile[\"scenarios\"];\n\n// ─── Shared scenarios (all templates) ───────────────────────────────────────\n\nconst SHARED_SCENARIOS: Record<string, ScenarioList> = {\n security: [\n {\n id: \"SEC-01\",\n name: \"Auth on all API routes\",\n category: \"security\",\n priority: \"must\",\n scenario:\n \"An unauthenticated request hits any API route that requires auth\",\n expected: \"Returns 401 Unauthorized without leaking data\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n {\n id: \"SEC-03\",\n name: \"Input validation on mutations\",\n category: \"security\",\n priority: \"must\",\n scenario: \"A malformed or malicious payload is sent to any mutation endpoint\",\n expected: \"Input is validated and rejected with a descriptive error\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n performance: [\n {\n id: \"PERF-02\",\n name: \"API responses under 200ms\",\n category: \"performance\",\n priority: \"should\",\n scenario: \"Any API endpoint is called under normal load\",\n expected: \"p95 response time is under 200ms\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n reliability: [\n {\n id: \"REL-01\",\n name: \"Graceful error handling\",\n category: \"reliability\",\n priority: \"should\",\n scenario: \"An external service returns an error or times out\",\n expected: \"User sees a meaningful error message, app remains functional\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n maintainability: [\n {\n id: \"MAINT-01\",\n name: \"No circular dependencies\",\n category: \"maintainability\",\n priority: \"must\",\n scenario: \"Dependency graph is analyzed\",\n expected: \"No circular import chains exist\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n {\n id: \"MAINT-02\",\n name: \"Test coverage on business logic\",\n category: \"maintainability\",\n priority: \"should\",\n scenario: \"Test coverage report is generated\",\n expected: \"Business logic modules have >80% line coverage\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n};\n\n// ─── Frontend-specific scenarios (nextjs, react-vite) ───────────────────────\n\nconst FRONTEND_SCENARIOS: Record<string, ScenarioList> = {\n security: [\n {\n id: \"SEC-02\",\n name: \"No secrets in client bundles\",\n category: \"security\",\n priority: \"must\",\n scenario: \"Client-side JavaScript bundle is analyzed\",\n expected:\n \"No API keys, tokens, or secrets are found in client-side code\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n performance: [\n {\n id: \"PERF-01\",\n name: \"Initial page load under 3s\",\n category: \"performance\",\n priority: \"should\",\n scenario: \"User loads the landing page on a 3G connection\",\n expected: \"Largest Contentful Paint (LCP) is under 3 seconds\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"semi-automatic\",\n status: \"untested\",\n },\n ],\n accessibility: [\n {\n id: \"A11Y-01\",\n name: \"WCAG 2.1 AA compliance\",\n category: \"accessibility\",\n priority: \"should\",\n scenario: \"All pages are audited with axe-core\",\n expected: \"No critical or serious accessibility violations\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"semi-automatic\",\n status: \"untested\",\n },\n {\n id: \"A11Y-02\",\n name: \"Keyboard navigation\",\n category: \"accessibility\",\n priority: \"should\",\n scenario: \"User navigates the entire application using only keyboard\",\n expected: \"All interactive elements are reachable and operable via keyboard\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"manual\",\n status: \"untested\",\n },\n ],\n};\n\n// ─── .NET-specific scenarios ────────────────────────────────────────────────\n\nconst DOTNET_SCENARIOS: Record<string, ScenarioList> = {\n security: [\n {\n id: \"SEC-02\",\n name: \"No secrets in configuration or source\",\n category: \"security\",\n priority: \"must\",\n scenario: \"Source code and appsettings files are scanned\",\n expected:\n \"No connection strings, API keys, or secrets are hardcoded; all sensitive values come from environment variables or a secrets manager\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n {\n id: \"SEC-04\",\n name: \"CORS policy restricts origins\",\n category: \"security\",\n priority: \"should\",\n scenario: \"A cross-origin request is made from an untrusted domain\",\n expected: \"Request is rejected by CORS middleware; only explicitly allowed origins succeed\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n performance: [\n {\n id: \"PERF-01\",\n name: \"Startup time under 5s\",\n category: \"performance\",\n priority: \"should\",\n scenario: \"Application starts from cold (e.g., container restart or deployment)\",\n expected: \"Health check endpoint responds within 5 seconds of process start\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"semi-automatic\",\n status: \"untested\",\n },\n {\n id: \"PERF-03\",\n name: \"No excessive memory allocation\",\n category: \"performance\",\n priority: \"should\",\n scenario: \"API handles sustained load of 100 concurrent requests over 60 seconds\",\n expected: \"No Gen2 GC collections triggered; working set stays under configured limit\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"semi-automatic\",\n status: \"untested\",\n },\n {\n id: \"PERF-04\",\n name: \"Async all the way\",\n category: \"performance\",\n priority: \"must\",\n scenario: \"I/O-bound operations (database, HTTP calls, file access) are reviewed\",\n expected: \"All I/O operations use async/await; no sync-over-async or blocking calls on thread pool threads\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"semi-automatic\",\n status: \"untested\",\n },\n ],\n reliability: [\n {\n id: \"REL-02\",\n name: \"Health check covers dependencies\",\n category: \"reliability\",\n priority: \"should\",\n scenario: \"Orchestrator calls the /health endpoint\",\n expected: \"Returns degraded or unhealthy if database or critical external service is unreachable\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n {\n id: \"REL-03\",\n name: \"Structured logging with correlation\",\n category: \"reliability\",\n priority: \"should\",\n scenario: \"A request flows through multiple layers (controller → service → repository)\",\n expected: \"All log entries share a correlation ID; logs are structured JSON with severity, timestamp, and context\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"semi-automatic\",\n status: \"untested\",\n },\n ],\n maintainability: [\n {\n id: \"MAINT-03\",\n name: \"DI registration matches interfaces\",\n category: \"maintainability\",\n priority: \"should\",\n scenario: \"Dependency injection container is validated at startup\",\n expected: \"All constructor-injected interfaces have a registered implementation; no runtime resolution failures\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n};\n\n// ─── API-only scenarios (api-service) ───────────────────────────────────────\n\nconst API_SCENARIOS: Record<string, ScenarioList> = {\n security: [\n {\n id: \"SEC-02\",\n name: \"No secrets in environment or source\",\n category: \"security\",\n priority: \"must\",\n scenario: \"Source code and config files are scanned\",\n expected:\n \"No API keys, tokens, or secrets are hardcoded; all come from environment variables\",\n linked_code: [],\n linked_tests: [],\n linked_blocks: [],\n verification: \"automatic\",\n status: \"untested\",\n },\n ],\n};\n\n// ─── Template → scenario set mapping ────────────────────────────────────────\n\nconst TEMPLATE_SCENARIOS: Record<string, Record<string, ScenarioList>> = {\n \"nextjs-app-router\": FRONTEND_SCENARIOS,\n \"react-vite\": FRONTEND_SCENARIOS,\n \"api-service\": API_SCENARIOS,\n \"dotnet-webapi\": DOTNET_SCENARIOS,\n};\n\n/**\n * Merge shared + template-specific scenarios for a given category.\n * Template-specific scenarios with the same ID override shared ones.\n */\nfunction mergeScenarios(\n template: string,\n category: string,\n): ScenarioList {\n const shared = SHARED_SCENARIOS[category] ?? [];\n const specific = (TEMPLATE_SCENARIOS[template] ?? {})[category] ?? [];\n\n // Template-specific scenarios override shared ones with the same ID\n const specificIds = new Set(specific.map((s) => s.id));\n const merged = shared.filter((s) => !specificIds.has(s.id));\n return [...merged, ...specific];\n}\n\nexport function qualityScenariosTemplate(\n input: InitProjectInput,\n): QualityScenariosFile {\n const now = new Date().toISOString();\n\n const goals = input.quality_priorities.map((q, i) => ({\n id: q as QualityScenariosFile[\"quality_goals\"][number][\"id\"],\n priority: i + 1,\n description: `${q.charAt(0).toUpperCase() + q.slice(1)} is a priority for ${input.name}`,\n }));\n\n const scenarios = input.quality_priorities.flatMap(\n (q) => mergeScenarios(input.template, q),\n );\n\n return {\n schema_version: 1,\n last_updated: now,\n quality_goals: goals,\n scenarios,\n };\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\n\nfunction dotnetConcepts(): string {\n return `## Error Handling\n\n*Document the error handling strategy once established.*\n\n- Exception handling middleware approach (ProblemDetails / RFC 7807)\n- Correlation IDs for request tracing\n- Error response format and status code conventions\n\n## Logging\n\n*Document the logging strategy once established.*\n\n- Logging framework (Serilog, NLog, built-in)\n- Structured logging format and required fields\n- Log levels and when to use each\n\n## Authentication & Authorization\n\n*Document the auth approach once established.*\n\n- Auth mechanism (JWT bearer, cookie, OAuth)\n- Authorization policy definitions\n- Claims and role structure\n\n## Validation\n\n*Document the validation approach once established.*\n\n- Validation framework (FluentValidation, data annotations)\n- Where validation runs (middleware, controller, service layer)\n- Error response format for validation failures\n\n## Database Access\n\n*Document the data access patterns once established.*\n\n- ORM/query approach (EF Core, Dapper)\n- Repository vs. direct DbContext usage\n- Transaction management\n- Migration strategy\n\n## Dependency Injection\n\n*Document DI conventions once established.*\n\n- Service registration organization (by feature, by layer)\n- Lifetime choices (Scoped, Singleton, Transient) and when to use each\n- Options pattern for configuration\n\n## API Contract\n\n*Document how this service exposes its API to consumers.*\n\n- OpenAPI/Swagger generation approach\n- How consumers (frontend, other services) discover and use the API contract\n- Versioning strategy for breaking changes\n- Response envelope format and error conventions\n\n## Events & Messaging\n\n*Document if this service publishes or subscribes to events/messages.*\n\n- Messaging infrastructure (RabbitMQ, Azure Service Bus, Kafka, MediatR, etc.)\n- Event naming conventions and schema format\n- Publisher/subscriber topology — which services produce and consume which events\n- Error handling and retry strategy for failed message processing\n- Schema versioning approach for event contracts\n`;\n}\n\nfunction frontendConcepts(): string {\n return `## State Management\n\n*Document the state management approach once established.*\n\n- Global state solution (Context, Zustand, Redux, etc.)\n- Server state management (React Query, SWR, etc.)\n- When to use local vs. global state\n\n## Component Patterns\n\n*Document component conventions once established.*\n\n- Component file structure and naming\n- Props interface conventions\n- Server vs. client component decision criteria\n- Composition patterns (compound components, render props, etc.)\n\n## Styling\n\n*Document the styling approach once established.*\n\n- Styling solution (Tailwind, CSS Modules, styled-components, etc.)\n- Design tokens and theme structure\n- Responsive breakpoints\n\n## Error Handling\n\n*Document error handling patterns once established.*\n\n- Error boundary placement and behavior\n- API error handling and user-facing messages\n- Loading and empty state patterns\n\n## Authentication\n\n*Document the auth approach once established.*\n\n- Auth flow (session, JWT, OAuth)\n- Protected route implementation\n- Auth state management\n\n## Data Fetching\n\n*Document data fetching patterns once established.*\n\n- Server-side vs. client-side fetching strategy\n- Caching and revalidation approach\n- API client structure and conventions\n\n## API Contract\n\n*Document how this frontend communicates with backend services.*\n\n- Backend API base URL and environment configuration\n- How request/response types are defined (OpenAPI-generated, manual, shared package)\n- Error response handling (how backend errors map to UI states)\n- Authentication token flow (how auth tokens are passed to the API)\n- If using OpenAPI: how to regenerate types when the backend contract changes\n`;\n}\n\nfunction apiConcepts(): string {\n return `## Error Handling\n\n*Document the error handling strategy once established.*\n\n- Error response format and status codes\n- Error middleware/handler approach\n- Correlation IDs for request tracing\n\n## Logging\n\n*Document the logging strategy once established.*\n\n- Logging library and format\n- Log levels and conventions\n- Request/response logging\n\n## Authentication & Authorization\n\n*Document the auth approach once established.*\n\n- Auth mechanism (JWT, session, API key)\n- Middleware structure for auth\n- Role/permission model\n\n## Validation\n\n*Document the validation approach once established.*\n\n- Validation library (Zod, Joi, etc.)\n- Where validation runs (middleware, handler)\n- Error format for validation failures\n\n## Database Access\n\n*Document the data access patterns once established.*\n\n- ORM/query builder choice\n- Connection pooling and transaction patterns\n- Migration strategy\n\n## API Contract\n\n*Document how this service exposes its API to consumers.*\n\n- OpenAPI/Swagger generation approach\n- How consumers (frontend, other services) discover and use the API contract\n- Versioning strategy for breaking changes\n- Response envelope format and error conventions\n\n## Events & Messaging\n\n*Document if this service publishes or subscribes to events/messages.*\n\n- Messaging infrastructure (RabbitMQ, Kafka, Redis Pub/Sub, etc.)\n- Event naming conventions and schema format\n- Publisher/subscriber topology\n- Error handling and retry strategy for failed message processing\n- Schema versioning approach for event contracts\n`;\n}\n\nexport function crosscuttingTemplate(input: InitProjectInput): TemplateOutput {\n const isDotnet = input.template === \"dotnet-webapi\";\n const isFrontend = input.template === \"nextjs-app-router\" || input.template === \"react-vite\";\n\n let concepts: string;\n if (isDotnet) {\n concepts = dotnetConcepts();\n } else if (isFrontend) {\n concepts = frontendConcepts();\n } else {\n concepts = apiConcepts();\n }\n\n return {\n frontmatter: {\n section: \"crosscutting-concepts\",\n schema_version: 1,\n },\n body: `# Crosscutting Concepts\n\nThis section documents patterns and conventions that apply across multiple building blocks. Update this as patterns are established — it serves as the single source of truth for \"how we do things\" in ${input.name}.\n\n> **For agents:** Consult this document before implementing any crosscutting concern. If you establish a new pattern, document it here so other code follows the same approach.\n\n${concepts}`,\n };\n}\n","import type { InitProjectInput, TemplateOutput } from \"../types.js\";\n\nexport function risksDebtTemplate(input: InitProjectInput): TemplateOutput {\n return {\n frontmatter: {\n section: \"risks-debt\",\n schema_version: 1,\n },\n body: `# Risks and Technical Debt\n\n## Known Risks\n\n| Risk | Impact | Probability | Mitigation |\n|------|--------|-------------|------------|\n| *Identify project risks* | *High/Medium/Low* | *High/Medium/Low* | *Describe mitigation* |\n\n## Technical Debt\n\nTrack technical debt items for ${input.name} here. Each item should include:\n- **Description**: What the debt is\n- **Impact**: How it affects the system\n- **Effort**: Estimated effort to resolve\n- **Priority**: When it should be addressed\n`,\n };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { stringify } from \"yaml\";\nimport type { PhasesFile, TaskFile } from \"../schemas/phases.js\";\nimport type { InitProjectInput } from \"../templates/types.js\";\nimport {\n phasePlanTemplate as nextjsPlan,\n phaseTasksTemplate as nextjsTasks,\n} from \"../templates/phases/nextjs-app-router.js\";\nimport {\n phasePlanTemplate as reactVitePlan,\n phaseTasksTemplate as reactViteTasks,\n} from \"../templates/phases/react-vite.js\";\nimport {\n phasePlanTemplate as apiServicePlan,\n phaseTasksTemplate as apiServiceTasks,\n} from \"../templates/phases/api-service.js\";\nimport {\n phasePlanTemplate as dotnetWebapiPlan,\n phaseTasksTemplate as dotnetWebapiTasks,\n} from \"../templates/phases/dotnet-webapi.js\";\n\ntype PlanFn = (input: InitProjectInput) => PhasesFile;\ntype TasksFn = (input: InitProjectInput, phaseId: string) => TaskFile | null;\n\nconst planTemplates: Record<string, { plan: PlanFn; tasks: TasksFn }> = {\n \"nextjs-app-router\": { plan: nextjsPlan, tasks: nextjsTasks },\n \"react-vite\": { plan: reactVitePlan, tasks: reactViteTasks },\n \"api-service\": { plan: apiServicePlan, tasks: apiServiceTasks },\n \"dotnet-webapi\": { plan: dotnetWebapiPlan, tasks: dotnetWebapiTasks },\n};\n\nexport function generatePlan(\n targetDir: string,\n input: InitProjectInput,\n): void {\n const planDir = join(targetDir, \".arcbridge\", \"plan\");\n const tasksDir = join(planDir, \"tasks\");\n\n mkdirSync(planDir, { recursive: true });\n mkdirSync(tasksDir, { recursive: true });\n\n // Write phases.yaml\n const tmpl = planTemplates[input.template] ?? planTemplates[\"nextjs-app-router\"]!;\n const phasePlan = tmpl.plan(input);\n writeFileSync(join(planDir, \"phases.yaml\"), stringify(phasePlan), \"utf-8\");\n\n // Write task files for each phase\n for (const phase of phasePlan.phases) {\n const taskFile = tmpl.tasks(input, phase.id);\n if (taskFile) {\n writeFileSync(\n join(tasksDir, `${phase.id}.yaml`),\n stringify(taskFile),\n \"utf-8\",\n );\n }\n }\n\n // Write empty sync log\n writeFileSync(\n join(planDir, \"sync-log.md\"),\n `# Sync Log\\n\\nArchitecture sync events are recorded here.\\n`,\n \"utf-8\",\n );\n}\n","import type { PhasesFile, TaskFile } from \"../../schemas/phases.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function phasePlanTemplate(_input: InitProjectInput): PhasesFile {\n const phases = [\n {\n id: \"phase-0-setup\",\n name: \"Project Setup\",\n phase_number: 0,\n status: \"in-progress\" as const,\n description:\n \"Initialize project structure, install dependencies, configure tooling\",\n gate_requirements: [\n \"Project builds successfully\",\n \"Dev server starts without errors\",\n \"Linting and formatting configured\",\n ],\n },\n {\n id: \"phase-1-foundation\",\n name: \"Foundation\",\n phase_number: 1,\n status: \"planned\" as const,\n description: \"Core layout, navigation, and shared components\",\n gate_requirements: [\n \"Root layout renders correctly\",\n \"Navigation works between pages\",\n \"Quality scenarios SEC-01, MAINT-01 verified\",\n ],\n },\n {\n id: \"phase-2-features\",\n name: \"Core Features\",\n phase_number: 2,\n status: \"planned\" as const,\n description: \"Implement the primary features of the application\",\n gate_requirements: [\n \"Core user flows work end-to-end\",\n \"Test coverage meets thresholds\",\n \"Performance budgets met\",\n ],\n },\n {\n id: \"phase-3-polish\",\n name: \"Polish & Launch\",\n phase_number: 3,\n status: \"planned\" as const,\n description:\n \"Error handling, accessibility, performance optimization, deployment\",\n gate_requirements: [\n \"All quality scenarios passing\",\n \"Accessibility audit passes\",\n \"Production deployment successful\",\n ],\n },\n ];\n\n return { schema_version: 1, phases };\n}\n\nexport function phaseTasksTemplate(\n _input: InitProjectInput,\n phaseId: string,\n): TaskFile | null {\n const tasksByPhase: Record<string, TaskFile> = {\n \"phase-0-setup\": {\n schema_version: 1,\n phase_id: \"phase-0-setup\",\n tasks: [\n {\n id: \"task-0.1-init-nextjs\",\n title: \"Initialize Next.js project\",\n status: \"todo\",\n building_block: \"app-shell\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"Next.js app created with App Router\",\n \"TypeScript configured in strict mode\",\n \"Project runs with `npm run dev`\",\n ],\n },\n {\n id: \"task-0.2-tooling\",\n title: \"Configure development tooling\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-01\"],\n acceptance_criteria: [\n \"ESLint configured with recommended rules\",\n \"Prettier configured for consistent formatting\",\n \"Git hooks set up for pre-commit checks\",\n ],\n },\n {\n id: \"task-0.3-testing\",\n title: \"Set up testing infrastructure\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-02\"],\n acceptance_criteria: [\n \"Vitest configured for unit tests\",\n \"Playwright configured for E2E tests\",\n \"Test scripts added to package.json\",\n ],\n },\n ],\n },\n \"phase-1-foundation\": {\n schema_version: 1,\n phase_id: \"phase-1-foundation\",\n tasks: [\n {\n id: \"task-1.1-layout\",\n title: \"Create root layout and navigation\",\n status: \"todo\",\n building_block: \"app-shell\",\n quality_scenarios: [\"A11Y-01\", \"A11Y-02\"],\n acceptance_criteria: [\n \"Root layout with metadata configured\",\n \"Navigation component with keyboard accessibility\",\n \"Responsive design for mobile and desktop\",\n ],\n },\n {\n id: \"task-1.2-shared-components\",\n title: \"Build shared UI components\",\n status: \"todo\",\n building_block: \"ui-components\",\n quality_scenarios: [\"A11Y-01\"],\n acceptance_criteria: [\n \"Button, Input, and Card components created\",\n \"Components follow accessibility guidelines\",\n \"Component tests written\",\n ],\n },\n {\n id: \"task-1.3-api-client\",\n title: \"Set up API client layer\",\n status: \"todo\",\n building_block: \"api-client\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"API client module created with typed request/response interfaces\",\n \"Base URL and auth token handling configured\",\n \"Error handling standardized (network errors, API errors, validation errors)\",\n \"Request/response types match the backend API contract\",\n \"Document the API contract approach in an ADR (e.g., OpenAPI-generated types vs. manual types)\",\n ],\n },\n {\n id: \"task-1.4-document-decisions\",\n title: \"Document architectural decisions as ADRs\",\n status: \"todo\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"ADR for each significant technology or pattern choice made in this phase\",\n \"ADRs include context, decision, and consequences\",\n \"ADRs linked to affected building blocks and code paths\",\n ],\n },\n ],\n },\n };\n\n return tasksByPhase[phaseId] ?? null;\n}\n","import type { PhasesFile, TaskFile } from \"../../schemas/phases.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function phasePlanTemplate(_input: InitProjectInput): PhasesFile {\n const phases = [\n {\n id: \"phase-0-setup\",\n name: \"Project Setup\",\n phase_number: 0,\n status: \"in-progress\" as const,\n description:\n \"Initialize Vite + React project, configure TypeScript, install dependencies\",\n gate_requirements: [\n \"Project builds successfully with Vite\",\n \"Dev server starts without errors\",\n \"Linting and formatting configured\",\n ],\n },\n {\n id: \"phase-1-foundation\",\n name: \"Foundation\",\n phase_number: 1,\n status: \"planned\" as const,\n description: \"Core layout, routing, state management, and shared components\",\n gate_requirements: [\n \"Router configured with all primary routes\",\n \"Shared component library established\",\n \"Quality scenarios SEC-01, MAINT-01 verified\",\n ],\n },\n {\n id: \"phase-2-features\",\n name: \"Core Features\",\n phase_number: 2,\n status: \"planned\" as const,\n description: \"Implement the primary features of the application\",\n gate_requirements: [\n \"Core user flows work end-to-end\",\n \"Test coverage meets thresholds\",\n \"Performance budgets met\",\n ],\n },\n {\n id: \"phase-3-polish\",\n name: \"Polish & Launch\",\n phase_number: 3,\n status: \"planned\" as const,\n description:\n \"Error handling, accessibility, performance optimization, deployment\",\n gate_requirements: [\n \"All quality scenarios passing\",\n \"Accessibility audit passes\",\n \"Production build optimized and deployed\",\n ],\n },\n ];\n\n return { schema_version: 1, phases };\n}\n\nexport function phaseTasksTemplate(\n _input: InitProjectInput,\n phaseId: string,\n): TaskFile | null {\n const tasksByPhase: Record<string, TaskFile> = {\n \"phase-0-setup\": {\n schema_version: 1,\n phase_id: \"phase-0-setup\",\n tasks: [\n {\n id: \"task-0.1-init-vite\",\n title: \"Initialize Vite + React project\",\n status: \"todo\",\n building_block: \"app-shell\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"Vite + React app created with TypeScript\",\n \"TypeScript configured in strict mode\",\n \"Project runs with `npm run dev`\",\n ],\n },\n {\n id: \"task-0.2-tooling\",\n title: \"Configure development tooling\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-01\"],\n acceptance_criteria: [\n \"ESLint configured with recommended rules\",\n \"Prettier configured for consistent formatting\",\n \"Git hooks set up for pre-commit checks\",\n ],\n },\n {\n id: \"task-0.3-routing\",\n title: \"Set up client-side routing\",\n status: \"todo\",\n building_block: \"app-shell\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"React Router (or TanStack Router) installed and configured\",\n \"Route structure matches planned building blocks\",\n \"404 handling configured\",\n ],\n },\n {\n id: \"task-0.4-testing\",\n title: \"Set up testing infrastructure\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-02\"],\n acceptance_criteria: [\n \"Vitest configured for unit tests\",\n \"Testing Library configured for component tests\",\n \"Test scripts added to package.json\",\n ],\n },\n ],\n },\n \"phase-1-foundation\": {\n schema_version: 1,\n phase_id: \"phase-1-foundation\",\n tasks: [\n {\n id: \"task-1.1-layout\",\n title: \"Create app layout and navigation\",\n status: \"todo\",\n building_block: \"app-shell\",\n quality_scenarios: [\"A11Y-01\", \"A11Y-02\"],\n acceptance_criteria: [\n \"App shell with header, content, and footer\",\n \"Navigation component with keyboard accessibility\",\n \"Responsive design for mobile and desktop\",\n ],\n },\n {\n id: \"task-1.2-shared-components\",\n title: \"Build shared UI components\",\n status: \"todo\",\n building_block: \"ui-components\",\n quality_scenarios: [\"A11Y-01\"],\n acceptance_criteria: [\n \"Button, Input, and Card components created\",\n \"Components follow accessibility guidelines\",\n \"Component tests written\",\n ],\n },\n {\n id: \"task-1.3-api-client\",\n title: \"Set up API client layer\",\n status: \"todo\",\n building_block: \"api-client\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"API client module created with typed request/response interfaces\",\n \"Base URL and auth token handling configured\",\n \"Error handling standardized (network errors, API errors, validation errors)\",\n \"Request/response types match the backend API contract\",\n \"Document the API contract approach in an ADR (e.g., OpenAPI-generated types vs. manual types)\",\n ],\n },\n {\n id: \"task-1.4-document-decisions\",\n title: \"Document architectural decisions as ADRs\",\n status: \"todo\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"ADR for each significant technology or pattern choice made in this phase\",\n \"ADRs include context, decision, and consequences\",\n \"ADRs linked to affected building blocks and code paths\",\n ],\n },\n ],\n },\n };\n\n return tasksByPhase[phaseId] ?? null;\n}\n","import type { PhasesFile, TaskFile } from \"../../schemas/phases.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function phasePlanTemplate(_input: InitProjectInput): PhasesFile {\n const phases = [\n {\n id: \"phase-0-setup\",\n name: \"Project Setup\",\n phase_number: 0,\n status: \"in-progress\" as const,\n description:\n \"Initialize API service, configure TypeScript, set up database and middleware\",\n gate_requirements: [\n \"Project builds successfully\",\n \"Server starts and responds to health check\",\n \"Linting and formatting configured\",\n ],\n },\n {\n id: \"phase-1-foundation\",\n name: \"Foundation\",\n phase_number: 1,\n status: \"planned\" as const,\n description: \"Core middleware, authentication, error handling, and database layer\",\n gate_requirements: [\n \"Auth middleware protects routes\",\n \"Error handler returns consistent responses\",\n \"Database migrations run successfully\",\n \"Quality scenarios SEC-01, SEC-02 verified\",\n ],\n },\n {\n id: \"phase-2-features\",\n name: \"Core API\",\n phase_number: 2,\n status: \"planned\" as const,\n description: \"Implement the primary API endpoints and business logic\",\n gate_requirements: [\n \"All CRUD endpoints for core resources work\",\n \"Input validation on all endpoints\",\n \"API documentation generated\",\n \"Test coverage meets thresholds\",\n ],\n },\n {\n id: \"phase-3-production\",\n name: \"Production Readiness\",\n phase_number: 3,\n status: \"planned\" as const,\n description:\n \"Rate limiting, logging, monitoring, performance optimization, deployment\",\n gate_requirements: [\n \"All quality scenarios passing\",\n \"Rate limiting configured\",\n \"Structured logging in place\",\n \"Production deployment successful\",\n ],\n },\n ];\n\n return { schema_version: 1, phases };\n}\n\nexport function phaseTasksTemplate(\n _input: InitProjectInput,\n phaseId: string,\n): TaskFile | null {\n const tasksByPhase: Record<string, TaskFile> = {\n \"phase-0-setup\": {\n schema_version: 1,\n phase_id: \"phase-0-setup\",\n tasks: [\n {\n id: \"task-0.1-init-api\",\n title: \"Initialize API project\",\n status: \"todo\",\n building_block: \"api-core\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"Express/Fastify/Hono server created with TypeScript\",\n \"TypeScript configured in strict mode\",\n \"Health check endpoint responds at /health\",\n ],\n },\n {\n id: \"task-0.2-database\",\n title: \"Set up database layer\",\n status: \"todo\",\n building_block: \"data-access\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"Database connection configured\",\n \"Migration system in place\",\n \"Connection pooling configured\",\n ],\n },\n {\n id: \"task-0.3-tooling\",\n title: \"Configure development tooling\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-01\"],\n acceptance_criteria: [\n \"ESLint configured with recommended rules\",\n \"Prettier configured for consistent formatting\",\n \"Hot reload configured for development\",\n ],\n },\n {\n id: \"task-0.4-testing\",\n title: \"Set up testing infrastructure\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-02\"],\n acceptance_criteria: [\n \"Vitest configured for unit tests\",\n \"Supertest configured for API integration tests\",\n \"Test scripts added to package.json\",\n ],\n },\n ],\n },\n \"phase-1-foundation\": {\n schema_version: 1,\n phase_id: \"phase-1-foundation\",\n tasks: [\n {\n id: \"task-1.1-auth\",\n title: \"Implement authentication middleware\",\n status: \"todo\",\n building_block: \"api-core\",\n quality_scenarios: [\"SEC-01\", \"SEC-02\"],\n acceptance_criteria: [\n \"JWT or session-based auth configured\",\n \"Protected route middleware working\",\n \"Auth tests cover happy path and edge cases\",\n ],\n },\n {\n id: \"task-1.2-error-handling\",\n title: \"Set up global error handling\",\n status: \"todo\",\n building_block: \"api-core\",\n quality_scenarios: [\"REL-01\"],\n acceptance_criteria: [\n \"Consistent error response format\",\n \"Unhandled errors caught and logged\",\n \"No stack traces leaked in production\",\n ],\n },\n {\n id: \"task-1.3-validation\",\n title: \"Set up input validation\",\n status: \"todo\",\n building_block: \"api-core\",\n quality_scenarios: [\"SEC-03\"],\n acceptance_criteria: [\n \"Request body validation with Zod or similar\",\n \"Query parameter validation\",\n \"Descriptive validation error messages\",\n ],\n },\n {\n id: \"task-1.4-api-documentation\",\n title: \"Set up API documentation\",\n status: \"todo\",\n building_block: \"api-core\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"OpenAPI/Swagger spec generated from route definitions\",\n \"All endpoints have descriptions and response types\",\n \"Request/response schemas documented\",\n \"OpenAPI spec is the API contract — frontend clients should generate types from it\",\n \"Use arcbridge_get_route_map to verify all routes are captured\",\n \"Update .arcbridge/arc42/03-context.md with API consumers (frontend, mobile, etc.)\",\n ],\n },\n {\n id: \"task-1.5-document-decisions\",\n title: \"Document architectural decisions as ADRs\",\n status: \"todo\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"ADR for each significant technology or pattern choice made in this phase\",\n \"ADRs include context, decision, and consequences\",\n \"ADRs linked to affected building blocks and code paths\",\n ],\n },\n ],\n },\n };\n\n return tasksByPhase[phaseId] ?? null;\n}\n","import type { PhasesFile, TaskFile } from \"../../schemas/phases.js\";\nimport type { InitProjectInput } from \"../types.js\";\n\nexport function phasePlanTemplate(_input: InitProjectInput): PhasesFile {\n const phases = [\n {\n id: \"phase-0-setup\",\n name: \"Project Setup\",\n phase_number: 0,\n status: \"in-progress\" as const,\n description:\n \"Initialize ASP.NET Core project, configure DI, set up database and middleware pipeline\",\n gate_requirements: [\n \"Project builds and runs successfully\",\n \"Health check endpoint responds at /health\",\n \"DI container configured with core services\",\n \"Logging and configuration in place\",\n ],\n },\n {\n id: \"phase-1-foundation\",\n name: \"Foundation\",\n phase_number: 1,\n status: \"planned\" as const,\n description:\n \"Authentication, authorization, error handling, database access, and input validation\",\n gate_requirements: [\n \"Auth middleware protects endpoints\",\n \"Global exception handler returns ProblemDetails\",\n \"EF Core / Dapper data access layer works\",\n \"Quality scenarios SEC-01, SEC-02 verified\",\n ],\n },\n {\n id: \"phase-2-features\",\n name: \"Core API\",\n phase_number: 2,\n status: \"planned\" as const,\n description:\n \"Implement the primary API endpoints, business logic, and domain models\",\n gate_requirements: [\n \"All CRUD endpoints for core resources work\",\n \"Input validation via FluentValidation or data annotations\",\n \"OpenAPI/Swagger documentation generated\",\n \"Integration test coverage meets thresholds\",\n ],\n },\n {\n id: \"phase-3-production\",\n name: \"Production Readiness\",\n phase_number: 3,\n status: \"planned\" as const,\n description:\n \"Rate limiting, health checks, structured logging, performance optimization, deployment\",\n gate_requirements: [\n \"All quality scenarios passing\",\n \"Rate limiting configured\",\n \"Structured logging with Serilog or similar\",\n \"Docker containerization ready\",\n \"Production deployment successful\",\n ],\n },\n ];\n\n return { schema_version: 1, phases };\n}\n\nexport function phaseTasksTemplate(\n _input: InitProjectInput,\n phaseId: string,\n): TaskFile | null {\n const tasksByPhase: Record<string, TaskFile> = {\n \"phase-0-setup\": {\n schema_version: 1,\n phase_id: \"phase-0-setup\",\n tasks: [\n {\n id: \"task-0.1-init-project\",\n title: \"Initialize ASP.NET Core Web API project\",\n status: \"todo\",\n building_block: \"api-host\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"dotnet new webapi project created\",\n \"Program.cs configured with minimal hosting model\",\n \"Health check endpoint responds at /health\",\n ],\n },\n {\n id: \"task-0.2-di-setup\",\n title: \"Configure dependency injection\",\n status: \"todo\",\n building_block: \"api-host\",\n quality_scenarios: [\"MAINT-01\"],\n acceptance_criteria: [\n \"Service registration organized by feature/layer\",\n \"Extension methods for service groups (AddApplicationServices, AddInfrastructure)\",\n \"Configuration bound to strongly-typed options classes\",\n ],\n },\n {\n id: \"task-0.3-database\",\n title: \"Set up database and data access\",\n status: \"todo\",\n building_block: \"data-access\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"EF Core or Dapper configured\",\n \"Database migrations in place\",\n \"Connection string managed via configuration\",\n ],\n },\n {\n id: \"task-0.4-testing\",\n title: \"Set up testing infrastructure\",\n status: \"todo\",\n quality_scenarios: [\"MAINT-02\"],\n acceptance_criteria: [\n \"xUnit or NUnit test project created\",\n \"WebApplicationFactory configured for integration tests\",\n \"Test database setup (in-memory or test container)\",\n ],\n },\n ],\n },\n \"phase-1-foundation\": {\n schema_version: 1,\n phase_id: \"phase-1-foundation\",\n tasks: [\n {\n id: \"task-1.1-auth\",\n title: \"Implement authentication and authorization\",\n status: \"todo\",\n building_block: \"auth-module\",\n quality_scenarios: [\"SEC-01\", \"SEC-02\"],\n acceptance_criteria: [\n \"JWT bearer or cookie auth configured\",\n \"Authorization policies defined\",\n \"Auth middleware applied to protected endpoints\",\n \"Auth tests cover happy path and edge cases\",\n ],\n },\n {\n id: \"task-1.2-error-handling\",\n title: \"Set up global exception handling\",\n status: \"todo\",\n building_block: \"api-host\",\n quality_scenarios: [\"REL-01\"],\n acceptance_criteria: [\n \"Exception handler middleware returns RFC 7807 ProblemDetails\",\n \"Unhandled exceptions logged with correlation ID\",\n \"No stack traces leaked in production\",\n ],\n },\n {\n id: \"task-1.3-validation\",\n title: \"Set up input validation\",\n status: \"todo\",\n building_block: \"api-host\",\n quality_scenarios: [\"SEC-03\"],\n acceptance_criteria: [\n \"FluentValidation or data annotations configured\",\n \"Validation filter returns 400 with details\",\n \"Descriptive validation error messages\",\n ],\n },\n {\n id: \"task-1.4-middleware\",\n title: \"Configure middleware pipeline\",\n status: \"todo\",\n building_block: \"middleware\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"CORS policy configured\",\n \"Request/response logging middleware\",\n \"Middleware order documented\",\n ],\n },\n {\n id: \"task-1.5-api-documentation\",\n title: \"Set up API documentation\",\n status: \"todo\",\n building_block: \"api-host\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"Swagger/OpenAPI enabled and accessible in development\",\n \"All endpoints have summary and response type annotations\",\n \"Request/response DTOs documented with XML comments or attributes\",\n \"OpenAPI spec is the API contract — frontend clients should generate types from it\",\n \"Use arcbridge_get_route_map to verify all routes are captured\",\n \"Update .arcbridge/arc42/03-context.md with API consumers (frontend, mobile, etc.)\",\n ],\n },\n {\n id: \"task-1.6-document-decisions\",\n title: \"Document architectural decisions as ADRs\",\n status: \"todo\",\n quality_scenarios: [],\n acceptance_criteria: [\n \"ADR for each significant technology or pattern choice made in this phase\",\n \"ADRs include context, decision, and consequences\",\n \"ADRs linked to affected building blocks and code paths\",\n ],\n },\n ],\n },\n };\n\n return tasksByPhase[phaseId] ?? null;\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport matter from \"gray-matter\";\nimport type { AgentRole } from \"../schemas/agent-roles.js\";\nimport { architectTemplate } from \"../templates/agents/architect.js\";\nimport { implementerTemplate } from \"../templates/agents/implementer.js\";\nimport { securityReviewerTemplate } from \"../templates/agents/security-reviewer.js\";\nimport { qualityGuardianTemplate } from \"../templates/agents/quality-guardian.js\";\nimport { phaseManagerTemplate } from \"../templates/agents/phase-manager.js\";\nimport { onboardingTemplate } from \"../templates/agents/onboarding.js\";\nimport { codeReviewerTemplate } from \"../templates/agents/code-reviewer.js\";\nimport { uxReviewerTemplate } from \"../templates/agents/ux-reviewer.js\";\n\n/** Templates that have UI components and benefit from UX review */\nconst UI_TEMPLATES = new Set([\"nextjs-app-router\", \"react-vite\"]);\n\nfunction writeAgentRole(dir: string, role: AgentRole): void {\n const { system_prompt, ...frontmatter } = role;\n const content = matter.stringify(system_prompt, frontmatter);\n writeFileSync(join(dir, `${role.role_id}.md`), content, \"utf-8\");\n}\n\nexport function generateAgentRoles(\n targetDir: string,\n template?: string,\n): AgentRole[] {\n const agentsDir = join(targetDir, \".arcbridge\", \"agents\");\n mkdirSync(agentsDir, { recursive: true });\n\n const roles: AgentRole[] = [\n architectTemplate(),\n implementerTemplate(),\n securityReviewerTemplate(),\n qualityGuardianTemplate(),\n phaseManagerTemplate(),\n onboardingTemplate(),\n codeReviewerTemplate(),\n ];\n\n // Add UX reviewer only for projects with UI components\n if (template && UI_TEMPLATES.has(template)) {\n roles.push(uxReviewerTemplate());\n }\n\n for (const role of roles) {\n writeAgentRole(agentsDir, role);\n }\n\n return roles;\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function architectTemplate(): AgentRole {\n return {\n role_id: \"architect\",\n name: \"Architect\",\n description:\n \"Designs system structure, makes architectural decisions, and maintains the arc42 documentation\",\n version: 1,\n required_tools: [\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 denied_tools: [],\n read_only: false,\n quality_focus: [\n \"maintainability\",\n \"reliability\",\n \"security\",\n \"performance\",\n ],\n model_preferences: {\n reasoning_depth: \"high\",\n speed_priority: \"low\",\n suggested_models: {\n claude: \"claude-opus-4-6\",\n },\n },\n platform_overrides: {\n claude: { constraint_style: \"narrative\" },\n copilot: { tool_access: \"full\" },\n },\n system_prompt: `You are the Architect agent for this project.\n\n## Your Responsibilities\n\n- Design and maintain the system's building block structure\n- Make and document architectural decisions (ADRs)\n- Ensure all modules map to documented building blocks\n- Review quality scenarios and ensure architectural support\n- Detect and resolve architectural drift\n- **Keep all arc42 documentation sections up to date as the project evolves**\n- **Define and maintain contracts with external services** — if this project consumes or exposes APIs, or publishes/subscribes to events, ensure each contract is explicit, typed, and documented\n\n## Constraints\n\n- Justify every new dependency with an ADR\n- Map every new module to a building block\n- Update arc42 documentation when structure changes\n- Flag boundary-crossing code instead of silently introducing dependencies\n- When this project communicates with external services (REST APIs, events/messaging, gRPC), the contract must be explicit — define request/response types or event schemas, document the approach in an ADR, and update Section 03 (Context) with the external system\n\n## Arc42 Documentation Sections\n\nYou are responsible for maintaining these sections in \\`.arcbridge/arc42/\\`. Update them as the project evolves — they are the living architecture documentation.\n\n| Section | File | When to update |\n|---------|------|----------------|\n| **01 Introduction & Goals** | \\`01-introduction.md\\` | When project scope, stakeholders, or key goals change |\n| **03 Context & Scope** | \\`03-context.md\\` | When adding/removing external systems, APIs, or integrations |\n| **05 Building Blocks** | \\`05-building-blocks.md\\` | When adding new modules, changing responsibilities, or restructuring layers |\n| **06 Runtime Views** | \\`06-runtime-views.md\\` | When adding key workflows (e.g., auth flow, order processing, data sync) |\n| **07 Deployment** | \\`07-deployment.md\\` | When changing infrastructure, environments, or deployment strategy |\n| **08 Crosscutting Concepts** | \\`08-crosscutting.md\\` (create if missing) | When establishing patterns for error handling, logging, auth, validation, caching |\n| **09 Decisions** | \\`09-decisions/\\` | Every significant technology or pattern choice → create an ADR |\n| **10 Quality Scenarios** | \\`10-quality-scenarios.yaml\\` | When quality requirements change or new scenarios are identified |\n| **11 Risks & Technical Debt** | \\`11-risks-debt.md\\` | When identifying risks, known limitations, or tech debt to address later |\n\n### When to review arc42 docs\n\n- **Start of each phase:** Review all sections — do they still reflect reality?\n- **After adding an external integration:** Update Section 03 (Context) and Section 06 (Runtime Views)\n- **After establishing a pattern:** Update Section 08 (Crosscutting Concepts) — e.g., \"we use ProblemDetails for errors\"\n- **After significant refactoring:** Update Section 05 (Building Blocks) and run \\`arcbridge_check_drift\\`\n- **Before completing a phase:** Run \\`arcbridge_propose_arc42_update\\` to catch missed documentation updates\n\n## Context You Receive\n\n- Full arc42 documentation (all sections)\n- Quality scenarios with priorities\n- All ADRs and their status\n- Building block → code mapping\n\n## Working Style\n\nThink at the system level. Before making changes, consider:\n1. Which building block does this belong to?\n2. Does this introduce a new dependency?\n3. Which quality scenarios are affected?\n4. Is there an existing pattern we should follow?\n5. Which arc42 sections need updating?`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function implementerTemplate(): AgentRole {\n return {\n role_id: \"implementer\",\n name: \"Implementer\",\n description:\n \"Writes code within architectural boundaries, following established patterns and quality constraints\",\n version: 1,\n required_tools: [\n \"arcbridge_get_building_block\",\n \"arcbridge_get_current_tasks\",\n \"arcbridge_update_task\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_reindex\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_guidance\",\n ],\n denied_tools: [],\n read_only: false,\n quality_focus: [\"maintainability\"],\n model_preferences: {\n reasoning_depth: \"medium\",\n speed_priority: \"high\",\n suggested_models: {\n claude: \"claude-sonnet-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the Implementer agent for this project.\n\n## Your Responsibilities\n\n- Write code that fits within the project's architectural boundaries\n- Follow established patterns found in existing code\n- Write tests alongside implementation\n- Update task status as you work\n\n## Constraints\n\n- Stay within the building block boundaries assigned to your task\n- Follow existing patterns in the codebase — don't invent new ones without reason\n- Write tests for new functionality\n- If you need to cross a building block boundary, flag it instead of doing it silently\n\n## Context You Receive\n\n- The relevant building block and its code paths\n- Current phase tasks with acceptance criteria\n- Quality scenarios that apply to your work area\n- Component graph and type interfaces for your area\n\n## Working Style\n\nFocus on shipping working code that meets acceptance criteria. When in doubt:\n1. Check if a similar pattern already exists in the codebase\n2. Stay within your assigned building block\n3. Write the simplest solution that satisfies the requirements\n4. Add tests that verify the acceptance criteria\n\n## Architecture Awareness\n\nConsult the arc42 documentation in \\`.arcbridge/arc42/\\` when working:\n- Read \\`05-building-blocks.md\\` to understand module boundaries and responsibilities\n- Read \\`08-crosscutting.md\\` (if it exists) for established patterns (error handling, logging, validation)\n- Read \\`06-runtime-views.md\\` to understand how your component fits into larger workflows\n- If you establish a new pattern that other code should follow, note it for the Architect to document`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function securityReviewerTemplate(): AgentRole {\n return {\n role_id: \"security-reviewer\",\n name: \"Security Reviewer\",\n description:\n \"Reviews code for security vulnerabilities, verifies security quality scenarios, and checks auth coverage\",\n version: 1,\n required_tools: [\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 denied_tools: [],\n read_only: true,\n quality_focus: [\"security\"],\n model_preferences: {\n reasoning_depth: \"high\",\n speed_priority: \"low\",\n suggested_models: {\n claude: \"claude-opus-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the Security Reviewer agent for this project.\n\n## Your Responsibilities\n\n- Review code for OWASP Top 10 vulnerabilities\n- Verify all security quality scenarios are met\n- Check auth coverage on API routes and server actions\n- Identify client-side data exposure risks\n- Review input validation on all mutation endpoints\n\n## Constraints\n\n- You are READ-ONLY — report findings, do not modify code\n- Check every API route for authentication\n- Verify no secrets leak to client bundles\n- Flag any input that isn't validated before use\n\n## Checks to Perform\n\n1. **Auth Coverage:** Every API route and server action has auth checks\n2. **Client Exposure:** No sensitive data in client components or bundles\n3. **Input Validation:** All mutation inputs validated with zod or equivalent\n4. **Dependency Security:** Flag known CVEs in dependencies\n5. **CSRF/XSS:** Server actions use proper tokens, no dangerouslySetInnerHTML without sanitization`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function qualityGuardianTemplate(): AgentRole {\n return {\n role_id: \"quality-guardian\",\n name: \"Quality Guardian\",\n description:\n \"Enforces quality scenarios across all categories: performance, accessibility, reliability, and maintainability\",\n version: 1,\n required_tools: [\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_project_status\",\n \"arcbridge_get_building_blocks\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_boundary_analysis\",\n // Phase 3+: \"arcbridge_run_role_check\"\n ],\n denied_tools: [],\n read_only: true,\n quality_focus: [\n \"performance\",\n \"accessibility\",\n \"reliability\",\n \"maintainability\",\n ],\n model_preferences: {\n reasoning_depth: \"high\",\n speed_priority: \"low\",\n suggested_models: {\n claude: \"claude-opus-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the Quality Guardian agent for this project.\n\n## Your Responsibilities\n\n- Enforce all quality scenarios defined in the project\n- Check performance budgets (bundle size, LCP, API response times)\n- Verify accessibility compliance (WCAG 2.1 AA)\n- Ensure test coverage meets thresholds\n- Flag quality regressions\n\n## Constraints\n\n- You are READ-ONLY — report findings, do not modify code\n- Every quality scenario with status \"untested\" needs attention\n- Performance budgets are hard limits, not guidelines\n\n## Review Checklist\n\n1. **Performance:** Bundle size, LCP, API latency against defined budgets\n2. **Accessibility:** axe-core violations, keyboard navigation, screen reader support\n3. **Test Coverage:** Business logic modules meet coverage thresholds\n4. **Maintainability:** No circular dependencies, consistent patterns\n5. **Reliability:** Error boundaries, graceful degradation, retry logic`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function phaseManagerTemplate(): AgentRole {\n return {\n role_id: \"phase-manager\",\n name: \"Phase Manager\",\n description:\n \"Manages phase transitions, enforces gates, triggers sync, and tracks task completion\",\n version: 1,\n required_tools: [\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 ],\n denied_tools: [],\n read_only: false,\n quality_focus: [],\n model_preferences: {\n reasoning_depth: \"medium\",\n speed_priority: \"medium\",\n suggested_models: {\n claude: \"claude-sonnet-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the Phase Manager agent for this project.\n\n## Your Responsibilities\n\n- Track task completion within the current phase\n- Enforce phase gate requirements before transitions\n- Trigger architecture sync at phase boundaries\n- Compare planned vs. built and report drift\n- Generate arc42 update proposals after each phase\n\n## Constraints\n\n- Do not skip phase gates — all requirements must be met\n- Trigger sync at every phase boundary\n- Tasks must be \"done\" before a phase can complete\n- Quality scenarios linked to phase tasks must be verified\n\n## Phase Transition Process\n\n1. Verify all tasks in current phase are \"done\"\n2. Run drift detection (check_drift)\n3. Propose arc42 updates if drift is detected\n4. Check quality gate requirements\n5. Mark phase complete or report blockers`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function onboardingTemplate(): AgentRole {\n return {\n role_id: \"onboarding\",\n name: \"Onboarding\",\n description:\n \"Explains the project architecture, guides new developers, and answers questions about the codebase\",\n version: 1,\n required_tools: [\n \"arcbridge_get_building_blocks\",\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_get_relevant_adrs\",\n \"arcbridge_get_phase_plan\",\n \"arcbridge_get_project_status\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_dependency_graph\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_route_map\",\n ],\n denied_tools: [],\n read_only: true,\n quality_focus: [],\n model_preferences: {\n reasoning_depth: \"medium\",\n speed_priority: \"high\",\n suggested_models: {\n claude: \"claude-sonnet-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the Onboarding agent for this project.\n\n## Your Responsibilities\n\n- Explain the project's architecture to new developers\n- Answer questions about the codebase structure\n- Guide developers to the right building blocks for their task\n- Explain architectural decisions and their rationale\n- Provide context about the current phase and priorities\n\n## Constraints\n\n- You are READ-ONLY — explain and guide, do not modify\n- Always reference arc42 documentation for architecture questions\n- Point developers to relevant ADRs for \"why\" questions\n- Use building block names consistently\n\n## How to Help\n\nWhen a developer asks about the project:\n1. Start with the building block view — show the top-level structure\n2. Explain quality priorities and what they mean in practice\n3. Point to the current phase and active tasks\n4. Reference ADRs for important decisions\n5. Suggest which building block to work in for their task`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function codeReviewerTemplate(): AgentRole {\n return {\n role_id: \"code-reviewer\",\n name: \"Code Reviewer\",\n description:\n \"On-demand code review: checks correctness, patterns, edge cases, and simplicity. Opt-in — not part of automatic phase gates.\",\n version: 1,\n required_tools: [\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 denied_tools: [],\n read_only: true,\n quality_focus: [\"maintainability\", \"reliability\"],\n model_preferences: {\n reasoning_depth: \"high\",\n speed_priority: \"low\",\n suggested_models: {\n claude: \"claude-opus-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the Code Reviewer agent for this project. You are invoked on-demand when the developer wants a second pair of eyes.\n\n## Your Responsibilities\n\n- Review code for correctness and completeness\n- Identify logic bugs, unhandled edge cases, and off-by-one errors\n- Check that the implementation matches the task's acceptance criteria\n- Verify the code follows established patterns in the codebase\n- Assess readability and appropriate simplicity\n- Flag over-engineering and unnecessary abstractions\n\n## What You Are NOT\n\nYou are not the Security Reviewer (they handle OWASP, auth, secrets) and not the Quality Guardian (they handle metrics, coverage, accessibility). Focus on what a senior developer would catch in a pull request.\n\n## Constraints\n\n- You are READ-ONLY — report findings, do not modify code\n- Always check which building block the code belongs to\n- Reference existing patterns when suggesting changes\n- Distinguish severity: bugs vs. suggestions vs. nitpicks\n\n## Review Structure\n\nWhen reviewing code:\n1. **Correctness** — Does it do what it's supposed to? Check acceptance criteria.\n2. **Edge cases** — What inputs or states could break this?\n3. **Patterns** — Does it follow how similar things are done elsewhere in the project?\n4. **Simplicity** — Is there a simpler way? Is anything over-engineered?\n5. **Naming & readability** — Would another developer understand this quickly?\n\nKeep reviews actionable. Every finding should either be a concrete bug or a specific suggestion with rationale.`,\n };\n}\n","import type { AgentRole } from \"../../schemas/agent-roles.js\";\n\nexport function uxReviewerTemplate(): AgentRole {\n return {\n role_id: \"ux-reviewer\",\n name: \"UX Reviewer\",\n description:\n \"Reviews UI components, page structure, and interaction patterns for usability, consistency, and accessibility\",\n version: 1,\n required_tools: [\n \"arcbridge_get_building_blocks\",\n \"arcbridge_get_building_block\",\n \"arcbridge_get_quality_scenarios\",\n \"arcbridge_search_symbols\",\n \"arcbridge_get_symbol\",\n \"arcbridge_get_component_graph\",\n \"arcbridge_get_route_map\",\n \"arcbridge_get_boundary_analysis\",\n \"arcbridge_get_guidance\",\n \"arcbridge_get_relevant_adrs\",\n ],\n denied_tools: [],\n read_only: true,\n quality_focus: [\"accessibility\", \"maintainability\", \"performance\"],\n model_preferences: {\n reasoning_depth: \"high\",\n speed_priority: \"low\",\n suggested_models: {\n claude: \"claude-opus-4-6\",\n },\n },\n platform_overrides: {},\n system_prompt: `You are the UX Reviewer agent for this project. You evaluate UI implementation for usability, visual consistency, and adherence to design intent.\n\n## Your Responsibilities\n\n### During Planning (Phase 0–1)\n- Review specs, wireframes, or design descriptions for usability issues before code is written\n- Propose component hierarchy and interaction patterns that fit the chosen framework\n- Identify accessibility requirements early (keyboard navigation, screen readers, color contrast)\n- Suggest reusable UI patterns and component composition strategies\n\n### After Implementation (Phase 2–3)\n- Review implemented components for consistency (naming, prop patterns, styling approach)\n- Verify responsive behavior considerations in component structure\n- Check for interaction state coverage (loading, error, empty, success)\n- Evaluate component graph for unnecessary complexity or missing abstractions\n- Verify that shared components are actually reused, not duplicated\n\n## What You Can Analyze\n\nYou cannot see screenshots, but you CAN reason about UI quality through code:\n- **Component graph** — Use \\`arcbridge_get_component_graph\\` to see which components render which, detect deep nesting, find components that should be shared\n- **Route structure** — Use \\`arcbridge_get_route_map\\` to evaluate page hierarchy and navigation flow\n- **Component props** — Use \\`arcbridge_search_symbols\\` with \\`kind: \"component\"\\` to find all components, then check their prop interfaces for consistency\n- **Client/server boundaries** — Use \\`arcbridge_get_boundary_analysis\\` to verify interactive components are client-side and data-fetching stays server-side\n- **Accessibility** — Search for ARIA attributes, keyboard event handlers, and semantic HTML usage in component code\n- **Styling patterns** — Check for consistent use of design tokens, utility classes, or CSS modules\n\n## Review Checklist\n\n1. **Component Structure**\n - Are components single-responsibility? Does the component graph show reasonable composition?\n - Are shared/reusable components in a dedicated building block (e.g., ui-components)?\n - Are prop interfaces consistent across similar components?\n\n2. **Interaction States**\n - Do interactive components handle: loading, error, empty, disabled, hover, focus states?\n - Are loading indicators and error messages user-friendly?\n - Is optimistic UI used where appropriate?\n\n3. **Accessibility**\n - Do interactive elements have proper ARIA labels and roles?\n - Is keyboard navigation supported (Tab order, Enter/Space activation, Escape to close)?\n - Are form inputs associated with labels?\n - Is color used as a secondary indicator (not the only one)?\n\n4. **Layout & Navigation**\n - Does the route map reflect a logical user flow?\n - Are layouts properly nested (shared header/nav, per-section layouts)?\n - Is navigation consistent and predictable?\n\n5. **Consistency**\n - Are similar UI patterns implemented consistently across the app?\n - Is the styling approach uniform (not mixing CSS modules, inline styles, and utility classes)?\n - Do components follow the same naming conventions?\n\n## Constraints\n\n- You are READ-ONLY — report findings and suggestions, do not modify code\n- Focus on patterns and structure, not pixel-level design details\n- Always reference the relevant quality scenarios (A11Y-*, PERF-*, MAINT-*) when making recommendations\n- When suggesting changes, explain the UX impact, not just the code change`,\n };\n}\n","import { join } from \"node:path\";\nimport { existsSync, readFileSync, readdirSync, appendFileSync } from \"node:fs\";\nimport { parse } from \"yaml\";\nimport matter from \"gray-matter\";\nimport type Database from \"better-sqlite3\";\nimport { openDatabase } from \"../db/connection.js\";\nimport { initializeSchema } from \"../db/schema.js\";\nimport type { InitProjectInput } from \"../templates/types.js\";\nimport { BuildingBlocksFrontmatterSchema } from \"../schemas/building-blocks.js\";\nimport { QualityScenariosFileSchema } from \"../schemas/quality-scenarios.js\";\nimport { PhasesFileSchema, TaskFileSchema } from \"../schemas/phases.js\";\nimport { AdrFrontmatterSchema } from \"../schemas/adrs.js\";\n\nexport interface GenerateDatabaseResult {\n db: Database.Database;\n warnings: string[];\n}\n\nfunction populateBuildingBlocks(\n db: Database.Database,\n targetDir: string,\n): string[] {\n const warnings: string[] = [];\n const filePath = join(\n targetDir,\n \".arcbridge\",\n \"arc42\",\n \"05-building-blocks.md\",\n );\n\n if (!existsSync(filePath)) {\n warnings.push(\"Building blocks file not found, skipping\");\n return warnings;\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const { data } = matter(raw);\n const result = BuildingBlocksFrontmatterSchema.safeParse(data);\n\n if (!result.success) {\n warnings.push(\n `Invalid building blocks frontmatter: ${result.error.issues.map((i) => i.message).join(\", \")}`,\n );\n return warnings;\n }\n\n const fm = result.data;\n const insert = db.prepare(`\n INSERT OR IGNORE INTO building_blocks (id, name, level, parent_id, description, responsibility, code_paths, interfaces, service, last_synced)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n for (const block of fm.blocks) {\n insert.run(\n block.id,\n block.name,\n block.level,\n block.parent_id ?? null,\n null,\n block.responsibility,\n JSON.stringify(block.code_paths),\n JSON.stringify(block.interfaces),\n block.service,\n fm.last_synced,\n );\n }\n\n return warnings;\n}\n\nfunction populateQualityScenarios(\n db: Database.Database,\n targetDir: string,\n): string[] {\n const warnings: string[] = [];\n const filePath = join(\n targetDir,\n \".arcbridge\",\n \"arc42\",\n \"10-quality-scenarios.yaml\",\n );\n\n if (!existsSync(filePath)) {\n warnings.push(\"Quality scenarios file not found, skipping\");\n return warnings;\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = parse(raw);\n const result = QualityScenariosFileSchema.safeParse(parsed);\n\n if (!result.success) {\n warnings.push(\n `Invalid quality scenarios: ${result.error.issues.map((i) => i.message).join(\", \")}`,\n );\n return warnings;\n }\n\n const insert = db.prepare(`\n INSERT OR IGNORE INTO quality_scenarios (id, name, category, scenario, expected, priority, linked_code, linked_tests, linked_blocks, verification, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n for (const s of result.data.scenarios) {\n insert.run(\n s.id,\n s.name,\n s.category,\n s.scenario,\n s.expected,\n s.priority,\n JSON.stringify(s.linked_code),\n JSON.stringify(s.linked_tests),\n JSON.stringify(s.linked_blocks),\n s.verification,\n s.status,\n );\n }\n\n return warnings;\n}\n\nfunction populatePhases(\n db: Database.Database,\n targetDir: string,\n): string[] {\n const warnings: string[] = [];\n const phasesPath = join(targetDir, \".arcbridge\", \"plan\", \"phases.yaml\");\n\n if (!existsSync(phasesPath)) {\n warnings.push(\"Phases file not found, skipping\");\n return warnings;\n }\n\n const raw = readFileSync(phasesPath, \"utf-8\");\n const parsed = parse(raw);\n const result = PhasesFileSchema.safeParse(parsed);\n\n if (!result.success) {\n warnings.push(\n `Invalid phases file: ${result.error.issues.map((i) => i.message).join(\", \")}`,\n );\n return warnings;\n }\n\n const insertPhase = db.prepare(`\n INSERT OR IGNORE INTO phases (id, name, phase_number, status, description, gate_status, started_at, completed_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertTask = db.prepare(`\n INSERT OR IGNORE INTO tasks (id, phase_id, title, description, status, building_block, quality_scenarios, acceptance_criteria, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const now = new Date().toISOString();\n\n for (const phase of result.data.phases) {\n insertPhase.run(\n phase.id,\n phase.name,\n phase.phase_number,\n phase.status,\n phase.description,\n JSON.stringify({}),\n phase.started_at ?? null,\n phase.completed_at ?? null,\n );\n\n // Try to load task file for this phase\n const taskPath = join(\n targetDir,\n \".arcbridge\",\n \"plan\",\n \"tasks\",\n `${phase.id}.yaml`,\n );\n\n if (!existsSync(taskPath)) continue;\n\n const taskRaw = readFileSync(taskPath, \"utf-8\");\n const taskParsed = parse(taskRaw);\n const taskResult = TaskFileSchema.safeParse(taskParsed);\n\n if (!taskResult.success) {\n warnings.push(\n `Invalid task file for ${phase.id}: ${taskResult.error.issues.map((i) => i.message).join(\", \")}`,\n );\n continue;\n }\n\n for (const task of taskResult.data.tasks) {\n insertTask.run(\n task.id,\n phase.id,\n task.title,\n null,\n task.status,\n task.building_block ?? null,\n JSON.stringify(task.quality_scenarios),\n JSON.stringify(task.acceptance_criteria),\n now,\n );\n }\n }\n\n return warnings;\n}\n\nfunction populateAdrs(\n db: Database.Database,\n targetDir: string,\n): string[] {\n const warnings: string[] = [];\n const decisionsDir = join(\n targetDir,\n \".arcbridge\",\n \"arc42\",\n \"09-decisions\",\n );\n\n if (!existsSync(decisionsDir)) {\n return warnings;\n }\n\n const files = readdirSync(decisionsDir).filter((f) => f.endsWith(\".md\"));\n\n const insert = db.prepare(`\n INSERT OR IGNORE INTO adrs (id, title, status, date, context, decision, consequences, affected_blocks, affected_files, quality_scenarios)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n for (const file of files) {\n const raw = readFileSync(join(decisionsDir, file), \"utf-8\");\n const { data, content } = matter(raw);\n const result = AdrFrontmatterSchema.safeParse(data);\n\n if (!result.success) {\n warnings.push(\n `Invalid ADR ${file}: ${result.error.issues.map((i) => i.message).join(\", \")}`,\n );\n continue;\n }\n\n const fm = result.data;\n insert.run(\n fm.id,\n fm.title,\n fm.status,\n fm.date,\n null,\n content.trim(),\n null,\n JSON.stringify(fm.affected_blocks),\n JSON.stringify(fm.affected_files),\n JSON.stringify(fm.quality_scenarios),\n );\n }\n\n return warnings;\n}\n\n/**\n * Re-read arc42 files from disk and update the database.\n * Uses INSERT OR REPLACE to pick up changes made since initial generation.\n */\nexport function refreshFromDocs(\n db: Database.Database,\n targetDir: string,\n): string[] {\n const warnings: string[] = [];\n\n // Save existing statuses before clearing\n const existingTasks = db\n .prepare(\"SELECT id, status, completed_at FROM tasks\")\n .all() as { id: string; status: string; completed_at: string | null }[];\n const taskStatusMap = new Map(\n existingTasks.map((t) => [t.id, { status: t.status, completed_at: t.completed_at }]),\n );\n\n const existingPhases = db\n .prepare(\"SELECT id, status, started_at, completed_at, gate_status FROM phases\")\n .all() as { id: string; status: string; started_at: string | null; completed_at: string | null; gate_status: string }[];\n const phaseStatusMap = new Map(\n existingPhases.map((p) => [p.id, { status: p.status, started_at: p.started_at, completed_at: p.completed_at, gate_status: p.gate_status }]),\n );\n\n const existingScenarios = db\n .prepare(\"SELECT id, status FROM quality_scenarios\")\n .all() as { id: string; status: string }[];\n const scenarioStatusMap = new Map(\n existingScenarios.map((s) => [s.id, s.status]),\n );\n\n // Wrap entire delete + repopulate + restore in a transaction for atomicity\n const refresh = db.transaction(() => {\n // Delete in FK-safe order: tasks → phases → building_blocks, then scenarios and ADRs\n db.prepare(\"DELETE FROM tasks\").run();\n db.prepare(\"DELETE FROM phases\").run();\n db.prepare(\"DELETE FROM building_blocks\").run();\n db.prepare(\"DELETE FROM quality_scenarios\").run();\n db.prepare(\"DELETE FROM adrs\").run();\n\n // Re-populate from files\n warnings.push(...populateBuildingBlocks(db, targetDir));\n warnings.push(...populateQualityScenarios(db, targetDir));\n warnings.push(...populatePhases(db, targetDir));\n warnings.push(...populateAdrs(db, targetDir));\n\n // Restore task statuses that were previously set\n const restoreTask = db.prepare(\n \"UPDATE tasks SET status = ?, completed_at = ? WHERE id = ?\",\n );\n for (const [id, prev] of taskStatusMap) {\n if (prev.status !== \"todo\") {\n restoreTask.run(prev.status, prev.completed_at, id);\n }\n }\n\n // Restore phase statuses\n const restorePhase = db.prepare(\n \"UPDATE phases SET status = ?, started_at = ?, completed_at = ?, gate_status = ? WHERE id = ?\",\n );\n for (const [id, prev] of phaseStatusMap) {\n if (prev.status !== \"planned\") {\n restorePhase.run(prev.status, prev.started_at, prev.completed_at, prev.gate_status, id);\n }\n }\n\n // Restore quality scenario statuses\n const restoreScenario = db.prepare(\n \"UPDATE quality_scenarios SET status = ? WHERE id = ?\",\n );\n for (const [id, prev] of scenarioStatusMap) {\n if (prev !== \"untested\") {\n restoreScenario.run(prev, id);\n }\n }\n });\n\n refresh();\n\n return warnings;\n}\n\nexport function generateDatabase(\n targetDir: string,\n input: InitProjectInput,\n): GenerateDatabaseResult {\n const dbPath = join(targetDir, \".arcbridge\", \"index.db\");\n const db = openDatabase(dbPath);\n initializeSchema(db);\n\n const allWarnings: string[] = [];\n\n // Set project metadata\n const upsert = db.prepare(\n \"INSERT OR REPLACE INTO arcbridge_meta (key, value) VALUES (?, ?)\",\n );\n upsert.run(\"project_name\", input.name);\n upsert.run(\"project_type\", input.template);\n upsert.run(\"last_full_index\", new Date().toISOString());\n\n // Populate from generated files\n db.transaction(() => {\n allWarnings.push(...populateBuildingBlocks(db, targetDir));\n allWarnings.push(...populateQualityScenarios(db, targetDir));\n allWarnings.push(...populatePhases(db, targetDir));\n allWarnings.push(...populateAdrs(db, targetDir));\n })();\n\n // Ensure index.db and WAL files are in .gitignore\n ensureGitignore(targetDir);\n\n return { db, warnings: allWarnings };\n}\n\n/**\n * Add .arcbridge/index.db and WAL files to .gitignore if not already present.\n */\nfunction ensureGitignore(targetDir: string): void {\n const gitignorePath = join(targetDir, \".gitignore\");\n const marker = \".arcbridge/index.db\";\n\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, \"utf-8\");\n if (content.includes(marker)) return;\n }\n\n const entry = `\n# ArcBridge database (derived from .arcbridge/ YAML/markdown files)\n.arcbridge/index.db\n.arcbridge/index.db-wal\n.arcbridge/index.db-shm\n`;\n\n appendFileSync(gitignorePath, entry, \"utf-8\");\n}\n","import { relative, join } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport YAML from \"yaml\";\nimport type Database from \"better-sqlite3\";\nimport type { IndexerOptions, IndexResult } from \"./types.js\";\nimport { createTsProgram } from \"./program.js\";\nimport { extractSymbols } from \"./symbol-extractor.js\";\nimport { extractDependencies, buildSymbolLookup } from \"./dependency-extractor.js\";\nimport { analyzeComponents } from \"./component-analyzer.js\";\nimport { analyzeRoutes } from \"./route-analyzer.js\";\nimport { hashContent } from \"./content-hash.js\";\nimport {\n getExistingHashes,\n removeSymbolsForFiles,\n writeSymbols,\n writeDependencies,\n} from \"./db-writer.js\";\nimport { indexDotnetProjectRoslyn, findDotnetProject, hasIndexerProject, hasGlobalTool } from \"./dotnet-indexer.js\";\nimport { indexCSharpTreeSitter } from \"./csharp/indexer.js\";\nimport { indexPackageDependencies } from \"./package-deps.js\";\nimport { loadConfig } from \"../config/loader.js\";\n\nexport type ProjectLanguage = \"typescript\" | \"csharp\" | \"auto\";\nexport type CSharpBackend = \"roslyn\" | \"tree-sitter\";\n\n/**\n * Detect the project language from files in the project root.\n * Checks for tsconfig.json first (TypeScript priority), then .csproj/.sln.\n * This prevents a stray .csproj from hijacking a TypeScript project.\n */\nexport function detectProjectLanguage(projectRoot: string): \"typescript\" | \"csharp\" {\n // TypeScript signals take priority (package.json + tsconfig.json is the stronger signal)\n if (existsSync(join(projectRoot, \"tsconfig.json\"))) return \"typescript\";\n if (existsSync(join(projectRoot, \"package.json\"))) return \"typescript\";\n\n // .NET signals\n if (findDotnetProject(projectRoot)) return \"csharp\";\n\n // Default to TypeScript (existing behavior)\n return \"typescript\";\n}\n\n/**\n * Index a project, auto-detecting the language unless explicitly specified.\n * Dispatches to the TypeScript or .NET indexer accordingly.\n */\nexport async function indexProject(\n db: Database.Database,\n options: IndexerOptions,\n): Promise<IndexResult> {\n const language = options.language ?? \"auto\";\n const resolvedLanguage = language === \"auto\"\n ? detectProjectLanguage(options.projectRoot)\n : language;\n\n // Index package dependencies (npm/NuGet) regardless of language\n indexPackageDependencies(db, options.projectRoot, options.service ?? \"main\");\n\n if (resolvedLanguage === \"csharp\") {\n const backend = resolveCSharpBackend(options.projectRoot);\n if (backend === \"roslyn\") {\n return indexDotnetProjectRoslyn(db, {\n projectRoot: options.projectRoot,\n service: options.service,\n });\n }\n return await indexCSharpTreeSitter(db, {\n projectRoot: options.projectRoot,\n service: options.service,\n });\n }\n\n return indexTypeScriptProject(db, options);\n}\n\n/**\n * Resolve which C# indexer backend to use.\n * 1. Check config for explicit `indexing.csharp_indexer` setting\n * 2. If \"auto\": global tool on PATH → Roslyn, else dotnet CLI + monorepo project → Roslyn, else tree-sitter\n */\nexport function resolveCSharpBackend(projectRoot: string): CSharpBackend {\n // Use the existing config loader for validated config access\n const { config, error } = loadConfig(projectRoot);\n let setting = config?.indexing?.csharp_indexer;\n\n // If full config validation failed but the file exists, try to extract\n // just the csharp_indexer setting from raw YAML so an unrelated config\n // error doesn't silently override the user's explicit backend choice\n if (!setting && error) {\n try {\n const raw = readFileSync(join(projectRoot, \".arcbridge\", \"config.yaml\"), \"utf-8\");\n const parsed = YAML.parse(raw);\n const rawSetting = parsed?.indexing?.csharp_indexer;\n if (rawSetting === \"roslyn\" || rawSetting === \"tree-sitter\") {\n setting = rawSetting;\n }\n } catch {\n // Ignore — proceed with auto\n }\n }\n\n if (setting === \"roslyn\" || setting === \"tree-sitter\") {\n return setting;\n }\n\n // Auto: prefer global tool, then monorepo source + dotnet CLI, else tree-sitter\n if (hasGlobalTool()) {\n return \"roslyn\";\n }\n\n // Global tool not found — check if dotnet CLI + monorepo indexer project are available\n if (hasIndexerProject()) {\n try {\n execFileSync(\"dotnet\", [\"--version\"], {\n encoding: \"utf-8\",\n timeout: 5000,\n });\n return \"roslyn\";\n } catch {\n // .NET SDK not available\n }\n }\n\n return \"tree-sitter\";\n}\n\nfunction indexTypeScriptProject(\n db: Database.Database,\n options: IndexerOptions,\n): IndexResult {\n const start = Date.now();\n const service = options.service ?? \"main\";\n\n // 1. Create TS program\n const { checker, sourceFiles, projectRoot } = createTsProgram(options);\n\n // 2. Compute file hashes and compare with existing\n const existingHashes = getExistingHashes(db, service);\n\n const changed: Array<{\n sourceFile: (typeof sourceFiles)[number];\n relativePath: string;\n hash: string;\n }> = [];\n const currentPaths = new Set<string>();\n let filesSkipped = 0;\n\n for (const sf of sourceFiles) {\n const relPath = relative(projectRoot, sf.fileName);\n currentPaths.add(relPath);\n\n const hash = hashContent(sf.getFullText());\n const existingHash = existingHashes.get(relPath);\n\n if (existingHash === hash) {\n filesSkipped++;\n } else {\n changed.push({ sourceFile: sf, relativePath: relPath, hash });\n }\n }\n\n // 3. Find removed files (in DB but no longer in program)\n const removed: string[] = [];\n for (const existingPath of existingHashes.keys()) {\n if (!currentPaths.has(existingPath)) {\n removed.push(existingPath);\n }\n }\n\n // 4. Remove stale symbols for changed + removed files\n const filesToClean = [\n ...removed,\n ...changed.map((f) => f.relativePath),\n ];\n removeSymbolsForFiles(db, filesToClean);\n\n // 5. Extract symbols from changed files\n const allSymbols = changed.flatMap((f) =>\n extractSymbols(f.sourceFile, checker, f.relativePath, f.hash),\n );\n\n // 6. Write symbols to DB\n writeSymbols(db, allSymbols, service, \"typescript\");\n\n // 7. Extract dependencies across ALL source files\n // (dependencies can cross file boundaries, so we need all symbols for lookup)\n const allDbSymbols = db\n .prepare(\"SELECT id, file_path as filePath, name FROM symbols WHERE service = ?\")\n .all(service) as Array<{ id: string; filePath: string; name: string }>;\n\n const lookup = buildSymbolLookup(allDbSymbols);\n\n // Clear existing dependencies for changed files (already done in removeSymbolsForFiles)\n // Now extract fresh dependencies from all source files\n const allDeps = sourceFiles.flatMap((sf) => {\n const relPath = relative(projectRoot, sf.fileName);\n return extractDependencies(sf, checker, relPath, projectRoot, lookup);\n });\n\n // Clear all deps and re-insert (simpler than incremental for cross-file edges)\n db.prepare(\"DELETE FROM dependencies WHERE source_symbol IN (SELECT id FROM symbols WHERE service = ?)\").run(service);\n writeDependencies(db, allDeps);\n\n // 8. Analyze React components (populates components table)\n const componentsAnalyzed = analyzeComponents(sourceFiles, checker, projectRoot, db);\n\n // 9. Analyze Next.js routes (populates routes table)\n const routesAnalyzed = analyzeRoutes(projectRoot, db, service);\n\n return {\n symbolsIndexed: allSymbols.length,\n dependenciesIndexed: allDeps.length,\n componentsAnalyzed,\n routesAnalyzed,\n filesProcessed: changed.length,\n filesSkipped,\n filesRemoved: removed.length,\n durationMs: Date.now() - start,\n };\n}\n\nexport type { IndexerOptions, IndexResult, ExtractedSymbol, SymbolKind } from \"./types.js\";\nexport { discoverDotnetServices, type DotnetProjectInfo } from \"./dotnet-indexer.js\";\nexport { indexPackageDependencies } from \"./package-deps.js\";\n","import ts from \"typescript\";\nimport { join } from \"node:path\";\nimport type { IndexerOptions } from \"./types.js\";\n\nexport interface ProgramResult {\n program: ts.Program;\n checker: ts.TypeChecker;\n sourceFiles: readonly ts.SourceFile[];\n projectRoot: string;\n}\n\nexport function createTsProgram(options: IndexerOptions): ProgramResult {\n const projectRoot = options.projectRoot;\n\n const configPath =\n options.tsconfigPath ??\n ts.findConfigFile(projectRoot, ts.sys.fileExists, \"tsconfig.json\");\n\n if (!configPath) {\n throw new Error(\n `No tsconfig.json found in ${projectRoot}. TypeScript indexing requires a tsconfig.json.`,\n );\n }\n\n const configFile = ts.readConfigFile(configPath, ts.sys.readFile);\n if (configFile.error) {\n const message = ts.flattenDiagnosticMessageText(\n configFile.error.messageText,\n \"\\n\",\n );\n throw new Error(`Failed to read tsconfig.json: ${message}`);\n }\n\n const parsed = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n join(projectRoot),\n { noEmit: true },\n configPath,\n );\n\n const program = ts.createProgram({\n rootNames: parsed.fileNames,\n options: parsed.options,\n });\n\n const checker = program.getTypeChecker();\n\n const sourceFiles = program\n .getSourceFiles()\n .filter(\n (sf) =>\n !sf.isDeclarationFile &&\n !sf.fileName.includes(\"node_modules\"),\n );\n\n return { program, checker, sourceFiles, projectRoot };\n}\n","import ts from \"typescript\";\nimport type { ExtractedSymbol, SymbolKind } from \"./types.js\";\nimport { containsJsx } from \"./react-utils.js\";\n\nexport function extractSymbols(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n relativePath: string,\n contentHash: string,\n): ExtractedSymbol[] {\n const symbols: ExtractedSymbol[] = [];\n\n function getLocation(node: ts.Node) {\n const start = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));\n const end = sourceFile.getLineAndCharacterOfPosition(node.getEnd());\n return {\n startLine: start.line + 1,\n startCol: start.character + 1,\n endLine: end.line + 1,\n endCol: end.character + 1,\n };\n }\n\n function getDocComment(node: ts.Node): string | null {\n const symbol = checker.getSymbolAtLocation(\n (node as ts.NamedDeclaration).name ?? node,\n );\n if (!symbol) return null;\n\n const docs = symbol.getDocumentationComment(checker);\n if (docs.length === 0) return null;\n return ts.displayPartsToString(docs);\n }\n\n function getSignature(node: ts.Node): string | null {\n const type = checker.getTypeAtLocation(node);\n const callSigs = type.getCallSignatures();\n if (callSigs.length === 0) return null;\n\n const sig = callSigs[0]!;\n return checker.signatureToString(\n sig,\n undefined,\n ts.TypeFormatFlags.WriteArrowStyleSignature,\n );\n }\n\n function getReturnType(node: ts.Node): string | null {\n const type = checker.getTypeAtLocation(node);\n const callSigs = type.getCallSignatures();\n if (callSigs.length === 0) return null;\n\n const sig = callSigs[0]!;\n return checker.typeToString(checker.getReturnTypeOfSignature(sig));\n }\n\n function isExported(node: ts.Node): boolean {\n const flags = ts.getCombinedModifierFlags(node as ts.Declaration);\n if (flags & ts.ModifierFlags.Export) return true;\n // Check for `export default`\n if (\n node.kind === ts.SyntaxKind.ExportAssignment ||\n (ts.isExportAssignment && ts.isExportAssignment(node))\n ) {\n return true;\n }\n return false;\n }\n\n function isAsync(node: ts.Node): boolean {\n const flags = ts.getCombinedModifierFlags(node as ts.Declaration);\n return (flags & ts.ModifierFlags.Async) !== 0;\n }\n\n function makeId(name: string, kind: SymbolKind, qualifier?: string): string {\n const qualifiedPart = qualifier ? `${qualifier}.${name}` : name;\n return `${relativePath}::${qualifiedPart}#${kind}`;\n }\n\n function isCallableInitializer(\n init: ts.Expression | undefined,\n ): init is ts.ArrowFunction | ts.FunctionExpression {\n if (!init) return false;\n return (\n ts.isArrowFunction(init) || ts.isFunctionExpression(init)\n );\n }\n\n // ---- React detection helpers ----\n\n /**\n * Check if a name follows the React hook convention: starts with \"use\" followed by uppercase.\n */\n function isHookName(name: string): boolean {\n return /^use[A-Z]/.test(name);\n }\n\n /**\n * Check if an initializer is a createContext() call.\n */\n function isCreateContextCall(init: ts.Expression | undefined): boolean {\n if (!init || !ts.isCallExpression(init)) return false;\n const expr = init.expression;\n // createContext(...)\n if (ts.isIdentifier(expr) && expr.text === \"createContext\") return true;\n // React.createContext(...)\n if (\n ts.isPropertyAccessExpression(expr) &&\n ts.isIdentifier(expr.name) &&\n expr.name.text === \"createContext\"\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Check if an initializer is a React.memo() or React.forwardRef() wrapper\n * containing a function that returns JSX.\n */\n function isReactWrapperCall(init: ts.Expression | undefined): boolean {\n if (!init || !ts.isCallExpression(init)) return false;\n const expr = init.expression;\n const wrapperNames = [\"memo\", \"forwardRef\"];\n\n let isWrapper = false;\n // memo(...) / forwardRef(...)\n if (ts.isIdentifier(expr) && wrapperNames.includes(expr.text)) {\n isWrapper = true;\n }\n // React.memo(...) / React.forwardRef(...)\n if (\n ts.isPropertyAccessExpression(expr) &&\n ts.isIdentifier(expr.name) &&\n wrapperNames.includes(expr.name.text)\n ) {\n isWrapper = true;\n }\n if (!isWrapper) return false;\n\n // Check if any argument contains JSX\n for (const arg of init.arguments) {\n if (containsJsx(arg)) return true;\n }\n return false;\n }\n\n /**\n * Classify a function-like symbol: is it a component, hook, or plain function?\n */\n function classifyFunction(\n name: string,\n body: ts.Node | undefined,\n init?: ts.Expression | undefined,\n ): SymbolKind {\n // React.memo() / React.forwardRef() wrappers\n if (init && isReactWrapperCall(init)) return \"component\";\n // Hook: starts with \"use\" + uppercase\n if (isHookName(name)) return \"hook\";\n // Component: PascalCase function that returns JSX\n if (body && /^[A-Z]/.test(name) && containsJsx(body)) return \"component\";\n return \"function\";\n }\n\n function visit(node: ts.Node): void {\n // Function declarations\n if (ts.isFunctionDeclaration(node) && node.name) {\n const name = node.name.text;\n const kind = classifyFunction(name, node.body);\n symbols.push({\n id: makeId(name, kind),\n name,\n qualifiedName: name,\n kind,\n filePath: relativePath,\n ...getLocation(node),\n signature: getSignature(node),\n returnType: getReturnType(node),\n docComment: getDocComment(node),\n isExported: isExported(node),\n isAsync: isAsync(node),\n contentHash,\n });\n return;\n }\n\n // Class declarations\n if (ts.isClassDeclaration(node) && node.name) {\n const name = node.name.text;\n symbols.push({\n id: makeId(name, \"class\"),\n name,\n qualifiedName: name,\n kind: \"class\",\n filePath: relativePath,\n ...getLocation(node),\n signature: null,\n returnType: null,\n docComment: getDocComment(node),\n isExported: isExported(node),\n isAsync: false,\n contentHash,\n });\n\n // Extract class methods as symbols\n for (const member of node.members) {\n if (\n (ts.isMethodDeclaration(member) || ts.isPropertyDeclaration(member)) &&\n member.name &&\n ts.isIdentifier(member.name)\n ) {\n const memberName = member.name.text;\n const memberKind: SymbolKind = ts.isMethodDeclaration(member)\n ? \"function\"\n : isCallableInitializer(\n (member as ts.PropertyDeclaration).initializer,\n )\n ? \"function\"\n : \"variable\";\n\n symbols.push({\n id: makeId(memberName, memberKind, name),\n name: memberName,\n qualifiedName: `${name}.${memberName}`,\n kind: memberKind,\n filePath: relativePath,\n ...getLocation(member),\n signature:\n memberKind === \"function\" ? getSignature(member) : null,\n returnType:\n memberKind === \"function\" ? getReturnType(member) : null,\n docComment: getDocComment(member),\n isExported: isExported(node), // class export implies member export\n isAsync: isAsync(member),\n contentHash,\n });\n }\n }\n return;\n }\n\n // Interface declarations\n if (ts.isInterfaceDeclaration(node)) {\n const name = node.name.text;\n symbols.push({\n id: makeId(name, \"interface\"),\n name,\n qualifiedName: name,\n kind: \"interface\",\n filePath: relativePath,\n ...getLocation(node),\n signature: null,\n returnType: null,\n docComment: getDocComment(node),\n isExported: isExported(node),\n isAsync: false,\n contentHash,\n });\n return;\n }\n\n // Type alias declarations\n if (ts.isTypeAliasDeclaration(node)) {\n const name = node.name.text;\n symbols.push({\n id: makeId(name, \"type\"),\n name,\n qualifiedName: name,\n kind: \"type\",\n filePath: relativePath,\n ...getLocation(node),\n signature: null,\n returnType: checker.typeToString(\n checker.getTypeAtLocation(node),\n ),\n docComment: getDocComment(node),\n isExported: isExported(node),\n isAsync: false,\n contentHash,\n });\n return;\n }\n\n // Enum declarations\n if (ts.isEnumDeclaration(node)) {\n const name = node.name.text;\n symbols.push({\n id: makeId(name, \"enum\"),\n name,\n qualifiedName: name,\n kind: \"enum\",\n filePath: relativePath,\n ...getLocation(node),\n signature: null,\n returnType: null,\n docComment: getDocComment(node),\n isExported: isExported(node),\n isAsync: false,\n contentHash,\n });\n return;\n }\n\n // Variable statements (const, let, var)\n if (ts.isVariableStatement(node)) {\n const exported = isExported(node);\n\n for (const decl of node.declarationList.declarations) {\n if (!ts.isIdentifier(decl.name)) continue;\n\n const name = decl.name.text;\n const callable = isCallableInitializer(decl.initializer);\n\n let kind: SymbolKind;\n if (isCreateContextCall(decl.initializer)) {\n kind = \"context\";\n } else if (callable) {\n kind = classifyFunction(name, decl.initializer!.body, undefined);\n } else if (isReactWrapperCall(decl.initializer)) {\n kind = \"component\";\n } else {\n kind = node.declarationList.flags & ts.NodeFlags.Const\n ? \"constant\"\n : \"variable\";\n }\n\n symbols.push({\n id: makeId(name, kind),\n name,\n qualifiedName: name,\n kind,\n filePath: relativePath,\n ...getLocation(decl),\n signature: callable || kind === \"component\" ? getSignature(decl) : null,\n returnType: callable || kind === \"component\" ? getReturnType(decl) : null,\n docComment: getDocComment(decl),\n isExported: exported,\n isAsync: callable\n ? decl.initializer !== undefined && isAsync(decl.initializer)\n : false,\n contentHash,\n });\n }\n return;\n }\n\n // Export assignments (export default ...)\n if (ts.isExportAssignment(node) && !node.isExportEquals) {\n // Only handle named identifiers as default exports\n if (ts.isIdentifier(node.expression)) {\n // Skip — the actual declaration is indexed elsewhere\n return;\n }\n }\n }\n\n ts.forEachChild(sourceFile, visit);\n\n return symbols;\n}\n","import ts from \"typescript\";\n\n/**\n * Check if a node's subtree contains JSX elements (JsxElement, JsxSelfClosingElement, JsxFragment).\n * Used to classify functions as React components.\n */\nexport function containsJsx(node: ts.Node): boolean {\n let found = false;\n function walk(n: ts.Node): void {\n if (found) return;\n if (\n ts.isJsxElement(n) ||\n ts.isJsxSelfClosingElement(n) ||\n ts.isJsxFragment(n)\n ) {\n found = true;\n return;\n }\n ts.forEachChild(n, walk);\n }\n walk(node);\n return found;\n}\n","import ts from \"typescript\";\nimport { relative } from \"node:path\";\n\nexport type DependencyKind =\n | \"imports\"\n | \"calls\"\n | \"extends\"\n | \"implements\"\n | \"uses_type\"\n | \"renders\"\n | \"provides_context\"\n | \"consumes_context\";\n\nexport interface ExtractedDependency {\n sourceSymbolId: string;\n targetSymbolId: string;\n kind: DependencyKind;\n}\n\n/**\n * Build a lookup from (filePath, symbolName, kind?) to symbol ID.\n * Used to resolve TS compiler symbols to our indexed symbol IDs.\n */\nexport interface SymbolLookup {\n /** All indexed symbol IDs keyed by \"filePath::name\" */\n byFileAndName: Map<string, string>;\n /** All indexed symbol IDs */\n allIds: Set<string>;\n}\n\nexport function buildSymbolLookup(\n symbols: Array<{ id: string; filePath: string; name: string }>,\n): SymbolLookup {\n const byFileAndName = new Map<string, string>();\n const allIds = new Set<string>();\n\n for (const s of symbols) {\n byFileAndName.set(`${s.filePath}::${s.name}`, s.id);\n allIds.add(s.id);\n }\n\n return { byFileAndName, allIds };\n}\n\nexport function extractDependencies(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n relativePath: string,\n projectRoot: string,\n lookup: SymbolLookup,\n): ExtractedDependency[] {\n const deps: ExtractedDependency[] = [];\n const seen = new Set<string>();\n\n function addDep(\n sourceId: string,\n targetId: string,\n kind: ExtractedDependency[\"kind\"],\n ): void {\n const key = `${sourceId}|${targetId}|${kind}`;\n if (seen.has(key)) return;\n if (!lookup.allIds.has(sourceId) || !lookup.allIds.has(targetId)) return;\n if (sourceId === targetId) return;\n seen.add(key);\n deps.push({ sourceSymbolId: sourceId, targetSymbolId: targetId, kind });\n }\n\n function resolveSymbolId(tsSymbol: ts.Symbol): string | null {\n // Get the declaration to find the file path\n const decls = tsSymbol.getDeclarations();\n if (!decls || decls.length === 0) return null;\n\n const decl = decls[0]!;\n const declFile = decl.getSourceFile();\n if (declFile.isDeclarationFile) return null;\n\n const declRelPath = relative(projectRoot, declFile.fileName);\n const name = tsSymbol.getName();\n\n // Direct lookup: file::name\n const directId = lookup.byFileAndName.get(`${declRelPath}::${name}`);\n if (directId) return directId;\n\n return null;\n }\n\n // ---- Extract import dependencies ----\n function extractImports(): void {\n for (const stmt of sourceFile.statements) {\n if (!ts.isImportDeclaration(stmt)) continue;\n if (!stmt.importClause) continue;\n\n const moduleSymbol = checker.getSymbolAtLocation(stmt.moduleSpecifier);\n if (!moduleSymbol) continue;\n\n // Named imports: import { Foo, Bar } from './module'\n const namedBindings = stmt.importClause.namedBindings;\n if (namedBindings && ts.isNamedImports(namedBindings)) {\n for (const specifier of namedBindings.elements) {\n const importedSymbol = checker.getSymbolAtLocation(specifier.name);\n if (!importedSymbol) continue;\n\n // Resolve through aliases\n const resolved = checker.getAliasedSymbol\n ? checker.getAliasedSymbol(importedSymbol)\n : importedSymbol;\n\n const targetId = resolveSymbolId(resolved);\n if (!targetId) continue;\n\n // Find which source symbols in this file use this import\n // For simplicity, we attribute imports to the file's top-level symbols\n const fileSymbols = getFileTopLevelSymbols(relativePath, lookup);\n for (const sourceId of fileSymbols) {\n addDep(sourceId, targetId, \"imports\");\n }\n }\n }\n\n // Default import: import Foo from './module'\n if (stmt.importClause.name) {\n const importedSymbol = checker.getSymbolAtLocation(stmt.importClause.name);\n if (importedSymbol) {\n const resolved = checker.getAliasedSymbol\n ? checker.getAliasedSymbol(importedSymbol)\n : importedSymbol;\n\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n const fileSymbols = getFileTopLevelSymbols(relativePath, lookup);\n for (const sourceId of fileSymbols) {\n addDep(sourceId, targetId, \"imports\");\n }\n }\n }\n }\n }\n }\n\n // ---- Extract extends/implements ----\n function extractHeritage(): void {\n ts.forEachChild(sourceFile, function visit(node) {\n if (ts.isClassDeclaration(node) && node.name) {\n const className = node.name.text;\n const classId = lookup.byFileAndName.get(`${relativePath}::${className}`);\n if (!classId) return;\n\n if (node.heritageClauses) {\n for (const clause of node.heritageClauses) {\n const kind: ExtractedDependency[\"kind\"] =\n clause.token === ts.SyntaxKind.ExtendsKeyword\n ? \"extends\"\n : \"implements\";\n\n for (const typeExpr of clause.types) {\n const exprSymbol = checker.getSymbolAtLocation(typeExpr.expression);\n if (!exprSymbol) continue;\n\n const resolved = exprSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(exprSymbol)\n : exprSymbol;\n\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(classId, targetId, kind);\n }\n }\n }\n }\n }\n ts.forEachChild(node, visit);\n });\n }\n\n // ---- Extract call dependencies ----\n function extractCalls(): void {\n ts.forEachChild(sourceFile, function visitTopLevel(node) {\n const ownerName = getOwnerName(node);\n if (!ownerName) return;\n\n const ownerIdOrUndef = lookup.byFileAndName.get(`${relativePath}::${ownerName}`);\n if (!ownerIdOrUndef) return;\n const ownerId: string = ownerIdOrUndef;\n\n // Walk the body looking for call expressions\n function walkForCalls(n: ts.Node): void {\n if (ts.isCallExpression(n)) {\n const calledSymbol = checker.getSymbolAtLocation(n.expression);\n if (calledSymbol) {\n const resolved = calledSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(calledSymbol)\n : calledSymbol;\n\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(ownerId, targetId, \"calls\");\n }\n }\n }\n ts.forEachChild(n, walkForCalls);\n }\n\n // Walk function/method bodies\n if (ts.isFunctionDeclaration(node) && node.body) {\n walkForCalls(node.body);\n } else if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (decl.initializer) {\n if (ts.isArrowFunction(decl.initializer) || ts.isFunctionExpression(decl.initializer)) {\n if (decl.initializer.body) {\n walkForCalls(decl.initializer.body);\n }\n }\n }\n }\n } else if (ts.isClassDeclaration(node)) {\n for (const member of node.members) {\n if (ts.isMethodDeclaration(member) && member.body) {\n const memberName = member.name && ts.isIdentifier(member.name)\n ? member.name.text\n : null;\n if (memberName) {\n const memberId = lookup.byFileAndName.get(\n `${relativePath}::${ownerName}.${memberName}`,\n );\n // Attribute calls to the method if we have it, else to the class\n const callOwnerId = memberId ?? ownerId;\n function walkMethodCalls(n: ts.Node): void {\n if (ts.isCallExpression(n)) {\n const calledSymbol = checker.getSymbolAtLocation(n.expression);\n if (calledSymbol) {\n const resolved = calledSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(calledSymbol)\n : calledSymbol;\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(callOwnerId, targetId, \"calls\");\n }\n }\n }\n ts.forEachChild(n, walkMethodCalls);\n }\n walkMethodCalls(member.body);\n }\n }\n }\n }\n });\n }\n\n // ---- Extract type usage ----\n function extractTypeUsage(): void {\n ts.forEachChild(sourceFile, function visitTopLevel(node) {\n const ownerName = getOwnerName(node);\n if (!ownerName) return;\n\n const ownerIdOrUndef = lookup.byFileAndName.get(`${relativePath}::${ownerName}`);\n if (!ownerIdOrUndef) return;\n const ownerId: string = ownerIdOrUndef;\n\n function walkForTypes(n: ts.Node): void {\n if (ts.isTypeReferenceNode(n)) {\n const typeSymbol = checker.getSymbolAtLocation(n.typeName);\n if (typeSymbol) {\n const resolved = typeSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(typeSymbol)\n : typeSymbol;\n\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(ownerId, targetId, \"uses_type\");\n }\n }\n }\n ts.forEachChild(n, walkForTypes);\n }\n\n walkForTypes(node);\n });\n }\n\n // ---- Extract JSX renders (component A renders component B) ----\n function extractRenders(): void {\n ts.forEachChild(sourceFile, function visitTopLevel(node) {\n const ownerName = getOwnerName(node);\n if (!ownerName) return;\n\n const ownerIdOrUndef = lookup.byFileAndName.get(`${relativePath}::${ownerName}`);\n if (!ownerIdOrUndef) return;\n const ownerId: string = ownerIdOrUndef;\n\n function walkForJsx(n: ts.Node): void {\n // <Component /> or <Component>...</Component>\n const tagName = ts.isJsxOpeningElement(n)\n ? n.tagName\n : ts.isJsxSelfClosingElement(n)\n ? n.tagName\n : null;\n\n if (tagName) {\n const jsxSymbol = checker.getSymbolAtLocation(tagName);\n if (jsxSymbol) {\n const resolved = jsxSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(jsxSymbol)\n : jsxSymbol;\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(ownerId, targetId, \"renders\");\n }\n }\n\n // Check for .Provider pattern: <XContext.Provider>\n if (\n ts.isPropertyAccessExpression(tagName) &&\n ts.isIdentifier(tagName.name) &&\n tagName.name.text === \"Provider\"\n ) {\n const ctxSymbol = checker.getSymbolAtLocation(tagName.expression);\n if (ctxSymbol) {\n const resolved = ctxSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(ctxSymbol)\n : ctxSymbol;\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(ownerId, targetId, \"provides_context\");\n }\n }\n }\n }\n\n ts.forEachChild(n, walkForJsx);\n }\n\n // Walk function/arrow function bodies for JSX\n if (ts.isFunctionDeclaration(node) && node.body) {\n walkForJsx(node.body);\n } else if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (decl.initializer) {\n if (ts.isArrowFunction(decl.initializer) || ts.isFunctionExpression(decl.initializer)) {\n if (decl.initializer.body) {\n walkForJsx(decl.initializer.body);\n }\n }\n // React.memo/forwardRef wrappers\n if (ts.isCallExpression(decl.initializer)) {\n for (const arg of decl.initializer.arguments) {\n if (ts.isArrowFunction(arg) || ts.isFunctionExpression(arg)) {\n if (arg.body) walkForJsx(arg.body);\n }\n }\n }\n }\n }\n }\n });\n }\n\n // ---- Extract useContext → consumes_context ----\n function extractContextConsumption(): void {\n ts.forEachChild(sourceFile, function visitTopLevel(node) {\n const ownerName = getOwnerName(node);\n if (!ownerName) return;\n\n const ownerIdOrUndef = lookup.byFileAndName.get(`${relativePath}::${ownerName}`);\n if (!ownerIdOrUndef) return;\n const ownerId: string = ownerIdOrUndef;\n\n function walkForContext(n: ts.Node): void {\n const isUseContextCall =\n ts.isCallExpression(n) &&\n n.arguments.length > 0 &&\n (\n // useContext(X)\n (ts.isIdentifier(n.expression) && n.expression.text === \"useContext\") ||\n // React.useContext(X)\n (ts.isPropertyAccessExpression(n.expression) &&\n ts.isIdentifier(n.expression.name) &&\n n.expression.name.text === \"useContext\")\n );\n\n if (isUseContextCall && ts.isCallExpression(n)) {\n const arg = n.arguments[0]!;\n const ctxSymbol = checker.getSymbolAtLocation(arg);\n if (ctxSymbol) {\n const resolved = ctxSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(ctxSymbol)\n : ctxSymbol;\n const targetId = resolveSymbolId(resolved);\n if (targetId) {\n addDep(ownerId, targetId, \"consumes_context\");\n }\n }\n }\n ts.forEachChild(n, walkForContext);\n }\n\n // Walk function bodies\n if (ts.isFunctionDeclaration(node) && node.body) {\n walkForContext(node.body);\n } else if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (decl.initializer) {\n if (ts.isArrowFunction(decl.initializer) || ts.isFunctionExpression(decl.initializer)) {\n if (decl.initializer.body) {\n walkForContext(decl.initializer.body);\n }\n }\n }\n }\n }\n });\n }\n\n extractImports();\n extractHeritage();\n extractCalls();\n extractTypeUsage();\n extractRenders();\n extractContextConsumption();\n\n return deps;\n}\n\n// ---- Helpers ----\n\nfunction getFileTopLevelSymbols(\n filePath: string,\n lookup: SymbolLookup,\n): string[] {\n const results: string[] = [];\n for (const [key, id] of lookup.byFileAndName) {\n if (key.startsWith(`${filePath}::`)) {\n results.push(id);\n }\n }\n return results;\n}\n\nfunction getOwnerName(node: ts.Node): string | null {\n if (ts.isFunctionDeclaration(node) && node.name) {\n return node.name.text;\n }\n if (ts.isClassDeclaration(node) && node.name) {\n return node.name.text;\n }\n if (ts.isInterfaceDeclaration(node)) {\n return node.name.text;\n }\n if (ts.isTypeAliasDeclaration(node)) {\n return node.name.text;\n }\n if (ts.isEnumDeclaration(node)) {\n return node.name.text;\n }\n if (ts.isVariableStatement(node)) {\n const decl = node.declarationList.declarations[0];\n if (decl && ts.isIdentifier(decl.name)) {\n return decl.name.text;\n }\n }\n return null;\n}\n","import ts from \"typescript\";\nimport { relative } from \"node:path\";\nimport type Database from \"better-sqlite3\";\nimport { containsJsx } from \"./react-utils.js\";\n\nexport interface ComponentInfo {\n symbolId: string;\n isClient: boolean;\n isServerAction: boolean;\n hasState: boolean;\n contextProviders: string[];\n contextConsumers: string[];\n propsType: string | null;\n}\n\n/**\n * Detect file-level directives: \"use client\" or \"use server\".\n * These appear as the first statement in a file as a string literal expression.\n */\nfunction getFileDirective(\n sourceFile: ts.SourceFile,\n): \"use client\" | \"use server\" | null {\n for (const stmt of sourceFile.statements) {\n if (\n ts.isExpressionStatement(stmt) &&\n ts.isStringLiteral(stmt.expression)\n ) {\n const text = stmt.expression.text;\n if (text === \"use client\") return \"use client\";\n if (text === \"use server\") return \"use server\";\n }\n // Directives must be at the top; stop at the first non-directive statement\n break;\n }\n return null;\n}\n\n/**\n * Analyze a component function body for state usage and context patterns.\n */\nfunction analyzeComponentBody(\n node: ts.Node,\n _checker: ts.TypeChecker,\n): {\n hasState: boolean;\n contextProviders: string[];\n contextConsumers: string[];\n} {\n let hasState = false;\n const contextProviders = new Set<string>();\n const contextConsumers = new Set<string>();\n\n function walk(n: ts.Node): void {\n if (ts.isCallExpression(n)) {\n const name = getCallName(n);\n\n // useState / useReducer → has state\n if (name === \"useState\" || name === \"useReducer\") {\n hasState = true;\n }\n\n // useContext(XContext) → consumer\n if (name === \"useContext\" && n.arguments.length > 0) {\n const arg = n.arguments[0]!;\n const ctxName = getExpressionName(arg);\n if (ctxName) {\n contextConsumers.add(ctxName);\n }\n }\n }\n\n // <XContext.Provider> → provider\n if (ts.isJsxSelfClosingElement(n) || ts.isJsxOpeningElement(n)) {\n const tagName = n.tagName;\n if (\n ts.isPropertyAccessExpression(tagName) &&\n ts.isIdentifier(tagName.name) &&\n tagName.name.text === \"Provider\"\n ) {\n const ctxName = getExpressionName(tagName.expression);\n if (ctxName) {\n contextProviders.add(ctxName);\n }\n }\n }\n\n ts.forEachChild(n, walk);\n }\n\n walk(node);\n\n return {\n hasState,\n contextProviders: [...contextProviders],\n contextConsumers: [...contextConsumers],\n };\n}\n\nfunction getCallName(callExpr: ts.CallExpression): string | null {\n const expr = callExpr.expression;\n if (ts.isIdentifier(expr)) return expr.text;\n if (\n ts.isPropertyAccessExpression(expr) &&\n ts.isIdentifier(expr.name)\n ) {\n return expr.name.text;\n }\n return null;\n}\n\nfunction getExpressionName(expr: ts.Node): string | null {\n if (ts.isIdentifier(expr)) return expr.text;\n return null;\n}\n\n/**\n * Extract props type from a component function's first parameter.\n */\nfunction getPropsType(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n checker: ts.TypeChecker,\n): string | null {\n const params = node.parameters;\n if (params.length === 0) return null;\n\n const firstParam = params[0]!;\n const type = checker.getTypeAtLocation(firstParam);\n const typeStr = checker.typeToString(type);\n\n // Skip empty or trivial types\n if (typeStr === \"{}\" || typeStr === \"any\") return null;\n return typeStr;\n}\n\n/**\n * Extract component information from source files and populate the components table.\n */\nexport function analyzeComponents(\n sourceFiles: readonly ts.SourceFile[],\n checker: ts.TypeChecker,\n projectRoot: string,\n db: Database.Database,\n): number {\n const components: ComponentInfo[] = [];\n\n for (const sf of sourceFiles) {\n const relPath = relative(projectRoot, sf.fileName);\n const directive = getFileDirective(sf);\n const isClient = directive === \"use client\";\n const isServerAction = directive === \"use server\";\n\n // Find component symbols in this file\n ts.forEachChild(sf, (node) => {\n // Function declaration components\n if (ts.isFunctionDeclaration(node) && node.name) {\n const name = node.name.text;\n if (!/^[A-Z]/.test(name)) return;\n if (!node.body || !containsJsx(node.body)) return;\n\n const symbolId = `${relPath}::${name}#component`;\n const analysis = analyzeComponentBody(node.body, checker);\n const propsType = getPropsType(node, checker);\n\n components.push({\n symbolId,\n isClient,\n isServerAction,\n hasState: analysis.hasState,\n contextProviders: analysis.contextProviders,\n contextConsumers: analysis.contextConsumers,\n propsType,\n });\n }\n\n // Variable declaration components (arrow functions, memo, forwardRef)\n if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (!ts.isIdentifier(decl.name)) continue;\n const name = decl.name.text;\n if (!/^[A-Z]/.test(name)) continue;\n\n const init = decl.initializer;\n if (!init) continue;\n\n let body: ts.Node | undefined;\n let funcNode: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression | undefined;\n\n if (ts.isArrowFunction(init) || ts.isFunctionExpression(init)) {\n body = init.body;\n funcNode = init;\n } else if (ts.isCallExpression(init)) {\n // React.memo() / React.forwardRef() wrappers\n for (const arg of init.arguments) {\n if (ts.isArrowFunction(arg) || ts.isFunctionExpression(arg)) {\n body = arg.body;\n funcNode = arg;\n break;\n }\n }\n }\n\n if (!body || !containsJsx(body)) continue;\n\n const symbolId = `${relPath}::${name}#component`;\n const analysis = analyzeComponentBody(body, checker);\n const propsType = funcNode ? getPropsType(funcNode, checker) : null;\n\n components.push({\n symbolId,\n isClient,\n isServerAction,\n hasState: analysis.hasState,\n contextProviders: analysis.contextProviders,\n contextConsumers: analysis.contextConsumers,\n propsType,\n });\n }\n }\n });\n }\n\n // Write to database\n writeComponents(db, components);\n return components.length;\n}\n\nfunction writeComponents(\n db: Database.Database,\n components: ComponentInfo[],\n): void {\n if (components.length === 0) return;\n\n // Clear existing components and re-insert\n db.prepare(\"DELETE FROM components\").run();\n\n const insert = db.prepare(`\n INSERT OR IGNORE INTO components (\n symbol_id, is_client, is_server_action, has_state,\n context_providers, context_consumers, props_type\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n // Build set of existing symbol IDs for bulk lookup (avoids N+1 queries)\n const existingIds = new Set(\n (db.prepare(\"SELECT id FROM symbols\").all() as { id: string }[]).map((r) => r.id),\n );\n\n const run = db.transaction(() => {\n for (const c of components) {\n if (!existingIds.has(c.symbolId)) continue;\n\n insert.run(\n c.symbolId,\n c.isClient ? 1 : 0,\n c.isServerAction ? 1 : 0,\n c.hasState ? 1 : 0,\n JSON.stringify(c.contextProviders),\n JSON.stringify(c.contextConsumers),\n c.propsType,\n );\n }\n });\n\n run();\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport type Database from \"better-sqlite3\";\n\nexport interface ExtractedRoute {\n id: string;\n routePath: string;\n kind: \"page\" | \"layout\" | \"loading\" | \"error\" | \"not-found\" | \"api-route\" | \"middleware\";\n httpMethods: string[];\n hasAuth: boolean;\n parentLayout: string | null;\n service: string;\n}\n\n/** Map from Next.js file convention name to route kind */\nconst FILE_KIND_MAP: Record<string, ExtractedRoute[\"kind\"]> = {\n \"page\": \"page\",\n \"layout\": \"layout\",\n \"loading\": \"loading\",\n \"error\": \"error\",\n \"not-found\": \"not-found\",\n \"route\": \"api-route\",\n};\n\nconst TS_EXTENSIONS = [\".tsx\", \".ts\", \".jsx\", \".js\"];\n\n/**\n * Analyze the Next.js app/ directory and populate the routes table.\n */\nexport function analyzeRoutes(\n projectRoot: string,\n db: Database.Database,\n service: string = \"main\",\n): number {\n const appDir = join(projectRoot, \"app\");\n if (!existsSync(appDir) || !statSync(appDir).isDirectory()) {\n return 0;\n }\n\n const routes: ExtractedRoute[] = [];\n const layoutStack: string[] = [];\n\n // Check for root middleware\n for (const ext of TS_EXTENSIONS) {\n const middlewarePath = join(projectRoot, `middleware${ext}`);\n if (existsSync(middlewarePath)) {\n routes.push({\n id: `route::middleware`,\n routePath: \"/\",\n kind: \"middleware\",\n httpMethods: [],\n hasAuth: false,\n parentLayout: null,\n service,\n });\n break;\n }\n }\n\n walkAppDir(appDir, \"/\", routes, layoutStack, service, projectRoot);\n\n // Write to database\n writeRoutes(db, routes);\n return routes.length;\n}\n\nfunction walkAppDir(\n dir: string,\n routePath: string,\n routes: ExtractedRoute[],\n layoutStack: string[],\n service: string,\n projectRoot: string,\n): void {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n\n const currentLayout = layoutStack.length > 0\n ? layoutStack[layoutStack.length - 1]!\n : null;\n\n // Check for convention files in this directory\n for (const [convention, kind] of Object.entries(FILE_KIND_MAP)) {\n for (const ext of TS_EXTENSIONS) {\n const filePath = join(dir, `${convention}${ext}`);\n if (existsSync(filePath)) {\n const relPath = relative(projectRoot, dir);\n const routeId = `route::${relPath}/${convention}`;\n\n const route: ExtractedRoute = {\n id: routeId,\n routePath,\n kind,\n httpMethods: [],\n hasAuth: false,\n parentLayout: currentLayout,\n service,\n };\n\n // For API routes, extract HTTP methods\n if (kind === \"api-route\") {\n route.httpMethods = extractHttpMethods(filePath);\n }\n\n routes.push(route);\n\n // Track layout for children\n if (kind === \"layout\") {\n layoutStack.push(routeId);\n }\n\n break; // Only pick first matching extension\n }\n }\n }\n\n // Recurse into subdirectories\n for (const entry of entries.sort()) {\n const fullPath = join(dir, entry);\n try {\n if (!statSync(fullPath).isDirectory()) continue;\n } catch {\n continue;\n }\n // Skip hidden dirs, node_modules, and parallel route slots (@modal, @sidebar)\n if (entry.startsWith(\".\") || entry.startsWith(\"@\") || entry === \"node_modules\") continue;\n\n const childPath = buildRoutePath(routePath, entry);\n walkAppDir(fullPath, childPath, routes, [...layoutStack], service, projectRoot);\n }\n}\n\n/**\n * Build the URL route path from a directory segment.\n * Handles: route groups (parentheses), dynamic segments [param], catch-all [...slug].\n */\nfunction buildRoutePath(parentPath: string, segment: string): string {\n // Route groups: (auth) → no URL segment\n if (segment.startsWith(\"(\") && segment.endsWith(\")\")) {\n return parentPath;\n }\n\n // Optional catch-all: [[...slug]] → *slug?\n const optionalCatchAll = segment.match(/^\\[\\[\\.\\.\\.(.+)\\]\\]$/);\n if (optionalCatchAll) {\n const name = optionalCatchAll[1]!;\n return parentPath === \"/\" ? `/*${name}?` : `${parentPath}/*${name}?`;\n }\n\n // Dynamic segments: [param] → :param\n const dynamicMatch = segment.match(/^\\[(.+)\\]$/);\n if (dynamicMatch) {\n const param = dynamicMatch[1]!;\n // Catch-all: [...slug] → *slug\n if (param.startsWith(\"...\")) {\n const slug = parentPath === \"/\" ? `/*${param.slice(3)}` : `${parentPath}/*${param.slice(3)}`;\n return slug;\n }\n return parentPath === \"/\" ? `/:${param}` : `${parentPath}/:${param}`;\n }\n\n return parentPath === \"/\" ? `/${segment}` : `${parentPath}/${segment}`;\n}\n\n/**\n * Extract HTTP method exports (GET, POST, PUT, DELETE, PATCH) from an API route file.\n */\nfunction extractHttpMethods(filePath: string): string[] {\n const content = readFileSync(filePath, \"utf-8\");\n const methods: string[] = [];\n const httpMethods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"];\n\n for (const method of httpMethods) {\n // Match: export function GET, export async function GET, export const GET\n const pattern = new RegExp(\n `export\\\\s+(?:async\\\\s+)?(?:function|const)\\\\s+${method}\\\\b`,\n );\n if (pattern.test(content)) {\n methods.push(method);\n }\n }\n\n return methods;\n}\n\nfunction writeRoutes(\n db: Database.Database,\n routes: ExtractedRoute[],\n): void {\n if (routes.length === 0) return;\n\n // Clear existing routes and re-insert\n db.prepare(\"DELETE FROM routes\").run();\n\n const insert = db.prepare(`\n INSERT OR IGNORE INTO routes (\n id, route_path, kind, http_methods, has_auth, parent_layout, service\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n const run = db.transaction(() => {\n for (const r of routes) {\n insert.run(\n r.id,\n r.routePath,\n r.kind,\n JSON.stringify(r.httpMethods),\n r.hasAuth ? 1 : 0,\n r.parentLayout,\n r.service,\n );\n }\n });\n\n run();\n}\n","import { createHash } from \"node:crypto\";\n\nexport function hashContent(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n}\n","import type Database from \"better-sqlite3\";\nimport type { ExtractedSymbol } from \"./types.js\";\nimport type { ExtractedDependency } from \"./dependency-extractor.js\";\n\nexport function getExistingHashes(\n db: Database.Database,\n service: string,\n): Map<string, string> {\n const rows = db\n .prepare(\n \"SELECT DISTINCT file_path, content_hash FROM symbols WHERE service = ?\",\n )\n .all(service) as { file_path: string; content_hash: string }[];\n\n const map = new Map<string, string>();\n for (const row of rows) {\n map.set(row.file_path, row.content_hash);\n }\n return map;\n}\n\nexport function removeSymbolsForFiles(\n db: Database.Database,\n filePaths: string[],\n): void {\n if (filePaths.length === 0) return;\n\n const deleteSymbols = db.prepare(\n \"DELETE FROM symbols WHERE file_path = ?\",\n );\n\n // Clean up dependent tables before deleting symbols (FK constraints)\n const deleteDepsSource = db.prepare(\n \"DELETE FROM dependencies WHERE source_symbol IN (SELECT id FROM symbols WHERE file_path = ?)\",\n );\n const deleteDepsTarget = db.prepare(\n \"DELETE FROM dependencies WHERE target_symbol IN (SELECT id FROM symbols WHERE file_path = ?)\",\n );\n const deleteComponents = db.prepare(\n \"DELETE FROM components WHERE symbol_id IN (SELECT id FROM symbols WHERE file_path = ?)\",\n );\n\n const run = db.transaction(() => {\n for (const fp of filePaths) {\n deleteDepsSource.run(fp);\n deleteDepsTarget.run(fp);\n deleteComponents.run(fp);\n deleteSymbols.run(fp);\n }\n });\n\n run();\n}\n\nexport function writeSymbols(\n db: Database.Database,\n symbols: ExtractedSymbol[],\n service: string,\n language: string = \"typescript\",\n): void {\n if (symbols.length === 0) return;\n\n const insert = db.prepare(`\n INSERT OR REPLACE INTO symbols (\n id, name, qualified_name, kind, file_path,\n start_line, end_line, start_col, end_col,\n signature, return_type, doc_comment,\n is_exported, is_async, service, language,\n content_hash, indexed_at\n ) VALUES (\n ?, ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?\n )\n `);\n\n const now = new Date().toISOString();\n\n const run = db.transaction(() => {\n for (const s of symbols) {\n insert.run(\n s.id,\n s.name,\n s.qualifiedName,\n s.kind,\n s.filePath,\n s.startLine,\n s.endLine,\n s.startCol,\n s.endCol,\n s.signature,\n s.returnType,\n s.docComment,\n s.isExported ? 1 : 0,\n s.isAsync ? 1 : 0,\n service,\n language,\n s.contentHash,\n now,\n );\n }\n });\n\n run();\n}\n\nexport function writeDependencies(\n db: Database.Database,\n dependencies: ExtractedDependency[],\n): void {\n if (dependencies.length === 0) return;\n\n const insert = db.prepare(`\n INSERT OR IGNORE INTO dependencies (source_symbol, target_symbol, kind)\n VALUES (?, ?, ?)\n `);\n\n const run = db.transaction(() => {\n for (const dep of dependencies) {\n insert.run(dep.sourceSymbolId, dep.targetSymbolId, dep.kind);\n }\n });\n\n run();\n}\n","import { execFileSync } from \"node:child_process\";\nimport { resolve, join, dirname, relative, basename } from \"node:path\";\nimport { readdirSync, readFileSync, existsSync, accessSync, constants } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport type Database from \"better-sqlite3\";\nimport type { IndexResult, ExtractedSymbol } from \"./types.js\";\nimport type { ExtractedDependency } from \"./dependency-extractor.js\";\nimport {\n getExistingHashes,\n removeSymbolsForFiles,\n writeSymbols,\n writeDependencies,\n} from \"./db-writer.js\";\n\nexport interface DotnetIndexerOptions {\n projectRoot: string;\n service?: string;\n /** Explicit path to .csproj or .sln. If omitted, auto-detected from projectRoot. */\n csprojPath?: string;\n}\n\n/** JSON shape emitted by the .NET console app */\ninterface DotnetIndexerOutput {\n symbols: Array<{\n id: string;\n name: string;\n qualifiedName: string;\n kind: string;\n filePath: string;\n startLine: number;\n endLine: number;\n startCol: number;\n endCol: number;\n signature: string | null;\n returnType: string | null;\n docComment: string | null;\n isExported: boolean;\n isAsync: boolean;\n contentHash: string;\n projectName?: string;\n }>;\n dependencies: Array<{\n sourceSymbolId: string;\n targetSymbolId: string;\n kind: string;\n }>;\n routes: Array<{\n id: string;\n routePath: string;\n kind: string;\n httpMethods: string[];\n hasAuth: boolean;\n handlerSymbolId?: string;\n }>;\n changedFiles: string[];\n removedFiles: string[];\n filesProcessed: number;\n filesSkipped: number;\n durationMs: number;\n}\n\n/**\n * Find .sln or .csproj in the project root.\n * Prefers .sln if present, falls back to .csproj.\n */\nexport function findDotnetProject(projectRoot: string): string | null {\n try {\n const entries = readdirSync(projectRoot);\n const sln = entries.find((e) => e.endsWith(\".sln\"));\n if (sln) return join(projectRoot, sln);\n const csproj = entries.find((e) => e.endsWith(\".csproj\"));\n if (csproj) return join(projectRoot, csproj);\n return null;\n } catch {\n return null;\n }\n}\n\n/** Represents a .NET project discovered in a solution. */\nexport interface DotnetProjectInfo {\n /** Project name (without .csproj extension) */\n name: string;\n /** Relative path from solution root to .csproj directory */\n path: string;\n /** Full path to the .csproj file */\n csprojPath: string;\n /** Whether this is a test project (name contains Test/Tests) */\n isTestProject: boolean;\n}\n\n/**\n * Parse a .sln file to discover all .csproj projects.\n * Returns project info for each non-test project found.\n */\nexport function parseSolutionProjects(slnPath: string): DotnetProjectInfo[] {\n const content = readFileSync(slnPath, \"utf-8\");\n const slnDir = dirname(slnPath);\n const projects: DotnetProjectInfo[] = [];\n\n // Match Project(\"{...}\") = \"Name\", \"Path\\To\\Project.csproj\", \"{...}\"\n const projectPattern = /Project\\(\"\\{[^}]+\\}\"\\)\\s*=\\s*\"([^\"]+)\",\\s*\"([^\"]+\\.csproj)\"/g;\n let match: RegExpExecArray | null;\n\n while ((match = projectPattern.exec(content)) !== null) {\n const name = match[1];\n const relativeCsprojPath = match[2].replace(/\\\\/g, \"/\");\n const fullCsprojPath = resolve(join(slnDir, relativeCsprojPath));\n\n if (!existsSync(fullCsprojPath)) continue;\n\n const projectDir = relative(slnDir, dirname(fullCsprojPath)).replace(/\\\\/g, \"/\") || \".\";\n // Match .NET test project naming conventions: MyApp.Tests, MyApp.UnitTests, etc.\n // But NOT names that merely start with \"Test\" like TestApi\n const isTestProject = /[.\\x2d]tests?$/i.test(name) ||\n /[.\\x2d](unit|integration|functional|e2e)tests?$/i.test(name);\n\n projects.push({\n name,\n path: projectDir,\n csprojPath: fullCsprojPath,\n isTestProject,\n });\n }\n\n return projects;\n}\n\n/**\n * Discover services from a .NET solution.\n * Returns service configs for non-test projects.\n * Test projects are excluded since they don't represent deployable services.\n */\nexport function discoverDotnetServices(projectRoot: string): DotnetProjectInfo[] {\n const slnPath = findDotnetProject(projectRoot);\n if (!slnPath || !slnPath.endsWith(\".sln\")) {\n // Single .csproj — return one project\n const csproj = slnPath;\n if (!csproj) return [];\n const name = basename(csproj, \".csproj\");\n return [{\n name,\n path: \".\",\n csprojPath: csproj,\n isTestProject: /[.\\x2d]tests?$/i.test(name) ||\n /[.\\x2d](unit|integration|functional|e2e)tests?$/i.test(name),\n }];\n }\n\n return parseSolutionProjects(slnPath);\n}\n\n/**\n * Check if the arcbridge-dotnet-indexer global tool is available on PATH.\n * Searches PATH directories directly (no dependency on which/where, works\n * in minimal containers where those may be missing).\n */\nexport function hasGlobalTool(): boolean {\n const pathEnv = process.env.PATH ?? \"\";\n const dirs = pathEnv.split(process.platform === \"win32\" ? \";\" : \":\");\n const name = \"arcbridge-dotnet-indexer\";\n const extensions = process.platform === \"win32\"\n ? (process.env.PATHEXT ?? \".COM;.EXE;.BAT;.CMD\").split(\";\")\n : [\"\"];\n\n for (const dir of dirs) {\n if (!dir) continue;\n for (const ext of extensions) {\n try {\n accessSync(join(dir, `${name}${ext}`), constants.X_OK);\n return true;\n } catch {\n continue;\n }\n }\n }\n return false;\n}\n\n/**\n * Resolve the path to the .NET indexer project (monorepo source fallback).\n * Looks relative to this package (core) up to the monorepo root.\n * Returns null if not found (e.g., running from installed npm package).\n */\nfunction resolveIndexerProject(): string | null {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n\n const candidates = [\n resolve(currentDir, \"../../../../dotnet-indexer/ArcBridge.DotnetIndexer.csproj\"),\n resolve(currentDir, \"../../../dotnet-indexer/ArcBridge.DotnetIndexer.csproj\"),\n resolve(currentDir, \"../../dotnet-indexer/ArcBridge.DotnetIndexer.csproj\"),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\n/**\n * Check if the monorepo indexer project is available (for development/source fallback).\n */\nexport function hasIndexerProject(): boolean {\n return resolveIndexerProject() !== null;\n}\n\nconst EXEC_OPTIONS = {\n encoding: \"utf-8\" as const,\n maxBuffer: 50 * 1024 * 1024, // 50MB for large projects\n timeout: 300_000, // 5 minutes\n};\n\n/**\n * Run the .NET indexer, trying global tool first, then monorepo source.\n */\nfunction runDotnetIndexer(\n dotnetProject: string,\n hashesJson: string,\n cwd: string,\n): string {\n const args = [dotnetProject, \"--existing-hashes\", hashesJson];\n\n // 1. Try the global tool unless ARCBRIDGE_PREFER_SOURCE is set\n // (useful for development/testing to ensure monorepo source is exercised)\n const preferSource = process.env.ARCBRIDGE_PREFER_SOURCE === \"1\";\n let globalToolError: unknown = null;\n if (!preferSource && hasGlobalTool()) {\n try {\n return execFileSync(\"arcbridge-dotnet-indexer\", args, { ...EXEC_OPTIONS, cwd });\n } catch (err) {\n globalToolError = err;\n }\n }\n\n // 2. Fall back to monorepo source (dotnet run --project)\n const indexerProject = resolveIndexerProject();\n if (!indexerProject) {\n const base =\n \"Roslyn C# indexer not available. Either install the global tool \" +\n \"(`dotnet tool install -g arcbridge-dotnet-indexer`) or run from the ArcBridge monorepo.\";\n if (globalToolError) {\n const msg = globalToolError instanceof Error ? globalToolError.message : String(globalToolError);\n throw new Error(`${base} Global tool was found but failed: ${msg}`, { cause: globalToolError });\n }\n throw new Error(base);\n }\n\n try {\n return execFileSync(\n \"dotnet\",\n [\"run\", \"--project\", indexerProject, \"--no-build\", \"--\", ...args],\n { ...EXEC_OPTIONS, cwd },\n );\n } catch {\n // Retry with build (first run may not have been built)\n try {\n return execFileSync(\n \"dotnet\",\n [\"run\", \"--project\", indexerProject, \"--\", ...args],\n { ...EXEC_OPTIONS, cwd },\n );\n } catch (retryErr) {\n const message = retryErr instanceof Error ? retryErr.message : String(retryErr);\n throw new Error(`.NET indexer failed: ${message}`, { cause: retryErr });\n }\n }\n}\n\n/**\n * Index a .NET project by shelling out to the Roslyn-based .NET indexer.\n * Parses the JSON output and writes symbols/dependencies/routes to SQLite.\n */\nexport function indexDotnetProjectRoslyn(\n db: Database.Database,\n options: DotnetIndexerOptions,\n): IndexResult {\n const start = Date.now();\n const service = options.service ?? \"main\";\n const projectRoot = resolve(options.projectRoot);\n\n // Find the .NET project/solution to analyze\n const dotnetProject = options.csprojPath ?? findDotnetProject(projectRoot);\n if (!dotnetProject) {\n throw new Error(\n \"No .sln or .csproj file found in project root. \" +\n \"The .NET indexer requires a project or solution file.\",\n );\n }\n\n // Get existing hashes for incremental indexing\n const existingHashes = getExistingHashes(db, service);\n const hashesJson = JSON.stringify(Object.fromEntries(existingHashes));\n\n // Shell out to the .NET indexer — prefer global tool, fall back to monorepo source\n const stdout = runDotnetIndexer(dotnetProject, hashesJson, projectRoot);\n\n // Parse JSON output (take last line that looks like JSON to skip any build output)\n const lines = stdout.trim().split(\"\\n\");\n const jsonLine = lines.reverse().find((l) => l.startsWith(\"{\"));\n if (!jsonLine) {\n throw new Error(\"No JSON output from .NET indexer\");\n }\n\n let output: DotnetIndexerOutput;\n try {\n output = JSON.parse(jsonLine);\n } catch {\n throw new Error(\n `Failed to parse .NET indexer JSON output. First 200 chars: ${jsonLine.slice(0, 200)}`,\n );\n }\n\n // Remove stale symbols for changed + removed files\n const filesToClean = [...output.changedFiles, ...output.removedFiles];\n removeSymbolsForFiles(db, filesToClean);\n\n // All symbols from all projects in the solution go under one service.\n // In a typical .NET solution (MyApp.Api, MyApp.Domain, MyApp.Infrastructure),\n // these are layers of the same service, not separate services.\n // Agents can still filter by file_path prefix to scope to a specific layer.\n const symbols: ExtractedSymbol[] = output.symbols.map((s) => ({\n id: s.id,\n name: s.name,\n qualifiedName: s.qualifiedName,\n kind: s.kind as ExtractedSymbol[\"kind\"],\n filePath: s.filePath,\n startLine: s.startLine,\n endLine: s.endLine,\n startCol: s.startCol,\n endCol: s.endCol,\n signature: s.signature,\n returnType: s.returnType,\n docComment: s.docComment,\n isExported: s.isExported,\n isAsync: s.isAsync,\n contentHash: s.contentHash,\n }));\n\n writeSymbols(db, symbols, service, \"csharp\");\n\n // Write dependencies\n const deps: ExtractedDependency[] = output.dependencies.map((d) => ({\n sourceSymbolId: d.sourceSymbolId,\n targetSymbolId: d.targetSymbolId,\n kind: d.kind as ExtractedDependency[\"kind\"],\n }));\n\n // Clear existing deps for service and re-insert\n db.prepare(\n \"DELETE FROM dependencies WHERE source_symbol IN (SELECT id FROM symbols WHERE service = ? AND language = 'csharp')\",\n ).run(service);\n writeDependencies(db, deps);\n\n // Clean up stale routes before inserting\n db.prepare(\"DELETE FROM routes WHERE service = ?\").run(service);\n\n // Write routes\n if (output.routes.length > 0) {\n const insertRoute = db.prepare(`\n INSERT OR REPLACE INTO routes (id, route_path, kind, http_methods, has_auth, service)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n const runRoutes = db.transaction(() => {\n for (const route of output.routes) {\n insertRoute.run(\n route.id,\n route.routePath,\n route.kind,\n JSON.stringify(route.httpMethods),\n route.hasAuth ? 1 : 0,\n service,\n );\n }\n });\n\n runRoutes();\n }\n\n return {\n symbolsIndexed: output.symbols.length,\n dependenciesIndexed: output.dependencies.length,\n componentsAnalyzed: 0, // N/A for .NET\n routesAnalyzed: output.routes.length,\n filesProcessed: output.filesProcessed,\n filesSkipped: output.filesSkipped,\n filesRemoved: output.removedFiles.length,\n durationMs: Date.now() - start,\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type Database from \"better-sqlite3\";\nimport { globbySync } from \"globby\";\nimport type { IndexResult, ExtractedSymbol } from \"../types.js\";\nimport type { ExtractedDependency } from \"../dependency-extractor.js\";\nimport { hashContent } from \"../content-hash.js\";\nimport {\n getExistingHashes,\n removeSymbolsForFiles,\n writeSymbols,\n writeDependencies,\n} from \"../db-writer.js\";\nimport { ensureCSharpParser, parseCSharp } from \"./parser.js\";\nimport { extractCSharpSymbols } from \"./symbol-extractor.js\";\nimport {\n extractCSharpDependencies,\n buildCSharpSymbolLookup,\n type SymbolForDeps,\n} from \"./dependency-extractor.js\";\nimport { extractCSharpRoutes, type CSharpRoute } from \"./route-analyzer.js\";\n\nexport interface CSharpTreeSitterOptions {\n projectRoot: string;\n service?: string;\n}\n\n/**\n * Index a C# project using tree-sitter (no .NET SDK required).\n * Mirrors the TypeScript indexer flow: discover → hash → parse → extract → write.\n */\nexport async function indexCSharpTreeSitter(\n db: Database.Database,\n options: CSharpTreeSitterOptions,\n): Promise<IndexResult> {\n const start = Date.now();\n\n // One-time async init of the WASM-based tree-sitter parser\n await ensureCSharpParser();\n const service = options.service ?? \"main\";\n const projectRoot = options.projectRoot;\n\n // 1. Discover .cs files (skip bin/obj/node_modules/.git)\n const csFiles = globbySync(\"**/*.cs\", {\n cwd: projectRoot,\n ignore: [\"**/bin/**\", \"**/obj/**\", \"**/node_modules/**\", \"**/.git/**\"],\n absolute: false,\n });\n\n // 2. Read all files once, hash, and parse — cache for reuse across phases\n const existingHashes = getExistingHashes(db, service);\n const currentPaths = new Set<string>();\n const fileCache = new Map<string, { content: string; tree: ReturnType<typeof parseCSharp> }>();\n\n const changedFiles: string[] = [];\n let filesSkipped = 0;\n\n for (const filePath of csFiles) {\n const relPath = filePath.replace(/\\\\/g, \"/\");\n currentPaths.add(relPath);\n\n const fullPath = join(projectRoot, relPath);\n const content = readFileSync(fullPath, \"utf-8\");\n const hash = hashContent(content);\n const tree = parseCSharp(content);\n fileCache.set(relPath, { content, tree });\n\n const existingHash = existingHashes.get(relPath);\n if (existingHash === hash) {\n filesSkipped++;\n } else {\n changedFiles.push(relPath);\n }\n }\n\n // 3. Find removed files\n const removed: string[] = [];\n for (const existingPath of existingHashes.keys()) {\n if (!currentPaths.has(existingPath)) {\n removed.push(existingPath);\n }\n }\n\n // 4. Remove stale symbols for changed + removed files\n // TODO: removeSymbolsForFiles deletes by file_path without service scoping —\n // safe when services use distinct file paths (typical), but could collide in\n // edge cases. Same limitation exists in the TypeScript indexer.\n const filesToClean = [...removed, ...changedFiles];\n removeSymbolsForFiles(db, filesToClean);\n\n // 5. Extract symbols from changed files\n const allNewSymbols: ExtractedSymbol[] = [];\n for (const relPath of changedFiles) {\n const cached = fileCache.get(relPath);\n if (!cached) continue;\n const symbols = extractCSharpSymbols(cached.tree, relPath, cached.content);\n allNewSymbols.push(...symbols);\n }\n\n // 6. Write symbols to DB\n writeSymbols(db, allNewSymbols, service, \"csharp\");\n\n // 7. Build symbol lookup from ALL db symbols for this service\n const allDbSymbols = db\n .prepare(\"SELECT id, file_path as filePath, name, kind, start_line as startLine, end_line as endLine FROM symbols WHERE service = ?\")\n .all(service) as SymbolForDeps[];\n\n const symbolLookup = buildCSharpSymbolLookup(allDbSymbols);\n\n // 8. Extract dependencies from ALL files (cross-file deps need full context)\n const allDeps: ExtractedDependency[] = [];\n for (const [relPath, cached] of fileCache) {\n const fileDeps = extractCSharpDependencies(cached.tree, relPath, allDbSymbols, symbolLookup);\n allDeps.push(...fileDeps);\n }\n\n // Clear deps for service and re-insert\n db.prepare(\n \"DELETE FROM dependencies WHERE source_symbol IN (SELECT id FROM symbols WHERE service = ? AND language = 'csharp')\",\n ).run(service);\n writeDependencies(db, allDeps);\n\n // 9. Extract routes from ALL files\n const allRoutes: CSharpRoute[] = [];\n for (const [relPath, cached] of fileCache) {\n const routes = extractCSharpRoutes(cached.tree, relPath);\n allRoutes.push(...routes);\n }\n\n // Clean up stale routes before inserting\n db.prepare(\"DELETE FROM routes WHERE service = ?\").run(service);\n\n if (allRoutes.length > 0) {\n const insertRoute = db.prepare(`\n INSERT OR REPLACE INTO routes (id, route_path, kind, http_methods, has_auth, service)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n const runRoutes = db.transaction(() => {\n for (const route of allRoutes) {\n insertRoute.run(\n route.id,\n route.routePath,\n route.kind,\n JSON.stringify(route.httpMethods),\n route.hasAuth ? 1 : 0,\n service,\n );\n }\n });\n\n runRoutes();\n }\n\n return {\n symbolsIndexed: allNewSymbols.length,\n dependenciesIndexed: allDeps.length,\n componentsAnalyzed: 0,\n routesAnalyzed: allRoutes.length,\n filesProcessed: changedFiles.length,\n filesSkipped,\n filesRemoved: removed.length,\n durationMs: Date.now() - start,\n };\n}\n","import { accessSync, constants } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { type Parser, type Tree } from \"web-tree-sitter\";\n\nconst currentDir = dirname(fileURLToPath(import.meta.url));\n\nlet cachedParser: Parser | null = null;\nlet initPromise: Promise<Parser> | null = null;\n\n/**\n * Resolve the path to the vendored C# grammar WASM file.\n * Handles both source (src/indexer/csharp/) and dist (dist/) layouts.\n */\nfunction resolveGrammarPath(): string {\n const candidates = [\n resolve(currentDir, \"../../../wasm/tree-sitter-c_sharp.wasm\"), // from src/indexer/csharp/\n resolve(currentDir, \"../wasm/tree-sitter-c_sharp.wasm\"), // from dist/ (tsup flat bundle)\n ];\n\n for (const candidate of candidates) {\n try {\n accessSync(candidate, constants.R_OK);\n return candidate;\n } catch {\n continue;\n }\n }\n\n throw new Error(\n \"Could not find tree-sitter-c_sharp.wasm. \" +\n \"Ensure the wasm/ directory is present in the @arcbridge/core package.\",\n );\n}\n\n/**\n * Initialize the web-tree-sitter parser with the C# grammar.\n * Must be called (and awaited) before parseCSharp().\n * Safe to call multiple times — returns cached parser after first init.\n */\nexport async function ensureCSharpParser(): Promise<Parser> {\n if (cachedParser) return cachedParser;\n\n // Deduplicate concurrent init calls\n if (initPromise) return initPromise;\n\n initPromise = (async () => {\n try {\n const TreeSitter = await import(\"web-tree-sitter\");\n await TreeSitter.Parser.init();\n const grammarPath = resolveGrammarPath();\n const CSharp = await TreeSitter.Language.load(grammarPath);\n const parser = new TreeSitter.Parser();\n parser.setLanguage(CSharp);\n cachedParser = parser;\n return parser;\n } catch (err) {\n initPromise = null; // allow retry on next call\n throw err;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Parse C# source code. Requires ensureCSharpParser() to have been awaited first.\n * Throws if the parser has not been initialized.\n */\nexport function parseCSharp(content: string): Tree {\n if (!cachedParser) {\n throw new Error(\n \"C# parser not initialized. Call await ensureCSharpParser() first.\",\n );\n }\n const tree = cachedParser.parse(content);\n if (!tree) {\n throw new Error(\"Failed to parse C# content\");\n }\n return tree;\n}\n","import type { ExtractedSymbol, SymbolKind } from \"../types.js\";\nimport { hashContent } from \"../content-hash.js\";\n\ninterface TreeSitterNode {\n type: string;\n text: string;\n startPosition: { row: number; column: number };\n endPosition: { row: number; column: number };\n children: TreeSitterNode[];\n childCount: number;\n child(index: number): TreeSitterNode | null;\n namedChildren: TreeSitterNode[];\n childForFieldName(name: string): TreeSitterNode | null;\n previousSibling: TreeSitterNode | null;\n parent: TreeSitterNode | null;\n}\n\n/**\n * Extract symbols from a tree-sitter CST of a C# file.\n */\nexport function extractCSharpSymbols(\n tree: { rootNode: TreeSitterNode },\n relativePath: string,\n fileContent: string,\n): ExtractedSymbol[] {\n const symbols: ExtractedSymbol[] = [];\n const contentHash = hashContent(fileContent);\n\n // Handle file-scoped namespaces: they apply to all subsequent siblings\n const root = tree.rootNode;\n let fileScopedNamespace: string | null = null;\n\n for (const child of root.namedChildren) {\n if (child.type === \"file_scoped_namespace_declaration\") {\n fileScopedNamespace = getNamespaceName(child);\n // Also walk children in case grammar nests declarations inside the namespace node\n for (const nested of child.namedChildren) {\n walkNode(nested, fileScopedNamespace, null, relativePath, contentHash, symbols);\n }\n continue;\n }\n walkNode(child, fileScopedNamespace, null, relativePath, contentHash, symbols);\n }\n\n return symbols;\n}\n\nfunction walkNode(\n node: TreeSitterNode,\n currentNamespace: string | null,\n currentTypeName: string | null,\n relativePath: string,\n contentHash: string,\n symbols: ExtractedSymbol[],\n): void {\n switch (node.type) {\n case \"namespace_declaration\":\n case \"file_scoped_namespace_declaration\": {\n const nsName = getNamespaceName(node);\n for (const child of node.namedChildren) {\n walkNode(child, nsName, currentTypeName, relativePath, contentHash, symbols);\n }\n return;\n }\n\n case \"class_declaration\":\n case \"record_declaration\":\n case \"struct_declaration\": {\n const name = getIdentifierName(node);\n if (!name) break;\n const qualifiedName = qualify(currentNamespace, name);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"class\",\n node,\n relativePath,\n contentHash,\n modifiers: getModifiers(node),\n docComment: extractDocComment(node),\n }));\n // Walk members with this type as context\n for (const child of node.namedChildren) {\n walkNode(child, currentNamespace, qualifiedName, relativePath, contentHash, symbols);\n }\n return;\n }\n\n case \"interface_declaration\": {\n const name = getIdentifierName(node);\n if (!name) break;\n const qualifiedName = qualify(currentNamespace, name);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"interface\",\n node,\n relativePath,\n contentHash,\n modifiers: getModifiers(node),\n docComment: extractDocComment(node),\n }));\n // Walk interface members\n for (const child of node.namedChildren) {\n walkNode(child, currentNamespace, qualifiedName, relativePath, contentHash, symbols);\n }\n return;\n }\n\n case \"enum_declaration\": {\n const name = getIdentifierName(node);\n if (!name) break;\n const qualifiedName = qualify(currentNamespace, name);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"enum\",\n node,\n relativePath,\n contentHash,\n modifiers: getModifiers(node),\n docComment: extractDocComment(node),\n }));\n return;\n }\n\n case \"delegate_declaration\": {\n const name = getIdentifierName(node);\n if (!name) break;\n const qualifiedName = qualify(currentNamespace, name);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"type\",\n node,\n relativePath,\n contentHash,\n modifiers: getModifiers(node),\n docComment: extractDocComment(node),\n }));\n return;\n }\n\n case \"method_declaration\": {\n const name = getIdentifierName(node);\n if (!name) break;\n const qualifiedName = currentTypeName ? `${currentTypeName}.${name}` : qualify(currentNamespace, name);\n const modifiers = getModifiers(node);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"function\",\n node,\n relativePath,\n contentHash,\n modifiers,\n docComment: extractDocComment(node),\n signature: extractMethodSignature(node),\n returnType: extractReturnType(node),\n isAsync: modifiers.has(\"async\"),\n }));\n return;\n }\n\n case \"constructor_declaration\": {\n const parentName = currentTypeName?.split(\".\").pop() ?? \"\";\n const name = \".ctor\";\n const qualifiedName = currentTypeName ? `${currentTypeName}.${name}` : name;\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"function\",\n node,\n relativePath,\n contentHash,\n modifiers: getModifiers(node),\n docComment: extractDocComment(node),\n signature: extractConstructorSignature(node, parentName),\n }));\n return;\n }\n\n case \"property_declaration\": {\n const name = getIdentifierName(node);\n if (!name) break;\n const qualifiedName = currentTypeName ? `${currentTypeName}.${name}` : qualify(currentNamespace, name);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: \"variable\",\n node,\n relativePath,\n contentHash,\n modifiers: getModifiers(node),\n docComment: extractDocComment(node),\n }));\n return;\n }\n\n case \"field_declaration\": {\n const varDeclarator = findChild(node, \"variable_declaration\");\n if (!varDeclarator) break;\n const declarators = varDeclarator.namedChildren.filter(\n (c) => c.type === \"variable_declarator\",\n );\n const modifiers = getModifiers(node);\n const isConst = modifiers.has(\"const\");\n\n for (const decl of declarators) {\n const name = getIdentifierName(decl);\n if (!name) continue;\n const qualifiedName = currentTypeName ? `${currentTypeName}.${name}` : qualify(currentNamespace, name);\n symbols.push(makeSymbol({\n name,\n qualifiedName,\n kind: isConst ? \"constant\" : \"variable\",\n node,\n relativePath,\n contentHash,\n modifiers,\n docComment: extractDocComment(node),\n }));\n }\n return;\n }\n }\n\n // Continue walking for nodes not handled above\n for (const child of node.namedChildren) {\n walkNode(child, currentNamespace, currentTypeName, relativePath, contentHash, symbols);\n }\n}\n\ninterface MakeSymbolArgs {\n name: string;\n qualifiedName: string;\n kind: SymbolKind;\n node: TreeSitterNode;\n relativePath: string;\n contentHash: string;\n modifiers: Set<string>;\n docComment: string | null;\n signature?: string | null;\n returnType?: string | null;\n isAsync?: boolean;\n}\n\nfunction makeSymbol(args: MakeSymbolArgs): ExtractedSymbol {\n const { name, qualifiedName, kind, node, relativePath, contentHash, modifiers, docComment } = args;\n return {\n id: `${relativePath}::${qualifiedName}#${kind}`,\n name,\n qualifiedName,\n kind,\n filePath: relativePath,\n startLine: node.startPosition.row + 1,\n endLine: node.endPosition.row + 1,\n startCol: node.startPosition.column + 1,\n endCol: node.endPosition.column + 1,\n signature: args.signature ?? null,\n returnType: args.returnType ?? null,\n docComment,\n isExported: modifiers.has(\"public\") || modifiers.has(\"internal\"),\n isAsync: args.isAsync ?? modifiers.has(\"async\"),\n contentHash,\n };\n}\n\nfunction qualify(ns: string | null, name: string): string {\n return ns ? `${ns}.${name}` : name;\n}\n\nfunction getIdentifierName(node: TreeSitterNode): string | null {\n const nameNode = node.childForFieldName(\"name\");\n if (nameNode) return nameNode.text;\n\n // Fallback: find first identifier child\n for (const child of node.namedChildren) {\n if (child.type === \"identifier\") return child.text;\n }\n return null;\n}\n\nfunction getNamespaceName(node: TreeSitterNode): string {\n const nameNode = node.childForFieldName(\"name\");\n if (nameNode) return nameNode.text;\n\n // For qualified names (e.g., Foo.Bar.Baz), look for the name child\n for (const child of node.namedChildren) {\n if (child.type === \"qualified_name\" || child.type === \"identifier\") {\n return child.text;\n }\n }\n return \"\";\n}\n\nfunction getModifiers(node: TreeSitterNode): Set<string> {\n const mods = new Set<string>();\n for (const child of node.children) {\n if (child.type === \"modifier\") {\n mods.add(child.text);\n }\n }\n return mods;\n}\n\nfunction findChild(node: TreeSitterNode, type: string): TreeSitterNode | null {\n for (const child of node.namedChildren) {\n if (child.type === type) return child;\n }\n return null;\n}\n\nfunction extractDocComment(node: TreeSitterNode): string | null {\n // Look at preceding siblings or comments before the node\n const comments: string[] = [];\n let sibling = node.previousSibling;\n\n while (sibling) {\n if (sibling.type === \"comment\" && sibling.text.startsWith(\"///\")) {\n comments.unshift(sibling.text);\n } else if (sibling.type !== \"attribute_list\") {\n // Stop if we hit something that isn't a doc comment or attribute\n break;\n }\n sibling = sibling.previousSibling;\n }\n\n if (comments.length === 0) return null;\n\n // Extract text from XML doc comments\n const fullComment = comments.join(\"\\n\");\n const summaryMatch = fullComment.match(/<summary>\\s*([\\s\\S]*?)\\s*<\\/summary>/);\n if (summaryMatch) {\n return summaryMatch[1]\n .split(\"\\n\")\n .map((line) => line.replace(/^\\s*\\/\\/\\/\\s?/, \"\").trim())\n .filter(Boolean)\n .join(\" \");\n }\n\n // No <summary> tags — just strip /// prefixes\n return comments\n .map((c) => c.replace(/^\\s*\\/\\/\\/\\s?/, \"\").trim())\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction extractMethodSignature(node: TreeSitterNode): string | null {\n const paramList = findChild(node, \"parameter_list\");\n if (!paramList) return null;\n\n const name = getIdentifierName(node) ?? \"method\";\n return `${name}${paramList.text}`;\n}\n\nfunction extractConstructorSignature(node: TreeSitterNode, typeName: string): string | null {\n const paramList = findChild(node, \"parameter_list\");\n if (!paramList) return null;\n return `${typeName}${paramList.text}`;\n}\n\nfunction extractReturnType(node: TreeSitterNode): string | null {\n const typeNode = node.childForFieldName(\"type\");\n if (typeNode) return typeNode.text;\n\n // Fallback: first named child that looks like a type\n for (const child of node.namedChildren) {\n if (\n child.type === \"predefined_type\" ||\n child.type === \"generic_name\" ||\n child.type === \"identifier\" ||\n child.type === \"nullable_type\" ||\n child.type === \"array_type\" ||\n child.type === \"qualified_name\"\n ) {\n return child.text;\n }\n // Stop at parameter list — types come before it\n if (child.type === \"parameter_list\") break;\n }\n return null;\n}\n","import type { ExtractedDependency, DependencyKind } from \"../dependency-extractor.js\";\n\n/** Minimum fields needed from symbols for dependency extraction */\nexport interface SymbolForDeps {\n id: string;\n name: string;\n filePath: string;\n kind: string;\n startLine: number;\n endLine: number;\n}\n\ninterface TreeSitterNode {\n type: string;\n text: string;\n startPosition: { row: number; column: number };\n endPosition: { row: number; column: number };\n namedChildren: TreeSitterNode[];\n children: TreeSitterNode[];\n childForFieldName(name: string): TreeSitterNode | null;\n parent: TreeSitterNode | null;\n}\n\n/**\n * Build a lookup map from simple names to symbol IDs.\n * Used for name-based dependency resolution (no semantic model).\n */\nexport function buildCSharpSymbolLookup(\n symbols: SymbolForDeps[],\n): Map<string, string[]> {\n const lookup = new Map<string, string[]>();\n for (const sym of symbols) {\n // Index by simple name\n const existing = lookup.get(sym.name);\n if (existing) {\n existing.push(sym.id);\n } else {\n lookup.set(sym.name, [sym.id]);\n }\n }\n return lookup;\n}\n\n/**\n * Extract dependencies from a parsed C# file using name-based resolution.\n * Requires a symbol lookup built from all indexed symbols.\n */\nexport function extractCSharpDependencies(\n tree: { rootNode: TreeSitterNode },\n relativePath: string,\n allSymbols: SymbolForDeps[],\n symbolLookup: Map<string, string[]>,\n): ExtractedDependency[] {\n const deps: ExtractedDependency[] = [];\n const seen = new Set<string>();\n\n // Get symbols defined in this file (potential sources)\n const fileSymbols = allSymbols.filter((s) => s.filePath === relativePath);\n\n walkForDependencies(tree.rootNode, fileSymbols, symbolLookup, deps, seen);\n return deps;\n}\n\nfunction walkForDependencies(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n lookup: Map<string, string[]>,\n deps: ExtractedDependency[],\n seen: Set<string>,\n): void {\n switch (node.type) {\n case \"class_declaration\":\n case \"record_declaration\":\n case \"struct_declaration\":\n extractInheritanceDeps(node, fileSymbols, lookup, deps, seen);\n break;\n\n case \"interface_declaration\":\n extractInheritanceDeps(node, fileSymbols, lookup, deps, seen);\n break;\n\n case \"invocation_expression\":\n extractCallDeps(node, fileSymbols, lookup, deps, seen);\n break;\n\n case \"object_creation_expression\":\n extractTypeUsageDep(node, fileSymbols, lookup, deps, seen);\n break;\n }\n\n // Extract type usage from parameter types, return types, variable types\n if (\n node.type === \"parameter\" ||\n node.type === \"variable_declaration\" ||\n node.type === \"property_declaration\"\n ) {\n extractTypeRefDeps(node, fileSymbols, lookup, deps, seen);\n }\n\n for (const child of node.namedChildren) {\n walkForDependencies(child, fileSymbols, lookup, deps, seen);\n }\n}\n\n/**\n * Extract extends/implements from base_list.\n */\nfunction extractInheritanceDeps(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n lookup: Map<string, string[]>,\n deps: ExtractedDependency[],\n seen: Set<string>,\n): void {\n const typeName = getNodeIdentifier(node);\n if (!typeName) return;\n\n const sourceSymbol = findEnclosingSymbol(typeName, fileSymbols, \"class\", \"interface\");\n if (!sourceSymbol) return;\n\n const baseList = findChild(node, \"base_list\");\n if (!baseList) return;\n\n for (const child of baseList.namedChildren) {\n const baseName = extractSimpleTypeName(child);\n if (!baseName) continue;\n\n // Skip self-references\n if (baseName === typeName) continue;\n\n // Heuristic: interface names start with I + uppercase\n const isInterface = /^I[A-Z]/.test(baseName);\n const kind: DependencyKind = isInterface ? \"implements\" : \"extends\";\n\n const targetIds = lookup.get(baseName);\n if (!targetIds) continue;\n\n for (const targetId of targetIds) {\n // Skip self-references\n if (targetId === sourceSymbol.id) continue;\n addDep(deps, seen, sourceSymbol.id, targetId, kind);\n }\n }\n}\n\n/**\n * Extract calls dependencies from invocation expressions.\n */\nfunction extractCallDeps(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n lookup: Map<string, string[]>,\n deps: ExtractedDependency[],\n seen: Set<string>,\n): void {\n const methodName = extractInvokedMethodName(node);\n if (!methodName) return;\n\n // Find the enclosing function/method that contains this call\n const enclosingMethod = findEnclosingMethodForNode(node, fileSymbols);\n if (!enclosingMethod) return;\n\n const targetIds = lookup.get(methodName);\n if (!targetIds) return;\n\n for (const targetId of targetIds) {\n if (targetId === enclosingMethod.id) continue;\n addDep(deps, seen, enclosingMethod.id, targetId, \"calls\");\n }\n}\n\n/**\n * Extract uses_type from object creation (new X()).\n */\nfunction extractTypeUsageDep(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n lookup: Map<string, string[]>,\n deps: ExtractedDependency[],\n seen: Set<string>,\n): void {\n const typeName = extractSimpleTypeName(node);\n if (!typeName) return;\n\n const enclosing = findEnclosingMethodForNode(node, fileSymbols);\n if (!enclosing) return;\n\n const targetIds = lookup.get(typeName);\n if (!targetIds) return;\n\n for (const targetId of targetIds) {\n if (targetId === enclosing.id) continue;\n addDep(deps, seen, enclosing.id, targetId, \"uses_type\");\n }\n}\n\n/**\n * Extract uses_type from type references in parameters, properties, variables.\n */\nfunction extractTypeRefDeps(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n lookup: Map<string, string[]>,\n deps: ExtractedDependency[],\n seen: Set<string>,\n): void {\n const typeNames = collectTypeIdentifiers(node);\n if (typeNames.length === 0) return;\n\n // Find enclosing symbol (method for params, type for properties)\n const enclosing = findEnclosingSymbolForNode(node, fileSymbols);\n if (!enclosing) return;\n\n for (const typeName of typeNames) {\n const targetIds = lookup.get(typeName);\n if (!targetIds) continue;\n\n for (const targetId of targetIds) {\n if (targetId === enclosing.id) continue;\n addDep(deps, seen, enclosing.id, targetId, \"uses_type\");\n }\n }\n}\n\n// --- Helpers ---\n\nfunction addDep(\n deps: ExtractedDependency[],\n seen: Set<string>,\n source: string,\n target: string,\n kind: DependencyKind,\n): void {\n const key = `${source}|${target}|${kind}`;\n if (seen.has(key)) return;\n seen.add(key);\n deps.push({ sourceSymbolId: source, targetSymbolId: target, kind });\n}\n\nfunction findChild(node: TreeSitterNode, type: string): TreeSitterNode | null {\n for (const child of node.namedChildren) {\n if (child.type === type) return child;\n }\n return null;\n}\n\nfunction getNodeIdentifier(node: TreeSitterNode): string | null {\n const nameNode = node.childForFieldName(\"name\");\n if (nameNode) return nameNode.text;\n for (const child of node.namedChildren) {\n if (child.type === \"identifier\") return child.text;\n }\n return null;\n}\n\nfunction extractSimpleTypeName(node: TreeSitterNode): string | null {\n // Walk through to find the actual type name, handling generics and qualified names\n for (const child of node.namedChildren) {\n if (child.type === \"identifier\") return child.text;\n if (child.type === \"generic_name\") {\n const nameNode = child.childForFieldName(\"name\") ?? findChild(child, \"identifier\");\n return nameNode?.text ?? null;\n }\n if (child.type === \"qualified_name\") {\n // Take the last part\n const parts = child.text.split(\".\");\n return parts[parts.length - 1];\n }\n }\n\n if (node.type === \"identifier\") return node.text;\n if (node.type === \"generic_name\") {\n const nameNode = node.childForFieldName(\"name\") ?? findChild(node, \"identifier\");\n return nameNode?.text ?? null;\n }\n\n return null;\n}\n\nfunction extractInvokedMethodName(node: TreeSitterNode): string | null {\n // invocation_expression has function child\n const funcNode = node.childForFieldName(\"function\");\n if (!funcNode) return node.namedChildren[0]?.text ?? null;\n\n if (funcNode.type === \"member_access_expression\") {\n const nameNode = funcNode.childForFieldName(\"name\");\n return nameNode?.text ?? null;\n }\n\n if (funcNode.type === \"identifier\") {\n return funcNode.text;\n }\n\n return null;\n}\n\nfunction findEnclosingSymbol(\n name: string,\n fileSymbols: SymbolForDeps[],\n ...kinds: string[]\n): SymbolForDeps | undefined {\n return fileSymbols.find(\n (s) => s.name === name && kinds.includes(s.kind),\n );\n}\n\nfunction findEnclosingMethodForNode(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n): SymbolForDeps | undefined {\n // Walk up tree to find enclosing method/constructor\n let current: TreeSitterNode | null = node.parent;\n while (current) {\n if (\n current.type === \"method_declaration\" ||\n current.type === \"constructor_declaration\"\n ) {\n const methodName = getNodeIdentifier(current);\n const name = current.type === \"constructor_declaration\" ? \".ctor\" : methodName;\n if (name) {\n return fileSymbols.find(\n (s) => s.kind === \"function\" && s.name === name &&\n s.startLine <= (current!.startPosition.row + 1) &&\n s.endLine >= (current!.endPosition.row + 1),\n );\n }\n }\n current = current.parent;\n }\n return undefined;\n}\n\nfunction findEnclosingSymbolForNode(\n node: TreeSitterNode,\n fileSymbols: SymbolForDeps[],\n): SymbolForDeps | undefined {\n // First try method, then type\n let current: TreeSitterNode | null = node.parent;\n while (current) {\n if (\n current.type === \"method_declaration\" ||\n current.type === \"constructor_declaration\"\n ) {\n const name = current.type === \"constructor_declaration\"\n ? \".ctor\"\n : getNodeIdentifier(current);\n if (name) {\n const found = fileSymbols.find(\n (s) => s.kind === \"function\" && s.name === name &&\n s.startLine <= (current!.startPosition.row + 1) &&\n s.endLine >= (current!.endPosition.row + 1),\n );\n if (found) return found;\n }\n }\n if (\n current.type === \"class_declaration\" ||\n current.type === \"struct_declaration\" ||\n current.type === \"record_declaration\" ||\n current.type === \"interface_declaration\"\n ) {\n const name = getNodeIdentifier(current);\n if (name) {\n return fileSymbols.find(\n (s) => s.name === name && (s.kind === \"class\" || s.kind === \"interface\"),\n );\n }\n }\n current = current.parent;\n }\n return undefined;\n}\n\nfunction collectTypeIdentifiers(node: TreeSitterNode): string[] {\n const names: string[] = [];\n collectTypeIdentifiersRecursive(node, names);\n return [...new Set(names)];\n}\n\nfunction collectTypeIdentifiersRecursive(node: TreeSitterNode, names: string[]): void {\n if (node.type === \"identifier\" && isTypeContext(node)) {\n names.push(node.text);\n } else if (node.type === \"generic_name\") {\n const nameNode = node.childForFieldName(\"name\") ?? findChild(node, \"identifier\");\n if (nameNode) names.push(nameNode.text);\n }\n\n for (const child of node.namedChildren) {\n collectTypeIdentifiersRecursive(child, names);\n }\n}\n\nfunction isTypeContext(node: TreeSitterNode): boolean {\n const parent = node.parent;\n if (!parent) return false;\n // Type identifiers appear in specific contexts\n return (\n parent.type === \"type_argument_list\" ||\n parent.type === \"generic_name\" ||\n parent.type === \"qualified_name\" ||\n parent.type === \"base_list\" ||\n parent.type === \"type_constraint\" ||\n // Direct type annotation (after :)\n (parent.type === \"parameter\" && node !== parent.childForFieldName(\"name\")) ||\n (parent.type === \"variable_declaration\" && node === parent.namedChildren[0]) ||\n parent.type === \"nullable_type\" ||\n parent.type === \"array_type\"\n );\n}\n","interface TreeSitterNode {\n type: string;\n text: string;\n namedChildren: TreeSitterNode[];\n children: TreeSitterNode[];\n childForFieldName(name: string): TreeSitterNode | null;\n parent: TreeSitterNode | null;\n}\n\nexport interface CSharpRoute {\n id: string;\n routePath: string;\n kind: \"api-route\";\n httpMethods: string[];\n hasAuth: boolean;\n handlerSymbolId?: string;\n}\n\nconst HTTP_ATTRIBUTE_MAP: Record<string, string> = {\n HttpGet: \"GET\",\n HttpPost: \"POST\",\n HttpPut: \"PUT\",\n HttpDelete: \"DELETE\",\n HttpPatch: \"PATCH\",\n HttpHead: \"HEAD\",\n HttpOptions: \"OPTIONS\",\n};\n\nconst MINIMAL_API_MAP: Record<string, string> = {\n MapGet: \"GET\",\n MapPost: \"POST\",\n MapPut: \"PUT\",\n MapDelete: \"DELETE\",\n MapPatch: \"PATCH\",\n};\n\n/**\n * Extract ASP.NET routes from a parsed C# file.\n * Handles both controller-based and minimal API patterns.\n */\nexport function extractCSharpRoutes(\n tree: { rootNode: TreeSitterNode },\n relativePath: string,\n): CSharpRoute[] {\n const routes: CSharpRoute[] = [];\n\n extractControllerRoutes(tree.rootNode, routes, relativePath);\n extractMinimalApiRoutes(tree.rootNode, routes, relativePath);\n\n return routes;\n}\n\n// --- Controller-based routes ---\n\nfunction extractControllerRoutes(\n root: TreeSitterNode,\n routes: CSharpRoute[],\n _relativePath: string,\n): void {\n const classes = findAllNodes(root, \"class_declaration\");\n\n for (const cls of classes) {\n if (!isControllerClass(cls)) continue;\n\n const classRoute = getRoutePrefix(cls);\n const className = getIdentifier(cls);\n const classHasAuth = hasAuthorizeAttribute(cls);\n\n // Find methods with HTTP attributes\n const methods = findAllNodes(cls, \"method_declaration\");\n for (const method of methods) {\n const httpInfo = getHttpMethodFromAttributes(method);\n if (!httpInfo) continue;\n\n const methodHasAuth = hasAuthorizeAttribute(method);\n\n // Build route path\n let routePath = classRoute ?? \"\";\n if (httpInfo.template) {\n routePath = routePath ? `${routePath}/${httpInfo.template}` : httpInfo.template;\n }\n\n // Replace [controller] placeholder\n if (className && routePath.includes(\"[controller]\")) {\n const controllerName = className.replace(/Controller$/, \"\").toLowerCase();\n routePath = routePath.replace(\"[controller]\", controllerName);\n }\n\n // Ensure leading slash\n routePath = routePath.startsWith(\"/\") ? routePath : `/${routePath}`;\n\n const id = `route::${routePath.slice(1)}::${httpInfo.method}`;\n routes.push({\n id,\n routePath,\n kind: \"api-route\",\n httpMethods: [httpInfo.method],\n hasAuth: classHasAuth || methodHasAuth,\n });\n }\n }\n}\n\nfunction isControllerClass(node: TreeSitterNode): boolean {\n // Check for [ApiController] attribute\n if (hasAttribute(node, \"ApiController\")) return true;\n\n // Check for ControllerBase in base list\n const baseList = findChild(node, \"base_list\");\n if (baseList && baseList.text.includes(\"ControllerBase\")) return true;\n if (baseList && baseList.text.includes(\"Controller\")) return true;\n\n return false;\n}\n\nfunction getRoutePrefix(node: TreeSitterNode): string | null {\n const attrs = getAttributes(node);\n for (const attr of attrs) {\n const name = getAttributeName(attr);\n if (name === \"Route\") {\n return getAttributeArgument(attr);\n }\n }\n return null;\n}\n\nfunction getHttpMethodFromAttributes(\n node: TreeSitterNode,\n): { method: string; template: string | null } | null {\n const attrs = getAttributes(node);\n for (const attr of attrs) {\n const name = getAttributeName(attr);\n if (!name) continue;\n\n const httpMethod = HTTP_ATTRIBUTE_MAP[name];\n if (httpMethod) {\n return { method: httpMethod, template: getAttributeArgument(attr) };\n }\n }\n return null;\n}\n\nfunction hasAuthorizeAttribute(node: TreeSitterNode): boolean {\n return hasAttribute(node, \"Authorize\");\n}\n\n// --- Minimal API routes ---\n\nfunction extractMinimalApiRoutes(\n root: TreeSitterNode,\n routes: CSharpRoute[],\n _relativePath: string,\n): void {\n // Find MapGroup calls to track prefixes\n const groupPrefixes = new Map<string, string>();\n extractGroupPrefixes(root, groupPrefixes);\n\n // Find Map{Method} calls\n const invocations = findAllNodes(root, \"invocation_expression\");\n for (const invocation of invocations) {\n const methodName = getInvokedMethodName(invocation);\n if (!methodName) continue;\n\n const httpMethod = MINIMAL_API_MAP[methodName];\n if (!httpMethod) continue;\n\n // Get the route template from the first argument\n const template = getFirstStringArgument(invocation);\n if (template === null) continue;\n\n // Determine the receiver to check for group prefix\n const receiver = getReceiverName(invocation);\n const prefix = receiver ? (groupPrefixes.get(receiver) ?? \"\") : \"\";\n\n // Check for .RequireAuthorization() in the chain\n const hasAuth = hasRequireAuthorization(invocation);\n\n let routePath: string;\n if (prefix && template) {\n routePath = `${prefix}/${template}`;\n } else if (prefix) {\n routePath = prefix;\n } else {\n routePath = template;\n }\n routePath = routePath.startsWith(\"/\") ? routePath : `/${routePath}`;\n // Clean up multiple slashes and trailing slashes (but keep root /)\n routePath = routePath.replace(/\\/{2,}/g, \"/\").replace(/\\/+$/, \"\") || \"/\";\n\n const id = `route::${routePath.slice(1)}::${httpMethod}`;\n routes.push({\n id,\n routePath,\n kind: \"api-route\",\n httpMethods: [httpMethod],\n hasAuth,\n });\n }\n}\n\nfunction extractGroupPrefixes(\n node: TreeSitterNode,\n prefixes: Map<string, string>,\n): void {\n if (node.type === \"invocation_expression\") {\n const methodName = getInvokedMethodName(node);\n if (methodName === \"MapGroup\") {\n const prefix = getFirstStringArgument(node);\n if (prefix !== null) {\n // Find the variable this is assigned to\n const parent = node.parent;\n if (parent?.type === \"variable_declarator\") {\n const varName = getIdentifier(parent);\n if (varName) {\n prefixes.set(varName, prefix);\n }\n } else if (parent?.type === \"equals_value_clause\") {\n const grandParent = parent.parent;\n if (grandParent?.type === \"variable_declarator\") {\n const varName = getIdentifier(grandParent);\n if (varName) {\n prefixes.set(varName, prefix);\n }\n }\n }\n }\n }\n }\n\n for (const child of node.namedChildren) {\n extractGroupPrefixes(child, prefixes);\n }\n}\n\nfunction hasRequireAuthorization(node: TreeSitterNode): boolean {\n // Check if the invocation is part of a chain that includes .RequireAuthorization()\n // Pattern: mapCall(...).RequireAuthorization(...)\n let current: TreeSitterNode | null = node.parent;\n\n // Walk up looking for member_access_expression → invocation_expression patterns\n while (current) {\n if (current.type === \"invocation_expression\") {\n const methodName = getInvokedMethodName(current);\n if (methodName === \"RequireAuthorization\") return true;\n }\n if (current.type === \"member_access_expression\") {\n current = current.parent;\n continue;\n }\n // Check if we're inside a larger expression statement\n if (current.type === \"expression_statement\") {\n // Search the full text for RequireAuthorization\n if (current.text.includes(\"RequireAuthorization\")) return true;\n break;\n }\n current = current.parent;\n }\n\n return false;\n}\n\n// --- Attribute helpers ---\n\nfunction getAttributes(node: TreeSitterNode): TreeSitterNode[] {\n const attrs: TreeSitterNode[] = [];\n for (const child of node.namedChildren) {\n if (child.type === \"attribute_list\") {\n for (const attr of child.namedChildren) {\n if (attr.type === \"attribute\") {\n attrs.push(attr);\n }\n }\n }\n }\n return attrs;\n}\n\nfunction hasAttribute(node: TreeSitterNode, name: string): boolean {\n const attrs = getAttributes(node);\n return attrs.some((a) => getAttributeName(a) === name);\n}\n\nfunction getAttributeName(attr: TreeSitterNode): string | null {\n const nameNode = attr.childForFieldName(\"name\");\n if (nameNode) return nameNode.text;\n for (const child of attr.namedChildren) {\n if (child.type === \"identifier\") return child.text;\n }\n return null;\n}\n\nfunction getAttributeArgument(attr: TreeSitterNode): string | null {\n const argList = findChild(attr, \"attribute_argument_list\");\n if (!argList) return null;\n\n // Find the first string literal argument\n for (const arg of argList.namedChildren) {\n const expr = arg.type === \"attribute_argument\"\n ? arg.namedChildren[0]\n : arg;\n if (expr?.type === \"string_literal\" || expr?.type === \"verbatim_string_literal\") {\n // Remove quotes\n return expr.text.replace(/^[@$]*\"|\"$/g, \"\");\n }\n }\n\n // Check for named arguments like Name = \"...\"\n for (const arg of argList.namedChildren) {\n for (const child of arg.namedChildren) {\n if (child.type === \"string_literal\" || child.type === \"verbatim_string_literal\") {\n return child.text.replace(/^[@$]*\"|\"$/g, \"\");\n }\n }\n }\n\n return null;\n}\n\n// --- General node helpers ---\n\nfunction findChild(node: TreeSitterNode, type: string): TreeSitterNode | null {\n for (const child of node.namedChildren) {\n if (child.type === type) return child;\n }\n return null;\n}\n\nfunction findAllNodes(root: TreeSitterNode, type: string): TreeSitterNode[] {\n const results: TreeSitterNode[] = [];\n function walk(node: TreeSitterNode): void {\n if (node.type === type) results.push(node);\n for (const child of node.namedChildren) {\n walk(child);\n }\n }\n walk(root);\n return results;\n}\n\nfunction getIdentifier(node: TreeSitterNode): string | null {\n const nameNode = node.childForFieldName(\"name\");\n if (nameNode) return nameNode.text;\n for (const child of node.namedChildren) {\n if (child.type === \"identifier\") return child.text;\n }\n return null;\n}\n\nfunction getInvokedMethodName(node: TreeSitterNode): string | null {\n const funcNode = node.childForFieldName(\"function\");\n if (!funcNode) return node.namedChildren[0]?.text ?? null;\n\n if (funcNode.type === \"member_access_expression\") {\n const nameNode = funcNode.childForFieldName(\"name\");\n return nameNode?.text ?? null;\n }\n if (funcNode.type === \"identifier\") {\n return funcNode.text;\n }\n return null;\n}\n\nfunction getReceiverName(node: TreeSitterNode): string | null {\n const funcNode = node.childForFieldName(\"function\");\n if (!funcNode || funcNode.type !== \"member_access_expression\") return null;\n const expr = funcNode.childForFieldName(\"expression\");\n if (expr?.type === \"identifier\") return expr.text;\n return null;\n}\n\nfunction getFirstStringArgument(node: TreeSitterNode): string | null {\n const argList = findChild(node, \"argument_list\");\n if (!argList) return null;\n\n for (const arg of argList.namedChildren) {\n const expr = arg.type === \"argument\" ? arg.namedChildren[0] : arg;\n if (expr?.type === \"string_literal\" || expr?.type === \"verbatim_string_literal\") {\n return expr.text.replace(/^[@$]*\"|\"$/g, \"\");\n }\n }\n return null;\n}\n","import { join } from \"node:path\";\nimport { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport type Database from \"better-sqlite3\";\n\nexport interface PackageDependency {\n name: string;\n version: string | null;\n source: \"npm\" | \"npm-dev\" | \"nuget\";\n}\n\n/**\n * Scan the project root for package dependency manifests (package.json, .csproj)\n * and write discovered dependencies to the package_dependencies table.\n */\nexport function indexPackageDependencies(\n db: Database.Database,\n projectRoot: string,\n service: string = \"main\",\n): number {\n const deps: PackageDependency[] = [];\n\n // Parse package.json (npm)\n const pkgJsonPath = join(projectRoot, \"package.json\");\n if (existsSync(pkgJsonPath)) {\n deps.push(...parsePackageJson(pkgJsonPath));\n }\n\n // Parse all .csproj files (NuGet)\n const csprojFiles = findCsprojFiles(projectRoot);\n for (const csproj of csprojFiles) {\n deps.push(...parseCsproj(csproj));\n }\n\n if (deps.length === 0) return 0;\n\n // Clear existing deps for this service and re-insert\n db.prepare(\"DELETE FROM package_dependencies WHERE service = ?\").run(service);\n\n const insert = db.prepare(\n \"INSERT OR IGNORE INTO package_dependencies (name, version, source, service) VALUES (?, ?, ?, ?)\",\n );\n\n const run = db.transaction(() => {\n for (const dep of deps) {\n insert.run(dep.name, dep.version, dep.source, service);\n }\n });\n\n run();\n return deps.length;\n}\n\n/**\n * Parse package.json for npm dependencies.\n */\nfunction parsePackageJson(filePath: string): PackageDependency[] {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const pkg = JSON.parse(content) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const deps: PackageDependency[] = [];\n\n if (pkg.dependencies) {\n for (const [name, version] of Object.entries(pkg.dependencies)) {\n deps.push({ name, version, source: \"npm\" });\n }\n }\n\n if (pkg.devDependencies) {\n for (const [name, version] of Object.entries(pkg.devDependencies)) {\n deps.push({ name, version, source: \"npm-dev\" });\n }\n }\n\n return deps;\n } catch {\n return [];\n }\n}\n\n/**\n * Parse a .csproj file for NuGet PackageReference entries.\n * Handles the standard MSBuild XML format:\n * <PackageReference Include=\"PackageName\" Version=\"1.2.3\" />\n * <PackageReference Include=\"PackageName\" Version=\"1.2.3\"></PackageReference>\n */\nfunction parseCsproj(filePath: string): PackageDependency[] {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const deps: PackageDependency[] = [];\n\n // Match <PackageReference Include=\"Name\" Version=\"Ver\" />\n // Version can be an attribute or a child element, or omitted (centrally managed)\n const pattern = /<PackageReference\\s+Include=\"([^\"]+)\"(?:\\s+Version=\"([^\"]*)\")?[^>]*\\/?>/gi;\n let match: RegExpExecArray | null;\n\n while ((match = pattern.exec(content)) !== null) {\n deps.push({\n name: match[1],\n version: match[2] ?? null,\n source: \"nuget\",\n });\n }\n\n return deps;\n } catch {\n return [];\n }\n}\n\n/**\n * Find all .csproj files in the project root (recursive, skips bin/obj/node_modules).\n */\nfunction findCsprojFiles(dir: string, maxDepth: number = 4): string[] {\n const results: string[] = [];\n\n function walk(currentDir: string, depth: number): void {\n if (depth > maxDepth) return;\n\n try {\n const entries = readdirSync(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name === \"bin\" || entry.name === \"obj\" || entry.name === \"node_modules\" || entry.name === \".git\") continue;\n\n const fullPath = join(currentDir, entry.name);\n if (entry.isFile() && entry.name.endsWith(\".csproj\")) {\n results.push(fullPath);\n } else if (entry.isDirectory()) {\n walk(fullPath, depth + 1);\n }\n }\n } catch {\n // Permission errors, etc.\n }\n }\n\n walk(dir, 0);\n return results;\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport yaml from \"yaml\";\nimport { ArcBridgeConfigSchema, type ArcBridgeConfig } from \"../schemas/config.js\";\n\n/**\n * Load and validate the ArcBridge config from `.arcbridge/config.yaml`.\n * Returns null if the file doesn't exist or fails validation.\n */\nexport function loadConfig(\n projectRoot: string,\n): { config: ArcBridgeConfig | null; error: string | null } {\n const configPath = join(projectRoot, \".arcbridge\", \"config.yaml\");\n\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = ArcBridgeConfigSchema.safeParse(yaml.parse(raw));\n if (parsed.success) {\n return { config: parsed.data, error: null };\n }\n const issues = parsed.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n return { config: null, error: `Config validation failed: ${issues}` };\n } catch (err) {\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { config: null, error: null };\n }\n return { config: null, error: `Config load error: ${err instanceof Error ? err.message : String(err)}` };\n }\n}\n","import type Database from \"better-sqlite3\";\n\nexport type DriftKind =\n | \"undocumented_module\"\n | \"missing_module\"\n | \"dependency_violation\"\n | \"unlinked_test\"\n | \"stale_adr\"\n | \"new_dependency\";\n\nexport type DriftSeverity = \"info\" | \"warning\" | \"error\";\n\nexport interface DriftEntry {\n kind: DriftKind;\n severity: DriftSeverity;\n description: string;\n affectedBlock: string | null;\n affectedFile: string | null;\n}\n\ninterface BlockRow {\n id: string;\n name: string;\n code_paths: string;\n interfaces: string;\n}\n\ninterface AdrRow {\n id: string;\n title: string;\n affected_files: string;\n}\n\nexport interface DriftOptions {\n /** File paths/prefixes to ignore in undocumented_module checks */\n ignorePaths?: string[];\n /** Project type — used to auto-ignore common framework files */\n projectType?: string;\n}\n\n/** Built-in ignore patterns for known project types */\nconst FRAMEWORK_IGNORES: Record<string, string[]> = {\n \"nextjs-app-router\": [\n \".next/\",\n \"next.config\",\n \"src/app/layout.\",\n \"src/app/page.\",\n \"src/app/not-found.\",\n \"src/app/loading.\",\n \"src/app/error.\",\n \"src/app/global-error.\",\n \"src/middleware.\",\n \"app/layout.\",\n \"app/page.\",\n \"app/not-found.\",\n \"app/loading.\",\n \"app/error.\",\n \"app/global-error.\",\n \"middleware.\",\n ],\n \"react-vite\": [\"src/main.\", \"src/App.\", \"vite.config\"],\n \"api-service\": [\"src/index.\", \"src/app.\", \"src/server.\"],\n \"dotnet-webapi\": [\n \"Program.\", \"Startup.\",\n \"bin/\", \"obj/\",\n \"Properties/\",\n \"Migrations/\",\n \"wwwroot/\",\n ],\n};\n\n/**\n * Run architecture drift detection against the indexed codebase.\n * Compares building block code_paths against actual indexed files,\n * checks cross-block dependencies, and validates ADR references.\n */\nexport function detectDrift(\n db: Database.Database,\n options?: DriftOptions,\n): DriftEntry[] {\n const entries: DriftEntry[] = [];\n\n // Build ignore list from options + framework defaults\n const ignorePaths = [...(options?.ignorePaths ?? [])];\n if (options?.projectType && FRAMEWORK_IGNORES[options.projectType]) {\n ignorePaths.push(...FRAMEWORK_IGNORES[options.projectType]);\n }\n\n detectUndocumentedModules(db, entries, ignorePaths);\n detectMissingModules(db, entries);\n detectDependencyViolations(db, entries);\n detectUnlinkedTests(db, entries);\n detectStaleAdrs(db, entries);\n detectNewDependencies(db, entries);\n\n return entries;\n}\n\n/**\n * Write drift entries to the drift_log table.\n * Clears existing unresolved entries and inserts fresh ones.\n */\nexport function writeDriftLog(\n db: Database.Database,\n entries: DriftEntry[],\n): void {\n // Clear unresolved entries (keep resolved ones for history)\n db.prepare(\"DELETE FROM drift_log WHERE resolution IS NULL\").run();\n\n if (entries.length === 0) return;\n\n const insert = db.prepare(`\n INSERT INTO drift_log (detected_at, kind, severity, description, affected_block, affected_file)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n const now = new Date().toISOString();\n\n const run = db.transaction(() => {\n for (const e of entries) {\n insert.run(now, e.kind, e.severity, e.description, e.affectedBlock, e.affectedFile);\n }\n });\n\n run();\n}\n\n// --- Detection functions ---\n\n/**\n * Find source files that have indexed symbols but don't match any building block's code_paths.\n */\nfunction detectUndocumentedModules(\n db: Database.Database,\n entries: DriftEntry[],\n ignorePaths: string[] = [],\n): void {\n const blocks = db\n .prepare(\"SELECT id, name, code_paths FROM building_blocks\")\n .all() as BlockRow[];\n\n if (blocks.length === 0) return;\n\n // Build a list of all code_path prefixes across all blocks\n const allPrefixes: string[] = [];\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n for (const cp of paths) {\n allPrefixes.push(normalizePath(cp));\n }\n }\n\n if (allPrefixes.length === 0) return;\n\n // Get all unique file paths from symbols\n const filePaths = db\n .prepare(\"SELECT DISTINCT file_path FROM symbols ORDER BY file_path\")\n .all() as { file_path: string }[];\n\n for (const { file_path } of filePaths) {\n const matched = allPrefixes.some((prefix) => fileMatchesPath(file_path, prefix));\n if (!matched) {\n // Skip files matching ignore patterns (framework files, config files, etc.)\n const ignored = ignorePaths.some((pattern) => file_path.startsWith(pattern));\n if (ignored) continue;\n\n entries.push({\n kind: \"undocumented_module\",\n severity: \"warning\",\n description: `File \\`${file_path}\\` has indexed symbols but is not mapped to any building block's code_paths.`,\n affectedBlock: null,\n affectedFile: file_path,\n });\n }\n }\n}\n\n/**\n * Find building blocks whose code_paths reference directories/files with no indexed symbols.\n */\nfunction detectMissingModules(\n db: Database.Database,\n entries: DriftEntry[],\n): void {\n const blocks = db\n .prepare(\"SELECT id, name, code_paths FROM building_blocks\")\n .all() as BlockRow[];\n\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n\n for (const cp of paths) {\n const prefix = normalizePath(cp);\n // Check if any symbol file_path matches this code_path\n const match = db\n .prepare(\"SELECT 1 FROM symbols WHERE file_path LIKE ? LIMIT 1\")\n .get(`${escapeLike(prefix)}%`) as unknown | undefined;\n\n if (!match) {\n entries.push({\n kind: \"missing_module\",\n severity: \"warning\",\n description: `Building block \\`${block.name}\\` (${block.id}) declares code_path \\`${cp}\\` but no indexed symbols match it.`,\n affectedBlock: block.id,\n affectedFile: null,\n });\n }\n }\n }\n}\n\n/**\n * Find dependencies that cross building block boundaries.\n * A dependency violation occurs when a symbol in block A imports/calls a symbol in block B,\n * but block A doesn't declare block B in its interfaces.\n */\nfunction detectDependencyViolations(\n db: Database.Database,\n entries: DriftEntry[],\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 < 2) return;\n\n // Build file → block mapping\n const fileToBlock = new Map<string, string>();\n const blockPrefixes = new Map<string, string[]>();\n\n for (const block of blocks) {\n const paths = safeParseJson<string[]>(block.code_paths, []);\n const prefixes = paths.map(normalizePath);\n blockPrefixes.set(block.id, prefixes);\n }\n\n // Get all file paths and assign them to blocks\n const filePaths = db\n .prepare(\"SELECT DISTINCT file_path FROM symbols\")\n .all() as { file_path: string }[];\n\n for (const { file_path } of filePaths) {\n for (const block of blocks) {\n const prefixes = blockPrefixes.get(block.id) ?? [];\n if (prefixes.some((prefix) => fileMatchesPath(file_path, prefix))) {\n fileToBlock.set(file_path, block.id);\n break; // First match wins\n }\n }\n }\n\n // Build block interface sets (declared allowed dependencies)\n const blockInterfaces = new Map<string, Set<string>>();\n for (const block of blocks) {\n const interfaces = safeParseJson<string[]>(block.interfaces, []);\n blockInterfaces.set(block.id, new Set(interfaces));\n }\n\n // Check all dependencies for cross-block violations\n const crossBlockDeps = db\n .prepare(\n `SELECT\n d.source_symbol, d.target_symbol, d.kind,\n ss.file_path as source_file,\n 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 IN ('imports', 'calls', 'renders')`,\n )\n .all() as {\n source_symbol: string;\n target_symbol: string;\n kind: string;\n source_file: string;\n target_file: string;\n }[];\n\n // Build name lookup for reporting\n const blockNames = new Map(blocks.map((b) => [b.id, b.name]));\n\n // Track violations to avoid duplicates (report per file pair, not per edge)\n const reported = new Set<string>();\n\n for (const dep of crossBlockDeps) {\n const sourceBlock = fileToBlock.get(dep.source_file);\n const targetBlock = fileToBlock.get(dep.target_file);\n\n // Skip if same block, unmapped, or declared interface\n if (!sourceBlock || !targetBlock) continue;\n if (sourceBlock === targetBlock) continue;\n\n const interfaces = blockInterfaces.get(sourceBlock);\n if (interfaces && interfaces.has(targetBlock)) continue;\n\n const key = `${sourceBlock}→${targetBlock}`;\n if (reported.has(key)) continue;\n reported.add(key);\n\n const sourceBlockName = blockNames.get(sourceBlock) ?? sourceBlock;\n const targetBlockName = blockNames.get(targetBlock) ?? targetBlock;\n\n entries.push({\n kind: \"dependency_violation\",\n severity: \"error\",\n description: `Block \\`${sourceBlockName}\\` (${sourceBlock}) depends on block \\`${targetBlockName}\\` (${targetBlock}) but does not declare it in its interfaces.`,\n affectedBlock: sourceBlock,\n affectedFile: dep.source_file,\n });\n }\n}\n\n/**\n * Find quality scenarios with linked_tests that don't match any indexed file paths.\n */\nfunction detectUnlinkedTests(\n db: Database.Database,\n entries: DriftEntry[],\n): void {\n const scenarios = db\n .prepare(\n \"SELECT id, name, linked_tests FROM quality_scenarios WHERE linked_tests != '[]'\",\n )\n .all() as { id: string; name: string; linked_tests: string }[];\n\n // Get all known file paths for fast lookup\n const knownFiles = new Set(\n (\n db\n .prepare(\"SELECT DISTINCT file_path FROM symbols\")\n .all() as { file_path: string }[]\n ).map((r) => r.file_path),\n );\n\n for (const scenario of scenarios) {\n const testPaths = safeParseJson<string[]>(scenario.linked_tests, []);\n\n for (const testPath of testPaths) {\n // Check if any known file starts with (or equals) this path\n const prefix = normalizePath(testPath);\n const found = [...knownFiles].some(\n (fp) => fp === prefix || fp.startsWith(prefix),\n );\n\n if (!found) {\n entries.push({\n kind: \"unlinked_test\",\n severity: \"warning\",\n description: `Quality scenario \\`${scenario.id}: ${scenario.name}\\` links to test path \\`${testPath}\\` but no indexed files match it.`,\n affectedBlock: null,\n affectedFile: testPath,\n });\n }\n }\n }\n}\n\n/**\n * Find ADRs whose affected_files reference paths with no indexed symbols.\n */\nfunction detectStaleAdrs(\n db: Database.Database,\n entries: DriftEntry[],\n): void {\n const adrs = db\n .prepare(\"SELECT id, title, affected_files FROM adrs WHERE status != 'superseded'\")\n .all() as AdrRow[];\n\n for (const adr of adrs) {\n const files = safeParseJson<string[]>(adr.affected_files, []);\n if (files.length === 0) continue;\n\n for (const file of files) {\n const prefix = normalizePath(file);\n const match = db\n .prepare(\"SELECT 1 FROM symbols WHERE file_path LIKE ? LIMIT 1\")\n .get(`${escapeLike(prefix)}%`) as unknown | undefined;\n\n if (!match) {\n entries.push({\n kind: \"stale_adr\",\n severity: \"info\",\n description: `ADR \\`${adr.id}: ${adr.title}\\` references \\`${file}\\` but no indexed symbols match it.`,\n affectedBlock: null,\n affectedFile: file,\n });\n }\n }\n }\n}\n\n/**\n * Find package dependencies (npm/NuGet) that have no corresponding ADR.\n * Flags packages that were likely added without documenting the rationale.\n * Only flags non-trivial packages (skips common tooling/framework deps).\n */\nfunction detectNewDependencies(\n db: Database.Database,\n entries: DriftEntry[],\n): void {\n const packages = db\n .prepare(\"SELECT name, source FROM package_dependencies WHERE source IN ('npm', 'nuget')\")\n .all() as { name: string; source: string }[];\n\n if (packages.length === 0) return;\n\n // Get all ADR text to check if any mention the package\n const adrs = db\n .prepare(\"SELECT id, title, context, decision FROM adrs WHERE status != 'superseded'\")\n .all() as { id: string; title: string; context: string | null; decision: string | null }[];\n\n // Build searchable text from ADRs\n const adrText = adrs\n .map((a) => `${a.title} ${a.context ?? \"\"} ${a.decision ?? \"\"}`.toLowerCase())\n .join(\" \");\n\n // Common packages that don't need ADRs (all lowercase for case-insensitive matching)\n const trivialPackages = new Set([\n // npm\n \"typescript\", \"eslint\", \"prettier\", \"vitest\", \"jest\",\n \"@types/node\", \"@types/react\", \"tsup\", \"tsx\",\n // nuget\n \"microsoft.net.test.sdk\", \"xunit\", \"xunit.runner.visualstudio\",\n \"nunit\", \"nunit3testadapter\", \"coverlet.collector\",\n \"microsoft.aspnetcore.openapi\", \"swashbuckle.aspnetcore\",\n ]);\n\n for (const pkg of packages) {\n if (trivialPackages.has(pkg.name.toLowerCase())) continue;\n\n // Check if any ADR mentions this package\n const pkgLower = pkg.name.toLowerCase();\n if (adrText.includes(pkgLower)) continue;\n\n // Also check for partial matches (e.g., ADR mentions \"Serilog\" matches \"Serilog.Sinks.Console\")\n const baseName = pkgLower.split(/[./]/)[0];\n if (baseName && baseName.length > 3 && adrText.includes(baseName)) continue;\n\n entries.push({\n kind: \"new_dependency\",\n severity: \"info\",\n description: `Package \\`${pkg.name}\\` (${pkg.source}) is used but not mentioned in any ADR. Consider documenting why this dependency was chosen.`,\n affectedBlock: null,\n affectedFile: null,\n });\n }\n}\n\n// --- Helpers ---\n\nfunction normalizePath(codePath: string): string {\n // Remove trailing glob patterns: \"src/lib/**\" → \"src/lib/\", \"src/lib/*\" → \"src/lib/\"\n return codePath.replace(/\\*+\\/?$/, \"\");\n}\n\nfunction fileMatchesPath(filePath: string, prefix: string): boolean {\n // Exact file match or directory prefix match\n return filePath === prefix || filePath.startsWith(prefix);\n}\n\nfunction escapeLike(value: string): string {\n return value.replace(/%/g, \"\\\\%\").replace(/_/g, \"\\\\_\");\n}\n\nfunction 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","import { join } from \"node:path\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { parse, stringify } from \"yaml\";\nimport { TaskFileSchema, PhasesFileSchema } from \"../schemas/phases.js\";\nimport { QualityScenariosFileSchema } from \"../schemas/quality-scenarios.js\";\n\n/**\n * Update a task's status in the YAML task file.\n * Reads the file, updates the matching task, and writes it back.\n */\nexport function syncTaskToYaml(\n projectRoot: string,\n phaseId: string,\n taskId: string,\n status: string,\n completedAt?: string | null,\n): void {\n const taskPath = join(\n projectRoot,\n \".arcbridge\",\n \"plan\",\n \"tasks\",\n `${phaseId}.yaml`,\n );\n\n if (!existsSync(taskPath)) return;\n\n const raw = readFileSync(taskPath, \"utf-8\");\n const parsed = parse(raw);\n const result = TaskFileSchema.safeParse(parsed);\n if (!result.success) return;\n\n const taskFile = result.data;\n const task = taskFile.tasks.find((t) => t.id === taskId);\n if (!task) return;\n\n task.status = status as typeof task.status;\n if (completedAt) {\n task.completed_at = completedAt;\n } else if (status !== \"done\") {\n delete task.completed_at;\n }\n\n writeFileSync(taskPath, stringify(taskFile), \"utf-8\");\n}\n\n/**\n * Add a new task to a phase's YAML task file.\n * Creates the file if it doesn't exist.\n */\nexport function addTaskToYaml(\n projectRoot: string,\n phaseId: string,\n task: {\n id: string;\n title: string;\n status: string;\n building_block?: string;\n quality_scenarios: string[];\n acceptance_criteria: string[];\n },\n): void {\n const tasksDir = join(projectRoot, \".arcbridge\", \"plan\", \"tasks\");\n const taskPath = join(tasksDir, `${phaseId}.yaml`);\n\n mkdirSync(tasksDir, { recursive: true });\n\n let taskFile: { schema_version: 1; phase_id: string; tasks: typeof task[] };\n\n if (existsSync(taskPath)) {\n const raw = readFileSync(taskPath, \"utf-8\");\n const parsed = parse(raw);\n const result = TaskFileSchema.safeParse(parsed);\n if (result.success) {\n taskFile = result.data as typeof taskFile;\n } else {\n taskFile = { schema_version: 1, phase_id: phaseId, tasks: [] };\n }\n } else {\n taskFile = { schema_version: 1, phase_id: phaseId, tasks: [] };\n }\n\n // Don't duplicate\n if (!taskFile.tasks.some((t) => t.id === task.id)) {\n taskFile.tasks.push(task);\n }\n\n writeFileSync(taskPath, stringify(taskFile), \"utf-8\");\n}\n\n/**\n * Update a phase's status in phases.yaml.\n */\nexport function syncPhaseToYaml(\n projectRoot: string,\n phaseId: string,\n status: string,\n startedAt?: string | null,\n completedAt?: string | null,\n): void {\n const phasesPath = join(\n projectRoot,\n \".arcbridge\",\n \"plan\",\n \"phases.yaml\",\n );\n\n if (!existsSync(phasesPath)) return;\n\n const raw = readFileSync(phasesPath, \"utf-8\");\n const parsed = parse(raw);\n const result = PhasesFileSchema.safeParse(parsed);\n if (!result.success) return;\n\n const phasesFile = result.data;\n const phase = phasesFile.phases.find((p) => p.id === phaseId);\n if (!phase) return;\n\n phase.status = status as typeof phase.status;\n if (startedAt) phase.started_at = startedAt;\n if (completedAt) phase.completed_at = completedAt;\n\n writeFileSync(phasesPath, stringify(phasesFile), \"utf-8\");\n}\n\n/**\n * Update a quality scenario's status in 10-quality-scenarios.yaml.\n */\nexport function syncScenarioToYaml(\n projectRoot: string,\n scenarioId: string,\n status: string,\n): void {\n const scenarioPath = join(\n projectRoot,\n \".arcbridge\",\n \"arc42\",\n \"10-quality-scenarios.yaml\",\n );\n\n if (!existsSync(scenarioPath)) return;\n\n const raw = readFileSync(scenarioPath, \"utf-8\");\n const parsed = parse(raw);\n const result = QualityScenariosFileSchema.safeParse(parsed);\n if (!result.success) return;\n\n const scenariosFile = result.data;\n const scenario = scenariosFile.scenarios.find((s) => s.id === scenarioId);\n if (!scenario) return;\n\n scenario.status = status as typeof scenario.status;\n\n writeFileSync(scenarioPath, stringify(scenariosFile), \"utf-8\");\n}\n","import type Database from \"better-sqlite3\";\nimport { syncTaskToYaml } from \"./yaml-writer.js\";\n\nexport interface TaskInferenceResult {\n taskId: string;\n previousStatus: string;\n inferredStatus: string;\n reason: string;\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\ninterface BlockRow {\n id: string;\n code_paths: string;\n}\n\n/**\n * Infer task status from code state.\n * Checks if building block code exists, acceptance criteria symbols are present, etc.\n */\nexport function inferTaskStatuses(\n db: Database.Database,\n phaseId: string,\n): TaskInferenceResult[] {\n const results: TaskInferenceResult[] = [];\n\n const tasks = db\n .prepare(\n \"SELECT id, title, status, building_block, quality_scenarios, acceptance_criteria FROM tasks WHERE phase_id = ? AND status != 'done'\",\n )\n .all(phaseId) as TaskRow[];\n\n for (const task of tasks) {\n const inference = inferSingleTask(db, task);\n if (inference && inference.inferredStatus !== task.status) {\n results.push(inference);\n }\n }\n\n return results;\n}\n\n/**\n * Apply inferred statuses to the database and optionally write back to YAML.\n */\nexport function applyInferences(\n db: Database.Database,\n inferences: TaskInferenceResult[],\n projectRoot: string,\n): void {\n const update = db.prepare(\n \"UPDATE tasks SET status = ?, completed_at = CASE WHEN ? = 'done' THEN ? ELSE completed_at END WHERE id = ?\",\n );\n\n const now = new Date().toISOString();\n\n const run = db.transaction(() => {\n for (const inf of inferences) {\n update.run(inf.inferredStatus, inf.inferredStatus, now, inf.taskId);\n }\n });\n\n run();\n\n // Write back to YAML\n for (const inf of inferences) {\n const task = db\n .prepare(\"SELECT phase_id FROM tasks WHERE id = ?\")\n .get(inf.taskId) as { phase_id: string } | undefined;\n if (task) {\n syncTaskToYaml(\n projectRoot,\n task.phase_id,\n inf.taskId,\n inf.inferredStatus,\n inf.inferredStatus === \"done\" ? now : null,\n );\n }\n }\n}\n\nfunction inferSingleTask(\n db: Database.Database,\n task: TaskRow,\n): TaskInferenceResult | null {\n // Check 1: Does the building block have indexed code?\n // Only infer in-progress if a majority of the block's code_paths have symbols.\n // This prevents marking all tasks for a block as in-progress when only one\n // sub-area (e.g. types) has been implemented but others (e.g. API routes) haven't.\n if (task.building_block) {\n const block = db\n .prepare(\"SELECT id, code_paths FROM building_blocks WHERE id = ?\")\n .get(task.building_block) as BlockRow | undefined;\n\n if (block) {\n const codePaths = safeParseJson<string[]>(block.code_paths, []);\n if (codePaths.length > 0) {\n let pathsWithCode = 0;\n for (const cp of codePaths) {\n const prefix = cp.replace(/\\*+\\/?$/, \"\");\n const match = db\n .prepare(\"SELECT 1 FROM symbols WHERE file_path LIKE ? ESCAPE '\\\\' LIMIT 1\")\n .get(`${escapeLike(prefix)}%`);\n if (match) pathsWithCode++;\n }\n\n // For single-path blocks, any code triggers in-progress.\n // For multi-path blocks, require majority coverage to avoid\n // marking unrelated tasks as started.\n const threshold = codePaths.length === 1 ? 1 : Math.ceil(codePaths.length / 2);\n if (pathsWithCode >= threshold && task.status === \"todo\") {\n return {\n taskId: task.id,\n previousStatus: task.status,\n inferredStatus: \"in-progress\",\n reason: `Building block \\`${task.building_block}\\` has indexed code in ${pathsWithCode}/${codePaths.length} paths`,\n };\n }\n }\n }\n }\n\n // Check 2: Do acceptance criteria reference symbols that exist?\n const criteria = safeParseJson<string[]>(task.acceptance_criteria, []);\n if (criteria.length > 0) {\n // Look for symbol-like references in criteria (file paths or symbol IDs)\n const symbolRefs = criteria.filter(\n (c) => c.includes(\"/\") || c.includes(\"::\"),\n );\n\n if (symbolRefs.length > 0) {\n const allFound = symbolRefs.every((ref) => {\n if (ref.includes(\"::\")) {\n // Symbol ID reference\n return !!db\n .prepare(\"SELECT 1 FROM symbols WHERE id = ?\")\n .get(ref);\n }\n // File path reference\n return !!db\n .prepare(\"SELECT 1 FROM symbols WHERE file_path = ? LIMIT 1\")\n .get(ref);\n });\n\n if (allFound) {\n return {\n taskId: task.id,\n previousStatus: task.status,\n inferredStatus: \"done\",\n reason: `All acceptance criteria symbol references found in codebase`,\n };\n }\n\n const someFound = symbolRefs.some((ref) => {\n if (ref.includes(\"::\")) {\n return !!db\n .prepare(\"SELECT 1 FROM symbols WHERE id = ?\")\n .get(ref);\n }\n return !!db\n .prepare(\"SELECT 1 FROM symbols WHERE file_path = ? LIMIT 1\")\n .get(ref);\n });\n\n if (someFound && task.status === \"todo\") {\n return {\n taskId: task.id,\n previousStatus: task.status,\n inferredStatus: \"in-progress\",\n reason: `Some acceptance criteria symbol references found in codebase`,\n };\n }\n }\n }\n\n // Check 3: Quality scenarios linked to this task — are they passing?\n const scenarioIds = safeParseJson<string[]>(task.quality_scenarios, []);\n if (scenarioIds.length > 0) {\n const placeholders = scenarioIds.map(() => \"?\").join(\", \");\n const scenarios = db\n .prepare(\n `SELECT id, status FROM quality_scenarios WHERE id IN (${placeholders})`,\n )\n .all(...scenarioIds) as { id: string; status: string }[];\n\n const allPassing = scenarios.length > 0 && scenarios.every((s) => s.status === \"passing\");\n if (allPassing && task.status !== \"done\") {\n return {\n taskId: task.id,\n previousStatus: task.status,\n inferredStatus: \"done\",\n reason: `All linked quality scenarios are passing`,\n };\n }\n }\n\n return null;\n}\n\nfunction escapeLike(value: string): string {\n return value.replace(/%/g, \"\\\\%\").replace(/_/g, \"\\\\_\");\n}\n\nfunction 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","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport type { ArcBridgeConfig } from \"../schemas/config.js\";\nimport { claudeSkillTemplate } from \"../templates/sync/claude-skill.js\";\nimport { githubActionTemplate } from \"../templates/sync/github-action.js\";\nimport { copilotHookTemplate } from \"../templates/sync/copilot-hook.js\";\n\n/**\n * Generate sync loop trigger files based on configured platforms.\n */\nexport function generateSyncFiles(\n targetDir: string,\n config: ArcBridgeConfig,\n): string[] {\n const generated: string[] = [];\n\n // Always generate the GitHub Action workflow\n const action = githubActionTemplate(config);\n const actionPath = join(targetDir, action.relativePath);\n mkdirSync(dirname(actionPath), { recursive: true });\n writeFileSync(actionPath, action.content, \"utf-8\");\n generated.push(action.relativePath);\n\n // Claude Code skill\n if (config.platforms.includes(\"claude\")) {\n const skill = claudeSkillTemplate(config);\n const skillPath = join(targetDir, skill.relativePath);\n mkdirSync(dirname(skillPath), { recursive: true });\n writeFileSync(skillPath, skill.content, \"utf-8\");\n generated.push(skill.relativePath);\n }\n\n // Copilot hook documentation\n if (config.platforms.includes(\"copilot\")) {\n const hook = copilotHookTemplate(config);\n const hookPath = join(targetDir, hook.relativePath);\n mkdirSync(dirname(hookPath), { recursive: true });\n writeFileSync(hookPath, hook.content, \"utf-8\");\n generated.push(hook.relativePath);\n }\n\n return generated;\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\n\nexport interface GeneratedFile {\n relativePath: string;\n content: string;\n}\n\n/**\n * Generate the Claude Code skill file for the ArcBridge sync loop.\n */\nexport function claudeSkillTemplate(config: ArcBridgeConfig): GeneratedFile {\n const triggerNote =\n config.sync.propose_updates_on === \"session-end\"\n ? \"This skill auto-runs at session end. You can also invoke it manually.\"\n : config.sync.propose_updates_on === \"phase-complete\"\n ? \"This skill runs when a phase is completed. You can also invoke it manually.\"\n : \"This skill runs only when invoked manually.\";\n\n const content = `---\ndescription: \"Run the ArcBridge architecture sync loop — detect drift, infer task status, and propose arc42 updates\"\n---\n\n# ArcBridge Sync\n\n${triggerNote}\n\n## Steps\n\n1. First, call \\`arcbridge_check_drift\\` to detect any architecture drift\n2. Call \\`arcbridge_get_current_tasks\\` to see the current phase progress\n3. Call \\`arcbridge_propose_arc42_update\\` with \\`changes_since: \"last-sync\"\\` to generate update proposals\n4. Present the proposals to the developer for review\n5. If the developer approves, update the relevant arc42 files and run \\`arcbridge_reindex\\`\n\n## When to Run\n\n- After completing a set of related changes\n- Before marking a phase as complete\n- When switching context to a different building block\n- At the end of a coding session (if configured)\n\n## Quick Check\n\nIf you just want a quick status without full proposals:\n1. Call \\`arcbridge_get_project_status\\` for an overview\n2. Call \\`arcbridge_get_open_questions\\` to see gaps\n`;\n\n return {\n relativePath: \".claude/skills/arcbridge-sync.md\",\n content,\n };\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\nimport type { GeneratedFile } from \"./claude-skill.js\";\n\n/**\n * Generate the GitHub Action workflow for automated ArcBridge sync.\n */\nexport function githubActionTemplate(_config: ArcBridgeConfig): GeneratedFile {\n const content = `name: ArcBridge Sync\n\non:\n # Run on push to main branch\n push:\n branches: [main]\n paths-ignore:\n - '**.md'\n - '.arcbridge/arc42/**'\n\n # Run weekly\n schedule:\n - cron: '0 9 * * 1' # Monday 9am UTC\n\n # Manual trigger\n workflow_dispatch:\n\npermissions:\n contents: write\n pull-requests: write\n\njobs:\n sync:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Full history for git diff analysis\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Setup pnpm\n uses: pnpm/action-setup@v4\n with:\n version: 9\n\n - name: Install dependencies\n run: pnpm install --frozen-lockfile\n\n - name: Check for ArcBridge\n id: check\n run: |\n if [ -f \".arcbridge/config.yaml\" ]; then\n echo \"initialized=true\" >> $GITHUB_OUTPUT\n else\n echo \"initialized=false\" >> $GITHUB_OUTPUT\n echo \"::warning::ArcBridge is not initialized. Run arcbridge_init_project first.\"\n fi\n\n - name: Run ArcBridge sync\n if: steps.check.outputs.initialized == 'true'\n id: sync\n run: npx arcbridge sync --json | tee arcbridge-sync-result.json\n\n - name: Check for drift errors\n if: steps.check.outputs.initialized == 'true'\n run: |\n npx arcbridge drift --json | tee arcbridge-drift-result.json\n ERRORS=$(node -e \"try { const d=JSON.parse(require('fs').readFileSync('arcbridge-drift-result.json','utf8')); console.log(d.drift.filter(e=>e.severity==='error').length); } catch { console.log(0); }\")\n if [ \"$ERRORS\" -gt 0 ]; then\n echo \"::error::ArcBridge detected $ERRORS drift error(s) that would block phase completion.\"\n exit 1\n fi\n\n - name: Create sync PR\n if: steps.check.outputs.initialized == 'true'\n uses: peter-evans/create-pull-request@v6\n with:\n commit-message: 'chore: arcbridge sync - update arc42 documentation'\n title: 'ArcBridge Sync: Arc42 Documentation Updates'\n body: |\n ## ArcBridge Sync\n\n Automated architecture sync detected changes that may require documentation updates.\n\n **Review the proposed changes to \\`.arcbridge/arc42/\\` files.**\n\n ---\n *Generated by [ArcBridge](https://github.com/bifteki-crew/arcbridge) sync loop*\n branch: arcbridge/sync\n delete-branch: true\n labels: arcbridge,documentation\n`;\n\n return {\n relativePath: \".github/workflows/arcbridge-sync.yml\",\n content,\n };\n}\n","import type { ArcBridgeConfig } from \"../../schemas/config.js\";\nimport type { GeneratedFile } from \"./claude-skill.js\";\n\n/**\n * Generate the Copilot session-end hook for automatic sync triggers.\n * Note: Copilot hooks are an evolving feature — this generates a\n * documentation file that describes the intended behavior.\n */\nexport function copilotHookTemplate(config: ArcBridgeConfig): GeneratedFile {\n const content = `# ArcBridge Sync Hook for Copilot\n\n## Configuration\n\nSync mode: \\`${config.sync.propose_updates_on}\\`\nDrift threshold: \\`${config.sync.drift_severity_threshold}\\`\n\n## Session End Behavior\n\nWhen a Copilot coding session ends${config.sync.propose_updates_on === \"session-end\" ? \" (auto-triggered)\" : \" (manual only)\"}:\n\n1. Run \\`arcbridge_check_drift\\` to detect architecture drift\n2. If drift is found above the \\`${config.sync.drift_severity_threshold}\\` threshold:\n - Run \\`arcbridge_propose_arc42_update\\` with \\`changes_since: \"last-sync\"\\`\n - Create a branch with proposed documentation changes\n - Open a PR for review\n\n## Pre-Tool-Use Enforcement\n\nThe following role restrictions are enforced:\n\n- **Implementer**: Cannot use \\`arcbridge_propose_arc42_update\\`\n- **Security Reviewer**: Read-only access, cannot modify code or documentation\n- **Quality Guardian**: Read-only access\n\n## Setup\n\nTo enable automatic sync:\n1. Ensure the ArcBridge MCP server is configured in your Copilot settings\n2. The GitHub Action workflow at \\`.github/workflows/arcbridge-sync.yml\\` handles automated sync\n3. For session-level hooks, configure Copilot to invoke the sync skill after coding sessions\n`;\n\n return {\n relativePath: \".github/arcbridge-sync-hook.md\",\n content,\n };\n}\n","import { execFileSync } from \"node:child_process\";\nimport type Database from \"better-sqlite3\";\n\nexport interface ChangedFile {\n status: \"added\" | \"modified\" | \"deleted\" | \"renamed\";\n path: string;\n oldPath?: string;\n}\n\nexport interface GitRef {\n sha: string;\n label: string;\n}\n\n/**\n * Resolve a human-readable \"since\" value to a git ref.\n *\n * - \"last-commit\" → HEAD~1\n * - \"last-session\" / \"last-sync\" → commit stored in arcbridge_meta, or HEAD~1 fallback\n * - \"last-phase\" → commit stored in arcbridge_meta under \"phase_sync_commit\", or HEAD~5 fallback\n * - anything else → treated as a literal git ref (branch, tag, SHA)\n */\nexport function resolveRef(\n projectRoot: string,\n since: string,\n db?: Database.Database,\n): GitRef {\n switch (since) {\n case \"last-commit\":\n return { sha: \"HEAD~1\", label: \"last commit\" };\n\n case \"last-session\":\n case \"last-sync\": {\n if (db) {\n const row = db\n .prepare(\"SELECT value FROM arcbridge_meta WHERE key = 'last_sync_commit'\")\n .get() as { value: string } | undefined;\n if (row) return { sha: row.value, label: `last sync (${row.value.slice(0, 7)})` };\n }\n return { sha: \"HEAD~1\", label: \"last commit (no sync point found)\" };\n }\n\n case \"last-phase\": {\n if (db) {\n const row = db\n .prepare(\"SELECT value FROM arcbridge_meta WHERE key = 'phase_sync_commit'\")\n .get() as { value: string } | undefined;\n if (row) return { sha: row.value, label: `last phase (${row.value.slice(0, 7)})` };\n }\n return { sha: \"HEAD~5\", label: \"last 5 commits (no phase sync point found)\" };\n }\n\n default:\n return { sha: since, label: since };\n }\n}\n\n/**\n * Get list of changed files between a ref and HEAD.\n */\nexport function getChangedFiles(\n projectRoot: string,\n ref: string,\n): ChangedFile[] {\n try {\n // Verify the ref is valid before diffing — catches HEAD~1 on single-commit repos\n execFileSync(\"git\", [\"rev-parse\", \"--verify\", ref], {\n cwd: projectRoot,\n encoding: \"utf-8\",\n timeout: 5000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n const output = execFileSync(\n \"git\",\n [\"diff\", \"--name-status\", \"--no-renames\", ref, \"HEAD\"],\n { cwd: projectRoot, encoding: \"utf-8\", timeout: 10000 },\n ).trim();\n\n if (!output) return [];\n\n return output.split(\"\\n\").map((line) => {\n const [statusCode, ...pathParts] = line.split(\"\\t\");\n const path = pathParts.join(\"\\t\");\n const status = parseStatusCode(statusCode ?? \"M\");\n return { status, path };\n });\n } catch {\n // Also try unstaged changes if ref comparison fails\n return getUncommittedChanges(projectRoot);\n }\n}\n\n/**\n * Get uncommitted (staged + unstaged) changes.\n */\nexport function getUncommittedChanges(projectRoot: string): ChangedFile[] {\n try {\n const output = execFileSync(\n \"git\",\n [\"status\", \"--porcelain\", \"-uno\"],\n { cwd: projectRoot, encoding: \"utf-8\", timeout: 5000 },\n ).trim();\n\n if (!output) return [];\n\n return output.split(\"\\n\").map((line) => {\n const statusCode = line.slice(0, 2).trim();\n const path = line.slice(3);\n const status = statusCode === \"D\" ? \"deleted\" : statusCode === \"A\" ? \"added\" : \"modified\";\n return { status, path };\n });\n } catch {\n return [];\n }\n}\n\n/**\n * Get current HEAD commit SHA.\n */\nexport function getHeadSha(projectRoot: string): string | null {\n try {\n return execFileSync(\n \"git\",\n [\"rev-parse\", \"HEAD\"],\n { cwd: projectRoot, encoding: \"utf-8\", timeout: 5000 },\n ).trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Store the current sync point in arcbridge_meta.\n */\nexport function setSyncCommit(\n db: Database.Database,\n key: \"last_sync_commit\" | \"phase_sync_commit\",\n sha: string,\n): void {\n db.prepare(\n \"INSERT OR REPLACE INTO arcbridge_meta (key, value) VALUES (?, ?)\",\n ).run(key, sha);\n}\n\nfunction parseStatusCode(code: string): ChangedFile[\"status\"] {\n switch (code.charAt(0)) {\n case \"A\":\n return \"added\";\n case \"D\":\n return \"deleted\";\n case \"R\":\n return \"renamed\";\n default:\n return \"modified\";\n }\n}\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type Database from \"better-sqlite3\";\nimport { syncScenarioToYaml } from \"../sync/yaml-writer.js\";\n\nexport type TestOutcome = \"passed\" | \"failed\" | \"missing\" | \"error\";\n\nexport interface ScenarioTestResult {\n scenarioId: string;\n scenarioName: string;\n testPaths: string[];\n passed: boolean;\n outcome: TestOutcome;\n output: string;\n durationMs: number;\n}\n\nexport interface VerifyResult {\n results: ScenarioTestResult[];\n updated: number;\n errors: string[];\n}\n\ninterface ScenarioRow {\n id: string;\n name: string;\n linked_tests: string;\n verification: string;\n status: string;\n}\n\n/**\n * Run linked tests for automatic quality scenarios and update their status in the DB.\n *\n * Only runs tests for scenarios with:\n * - verification = \"automatic\" or \"semi-automatic\"\n * - non-empty linked_tests array\n *\n * Optionally filter by specific scenario IDs.\n */\nexport function verifyScenarios(\n db: Database.Database,\n projectRoot: string,\n options: {\n testCommand: string;\n timeoutMs: number;\n scenarioIds?: string[];\n },\n): VerifyResult {\n const results: ScenarioTestResult[] = [];\n const errors: string[] = [];\n\n // Fetch testable scenarios\n let scenarios: ScenarioRow[];\n if (options.scenarioIds && options.scenarioIds.length > 0) {\n const placeholders = options.scenarioIds.map(() => \"?\").join(\", \");\n scenarios = db\n .prepare(\n `SELECT id, name, linked_tests, verification, status FROM quality_scenarios\n WHERE id IN (${placeholders}) AND linked_tests != '[]'`,\n )\n .all(...options.scenarioIds) as ScenarioRow[];\n } else {\n scenarios = db\n .prepare(\n `SELECT id, name, linked_tests, verification, status FROM quality_scenarios\n WHERE verification IN ('automatic', 'semi-automatic') AND linked_tests != '[]'`,\n )\n .all() as ScenarioRow[];\n }\n\n if (scenarios.length === 0) {\n return { results, updated: 0, errors };\n }\n\n // Parse the test command into executable + args\n const parts = options.testCommand.split(/\\s+/);\n const executable = parts[0]!;\n const baseArgs = parts.slice(1);\n\n let updated = 0;\n const updateStmt = db.prepare(\n \"UPDATE quality_scenarios SET status = ? WHERE id = ?\",\n );\n\n for (const scenario of scenarios) {\n let testPaths: string[];\n try {\n testPaths = JSON.parse(scenario.linked_tests) as string[];\n } catch {\n errors.push(`${scenario.id}: invalid linked_tests JSON`);\n continue;\n }\n\n if (testPaths.length === 0) continue;\n\n // Check if test files actually exist before trying to run them\n const missingPaths = testPaths.filter(\n (tp) => !existsSync(resolve(projectRoot, tp)),\n );\n if (missingPaths.length === testPaths.length) {\n // All test files are missing — don't run, report as missing\n results.push({\n scenarioId: scenario.id,\n scenarioName: scenario.name,\n testPaths,\n passed: false,\n outcome: \"missing\",\n output: `Test file(s) not found: ${missingPaths.join(\", \")}`,\n durationMs: 0,\n });\n continue;\n }\n\n // Only pass existing test paths to the runner\n const existingPaths = testPaths.filter(\n (tp) => existsSync(resolve(projectRoot, tp)),\n );\n\n const start = Date.now();\n let passed: boolean;\n let outcome: TestOutcome;\n let output: string;\n\n try {\n const result = execFileSync(executable, [...baseArgs, ...existingPaths], {\n cwd: projectRoot,\n encoding: \"utf-8\",\n timeout: options.timeoutMs,\n maxBuffer: 1024 * 1024, // 1MB\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n passed = true;\n outcome = \"passed\";\n output = result.slice(-2000); // Keep last 2000 chars\n } catch (err) {\n passed = false;\n if (err && typeof err === \"object\" && \"stdout\" in err) {\n const execErr = err as { stdout?: string; stderr?: string; status?: number };\n output = (execErr.stdout ?? execErr.stderr ?? \"\").slice(-2000);\n outcome = \"failed\";\n } else {\n output = err instanceof Error ? err.message : String(err);\n outcome = \"error\";\n }\n }\n\n // If some paths were missing, note it in output\n if (missingPaths.length > 0) {\n output = `Warning: ${missingPaths.length} test file(s) not found: ${missingPaths.join(\", \")}\\n${output}`;\n }\n\n const durationMs = Date.now() - start;\n const newStatus = passed ? \"passing\" : \"failing\";\n\n // Only update if status changed\n if (scenario.status !== newStatus) {\n updateStmt.run(newStatus, scenario.id);\n syncScenarioToYaml(projectRoot, scenario.id, newStatus);\n updated++;\n }\n\n results.push({\n scenarioId: scenario.id,\n scenarioName: scenario.name,\n testPaths,\n passed,\n outcome,\n output,\n durationMs,\n });\n }\n\n return { results, updated, errors };\n}\n","import { readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport matter from \"gray-matter\";\nimport { AgentRoleSchema, type AgentRole } from \"../schemas/agent-roles.js\";\n\nexport interface LoadRolesResult {\n roles: AgentRole[];\n errors: string[];\n}\n\n/**\n * Load agent role definitions from `.arcbridge/agents/*.md` files.\n * Each file is parsed as YAML frontmatter + markdown body (system_prompt).\n * Returns validated roles and any parse/validation errors.\n */\nexport function loadRoles(projectRoot: string): LoadRolesResult {\n const agentsDir = join(projectRoot, \".arcbridge\", \"agents\");\n const roles: AgentRole[] = [];\n const errors: string[] = [];\n\n let files: string[];\n try {\n files = readdirSync(agentsDir).filter((f) => f.endsWith(\".md\")).sort();\n } catch {\n return { roles: [], errors: [`Agent directory not found: ${agentsDir}`] };\n }\n\n for (const file of files) {\n const filePath = join(agentsDir, file);\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = matter(raw);\n\n // Combine frontmatter data with markdown body as system_prompt\n const input = {\n ...parsed.data,\n system_prompt: parsed.content.trim(),\n };\n\n const result = AgentRoleSchema.safeParse(input);\n if (result.success) {\n roles.push(result.data);\n } else {\n const issues = result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n errors.push(`${file}: validation failed — ${issues}`);\n }\n } catch (err) {\n errors.push(\n `${file}: parse error — ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n return { roles, errors };\n}\n\n/**\n * Load a single role by ID from `.arcbridge/agents/{roleId}.md`.\n * Returns null if the file doesn't exist or fails validation.\n * Rejects roleId values that don't match kebab-case to prevent path traversal.\n */\nexport function loadRole(\n projectRoot: string,\n roleId: string,\n): { role: AgentRole | null; error: string | null } {\n // Validate roleId to prevent path traversal\n if (!/^[a-z0-9-]+$/.test(roleId)) {\n return { role: null, error: `Invalid role ID: \"${roleId}\" (must be kebab-case)` };\n }\n\n const filePath = join(projectRoot, \".arcbridge\", \"agents\", `${roleId}.md`);\n\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = matter(raw);\n\n const input = {\n ...parsed.data,\n system_prompt: parsed.content.trim(),\n };\n\n const result = AgentRoleSchema.safeParse(input);\n if (result.success) {\n return { role: result.data, error: null };\n }\n const issues = result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n return { role: null, error: `Validation failed: ${issues}` };\n } catch (err) {\n // Distinguish file-not-found (expected) from other errors\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { role: null, error: null };\n }\n return { role: null, error: `Parse error: ${err instanceof Error ? err.message : String(err)}` };\n }\n}\n"],"mappings":"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","names":["z","z","z","z","z","configTemplate","configTemplate","configTemplate","configTemplate","mkdirSync","writeFileSync","join","stringify","join","writeFileSync","join","mkdirSync","stringify","mkdirSync","writeFileSync","join","stringify","phasePlanTemplate","phaseTasksTemplate","phasePlanTemplate","phaseTasksTemplate","phasePlanTemplate","phaseTasksTemplate","phasePlanTemplate","phaseTasksTemplate","join","mkdirSync","writeFileSync","stringify","mkdirSync","writeFileSync","join","matter","matter","writeFileSync","join","mkdirSync","join","existsSync","matter","join","existsSync","matter","relative","join","existsSync","readFileSync","execFileSync","join","ts","ts","ts","ts","addDep","walkMethodCalls","ts","relative","ts","relative","existsSync","readdirSync","readFileSync","join","relative","join","relative","readdirSync","readFileSync","existsSync","readdirSync","join","readFileSync","existsSync","relative","currentDir","readFileSync","join","accessSync","constants","dirname","resolve","fileURLToPath","findChild","findChild","join","readFileSync","join","existsSync","readFileSync","readdirSync","currentDir","readFileSync","join","join","readFileSync","existsSync","join","readFileSync","execFileSync","relative","join","existsSync","readFileSync","writeFileSync","mkdirSync","parse","stringify","join","existsSync","readFileSync","parse","writeFileSync","stringify","mkdirSync","safeParseJson","escapeLike","mkdirSync","writeFileSync","join","dirname","join","mkdirSync","dirname","writeFileSync","execFileSync","execFileSync","existsSync","resolve","existsSync","resolve","execFileSync","readdirSync","readFileSync","join","matter","join","readdirSync","readFileSync","matter"]}