Files
boocode/codecontext/openspec/codesight-merge.md
indifferentketchup ec48066a80 chore(infra): Dockerfile updates, MCP config cleanup, dependency lockfile
codecontext Dockerfile and docker-compose adjustments for sidecar build.
MCP example config cleanup (remove deprecated entries). pnpm-lock.yaml
updated for new dependencies.
2026-06-07 22:16:41 +00:00

4.9 KiB

codecontext — codesight feature merge

Port codesight's highest-value analysis capabilities into codecontext as 4 new MCP tools. All work in /opt/forks/codecontext (Go). BooCode wrapper tools in a follow-up batch.

New tools

1. get_blast_radius (Tier 1)

Input: file_path (required), target_dir (optional) Output: markdown listing all files, routes, and symbols that depend (transitively) on the given file.

Algorithm: build a reverse adjacency map from s.graph.Edges (filter by type == "imports"), then BFS outward from the target file's node. Report each affected file with its symbol count and distance from the source.

Codesight reference: detectors/blast-radius.ts (128 lines). The Go port is simpler — codecontext already has the edge graph; codesight had to build its own.

~50 lines of Go (handler + BFS).

2. get_hot_files (Tier 1)

Input: target_dir (optional), limit (optional, default 20) Output: ranked list of most-imported files with import count.

Algorithm: count incoming "imports" edges per file node. Sort descending. Return top N.

Codesight reference: detectors/graph.ts hot-files metric. codecontext's identifyHotspotFiles() at relationships.go:286 already computes this — the tool just needs to expose it.

~30 lines of Go (handler + sort).

3. get_routes (Tier 2)

Input: target_dir (optional), framework (optional filter — "fastify", "express", etc.) Output: structured list of HTTP routes with method, path, file, line number, middleware, tags.

Algorithm: for each TypeScript/JavaScript file in the graph, re-parse the AST via gb.parser.ParseFile() and walk the tree for call expressions matching framework-specific patterns:

Fastify patterns (primary — Sam's stack):

  • app.get('/path', handler) / app.post(...) / etc.
  • app.route({ method: 'GET', url: '/path', handler }) (object form)
  • app.register(plugin) (plugin registration — note but don't trace into)

Express patterns (secondary — common in analyzed projects):

  • router.get('/path', ...middleware, handler)
  • app.use('/prefix', router)

Tag inference: scan handler body for common patterns (SQL queries → db tag, auth checks → auth tag, cache reads → cache tag). Simplified version of codesight's 30-framework tagger — only Fastify + Express for now.

Codesight reference: detectors/routes.ts (1969 lines) + ast/extract-routes.ts (14690 lines). The Go port is ~200 lines targeting only 2 frameworks.

4. get_middleware (Tier 2)

Input: target_dir (optional) Output: list of detected middleware with type (auth, cors, rate-limit, validation, error-handler, logging), file, line.

Algorithm: for each file, scan for common middleware registration patterns:

  • app.register(fastifyCors, ...) → CORS
  • app.addHook('preHandler', authCheck) → auth
  • app.setErrorHandler(...) → error-handler
  • Import-name heuristics: @fastify/cors → CORS, @fastify/rate-limit → rate-limit

Codesight reference: detectors/middleware.ts (217 lines). Go port: ~80 lines, Fastify-focused.

Architecture

All 4 tools register in internal/mcp/server.go:registerTools() following the existing pattern (mcp.AddTool).

Tools 1-2 (blast radius, hot files) operate on the existing CodeGraph — no re-parsing needed. They read s.graph.Edges and s.graph.Files under s.graphMu.RLock().

Tools 3-4 (routes, middleware) need AST access. The current pipeline discards ASTs after symbol extraction. Two options:

  • (a) Re-parse on demand: when get_routes is called, iterate TypeScript files in s.graph.Files, call s.analyzer.parser.ParseFile() for each, walk the AST. Slower but no structural change.
  • (b) Cache route/middleware data during analysis: modify processFile() in graph_analysis.go to extract routes alongside symbols, store in a new FileNode.Routes field. Faster on repeated calls but requires graph-builder changes.

Recommendation: (a) for this batch. Re-parse is acceptable because route extraction runs on human timescale (one tool call, not per-token), and most projects have <50 route files. Optimize to (b) later if needed.

New Go files:

  • internal/mcp/blast_radius.go — handler + BFS
  • internal/mcp/hot_files.go — handler + sort
  • internal/mcp/routes.go — handler + AST route extraction for Fastify + Express
  • internal/mcp/middleware.go — handler + middleware pattern detection

Hard rules

  • Go code. Tree-sitter for AST parsing (already in the project).
  • No new Go deps (tree-sitter + MCP SDK already present).
  • go build ./... clean. go test ./... passing.
  • Test coverage: at least one test per new tool exercising the happy path.
  • Don't modify existing tool behavior.

Estimate

~400 lines of Go across 4 new files + registration in server.go. Blast radius and hot files are trivial (graph queries). Routes and middleware are the bulk (AST walking + pattern matching).