@prom.codes/context-mcp 0.3.0 → 0.4.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.
Files changed (2) hide show
  1. package/dist/bin.js +125 -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,9 @@ 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 workspaceRoot = override !== "" ? override : envRoot !== "" ? envRoot : process.cwd();
8305
8334
  const workspaceId = (env.PROMETHEUS_WORKSPACE_ID ?? "") !== "" ? env.PROMETHEUS_WORKSPACE_ID : workspaceRoot;
8306
8335
  const workspaceName = (env.PROMETHEUS_WORKSPACE_NAME ?? "") !== "" ? env.PROMETHEUS_WORKSPACE_NAME : basename5(workspaceRoot) || workspaceRoot;
8307
8336
  const { id: providerId, provider: embedder, regionMode } = discoverEmbeddingProvider(env, opts.fetch);
@@ -8341,6 +8370,36 @@ async function composeFromEnv(opts) {
8341
8370
  };
8342
8371
  }
8343
8372
 
8373
+ // dist/roots.js
8374
+ import { fileURLToPath as fileURLToPath2 } from "node:url";
8375
+ async function rootFromClient(server, timeoutMs = 2500) {
8376
+ let supportsRoots = false;
8377
+ try {
8378
+ supportsRoots = server.getClientCapabilities()?.roots != null;
8379
+ } catch {
8380
+ return null;
8381
+ }
8382
+ if (!supportsRoots)
8383
+ return null;
8384
+ let res;
8385
+ try {
8386
+ res = await server.listRoots(void 0, { timeout: timeoutMs });
8387
+ } catch {
8388
+ return null;
8389
+ }
8390
+ const roots = res?.roots ?? [];
8391
+ for (const r of roots) {
8392
+ const uri = typeof r?.uri === "string" ? r.uri : "";
8393
+ if (uri.startsWith("file://")) {
8394
+ try {
8395
+ return fileURLToPath2(uri);
8396
+ } catch {
8397
+ }
8398
+ }
8399
+ }
8400
+ return null;
8401
+ }
8402
+
8344
8403
  // dist/server.js
8345
8404
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8346
8405
 
@@ -8886,13 +8945,6 @@ var SERVER_IDENTITY = {
8886
8945
  version: PROMETHEUS_VERSION,
8887
8946
  title: "prom.codes Context"
8888
8947
  };
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
8948
 
8897
8949
  // dist/bin.js
8898
8950
  function errMessage(err) {
@@ -8930,12 +8982,12 @@ function startManagedIndexing(composed) {
8930
8982
  return indexer;
8931
8983
  }
8932
8984
  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);
8985
+ const env = process.env;
8986
+ const explicitRoot = (env.PROMETHEUS_WORKSPACE_ROOT ?? "").trim();
8937
8987
  const transport = new StdioServerTransport();
8938
- const managedIndexer = composed.managed ? startManagedIndexing(composed) : null;
8988
+ const server = new McpServer2(SERVER_IDENTITY, { capabilities: { tools: {} } });
8989
+ let composed = null;
8990
+ let managedIndexer = null;
8939
8991
  const shutdown = async (signal) => {
8940
8992
  process.stderr.write(`prometheus-context-mcp: received ${signal}, shutting down
8941
8993
  `);
@@ -8948,13 +9000,52 @@ async function main() {
8948
9000
  } catch {
8949
9001
  }
8950
9002
  }
8951
- await composed.close();
9003
+ if (composed !== null)
9004
+ await composed.close();
8952
9005
  process.exit(0);
8953
9006
  }
8954
9007
  };
8955
9008
  process.once("SIGINT", shutdown);
8956
9009
  process.once("SIGTERM", shutdown);
9010
+ const boot = async (override, via) => {
9011
+ composed = await composeFromEnv({
9012
+ env,
9013
+ ...override !== void 0 && override !== "" ? { workspaceRootOverride: override } : {}
9014
+ });
9015
+ 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}` : ""}
9016
+ `);
9017
+ registerTools(server, composed);
9018
+ if (composed.managed)
9019
+ managedIndexer = startManagedIndexing(composed);
9020
+ };
9021
+ if (explicitRoot !== "") {
9022
+ await boot(void 0, "PROMETHEUS_WORKSPACE_ROOT");
9023
+ await server.connect(transport);
9024
+ return;
9025
+ }
9026
+ let booted = false;
9027
+ const resolveAndBoot = async () => {
9028
+ if (booted)
9029
+ return;
9030
+ booted = true;
9031
+ try {
9032
+ const fromRoots = await rootFromClient(server.server);
9033
+ if (fromRoots !== null)
9034
+ await boot(fromRoots, "MCP roots");
9035
+ else
9036
+ await boot(process.cwd(), "cwd fallback (client advertised no roots)");
9037
+ } catch (err) {
9038
+ process.stderr.write(`prometheus-context-mcp: fatal during boot: ${errMessage(err)}
9039
+ `);
9040
+ process.exit(1);
9041
+ }
9042
+ };
9043
+ server.server.oninitialized = () => {
9044
+ void resolveAndBoot();
9045
+ };
8957
9046
  await server.connect(transport);
9047
+ const t = setTimeout(() => void resolveAndBoot(), 5e3);
9048
+ t.unref?.();
8958
9049
  }
8959
9050
  main().catch((err) => {
8960
9051
  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.0",
4
4
  "description": "prom.codes Context — local-first codebase indexing & retrieval as an MCP server.",
5
5
  "type": "module",
6
6
  "bin": {