@wrongstack/codebase-index-mcp 0.297.0 → 0.298.0
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/cli.d.ts +1 -1
- package/dist/cli.js +12 -1
- package/package.json +6 -5
- package/dist/adapter.d.ts.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -7
- package/dist/policy.d.ts.map +0 -1
- package/dist/version.d.ts.map +0 -1
package/dist/cli.d.ts
CHANGED
|
@@ -10,6 +10,6 @@ export interface ParsedArgs {
|
|
|
10
10
|
help: boolean;
|
|
11
11
|
}
|
|
12
12
|
export declare function printHelp(stdout: NodeJS.WriteStream): void;
|
|
13
|
-
export declare function parseArgs(argv: readonly string[]): ParsedArgs;
|
|
13
|
+
export declare function parseArgs(argv: readonly string[], env?: NodeJS.ProcessEnv): ParsedArgs;
|
|
14
14
|
export declare function main(argv?: string[]): Promise<number>;
|
|
15
15
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.js
CHANGED
|
@@ -253,6 +253,8 @@ function printHelp(stdout) {
|
|
|
253
253
|
" --port <n> HTTP port (default 0 = ephemeral).",
|
|
254
254
|
" --host <h> HTTP bind host (default 127.0.0.1).",
|
|
255
255
|
" --token <t> Bearer token. Required for a non-loopback HTTP bind.",
|
|
256
|
+
" Prefer WRONGSTACK_MCP_TOKEN \u2014 a command line is readable",
|
|
257
|
+
" by other local processes (WS-064).",
|
|
256
258
|
" --writable Also expose codebase_index for incremental/full rebuilds.",
|
|
257
259
|
" -h, --help Show this message.",
|
|
258
260
|
"",
|
|
@@ -260,7 +262,8 @@ function printHelp(stdout) {
|
|
|
260
262
|
].join("\n") + "\n"
|
|
261
263
|
);
|
|
262
264
|
}
|
|
263
|
-
|
|
265
|
+
var HTTP_TOKEN_ENV = "WRONGSTACK_MCP_TOKEN";
|
|
266
|
+
function parseArgs(argv, env = process.env) {
|
|
264
267
|
const parsed = {
|
|
265
268
|
projectRoot: "",
|
|
266
269
|
transport: "stdio",
|
|
@@ -304,6 +307,14 @@ function parseArgs(argv) {
|
|
|
304
307
|
break;
|
|
305
308
|
}
|
|
306
309
|
}
|
|
310
|
+
if (parsed.httpToken === void 0) {
|
|
311
|
+
const fromEnv = env[HTTP_TOKEN_ENV]?.trim();
|
|
312
|
+
if (fromEnv) parsed.httpToken = fromEnv;
|
|
313
|
+
} else if (parsed.httpToken.length > 0) {
|
|
314
|
+
console.warn(
|
|
315
|
+
`[mcp] --token puts the auth token in this process's command line, which other local processes can read. Prefer ${HTTP_TOKEN_ENV}.`
|
|
316
|
+
);
|
|
317
|
+
}
|
|
307
318
|
return parsed;
|
|
308
319
|
}
|
|
309
320
|
function availabilityError(availability) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wrongstack/codebase-index-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.298.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "WrongStack Codebase Index as an MCP server, backed by the existing project-scoped IPC daemon.",
|
|
6
6
|
"repository": {
|
|
@@ -27,12 +27,13 @@
|
|
|
27
27
|
}
|
|
28
28
|
},
|
|
29
29
|
"files": [
|
|
30
|
-
"dist"
|
|
30
|
+
"dist",
|
|
31
|
+
"!dist/**/*.map"
|
|
31
32
|
],
|
|
32
33
|
"dependencies": {
|
|
33
|
-
"@wrongstack/
|
|
34
|
-
"@wrongstack/tools": "0.
|
|
35
|
-
"@wrongstack/
|
|
34
|
+
"@wrongstack/core": "0.298.0",
|
|
35
|
+
"@wrongstack/tools": "0.298.0",
|
|
36
|
+
"@wrongstack/mcp": "0.298.0"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
38
39
|
"@types/node": "^26.1.1",
|
package/dist/adapter.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAc,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EACL,SAAS,EAGT,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AASzB,OAAO,EACL,KAAK,6BAA6B,EAGnC,MAAM,aAAa,CAAC;AAGrB,UAAU,aAAa;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,UAAU,aAAc,SAAQ,aAAa;IAC3C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,eAAgB,SAAQ,aAAa;IAC7C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,CACZ,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,+BAAgC,SAAQ,6BAA6B;IACpF,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;CACzD;AAsHD,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,+BAAoC,GACzC,iBAAiB,CAoEnB;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,+BAAoC,GACzC,SAAS,CAeX"}
|
package/dist/cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAeA,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAsB1D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CA8C7D;AAkBD,wBAAsB,IAAI,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuFxE"}
|
package/dist/cli.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/cli.ts", "../src/adapter.ts", "../src/policy.ts", "../src/version.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\nimport { realpathSync } from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { canonicalProjectRoot } from '@wrongstack/core/utils';\nimport { serveHttp, serveStdio } from '@wrongstack/mcp';\nimport {\n checkCodebaseIndexServerHealth,\n ensureCodebaseIndexServer,\n resolveProjectIndexDaemonAvailability,\n shutdownCodebaseIndexHost,\n} from '@wrongstack/tools/codebase-index';\nimport { createCodebaseIndexMcpServer } from './adapter.js';\nimport { SERVER_INFO } from './version.js';\n\nexport interface ParsedArgs {\n projectRoot: string;\n indexDir?: string | undefined;\n transport: 'stdio' | 'http';\n httpPort: number;\n httpHost: string;\n httpToken?: string | undefined;\n writable: boolean;\n help: boolean;\n}\n\nexport function printHelp(stdout: NodeJS.WriteStream): void {\n stdout.write(\n [\n `${SERVER_INFO.name} v${SERVER_INFO.version} \u2014 WrongStack Codebase Index MCP server`,\n '',\n 'Usage:',\n ` ${SERVER_INFO.name} --project-root <path> [options]`,\n '',\n 'Options:',\n ' --project-root <path> Project whose IPC-backed index should be served (required).',\n ' --index-dir <path> Override the project Codebase Index directory.',\n ' --stdio Use stdio transport (default).',\n ' --http Use HTTP transport.',\n ' --port <n> HTTP port (default 0 = ephemeral).',\n ' --host <h> HTTP bind host (default 127.0.0.1).',\n ' --token <t> Bearer token. Required for a non-loopback HTTP bind.',\n ' --writable Also expose codebase_index for incremental/full rebuilds.',\n ' -h, --help Show this message.',\n '',\n 'The MCP process is an IPC client. The detached project daemon remains the only SQLite owner.',\n ].join('\\n') + '\\n',\n );\n}\n\nexport function parseArgs(argv: readonly string[]): ParsedArgs {\n const parsed: ParsedArgs = {\n projectRoot: '',\n transport: 'stdio',\n httpPort: 0,\n httpHost: '127.0.0.1',\n writable: false,\n help: false,\n };\n\n for (let index = 0; index < argv.length; index++) {\n const arg = argv[index];\n switch (arg) {\n case '--project-root':\n parsed.projectRoot = path.resolve(argv[++index] ?? '');\n break;\n case '--index-dir':\n parsed.indexDir = path.resolve(argv[++index] ?? '');\n break;\n case '--stdio':\n parsed.transport = 'stdio';\n break;\n case '--http':\n parsed.transport = 'http';\n break;\n case '--port':\n parsed.httpPort = Number(argv[++index] ?? '') || 0;\n break;\n case '--host':\n parsed.httpHost = argv[++index] ?? '127.0.0.1';\n break;\n case '--token':\n parsed.httpToken = argv[++index];\n break;\n case '--writable':\n parsed.writable = true;\n break;\n case '-h':\n case '--help':\n parsed.help = true;\n break;\n default:\n break;\n }\n }\n return parsed;\n}\n\nfunction availabilityError(\n availability: ReturnType<typeof resolveProjectIndexDaemonAvailability>,\n): string | null {\n if (availability.kind === 'available') return null;\n if (availability.kind === 'inline-requested') {\n return 'the Codebase Index daemon is disabled by WRONGSTACK_INDEX_INLINE or WRONGSTACK_INDEX_SERVER=0';\n }\n if (availability.kind === 'missing-build') {\n return 'the @wrongstack/tools Codebase Index project-server build is missing';\n }\n return (\n `the IPC endpoint is too long (${availability.byteLength}/${availability.maxBytes} bytes): ` +\n availability.endpoint\n );\n}\n\nexport async function main(argv = process.argv.slice(2)): Promise<number> {\n const args = parseArgs(argv);\n if (args.help) {\n printHelp(process.stdout);\n return 0;\n }\n if (!args.projectRoot) {\n process.stderr.write(`${SERVER_INFO.name}: --project-root is required\\n`);\n printHelp(process.stderr);\n return 2;\n }\n\n const projectRoot = canonicalProjectRoot(args.projectRoot);\n const availability = resolveProjectIndexDaemonAvailability(projectRoot, args.indexDir);\n const unavailable = availabilityError(availability);\n if (unavailable) {\n process.stderr.write(`${SERVER_INFO.name}: cannot use project-scoped IPC: ${unavailable}\\n`);\n return 3;\n }\n\n // The shared IPC client's spawn-retry timers are intentionally unref'ed so\n // background callers do not keep a normal CLI alive. A standalone MCP\n // process has no other referenced handle before its transport starts, so it\n // needs a short startup lease while the first project daemon is elected.\n const startupLease = setInterval(() => {}, 1_000);\n try {\n await ensureCodebaseIndexServer({\n projectRoot,\n ...(args.indexDir ? { indexDir: args.indexDir } : {}),\n watchExternal: false,\n });\n const health = await checkCodebaseIndexServerHealth(projectRoot, args.indexDir);\n if (health.status === 'unresponsive') {\n throw new Error('project server health check was unresponsive');\n }\n } catch (error) {\n await shutdownCodebaseIndexHost();\n process.stderr.write(\n `${SERVER_INFO.name}: cannot attach to Codebase Index project server for ${projectRoot}: ${\n error instanceof Error ? error.message : String(error)\n }\\n`,\n );\n return 3;\n } finally {\n clearInterval(startupLease);\n }\n\n const server = createCodebaseIndexMcpServer(projectRoot, {\n writable: args.writable,\n ...(args.indexDir ? { indexDir: args.indexDir } : {}),\n });\n const policyText = `writable=${String(args.writable)}`;\n\n if (args.transport === 'http') {\n try {\n const handle = await serveHttp(server, {\n port: args.httpPort,\n host: args.httpHost,\n ...(args.httpToken ? { token: args.httpToken } : {}),\n logger: { warn: (message) => process.stderr.write(`[codebase-index-mcp] ${message}\\n`) },\n });\n process.stderr.write(\n `${SERVER_INFO.name}: ready at ${handle.url} \u2014 projectRoot=${projectRoot} transport=http ${policyText}${\n args.httpToken ? ' [token auth]' : ''\n }\\n`,\n );\n await new Promise<void>((resolve) => {\n process.once('SIGINT', resolve);\n process.once('SIGTERM', resolve);\n });\n await handle.close();\n return 0;\n } finally {\n await shutdownCodebaseIndexHost();\n }\n }\n\n try {\n const handle = serveStdio(server);\n process.stderr.write(\n `${SERVER_INFO.name}: ready on stdio \u2014 projectRoot=${projectRoot} transport=stdio ${policyText}\\n`,\n );\n await handle.done;\n return 0;\n } finally {\n await shutdownCodebaseIndexHost();\n }\n}\n\nfunction isMainModule(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n const self = fileURLToPath(import.meta.url);\n const comparablePath = (value: string): string => {\n const normalized = path.resolve(value).replace(/^\\\\\\\\\\?\\\\/, '');\n return process.platform === 'win32' ? normalized.toLowerCase() : normalized;\n };\n if (comparablePath(entry) === comparablePath(self)) return true;\n try {\n return comparablePath(realpathSync(entry)) === comparablePath(realpathSync(self));\n } catch {\n return false;\n }\n}\n\nif (isMainModule()) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error) => {\n process.stderr.write(`${SERVER_INFO.name}: unexpected error\\n`);\n process.stderr.write(error instanceof Error ? (error.stack ?? error.message) : String(error));\n process.stderr.write('\\n');\n process.exitCode = 1;\n },\n );\n}\n", "import type { Context } from '@wrongstack/core/agent';\nimport type { JSONSchema, Tool } from '@wrongstack/core/types';\nimport {\n MCPServer,\n type MCPServerCallResult,\n type MCPServerTool,\n type MCPServerToolHost,\n} from '@wrongstack/mcp';\nimport {\n codebaseIndexTool,\n codebaseSearchTool,\n codebaseStatsTool,\n fileGraphService,\n packageGraphService,\n symbolGraphService,\n} from '@wrongstack/tools/codebase-index';\nimport {\n type CodebaseIndexMcpPolicyOptions,\n type CodebaseIndexMcpToolName,\n selectCodebaseIndexMcpTools,\n} from './policy.js';\nimport { SERVER_INFO } from './version.js';\n\ninterface GraphBaseArgs {\n projectRoot: string;\n indexDir?: string | undefined;\n}\n\ninterface FileGraphArgs extends GraphBaseArgs {\n packageFilter: string;\n}\n\ninterface SymbolGraphArgs extends GraphBaseArgs {\n fileFilter: string;\n}\n\nexport interface CodebaseIndexMcpDependencies {\n executeTool?: (\n tool: Tool,\n args: Record<string, unknown>,\n context: Context,\n signal: AbortSignal,\n ) => Promise<unknown>;\n packageGraph?: (args: GraphBaseArgs) => Promise<unknown>;\n fileGraph?: (args: FileGraphArgs) => Promise<unknown>;\n symbolGraph?: (args: SymbolGraphArgs) => Promise<unknown>;\n}\n\nexport interface CodebaseIndexMcpToolHostOptions extends CodebaseIndexMcpPolicyOptions {\n indexDir?: string | undefined;\n dependencies?: CodebaseIndexMcpDependencies | undefined;\n}\n\nconst GRAPH_SCHEMAS = {\n codebase_package_graph: {\n type: 'object',\n properties: {},\n additionalProperties: false,\n },\n codebase_file_graph: {\n type: 'object',\n properties: {\n package: {\n type: 'string',\n description:\n 'Package name or path fragment whose file dependency graph should be returned.',\n },\n },\n required: ['package'],\n additionalProperties: false,\n },\n codebase_symbol_graph: {\n type: 'object',\n properties: {\n file: {\n type: 'string',\n description: 'Project-relative file path whose symbol dependency graph should be returned.',\n },\n },\n required: ['file'],\n additionalProperties: false,\n },\n} as const satisfies Partial<Record<CodebaseIndexMcpToolName, Record<string, unknown>>>;\n\nconst TOOL_DESCRIPTIONS: Record<CodebaseIndexMcpToolName, string> = {\n codebase_search:\n 'Search the project symbol index with SQLite FTS5 and BM25 ranking. Use this before broad filesystem exploration.',\n codebase_stats:\n 'Inspect the persisted project index health, freshness, symbol counts, language breakdown, and storage path.',\n codebase_package_graph:\n 'Return the project package dependency graph from the authoritative Codebase Index service.',\n codebase_file_graph: 'Return the file dependency graph for one package or package-path fragment.',\n codebase_symbol_graph: 'Return the symbol dependency graph for one project-relative source file.',\n codebase_index:\n 'Build or incrementally refresh the project Codebase Index. Hidden unless the server starts with --writable.',\n};\n\nconst BUILTIN_TOOLS: Partial<Record<CodebaseIndexMcpToolName, Tool>> = {\n codebase_search: codebaseSearchTool,\n codebase_stats: codebaseStatsTool,\n codebase_index: codebaseIndexTool,\n};\n\nfunction cloneToolSchema(name: CodebaseIndexMcpToolName, tool: Tool): Record<string, unknown> {\n const schema = structuredClone(tool.inputSchema) as JSONSchema;\n if (name === 'codebase_search') {\n const properties = schema.properties as Record<string, unknown> | undefined;\n if (properties) delete properties['preferLsp'];\n }\n return schema as unknown as Record<string, unknown>;\n}\n\nfunction toolDescriptor(name: CodebaseIndexMcpToolName): MCPServerTool {\n const builtin = BUILTIN_TOOLS[name];\n const graphSchema = GRAPH_SCHEMAS[name as keyof typeof GRAPH_SCHEMAS];\n if (!builtin && !graphSchema) throw new Error(`Codebase Index MCP: missing schema for ${name}`);\n return {\n name,\n description: TOOL_DESCRIPTIONS[name],\n inputSchema: builtin ? cloneToolSchema(name, builtin) : graphSchema!,\n };\n}\n\nfunction createContext(projectRoot: string, indexDir?: string): Context {\n return {\n systemPrompt: [],\n cwd: projectRoot,\n projectRoot,\n allowOutsideProjectRoot: false,\n model: 'codebase-index-mcp',\n tools: [],\n meta: {\n source: 'codebase-index-mcp',\n ...(indexDir ? { codebaseIndexDir: indexDir } : {}),\n },\n } as unknown as Context;\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction validateArgs(\n name: CodebaseIndexMcpToolName,\n args: Record<string, unknown>,\n): string | null {\n if (name === 'codebase_search' && !nonEmptyString(args['query'])) {\n return 'codebase_search requires a non-empty string \"query\"';\n }\n if (name === 'codebase_file_graph' && !nonEmptyString(args['package'])) {\n return 'codebase_file_graph requires a non-empty string \"package\"';\n }\n if (name === 'codebase_symbol_graph' && !nonEmptyString(args['file'])) {\n return 'codebase_symbol_graph requires a non-empty string \"file\"';\n }\n if (name === 'codebase_index') {\n if (args['force'] !== undefined && typeof args['force'] !== 'boolean') {\n return 'codebase_index \"force\" must be a boolean';\n }\n if (\n args['langs'] !== undefined &&\n (!Array.isArray(args['langs']) || !args['langs'].every((lang) => typeof lang === 'string'))\n ) {\n return 'codebase_index \"langs\" must be an array of language strings';\n }\n }\n return null;\n}\n\nexport function createCodebaseIndexMcpToolHost(\n projectRoot: string,\n opts: CodebaseIndexMcpToolHostOptions = {},\n): MCPServerToolHost {\n const selected = selectCodebaseIndexMcpTools(opts);\n const allowed = new Set<CodebaseIndexMcpToolName>(selected);\n const context = createContext(projectRoot, opts.indexDir);\n const executeTool =\n opts.dependencies?.executeTool ??\n (async (tool: Tool, args: Record<string, unknown>, ctx: Context, signal: AbortSignal) =>\n await tool.execute(args as never, ctx, { signal }));\n const getPackageGraph = opts.dependencies?.packageGraph ?? packageGraphService;\n const getFileGraph = opts.dependencies?.fileGraph ?? fileGraphService;\n const getSymbolGraph = opts.dependencies?.symbolGraph ?? symbolGraphService;\n\n return {\n listTools(): MCPServerTool[] {\n return selected.map(toolDescriptor);\n },\n\n async callTool(name: string, args: Record<string, unknown>): Promise<MCPServerCallResult> {\n if (!allowed.has(name as CodebaseIndexMcpToolName)) {\n return {\n content: `Tool \"${name}\" is not exposed by this Codebase Index MCP server`,\n isError: true,\n };\n }\n\n const toolName = name as CodebaseIndexMcpToolName;\n const validationError = validateArgs(toolName, args);\n if (validationError) return { content: validationError, isError: true };\n\n try {\n const builtin = BUILTIN_TOOLS[toolName];\n if (builtin) {\n const validate = builtin.validate;\n if (typeof validate === 'function') {\n const errors = await validate(args);\n if (Array.isArray(errors) && errors.length > 0) {\n return { content: errors.join('\\n'), isError: true };\n }\n }\n const content = await executeTool(builtin, args, context, new AbortController().signal);\n return { content, isError: false };\n }\n\n const base = {\n projectRoot,\n ...(opts.indexDir ? { indexDir: opts.indexDir } : {}),\n };\n if (toolName === 'codebase_package_graph') {\n return { content: await getPackageGraph(base), isError: false };\n }\n if (toolName === 'codebase_file_graph') {\n return {\n content: await getFileGraph({ ...base, packageFilter: String(args['package']) }),\n isError: false,\n };\n }\n return {\n content: await getSymbolGraph({ ...base, fileFilter: String(args['file']) }),\n isError: false,\n };\n } catch (error) {\n return {\n content: error instanceof Error ? error.message : String(error),\n isError: true,\n };\n }\n },\n };\n}\n\nexport function createCodebaseIndexMcpServer(\n projectRoot: string,\n opts: CodebaseIndexMcpToolHostOptions = {},\n): MCPServer {\n return new MCPServer({\n host: createCodebaseIndexMcpToolHost(projectRoot, opts),\n serverInfo: { name: 'wrongstack-codebase-index-mcp', version: SERVER_INFO.version },\n prompts: [\n {\n name: 'explore-codebase',\n title: 'Explore a project through Codebase Index',\n description: 'Check index readiness, then locate symbols and dependency relationships.',\n arguments: [{ name: 'query', description: 'Symbol or concept to locate', required: true }],\n template:\n 'Use the Codebase Index MCP tools to explore {{query}}. Start with codebase_stats, use codebase_search before broad filesystem scans, and follow relevant package, file, or symbol graphs. If no persisted index exists and codebase_index is available, build it once and retry.',\n },\n ],\n });\n}\n", "export const CODEBASE_INDEX_READ_TOOLS = [\n 'codebase_search',\n 'codebase_stats',\n 'codebase_package_graph',\n 'codebase_file_graph',\n 'codebase_symbol_graph',\n] as const;\n\nexport const CODEBASE_INDEX_WRITE_TOOLS = ['codebase_index'] as const;\n\nexport type CodebaseIndexMcpReadToolName = (typeof CODEBASE_INDEX_READ_TOOLS)[number];\nexport type CodebaseIndexMcpWriteToolName = (typeof CODEBASE_INDEX_WRITE_TOOLS)[number];\nexport type CodebaseIndexMcpToolName = CodebaseIndexMcpReadToolName | CodebaseIndexMcpWriteToolName;\n\nexport interface CodebaseIndexMcpPolicyOptions {\n writable?: boolean;\n}\n\nexport function selectCodebaseIndexMcpTools(\n opts: CodebaseIndexMcpPolicyOptions = {},\n): CodebaseIndexMcpToolName[] {\n return opts.writable === true\n ? [...CODEBASE_INDEX_READ_TOOLS, ...CODEBASE_INDEX_WRITE_TOOLS]\n : [...CODEBASE_INDEX_READ_TOOLS];\n}\n", "import { readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst here = dirname(fileURLToPath(import.meta.url));\nconst packagePath = resolve(here, '..', 'package.json');\n\ninterface MinimalPackage {\n name?: string;\n version?: string;\n}\n\nlet cached: { name: string; version: string } | undefined;\n\nfunction readServerInfo(): { name: string; version: string } {\n if (cached) return cached;\n try {\n const pkg = JSON.parse(readFileSync(packagePath, 'utf8')) as MinimalPackage;\n cached = {\n name: pkg.name ?? '@wrongstack/codebase-index-mcp',\n version: pkg.version ?? '0.0.0',\n };\n } catch {\n cached = { name: '@wrongstack/codebase-index-mcp', version: '0.0.0' };\n }\n return cached;\n}\n\nexport const SERVER_INFO = readServerInfo();\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["fileURLToPath", "resolve", "fileURLToPath"]
|
|
7
|
-
}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC7B,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/adapter.ts", "../src/policy.ts", "../src/version.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Context } from '@wrongstack/core/agent';\nimport type { JSONSchema, Tool } from '@wrongstack/core/types';\nimport {\n MCPServer,\n type MCPServerCallResult,\n type MCPServerTool,\n type MCPServerToolHost,\n} from '@wrongstack/mcp';\nimport {\n codebaseIndexTool,\n codebaseSearchTool,\n codebaseStatsTool,\n fileGraphService,\n packageGraphService,\n symbolGraphService,\n} from '@wrongstack/tools/codebase-index';\nimport {\n type CodebaseIndexMcpPolicyOptions,\n type CodebaseIndexMcpToolName,\n selectCodebaseIndexMcpTools,\n} from './policy.js';\nimport { SERVER_INFO } from './version.js';\n\ninterface GraphBaseArgs {\n projectRoot: string;\n indexDir?: string | undefined;\n}\n\ninterface FileGraphArgs extends GraphBaseArgs {\n packageFilter: string;\n}\n\ninterface SymbolGraphArgs extends GraphBaseArgs {\n fileFilter: string;\n}\n\nexport interface CodebaseIndexMcpDependencies {\n executeTool?: (\n tool: Tool,\n args: Record<string, unknown>,\n context: Context,\n signal: AbortSignal,\n ) => Promise<unknown>;\n packageGraph?: (args: GraphBaseArgs) => Promise<unknown>;\n fileGraph?: (args: FileGraphArgs) => Promise<unknown>;\n symbolGraph?: (args: SymbolGraphArgs) => Promise<unknown>;\n}\n\nexport interface CodebaseIndexMcpToolHostOptions extends CodebaseIndexMcpPolicyOptions {\n indexDir?: string | undefined;\n dependencies?: CodebaseIndexMcpDependencies | undefined;\n}\n\nconst GRAPH_SCHEMAS = {\n codebase_package_graph: {\n type: 'object',\n properties: {},\n additionalProperties: false,\n },\n codebase_file_graph: {\n type: 'object',\n properties: {\n package: {\n type: 'string',\n description:\n 'Package name or path fragment whose file dependency graph should be returned.',\n },\n },\n required: ['package'],\n additionalProperties: false,\n },\n codebase_symbol_graph: {\n type: 'object',\n properties: {\n file: {\n type: 'string',\n description: 'Project-relative file path whose symbol dependency graph should be returned.',\n },\n },\n required: ['file'],\n additionalProperties: false,\n },\n} as const satisfies Partial<Record<CodebaseIndexMcpToolName, Record<string, unknown>>>;\n\nconst TOOL_DESCRIPTIONS: Record<CodebaseIndexMcpToolName, string> = {\n codebase_search:\n 'Search the project symbol index with SQLite FTS5 and BM25 ranking. Use this before broad filesystem exploration.',\n codebase_stats:\n 'Inspect the persisted project index health, freshness, symbol counts, language breakdown, and storage path.',\n codebase_package_graph:\n 'Return the project package dependency graph from the authoritative Codebase Index service.',\n codebase_file_graph: 'Return the file dependency graph for one package or package-path fragment.',\n codebase_symbol_graph: 'Return the symbol dependency graph for one project-relative source file.',\n codebase_index:\n 'Build or incrementally refresh the project Codebase Index. Hidden unless the server starts with --writable.',\n};\n\nconst BUILTIN_TOOLS: Partial<Record<CodebaseIndexMcpToolName, Tool>> = {\n codebase_search: codebaseSearchTool,\n codebase_stats: codebaseStatsTool,\n codebase_index: codebaseIndexTool,\n};\n\nfunction cloneToolSchema(name: CodebaseIndexMcpToolName, tool: Tool): Record<string, unknown> {\n const schema = structuredClone(tool.inputSchema) as JSONSchema;\n if (name === 'codebase_search') {\n const properties = schema.properties as Record<string, unknown> | undefined;\n if (properties) delete properties['preferLsp'];\n }\n return schema as unknown as Record<string, unknown>;\n}\n\nfunction toolDescriptor(name: CodebaseIndexMcpToolName): MCPServerTool {\n const builtin = BUILTIN_TOOLS[name];\n const graphSchema = GRAPH_SCHEMAS[name as keyof typeof GRAPH_SCHEMAS];\n if (!builtin && !graphSchema) throw new Error(`Codebase Index MCP: missing schema for ${name}`);\n return {\n name,\n description: TOOL_DESCRIPTIONS[name],\n inputSchema: builtin ? cloneToolSchema(name, builtin) : graphSchema!,\n };\n}\n\nfunction createContext(projectRoot: string, indexDir?: string): Context {\n return {\n systemPrompt: [],\n cwd: projectRoot,\n projectRoot,\n allowOutsideProjectRoot: false,\n model: 'codebase-index-mcp',\n tools: [],\n meta: {\n source: 'codebase-index-mcp',\n ...(indexDir ? { codebaseIndexDir: indexDir } : {}),\n },\n } as unknown as Context;\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction validateArgs(\n name: CodebaseIndexMcpToolName,\n args: Record<string, unknown>,\n): string | null {\n if (name === 'codebase_search' && !nonEmptyString(args['query'])) {\n return 'codebase_search requires a non-empty string \"query\"';\n }\n if (name === 'codebase_file_graph' && !nonEmptyString(args['package'])) {\n return 'codebase_file_graph requires a non-empty string \"package\"';\n }\n if (name === 'codebase_symbol_graph' && !nonEmptyString(args['file'])) {\n return 'codebase_symbol_graph requires a non-empty string \"file\"';\n }\n if (name === 'codebase_index') {\n if (args['force'] !== undefined && typeof args['force'] !== 'boolean') {\n return 'codebase_index \"force\" must be a boolean';\n }\n if (\n args['langs'] !== undefined &&\n (!Array.isArray(args['langs']) || !args['langs'].every((lang) => typeof lang === 'string'))\n ) {\n return 'codebase_index \"langs\" must be an array of language strings';\n }\n }\n return null;\n}\n\nexport function createCodebaseIndexMcpToolHost(\n projectRoot: string,\n opts: CodebaseIndexMcpToolHostOptions = {},\n): MCPServerToolHost {\n const selected = selectCodebaseIndexMcpTools(opts);\n const allowed = new Set<CodebaseIndexMcpToolName>(selected);\n const context = createContext(projectRoot, opts.indexDir);\n const executeTool =\n opts.dependencies?.executeTool ??\n (async (tool: Tool, args: Record<string, unknown>, ctx: Context, signal: AbortSignal) =>\n await tool.execute(args as never, ctx, { signal }));\n const getPackageGraph = opts.dependencies?.packageGraph ?? packageGraphService;\n const getFileGraph = opts.dependencies?.fileGraph ?? fileGraphService;\n const getSymbolGraph = opts.dependencies?.symbolGraph ?? symbolGraphService;\n\n return {\n listTools(): MCPServerTool[] {\n return selected.map(toolDescriptor);\n },\n\n async callTool(name: string, args: Record<string, unknown>): Promise<MCPServerCallResult> {\n if (!allowed.has(name as CodebaseIndexMcpToolName)) {\n return {\n content: `Tool \"${name}\" is not exposed by this Codebase Index MCP server`,\n isError: true,\n };\n }\n\n const toolName = name as CodebaseIndexMcpToolName;\n const validationError = validateArgs(toolName, args);\n if (validationError) return { content: validationError, isError: true };\n\n try {\n const builtin = BUILTIN_TOOLS[toolName];\n if (builtin) {\n const validate = builtin.validate;\n if (typeof validate === 'function') {\n const errors = await validate(args);\n if (Array.isArray(errors) && errors.length > 0) {\n return { content: errors.join('\\n'), isError: true };\n }\n }\n const content = await executeTool(builtin, args, context, new AbortController().signal);\n return { content, isError: false };\n }\n\n const base = {\n projectRoot,\n ...(opts.indexDir ? { indexDir: opts.indexDir } : {}),\n };\n if (toolName === 'codebase_package_graph') {\n return { content: await getPackageGraph(base), isError: false };\n }\n if (toolName === 'codebase_file_graph') {\n return {\n content: await getFileGraph({ ...base, packageFilter: String(args['package']) }),\n isError: false,\n };\n }\n return {\n content: await getSymbolGraph({ ...base, fileFilter: String(args['file']) }),\n isError: false,\n };\n } catch (error) {\n return {\n content: error instanceof Error ? error.message : String(error),\n isError: true,\n };\n }\n },\n };\n}\n\nexport function createCodebaseIndexMcpServer(\n projectRoot: string,\n opts: CodebaseIndexMcpToolHostOptions = {},\n): MCPServer {\n return new MCPServer({\n host: createCodebaseIndexMcpToolHost(projectRoot, opts),\n serverInfo: { name: 'wrongstack-codebase-index-mcp', version: SERVER_INFO.version },\n prompts: [\n {\n name: 'explore-codebase',\n title: 'Explore a project through Codebase Index',\n description: 'Check index readiness, then locate symbols and dependency relationships.',\n arguments: [{ name: 'query', description: 'Symbol or concept to locate', required: true }],\n template:\n 'Use the Codebase Index MCP tools to explore {{query}}. Start with codebase_stats, use codebase_search before broad filesystem scans, and follow relevant package, file, or symbol graphs. If no persisted index exists and codebase_index is available, build it once and retry.',\n },\n ],\n });\n}\n", "export const CODEBASE_INDEX_READ_TOOLS = [\n 'codebase_search',\n 'codebase_stats',\n 'codebase_package_graph',\n 'codebase_file_graph',\n 'codebase_symbol_graph',\n] as const;\n\nexport const CODEBASE_INDEX_WRITE_TOOLS = ['codebase_index'] as const;\n\nexport type CodebaseIndexMcpReadToolName = (typeof CODEBASE_INDEX_READ_TOOLS)[number];\nexport type CodebaseIndexMcpWriteToolName = (typeof CODEBASE_INDEX_WRITE_TOOLS)[number];\nexport type CodebaseIndexMcpToolName = CodebaseIndexMcpReadToolName | CodebaseIndexMcpWriteToolName;\n\nexport interface CodebaseIndexMcpPolicyOptions {\n writable?: boolean;\n}\n\nexport function selectCodebaseIndexMcpTools(\n opts: CodebaseIndexMcpPolicyOptions = {},\n): CodebaseIndexMcpToolName[] {\n return opts.writable === true\n ? [...CODEBASE_INDEX_READ_TOOLS, ...CODEBASE_INDEX_WRITE_TOOLS]\n : [...CODEBASE_INDEX_READ_TOOLS];\n}\n", "import { readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst here = dirname(fileURLToPath(import.meta.url));\nconst packagePath = resolve(here, '..', 'package.json');\n\ninterface MinimalPackage {\n name?: string;\n version?: string;\n}\n\nlet cached: { name: string; version: string } | undefined;\n\nfunction readServerInfo(): { name: string; version: string } {\n if (cached) return cached;\n try {\n const pkg = JSON.parse(readFileSync(packagePath, 'utf8')) as MinimalPackage;\n cached = {\n name: pkg.name ?? '@wrongstack/codebase-index-mcp',\n version: pkg.version ?? '0.0.0',\n };\n } catch {\n cached = { name: '@wrongstack/codebase-index-mcp', version: '0.0.0' };\n }\n return cached;\n}\n\nexport const SERVER_INFO = readServerInfo();\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/policy.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,YACpC,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,CACf,CAAC;AAEX,eAAO,MAAM,0BAA0B,YAAI,gBAAgB,CAAU,CAAC;AAEtE,MAAM,MAAM,4BAA4B,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AACtF,MAAM,MAAM,6BAA6B,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AACxF,MAAM,MAAM,wBAAwB,GAAG,4BAA4B,GAAG,6BAA6B,CAAC;AAEpG,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,2BAA2B,CACzC,IAAI,GAAE,6BAAkC,GACvC,wBAAwB,EAAE,CAI5B"}
|
package/dist/version.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AA4BA,eAAO,MAAM,WAAW;UAdW,MAAM;aAAW,MAAM;CAcf,CAAC"}
|