crispy-recall 0.2.0 → 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 -169
- package/THIRD-PARTY-LICENSES +43 -145
- package/dist/SKILL.md.template +7 -0
- package/dist/embed-pending.js +742 -204
- package/dist/recall.js +3029 -941
- package/dist/statusline.js +180 -0
- package/dist/stop-hook.js +611 -144
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -1,214 +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.0
|
|
10
|
-
|
|
11
|
-
- **Native SQLite engine with real WAL.** The database now runs on
|
|
12
|
-
better-sqlite3 with write-ahead logging instead of the previous WebAssembly
|
|
13
|
-
binding — which never actually engaged WAL and could silently corrupt the
|
|
14
|
-
index when multiple processes wrote at once. That failure mode is eliminated
|
|
15
|
-
at the root. `recall doctor` gains a SQLite-binding health section.
|
|
16
|
-
**Node.js ≥ 22.16 is now required.**
|
|
17
|
-
- **Git provenance: `--commit` and `--blame`.** `recall --commit <hash>` lists
|
|
18
|
-
the session(s) that produced a commit; `recall --blame <path>[:line[-line]]`
|
|
19
|
-
traces a file or line range back to the conversations responsible. Matching
|
|
20
|
-
is structural (your sessions' actual edits vs the commit's diff), not
|
|
21
|
-
timestamp-based. These flags were documented in the skill but missing from
|
|
22
|
-
the shipped CLI; they now work as documented.
|
|
23
|
-
- **Better semantic retrieval (embedding v3).** Stored messages and queries now
|
|
24
|
-
carry the task prefixes the embedding model was trained on, and short turns
|
|
25
|
-
(one-line answers, approvals, decisions) are embedded together with their
|
|
26
|
-
preceding context so they're finally findable by meaning. Measurably improves
|
|
27
|
-
retrieval on the LoCoMo benchmark (recall@5 54.9 → 58.4).
|
|
28
|
-
- **Semantic search stays available during migrations.** Upgrading re-embeds
|
|
29
|
-
your history in the background; until it finishes, search transparently
|
|
30
|
-
blends old- and new-format vectors and tags output with
|
|
31
|
-
`(migrating: N% re-embedded)` instead of going dark.
|
|
32
|
-
- **Relevance-first ranking.** The hidden age penalty is off by default —
|
|
33
|
-
older sessions now rank purely by relevance (previously the right old result
|
|
34
|
-
could rank 2× worse just for being old). Pass `--recent` to prefer newer
|
|
35
|
-
sessions explicitly.
|
|
36
|
-
- **Faster indexing on large databases.** A new index removes a full-table
|
|
37
|
-
scan from every embedding batch and end-of-turn catch-up (~0.3 s → ~0.05 s
|
|
38
|
-
at ~287K messages). Created automatically on first run.
|
|
39
|
-
- **Safe in-place upgrade for existing installs.** `recall install` migrates
|
|
40
|
-
an existing database in place: rollback snapshot → WAL conversion →
|
|
41
|
-
integrity check with auto-repair → background re-embed. See
|
|
42
|
-
[Upgrading from 0.1.x](#upgrading-from-01x).
|
|
43
|
-
- **New scripting flags.** `--raw-messages` (full ranked per-message JSON) and
|
|
44
|
-
`--no-idf` (keep common words in keyword search), both off by default.
|
|
3
|
+
**Save every session. Recall any conversation. Continue where you left off.**
|
|
45
4
|
|
|
46
|
-
|
|
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.
|
|
47
10
|
|
|
48
|
-
|
|
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:
|
|
49
14
|
|
|
50
15
|
```bash
|
|
51
16
|
npm install -g crispy-recall
|
|
52
17
|
recall install
|
|
53
18
|
```
|
|
54
19
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
>
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
### 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:
|
|
81
44
|
|
|
82
45
|
```bash
|
|
83
|
-
|
|
84
|
-
recall install # run this FIRST, before any other recall command
|
|
46
|
+
recall "why did we choose this retry policy?"
|
|
85
47
|
```
|
|
86
48
|
|
|
87
|
-
|
|
88
|
-
first recall command you run after the npm upgrade — it performs a one-time,
|
|
89
|
-
in-place migration of your existing database (rollback snapshot → WAL
|
|
90
|
-
conversion → integrity check → background re-embed). If a live session is
|
|
91
|
-
still holding the database the installer aborts cleanly and asks you to
|
|
92
|
-
re-run; re-running is always safe and picks up where it left off.
|
|
93
|
-
|
|
94
|
-
What to expect:
|
|
95
|
-
|
|
96
|
-
- **Your indexed history is preserved — even without the original
|
|
97
|
-
transcripts.** Claude Code deletes session `.jsonl` files after 30 days by
|
|
98
|
-
default; the migration never reads them. It works on the database in place,
|
|
99
|
-
and the re-embed sources text from the database itself.
|
|
100
|
-
- A rollback snapshot is written to `~/.recall/recall.db.pre-upgrade-<stamp>`
|
|
101
|
-
(needs free disk roughly equal to your DB size; delete it once you're
|
|
102
|
-
satisfied).
|
|
103
|
-
- A background re-embed upgrades your vectors to the new format — roughly an
|
|
104
|
-
hour per 20K messages on CPU, minutes on GPU. Search works the entire time
|
|
105
|
-
(output shows `migrating: N% re-embedded`); watch progress with
|
|
106
|
-
`recall status`. It resumes automatically after reboots.
|
|
107
|
-
- The migration is one-way: **don't downgrade** to ≤ 0.1.6 afterwards — the
|
|
108
|
-
old engine fails closed on the converted database.
|
|
109
|
-
- **Avoid `recall repair --full` unless you accept losing older history** — it
|
|
110
|
-
rebuilds the index from the transcripts still on disk, which for most
|
|
111
|
-
machines means only the last 30 days. Your database is the store of record;
|
|
112
|
-
the pre-upgrade snapshot is the rollback path if anything looks wrong.
|
|
113
|
-
|
|
114
|
-
## What it does
|
|
115
|
-
|
|
116
|
-
- A **Stop hook** ingests every turn into a local SQLite DB the moment a session ends — no daemon, no background polling.
|
|
117
|
-
- 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).
|
|
118
|
-
- A **`recall` skill** is dropped into Claude Code so the agent discovers and invokes it on its own — you rarely type `recall` yourself.
|
|
119
|
-
- Works in **any project**. Claude Code sessions are indexed automatically; Codex transcripts are searchable too via `recall backfill --vendor codex`.
|
|
120
|
-
|
|
121
|
-
## How an agent uses it
|
|
122
|
-
|
|
123
|
-
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:
|
|
124
50
|
|
|
125
51
|
```bash
|
|
126
|
-
recall
|
|
52
|
+
recall <session-uuid> <message-uuid>
|
|
127
53
|
```
|
|
128
54
|
|
|
129
|
-
|
|
55
|
+
Search defaults to the current project's sessions. Expand only when needed:
|
|
130
56
|
|
|
131
57
|
```bash
|
|
132
|
-
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.
|
|
133
93
|
```
|
|
134
94
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
indexed
|
|
138
|
-
|
|
139
|
-
|
|
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.
|
|
140
102
|
|
|
141
103
|
```bash
|
|
142
|
-
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
|
|
143
107
|
```
|
|
144
108
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
+
```
|
|
151
129
|
|
|
152
|
-
|
|
130
|
+
### Grep is still the right tool sometimes
|
|
153
131
|
|
|
154
|
-
|
|
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 |
|
|
155
210
|
|---|---|
|
|
156
|
-
| `recall "<query>"
|
|
157
|
-
| `recall <
|
|
158
|
-
| `recall
|
|
159
|
-
| `recall
|
|
160
|
-
| `recall
|
|
161
|
-
| `recall
|
|
162
|
-
| `recall
|
|
163
|
-
| `recall
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
Edit/Write/MultiEdit tool calls are compared against the commit's diff via
|
|
175
|
-
tri-gram intersection, not clock proximity. `--blame` is HEAD-relative: it runs
|
|
176
|
-
`git blame` to find the commits behind the current file (or line range) and
|
|
177
|
-
attributes each; sessions overwritten by a later commit won't appear. Results
|
|
178
|
-
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
|
|
179
229
|
|
|
180
230
|
```bash
|
|
181
|
-
recall --
|
|
182
|
-
recall --blame src/paths.ts:82-84 # sessions behind a line range
|
|
183
|
-
recall --blame src/foo.ts:42 src/bar.ts:10-20 --limit 20 # union of specs
|
|
231
|
+
recall install --statusline
|
|
184
232
|
```
|
|
185
233
|
|
|
186
|
-
|
|
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.
|
|
187
235
|
|
|
188
|
-
|
|
189
|
-
- `~/.claude/skills/recall/SKILL.md` — the auto-discovered skill.
|
|
190
|
-
- 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.
|
|
191
237
|
|
|
192
|
-
`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.
|
|
193
239
|
|
|
194
|
-
## Privacy
|
|
240
|
+
## Privacy and data
|
|
195
241
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
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.
|
|
201
249
|
|
|
202
|
-
|
|
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`.
|
|
203
251
|
|
|
204
|
-
|
|
205
|
-
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.
|
|
206
253
|
|
|
207
|
-
##
|
|
254
|
+
## Limitations
|
|
208
255
|
|
|
209
|
-
|
|
210
|
-
|
|
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).
|
|
211
268
|
|
|
212
269
|
## License
|
|
213
270
|
|
|
214
271
|
MIT — see [LICENSE](./LICENSE).
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
**Memory, lazily evaluated.**
|