@prom.codes/memory-mcp 0.2.0 → 0.3.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 (3) hide show
  1. package/README.md +1 -1
  2. package/dist/bin.js +78 -17
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @prom.codes/memory-mcp
2
2
 
3
- Prometheus Agent Memory — persistent, local-first agent memory as an MCP server (stdio).
3
+ prom.codes Memory — persistent, local-first agent memory as an MCP server (stdio).
4
4
 
5
5
  Gives coding agents a durable memory across sessions: facts, decisions and
6
6
  procedures survive context-window resets. Records live in a local SQLite
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
  // dist/composition.js
@@ -1150,7 +1151,9 @@ function discoverMemoryEmbedder(env) {
1150
1151
  }
1151
1152
  function composeFromEnv(opts) {
1152
1153
  const env = opts.env;
1153
- const workspaceRoot = resolve(env.PROMETHEUS_WORKSPACE_ROOT ?? process.cwd());
1154
+ const override = (opts.workspaceRootOverride ?? "").trim();
1155
+ const envRoot = (env.PROMETHEUS_WORKSPACE_ROOT ?? "").trim();
1156
+ const workspaceRoot = resolve(override !== "" ? override : envRoot !== "" ? envRoot : process.cwd());
1154
1157
  const projectId = projectIdFor(workspaceRoot);
1155
1158
  const projectName = basename(workspaceRoot) || workspaceRoot;
1156
1159
  const rawDbPath = env.PROMETHEUS_MEMORY_DB_PATH;
@@ -1169,6 +1172,36 @@ function composeFromEnv(opts) {
1169
1172
  };
1170
1173
  }
1171
1174
 
1175
+ // dist/roots.js
1176
+ import { fileURLToPath } from "node:url";
1177
+ async function rootFromClient(server, timeoutMs = 2500) {
1178
+ let supportsRoots = false;
1179
+ try {
1180
+ supportsRoots = server.getClientCapabilities()?.roots != null;
1181
+ } catch {
1182
+ return null;
1183
+ }
1184
+ if (!supportsRoots)
1185
+ return null;
1186
+ let res;
1187
+ try {
1188
+ res = await server.listRoots(void 0, { timeout: timeoutMs });
1189
+ } catch {
1190
+ return null;
1191
+ }
1192
+ const roots = res?.roots ?? [];
1193
+ for (const r of roots) {
1194
+ const uri = typeof r?.uri === "string" ? r.uri : "";
1195
+ if (uri.startsWith("file://")) {
1196
+ try {
1197
+ return fileURLToPath(uri);
1198
+ } catch {
1199
+ }
1200
+ }
1201
+ }
1202
+ return null;
1203
+ }
1204
+
1172
1205
  // dist/server.js
1173
1206
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
1174
1207
 
