Shared boocontext MCP client (boocontext_client.ts) wrapping the existing mcp-client.ts callTool() infrastructure with 32KB truncation and error handling. Used by get_code_health. 4 new first-class agent tools backed by the boocontext MCP server: - get_code_health — A-F grades per file across 7 dimensions, project health summary, refactoring candidates (wraps boocontext_health) - get_code_impact — merged symbol trace + blast radius in one call (wraps boocontext_impact, replaces two-step get_symbol_info+get_blast_radius) - get_type_info — TypeScript type recovery via type-inject MCP (wraps boocontext_types, returns signatures, interfaces, generics, JSDoc) - get_code_map — DCP-compressed context map with compress toggle (wraps boocontext_map, 10x token reduction vs full scan) All 4 registered in ALL_TOOLS as read-only tools.
63 lines
2.0 KiB
TypeScript
63 lines
2.0 KiB
TypeScript
import { z } from 'zod';
|
||
import type { ToolDef } from '../types.js';
|
||
import { callBoocontext } from '../../boocontext_client.js';
|
||
|
||
export const GetCodeHealthInput = z.object({
|
||
directory: z.string().optional().describe('Directory to analyze (defaults to project root)'),
|
||
file: z.string().optional().describe('Optional: specific file to analyze'),
|
||
});
|
||
export type GetCodeHealthInputT = z.infer<typeof GetCodeHealthInput>;
|
||
|
||
const DESCRIPTION =
|
||
'Code health analysis. Returns A–F grades per file across 7 dimensions ' +
|
||
'(cohesion, coupling, complexity, documentation, duplication, unit size, test coverage). ' +
|
||
'Includes project health summary and refactoring candidates.';
|
||
|
||
/**
|
||
* Standalone execute function — calls the boocontext MCP server's
|
||
* boocontext_health tool and returns the raw report text.
|
||
*
|
||
* Structured for direct test access: accepts input + projectPath,
|
||
* no side effects beyond the MCP call.
|
||
*/
|
||
export async function executeGetCodeHealth(
|
||
input: GetCodeHealthInputT,
|
||
projectPath: string,
|
||
): Promise<string> {
|
||
const args: Record<string, unknown> = {};
|
||
if (input.directory) args['directory'] = input.directory;
|
||
if (input.file) args['file'] = input.file;
|
||
const resp = await callBoocontext({ toolName: 'boocontext_health', args });
|
||
return resp.result;
|
||
}
|
||
|
||
export const getCodeHealth: ToolDef<GetCodeHealthInputT> = {
|
||
name: 'get_code_health',
|
||
description: DESCRIPTION,
|
||
inputSchema: GetCodeHealthInput,
|
||
jsonSchema: {
|
||
type: 'function',
|
||
function: {
|
||
name: 'get_code_health',
|
||
description: DESCRIPTION,
|
||
parameters: {
|
||
type: 'object',
|
||
properties: {
|
||
directory: {
|
||
type: 'string',
|
||
description: 'Directory to analyze (defaults to project root)',
|
||
},
|
||
file: {
|
||
type: 'string',
|
||
description: 'Optional: specific file to analyze',
|
||
},
|
||
},
|
||
additionalProperties: false,
|
||
},
|
||
},
|
||
},
|
||
async execute(input, projectRoot) {
|
||
return executeGetCodeHealth(input, projectRoot);
|
||
},
|
||
};
|