Skip to content

v0.3.0 — one server, many projects

Choose a tag to compare

@riponcm riponcm released this 01 Sep 06:45
· 26 commits to main since this release

One MCP server now serves every project. Until now a config was tied to one repository: eleven projects meant eleven server entries and eleven restarts. Paste the config once, and every repo you pjm init afterwards is reachable from it.

pip install -U projectmem
pjm doctor          # find projects the registry never knew about
pjm doctor --fix    # register them
"mcpServers": {
  "projectmem": { "command": "/absolute/path/to/python", "args": ["-m", "projectmem.mcp_server"] }
}

No --root, no cwd — that's what makes it serve everything. Existing single-project configs keep working untouched.

🔒 Security — please upgrade

Stored XSS in pjm visualize. Event summaries reached the DOM unescaped. Since auto-capture turns git commit messages into event summaries, a crafted commit in a branch you pulled could execute script in your dashboard — a page that embeds your entire event log. Every sink is escaped now.

A </script> in any event also killed the dashboard outright: json.dumps leaves < and > alone, so the data tag closed early and the page died with a SyntaxError.

🐛 Fixed: the MCP server was dead on fresh installs

mcp 2.0.0 (2026-07-28) renamed FastMCP to MCPServer and left mcp.server.fastmcp as a module that raises on import. With mcp>=0.1.0 unpinned, every pip install projectmem after that date got a server that died at import — markdown mode kept working, the tools did not. Reported and fixed by @VIVAAN-DHAWAN in #10. pyproject.toml now declares mcp>=1.0,<3.

✨ Added

  • Global MCP mode — every repo tool takes an optional project argument, plus list_projects and current_project. 17 tools.
  • Project registry + pjm project — register, list, use, alias, tag, remove, scan. ~/.projectmem/projects.json stays a plain list of paths so an older projectmem sharing the machine can only ever append to it.
  • pjm doctor — finds projects with memory that were never registered, registry entries whose memory is gone, and MCP client configs still pinned to one repo. Looks where code lives, including cloud folders and every drive on Windows.
  • A rebuilt dashboard — a shareable Memory Card, case files with the full issue → attempt → fix chain, an effort treemap, per-file dossiers (precheck_file, rendered), and a global view that opens with where you left off.
  • pjm init prints the shared config by default and warns when a client config still pins projectmem to a single repo.

Two decisions worth knowing

A pinned --root is a boundary, not a default. A server configured for one repository refuses to write anywhere else, even when a call explicitly names another project.

Every write names the project it landed inLogged issue #0019 → ossdrop. In a single-project setup a misconfigured server simply fails; a shared one can succeed against the wrong repository, which corrupts two audit trails at once.

Upgrading

Registry migration is automatic. Your existing --root config keeps working; replace it with the shared one when you want a single server for everything, then run pjm doctor to check for anything still pinned.

Verified on macOS and Windows, with Codex driving it on Windows; Linux paths simulated. 185 tests.

Full notes: CHANGELOG.md