@folterung/project-memory 0.1.11 → 0.1.12
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/README.md
CHANGED
|
@@ -18,6 +18,7 @@ When the workspace has a `.mem` folder (after `mem init`), the Project Memory ex
|
|
|
18
18
|
|
|
19
19
|
- Ensure the memory server is running (`mem scaffold` in the project).
|
|
20
20
|
- The extension registers the MCP server on activate; Cursor starts the MCP process when needed (stdio). If the project has `node_modules/@folterung/project-memory`, the extension uses that; otherwise it expects `project-memory-mcp` on your PATH (e.g. after `npm install -g @folterung/project-memory`).
|
|
21
|
+
- **Logs:** When the workspace has `.mem`, the MCP server writes tool calls and responses to `.mem/mcp-server.log`. Use `tail -f .mem/mcp-server.log` to watch. Override with `PROJECT_MEMORY_MCP_LOG_FILE=/path/to/log`.
|
|
21
22
|
- **Manual setup (optional):** To use MCP without the extension, create `.cursor/mcp.json` in the project with a stdio config for the MCP server and set `MEM_SERVER_URL` (default `http://127.0.0.1:31415`). See [docs/commands.md](docs/commands.md) and Cursor’s MCP docs for the config format.
|
|
22
23
|
|
|
23
24
|
**Option B — npm scripts**
|
package/package.json
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Exposes search_project_memory and explain_symbol tools that call the memory HTTP API.
|
|
5
5
|
* Log only to stderr so stdout is not corrupted (MCP uses stdin/stdout for JSON-RPC).
|
|
6
6
|
*/
|
|
7
|
+
import { appendFileSync, existsSync } from "fs";
|
|
8
|
+
import { join } from "path";
|
|
7
9
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
10
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
9
11
|
import { z } from "zod";
|
|
@@ -12,13 +14,35 @@ const MAX_INJECTED_CHARS = 50_000;
|
|
|
12
14
|
const PER_CHUNK_MAX_CHARS = 4_000;
|
|
13
15
|
const UNREACHABLE_MSG = "Project memory server unreachable. Run mem scaffold in this project.";
|
|
14
16
|
const LOG_PREFIX = "[project-memory-mcp]";
|
|
17
|
+
function getLogFilePath() {
|
|
18
|
+
const envPath = process.env.PROJECT_MEMORY_MCP_LOG_FILE;
|
|
19
|
+
if (envPath)
|
|
20
|
+
return envPath;
|
|
21
|
+
const memDir = join(process.cwd(), ".mem");
|
|
22
|
+
if (existsSync(memDir))
|
|
23
|
+
return join(memDir, "mcp-server.log");
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
function logLine(message) {
|
|
27
|
+
const line = `${new Date().toISOString()} ${message}\n`;
|
|
28
|
+
console.error(message);
|
|
29
|
+
const logFile = getLogFilePath();
|
|
30
|
+
if (logFile) {
|
|
31
|
+
try {
|
|
32
|
+
appendFileSync(logFile, line);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// ignore write errors
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
15
39
|
function logAsked(tool, args) {
|
|
16
|
-
|
|
40
|
+
logLine(`${LOG_PREFIX} asked: ${tool} ${JSON.stringify(args)}`);
|
|
17
41
|
}
|
|
18
42
|
function logReturned(tool, text) {
|
|
19
43
|
const len = text.length;
|
|
20
44
|
const preview = len <= 120 ? text : text.slice(0, 120) + "... [truncated in log]";
|
|
21
|
-
|
|
45
|
+
logLine(`${LOG_PREFIX} returned: ${tool} (${len} chars) ${preview}`);
|
|
22
46
|
}
|
|
23
47
|
function getBaseUrl() {
|
|
24
48
|
return process.env.MEM_SERVER_URL ?? DEFAULT_MEM_SERVER_URL;
|
|
@@ -140,7 +164,10 @@ async function main() {
|
|
|
140
164
|
});
|
|
141
165
|
const transport = new StdioServerTransport();
|
|
142
166
|
await server.connect(transport);
|
|
143
|
-
|
|
167
|
+
const logFile = getLogFilePath();
|
|
168
|
+
logLine(logFile
|
|
169
|
+
? `Project Memory MCP server running on stdio; logging to ${logFile}`
|
|
170
|
+
: "Project Memory MCP server running on stdio");
|
|
144
171
|
}
|
|
145
172
|
main().catch((err) => {
|
|
146
173
|
console.error("Fatal error:", err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AACxD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,eAAe,GACnB,sEAAsE,CAAC;AACzE,MAAM,UAAU,GAAG,sBAAsB,CAAC;AAE1C,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* Log only to stderr so stdout is not corrupted (MCP uses stdin/stdout for JSON-RPC).
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { appendFileSync, existsSync } from "fs";
|
|
9
|
+
import { join } from "path";
|
|
8
10
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
11
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
10
12
|
import { z } from "zod";
|
|
@@ -16,15 +18,36 @@ const UNREACHABLE_MSG =
|
|
|
16
18
|
"Project memory server unreachable. Run mem scaffold in this project.";
|
|
17
19
|
const LOG_PREFIX = "[project-memory-mcp]";
|
|
18
20
|
|
|
21
|
+
function getLogFilePath(): string | null {
|
|
22
|
+
const envPath = process.env.PROJECT_MEMORY_MCP_LOG_FILE;
|
|
23
|
+
if (envPath) return envPath;
|
|
24
|
+
const memDir = join(process.cwd(), ".mem");
|
|
25
|
+
if (existsSync(memDir)) return join(memDir, "mcp-server.log");
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function logLine(message: string): void {
|
|
30
|
+
const line = `${new Date().toISOString()} ${message}\n`;
|
|
31
|
+
console.error(message);
|
|
32
|
+
const logFile = getLogFilePath();
|
|
33
|
+
if (logFile) {
|
|
34
|
+
try {
|
|
35
|
+
appendFileSync(logFile, line);
|
|
36
|
+
} catch {
|
|
37
|
+
// ignore write errors
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
19
42
|
function logAsked(tool: string, args: Record<string, unknown>): void {
|
|
20
|
-
|
|
43
|
+
logLine(`${LOG_PREFIX} asked: ${tool} ${JSON.stringify(args)}`);
|
|
21
44
|
}
|
|
22
45
|
|
|
23
46
|
function logReturned(tool: string, text: string): void {
|
|
24
47
|
const len = text.length;
|
|
25
48
|
const preview =
|
|
26
49
|
len <= 120 ? text : text.slice(0, 120) + "... [truncated in log]";
|
|
27
|
-
|
|
50
|
+
logLine(`${LOG_PREFIX} returned: ${tool} (${len} chars) ${preview}`);
|
|
28
51
|
}
|
|
29
52
|
|
|
30
53
|
interface SearchResponse {
|
|
@@ -183,7 +206,12 @@ async function main(): Promise<void> {
|
|
|
183
206
|
|
|
184
207
|
const transport = new StdioServerTransport();
|
|
185
208
|
await server.connect(transport);
|
|
186
|
-
|
|
209
|
+
const logFile = getLogFilePath();
|
|
210
|
+
logLine(
|
|
211
|
+
logFile
|
|
212
|
+
? `Project Memory MCP server running on stdio; logging to ${logFile}`
|
|
213
|
+
: "Project Memory MCP server running on stdio"
|
|
214
|
+
);
|
|
187
215
|
}
|
|
188
216
|
|
|
189
217
|
main().catch((err) => {
|