Slash commands¶
All scrubjay commands live in commands/*.md and are symlinked into ~/.claude/commands/ by
claude-sync.sh, so they're available in every session as /<name>. Because they ship with the
app (not your private data repo), every machine that installs scrubjay gets them out of the
box. They fall into two groups: archive/recall commands are thin wrappers that drive the
read-only sjmcp MCP tools; lifecycle commands just run the same scripts the
SessionStart/SessionEnd hooks do, on demand.
Archive & recall (drive the sjmcp tools)¶
| Command | Calls under the hood | Typically useful for |
|---|---|---|
/sjrecall <topic> [host= project= since=] |
sj_recall → sj_get |
"I discussed X somewhere, ages ago — which machine even?" Semantic recall across all machines: ranks candidates by topic, then pulls the one you pick (or a slice) into context. Start here when you remember the gist but not the where/when. |
/sjbrowse [transcript\|plan\|memory\|note] [host= project= since=] |
sj_list → sj_get |
Eyeballing a date-sorted list and grabbing one, when you have no search term in mind — "show me the last few plans on laptop." |
/sjfind <topic> in <session-id\|topic-words> [context=N] |
sj_search_within (+ sj_recall/sj_get) |
You know which session and want the exact spot a subject came up — returns turn/line anchors inside that one transcript instead of the whole thing. |
/sjget <sid \| path \| sj://uri> [turns=A-B \| lines=A-B] [full] |
sj_get (one call, no search) |
You already know the item and just want it pulled in — cheapest way, no recall/ranking. A session id works as the 8-char handle or the whole --resume id. Named with no slice, it fetches the session condensed — every word of the conversation, tool calls and their output folded to a couple of lines — which is what gets a whole session into one call; full asks for the tool traffic too. Its other edge is slicing: lines=1200-1300 or turns=5-10 of a huge transcript, fetched verbatim. |
/sjtable [head=N \| tail=N \| [a:b] \| all] [host= project= harness= model= topic= since= until=] |
bin/sj-table.sh (no MCP) |
Reading the catalogue as a table, not picking one item out of it. Filters apply before slices, so harness=opencode head=20 is "the newest 20 opencode sessions". It costs no MCP round-trip — it queries the rendered logs/CATALOGUE.md. Bare /sjtable prints a summary, not ~600 rows. |
For pulling a whole small doc with even less overhead than
/sjget,@-mention it from thesjmcpresource picker (match on the title, e.g.plan: … — <date> · <host>) — the harness injects it directly with no tool call at all.
Lifecycle & sync (run the hook scripts on demand)¶
| Command | Mirrors | Does |
|---|---|---|
/sjsync |
SessionStart | Pull the data repo + cross-machine memory, then re-apply config into ~/.claude. Grab changes another machine just pushed, mid-session, instead of waiting for the next start. |
/sjlog |
SessionEnd | Publish now without ending the session: log line + chats index + push data repo + push memory + relay this session's transcript/plans/history/tasks to the NAS. Handy so another machine (or /sjrecall) can see it right away. |
/sjresume [sid8 \| words] |
— | Continue a session from another machine here (hand-off). Stages the archived transcript — plus its subagents, tasks and file history — into this machine's ~/.claude/projects/, rewriting the other host's paths to this one's, so Claude Code's own /resume can pick it up. Run it from the project dir; then /resume. |
/sjonboard [hint] |
— | Guided wrapper around bin/onboard.sh (gathers choices in chat, then runs it unattended). For onboarding or reconfiguring (e.g. "switch backend to rsync-wg"). For a brand-new machine without scrubjay yet, run bin/onboard.sh in a terminal instead. |
/sjmemory |
— | Enable/repair cross-machine memory on this machine (idempotent — runs bin/onboard-memory.sh). First-time memory setup, or when memory sync looks broken. |
/sjnote [what to capture \| /path/to/file] |
— | Keep a written artefact — an analysis, a briefing, a design rationale (runs bin/sj-note.sh). Writes it to <memory>/<project>/notes/ and publishes immediately, so it survives the session and reaches every machine. Invoke it before the work too: it stands for the rest of the session, so durable output goes there instead of the scratchpad. Notes are not loaded into future sessions — read them back with /sjrecall or /sjbrowse note. |
/sjpaste [name] |
— | Put the clipboard into this project's assets and read it. For the thing a terminal can't do: a screenshot, a copied PDF, a diagram. Writes to $SCRUBJAY_ASSETS/<project-slug>/ (machine-local, not synced) and hands the path straight to the session. Needs a clipboard on the machine running the session — over SSH use cat <file> \| bin/sj-paste.sh - instead. |
/sjdoctor [section…] |
— | Check that this machine's sync actually works (runs bin/sj-doctor.sh). With no argument it verifies everything: config, the data repo, the memory clone, relay reachability, adapters and the last recorded outcomes. Name sections — config, data, memory, relay, harnesses, outcomes — to check just those, which skips the slow network probes for the rest. Read-only and safe to run any time; reach for it when something should have synced and didn't. |