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 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.