BooCode wrapper tools for the 4 new MCP tools added to the codecontext sidecar (Go side committed separately at /opt/forks/codecontext). - get_blast_radius: reverse-edge BFS — "what breaks if I change this?" - get_hot_files: most-imported files by incoming edge count - get_routes: Fastify/Express route extraction via tree-sitter AST - get_middleware: middleware detection via import + registration patterns Wrappers follow the existing codecontext pattern: Zod input → callCodecontext → ToolDef export. Registered in ALL_TOOLS (alpha-sorted). All 4 are read-only. codecontext sidecar rebuilt from commit b19e646 with the 4 new Go handlers (2130 lines, 29 tests). Reviewer fixes applied: defer RUnlock on Tier 2 handlers, extractObjectProperty delegates to extractStringValue for template-literal route paths. 363/363 server tests passing. No schema changes, no frontend changes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
import { z } from 'zod';
|
|
import type { ToolDef } from '../../tools.js';
|
|
import { callCodecontext, type CodecontextResponse } from '../../codecontext_client.js';
|
|
|
|
export const GetBlastRadiusInput = z.object({
|
|
file_path: z.string().trim().min(1),
|
|
});
|
|
export type GetBlastRadiusInputT = z.infer<typeof GetBlastRadiusInput>;
|
|
|
|
const DESCRIPTION =
|
|
'Returns all files that depend (transitively) on the given file, with depth tracking. ' +
|
|
'Use to assess the impact of changing a file — "what breaks if I modify this?" ' +
|
|
'Traverses the import graph in reverse via BFS. Results sorted by distance (closest dependents first).';
|
|
|
|
export async function executeGetBlastRadius(
|
|
input: GetBlastRadiusInputT,
|
|
projectPath: string,
|
|
fetcher: typeof fetch = fetch,
|
|
): Promise<CodecontextResponse> {
|
|
return callCodecontext(
|
|
{ toolName: 'get_blast_radius', args: { file_path: input.file_path }, projectPath },
|
|
fetcher,
|
|
);
|
|
}
|
|
|
|
export const getBlastRadius: ToolDef<GetBlastRadiusInputT> = {
|
|
name: 'get_blast_radius',
|
|
description: DESCRIPTION,
|
|
inputSchema: GetBlastRadiusInput,
|
|
jsonSchema: {
|
|
type: 'function',
|
|
function: {
|
|
name: 'get_blast_radius',
|
|
description: DESCRIPTION,
|
|
parameters: {
|
|
type: 'object',
|
|
properties: {
|
|
file_path: {
|
|
type: 'string',
|
|
description: 'Absolute or project-relative path to the file to analyze.',
|
|
},
|
|
},
|
|
required: ['file_path'],
|
|
additionalProperties: false,
|
|
},
|
|
},
|
|
},
|
|
async execute(input, projectRoot) {
|
|
return await executeGetBlastRadius(input, projectRoot);
|
|
},
|
|
};
|