crispy-recall 0.1.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/LICENSE +21 -0
- package/README.md +105 -0
- package/THIRD-PARTY-LICENSES +164 -0
- package/dist/SKILL.md.template +212 -0
- package/dist/embed-pending.js +13312 -0
- package/dist/node-sqlite3-wasm.wasm +0 -0
- package/dist/recall.js +16933 -0
- package/dist/stop-hook.js +2785 -0
- package/package.json +56 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Sylvester Wong
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# crispy-recall
|
|
2
|
+
|
|
3
|
+
Searchable memory for your Claude Code and Codex sessions. Local, fast, no daemon.
|
|
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
|
+
## Install
|
|
10
|
+
|
|
11
|
+
Install the command globally, then run the one-time setup:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install -g crispy-recall
|
|
15
|
+
recall install
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
`recall install` is the resident setup step. It scaffolds `~/.recall/` (the
|
|
19
|
+
llama embedding binary, the model, and the SQLite DB), wires a Stop hook into
|
|
20
|
+
Claude Code so your transcripts are indexed automatically as sessions end, and
|
|
21
|
+
installs the `recall` skill. If Codex is detected it also gets the `recall`
|
|
22
|
+
skill (so the agent can search), but not an automatic per-turn hook in v0.1.0 —
|
|
23
|
+
index Codex history with `recall backfill --vendor codex`. After that, recall
|
|
24
|
+
runs passively — you only invoke `recall` directly for `status`, `doctor`,
|
|
25
|
+
`repair`, or `uninstall`.
|
|
26
|
+
|
|
27
|
+
Run it in the environment where you actually use Claude Code: **WSL and
|
|
28
|
+
Windows-native are separate installs.** If you use both, run the install in each
|
|
29
|
+
— the installer only configures the environment it is invoked in.
|
|
30
|
+
|
|
31
|
+
> **Don't install via `npx`.** recall must stay resident. `npx` runs from an
|
|
32
|
+
> ephemeral cache and leaves no `recall` command on your PATH, so follow-up
|
|
33
|
+
> commands (`recall status` / `doctor` / `repair` / `uninstall`) and the
|
|
34
|
+
> installed skill's command contract have nothing to call. Use the global
|
|
35
|
+
> install above.
|
|
36
|
+
|
|
37
|
+
Prerequisites: Node ≥ 20 and Claude Code installed. If Codex is detected
|
|
38
|
+
(`~/.codex/` exists), recall installs the `recall` skill into Codex (so the
|
|
39
|
+
agent can search) and you can index your Codex history with
|
|
40
|
+
`recall backfill --vendor codex`. Real-time per-turn Codex indexing is **not**
|
|
41
|
+
in v0.1.0.
|
|
42
|
+
|
|
43
|
+
## What it does
|
|
44
|
+
|
|
45
|
+
- A **Stop hook** ingests every turn into a local SQLite DB the moment a session ends — no daemon, no background polling.
|
|
46
|
+
- 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).
|
|
47
|
+
- A **`recall` skill** is dropped into Claude Code so the agent discovers and invokes it on its own — you rarely type `recall` yourself.
|
|
48
|
+
- Works in **any project**. Claude Code sessions are indexed automatically; Codex transcripts are searchable too via `recall backfill --vendor codex`.
|
|
49
|
+
|
|
50
|
+
## How an agent uses it
|
|
51
|
+
|
|
52
|
+
Two steps. First, search for the relevant session:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
$RECALL_BIN "the thing you're trying to remember"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
That returns a table of matching sessions. Then read one, centered on the match:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
$RECALL_BIN <session-id> <message-id>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The skill's frontmatter teaches Claude *when* to reach for this (before
|
|
65
|
+
non-trivial tasks, architectural decisions, or work with obvious prior
|
|
66
|
+
history), so in practice the agent calls it for you.
|
|
67
|
+
|
|
68
|
+
## Commands
|
|
69
|
+
|
|
70
|
+
| Command | What it does |
|
|
71
|
+
|---|---|
|
|
72
|
+
| `recall install` | One-time setup: scaffold `~/.recall/`, wire the Stop hook, install the skill. |
|
|
73
|
+
| `recall uninstall` | Reverse the install (skill, hook, CLAUDE.md block). `--purge` also removes `~/.recall/`. |
|
|
74
|
+
| `recall status` | DB size, message count, last ingest, embedding gap, active backfill PID, GPU/CPU backend. |
|
|
75
|
+
| `recall doctor` | Read-only health check (the install pre-flight suite). `--integrity` runs DB + FTS5 checks. |
|
|
76
|
+
| `recall repair --fts \| --vectors \| --full` | Rebuild the FTS index, re-embed vectors, or full reingest from JSONL. |
|
|
77
|
+
| `recall backfill [--auto-embed] [--vendor <v>] [--detach]` | Index historical transcripts. |
|
|
78
|
+
|
|
79
|
+
## Where things live
|
|
80
|
+
|
|
81
|
+
- `~/.recall/` — the DB, model, binary, logs, and `config.json` (the resolved GPU/CPU embedder mode).
|
|
82
|
+
- `~/.claude/skills/recall/SKILL.md` — the auto-discovered skill.
|
|
83
|
+
- A hook entry in `~/.claude/settings.json`.
|
|
84
|
+
|
|
85
|
+
`recall uninstall` reverses all three. `recall uninstall --purge` also removes `~/.recall/`.
|
|
86
|
+
|
|
87
|
+
## Privacy
|
|
88
|
+
|
|
89
|
+
Everything is local. No telemetry, no network calls except the one-time
|
|
90
|
+
binary + model download at install. The DB is plain SQLite — open it with any
|
|
91
|
+
SQLite browser if you want to poke around.
|
|
92
|
+
|
|
93
|
+
## Troubleshooting
|
|
94
|
+
|
|
95
|
+
Run `recall doctor` — it reports platform, harness, runtime, disk, network, and
|
|
96
|
+
the resolved embedding backend, with remediation hints for anything off.
|
|
97
|
+
|
|
98
|
+
## Attribution
|
|
99
|
+
|
|
100
|
+
Lifted and adapted from the recall subsystem of
|
|
101
|
+
[Crispy](https://github.com/TheSylvester/crispy), the Claude Code / Codex GUI.
|
|
102
|
+
|
|
103
|
+
## License
|
|
104
|
+
|
|
105
|
+
MIT — see [LICENSE](./LICENSE).
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
THIRD-PARTY LICENSES — crispy-recall
|
|
2
|
+
=====================================
|
|
3
|
+
|
|
4
|
+
crispy-recall is MIT-licensed (see LICENSE). It bundles or downloads the
|
|
5
|
+
third-party components below. All production npm dependencies are permissive
|
|
6
|
+
(MIT / ISC / BSD / BlueOak-1.0.0).
|
|
7
|
+
|
|
8
|
+
Bundled-via-download artifacts (not npm packages):
|
|
9
|
+
- llama-embedding (from the llama.cpp project) ............ MIT
|
|
10
|
+
- Nomic Embed Text v1.5 (model weights, Nomic AI) ......... Apache-2.0
|
|
11
|
+
- node-sqlite3-wasm ...................................... MIT
|
|
12
|
+
- SQLite (compiled into node-sqlite3-wasm) ............... Public Domain
|
|
13
|
+
- libggml-cuda.so (built from llama.cpp @ b5300, GPU only) MIT
|
|
14
|
+
|
|
15
|
+
Regenerate after a production-dependency change with:
|
|
16
|
+
npx license-checker-rseidelsohn --production --out THIRD-PARTY-LICENSES
|
|
17
|
+
|
|
18
|
+
npm production dependencies (transitive closure):
|
|
19
|
+
@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.2.114 — Custom: LICENSE.md
|
|
20
|
+
@anthropic-ai/claude-agent-sdk-linux-x64@0.2.114 — Custom: LICENSE.md
|
|
21
|
+
@anthropic-ai/claude-agent-sdk@0.2.114 — Custom: README.md
|
|
22
|
+
@anthropic-ai/sdk@0.81.0 — MIT
|
|
23
|
+
@babel/runtime@7.29.2 — MIT
|
|
24
|
+
@clack/core@0.3.5 — MIT
|
|
25
|
+
@clack/prompts@0.7.0 — MIT
|
|
26
|
+
@hono/node-server@1.19.14 — MIT
|
|
27
|
+
@isaacs/cliui@8.0.2 — ISC
|
|
28
|
+
@modelcontextprotocol/sdk@1.29.0 — MIT
|
|
29
|
+
@pkgjs/parseargs@0.11.0 — MIT
|
|
30
|
+
@types/node@20.19.41 — MIT
|
|
31
|
+
@types/yauzl@2.10.3 — MIT
|
|
32
|
+
accepts@2.0.0 — MIT
|
|
33
|
+
ajv-formats@3.0.1 — MIT
|
|
34
|
+
ajv@8.20.0 — MIT
|
|
35
|
+
ansi-regex@5.0.1 — MIT
|
|
36
|
+
ansi-regex@6.2.2 — MIT
|
|
37
|
+
ansi-styles@4.3.0 — MIT
|
|
38
|
+
ansi-styles@6.2.3 — MIT
|
|
39
|
+
balanced-match@1.0.2 — MIT
|
|
40
|
+
body-parser@2.2.2 — MIT
|
|
41
|
+
brace-expansion@2.1.0 — MIT
|
|
42
|
+
buffer-crc32@0.2.13 — MIT
|
|
43
|
+
bytes@3.1.2 — MIT
|
|
44
|
+
call-bind-apply-helpers@1.0.2 — MIT
|
|
45
|
+
call-bound@1.0.4 — MIT
|
|
46
|
+
color-convert@2.0.1 — MIT
|
|
47
|
+
color-name@1.1.4 — MIT
|
|
48
|
+
content-disposition@1.1.0 — MIT
|
|
49
|
+
content-type@1.0.5 — MIT
|
|
50
|
+
content-type@2.0.0 — MIT
|
|
51
|
+
cookie-signature@1.2.2 — MIT
|
|
52
|
+
cookie@0.7.2 — MIT
|
|
53
|
+
cors@2.8.6 — MIT
|
|
54
|
+
crispy-recall@0.1.0 — MIT
|
|
55
|
+
cross-spawn@7.0.6 — MIT
|
|
56
|
+
debug@4.4.3 — MIT
|
|
57
|
+
depd@2.0.0 — MIT
|
|
58
|
+
dunder-proto@1.0.1 — MIT
|
|
59
|
+
eastasianwidth@0.2.0 — MIT
|
|
60
|
+
ee-first@1.1.1 — MIT
|
|
61
|
+
emoji-regex@8.0.0 — MIT
|
|
62
|
+
emoji-regex@9.2.2 — MIT
|
|
63
|
+
encodeurl@2.0.0 — MIT
|
|
64
|
+
end-of-stream@1.4.5 — MIT
|
|
65
|
+
es-define-property@1.0.1 — MIT
|
|
66
|
+
es-errors@1.3.0 — MIT
|
|
67
|
+
es-object-atoms@1.1.1 — MIT
|
|
68
|
+
escape-html@1.0.3 — MIT
|
|
69
|
+
etag@1.8.1 — MIT
|
|
70
|
+
eventsource-parser@3.0.8 — MIT
|
|
71
|
+
eventsource@3.0.7 — MIT
|
|
72
|
+
express-rate-limit@8.5.2 — MIT
|
|
73
|
+
express@5.2.1 — MIT
|
|
74
|
+
extract-zip@2.0.1 — BSD-2-Clause
|
|
75
|
+
fast-deep-equal@3.1.3 — MIT
|
|
76
|
+
fast-uri@3.1.2 — BSD-3-Clause
|
|
77
|
+
fd-slicer@1.1.0 — MIT
|
|
78
|
+
finalhandler@2.1.1 — MIT
|
|
79
|
+
foreground-child@3.3.1 — ISC
|
|
80
|
+
forwarded@0.2.0 — MIT
|
|
81
|
+
fresh@2.0.0 — MIT
|
|
82
|
+
function-bind@1.1.2 — MIT
|
|
83
|
+
get-intrinsic@1.3.0 — MIT
|
|
84
|
+
get-proto@1.0.1 — MIT
|
|
85
|
+
get-stream@5.2.0 — MIT
|
|
86
|
+
glob@10.5.0 — ISC
|
|
87
|
+
gopd@1.2.0 — MIT
|
|
88
|
+
has-symbols@1.1.0 — MIT
|
|
89
|
+
hasown@2.0.3 — MIT
|
|
90
|
+
hono@4.12.19 — MIT
|
|
91
|
+
http-errors@2.0.1 — MIT
|
|
92
|
+
iconv-lite@0.7.2 — MIT
|
|
93
|
+
inherits@2.0.4 — ISC
|
|
94
|
+
ip-address@10.2.0 — MIT
|
|
95
|
+
ipaddr.js@1.9.1 — MIT
|
|
96
|
+
is-fullwidth-code-point@3.0.0 — MIT
|
|
97
|
+
is-promise@4.0.0 — MIT
|
|
98
|
+
is-unicode-supported@1.3.0 — MIT
|
|
99
|
+
isexe@2.0.0 — ISC
|
|
100
|
+
jackspeak@3.4.3 — BlueOak-1.0.0
|
|
101
|
+
jose@6.2.3 — MIT
|
|
102
|
+
json-schema-to-ts@3.1.1 — MIT
|
|
103
|
+
json-schema-traverse@1.0.0 — MIT
|
|
104
|
+
json-schema-typed@8.0.2 — BSD-2-Clause
|
|
105
|
+
lru-cache@10.4.3 — ISC
|
|
106
|
+
math-intrinsics@1.1.0 — MIT
|
|
107
|
+
media-typer@1.1.0 — MIT
|
|
108
|
+
merge-descriptors@2.0.0 — MIT
|
|
109
|
+
mime-db@1.54.0 — MIT
|
|
110
|
+
mime-types@3.0.2 — MIT
|
|
111
|
+
minimatch@9.0.9 — ISC
|
|
112
|
+
minipass@7.1.3 — BlueOak-1.0.0
|
|
113
|
+
ms@2.1.3 — MIT
|
|
114
|
+
negotiator@1.0.0 — MIT
|
|
115
|
+
node-sqlite3-wasm@0.8.57 — MIT
|
|
116
|
+
object-assign@4.1.1 — MIT
|
|
117
|
+
object-inspect@1.13.4 — MIT
|
|
118
|
+
on-finished@2.4.1 — MIT
|
|
119
|
+
once@1.4.0 — ISC
|
|
120
|
+
package-json-from-dist@1.0.1 — BlueOak-1.0.0
|
|
121
|
+
parseurl@1.3.3 — MIT
|
|
122
|
+
path-key@3.1.1 — MIT
|
|
123
|
+
path-scurry@1.11.1 — BlueOak-1.0.0
|
|
124
|
+
path-to-regexp@8.4.2 — MIT
|
|
125
|
+
pend@1.2.0 — MIT
|
|
126
|
+
picocolors@1.1.1 — ISC
|
|
127
|
+
pkce-challenge@5.0.1 — MIT
|
|
128
|
+
proxy-addr@2.0.7 — MIT
|
|
129
|
+
pump@3.0.4 — MIT
|
|
130
|
+
qs@6.15.2 — BSD-3-Clause
|
|
131
|
+
range-parser@1.2.1 — MIT
|
|
132
|
+
raw-body@3.0.2 — MIT
|
|
133
|
+
require-from-string@2.0.2 — MIT
|
|
134
|
+
router@2.2.0 — MIT
|
|
135
|
+
safer-buffer@2.1.2 — MIT
|
|
136
|
+
send@1.2.1 — MIT
|
|
137
|
+
serve-static@2.2.1 — MIT
|
|
138
|
+
setprototypeof@1.2.0 — ISC
|
|
139
|
+
shebang-command@2.0.0 — MIT
|
|
140
|
+
shebang-regex@3.0.0 — MIT
|
|
141
|
+
side-channel-list@1.0.1 — MIT
|
|
142
|
+
side-channel-map@1.0.1 — MIT
|
|
143
|
+
side-channel-weakmap@1.0.2 — MIT
|
|
144
|
+
side-channel@1.1.0 — MIT
|
|
145
|
+
signal-exit@4.1.0 — ISC
|
|
146
|
+
sisteransi@1.0.5 — MIT
|
|
147
|
+
statuses@2.0.2 — MIT
|
|
148
|
+
string-width@4.2.3 — MIT
|
|
149
|
+
string-width@5.1.2 — MIT
|
|
150
|
+
strip-ansi@6.0.1 — MIT
|
|
151
|
+
strip-ansi@7.2.0 — MIT
|
|
152
|
+
toidentifier@1.0.1 — MIT
|
|
153
|
+
ts-algebra@2.0.0 — MIT
|
|
154
|
+
type-is@2.1.0 — MIT
|
|
155
|
+
undici-types@6.21.0 — MIT
|
|
156
|
+
unpipe@1.0.0 — MIT
|
|
157
|
+
vary@1.1.2 — MIT
|
|
158
|
+
which@2.0.2 — ISC
|
|
159
|
+
wrap-ansi@7.0.0 — MIT
|
|
160
|
+
wrap-ansi@8.1.0 — MIT
|
|
161
|
+
wrappy@1.0.2 — ISC
|
|
162
|
+
yauzl@2.10.0 — MIT
|
|
163
|
+
zod-to-json-schema@3.25.2 — ISC
|
|
164
|
+
zod@4.4.3 — MIT
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: recall
|
|
3
|
+
description: >-
|
|
4
|
+
USE PROACTIVELY to load relevant past session context before non-trivial
|
|
5
|
+
tasks, architectural decisions, or any implementation with likely prior
|
|
6
|
+
history. Also use when the user says "recall", "remember", "what did we
|
|
7
|
+
do", "find that session", "what was I working on", or references past
|
|
8
|
+
conversations.
|
|
9
|
+
when_to_use: >-
|
|
10
|
+
Trigger for phrases like "remind me about", "pick up where we left off",
|
|
11
|
+
"continue from last time", or when starting complex work in an area with
|
|
12
|
+
obvious prior sessions. Skip for simple lookups and trivial questions.
|
|
13
|
+
allowed-tools: Bash, Agent, Read
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Recall
|
|
17
|
+
|
|
18
|
+
Unified tool for session transcript memory — search, read, and browse.
|
|
19
|
+
|
|
20
|
+
## The two-step pattern
|
|
21
|
+
|
|
22
|
+
**Step 1: Search.** Every search result includes a matched message ID.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
$RECALL_BIN "your query here"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Step 2: Read the matched message.** Do NOT read the session from the top.
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
$RECALL_BIN <session-id> <message-id>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
This auto-centers on the match with ~30% context before and ~70% after,
|
|
35
|
+
filling up to the output budget. The footer tells you the exact `--offset`
|
|
36
|
+
to continue reading forward.
|
|
37
|
+
|
|
38
|
+
**NEVER start a session read from the top after searching.** The search
|
|
39
|
+
already found the relevant message — go directly to it. Only use
|
|
40
|
+
`$RECALL_BIN <id>` (no message-id) when you genuinely need to start
|
|
41
|
+
from the beginning of a session.
|
|
42
|
+
|
|
43
|
+
## Confidence tags
|
|
44
|
+
|
|
45
|
+
Search results are tagged by how they were found:
|
|
46
|
+
- `[FTS5+SEMANTIC]` — Both keyword and meaning matched. High confidence.
|
|
47
|
+
- `[SEMANTIC-ONLY]` — Found by meaning, not exact words. Vocabulary mismatch discovery.
|
|
48
|
+
- `[FTS5-ONLY]` — Exact keyword match only. May be coincidental.
|
|
49
|
+
|
|
50
|
+
## Sub-agent pattern (recommended for deep research)
|
|
51
|
+
|
|
52
|
+
For questions requiring multiple searches or reading session content, launch a sub-agent.
|
|
53
|
+
The agent prompt **must** include full CLI instructions — sub-agents don't see this skill file.
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
Agent(prompt: "You have a recall CLI for searching and reading past session transcripts.
|
|
57
|
+
Use ONLY `$RECALL_BIN` for all transcript access — do NOT read .jsonl files directly,
|
|
58
|
+
do NOT use Grep/Glob/find to locate transcripts.
|
|
59
|
+
|
|
60
|
+
CLI usage:
|
|
61
|
+
$RECALL_BIN \"query\" Search (returns session IDs + matched message IDs)
|
|
62
|
+
$RECALL_BIN <session-id> <message-id> Read centered on matched message (use this after search)
|
|
63
|
+
$RECALL_BIN <session-id> Read from beginning (only when you need full arc)
|
|
64
|
+
$RECALL_BIN <session-id> --offset N Continue reading from offset N (shown in output footer)
|
|
65
|
+
$RECALL_BIN --list --since YYYY-MM-DD List recent sessions
|
|
66
|
+
$RECALL_BIN --help Full flag reference
|
|
67
|
+
|
|
68
|
+
DATE HANDLING: Any date the user mentions MUST become a flag — never search text:
|
|
69
|
+
--since YYYY-MM-DD Only sessions on or after this date
|
|
70
|
+
--until YYYY-MM-DD Only sessions on or before this date (inclusive)
|
|
71
|
+
--recent Boost recent sessions (use when user says 'recently', 'latest')
|
|
72
|
+
Example: \"what happened April 10\" → $RECALL_BIN --list --since 2026-04-10 --until 2026-04-10
|
|
73
|
+
|
|
74
|
+
CRITICAL READING RULE: After searching, ALWAYS read the matched message:
|
|
75
|
+
$RECALL_BIN <session-id> <message-id>
|
|
76
|
+
This auto-centers on the match and shows surrounding turns. The output
|
|
77
|
+
footer shows the --offset to continue reading forward. NEVER read sessions
|
|
78
|
+
from the beginning after a search — the match is already found for you.
|
|
79
|
+
|
|
80
|
+
Task: [describe what to find]. Run these searches: [list queries].
|
|
81
|
+
Search EXHAUSTIVELY — do not stop after the first promising result. Run all
|
|
82
|
+
listed queries, read into multiple results, and only report findings after
|
|
83
|
+
you have checked every search path. Cross-reference results and summarize.",
|
|
84
|
+
mode: "auto")
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Other reading modes
|
|
88
|
+
|
|
89
|
+
| Mode | Command | When to use |
|
|
90
|
+
|------|---------|-------------|
|
|
91
|
+
| **Matched message** | `$RECALL_BIN <id> <msg-id>` | **Always use this after search** — auto-centers on match |
|
|
92
|
+
| Full session | `$RECALL_BIN <id>` | Only when you need the overall arc, not a specific answer |
|
|
93
|
+
| Continue | `$RECALL_BIN <id> --offset N` | Continue from where the last read left off |
|
|
94
|
+
| Newest first | `$RECALL_BIN <id> --reverse` | Looking for recent content in a long session |
|
|
95
|
+
|
|
96
|
+
## Commit attribution (`--commit` / `--blame`)
|
|
97
|
+
|
|
98
|
+
Find the session(s) that produced a given commit, or the session(s)
|
|
99
|
+
responsible for specific code in a file. Matches by structurally comparing
|
|
100
|
+
session Edit/Write/MultiEdit tool calls against the commit's diff (tri-gram
|
|
101
|
+
intersection), not by clock proximity. Results include both top-level
|
|
102
|
+
sessions and Task-tool subagent leaves (`agent-<hash>`) with
|
|
103
|
+
`parent_session_id` set.
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Sessions that produced one commit
|
|
107
|
+
$RECALL_BIN --commit 864f569
|
|
108
|
+
$RECALL_BIN --commit 864f569 --raw # full JSON
|
|
109
|
+
|
|
110
|
+
# Sessions responsible for a file (HEAD-relative blame)
|
|
111
|
+
$RECALL_BIN --blame src/webview/components/FlexAppLayout.tsx
|
|
112
|
+
|
|
113
|
+
# Sessions responsible for one line — narrowest, most precise lookup
|
|
114
|
+
$RECALL_BIN --blame src/foo.ts:42
|
|
115
|
+
|
|
116
|
+
# Sessions responsible for a line range
|
|
117
|
+
$RECALL_BIN --blame src/foo.ts:42-100
|
|
118
|
+
|
|
119
|
+
# Multiple specs in one query (unioned)
|
|
120
|
+
$RECALL_BIN --blame src/foo.ts:42 src/bar.ts:10-20 --limit 20
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
`--blame` is HEAD-relative: it runs `git blame` to find the commits
|
|
124
|
+
responsible for the current state of the file (or line range) and
|
|
125
|
+
attributes each. Sessions whose work was overwritten by a later commit
|
|
126
|
+
won't appear — for the full historical iteration set, use `git log` and
|
|
127
|
+
pass each commit to `--commit` separately.
|
|
128
|
+
|
|
129
|
+
### When to use
|
|
130
|
+
|
|
131
|
+
- **"Who produced this commit?"** — `--commit <hash>`. Returns the session(s)
|
|
132
|
+
that typed the edits. Multiple matches mean nested/sequential work.
|
|
133
|
+
- **"Why is this line / block of code here?"** — `--blame <path>:<line>`
|
|
134
|
+
or `--blame <path>:<L1>-<L2>`. The narrowest, most precise lookup —
|
|
135
|
+
go straight to the session that authored the line you're staring at.
|
|
136
|
+
- **"What sessions are responsible for this file's current state?"** —
|
|
137
|
+
`--blame <path>` (no line). Returns one row per (commit, session) for
|
|
138
|
+
every commit whose lines still live in HEAD.
|
|
139
|
+
- **"Why is this code shaped this way?"** — When refactoring, debugging a
|
|
140
|
+
regression, or reviewing a legacy pattern, look up the originating session
|
|
141
|
+
before reasoning from the code alone. The session usually has rejected
|
|
142
|
+
approaches and constraints that the final code does not.
|
|
143
|
+
|
|
144
|
+
### Reading the results
|
|
145
|
+
|
|
146
|
+
Sessions are listed chronologically (oldest first). **The most recent is
|
|
147
|
+
usually the load-bearing one for current code; earlier sessions show
|
|
148
|
+
evolution.** Each row exposes:
|
|
149
|
+
|
|
150
|
+
- `session` — top-level UUID or `agent-<hash>` subagent leaf
|
|
151
|
+
- `parent_session_id` — set when the match is a subagent; follow this to
|
|
152
|
+
reach the parent's rationale conversation
|
|
153
|
+
- `content_hits` — tri-gram intersections with the commit's added lines
|
|
154
|
+
- `surviving_in_commit` / `surviving_ratio` — how much of the session's
|
|
155
|
+
work made it into the commit's final state (low ratio = iterated heavily
|
|
156
|
+
or was partly overwritten by a later session)
|
|
157
|
+
- `matched_files` — commit-touched files this session edited in window
|
|
158
|
+
- `last_edit_at` — ISO timestamp used for chronological sort
|
|
159
|
+
|
|
160
|
+
Once you have a session ID, pass it back into recall to read the conversation:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
$RECALL_BIN <session-id> # full session, oldest first
|
|
164
|
+
$RECALL_BIN <session-id> --reverse # newest first (faster for recent context)
|
|
165
|
+
$RECALL_BIN "rationale keyword" --since DATE # search within window
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**For in-progress sessions**, the Stop hook that indexes a session hasn't
|
|
169
|
+
fired yet — wait a few seconds after the turn finishes, then search again.
|
|
170
|
+
|
|
171
|
+
## Date handling
|
|
172
|
+
|
|
173
|
+
**Any date or time indication from the user MUST be translated into date flags.**
|
|
174
|
+
Do NOT put dates into the search query text — dates in FTS5 produce false matches.
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# Single day — use --since and --until together
|
|
178
|
+
$RECALL_BIN --list --since 2026-04-10 --until 2026-04-10
|
|
179
|
+
$RECALL_BIN "scroll bug" --since 2026-04-10 --until 2026-04-10
|
|
180
|
+
|
|
181
|
+
# Open range — just one flag
|
|
182
|
+
$RECALL_BIN "recall improvements" --since 2026-04-01
|
|
183
|
+
$RECALL_BIN "old bug" --until 2026-03-15
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
- `--since DATE` — only sessions on or after this date
|
|
187
|
+
- `--until DATE` — only sessions on or before this date (inclusive of the day)
|
|
188
|
+
- Both accept ISO-8601 dates (YYYY-MM-DD)
|
|
189
|
+
- Both work in search and list modes
|
|
190
|
+
|
|
191
|
+
**Example:** "What did we work on April 10?" →
|
|
192
|
+
`$RECALL_BIN --list --since 2026-04-10 --until 2026-04-10` to find all sessions,
|
|
193
|
+
then search with topic keywords + date flags if needed.
|
|
194
|
+
|
|
195
|
+
## Recency boost
|
|
196
|
+
|
|
197
|
+
When the user says "recently", "latest", "last few days", or otherwise indicates
|
|
198
|
+
they want recent results, add `--recent` to strongly boost newer sessions:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
$RECALL_BIN "scroll bug fix" --recent
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
This increases the recency decay from ~50% penalty at 50 days to ~50% at 10 days,
|
|
205
|
+
pushing recent sessions to the top of results. Combine with `--since` for best results.
|
|
206
|
+
|
|
207
|
+
## Tips
|
|
208
|
+
|
|
209
|
+
- **Search is cheap, reading is expensive.** Run 3-5 varied queries before committing to reading sessions.
|
|
210
|
+
- **Message IDs are stable.** You can reference them across searches.
|
|
211
|
+
- **Use `--since` / `--until` to scope.** Both search and list modes accept date flags.
|
|
212
|
+
- **Raw JSON output** (`--raw`) is available for programmatic processing.
|