@@ -1719,40 +1752,68 @@ ${p.value}`)
1719
1752
  var SERVER_IDENTITY = {
1720
1753
  name: "prometheus-memory-mcp",
1721
1754
  version: PROMETHEUS_VERSION,
1722
- title: "Prometheus Agent Memory"
1755
+ title: "prom.codes Memory"
1723
1756
  };
1724
1757
  var SERVER_INSTRUCTIONS = "Persistent agent memory for this workspace. At the START of a session or task, call memory_read to recall facts, decisions and procedures from earlier sessions. When the user states a durable preference, decision or correction, store it with memory_write. Use memory_search for keyword recall when memory_read is not specific enough. At the END of a session, consolidate what was learned with memory_capture. Run memory_setup once per workspace to install the memory protocol into runtime rule files. Never store secrets, API keys or credentials \u2014 such writes are rejected.";
1725
- function createServer(deps, options = {}) {
1726
- const identity = { ...SERVER_IDENTITY, ...options.identity ?? {} };
1727
- const capabilities = options.capabilities ?? { tools: {} };
1728
- const server = new McpServer(identity, {
1729
- capabilities,
1730
- instructions: SERVER_INSTRUCTIONS
1731
- });
1732
- registerTools(server, deps);
1733
- return server;
1734
- }
1735
1758
 
1736
1759
  // dist/bin.js
1737
1760
  async function main() {
1738
- const composed = composeFromEnv({ env: process.env });
1739
- process.stderr.write(`prometheus-memory-mcp: workspace=${composed.workspaceRoot} project=${composed.projectName} (${composed.projectId}) db=${composed.dbPath} embed=${composed.embedderId}${composed.embeddingsEnabled ? "" : " (keyword-only)"}
1740
- `);
1741
- const server = createServer(composed);
1761
+ const env = process.env;
1762
+ const explicitRoot = (env.PROMETHEUS_WORKSPACE_ROOT ?? "").trim();
1742
1763
  const transport = new StdioServerTransport();
1764
+ const server = new McpServer2(SERVER_IDENTITY, {
1765
+ capabilities: { tools: {} },
1766
+ instructions: SERVER_INSTRUCTIONS
1767
+ });
1768
+ let composed = null;
1743
1769
  const shutdown = async (signal) => {
1744
1770
  process.stderr.write(`prometheus-memory-mcp: received ${signal}, shutting down
1745
1771
  `);
1746
1772
  try {
1747
1773
  await server.close();
1748
1774
  } finally {
1749
- await composed.close();
1775
+ if (composed !== null)
1776
+ await composed.close();
1750
1777
  process.exit(0);
1751
1778
  }
1752
1779
  };
1753
1780
  process.once("SIGINT", shutdown);
1754
1781
  process.once("SIGTERM", shutdown);
1782
+ const boot = (override, via) => {
1783
+ composed = composeFromEnv({
1784
+ env,
1785
+ ...override !== void 0 && override !== "" ? { workspaceRootOverride: override } : {}
1786
+ });
1787
+ process.stderr.write(`prometheus-memory-mcp: workspace=${composed.workspaceRoot} (via ${via}) project=${composed.projectName} (${composed.projectId}) db=${composed.dbPath} embed=${composed.embedderId}${composed.embeddingsEnabled ? "" : " (keyword-only)"}
1788
+ `);
1789
+ registerTools(server, composed);
1790
+ };
1791
+ if (explicitRoot !== "") {
1792
+ boot(void 0, "PROMETHEUS_WORKSPACE_ROOT");
1793
+ await server.connect(transport);
1794
+ return;
1795
+ }
1796
+ let booted = false;
1797
+ const resolveAndBoot = async () => {
1798
+ if (booted)
1799
+ return;
1800
+ booted = true;
1801
+ try {
1802
+ const fromRoots = await rootFromClient(server.server);
1803
+ boot(fromRoots ?? process.cwd(), fromRoots !== null ? "MCP roots" : "cwd fallback (client advertised no roots)");
1804
+ } catch (err) {
1805
+ const message = err instanceof Error ? err.message : String(err);
1806
+ process.stderr.write(`prometheus-memory-mcp: fatal during boot: ${message}
1807
+ `);
1808
+ process.exit(1);
1809
+ }
1810
+ };
1811
+ server.server.oninitialized = () => {
1812
+ void resolveAndBoot();
1813
+ };
1755
1814
  await server.connect(transport);
1815
+ const t = setTimeout(() => void resolveAndBoot(), 5e3);
1816
+ t.unref?.();
1756
1817
  }
1757
1818
  main().catch((err) => {
1758
1819
  const message = err instanceof Error ? err.message : String(err);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@prom.codes/memory-mcp",
3
- "version": "0.2.0",
4
- "description": "Prometheus Agent Memory — persistent, local-first agent memory as an MCP server.",
3
+ "version": "0.3.0",
4
+ "description": "prom.codes Memory — persistent, local-first agent memory as an MCP server.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "prometheus-memory-mcp": "dist/bin.js"