The plugin is reframed as the bridge between Claude's working memory and Basic Memory's durable graph, rather than a memory layer of its own. See DESIGN.md for the full rationale and roadmap.
-
Team workspace support (Phase 4). SessionStart now reads across the primary project plus configured shared/team projects —
secondaryProjects(read-only recall sources) andteamProjects(share targets) — querying open decisions from each in parallel and folding them into the brief. Team refs use workspace-qualified names (my-team/notes) orexternal_idUUIDs, since project names collide across workspaces. Reads route over the user's OAuth session; capture never writes to a shared project. -
/basic-memory:bm-share <note>(skills/bm-share/) — the deliberate personal→team write: copies a note from the primary project into a configuredteamProjectstarget'spromoteFolder, withshared_fromattribution and a confirmation step. Preserves the note's type so shared decisions stay findable in the team's structured recall. (Phase 4) -
/basic-memory:bm-setup(skills/bm-setup/) — a short guided interview that configures the project for the plugin: maps it to a Basic Memory project (picking an existing one or creating a new one), seeds thesession/decision/taskschemas into the project, installs the sharedmemory-*skills vianpx skills add basicmachines-co/basic-memory --path skills(the plugin doesn't vendor its own copies —skills/is the single source of truth, shared with OpenClaw), optionally learns the project's placement conventions, and enables the capture reflexes. Writes thebasicMemoryblock to.claude/settings.json(orsettings.local.json). The SessionStart hook nudges toward this on first run; running it (writing the config) stops the nudge. (Phase 3) -
/basic-memory:bm-remember <text>(skills/bm-remember/) — quick deliberate capture. Writes the text verbatim to therememberFolder(defaultbm-remember) with a first-line title and amanual-capturetag, via the connected Basic Memory MCP server. Also fires when the user says "remember that…". (Phase 2) -
/basic-memory:bm-status(skills/bm-status/) — diagnostic that reports the active project, capture/remember folders, output-style state, recent session checkpoints, and active-task count. User-invoked only (disable-model-invocation). (Phase 2)Both verified discoverable via
claude plugin details— they surface as plugin-namespaced commands (/basic-memory:<name>). -
SessionStart hook (
hooks/session-start.sh) — briefs Claude at session start with active tasks from the graph (one structuredtype: taskquery) plus an always-on recall prompt. Works against the default project with zero config; pin a project viabasicMemory.primaryProject. Plain-stdout output, capped well under the 10k limit, and silent if Basic Memory isn't installed. -
PreCompact hook (
hooks/pre-compact.sh) — writes atype: sessioncheckpoint to the graph before context compaction (extractive in this phase; LLM-summarized capture is the next step). Only writes when aprimaryProjectis configured, so it never touches a graph the user hasn't opted in. -
Output style (
output-styles/basic-memory.md) — opt-in reflexes: search before recalling, capture decisions as typeddecisionnotes, cite permalinks. Setskeep-coding-instructions: trueso it composes with normal dev work. -
Seed schemas (
schemas/{session,decision,task}.md) — picoschema for the note types the plugin writes, so recall viasearch_notesmetadata filters is precise.taskmirrors the framework-agnosticmemory-tasksskill. Validation modewarn— advisory, never blocking. -
settings.example.json— copyable configuration with sensible defaults.
- SessionStart hook now nudges toward
/basic-memory:bm-setupon first run — when nobasicMemoryconfig block is present in either settings file. The nudge survives a failed/empty task query (so a brand-new user with no project yet still sees it), and stops once setup writes the config. (Phase 3)
- The six bundled skills (
placement,knowledge-capture,knowledge-organize,continue-conversation,research,edit-note). Equivalent, framework-agnostic workflows live in the top-levelskills/package (memory-notes,memory-research,memory-tasks,memory-schema, …); install those for the old capabilities. - The
basic-memory-manageragent. The plugin ships no agent in v0.4 — memory is handled in the main context via hooks and the output style, not delegated. - The
PreToolUse/PostToolUsewrite_notehooks (placement advisory + save confirmation). Placement guidance now lives in thebasicMemorysettings block and the output style. - The
basic-memoryconfig-note convention, superseded by.claude/settings.json. PLUGIN.md, replaced by a bridge-framedREADME.mdandDESIGN.md.
- Slash commands shipped by later phases (
/basic-memory:bm-setup,:remember,:status) will be plugin-namespaced — Claude Code namespaces all plugin skills as/<plugin>:<skill>. - Requires
basic-memory >= 0.19.0(formetadata_filters/ structured recall).
-
knowledge-capturethread lookup usesmetadata_filtersinstead ofquery. The previous instructions told the skill to find an existing thread note viasearch_notes(query="<uuid>")— a full-text search. In practice this doesn't find the note even thoughthread_idis in the frontmatter: full-text indexing apparently doesn't surface YAML frontmatter custom fields, or scores those matches too low.The reliable lookup is
search_notes(metadata_filters={"thread_id": "<uuid>"})— direct query against the metadata field. This consistently returns the matching note (with score 0.0 — direct match) when one exists. -
Skill instructions now show
overwrite=Truefor the update path, sincewrite_noterequires it to replace an existing note at the same path.
This bug was found by exercising the skill in real-world conditions: invoking /knowledge-capture a second time in the same thread, expecting the existing note to be found and rewritten. Search returned weak unrelated matches; the existing note was missed; the update flow couldn't proceed without manual intervention.
-
knowledge-capturesession UUID detection. The previous bash command usedpwdto scope the JSONL lookup to a single project directory:ls -t ~/.claude/projects/$(pwd | sed 's:/:-:g')/*.jsonl | head -1 | ...
This fails when the shell has
cd'd into a subdirectory of the Claude Code session's project root — the encoded path no longer matches a real~/.claude/projects/<project>directory, and the lookup returns no matches. The skill then can't determine the session UUID and falls back to creating a new note instead of finding/updating an existing one.The fix is a cross-project glob:
ls -t ~/.claude/projects/*/*.jsonl— picks the most recently-modified jsonl across all project dirs. The active session is continuously appending to its jsonl, so it's reliably the most-recent.
knowledge-captureskill rewritten with new semantics:- Purpose clarified: capture the meaningful context of a Claude Code thread as a single coherent note about where the thread has landed — not a running log.
- Same-thread detection. The skill now derives a stable session UUID from the JSONL transcript filename (
~/.claude/projects/<encoded-cwd>/<uuid>.jsonl) and stores it asthread_idin the note's frontmatter. Subsequent invocations in the same thread find and rewrite the existing note rather than creating a new one. - Synthesis, not append. When updating, the skill produces a fresh coherent version that integrates the latest understanding. Superseded decisions are replaced inline; brief prose acknowledges material revisions where relevant. There is no appended changelog at the bottom of the note.
- Escape hatch. If the user explicitly requests a separate note, the skill skips the same-thread lookup and creates a fresh note without a
thread_id. - Examples updated with preceding-conversation context, showing both a first capture and a subsequent update in the same thread (a brand design conversation that revises colors and fonts).
- All slash commands (
/remember,/organize,/research) and the entirecommands/directory.
Claude Code auto-exposes every skill as a slash command (e.g., /knowledge-organize, /research). The plugin's explicit commands duplicated their corresponding skills, producing two entries for the same workflow in the slash-command picker. The skills are the richer primitive; the commands were thin wrappers.
This drops three files and ~200 lines of duplicate content. The Basic Memory MCP server still provides continue_conversation, recent_activity, search, and ai_assistant_guide as native slash commands.
marketplace.json,plugin.json,README.md,PLUGIN.md— descriptions and structure references updated to reflect skills+hooks (no commands).
/contextslash command — collided with Claude Code's built-in/context(which shows context window usage). The plugin command was a thin wrapper around the MCPbuild_contexttool; users can invoke that tool conversationally with the same effect.
/continueslash command — duplicates the Basic Memory MCP server'scontinue_conversationprompt. Use that instead./recentslash command — duplicates the Basic Memory MCP server'srecent_activityprompt. Use that instead.
The MCP server exposes prompts that surface as slash commands in Claude clients. The plugin's /continue and /recent were independent implementations of the same workflows, doubling user-visible commands and creating confusion about which one to use. The MCP versions are upstream-maintained and authoritative.
The plugin still ships unique commands that don't have MCP equivalents: /remember, /context, /organize, /research.
spec-driven-developmentskill. The skill encoded one team's internal spec workflow (specific SPEC-N numbering, "Why/What/How/How to Evaluate" structure, aspecsproject assumption). It's not generally useful for other users, and the surrounding plugin already covers the building blocks (notes, observations, relations) that anyone could use to implement their own spec workflow without skill-level guidance.
If you relied on the skill, the underlying capabilities are still available via:
knowledge-capturefor writing structured notesedit-notefor updating progresscontinue-conversationfor resuming spec implementations
You can also keep your own copy of the skill locally — it just won't ship with the plugin.
continue-conversationskill — removed the hardcoded "common projects" list (basic-memory-llc,getting-started, etc.) which were author-specific names with no meaning to new users. The skill now points tolist_memory_projects()for discovery and~/.basic-memory/basic-memory.mdfor routing rules.spec-driven-developmentskill — removed the "Using with Slash Commands" section referencing a/speccommand. That command does not exist in this plugin; documenting it was misleading.
- PreToolUse hook switched from
type: "prompt"totype: "command". The prompt-type variant has no documented decision semantics for PreToolUse — the model's response is not parsed for an explicit allow/block decision, so the tool call was blocked even when the model said "proceed." The command-type variant outputs JSON withpermissionDecision: "allow"and anadditionalContextreminder, making the hook advisory rather than gate-keeping. The placement skill still runs; it just doesn't gate the write call any more.
The previous approach treated the hook as a binding gate on the tool call. In practice, that meant any model response shy of an explicit approval keyword was treated as a block — and there's no documented format for what such an approval looks like in a prompt-type PreToolUse hook. Switching to command-type with a known-good JSON shape removes the ambiguity.
The cost: the hook can no longer enforce that placement was considered. The model could in theory ignore the reminder. In practice, the additionalContext injection is enough nudge — the placement skill runs reliably in real-world conversations.
- PreToolUse hook re-fired on every
write_noteretry — the original prompt unconditionally demanded the placement skill be invoked, so when a write retry came after a user confirmation, the model interpreted the hook as a fresh demand and re-ran the skill (asking the user again). The prompt now allows "placement already settled for this write" as a valid state. - Placement skill asked too eagerly when there was clear precedent. Previously, "no topic-matching folder" was treated as ambiguity → ask. Now the skill follows precedent (similar notes already at root or a folder) without asking, even when no folder is a perfect topic match. The skill only asks when there's no config rule, no topic match, and no precedent.
- Stop hook that suggested
/rememberat conversation end. The hook entered an infinite re-entry loop in real-world testing: when the model finished its turn awaiting user input, the Stop hook fired with a "consider suggesting /remember" prompt; the model evaluated and decided no action was needed; the model tried to stop again; the hook fired again; and so on, with the user effectively unable to take their turn until interrupting manually.
The Stop hook predates 0.3.0 and was not modified by the placement work, but the v0.3.2 smoke test made the loop visible (since 0.3.2 was the first release whose hooks actually fired for the test environment — see 0.3.2 notes). Rather than ship a broken hook, removing it is the right call. Users can still invoke /remember manually.
A guarded re-entry-safe version may return in a later release once the Claude Code Stop-hook semantics (stop_hook_active and similar) are understood and can be wired in safely.
- Hook matchers now use regex —
mcp__.*__write_noteinstead of the literalmcp__basic-memory__write_note. The previous matcher only fired for users running a locally-installed Basic Memory MCP server. Users on the claude.ai Basic Memory Cloud connector (or any other MCP server name) had hooks that silently never fired. The regex catches all variants.
- Hook prompt body and skill/PLUGIN.md descriptions updated to be tool-name-agnostic, matching the new matcher.
- Slash commands (
/remember,/research, etc.) and thebasic-memory-manageragent still haveallowed-toolsfrontmatter that lists exact tool names (mcp__basic-memory__*). Users on alternative MCP server names may find these commands have no tool access. Pattern support inallowed-toolsis being investigated for a follow-up release.
- Marketplace renamed from
basicmachinestobasicmachines-coso the install identifier matches the GitHub org slug. Install command is now/plugin install basic-memory@basicmachines-co(wasbasic-memory@basicmachines).
If you installed the plugin before 0.3.1:
- Remove the old reference from
.claude/settings.json(basic-memory@basicmachinesinenabledPluginsorinstalled). - Re-install with the new identifier:
/plugin install basic-memory@basicmachines-co.
The extraKnownMarketplaces block (if you used one) also needs the key updated from "basicmachines" to "basicmachines-co".
placementskill — decides which folder a new note belongs in. Runs automatically before everymcp__basic-memory__write_notecall via aPreToolUsehook. Reads project conventions from a unified config file and applies a short-circuit decision flow (config → tree → search → ask).- Unified config file (
basic-memory.md) — a single config surface for project conventions. Lives as a Basic Memory note at the project root or as a global file at~/.basic-memory/basic-memory.md. Reserved sections:## Projects,## Placements,## Formats,## Schemas. H3 sub-sections provide project-specific overrides; bare H2 content is the default. Section-level fallback between project, global, and built-in defaults. - Bootstrap pattern — documented conversational flow for generating a starter
basic-memory.mdfrom an existing project's structure. No new command; just ask Claude.
validate-memoskill and the entire integration withbasic-memory-hooks(the external validation server). The model-driven approach replaces external validation.edit-note-localskill — its core dependency (basic-memory sync --watchrunning as a separate process) no longer exists; sync now runs automatically inside the MCP server.edit-notecovers the remaining use cases.- All references to
localhost:8000/localhost:4665,basic-memory-hooks, and.basic-memory/format.mdacross docs and skills.
hooks/hooks.json—PreToolUseonwrite_notenow invokes theplacementskill instead of validate-memo.commands/remember.md— placement is automatic;[folder]argument is now an explicit override.PLUGIN.md— new "Configuration" section documenting the unified config schema, precedence, and bootstrap.README.md— removed hooks server quick-start; added pointer to the new configuration model.
If you were using basic-memory-hooks for memo validation:
- Format rules previously kept in
.basic-memory/format.mdmove to a## Formatssection inbasic-memory.md. They are now guidance for the model rather than externally enforced. - The
basic-memory-hooksserver is no longer needed; you can remove it.
If you were using edit-note-local:
- Use
edit-noteinstead. MCPedit_noteoperations (append,prepend,find_replace,replace_section) cover the same workflows.