repomix
Version:
A tool to pack repository contents to single file for AI consumption
83 lines (82 loc) • 4.8 kB
JavaScript
import path from 'node:path';
import { z } from 'zod';
import { runCli } from '../../cli/cliRun.js';
import { defaultFilePathMap } from '../../config/configSchema.js';
import { buildMcpToolErrorResponse, convertErrorToJson, createToolWorkspace, formatPackToolResponse, } from './mcpToolRuntime.js';
const packCodebaseInputSchema = z.object({
directory: z.string().describe('Directory to pack (Absolute path)'),
compress: z
.boolean()
.default(false)
.describe('Enable Tree-sitter compression to extract essential code signatures and structure while removing implementation details. Reduces token usage by ~70% while preserving semantic meaning. Generally not needed since grep_repomix_output allows incremental content retrieval. Use only when you specifically need the entire codebase content for large repositories (default: false).'),
includePatterns: z
.string()
.optional()
.describe('Specify files to include using fast-glob patterns. Multiple patterns can be comma-separated (e.g., "**/*.{js,ts}", "src/**,docs/**"). Only matching files will be processed. Useful for focusing on specific parts of the codebase.'),
ignorePatterns: z
.string()
.optional()
.describe('Specify additional files to exclude using fast-glob patterns. Multiple patterns can be comma-separated (e.g., "test/**,*.spec.js", "node_modules/**,dist/**"). These patterns supplement .gitignore and built-in exclusions.'),
topFilesLength: z
.number()
.int()
.min(1)
.optional()
.default(10)
.describe('Number of largest files by size to display in the metrics summary for codebase analysis (default: 10)'),
style: z
.enum(['xml', 'markdown', 'json', 'plain'])
.default('xml')
.describe('Output format style: xml (structured tags, default), markdown (human-readable with code blocks), json (machine-readable key-value), or plain (simple text with separators)'),
});
const packCodebaseOutputSchema = z.object({
description: z.string().describe('Human-readable description of the packing results'),
result: z.string().describe('JSON string containing detailed metrics and file information'),
directoryStructure: z.string().describe('Tree structure of the processed directory'),
outputId: z.string().describe('Unique identifier for accessing the packed content'),
outputFilePath: z.string().describe('File path to the generated output file'),
totalFiles: z.number().describe('Total number of files processed'),
totalTokens: z.number().describe('Total token count of the content'),
});
export const registerPackCodebaseTool = (mcpServer) => {
mcpServer.registerTool('pack_codebase', {
title: 'Pack Local Codebase',
description: 'Package a local code directory into a consolidated file for AI analysis. This tool analyzes the codebase structure, extracts relevant code content, and generates a comprehensive report including metrics, file tree, and formatted code content. Supports multiple output formats: XML (structured with <file> tags), Markdown (human-readable with ## headers and code blocks), JSON (machine-readable with files as key-value pairs), and Plain text (simple format with separators). Also supports Tree-sitter compression for efficient token usage.',
inputSchema: packCodebaseInputSchema,
outputSchema: packCodebaseOutputSchema,
annotations: {
readOnlyHint: true,
destructiveHint: false,
idempotentHint: false,
openWorldHint: false,
},
}, async ({ directory, compress, includePatterns, ignorePatterns, topFilesLength, style, }) => {
let tempDir = '';
try {
tempDir = await createToolWorkspace();
const outputFileName = defaultFilePathMap[style];
const outputFilePath = path.join(tempDir, outputFileName);
const cliOptions = {
compress,
include: includePatterns,
ignore: ignorePatterns,
output: outputFilePath,
style,
securityCheck: true,
topFilesLen: topFilesLength,
quiet: true,
};
const result = await runCli(['.'], directory, cliOptions);
if (!result) {
return buildMcpToolErrorResponse({
errorMessage: 'Failed to return a result',
});
}
const { packResult } = result;
return await formatPackToolResponse({ directory }, packResult, outputFilePath, topFilesLength);
}
catch (error) {
return buildMcpToolErrorResponse(convertErrorToJson(error));
}
});
};