crispy-recall 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +230 -192
- package/THIRD-PARTY-LICENSES +43 -145
- package/dist/SKILL.md.template +7 -0
- package/dist/embed-pending.js +642 -189
- package/dist/recall.js +4935 -3049
- package/dist/statusline.js +180 -0
- package/dist/stop-hook.js +607 -143
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,237 +1,275 @@
|
|
|
1
1
|
# crispy-recall
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
**Status:** in development.
|
|
6
|
-
|
|
7
|
-
A standalone spin-off of the recall feature from [Crispy](https://github.com/TheSylvester/crispy). See the parent project for the broader multi-agent orchestration GUI.
|
|
8
|
-
|
|
9
|
-
## What's new in 0.2.1
|
|
10
|
-
|
|
11
|
-
- **macOS install support.** 0.2.0's native SQLite engine shipped without ever
|
|
12
|
-
running on Apple hardware; 0.2.1 fixes the macOS install path and validates it
|
|
13
|
-
end-to-end on Apple Silicon. Fixes: a pre-flight macOS-version check (the
|
|
14
|
-
bundled llama.cpp embedding binaries need macOS 14+ on arm64, 13.7+ on Intel),
|
|
15
|
-
a Node path that stays valid across `brew upgrade node` during in-place
|
|
16
|
-
upgrades (it previously pinned a Homebrew Cellar path that a later upgrade
|
|
17
|
-
removes), an up-front rejection of Node 23 (no prebuilt SQLite binding) with an
|
|
18
|
-
explanation instead of a late failure, and a load-check of the staged SQLite
|
|
19
|
-
binding before the installer trusts it. Non-macOS installs are unaffected.
|
|
20
|
-
- **`recall install` no longer hangs during setup.** Extraction of the embedding
|
|
21
|
-
binaries is now time-boxed with a fallback to the OS unzip tool
|
|
22
|
-
(`unzip`/`ditto`/`Expand-Archive`), so a stalled extract can no longer wedge
|
|
23
|
-
the installer.
|
|
24
|
-
|
|
25
|
-
## What's new in 0.2.0
|
|
26
|
-
|
|
27
|
-
- **Native SQLite engine with real WAL.** The database now runs on
|
|
28
|
-
better-sqlite3 with write-ahead logging instead of the previous WebAssembly
|
|
29
|
-
binding — which never actually engaged WAL and could silently corrupt the
|
|
30
|
-
index when multiple processes wrote at once. That failure mode is eliminated
|
|
31
|
-
at the root. `recall doctor` gains a SQLite-binding health section.
|
|
32
|
-
**Node.js 22 LTS (≥ 22.16) or 24+ is now required** (Node 23 has no prebuilt
|
|
33
|
-
SQLite binding).
|
|
34
|
-
- **Git provenance: `--commit` and `--blame`.** `recall --commit <hash>` lists
|
|
35
|
-
the session(s) that produced a commit; `recall --blame <path>[:line[-line]]`
|
|
36
|
-
traces a file or line range back to the conversations responsible. Matching
|
|
37
|
-
is structural (your sessions' actual edits vs the commit's diff), not
|
|
38
|
-
timestamp-based. These flags were documented in the skill but missing from
|
|
39
|
-
the shipped CLI; they now work as documented.
|
|
40
|
-
- **Better semantic retrieval (embedding v3).** Stored messages and queries now
|
|
41
|
-
carry the task prefixes the embedding model was trained on, and short turns
|
|
42
|
-
(one-line answers, approvals, decisions) are embedded together with their
|
|
43
|
-
preceding context so they're finally findable by meaning. Measurably improves
|
|
44
|
-
retrieval on the LoCoMo benchmark (recall@5 54.9 → 58.4).
|
|
45
|
-
- **Semantic search stays available during migrations.** Upgrading re-embeds
|
|
46
|
-
your history in the background; until it finishes, search transparently
|
|
47
|
-
blends old- and new-format vectors and tags output with
|
|
48
|
-
`(migrating: N% re-embedded)` instead of going dark.
|
|
49
|
-
- **Relevance-first ranking.** The hidden age penalty is off by default —
|
|
50
|
-
older sessions now rank purely by relevance (previously the right old result
|
|
51
|
-
could rank 2× worse just for being old). Pass `--recent` to prefer newer
|
|
52
|
-
sessions explicitly.
|
|
53
|
-
- **Faster indexing on large databases.** A new index removes a full-table
|
|
54
|
-
scan from every embedding batch and end-of-turn catch-up (~0.3 s → ~0.05 s
|
|
55
|
-
at ~287K messages). Created automatically on first run.
|
|
56
|
-
- **Safe in-place upgrade for existing installs.** `recall install` migrates
|
|
57
|
-
an existing database in place: rollback snapshot → WAL conversion →
|
|
58
|
-
integrity check with auto-repair → background re-embed. See
|
|
59
|
-
[Upgrading from 0.1.x](#upgrading-from-01x).
|
|
60
|
-
- **New scripting flags.** `--raw-messages` (full ranked per-message JSON) and
|
|
61
|
-
`--no-idf` (keep common words in keyword search), both off by default.
|
|
3
|
+
**Save every session. Recall any conversation. Continue where you left off.**
|
|
62
4
|
|
|
63
|
-
|
|
5
|
+
Each conversation with your agent lands in a transcript on disk, waiting for Claude Code's [startup cleanup (30 days by default)](https://code.claude.com/docs/en/settings) to delete it. recall indexes user and assistant turns as they end — verbatim, on your machine — so your agent can search, read, and continue the conversation even after its transcript is gone.
|
|
6
|
+
|
|
7
|
+
**Local session memory for Claude Code, with Codex support.** Hybrid text and semantic search. Verbatim conversation history.
|
|
8
|
+
|
|
9
|
+
No daemon, no cron, no cloud. A Stop hook and a SQLite file.
|
|
64
10
|
|
|
65
|
-
|
|
11
|
+
## Quick start
|
|
12
|
+
|
|
13
|
+
Requires Claude Code and either Node.js 22 LTS (`>=22.16`) or Node.js 24+. Install recall in the same environment where you run Claude Code:
|
|
66
14
|
|
|
67
15
|
```bash
|
|
68
16
|
npm install -g crispy-recall
|
|
69
17
|
recall install
|
|
70
18
|
```
|
|
71
19
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
>
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
Prerequisites: Node 22 LTS (≥ 22.16) or 24+ — Node 23 is unsupported (no
|
|
97
|
-
prebuilt SQLite binding) — and Claude Code installed. If Codex is detected
|
|
98
|
-
(`~/.codex/` exists), recall installs the `recall` skill into Codex (so the
|
|
99
|
-
agent can search) and you can index your Codex history with
|
|
100
|
-
`recall backfill --vendor codex`. Real-time per-turn Codex indexing is **not
|
|
101
|
-
yet** supported.
|
|
102
|
-
|
|
103
|
-
### Upgrading from 0.1.x
|
|
20
|
+
recall downloads a local embedding runtime and model, sets up a `Stop` hook in Claude Code, installs the recall Agent Skill, and starts indexing the session history still on disk. If Codex is detected, recall sets up the same integration there.
|
|
21
|
+
|
|
22
|
+
## How to use recall
|
|
23
|
+
|
|
24
|
+
### Ask your agent
|
|
25
|
+
|
|
26
|
+
**Your agent starts every session from zero — until you say the word.**
|
|
27
|
+
|
|
28
|
+
The word is `recall`. Say it in a prompt and your agent goes and gets exactly what it needs: a top-level conversation by UUID, messages by keyword or meaning, or the Claude Code session that wrote the code behind a commit.
|
|
29
|
+
|
|
30
|
+
Use it naturally:
|
|
31
|
+
|
|
32
|
+
| Say this | What your agent can recover |
|
|
33
|
+
|---|---|
|
|
34
|
+
| `Recall where we left off.` | The decisions, unfinished work, and next step from prior sessions. |
|
|
35
|
+
| `Recall — we solved this before.` | The earlier fix, even when your new wording doesn't match the transcript. |
|
|
36
|
+
| `Recall <session-uuid> and continue.` | A UUID-backed conversation in a fresh session, centered on the relevant part. |
|
|
37
|
+
| `Recall why this line exists.` | The session behind a commit or line, including alternatives discussed at the time. |
|
|
38
|
+
|
|
39
|
+
The installed skill teaches Claude Code and Codex when and how to search, so your agent can invoke recall without you typing a special command.
|
|
40
|
+
|
|
41
|
+
### Use the CLI directly
|
|
42
|
+
|
|
43
|
+
Search first:
|
|
104
44
|
|
|
105
45
|
```bash
|
|
106
|
-
|
|
107
|
-
recall install # run this FIRST, before any other recall command
|
|
46
|
+
recall "why did we choose this retry policy?"
|
|
108
47
|
```
|
|
109
48
|
|
|
110
|
-
|
|
111
|
-
first recall command you run after the npm upgrade — it performs a one-time,
|
|
112
|
-
in-place migration of your existing database (rollback snapshot → WAL
|
|
113
|
-
conversion → integrity check → background re-embed). If a live session is
|
|
114
|
-
still holding the database the installer aborts cleanly and asks you to
|
|
115
|
-
re-run; re-running is always safe and picks up where it left off.
|
|
116
|
-
|
|
117
|
-
What to expect:
|
|
118
|
-
|
|
119
|
-
- **Your indexed history is preserved — even without the original
|
|
120
|
-
transcripts.** Claude Code deletes session `.jsonl` files after 30 days by
|
|
121
|
-
default; the migration never reads them. It works on the database in place,
|
|
122
|
-
and the re-embed sources text from the database itself.
|
|
123
|
-
- A rollback snapshot is written to `~/.recall/recall.db.pre-upgrade-<stamp>`
|
|
124
|
-
(needs free disk roughly equal to your DB size; delete it once you're
|
|
125
|
-
satisfied).
|
|
126
|
-
- A background re-embed upgrades your vectors to the new format — roughly an
|
|
127
|
-
hour per 20K messages on CPU, minutes on GPU. Search works the entire time
|
|
128
|
-
(output shows `migrating: N% re-embedded`); watch progress with
|
|
129
|
-
`recall status`. It resumes automatically after reboots.
|
|
130
|
-
- The migration is one-way: **don't downgrade** to ≤ 0.1.6 afterwards — the
|
|
131
|
-
old engine fails closed on the converted database.
|
|
132
|
-
- **Avoid `recall repair --full` unless you accept losing older history** — it
|
|
133
|
-
rebuilds the index from the transcripts still on disk, which for most
|
|
134
|
-
machines means only the last 30 days. Your database is the store of record;
|
|
135
|
-
the pre-upgrade snapshot is the rollback path if anything looks wrong.
|
|
136
|
-
|
|
137
|
-
## What it does
|
|
138
|
-
|
|
139
|
-
- A **Stop hook** ingests every turn into a local SQLite DB the moment a session ends — no daemon, no background polling.
|
|
140
|
-
- The CLI **searches** your history two ways at once: FTS5 full-text and semantic vectors (Nomic Embed Text v1.5, run locally via llama.cpp).
|
|
141
|
-
- A **`recall` skill** is dropped into Claude Code so the agent discovers and invokes it on its own — you rarely type `recall` yourself.
|
|
142
|
-
- Works in **any project**. Claude Code sessions are indexed automatically; Codex transcripts are searchable too via `recall backfill --vendor codex`.
|
|
143
|
-
|
|
144
|
-
## How an agent uses it
|
|
145
|
-
|
|
146
|
-
Two steps. First, search for the relevant session:
|
|
49
|
+
Every result includes a session id and the matched message id. For UUID-based Claude Code results, read the promising result centered on the match:
|
|
147
50
|
|
|
148
51
|
```bash
|
|
149
|
-
recall
|
|
52
|
+
recall <session-uuid> <message-uuid>
|
|
150
53
|
```
|
|
151
54
|
|
|
152
|
-
|
|
55
|
+
Search defaults to the current project's sessions. Expand only when needed:
|
|
153
56
|
|
|
154
57
|
```bash
|
|
155
|
-
recall
|
|
58
|
+
recall --all "the decision may have happened in another repo"
|
|
59
|
+
recall --project ~/dev/other-repo "the decision"
|
|
60
|
+
recall "the latest release issue" --recent
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
recall surfaces evidence, not truth. Good agents check recovered context against git HEAD, the current files, and fresh tests before acting on it.
|
|
64
|
+
|
|
65
|
+
## Why recall?
|
|
66
|
+
|
|
67
|
+
> My agent burned 20 minutes re-diagnosing a failure. The one-line fix sat in 24 prior sessions.
|
|
68
|
+
|
|
69
|
+
So I built crispy-recall — local, verbatim search across my agent's past sessions.
|
|
70
|
+
|
|
71
|
+
Your agent doesn't need to guess what will matter later. It needs a way to search what actually happened once the question becomes clear.
|
|
72
|
+
|
|
73
|
+
## What makes recall different
|
|
74
|
+
|
|
75
|
+
### The conversation, not a summary
|
|
76
|
+
|
|
77
|
+
recall keeps the user and assistant conversation word-for-word. It doesn't replace the record with a model's guess about which details might matter later.
|
|
78
|
+
|
|
79
|
+
That distinction matters when you need the exact constraint, command, promise, rejected idea, or one-line fix that a summary would reasonably discard.
|
|
80
|
+
|
|
81
|
+
**`/compact` summarizes. recall quotes.**
|
|
82
|
+
|
|
83
|
+
Auto-memory saves what you knew to keep. recall finds what you didn't know you'd need. They complement each other: one keeps selected facts close; the other searches the verbatim conversation record on demand.
|
|
84
|
+
|
|
85
|
+
Tool calls, tool output, and hidden thinking are intentionally excluded from the searchable conversation. Tool output is re-runnable; the conversation that interpreted it isn't.
|
|
86
|
+
|
|
87
|
+
### Continue without replaying the session
|
|
88
|
+
|
|
89
|
+
Read a past conversation by UUID-shaped session id:
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
Recall fe6cc221-2e63-4928-8417-65ec1587d062 and continue the release.
|
|
156
93
|
```
|
|
157
94
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
indexed
|
|
161
|
-
|
|
162
|
-
|
|
95
|
+
recall reads the indexed conversation instead of replaying an entire raw transcript. Reads can open on the matched message, paginate forward, and combine context from several past sessions. That means your agent can recover the few facts that matter without pouring every old tool result back into its context window.
|
|
96
|
+
|
|
97
|
+
`/resume` dies with the transcript; recall doesn't. recall reads the relevant indexed turns instead of replaying one whole session, and it can combine facts from other sessions.
|
|
98
|
+
|
|
99
|
+
### From a line of code back to the conversation
|
|
100
|
+
|
|
101
|
+
`git blame` can tell you who changed a line. `recall --blame` can take you back to the conversation that produced it.
|
|
163
102
|
|
|
164
103
|
```bash
|
|
165
|
-
recall --
|
|
104
|
+
recall --commit 25dd0f8
|
|
105
|
+
recall --blame src/paths.ts:82-84
|
|
106
|
+
recall --blame src/foo.ts:42 src/bar.ts:10-20 --limit 20
|
|
166
107
|
```
|
|
167
108
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
109
|
+
Matching is structural: recall compares edits recorded in sessions with commit diffs instead of guessing from timestamps. A commit message summarizes intent; the conversation holds the reasoning, tradeoffs, and rejected alternatives.
|
|
110
|
+
|
|
111
|
+
Commit and blame attribution currently scans Claude Code transcripts. Codex sessions remain searchable by text and meaning, but aren't yet attributed to commits.
|
|
112
|
+
|
|
113
|
+
**`git blame` tells you who. `recall --blame` tells you why.**
|
|
114
|
+
|
|
115
|
+
### Search for the idea, not just the words
|
|
116
|
+
|
|
117
|
+
You rarely remember the exact phrase an agent used three weeks ago. recall searches two ways at once:
|
|
118
|
+
|
|
119
|
+
- SQLite FTS5 finds exact words and phrases quickly.
|
|
120
|
+
- Local semantic embeddings find the same idea under different wording.
|
|
121
|
+
- Rank fusion combines both result sets.
|
|
122
|
+
- Project scoping keeps everyday searches focused; `--all` crosses repositories when the project itself is the thing you forgot.
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
recall "the mac installer hang we fixed"
|
|
126
|
+
recall --all "why we stopped using the wasm sqlite binding"
|
|
127
|
+
recall --project ~/dev/my-app "booking slot id decision"
|
|
128
|
+
```
|
|
174
129
|
|
|
175
|
-
|
|
130
|
+
### Grep is still the right tool sometimes
|
|
176
131
|
|
|
177
|
-
|
|
132
|
+
If you know the exact string and the transcript still exists, use grep. recall earns its keep when:
|
|
133
|
+
|
|
134
|
+
- the transcript has already been deleted;
|
|
135
|
+
- your wording doesn't match the original conversation;
|
|
136
|
+
- the answer spans several sessions or repositories;
|
|
137
|
+
- you need to move from a commit or line of code back to the session that produced it; or
|
|
138
|
+
- you want your agent to retrieve the context itself instead of manually hunting through JSONL files.
|
|
139
|
+
|
|
140
|
+
Claude Code deletes transcripts after 30 days by default. The recall index doesn't. You can and often should raise `cleanupPeriodDays`; longer retention keeps more source files, while recall makes the record searchable after those files are gone.
|
|
141
|
+
|
|
142
|
+
**Grep can't search a deleted file.**
|
|
143
|
+
|
|
144
|
+
## How it works
|
|
145
|
+
|
|
146
|
+
Under the hood, recall is deliberately boring:
|
|
147
|
+
|
|
148
|
+
1. Stop and SubagentStop hooks index conversation text as turns finish.
|
|
149
|
+
2. A local llama.cpp embedding model vectorizes it on your machine.
|
|
150
|
+
3. SQLite stores the text, FTS5 index, vectors, and session metadata in `~/.recall/`.
|
|
151
|
+
4. A small skill teaches your agent to search first when prior work is likely to matter.
|
|
152
|
+
5. Search results enter the context only when the agent asks for them.
|
|
153
|
+
|
|
154
|
+
There's no resident daemon, and recall makes no LLM calls of its own. Indexing and search don't consume model tokens; retrieved text costs context tokens only when your agent reads it, like any other local file.
|
|
155
|
+
|
|
156
|
+
Install-time backfill indexes the Claude Code and Codex sessions still present on disk, so recall is useful on day one rather than only after day one.
|
|
157
|
+
|
|
158
|
+
## Install
|
|
159
|
+
|
|
160
|
+
### Requirements
|
|
161
|
+
|
|
162
|
+
- Node.js 22 LTS (`>=22.16`) or Node.js 24+
|
|
163
|
+
- Claude Code (required); Codex session indexing and search are also configured when Codex is detected
|
|
164
|
+
- Linux x64/arm64, macOS x64/arm64, or Windows x64
|
|
165
|
+
- macOS 14+ on Apple Silicon or macOS 13.7+ on Intel
|
|
166
|
+
- 500 MB free recommended for installation; upgrading also needs free space for retained rollback snapshots — roughly the database size when upgrading from 0.2.x, and roughly twice that from 0.1.x (which keeps two snapshots)
|
|
167
|
+
|
|
168
|
+
Node 23 is unsupported because no prebuilt SQLite binding is available for it.
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
npm install -g crispy-recall
|
|
172
|
+
recall install
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
> **Don't use `npx`.** recall installs persistent hooks, a skill, a model, and a command that must remain available after setup.
|
|
176
|
+
|
|
177
|
+
Run the installer in the environment where you use your agent. WSL and Windows-native are separate environments, so install once in each if you use both.
|
|
178
|
+
|
|
179
|
+
The installer:
|
|
180
|
+
|
|
181
|
+
- creates `~/.recall/`;
|
|
182
|
+
- downloads the llama.cpp binary and local embedding model;
|
|
183
|
+
- installs Claude Code and Codex lifecycle hooks when each harness is detected;
|
|
184
|
+
- installs the recall skill and a short AGENTS.md/CLAUDE.md nudge; and
|
|
185
|
+
- backfills the session history that is still on disk.
|
|
186
|
+
|
|
187
|
+
Use `recall doctor` if setup reports a problem. Use `recall install --offline` with pre-staged assets for an offline install.
|
|
188
|
+
|
|
189
|
+
### Upgrading
|
|
190
|
+
|
|
191
|
+
Close active Claude Code and Codex sessions, then make `recall install` the first recall command you run after upgrading — it applies any pending one-time database migrations attended, before your agent reopens the database:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
npm install -g crispy-recall
|
|
195
|
+
recall install
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
- **From 0.1.x**, the installer migrates the wasm database to native SQLite/WAL (writing a `~/.recall/recall.db.pre-upgrade-<stamp>` snapshot) and checks integrity, then runs the retrieval-class migration below.
|
|
199
|
+
- **From 0.2.x**, the installer runs the retrieval-class migration: it reclassifies any subagent (agent-leaf) messages as durable-but-excluded-from-default-search, rebuilds the FTS index, and re-embeds affected rows in the background.
|
|
200
|
+
|
|
201
|
+
Before it changes anything, the retrieval-class migration writes a `~/.recall/recall.db.pre-retrieval-<stamp>` snapshot; a 0.1.x upgrade therefore keeps two retained snapshots (pre-upgrade and pre-retrieval). Keep free disk roughly equal to the current database size — twice that when upgrading from 0.1.x — and delete the snapshots only after you're satisfied.
|
|
202
|
+
|
|
203
|
+
If a live session or a running backfill holds the database, the installer aborts cleanly so you can exit it and rerun `recall install`. Search remains available during migration; use `recall status` to watch progress, and the background re-embed resumes after interruption or reboot.
|
|
204
|
+
|
|
205
|
+
Migration works from `recall.db`, not the source transcripts, so indexed history is preserved even when the original JSONL has already been cleaned up. Your database is the store of record; if old transcripts are gone, `recall repair --full` cannot recreate them. Don't downgrade to `<=0.1.6` after converting the database.
|
|
206
|
+
|
|
207
|
+
## Command reference
|
|
208
|
+
|
|
209
|
+
| Command | Purpose |
|
|
178
210
|
|---|---|
|
|
179
|
-
| `recall "<query>"
|
|
180
|
-
| `recall <
|
|
181
|
-
| `recall
|
|
182
|
-
| `recall
|
|
183
|
-
| `recall
|
|
184
|
-
| `recall
|
|
185
|
-
| `recall
|
|
186
|
-
| `recall
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
Edit/Write/MultiEdit tool calls are compared against the commit's diff via
|
|
198
|
-
tri-gram intersection, not clock proximity. `--blame` is HEAD-relative: it runs
|
|
199
|
-
`git blame` to find the commits behind the current file (or line range) and
|
|
200
|
-
attributes each; sessions overwritten by a later commit won't appear. Results
|
|
201
|
-
list top-level sessions and subagent leaves chronologically (oldest first).
|
|
211
|
+
| `recall "<query>"` | Hybrid text + semantic search in the current project. |
|
|
212
|
+
| `recall "<query>" --all` | Search every indexed project. |
|
|
213
|
+
| `recall <session-id> [<message-id>]` | Read a session, optionally centered on a match. IDs are opaque — full stored IDs or literal prefixes (UUIDs, `agent-<hex>` leaves, `codex-jsonl-*` messages) all resolve. |
|
|
214
|
+
| `recall read <session-ref> [<message-ref>]` | Explicit read for any stored ID shape; a failed read exits nonzero and never falls back to search. |
|
|
215
|
+
| `recall search <terms…>` | Force a search when a term would otherwise look like a session/message ID. |
|
|
216
|
+
| `recall --commit <hash>` | Find Claude Code sessions that produced a commit. |
|
|
217
|
+
| `recall --blame <path>[:line[-line]]` | Trace current code back to its producing Claude Code conversations. |
|
|
218
|
+
| `recall install` | Install or upgrade the hooks, skills, local assets, and history index. |
|
|
219
|
+
| `recall backfill [--auto-embed] [--vendor <v>] [--detach]` | Index session transcripts currently on disk, optionally for one vendor or as a detached job. |
|
|
220
|
+
| `recall status` | Show database size, message counts, embedding gap/migration progress, and active backfill state. |
|
|
221
|
+
| `recall doctor [--integrity]` | Run read-only install and database checks. |
|
|
222
|
+
| `recall repair --fts \| --vectors \| --full` | Rebuild FTS5, clear vectors for re-embedding, or fully reingest on-disk transcripts. |
|
|
223
|
+
| `recall statusline [--suggest]` | Print the session-id chip or integration guidance. |
|
|
224
|
+
| `recall uninstall [--purge]` | Remove the integration; `--purge` also deletes recall's data. |
|
|
225
|
+
|
|
226
|
+
Run `recall --help` for the full search and read flag set. Add `--json` to `install`, `uninstall`, `status`, or `doctor` for machine-readable output. Installer options include `--offline`, `--no-backfill`, `--auto-backfill`, `--statusline`, and `--no-statusline`.
|
|
227
|
+
|
|
228
|
+
### Optional statusline
|
|
202
229
|
|
|
203
230
|
```bash
|
|
204
|
-
recall --
|
|
205
|
-
recall --blame src/paths.ts:82-84 # sessions behind a line range
|
|
206
|
-
recall --blame src/foo.ts:42 src/bar.ts:10-20 --limit 20 # union of specs
|
|
231
|
+
recall install --statusline
|
|
207
232
|
```
|
|
208
233
|
|
|
209
|
-
|
|
234
|
+
It is off by default: accepting the installer defaults, using `--yes` or a non-interactive install, or upgrading an install that has never enabled it will not opt you in. Once enabled, it stays enabled across upgrades. If Claude Code has no statusline, recall installs a muted line with the current folder and git branch, model, context use, and a `🔗 <session_id>` chip. If you already have a statusline, recall leaves it unchanged and prints paste-ready integration guidance; `recall statusline --suggest` repeats it later.
|
|
210
235
|
|
|
211
|
-
|
|
212
|
-
- `~/.claude/skills/recall/SKILL.md` — the auto-discovered skill.
|
|
213
|
-
- A hook entry in `~/.claude/settings.json`.
|
|
236
|
+
The installed statusline never opens the database. Its only I/O is one guarded `git status` call with a 400 ms timeout; failure simply drops the git segment, and any segment whose input is missing is omitted. For composition with your own statusline, `recall statusline` prints only the bare, uncolored session-id chip. Uninstall removes the line only if recall still owns it, and doctor reports statusline problems as warnings.
|
|
214
237
|
|
|
215
|
-
`recall
|
|
238
|
+
> **Warning:** `recall repair --full` is destructive: it replaces the index contents from the transcripts still on disk. If older source transcripts have already been cleaned up, their indexed history cannot be rebuilt. Prefer `--fts` or `--vectors` unless a full reingest is truly necessary.
|
|
216
239
|
|
|
217
|
-
## Privacy
|
|
240
|
+
## Privacy and data
|
|
218
241
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
is plain SQLite
|
|
242
|
+
- Your index lives in `~/.recall/recall.db`.
|
|
243
|
+
- Search and indexing stay on your machine.
|
|
244
|
+
- While a query is being embedded, its text is written to a transient file under `~/.recall/run/query-embed/` (mode 0600) and deleted as soon as the embedding completes.
|
|
245
|
+
- There is no telemetry.
|
|
246
|
+
- The database is plain SQLite and inspectable with ordinary SQLite tools.
|
|
247
|
+
- Network access is limited to downloading the embedding runtime and model when missing, plus host reachability probes during install and doctor checks.
|
|
248
|
+
- `recall uninstall --purge` removes the local store completely.
|
|
224
249
|
|
|
225
|
-
|
|
250
|
+
The installed integration is inspectable too: Claude's skill and hook live under `~/.claude/skills/recall/` and `~/.claude/settings.json`. When Codex is detected, recall also uses `~/.codex/skills/recall/` and `~/.codex/hooks.json`.
|
|
226
251
|
|
|
227
|
-
|
|
228
|
-
the resolved embedding backend, with remediation hints for anything off.
|
|
252
|
+
The index deliberately outlives source-transcript cleanup. recall doesn't encrypt `recall.db`; treat `~/.recall/` with the same care as your original Claude Code and Codex histories.
|
|
229
253
|
|
|
230
|
-
##
|
|
254
|
+
## Limitations
|
|
231
255
|
|
|
232
|
-
|
|
233
|
-
|
|
256
|
+
- It isn't automatic fact injection into every prompt. Retrieval is pull-based.
|
|
257
|
+
- It isn't a replacement for documentation, tests, or git.
|
|
258
|
+
- It doesn't claim recalled context is still correct.
|
|
259
|
+
- It doesn't preserve tool output or hidden thinking in the searchable conversation.
|
|
260
|
+
- It doesn't yet offer per-session deletion; forgetting is database-level today.
|
|
261
|
+
- Subagent transcripts (Claude Task leaves, Codex child rollouts) are stored durable and readable by explicit ID, but are excluded from default search, lists, and semantic vectors — the parent thread's narration is the canonical memory. There is no search mode that includes them yet.
|
|
262
|
+
|
|
263
|
+
## Project status
|
|
264
|
+
|
|
265
|
+
crispy-recall is in active development and was spun out of the recall subsystem in [Crispy](https://github.com/TheSylvester/crispy). See [GitHub Releases](https://github.com/TheSylvester/crispy-recall/releases) for version history.
|
|
266
|
+
|
|
267
|
+
Issues and contributions are welcome at [github.com/TheSylvester/crispy-recall](https://github.com/TheSylvester/crispy-recall).
|
|
234
268
|
|
|
235
269
|
## License
|
|
236
270
|
|
|
237
271
|
MIT — see [LICENSE](./LICENSE).
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
**Memory, lazily evaluated.**
|