You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(skill): permalink shapes and workspace-qualified project syntax
After digging into basic-memory's recent workspace-routing work
(PRs #790, #795, #801, #803, #807, #808 in basicmachines-co/basic-memory),
the canonical permalink can carry up to three levels of routing —
short ('folder/note'), project-qualified ('project/folder/note'),
and workspace-qualified ('workspace/project/folder/note'). The
read/write tools accept all three shapes, and the returned permalink
from bm_write self-routes for follow-up reads when written with a
workspace-qualified project.
Two updates land in this commit:
1. New "Permalinks" section in SKILL.md documenting the three shapes
with a worked table and the round-trip property. Memory:// URLs
follow the same shapes and now get covered in the same section
(the old one-line "Memory URLs" section is folded in).
2. The "Cross-project routing" section now explains that the `project`
argument itself accepts workspace-qualified syntax
('personal/main', 'team-paul/research') — not only project_id can
disambiguate workspaces. project_id is still highlighted as the
most durable form (survives renames).
The recipe at the bottom of SKILL.md is updated to leverage the
permalink round-trip: write with workspace-qualified `project=`,
capture the returned (workspace-qualified) permalink, then read it
back with no `project` arg needed.
Updates the [0.3.0] CHANGELOG entry to mention the Permalinks section
addition.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -9,7 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
9
9
### Added
10
10
-**Per-call project routing on every `bm_*` tool.** All eight tools now accept optional `project` (name) and `project_id` (UUID from `bm_projects`) parameters. The agent can write or read against a project other than the Hermes-configured one — useful when the user asks to write into a different cloud project (e.g. a personal `main` project) without reconfiguring the plugin. `project_id` takes precedence over `project`; both fall back to the configured default when omitted. Workspace routing is handled transparently by BM via `project_id` — no separate workspace parameter is needed.
11
11
-**`bm_projects` and `bm_workspaces` agent tools.** Promotes the discovery logic previously available only as `/bm-project` and `/bm-workspace` slash commands to agent-facing tools. `bm_projects` returns JSON with `name` and `external_id` (UUID) per project so the agent can hand the UUID to `bm_write` / `bm_read` / etc. via `project_id` — the unambiguous form across cloud workspaces. `bm_workspaces` lists BM Cloud workspaces (name, type, role, default flag). Together with per-call routing, these unblock the workflow Drew's friction note flagged: agent picks the right project + workspace before writing, instead of silently operating against the active Hermes memory project.
12
-
-**SKILL.md cross-project workflow** documenting the discovery → route → write → verify recipe end-to-end. Also backfills `bm_recent` documentation (the tool shipped in 0.2.0 but the skill hadn't been updated). New "Cross-project routing" section explains `project` vs `project_id`precedence and the workspace disambiguation flow; the "When to use" lookup table extends to cover the new cases.
12
+
-**SKILL.md cross-project workflow** documenting the discovery → route → write → verify recipe end-to-end. Adds a "Permalinks" section covering the three canonical shapes (short, project-qualified, workspace-qualified) and the round-trip property where `bm_write`'s returned permalink self-routes for follow-up reads. A "Cross-project routing" section explains `project`(including workspace-qualified syntax like `"personal/main"`) vs `project_id` and when to use each. Also backfills `bm_recent` documentation (the tool shipped in 0.2.0 but the skill hadn't been updated).
13
13
14
14
### Notes
15
15
- Addresses the routing, discovery, and documentation gaps in the real-world note "Hermes Basic Memory Cloud Task Experience." A proposed `bm_import` tool was evaluated and dropped — `read_file` + `bm_write` already composes the same operation with no new capability, at the cost of one more tool in the surface.
`timeframe` accepts natural language (`"yesterday"`, `"2 weeks"`, `"last month"`) or compact forms (`"7d"`, `"24h"`). Default is `7d`.
91
91
92
92
### `bm_projects` — list available projects
93
-
Returns nameand `external_id` (UUID) per project across local and cloud. Call this when the user names a project that isn't the active one — the UUID is what `project_id` on the other tools expects.
93
+
Returns name, workspace slug, and `external_id` (UUID) per project across local and cloud. Call this when the user names a project that isn't the active one. Route follow-up tool calls either by workspace-qualified name (`project: "personal/main"`) or by UUID (`project_id: "01HXYZ..."`) — see Cross-project routing below.
94
94
95
95
```
96
96
bm_projects()
@@ -103,20 +103,37 @@ Workspaces are a BM Cloud concept. Returns name, type, role, and default flag. P
103
103
bm_workspaces()
104
104
```
105
105
106
+
## Permalinks
107
+
108
+
A permalink is the canonical, URL-friendly identifier for a note. Three shapes exist; the read/write tools accept all of them:
109
+
110
+
| Shape | Example | When |
111
+
|---|---|---|
112
+
|**Short**|`decisions/auth-strategy`| Bare `folder/note-slug`. Tools need a `project` (or `project_id`) arg to route — the permalink alone isn't enough. |
113
+
|**Project-qualified**|`main/decisions/auth-strategy`|`project-name/folder/note-slug`. Carries enough context to route without a separate `project` arg. |
114
+
|**Workspace-qualified**|`personal/main/decisions/auth-strategy`|`workspace-slug/project-name/folder/note-slug`. Fully routes, including across cloud workspaces with same-named projects. |
115
+
116
+
**Important: the permalink returned by `bm_write` already encodes the routing it needs for follow-up reads.** If you wrote with `project="personal/main"`, you get back `personal/main/folder/note-slug` and can call `bm_read({ identifier: <that permalink> })` with no `project` arg. The permalink self-routes.
117
+
118
+
`memory://` URLs follow the same shapes: `memory://personal/main/decisions/auth-strategy` is valid. The `memory://` prefix is optional for `bm_read` (any of the three permalink shapes works directly); `bm_context` expects the prefix.
119
+
106
120
## Cross-project routing
107
121
108
-
Every read/write tool (`bm_search`, `bm_read`, `bm_write`, `bm_edit`, `bm_context`, `bm_delete`, `bm_move`, `bm_recent`) accepts two optional routing parameters:
122
+
Every read/write tool (`bm_search`, `bm_read`, `bm_write`, `bm_edit`, `bm_context`, `bm_delete`, `bm_move`, `bm_recent`) accepts optional `project` and `project_id`:
109
123
110
-
-`project` — project name (e.g. `"main"`). Easy to read; can be ambiguous if the same name exists in multiple cloud workspaces.
111
-
-`project_id` — UUID from `bm_projects`. Unambiguous; the right choice when project names might collide. Wins over `project` if both are passed.
124
+
-`project` — project name, optionally workspace-qualified. Plain (`"main"`) when the name is globally unique; qualified (`"personal/main"`, `"team-paul/research"`) when you need to pick a specific cloud workspace by slug.
125
+
-`project_id` — UUID from `bm_projects` (`external_id` field). The most stable identifier — survives project renames and works across workspaces without qualification. Wins over `project` if both are passed.
112
126
113
127
Omit both and the call uses the Hermes-configured active project.
When the user asks something like *"save this markdown file to my personal `main` project, return the permalink"*:
128
145
129
-
1.**Discover the project.** Call `bm_projects()` and find the entry matching the user's described project + workspace. Capture its `external_id`.
146
+
1.**Discover the project.** Call `bm_projects()` and find the entry matching the user's described project + workspace. You can route by either the workspace-qualified name (`personal/main`) or the UUID (`external_id`).
Return the permalink (and the project name for clarity) to the user.
@@ -166,8 +184,9 @@ Return the permalink (and the project name for clarity) to the user.
166
184
| Updating prior work |`bm_edit` (append for time-ordered logs, replace_section for living docs) |
167
185
| Exploring related concepts |`bm_context`|
168
186
| "What was I working on yesterday?" / no specific query yet |`bm_recent`|
169
-
| User names a project that isn't the active one |`bm_projects` → pick UUID → call read/write tool with `project_id`|
170
-
| Same project name might exist in multiple workspaces |`bm_projects` + `bm_workspaces` to disambiguate, then `project_id`|
187
+
| User names a project that isn't the active one |`bm_projects` → call read/write tool with `project: "workspace/name"` or `project_id: "<uuid>"`|
188
+
| Same project name might exist in multiple workspaces |`bm_projects` (+ `bm_workspaces` if needed) → route with workspace-qualified `project` or `project_id`|
189
+
| Following up on a freshly-written note | Use the returned permalink directly — it already encodes the routing |
171
190
172
191
## Note structure
173
192
@@ -197,10 +216,6 @@ Background and current situation.
197
216
-[ ] Document
198
217
```
199
218
200
-
## Memory URLs
201
-
202
-
`memory://projects/api-redesign` — direct reference. Used in `bm_context`, `bm_read`. The `memory://` prefix is optional for `bm_read`.
203
-
204
219
## Behavior guidelines
205
220
206
221
1.**Search before answering.** If the user asks "what did we decide about X?", run `bm_search` first.
0 commit comments