Repository navigation
Conversation
A project stays local and gains a sharing switch: turn it on and its sessions, its task associations and its instructions become readable by the members of the linked online project, while everything else stays on this computer. Members and invitations - Online projects carry owner, admin and member roles, an invite dialog, join requests with a pending badge, and a recorded approve or reject decision that the applicant sees once instead of a silently disappearing request. - Member and request routes accept the 19-digit snowflake account ids the desktop uses. Sessions on the board - The board lists a project's sessions from the cloud: member filter, keyword search, pagination, a reader panel that shows a session as question and reply, and per-session copy link and delete. - Sessions are uploaded from the local agent stores (Memmy, Claude Code, Codex, Cursor, WorkBuddy, Hermes, DeepSeek Harness, OpenCode, QwenWork, Pi), either one by one or by associating whole groups, with a 20-per-member quota and a progress strip while an upload runs. - Linking and unlinking of other agents' tasks goes through one save, keeps per-session exclusions, and asks before removing a whole group. Project instructions and knowledge - Project instructions have their own stores for local and shared projects and are injected into agents on this computer, both for Memmy tasks and through the resume hooks of other agents. - A project can reference knowledge bases, which then join the retrieval scope of its members. CLI and agent integration - memmy-session reads and searches a project's sessions, memmy-project searches a linked project's knowledge, and the session CLI and skill are installed after a normal app launch. Performance - The board reads only the project and task lists and is memoized, so a streaming task no longer re-renders it; the poll and the project store compare before writing and skip hidden windows; a long session renders its first turns synchronously and defers the rest; agent switching in the association picker updates the selection before the list. Fixes along the way - Read Cursor conversation headers from composerConvHeaders rows, ignore the Enter that confirms an IME candidate, keep the collab dialogs at their native widths, and stop the collab scrim from inheriting the default 8px blur. Tests cover the board, the association picker, the knowledge dialog, the member dialog, the project store, the instruction stores and the CLI.
… list A local project has no toolbar between its header and its task list, and the stream list resets its margin, so the first row sat at the header's edge and a hovered row's raised outline touched the project name. Give the local list the same top gap the shared list already gets.
🤖 Open Code ReviewTarget: PR #783 🔍 OpenCodeReview found 195 issue(s) in this PR.
1.
|
|
- the board card, edit dialog hints, empty state and the local backend's validation messages use the name the product now shows - code, API fields, storage keys and i18n keys stay 'instructions'
…n sharing stops - deleting the cloud project hands its background and guidelines to the creator's local project, replacing whatever the folder had before: the shared copy is what everyone worked with, and the local one is older - the delete response reports whether anything was handed over, and the board tells the person it is now kept on this computer - leaving or being removed still drops the copy: that project is not theirs to keep
|
Memmy's own agent could retrieve a project's tasks only if the person pasted a link; the skill that teaches the command existed only as a template written for external agents. Ship it inside memmy-agent so asking "what has X done" works without leaving Memmy. - Add App/memmy-agent/src/skills/memmy-project/SKILL.md, adapted from the backend template: the preamble states that a referenced conversation already arrives with the message, so no search is needed in that case. - Keep the external template as it is: it carries a Codex sandbox note that does not apply inside Memmy, and the two are not meant to be word for word. - The skill is bundled with src/skills, so SkillsLoader lists its name and description in the summary and loads the body on demand. Nothing is written into the system prompt. - Cover it in the skills-loader test: name in the summary, commands only in the body.
A member who joined a project had no way to learn that other people's tasks are context they can read, reference and continue from; the switch that shares sessions was explained, the thing it produces was not. Follow the order in which these decisions are actually made, and say one thing at a time rather than repeating the same instructions at every stage. - Empty board: only the definition and the two things a person can do there. No @ reference hint, because an empty project has nothing to reference yet. - Board with other members' tasks: a single dismissible line explaining that the agent reads the full conversation once one is referenced. Recorded per local project id, so rebuilding the cloud record does not ask again. - Row menu: "Continue task" opens a new task in the same project with that conversation referenced. Works on read-only tasks of other members and on local-only projects, which get the task without a reference. - Reader: own tasks state how many members can read and reference them. - Copy: written language throughout, "task" as the single term, and "the conversation joins the project" instead of "syncs to the cloud". - Correct two strings that contradicted the implementation: a member who leaves or is removed takes the conversations they synced with them, so their quota is released. Their local project, tasks and files stay. Move shouldCreateNewAgentDraft into state/agent-composer-state so the board and the sidebar agree on when a new draft is needed without importing across page modules; app-frame re-exports it for the existing callers.
- Keep a bound project's Memmy tasks local until they are shared: links.json
records `sharedSessions`, and `isTaskShared` is the single rule behind
uploads, the task picker and the per-task toggle. Tasks uploaded before this
change stay shared, so no migration is needed.
- Add `GET/PUT /api/collab/projects/:projectId/tasks/:conversationId/sharing`
and `POST /api/collab/sessions/share`, so the desktop app and an agent can
turn a single task's sharing on or off.
- Put a sharing toggle beside the composer. A task that does not exist yet
keeps the choice in `collab-share-intent.ts` and applies it once the first
message creates the session.
- Inject `MEMMY_TASK_ID` into exec and add `memmy-project session share`, so
asking in the conversation ("share this session with the project") behaves
the same as the switch. `session add` routes Memmy tasks to the same path.
- Return `conversationId` for a member's own tasks so a board row opens the
conversation page instead of the read-only panel; other members' tasks and
other agents' tasks still open the reader.
- Show `项目 / 项目名 / 任务标题` in the conversation header for project tasks
only, with the project name linking back to the board, and drop the reader's
"members can read and reference it" line.
Add a teach mode that runs once when a project starts being shared, so the person learns what the board and a shared task are before using it. - Six steps: the board and what a collaborative task is, inviting members, linking tasks from other agents, sharing a task by conversation, continuing a task, and starting the first task. - Follow the onboarding product tour: a dimmed mask with a spotlight on the target, a bubble that follows it, and skip / back / next controls. - While the tour runs the board shows only the tour's own sample rows: real tasks, sync progress, the member tip and paging step aside, so a replay never mixes demo rows with the project's actual tasks. - Start it from a `tourFor` request in the collab store, written when a project is created with sharing or when sharing is switched on; joining someone else's project and opening other projects stay quiet. Completion and skipping both record `memmy.collab.tourSeen`, and project settings offers a replay entry. - Portal the overlay to the body: the board sets `container-type: inline-size`, which makes it the containing block for fixed descendants and would shift the mask away from the element rectangles. - Anchor attributes on the board header, invite button, toolbar, link button and the sidebar project row, kept inert outside the tour.
…ries - add readableSummary in collab-board-text.ts: a summary that stopped on a Cursor or Codex task notification reads as empty, used by the task list, the reader panel, the @ menu and the link picker - the context tip names the members who left tasks (one name, two joined, or "first and N other members") and falls back to the anonymous wording when nicknames are missing - tests for the text helpers, the members wording and the hidden notification summary
Creating a sixth project failed to start sharing and reported it as "the collaboration service is unavailable, retry later". The cloud had in fact rejected the request because the account already owns as many shared projects as it may, so both the reason and the advice were wrong. - Read the cloud's dedicated COLLAB_QUOTA code (41004) and surface it as collab_quota_exceeded, so the desktop can tell a quota from an outage. - Pass maxOwnedProjects through from GET /api/collab/projects: the limit stays on the server and the desktop never hardcodes the number. - Say it before creating: with sharing on at the limit, the dialog row explains that this project will only be created on this computer. - Report the limit on the board after creating, and keep the generic notice for other failures.
|
A project stays local and gains a sharing switch: turn it on and its sessions, task associations and instructions become readable by the members of the linked online project, while everything else stays on this computer.
Members and invitations
Sessions on the board
<timestamp>/<system_notification>text.First-run guidance
Project instructions and knowledge
memmy-projectsearches them on demand.CLI and agent integration
memmy-sessionreads and searches a project's sessions; a turn can be addressed asID#turn.memmy-projectis shipped as a built-in skill and searches a linked project's knowledge.Performance
Fixes along the way
composerConvHeadersrows, which the newer format fills instead of the older header list.Tests
Board, association picker, knowledge dialog, member dialog, project store, instruction stores, the local session reader, the first-run guide, and the CLI.
Note
The repository does not allow squash merges, so merging keeps the nine commits as they are. Each one is a self-contained step: the feature itself, its fixes, the built-in skill, per-session sharing, the first-run guide, and the summary and member-tip polish.