@prom.codes/context-mcp 0.3.0 → 0.4.1

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.
Files changed (2) hide show
  1. package/dist/bin.js +128 -34
  2. package/package.json +1 -1
package/dist/bin.js CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // dist/bin.js
4
+ import { McpServer as McpServer2 } from "@modelcontextprotocol/sdk/server/mcp.js";
4
5
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
6
 
6
7
  // ../indexer/dist/languages.js
@@ -3486,17 +3487,52 @@ var SENSITIVE_PATH_ERROR = "path matches the sensitive-file deny-list";
3486
3487
  // ../shared/dist/index.js
3487
3488
  var PROMETHEUS_VERSION = "0.1.0";
3488
3489
 
3489
- // ../indexer/dist/watcher.js
3490
- var DEFAULT_IGNORED = [
3491
- /(^|[/\\])\.git([/\\]|$)/,
3492
- /(^|[/\\])node_modules([/\\]|$)/,
3493
- /(^|[/\\])dist([/\\]|$)/,
3494
- /(^|[/\\])build([/\\]|$)/,
3495
- /(^|[/\\])out([/\\]|$)/,
3496
- /(^|[/\\])\.turbo([/\\]|$)/,
3497
- /(^|[/\\])\.next([/\\]|$)/,
3498
- /(^|[/\\])coverage([/\\]|$)/
3490
+ // ../indexer/dist/ignore.js
3491
+ var IGNORED_DIR_NAMES = [
3492
+ // VCS + JS/TS
3493
+ ".git",
3494
+ "node_modules",
3495
+ "dist",
3496
+ "build",
3497
+ "out",
3498
+ ".turbo",
3499
+ ".next",
3500
+ "coverage",
3501
+ "bower_components",
3502
+ ".yarn",
3503
+ ".pnpm-store",
3504
+ ".svelte-kit",
3505
+ ".nuxt",
3506
+ ".output",
3507
+ ".expo",
3508
+ ".vercel",
3509
+ ".nyc_output",
3510
+ // Python
3511
+ ".venv",
3512
+ "venv",
3513
+ "__pycache__",
3514
+ ".tox",
3515
+ ".mypy_cache",
3516
+ ".pytest_cache",
3517
+ ".ruff_cache",
3518
+ ".ipynb_checkpoints",
3519
+ // Rust / Java / JVM / native deps
3520
+ "target",
3521
+ "vendor",
3522
+ ".gradle",
3523
+ "Pods",
3524
+ // Generic caches / IDE / temp
3525
+ ".cache",
3526
+ ".parcel-cache",
3527
+ ".idea",
3528
+ "tmp",
3529
+ ".tmp"
3499
3530
  ];
3531
+ var RELATIVE_IGNORED_PATTERNS = IGNORED_DIR_NAMES.map((name) => new RegExp(`(^|/)${name.replace(/\./g, "\\.")}(/|$)`));
3532
+ var WATCHER_IGNORED_PATTERNS = IGNORED_DIR_NAMES.map((name) => new RegExp(`(^|[/\\\\])${name.replace(/\./g, "\\.")}([/\\\\]|$)`));
3533
+
3534
+ // ../indexer/dist/watcher.js
3535
+ var DEFAULT_IGNORED = WATCHER_IGNORED_PATTERNS;
3500
3536
  function toRelative(absoluteRoot, abs) {
3501
3537
  const root = absoluteRoot.endsWith(sep) ? absoluteRoot : absoluteRoot + sep;
3502
3538
  const rel = abs.startsWith(root) ? abs.slice(root.length) : abs;
@@ -3766,16 +3802,7 @@ function toRelative2(absoluteRoot, abs) {
3766
3802
  const rel = abs.startsWith(root) ? abs.slice(root.length) : abs;
3767
3803
  return rel.split(sep2).join("/");
3768
3804
  }
3769
- var DEFAULT_IGNORED_PATTERNS = [
3770
- /(^|\/)\.git(\/|$)/,
3771
- /(^|\/)node_modules(\/|$)/,
3772
- /(^|\/)dist(\/|$)/,
3773
- /(^|\/)build(\/|$)/,
3774
- /(^|\/)out(\/|$)/,
3775
- /(^|\/)\.turbo(\/|$)/,
3776
- /(^|\/)\.next(\/|$)/,
3777
- /(^|\/)coverage(\/|$)/
3778
- ];
3805
+ var DEFAULT_IGNORED_PATTERNS = RELATIVE_IGNORED_PATTERNS;
3779
3806
  var WorkspaceIndexer = class {
3780
3807
  #root;
3781
3808
  #storage;
@@ -8301,7 +8328,10 @@ function discoverStorageBackend(env, regionMode, options = {}) {
8301
8328
  }
8302
8329
  async function composeFromEnv(opts) {
8303
8330
  const env = opts.env;
8304
- const workspaceRoot = env.PROMETHEUS_WORKSPACE_ROOT ?? process.cwd();
8331
+ const override = (opts.workspaceRootOverride ?? "").trim();
8332
+ const envRoot = (env.PROMETHEUS_WORKSPACE_ROOT ?? "").trim();
8333
+ const claudeRoot = (env.CLAUDE_PROJECT_DIR ?? "").trim();
8334
+ const workspaceRoot = override !== "" ? override : envRoot !== "" ? envRoot : claudeRoot !== "" ? claudeRoot : process.cwd();
8305
8335
  const workspaceId = (env.PROMETHEUS_WORKSPACE_ID ?? "") !== "" ? env.PROMETHEUS_WORKSPACE_ID : workspaceRoot;
8306
8336
  const workspaceName = (env.PROMETHEUS_WORKSPACE_NAME ?? "") !== "" ? env.PROMETHEUS_WORKSPACE_NAME : basename5(workspaceRoot) || workspaceRoot;
8307
8337
  const { id: providerId, provider: embedder, regionMode } = discoverEmbeddingProvider(env, opts.fetch);
@@ -8341,6 +8371,36 @@ async function composeFromEnv(opts) {
8341
8371
  };
8342
8372
  }
8343
8373
 
8374
+ // dist/roots.js
8375
+ import { fileURLToPath as fileURLToPath2 } from "node:url";
8376
+ async function rootFromClient(server, timeoutMs = 2500) {
8377
+ let supportsRoots = false;
8378
+ try {
8379
+ supportsRoots = server.getClientCapabilities()?.roots != null;
8380
+ } catch {
8381
+ return null;
8382
+ }
8383
+ if (!supportsRoots)
8384
+ return null;
8385
+ let res;
8386
+ try {
8387
+ res = await server.listRoots(void 0, { timeout: timeoutMs });
8388
+ } catch {
8389
+ return null;
8390
+ }
8391
+ const roots = res?.roots ?? [];
8392
+ for (const r of roots) {
8393
+ const uri = typeof r?.uri === "string" ? r.uri : "";
8394
+ if (uri.startsWith("file://")) {
8395
+ try {
8396
+ return fileURLToPath2(uri);
8397
+ } catch {
8398
+ }
8399
+ }
8400
+ }
8401
+ return null;
8402
+ }
8403
+
8344
8404
  // dist/server.js
8345
8405
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8346
8406
 
@@ -8886,13 +8946,6 @@ var SERVER_IDENTITY = {
8886
8946
  version: PROMETHEUS_VERSION,
8887
8947
  title: "prom.codes Context"
8888
8948
  };
8889
- function createServer(deps, options = {}) {
8890
- const identity = { ...SERVER_IDENTITY, ...options.identity ?? {} };
8891
- const capabilities = options.capabilities ?? { tools: {} };
8892
- const server = new McpServer(identity, { capabilities });
8893
- registerTools(server, deps);
8894
- return server;
8895
- }
8896
8949
 
8897
8950
  // dist/bin.js
8898
8951
  function errMessage(err) {
@@ -8930,12 +8983,14 @@ function startManagedIndexing(composed) {
8930
8983
  return indexer;
8931
8984
  }
8932
8985
  async function main() {
8933
- const composed = await composeFromEnv({ env: process.env });
8934
- process.stderr.write(`prometheus-context-mcp: storage=${composed.storageBackend} provider=${composed.providerId} region-mode=${composed.regionMode} managed=${composed.managed} workspace=${composed.workspaceRoot}${composed.dbPath !== null ? ` db=${composed.dbPath}` : ""}
8935
- `);
8936
- const server = createServer(composed);
8986
+ const env = process.env;
8987
+ const explicitRoot = (env.PROMETHEUS_WORKSPACE_ROOT ?? "").trim();
8988
+ const claudeRoot = (env.CLAUDE_PROJECT_DIR ?? "").trim();
8989
+ const eagerVia = explicitRoot !== "" ? "PROMETHEUS_WORKSPACE_ROOT" : claudeRoot !== "" ? "CLAUDE_PROJECT_DIR" : null;
8937
8990
  const transport = new StdioServerTransport();
8938
- const managedIndexer = composed.managed ? startManagedIndexing(composed) : null;
8991
+ const server = new McpServer2(SERVER_IDENTITY, { capabilities: { tools: {} } });
8992
+ let composed = null;
8993
+ let managedIndexer = null;
8939
8994
  const shutdown = async (signal) => {
8940
8995
  process.stderr.write(`prometheus-context-mcp: received ${signal}, shutting down
8941
8996
  `);
@@ -8948,13 +9003,52 @@ async function main() {
8948
9003
  } catch {
8949
9004
  }
8950
9005
  }
8951
- await composed.close();
9006
+ if (composed !== null)
9007
+ await composed.close();
8952
9008
  process.exit(0);
8953
9009
  }
8954
9010
  };
8955
9011
  process.once("SIGINT", shutdown);
8956
9012
  process.once("SIGTERM", shutdown);
9013
+ const boot = async (override, via) => {
9014
+ composed = await composeFromEnv({
9015
+ env,
9016
+ ...override !== void 0 && override !== "" ? { workspaceRootOverride: override } : {}
9017
+ });
9018
+ process.stderr.write(`prometheus-context-mcp: storage=${composed.storageBackend} provider=${composed.providerId} region-mode=${composed.regionMode} managed=${composed.managed} workspace=${composed.workspaceRoot} (via ${via})${composed.dbPath !== null ? ` db=${composed.dbPath}` : ""}
9019
+ `);
9020
+ registerTools(server, composed);
9021
+ if (composed.managed)
9022
+ managedIndexer = startManagedIndexing(composed);
9023
+ };
9024
+ if (eagerVia !== null) {
9025
+ await boot(void 0, eagerVia);
9026
+ await server.connect(transport);
9027
+ return;
9028
+ }
9029
+ let booted = false;
9030
+ const resolveAndBoot = async () => {
9031
+ if (booted)
9032
+ return;
9033
+ booted = true;
9034
+ try {
9035
+ const fromRoots = await rootFromClient(server.server);
9036
+ if (fromRoots !== null)
9037
+ await boot(fromRoots, "MCP roots");
9038
+ else
9039
+ await boot(process.cwd(), "cwd fallback (client advertised no roots)");
9040
+ } catch (err) {
9041
+ process.stderr.write(`prometheus-context-mcp: fatal during boot: ${errMessage(err)}
9042
+ `);
9043
+ process.exit(1);
9044
+ }
9045
+ };
9046
+ server.server.oninitialized = () => {
9047
+ void resolveAndBoot();
9048
+ };
8957
9049
  await server.connect(transport);
9050
+ const t = setTimeout(() => void resolveAndBoot(), 5e3);
9051
+ t.unref?.();
8958
9052
  }
8959
9053
  main().catch((err) => {
8960
9054
  const message = err instanceof Error ? err.message : String(err);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prom.codes/context-mcp",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "description": "prom.codes Context — local-first codebase indexing & retrieval as an MCP server.",
5
5
  "type": "module",
6
6
  "bin": {