Skip to content

feat: Add display_name and is_private to ProjectItem#574

Open
jope-bm wants to merge 3 commits intomainfrom
feat-project-display-name
Open

feat: Add display_name and is_private to ProjectItem#574
jope-bm wants to merge 3 commits intomainfrom
feat-project-display-name

Conversation

@jope-bm
Copy link
Contributor

@jope-bm jope-bm commented Feb 17, 2026

Summary

  • Adds display_name and is_private optional fields to ProjectItem schema for cloud proxy enrichment
  • Updates list_memory_projects MCP tool to show "My Notes (private-fb83af23)" format when display_name is present
  • Backwards-compatible: fields default to None/False, no impact on non-cloud usage

Context

Basic Memory Cloud is adding per-user private projects ("My Notes") in team workspaces. The cloud proxy enriches the project list API response with display_name and is_private metadata, but these fields were being silently dropped during Pydantic deserialization because ProjectItem didn't declare them.

Changes

File Change
schemas/project_info.py Added display_name: Optional[str] = None and is_private: bool = False to ProjectItem
mcp/tools/project_management.py list_memory_projects uses "display_name (name)" format when display_name is set
tests/schemas/test_schemas.py 6 new tests for ProjectItem schema with cloud-injected fields
tests/mcp/test_tool_project_management.py 2 new tests for display_name formatting in list_memory_projects

Test plan

  • 8 new tests pass
  • All existing project management and schema tests pass
  • CI passes

🤖 Generated with Claude Code

Add optional cloud-injected metadata fields to ProjectItem schema so
the cloud proxy can enrich project list responses with friendly names
and privacy indicators for per-user private projects.

- display_name: Optional friendly name (e.g. "My Notes") shown instead
  of the internal slug (e.g. "private-fb83af23")
- is_private: Boolean flag indicating the project is private to the user

Update list_memory_projects MCP tool to show "display_name (name)"
format when display_name is present, so MCP clients see friendly names
while still knowing the actual project slug to use in API calls.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Joe P <joe@basicmemory.com>
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fedcbff3b1

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".


for project in project_list.projects:
result += f"• {project.name}\n"
label = f"{project.display_name} ({project.name})" if project.display_name else project.name

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep project labels resolvable by resolve endpoint

When display_name is set, this tool now publishes display_name (name) as the project label, but project resolution only accepts external ID, permalink, or raw name (see /v2/projects/resolve lookup in project_router.py), so using the displayed label (or the display name alone) as a project argument will fail with “Project not found”. For private cloud projects this breaks the normal list→select→use workflow unless callers manually parse the slug back out of the label.

Useful? React with 👍 / 👎.

phernandez and others added 2 commits February 17, 2026 23:26
ConfigManager.add_project() and ProjectService.move_project() unconditionally
called mkdir on the project path. In cloud mode (BASIC_MEMORY_PROJECT_ROOT set),
paths resolve under root (/) which is read-only on macOS, crashing local dev.
Production Fly.io containers have writable /, so this was never caught there.

Skip mkdir when project_root is set since cloud mode uses S3 for file storage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Joe P <joe@basicmemory.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

Comments