From 5458c35b353197c3813ff612a34403981a950994 Mon Sep 17 00:00:00 2001 From: Paul Hernandez <60959+phernandez@users.noreply.github.com> Date: Thu, 4 Jun 2026 12:04:05 -0500 Subject: [PATCH] refactor(plugins): prefix Claude Code plugin skills with bm- (#878) Signed-off-by: phernandez Co-authored-by: Claude Opus 4.8 (1M context) --- README.md | 2 +- plugins/claude-code/CHANGELOG.md | 12 ++-- plugins/claude-code/DESIGN.md | 68 ++++++++++--------- plugins/claude-code/README.md | 16 ++--- plugins/claude-code/docs/architecture.md | 8 +-- plugins/claude-code/docs/getting-started.md | 16 ++--- .../claude-code/docs/why-combine-memory.md | 6 +- plugins/claude-code/hooks/session-start.sh | 6 +- plugins/claude-code/schemas/decision.md | 2 +- plugins/claude-code/schemas/session.md | 2 +- plugins/claude-code/settings.example.json | 2 +- .../skills/{remember => bm-remember}/SKILL.md | 4 +- .../skills/{setup => bm-setup}/SKILL.md | 12 ++-- .../skills/{share => bm-share}/SKILL.md | 8 +-- .../skills/{status => bm-status}/SKILL.md | 4 +- scripts/validate_claude_plugin.py | 2 +- 16 files changed, 87 insertions(+), 83 deletions(-) rename plugins/claude-code/skills/{remember => bm-remember}/SKILL.md (95%) rename plugins/claude-code/skills/{setup => bm-setup}/SKILL.md (97%) rename plugins/claude-code/skills/{share => bm-share}/SKILL.md (90%) rename plugins/claude-code/skills/{status => bm-status}/SKILL.md (96%) diff --git a/README.md b/README.md index 93dd6255..5039e75c 100644 --- a/README.md +++ b/README.md @@ -199,7 +199,7 @@ just package-check-openclaw The Claude Code plugin is the bridge between Claude's working memory and Basic Memory — session-start briefings, pre-compaction checkpoints, an opt-in capture -output style, and `/basic-memory:setup` · `:remember` · `:share` · `:status`. +output style, and `/basic-memory:bm-setup` · `:remember` · `:share` · `:status`. **Connect the Basic Memory MCP server first** — see [Connect your AI client](#connect-your-ai-client). The plugin's hooks and skills call it, so it's a diff --git a/plugins/claude-code/CHANGELOG.md b/plugins/claude-code/CHANGELOG.md index 792f1656..3f603257 100644 --- a/plugins/claude-code/CHANGELOG.md +++ b/plugins/claude-code/CHANGELOG.md @@ -15,12 +15,12 @@ Memory's durable graph**, rather than a memory layer of its own. See (`my-team/notes`) or `external_id` UUIDs, since project names collide across workspaces. Reads route over the user's OAuth session; capture **never** writes to a shared project. -- **`/basic-memory:share `** (`skills/share/`) — the deliberate personal→team +- **`/basic-memory:bm-share `** (`skills/bm-share/`) — the deliberate personal→team write: copies a note from the primary project into a configured `teamProjects` target's `promoteFolder`, with `shared_from` attribution and a confirmation step. Preserves the note's type so shared decisions stay findable in the team's structured recall. (Phase 4) -- **`/basic-memory:setup`** (`skills/setup/`) — a short guided interview that +- **`/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 the `session`/`decision`/`task` schemas into the project, installs the shared `memory-*` skills via @@ -30,11 +30,11 @@ Memory's durable graph**, rather than a memory layer of its own. See capture reflexes. Writes the `basicMemory` block to `.claude/settings.json` (or `settings.local.json`). The SessionStart hook nudges toward this on first run; running it (writing the config) stops the nudge. (Phase 3) -- **`/basic-memory:remember `** (`skills/remember/`) — quick deliberate +- **`/basic-memory:bm-remember `** (`skills/bm-remember/`) — quick deliberate capture. Writes the text verbatim to the `rememberFolder` (default `bm-remember`) with a first-line title and a `manual-capture` tag, via the connected Basic Memory MCP server. Also fires when the user says "remember that…". (Phase 2) -- **`/basic-memory:status`** (`skills/status/`) — diagnostic that reports the active +- **`/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) @@ -62,7 +62,7 @@ Memory's durable graph**, rather than a memory layer of its own. See ### Changed -- **SessionStart hook now nudges toward `/basic-memory:setup` on first run** — when +- **SessionStart hook now nudges toward `/basic-memory:bm-setup` on first run** — when no `basicMemory` config 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) @@ -84,7 +84,7 @@ Memory's durable graph**, rather than a memory layer of its own. See ### Notes -- Slash commands shipped by later phases (`/basic-memory:setup`, +- Slash commands shipped by later phases (`/basic-memory:bm-setup`, `:remember`, `:status`) will be **plugin-namespaced** — Claude Code namespaces all plugin skills as `/:`. - Requires `basic-memory >= 0.19.0` (for `metadata_filters` / structured recall). diff --git a/plugins/claude-code/DESIGN.md b/plugins/claude-code/DESIGN.md index 15e76b75..b759a4ad 100644 --- a/plugins/claude-code/DESIGN.md +++ b/plugins/claude-code/DESIGN.md @@ -69,9 +69,9 @@ plugins/claude-code/ │ └── basic-memory.md # reflexes: search first, capture decisions │ # NOTE: rules/ deferred — path-scoped rules don't load yet (Q5) ├── skills/ -│ ├── setup/SKILL.md # /basic-memory:setup — bootstrap interview (first-run) -│ ├── remember/SKILL.md # /basic-memory:remember — quick deliberate capture -│ └── status/SKILL.md # /basic-memory:status — show plugin state +│ ├── bm-setup/SKILL.md # /basic-memory:bm-setup — bootstrap interview (first-run) +│ ├── bm-remember/SKILL.md # /basic-memory:bm-remember — quick deliberate capture +│ └── bm-status/SKILL.md # /basic-memory:bm-status — show plugin state ├── schemas/ # picoschema seeds, copied into the user's BM project at bootstrap │ ├── session.md # type: session — resume checkpoints │ ├── decision.md # type: decision — durable choices + rationale @@ -87,7 +87,7 @@ Three layers, matching what Hermes and OpenClaw converged on: | ----------- | ---------------------------------- | ------------------------------------------ | ------------------------------------- | | Ambient | `hooks/`, `rules/` | Lifecycle events, file context | Brief Claude, checkpoint, guide placement | | Background | `output-styles/basic-memory.md` | System prompt, every turn | Reflexes — search first, capture inline | -| Deliberate | `skills/{setup,remember,status}/` | User invokes (`/basic-memory:setup`, `/basic-memory:remember`) | One-shot user gestures | +| Deliberate | `skills/{bm-setup,bm-remember,bm-status}/` | User invokes (`/basic-memory:bm-setup`, `/basic-memory:bm-remember`) | One-shot user gestures | ## 4. The core flows @@ -191,13 +191,17 @@ If/when path-scoped rules start working *and* support out-of-tree globs, we can Three skills only, each Claude-Code-specific (everything else lives in top-level `skills/`). -> **Verified (Q3) — slash commands are always plugin-namespaced.** A skill folder `skills/remember/` in a plugin whose `plugin.json` name is `basic-memory` is invoked as **`/basic-memory:remember`**, not `/remember` — namespacing is mandatory and can't be shortened. Consequence: we drop the redundant `bm-` prefix from skill folder names (the namespace already says `basic-memory`). So the folders are `setup/`, `remember/`, `status/`, surfacing as `/basic-memory:setup`, `/basic-memory:remember`, `/basic-memory:status`. Skills are auto-discovered on install — no extra registration. +> **Verified (Q3) — slash commands are always plugin-namespaced.** A skill folder `skills/bm-setup/` in a plugin named `basic-memory` is invoked as **`/basic-memory:bm-setup`** — namespacing is mandatory and can't be shortened. Skills are auto-discovered on install, no extra registration. +> +> **Naming decision (revised after dogfood).** The four skills carry a **`bm-` prefix** (`bm-setup`, `bm-remember`, `bm-share`, `bm-status`). Phase 2 originally *dropped* the prefix, reasoning that the `basic-memory:` namespace already disambiguates. Dogfooding the merged plugin proved otherwise: the Claude Code slash **picker shows only the bare skill name** — the plugin name is relegated to the focused-item tooltip — so un-prefixed skills blend into the list with other plugins' similarly-named ones (`spec`, `simplify`, `schedule`, …). The `bm-` prefix makes them group and read as ours in the picker. The cost is a cosmetic stutter in the full form (`/basic-memory:bm-setup`). +> +> **This is a workaround, not the end state.** The real fix is upstream: [anthropics/claude-code#50486](https://github.com/anthropics/claude-code/issues/50486) (open) asks the picker to namespace plugin skills the way it already does for *commands*. If/when that lands, the picker would show `basic-memory:setup` natively — revisit dropping the `bm-` prefix then, to kill the stutter. (Aside: [#22063](https://github.com/anthropics/claude-code/issues/22063) — a `name` frontmatter field stripping the namespace — does **not** affect us; with `name == dir` the namespace is retained, confirmed live in the session skill list.) -**`/basic-memory:setup`** — bootstrap interview (§7). Run after install and any time the user wants to reconfigure. +**`/basic-memory:bm-setup`** — bootstrap interview (§7). Run after install and any time the user wants to reconfigure. -**`/basic-memory:remember `** — quick capture. Writes to a `bm-remember/` folder, separated from auto-captures. First line becomes title (truncated to 80 chars), tagged `manual-capture`. Optional `--project` flag for cross-project. +**`/basic-memory:bm-remember `** — quick capture. Writes to a `bm-remember/` folder, separated from auto-captures. First line becomes title (truncated to 80 chars), tagged `manual-capture`. Optional `--project` flag for cross-project. -**`/basic-memory:status`** — show plugin state: active BM project, capture folders, recent SessionNotes, sync status, last successful BM call. Trust-building UI. +**`/basic-memory:bm-status`** — show plugin state: active BM project, capture folders, recent SessionNotes, sync status, last successful BM call. Trust-building UI. ### 4.5 The schema layer — why our note types are contracts, not conventions @@ -207,8 +211,8 @@ Basic Memory ships a [schema system](https://docs.basicmemory.com/raw/concepts/s | Note type | `type:` | Written by | Purpose | | --------- | ------- | ---------- | ------- | -| Session | `session` | PreCompact hook, `/basic-memory:handoff` (future) | Resume cursor — what we were doing, what's next | -| Decision | `decision` | output-style reflex, `/basic-memory:decide` (future) | Durable record of choices + rationale | +| Session | `session` | PreCompact hook, `/basic-memory:bm-handoff` (future) | Resume cursor — what we were doing, what's next | +| Decision | `decision` | output-style reflex, `/basic-memory:bm-decide` (future) | Durable record of choices + rationale | | Task | `task` | user + Claude | Active work tracking (aligns with `skills/memory-tasks`) | These conform to the SessionNote / DecisionNote picoschema shapes defined in SPEC-55, so when the SPEC-55 Writer SDK and async pipeline land, validation Just Works and nothing has to change in user-facing behavior. @@ -264,7 +268,7 @@ These are orthogonal concepts that the plugin must explicitly map. ### 5.1 Mapping model Each Claude Code project has: -- **One primary BM project** — destination for SessionStart context + PreCompact checkpoints + `/basic-memory:remember`. Required. +- **One primary BM project** — destination for SessionStart context + PreCompact checkpoints + `/basic-memory:bm-remember`. Required. - **Zero or more secondary BM projects** — read-only by default for recall (SessionStart can query them); writes require explicit user gesture. Mapping is configured in `.claude/settings.json`: @@ -311,11 +315,11 @@ UUID and routes accordingly. Cross-workspace reads route over the user's OAuth s ### 6.1 Defaults — safe by design - **Auto-capture defaults to personal.** SessionNotes, PreCompact checkpoints, and - `/basic-memory:remember` quick captures **only ever** land in `primaryProject`. The + `/basic-memory:bm-remember` quick captures **only ever** land in `primaryProject`. The capture hooks never write to a shared project — full stop, no opt-in flag in v0.4. - **Recall reads across.** SessionStart queries the shared projects in parallel for open decisions and folds them into the brief (read-only — discloses nothing). -- **Sharing is a deliberate gesture.** `/basic-memory:share` copies a personal note +- **Sharing is a deliberate gesture.** `/basic-memory:bm-share` copies a personal note into a configured team project with attribution, after explicit confirmation. The personal→team boundary is always a visible, manual action. @@ -334,7 +338,7 @@ UUID and routes accordingly. Cross-workspace reads route over the user's OAuth s ``` - `secondaryProjects` — workspace-qualified refs (or UUIDs) read for recall. Read-only. -- `teamProjects` — share targets for `/basic-memory:share`; each carries a +- `teamProjects` — share targets for `/basic-memory:bm-share`; each carries a `promoteFolder` (default `shared`). Also read for recall (SessionStart reads the union of `secondaryProjects` and `teamProjects` keys, capped at 6 per session). @@ -349,15 +353,15 @@ shared session memory; until then we don't ship a flag we don't enforce. - New team members get instant context — first SessionStart pulls the team graph and they're already oriented. - Cross-pollination — operator running a strategy session sees recent technical decisions from builders. -## 7. Bootstrap — `/basic-memory:setup` interview +## 7. Bootstrap — `/basic-memory:bm-setup` interview Users get overwhelmed starting from zero. The plugin opens with a guided interview that establishes opinionated defaults from a short conversation. -> **Verified (Q6) — there is no install hook.** Claude Code has no PostInstall/PreInstall lifecycle event (feature request [#11240](https://github.com/anthropics/claude-code/issues/11240) was closed as duplicate). We can't auto-run setup the moment the plugin installs. The workaround is the **SessionStart hook detecting first-run**: it checks for a sentinel (e.g. `${CLAUDE_PLUGIN_DATA}/.bootstrapped` or the absence of a `basicMemory` config) and, if missing, injects a one-line nudge — *"Basic Memory isn't configured yet. Run `/basic-memory:setup` (≈3 min) to wire it up."* A bonus verified capability: SessionStart can return `{"reloadSkills": true}` to re-scan skills mid-session, useful if setup writes new skills/config that should activate without a restart. +> **Verified (Q6) — there is no install hook.** Claude Code has no PostInstall/PreInstall lifecycle event (feature request [#11240](https://github.com/anthropics/claude-code/issues/11240) was closed as duplicate). We can't auto-run setup the moment the plugin installs. The workaround is the **SessionStart hook detecting first-run**: it checks for a sentinel (e.g. `${CLAUDE_PLUGIN_DATA}/.bootstrapped` or the absence of a `basicMemory` config) and, if missing, injects a one-line nudge — *"Basic Memory isn't configured yet. Run `/basic-memory:bm-setup` (≈3 min) to wire it up."* A bonus verified capability: SessionStart can return `{"reloadSkills": true}` to re-scan skills mid-session, useful if setup writes new skills/config that should activate without a restart. **Trigger paths:** -1. SessionStart detects no `basicMemory` config and no `basic-memory` note → inject the one-line nudge suggesting `/basic-memory:setup` (we cannot run it automatically) -2. User runs `/basic-memory:setup` explicitly (anytime, including for reconfiguration) +1. SessionStart detects no `basicMemory` config and no `basic-memory` note → inject the one-line nudge suggesting `/basic-memory:bm-setup` (we cannot run it automatically) +2. User runs `/basic-memory:bm-setup` explicitly (anytime, including for reconfiguration) **Interview script** (Claude executes it; SKILL.md provides the structure): @@ -368,14 +372,14 @@ Users get overwhelmed starting from zero. The plugin opens with a guided intervi 3. *"Are you using Basic Memory Cloud or local-only?"* - If cloud + team workspace exists: *"You're on the `` workspace. Want me to also read from team projects for recall? (read-only by default; we can opt-in to writes later)"* 4. *"How chatty should I be?"* - - **Light** (default): SessionStart brief on each session, PreCompact checkpoint, `/basic-memory:remember` on demand + - **Light** (default): SessionStart brief on each session, PreCompact checkpoint, `/basic-memory:bm-remember` on demand - **Standard**: above + capture decisions inline via output-style - **Heavy**: above + every-session SessionNote even without compaction 5. *"Should I look at your existing notes and suggest some placement conventions?"* (yes → runs `schema_infer` on the existing notes, summarizes the patterns it found, and stores them in the `basicMemory` settings block — see §4.3, since path-scoped rules don't load yet — from the user's *real* conventions rather than imposed ones) 6. *"I'll set up schemas for session checkpoints and decisions so I can find them precisely later — okay?"* (yes → writes `schemas/session.md`, `schemas/decision.md`, `schemas/task.md` into the primary project, skipping any that already exist; validation mode `warn`) 7. *"Want me to enable the `basic-memory` output style now?"* (yes → adds `outputStyle: basic-memory` to settings) -**Output:** writes `.claude/settings.json` (with prompt to commit or keep local) including any inferred conventions, writes the three schema notes, optionally creates the BM project, and drops the bootstrap sentinel so SessionStart stops nudging. Closes with: *"Done. I'll start using this on the next message. Try `/basic-memory:status` anytime to see what I'm tracking."* +**Output:** writes `.claude/settings.json` (with prompt to commit or keep local) including any inferred conventions, writes the three schema notes, optionally creates the BM project, and drops the bootstrap sentinel so SessionStart stops nudging. Closes with: *"Done. I'll start using this on the next message. Try `/basic-memory:bm-status` anytime to see what I'm tracking."* **Why an interview, not a config form:** the interview is *adaptive* — it skips questions when context is obvious (e.g., it sees you're on cloud and on a team; doesn't ask about local), suggests reasonable defaults the user can accept with a single word, and produces a meaningful starting point in under 3 minutes. A config form makes the user own every decision. @@ -431,10 +435,10 @@ Verified 2026-05-28 against Claude Code v2.1.153 and basic-memory 0.21.5, via a |---|----------|---------|--------|--------------------| | **Q1** | Does SessionStart fire before/after auto-memory loads? Can the hook use auto-memory as input? | **uncertain** | Firing order vs `MEMORY.md` load is **not documented**. The often-cited "SessionStart fires before CLAUDE.md loads" phrasing isn't in current docs. What *is* certain: the hook can read `MEMORY.md` from disk anytime. | Don't assume auto-memory is in context at SessionStart. If the brief wants it, **read the file from disk** (§4.1). Don't build anything that depends on context-load ordering. | | **Q2** | Does PreCompact block synchronously? Timeout? Can it do multi-second/LLM work? | **confirmed** | Blocks synchronously; **600s default timeout** (configurable). MCP/LLM calls fit easily. On timeout the hook is killed and compaction proceeds. (To *block* compaction you'd return exit 2 / `decision:block` before the timeout — we don't.) | **Upgraded the design.** `preCompactCapture` default is now `"summarized"` (real LLM pass), not extractive (§4.2, §8). Write the note early, enrich after, in case of kill. | -| **Q3** | Do plugin skills/commands appear in the `/` menu, and as what? | **confirmed** | Auto-discovered on install, but **always namespaced** as `/:`. Can't be shortened. No sparse/subdir caveats. | Drop the `bm-` prefix; folders become `setup/`, `remember/`, `status/` → `/basic-memory:setup` etc. (§4.4). README must show the namespaced form. | +| **Q3** | Do plugin skills/commands appear in the `/` menu, and as what? | **confirmed** | Auto-discovered, **always namespaced** as `/:`, but the picker shows only the bare skill name (namespace in the tooltip). | Use a `bm-` prefix (`bm-setup` …) so they're legible in the picker — see §4.4. Workaround for [anthropics/claude-code#50486](https://github.com/anthropics/claude-code/issues/50486); revisit if that lands. | | **Q4** | How does SessionStart inject context? Size limit? | **confirmed** | Plain stdout (added to context, no JSON needed) **or** JSON `hookSpecificOutput.additionalContext`. **10,000-char cap** per string; overflow spills to a file. Shell-profile echoes corrupt output. | Use plain stdout. Keep the brief well under 10k — cap each section's item count, prefer permalinks over previews. Guard against shell-profile noise (§4.1). | | **Q5** | Do path-scoped `rules/` with `paths:` load for BM files (incl. outside the git tree)? | **refuted** | Path-scoped rules **don't load automatically at all** — open bug [#16853](https://github.com/anthropics/claude-code/issues/16853) ("never worked"). Even when fixed they're repo-relative (won't match `~/basic-memory/`, [#25562](https://github.com/anthropics/claude-code/issues/25562)). | **Dropped `rules/` from the plugin.** Placement/format conventions move to the `basicMemory` settings block + SessionStart brief + output-style (§4.3). Revisit if the platform bug is fixed *and* out-of-tree globs are supported. | -| **Q6** | Is there a run-on-install hook for bootstrap? | **confirmed** | No PostInstall/PreInstall lifecycle event ([#11240](https://github.com/anthropics/claude-code/issues/11240) closed as dup). Only SessionStart + explicit Setup. Bonus: SessionStart can return `{"reloadSkills": true}`. | Bootstrap can't auto-run. SessionStart detects first-run via a **sentinel file** and nudges the user to run `/basic-memory:setup` (§7). | +| **Q6** | Is there a run-on-install hook for bootstrap? | **confirmed** | No PostInstall/PreInstall lifecycle event ([#11240](https://github.com/anthropics/claude-code/issues/11240) closed as dup). Only SessionStart + explicit Setup. Bonus: SessionStart can return `{"reloadSkills": true}`. | Bootstrap can't auto-run. SessionStart detects first-run via a **sentinel file** and nudges the user to run `/basic-memory:bm-setup` (§7). | | **Q7** | Does `search_notes` support `metadata_filters` + `after_date` in 0.21.5? Min version? | **confirmed** | Both present and working in 0.21.5. Full operator set: `$in`, `$gt/$gte/$lt/$lte`, `$between`, array-contains, equality, dot-notation (`schema.confidence`). On `search_notes` since **v0.18.1** (verify corrected the first pass's "v0.19.0"). | Structured recall is safe as a **baseline** — no fallback path needed for the 0.21.5 target. Pin a minimum `basic-memory >= 0.19.0` in prerequisites for margin. Use `tags`/`status` shorthands for common cases (§4.1). | | **Q8** | Is `schema_validate` cheap enough for PreCompact? Are the schema tools in 0.21.5? | **confirmed** | All three (`validate`/`infer`/`diff`) present since v0.19.0. `schema_validate(identifier=…)` = **cheap single-note**. `schema_validate(note_type=…)` = **batch, O(N)** with per-note file I/O. | PreCompact validates only the note it just wrote via the **identifier path** (§4.2). Batch validation + `schema_diff` go to the nightly hygiene routine (§13). | @@ -495,7 +499,7 @@ eventual default is `"summarized"` — the LLM pass is the first enrich step. schemas / output-style / settings carry no version) **Carried into later phases (not part of the minimal cut):** the first-run *sentinel -nudge* moves to Phase 3 (it should point at `/basic-memory:setup`, which doesn't exist +nudge* moves to Phase 3 (it should point at `/basic-memory:bm-setup`, which doesn't exist yet); the multi-query parallel brief and the LLM-summarized PreCompact are the enrich steps. @@ -517,10 +521,10 @@ bash-injection scripts — avoids shell-quoting fragility on arbitrary user text the `${CLAUDE_SKILL_DIR}` path uncertainty, and works regardless of the MCP server's tool-name prefix. -- [x] Write `skills/remember/SKILL.md` → `/basic-memory:remember` — model-invocable +- [x] Write `skills/bm-remember/SKILL.md` → `/basic-memory:bm-remember` — model-invocable ("remember that…"); writes verbatim to `rememberFolder` with a first-line title and `manual-capture` tag via `write_note`. -- [x] Write `skills/status/SKILL.md` → `/basic-memory:status` — `disable-model-invocation` +- [x] Write `skills/bm-status/SKILL.md` → `/basic-memory:bm-status` — `disable-model-invocation` (user-only diagnostic); reports project, folders, output-style, recent checkpoints, active-task count. - [x] Test slash-command discovery end-to-end — installed from a local marketplace and @@ -534,7 +538,7 @@ tool-name prefix. Implemented as a **prose skill** (the interview is conversational; Claude runs it using its MCP tools). Verified the whole loop end-to-end against throwaway projects. -- [x] Write `skills/setup/SKILL.md` → `/basic-memory:setup` — adaptive interview that +- [x] Write `skills/bm-setup/SKILL.md` → `/basic-memory:bm-setup` — adaptive interview that maps the project, seeds schemas, optionally learns conventions, writes settings, and enables the output style. Model-invocable ("set up basic memory") + user-invocable. - [x] Wire `schema_infer`/`list_directory` into the bootstrap — the skill inspects the @@ -546,7 +550,7 @@ using its MCP tools). Verified the whole loop end-to-end against throwaway proje `schema_validate` (`entity=Session/Decision/Task`). This corrects the earlier Phase 1 finding — schema seeding is a plain content copy; the previous "must use `note_type`/`metadata`" conclusion was confounded by the enum YAML bug. -- [x] First-run detection in SessionStart — nudges toward `/basic-memory:setup` when no +- [x] First-run detection in SessionStart — nudges toward `/basic-memory:bm-setup` when no `basicMemory` config block exists (config presence is the sentinel; no separate file). The nudge survives a failed/empty task query. Verified across all three config states (no config → nudge; block without project → pin tip; project pinned → silent). @@ -561,7 +565,7 @@ using its MCP tools). Verified the whole loop end-to-end against throwaway proje ### Phase 4: Team workspace support — ✅ DONE (2026-05-28) Grounded in a real two-workspace BM Cloud account (verified name-collision routing, -OAuth cross-workspace reads). Pulled `/basic-memory:share` forward from future-work +OAuth cross-workspace reads). Pulled `/basic-memory:bm-share` forward from future-work since team usage needs a safe write path. - [x] Extend SessionStart to read primary + shared projects **in parallel** — @@ -569,7 +573,7 @@ since team usage needs a safe write path. decisions; each shared project: open decisions). Routes by qualified name or UUID, per-call timeout, capped at 6 shared projects, graceful on any failure. Verified against the real `my-team-2` workspace and with local fixtures. -- [x] Add `/basic-memory:share` (`skills/share/`) — the deliberate personal→team +- [x] Add `/basic-memory:bm-share` (`skills/bm-share/`) — the deliberate personal→team write: reads a note from `primaryProject`, confirms, and copies it to a configured `teamProjects` target's `promoteFolder` with `shared_from` attribution. Preserves the note's type so shared decisions stay findable in the team's structured recall. @@ -611,11 +615,11 @@ Docs done 2026-05-28; dogfood is the remaining (human) step. ## 13. Future work (post-v0.4) - **Routines integration** — three routine templates (nightly hygiene, weekly digest, daily reflection). Separate design doc. The nightly hygiene routine is the natural home for `schema_diff` drift detection and the deferred LLM-summary pass over the day's extractive SessionNotes. -- ~~**`/basic-memory:share`** — promote personal note → team project~~ — shipped in Phase 4. +- ~~**`/basic-memory:bm-share`** — promote personal note → team project~~ — shipped in Phase 4. - **Team `autoWrite`** — opt-in for auto-capture (PreCompact/remember) to write to a team project, for teams that want shared session memory. Deferred from Phase 4 (§6.2). -- **`/basic-memory:blame `** — code archaeology, builder add-on. +- **`/basic-memory:bm-blame `** — code archaeology, builder add-on. - **Commit-hook integration** — PostToolUse on `Bash(git commit *)` writes CommitNote linking SHA to session's BM writes. - **Subagent memory bundling** — explore `memory: project|user` on dedicated BM subagents. - **Statusline** — small visible presence (active project, last write). -- **`/basic-memory:promote`** — review auto-memory MEMORY.md, graduate observations into BM with proper schema. +- **`/basic-memory:bm-promote`** — review auto-memory MEMORY.md, graduate observations into BM with proper schema. diff --git a/plugins/claude-code/README.md b/plugins/claude-code/README.md index acd679dd..d2f4a5e6 100644 --- a/plugins/claude-code/README.md +++ b/plugins/claude-code/README.md @@ -38,10 +38,10 @@ Plugin skills are namespaced under the plugin name: | Command | What it does | |---------|--------------| -| `/basic-memory:setup` | One-time guided setup — maps the project to a Basic Memory project, seeds the note schemas, installs the shared `memory-*` skills, optionally learns your conventions, and turns on the capture reflexes. Run this first. | -| `/basic-memory:remember ` | Quick capture — saves the text to the `bm-remember` folder with a `manual-capture` tag. Also fires when you say "remember that…". | -| `/basic-memory:share ` | Promote a personal note to a configured team project, with attribution and confirmation. The deliberate way to write to a shared workspace. | -| `/basic-memory:status` | Diagnostic — shows the active project, team read-sources and share targets, capture folders, output-style state, recent session checkpoints, and active-task count. | +| `/basic-memory:bm-setup` | One-time guided setup — maps the project to a Basic Memory project, seeds the note schemas, installs the shared `memory-*` skills, optionally learns your conventions, and turns on the capture reflexes. Run this first. | +| `/basic-memory:bm-remember ` | Quick capture — saves the text to the `bm-remember` folder with a `manual-capture` tag. Also fires when you say "remember that…". | +| `/basic-memory:bm-share ` | Promote a personal note to a configured team project, with attribution and confirmation. The deliberate way to write to a shared workspace. | +| `/basic-memory:bm-status` | Diagnostic — shows the active project, team read-sources and share targets, capture folders, output-style state, recent session checkpoints, and active-task count. | ## Requirements @@ -61,7 +61,7 @@ claude plugin install basic-memory@basicmachines-co ## Configuration -The fastest path is **`/basic-memory:setup`** — a ~2-minute interview that writes +The fastest path is **`/basic-memory:bm-setup`** — a ~2-minute interview that writes the config, seeds the schemas, and turns on the capture reflexes. The SessionStart hook nudges you toward it on first run. @@ -103,14 +103,14 @@ ever auto-writing to the shared graph.** - **Read across** — add team projects to `secondaryProjects`. SessionStart pulls their open decisions into your brief (in parallel, read-only), so you start oriented on what the team has decided. -- **Capture stays personal** — session checkpoints and `/basic-memory:remember` only +- **Capture stays personal** — session checkpoints and `/basic-memory:bm-remember` only ever write to your `primaryProject`. Nothing lands in a team project automatically. -- **Share deliberately** — `/basic-memory:share` copies a chosen note into a +- **Share deliberately** — `/basic-memory:bm-share` copies a chosen note into a `teamProjects` target (with attribution and a confirmation step). That's the only path to a shared write. Because project names repeat across workspaces, team refs must be **workspace-qualified** -(`my-team/notes`) or `external_id` UUIDs — `/basic-memory:setup` fills these in for you +(`my-team/notes`) or `external_id` UUIDs — `/basic-memory:bm-setup` fills these in for you from `list_workspaces`. ## Documentation diff --git a/plugins/claude-code/docs/architecture.md b/plugins/claude-code/docs/architecture.md index bac19c8a..23db50e4 100644 --- a/plugins/claude-code/docs/architecture.md +++ b/plugins/claude-code/docs/architecture.md @@ -38,7 +38,7 @@ flowchart TB OS["output-style
→ search-first / capture / cite reflexes"] end subgraph Deliberate["Deliberate (slash commands)"] - SK["/basic-memory:setup · remember · share · status"] + SK["/basic-memory:bm-setup · bm-remember · bm-share · bm-status"] end Ambient --> MCP["Basic Memory MCP server"] @@ -85,7 +85,7 @@ Key properties: is ~one query, not the sum. - **Best-effort.** No Basic Memory, no config, or a slow cloud read never blocks or errors the session — the worst case is a missing or partial brief. -- **First-run aware.** With no config it nudges toward `/basic-memory:setup`. +- **First-run aware.** With no config it nudges toward `/basic-memory:bm-setup`. ## PreCompact — the checkpoint @@ -145,7 +145,7 @@ flowchart TB T1 -- "read-only
(SessionStart)" --> P T2 -- "read-only
(SessionStart)" --> P - P -- "/basic-memory:share
(deliberate, confirmed)" --> T2 + P -- "/basic-memory:bm-share
(deliberate, confirmed)" --> T2 note["Auto-capture (checkpoints, /remember)
writes ONLY to primaryProject"] ``` @@ -160,7 +160,7 @@ project names collide across workspaces. Reads route over the user's OAuth sessi | `hooks/session-start.sh`, `hooks/pre-compact.sh` | the ambient bridge (read / write) | | `hooks/hooks.json` | registers the hooks | | `output-styles/basic-memory.md` | the capture reflexes | -| `skills/{setup,remember,share,status}/` | the deliberate slash commands | +| `skills/{bm-setup,bm-remember,bm-share,bm-status}/` | the deliberate slash commands | | `schemas/{session,decision,task}.md` | picoschema seeds (copied into your project at setup) | | `.claude/settings.json` → `basicMemory` | per-project configuration | | your Basic Memory projects | all actual content | diff --git a/plugins/claude-code/docs/getting-started.md b/plugins/claude-code/docs/getting-started.md index 4e1d9ef6..1aa9754d 100644 --- a/plugins/claude-code/docs/getting-started.md +++ b/plugins/claude-code/docs/getting-started.md @@ -37,7 +37,7 @@ SessionStart, PreCompact**. In a project (repo) where you want memory, run: ``` -/basic-memory:setup +/basic-memory:bm-setup ``` It's a short interview. It will: @@ -57,7 +57,7 @@ It's a short interview. It will: When it finishes, run: ``` -/basic-memory:status +/basic-memory:bm-status ``` to see exactly what the plugin is tracking. @@ -67,7 +67,7 @@ to see exactly what the plugin is tracking. 1. **Capture a decision.** In normal conversation, make a decision — e.g. *"Let's use Postgres, not SQLite, because we need concurrent writers."* With the output style on, Claude writes a `type: decision` note and tells you the permalink. -2. **Quick-capture something.** `/basic-memory:remember switch the staging job to the +2. **Quick-capture something.** `/basic-memory:bm-remember switch the staging job to the new image after the rebase lands` → saved to `bm-remember/`. 3. **Start a fresh session.** Open a new Claude Code session in the same project. The **SessionStart brief** appears first thing, showing your active tasks and the open @@ -83,7 +83,7 @@ graph accumulates. On Basic Memory Cloud with a team workspace, you can read team context into your brief and publish back deliberately. -Re-run `/basic-memory:setup` (or edit `.claude/settings.json`). Because project names +Re-run `/basic-memory:bm-setup` (or edit `.claude/settings.json`). Because project names repeat across workspaces, team projects use **workspace-qualified names** (`my-team/notes`) or `external_id` UUIDs — setup finds these for you via `list_workspaces`. @@ -102,7 +102,7 @@ repeat across workspaces, team projects use **workspace-qualified names** Now: - SessionStart folds the team's **open decisions** into your brief (read-only). - Your captures still go **only** to `primaryProject` — never to the team. -- `/basic-memory:share ` publishes a chosen note to `my-team/notes/shared`, with +- `/basic-memory:bm-share ` publishes a chosen note to `my-team/notes/shared`, with attribution and a confirmation step. Tip: a team brief is only as rich as the team's typed notes. Share an existing decision @@ -116,9 +116,9 @@ Everything is in the `basicMemory` block of `.claude/settings.json`. Common knob |-----|---------|--------------| | `primaryProject` | (default project) | where briefs read from and captures write to | | `secondaryProjects` | `[]` | team/shared projects read for recall (read-only) | -| `teamProjects` | `{}` | share targets for `/basic-memory:share` | +| `teamProjects` | `{}` | share targets for `/basic-memory:bm-share` | | `captureFolder` | `sessions` | folder for PreCompact checkpoints | -| `rememberFolder` | `bm-remember` | folder for `/basic-memory:remember` | +| `rememberFolder` | `bm-remember` | folder for `/basic-memory:bm-remember` | | `recallTimeframe` | `3d` | recency window for the brief | | `preCompactCapture` | `extractive` | how checkpoints are produced | @@ -126,7 +126,7 @@ See [settings.example.json](../settings.example.json) for the full shape. ## Troubleshooting -- **No brief at session start?** Confirm Basic Memory is connected (`/basic-memory:status`). +- **No brief at session start?** Confirm Basic Memory is connected (`/basic-memory:bm-status`). The hooks are silent if `basic-memory` isn't on PATH. - **Checkpoints aren't being written?** A `primaryProject` must be set — the PreCompact hook never writes to an un-pinned/default project on its own. diff --git a/plugins/claude-code/docs/why-combine-memory.md b/plugins/claude-code/docs/why-combine-memory.md index b38274f3..71cdd49e 100644 --- a/plugins/claude-code/docs/why-combine-memory.md +++ b/plugins/claude-code/docs/why-combine-memory.md @@ -72,18 +72,18 @@ often on a **team**. > team's recent open decisions. You're oriented before you ask a single question. **Wins:** no context bleeding between projects; team memory that compounds across -people; sharing a decision to the team in one gesture (`/basic-memory:share`). +people; sharing a decision to the team in one gesture (`/basic-memory:bm-share`). ## What you actually get -Once installed and set up (`/basic-memory:setup`): +Once installed and set up (`/basic-memory:bm-setup`): - **Session briefings** — start each session knowing your active tasks, open decisions, and (if on a team) recent team context. - **Checkpoints that survive compaction** — long sessions don't lose their thread. - **Capture reflexes** — Claude searches before answering recall questions and writes down real decisions as it goes, citing permalinks. -- **Quick capture** — `/basic-memory:remember` for a fast note without breaking flow. +- **Quick capture** — `/basic-memory:bm-remember` for a fast note without breaking flow. - **Team memory** — read across shared projects; publish back deliberately. All of it in plain Markdown files you own, in projects you control — local, cloud, or diff --git a/plugins/claude-code/hooks/session-start.sh b/plugins/claude-code/hooks/session-start.sh index f838d14e..ec8311d5 100755 --- a/plugins/claude-code/hooks/session-start.sh +++ b/plugins/claude-code/hooks/session-start.sh @@ -177,7 +177,7 @@ with ThreadPoolExecutor(max_workers=3 + MAX_SHARED) as pool: # The first-run nudge — shown until setup writes a basicMemory config block. setup_nudge = ( "_Basic Memory isn't set up for this project yet. Run " - "`/basic-memory:setup` (~2 min) to configure session briefings and checkpoints._" + "`/basic-memory:bm-setup` (~2 min) to configure session briefings and checkpoints._" ) # Trigger: every primary query failed (no default project, misnamed project, @@ -193,7 +193,7 @@ if primary_tasks is None and primary_decisions is None and primary_sessions is N print( "# Basic Memory\n\n" f"_Couldn't read from `{proj}` — it may be misnamed or unreachable. " - "Run `/basic-memory:status` to check._" + "Run `/basic-memory:bm-status` to check._" ) sys.exit(0) @@ -246,7 +246,7 @@ if shared_sections: lines += [ "", "_Shared-project context is read-only. Your captures stay in this project; " - "use `/basic-memory:share` to deliberately promote a note to the team._", + "use `/basic-memory:bm-share` to deliberately promote a note to the team._", ] if shared_capped: lines += ["", f"_(reading the first {MAX_SHARED} shared projects; more are configured.)_"] diff --git a/plugins/claude-code/schemas/decision.md b/plugins/claude-code/schemas/decision.md index 2a63a47f..fd751b7f 100644 --- a/plugins/claude-code/schemas/decision.md +++ b/plugins/claude-code/schemas/decision.md @@ -24,7 +24,7 @@ settings: A **DecisionNote** is a durable record of a real choice — one with alternatives and a rationale, not a passing preference. The Basic Memory plugin's output-style prompts Claude to capture these inline as decisions are made, and the future -`/basic-memory:decide` command captures them explicitly. +`/basic-memory:bm-decide` command captures them explicitly. Decisions are found by structured recall: `search_notes(metadata_filters={"type": "decision", "status": "open"})`. diff --git a/plugins/claude-code/schemas/session.md b/plugins/claude-code/schemas/session.md index 9c3fafc4..e7ba8cd8 100644 --- a/plugins/claude-code/schemas/session.md +++ b/plugins/claude-code/schemas/session.md @@ -25,7 +25,7 @@ settings: # Session A **SessionNote** is a resume checkpoint written by the Basic Memory plugin's -PreCompact hook (and, later, the `/basic-memory:handoff` command) right before +PreCompact hook (and, later, the `/basic-memory:bm-handoff` command) right before Claude Code compacts the context window. It records what the session was doing so the next session can pick up where this one left off. diff --git a/plugins/claude-code/settings.example.json b/plugins/claude-code/settings.example.json index 5a31d007..a6432b16 100644 --- a/plugins/claude-code/settings.example.json +++ b/plugins/claude-code/settings.example.json @@ -1,5 +1,5 @@ { - "$comment": "Example Basic Memory plugin settings. Copy the basicMemory block (and optionally outputStyle) into your project's .claude/settings.json, then set primaryProject. The easiest way to fill this in is /basic-memory:setup. Team projects (secondaryProjects, teamProjects) must use workspace-qualified names like 'my-team/notes' or external_id UUIDs — bare names are ambiguous across workspaces. See DESIGN.md for the full schema.", + "$comment": "Example Basic Memory plugin settings. Copy the basicMemory block (and optionally outputStyle) into your project's .claude/settings.json, then set primaryProject. The easiest way to fill this in is /basic-memory:bm-setup. Team projects (secondaryProjects, teamProjects) must use workspace-qualified names like 'my-team/notes' or external_id UUIDs — bare names are ambiguous across workspaces. See DESIGN.md for the full schema.", "basicMemory": { "primaryProject": "my-project", "secondaryProjects": ["my-team/main", "my-team/notes"], diff --git a/plugins/claude-code/skills/remember/SKILL.md b/plugins/claude-code/skills/bm-remember/SKILL.md similarity index 95% rename from plugins/claude-code/skills/remember/SKILL.md rename to plugins/claude-code/skills/bm-remember/SKILL.md index 09543e1b..68b5327d 100644 --- a/plugins/claude-code/skills/remember/SKILL.md +++ b/plugins/claude-code/skills/bm-remember/SKILL.md @@ -1,6 +1,6 @@ --- -name: remember -description: Quickly capture a thought, fact, or reminder into Basic Memory as a lightweight note. Use when the user says "remember that…", "note this", "save this to memory", or runs /basic-memory:remember. For quick deliberate capture — not full decision or session records. +name: bm-remember +description: Quickly capture a thought, fact, or reminder into Basic Memory as a lightweight note. Use when the user says "remember that…", "note this", "save this to memory", or runs /basic-memory:bm-remember. For quick deliberate capture — not full decision or session records. argument-hint: --- diff --git a/plugins/claude-code/skills/setup/SKILL.md b/plugins/claude-code/skills/bm-setup/SKILL.md similarity index 97% rename from plugins/claude-code/skills/setup/SKILL.md rename to plugins/claude-code/skills/bm-setup/SKILL.md index a793d0cc..6be70e38 100644 --- a/plugins/claude-code/skills/setup/SKILL.md +++ b/plugins/claude-code/skills/bm-setup/SKILL.md @@ -1,6 +1,6 @@ --- -name: setup -description: Set up the Basic Memory plugin for this project — a short guided interview that configures the project mapping, seeds note schemas, learns or suggests placement conventions, and enables capture reflexes. Use when the user runs /basic-memory:setup, says "set up basic memory", or asks to configure/bootstrap the plugin. +name: bm-setup +description: Set up the Basic Memory plugin for this project — a short guided interview that configures the project mapping, seeds note schemas, learns or suggests placement conventions, and enables capture reflexes. Use when the user runs /basic-memory:bm-setup, says "set up basic memory", or asks to configure/bootstrap the plugin. argument-hint: (no arguments — runs an interactive interview) --- @@ -71,7 +71,7 @@ Ask only what you can't infer. Cover: six, order the most relevant first and tell them the rest are configured but not read each session. - **Share target** (optional): if the user wants a place to *publish* notes to the - team via `/basic-memory:share`, add it to `teamProjects` as + team via `/basic-memory:bm-share`, add it to `teamProjects` as `"": { "promoteFolder": "shared" }`. Sharing is always a manual gesture — auto-capture never writes to a team project. @@ -102,7 +102,7 @@ Ask only what you can't infer. Cover: 6. **How active should I be? (output style)** "Want me to proactively capture — search the graph before recalling, write material decisions as typed notes, and cite permalinks? Or keep it quiet (just the session brief, the PreCompact - checkpoint, and `/basic-memory:remember` on demand)?" Enabling it sets + checkpoint, and `/basic-memory:bm-remember` on demand)?" Enabling it sets `outputStyle: "basic-memory"`. Default to enabled; leave it off for a recall-only, low-noise setup. (This is the single knob for how proactive the assistant is — the hooks always run regardless.) @@ -119,7 +119,7 @@ Ask only what you can't infer. Cover: ### 1. Seed the schemas The plugin ships seed schemas at `/schemas/` — that's **two directories up from this skill's directory, then `schemas/`** (this skill is at -`/skills/setup/`). Read `session.md`, `decision.md`, and `task.md` there. +`/skills/bm-setup/`). Read `session.md`, `decision.md`, and `task.md` there. For each one: - Check whether the chosen project already has a schema for that type @@ -222,5 +222,5 @@ Then handle activation based on the output style: proactive-capture reflexes wait for the restart. - **Output style off** → no restart needed; the hooks already run. -End with: *"Done — I'll use this from the next message. Run `/basic-memory:status` +End with: *"Done — I'll use this from the next message. Run `/basic-memory:bm-status` anytime to see what I'm tracking."* diff --git a/plugins/claude-code/skills/share/SKILL.md b/plugins/claude-code/skills/bm-share/SKILL.md similarity index 90% rename from plugins/claude-code/skills/share/SKILL.md rename to plugins/claude-code/skills/bm-share/SKILL.md index 8fee1773..7ecbb0d8 100644 --- a/plugins/claude-code/skills/share/SKILL.md +++ b/plugins/claude-code/skills/bm-share/SKILL.md @@ -1,6 +1,6 @@ --- -name: share -description: Promote a note from your personal Basic Memory project to a shared team project, with attribution. Use when the user says "share this with the team", "publish this decision", or runs /basic-memory:share. This is the deliberate way to write to a team workspace — auto-capture never does. +name: bm-share +description: Promote a note from your personal Basic Memory project to a shared team project, with attribution. Use when the user says "share this with the team", "publish this decision", or runs /basic-memory:bm-share. This is the deliberate way to write to a team workspace — auto-capture never does. argument-hint: --- @@ -8,7 +8,7 @@ argument-hint: Copy a note from the personal/primary project into a configured **team project** so teammates can see it. This is the *only* path by which the plugin writes to a shared -project — session checkpoints and `/basic-memory:remember` always stay personal. +project — session checkpoints and `/basic-memory:bm-remember` always stay personal. ## Steps @@ -19,7 +19,7 @@ project — session checkpoints and `/basic-memory:remember` always stay persona - `primaryProject` — the source project notes are read from. If `teamProjects` is empty, tell the user there's no share target configured and - suggest adding one (or running `/basic-memory:setup`), then stop. Don't invent a + suggest adding one (or running `/basic-memory:bm-setup`), then stop. Don't invent a target. 2. **Find the source note.** From `$ARGUMENTS` (a title, permalink, or `memory://` diff --git a/plugins/claude-code/skills/status/SKILL.md b/plugins/claude-code/skills/bm-status/SKILL.md similarity index 96% rename from plugins/claude-code/skills/status/SKILL.md rename to plugins/claude-code/skills/bm-status/SKILL.md index eaa909a1..23c99b33 100644 --- a/plugins/claude-code/skills/status/SKILL.md +++ b/plugins/claude-code/skills/bm-status/SKILL.md @@ -1,5 +1,5 @@ --- -name: status +name: bm-status description: Show the Basic Memory plugin's current state for this project — active project, capture folders, output style, recent session checkpoints, and whether Basic Memory is reachable. disable-model-invocation: true --- @@ -19,7 +19,7 @@ This is a quick diagnostic — gather the facts and lay them out; don't over-inv if present) and report: - From the `basicMemory` block: `primaryProject` (or note none is pinned — the default project is used), `secondaryProjects` (team/shared read sources), - `teamProjects` (share targets for `/basic-memory:share`), `captureFolder` + `teamProjects` (share targets for `/basic-memory:bm-share`), `captureFolder` (default `sessions`), `rememberFolder` (default `bm-remember`), and `preCompactCapture` mode (default `extractive`). - From the **root** settings object (not `basicMemory`): whether `outputStyle` is diff --git a/scripts/validate_claude_plugin.py b/scripts/validate_claude_plugin.py index 34ddc706..73352601 100644 --- a/scripts/validate_claude_plugin.py +++ b/scripts/validate_claude_plugin.py @@ -27,7 +27,7 @@ REQUIRED_HOOK_SCRIPTS = ("hooks/session-start.sh", "hooks/pre-compact.sh") # project at bootstrap). Each must be a parseable schema note. REQUIRED_SCHEMAS = ("session.md", "decision.md", "task.md") # Skills the plugin ships as namespaced slash commands (/basic-memory:). -REQUIRED_SKILLS = ("setup", "remember", "status", "share") +REQUIRED_SKILLS = ("bm-setup", "bm-remember", "bm-status", "bm-share") def read_json(path: Path) -> dict: