somtum 1.3.3 → 1.5.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 +175 -90
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +12 -3
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/forget.d.ts +7 -0
- package/dist/cli/forget.d.ts.map +1 -1
- package/dist/cli/forget.js +44 -0
- package/dist/cli/forget.js.map +1 -1
- package/dist/cli/hook.d.ts.map +1 -1
- package/dist/cli/hook.js +14 -2
- package/dist/cli/hook.js.map +1 -1
- package/dist/cli/index.js +49 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +7 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/list.d.ts +9 -0
- package/dist/cli/list.d.ts.map +1 -0
- package/dist/cli/list.js +54 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/reset.d.ts +7 -0
- package/dist/cli/reset.d.ts.map +1 -0
- package/dist/cli/reset.js +66 -0
- package/dist/cli/reset.js.map +1 -0
- package/dist/cli/suggest_claude_md.d.ts +9 -0
- package/dist/cli/suggest_claude_md.d.ts.map +1 -0
- package/dist/cli/suggest_claude_md.js +106 -0
- package/dist/cli/suggest_claude_md.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +19 -7
- package/dist/config.js.map +1 -1
- package/dist/core/schema.d.ts +51 -0
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +18 -0
- package/dist/core/schema.js.map +1 -1
- package/dist/core/store.d.ts +8 -1
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/store.js +61 -6
- package/dist/core/store.js.map +1 -1
- package/dist/dashboard/index.html +49 -6
- package/dist/db/migrations/004_scope_and_staleness.sql +11 -0
- package/dist/hooks/post_session.d.ts.map +1 -1
- package/dist/hooks/post_session.js +50 -2
- package/dist/hooks/post_session.js.map +1 -1
- package/dist/hooks/pre_prompt.d.ts.map +1 -1
- package/dist/hooks/pre_prompt.js +231 -48
- package/dist/hooks/pre_prompt.js.map +1 -1
- package/dist/hooks/pre_read.d.ts.map +1 -1
- package/dist/hooks/pre_read.js +7 -1
- package/dist/hooks/pre_read.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +35 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +33 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +68 -3
- package/dist/mcp/tools.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -33,6 +33,10 @@ Zero-config: one `somtum init` and every session end is captured automatically.
|
|
|
33
33
|
- [Troubleshooting](#troubleshooting)
|
|
34
34
|
- [License](#license)
|
|
35
35
|
|
|
36
|
+
> **v1.4.0** — `somtum list`, `somtum reset`, `somtum forget --all` · embeddings timeout safety · config crash-resilience · injection.max_chars wired up · warm-start race fix · auth-error hints
|
|
37
|
+
>
|
|
38
|
+
> **v1.3.0** — Auto-inject memories on every prompt · `update` MCP tool · warm-start after compaction · false-hit detection · workspace scope · `suggest-claude-md` · stale memory detection in `doctor`
|
|
39
|
+
|
|
36
40
|
---
|
|
37
41
|
|
|
38
42
|
## Why Somtum?
|
|
@@ -63,7 +67,7 @@ Session 2: Claude suggests Session 2: Claude already knows about
|
|
|
63
67
|
|
|
64
68
|
## How it works
|
|
65
69
|
|
|
66
|
-
At the end of each Claude Code session, Somtum reads the session transcript and asks Claude Haiku to extract the parts worth keeping — decisions, bug fixes, things learned. Those observations are stored locally and
|
|
70
|
+
At the end of each Claude Code session, Somtum reads the session transcript and asks Claude Haiku to extract the parts worth keeping — decisions, bug fixes, things learned. Those observations are stored locally in SQLite. **On every subsequent prompt**, Somtum automatically retrieves the most relevant memories and injects them into context — no manual recall needed.
|
|
67
71
|
|
|
68
72
|
### Memory lifecycle
|
|
69
73
|
|
|
@@ -73,7 +77,7 @@ At the end of each Claude Code session, Somtum reads the session transcript and
|
|
|
73
77
|
│ │
|
|
74
78
|
│ you code · debug · review · make decisions │
|
|
75
79
|
└──────────────────────────────┬──────────────────────────────┘
|
|
76
|
-
│ SessionEnd
|
|
80
|
+
│ SessionEnd / PreCompact
|
|
77
81
|
▼
|
|
78
82
|
┌─────────────────────────────────────────────────────────────┐
|
|
79
83
|
│ Capture Pipeline │
|
|
@@ -81,6 +85,8 @@ At the end of each Claude Code session, Somtum reads the session transcript and
|
|
|
81
85
|
│ session transcript ──► Haiku extracts observations │
|
|
82
86
|
│ │
|
|
83
87
|
│ decisions · bug fixes · learnings · commands │
|
|
88
|
+
│ │
|
|
89
|
+
│ PreCompact ─── writes warm-start file ──► next session │
|
|
84
90
|
└──────────────────────────────┬──────────────────────────────┘
|
|
85
91
|
│ persisted locally
|
|
86
92
|
▼
|
|
@@ -92,14 +98,16 @@ At the end of each Claude Code session, Somtum reads the session transcript and
|
|
|
92
98
|
│ index.md │
|
|
93
99
|
│ memories/YYYY-MM/ │
|
|
94
100
|
└────────────┬────────────┘
|
|
95
|
-
│
|
|
101
|
+
│ every prompt (UserPromptSubmit)
|
|
96
102
|
▼
|
|
97
103
|
┌─────────────────────────────────────────────────────────────┐
|
|
98
|
-
│
|
|
104
|
+
│ Auto-Inject Pipeline (new) │
|
|
99
105
|
│ │
|
|
100
|
-
│
|
|
106
|
+
│ 1. Prompt cache lookup (exact + fuzzy match) │
|
|
107
|
+
│ 2. BM25 recall — top-k relevant memories │
|
|
108
|
+
│ 3. Warm-start context (if session just compacted) │
|
|
101
109
|
│ │
|
|
102
|
-
│ injected
|
|
110
|
+
│ all injected as additionalContext automatically │
|
|
103
111
|
└─────────────────────────────────────────────────────────────┘
|
|
104
112
|
```
|
|
105
113
|
|
|
@@ -134,37 +142,42 @@ Next session, when you ask "why are we using pnpm?" or touch `src/auth/refresh.t
|
|
|
134
142
|
└──────────┬──────────────────────────────┬───────────────────┘
|
|
135
143
|
│ hooks │ MCP tools
|
|
136
144
|
▼ ▼
|
|
137
|
-
┌─────────────────────┐
|
|
138
|
-
│
|
|
139
|
-
│ │ │
|
|
140
|
-
│ UserPromptSubmit
|
|
141
|
-
│
|
|
142
|
-
│
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
145
|
+
┌─────────────────────┐ ┌──────────────────────────┐
|
|
146
|
+
│ Hooks │ │ MCP Tools │
|
|
147
|
+
│ │ │ │
|
|
148
|
+
│ UserPromptSubmit ──┼─cache──▶│ cache_lookup │
|
|
149
|
+
│ ──┼─inject─▶│ recall / get │
|
|
150
|
+
│ SessionEnd ────────┼─capture▶│ remember / update │
|
|
151
|
+
│ PreCompact ────────┼─warmst─▶│ forget │
|
|
152
|
+
│ PreToolUse (Read) ─┼─gate───▶│ stats │
|
|
153
|
+
│ │ │ report_false_hit │
|
|
154
|
+
└──────────┬──────────┘ └────────────┬─────────────┘
|
|
155
|
+
│ │
|
|
156
|
+
▼ ▼
|
|
146
157
|
┌─────────────────────────────────────────────────────────────┐
|
|
147
158
|
│ Core (TypeScript) │
|
|
148
159
|
│ │
|
|
149
|
-
│ ┌──────────────┐
|
|
150
|
-
│ │ PromptCache │ │
|
|
151
|
-
│ │ │ │
|
|
152
|
-
│ │ exact hash │ │ observations
|
|
153
|
-
│ │ fuzzy embed │ │
|
|
154
|
-
│ │ fingerprint │ │
|
|
155
|
-
│ │
|
|
156
|
-
│ └──────────────┘
|
|
160
|
+
│ ┌──────────────┐ ┌─────────────────┐ ┌───────────────┐ │
|
|
161
|
+
│ │ PromptCache │ │ MemoryStore │ │ Retriever │ │
|
|
162
|
+
│ │ │ │ │ │ │ │
|
|
163
|
+
│ │ exact hash │ │ observations │ │ bm25(default) │ │
|
|
164
|
+
│ │ fuzzy embed │ │ scope: project │ │ embeddings │ │
|
|
165
|
+
│ │ fingerprint │ │ global │ │ index │ │
|
|
166
|
+
│ │ false_hits │ │ workspace │ │ hybrid │ │
|
|
167
|
+
│ └──────────────┘ │ last_confirmed │ └───────────────┘ │
|
|
168
|
+
│ └─────────────────┘ │
|
|
157
169
|
└─────────────────────────────────┬───────────────────────────┘
|
|
158
170
|
│
|
|
159
171
|
▼
|
|
160
|
-
|
|
161
|
-
│ SQLite WAL + ~/.somtum/
|
|
162
|
-
│ /projects/<hash>/
|
|
163
|
-
│ db.sqlite
|
|
164
|
-
│ index.md
|
|
165
|
-
│ memories/YYYY-MM
|
|
166
|
-
│
|
|
167
|
-
|
|
172
|
+
┌─────────────────────────────┐
|
|
173
|
+
│ SQLite WAL + ~/.somtum/ │
|
|
174
|
+
│ /projects/<hash>/ │
|
|
175
|
+
│ db.sqlite │
|
|
176
|
+
│ index.md │
|
|
177
|
+
│ memories/YYYY-MM/<ulid>.md│
|
|
178
|
+
│ /session/lh_<id>.json │
|
|
179
|
+
│ /warmstart/ws_<id>.json │
|
|
180
|
+
└─────────────────────────────┘
|
|
168
181
|
```
|
|
169
182
|
|
|
170
183
|
### Retrieval strategies
|
|
@@ -191,21 +204,12 @@ Next session, when you ask "why are we using pnpm?" or touch `src/auth/refresh.t
|
|
|
191
204
|
## Install
|
|
192
205
|
|
|
193
206
|
```bash
|
|
194
|
-
# npm (recommended)
|
|
195
207
|
npm install -g somtum
|
|
196
|
-
|
|
197
|
-
# yarn
|
|
198
|
-
yarn global add somtum
|
|
199
|
-
|
|
200
|
-
# pnpm
|
|
201
|
-
pnpm add -g somtum
|
|
202
208
|
```
|
|
203
209
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
npm install somtum
|
|
208
|
-
```
|
|
210
|
+
> **pnpm users:** `pnpm add -g somtum` works if you have run `pnpm setup` first (sets `PNPM_HOME`). If you haven't, use npm above.
|
|
211
|
+
>
|
|
212
|
+
> **yarn users:** `yarn global add` is not supported in Yarn v2+ (Berry). Use npm above.
|
|
209
213
|
|
|
210
214
|
### From source
|
|
211
215
|
|
|
@@ -376,26 +380,34 @@ Press `Ctrl-C` to stop.
|
|
|
376
380
|
|
|
377
381
|
| Command | Description |
|
|
378
382
|
| --------------------------- | ------------------------------------------------------------ |
|
|
379
|
-
| `somtum init` | Install the SessionEnd capture hook
|
|
380
|
-
| `somtum init --cache` | Also install the UserPromptSubmit cache hook
|
|
381
|
-
| `somtum init --file-gating` | Also install the PreToolUse file-gating hook
|
|
382
|
-
| `somtum init --all` | Install all hooks + MCP server
|
|
383
|
-
| `somtum init --force` | Reinstall even if hooks already present
|
|
384
|
-
| `somtum doctor` | Check DB health, migrations, hooks, API key, breakeven ratio |
|
|
383
|
+
| `somtum init` | Install the SessionEnd capture hook |
|
|
384
|
+
| `somtum init --cache` | Also install the UserPromptSubmit cache + auto-inject hook |
|
|
385
|
+
| `somtum init --file-gating` | Also install the PreToolUse file-gating hook |
|
|
386
|
+
| `somtum init --all` | Install all hooks + MCP server |
|
|
387
|
+
| `somtum init --force` | Reinstall even if hooks already present |
|
|
388
|
+
| `somtum doctor` | Check DB health, migrations, hooks, API key, breakeven ratio, stale memories |
|
|
385
389
|
|
|
386
390
|
### Memory
|
|
387
391
|
|
|
388
|
-
| Command
|
|
389
|
-
|
|
|
390
|
-
| `somtum
|
|
391
|
-
| `somtum
|
|
392
|
-
| `somtum
|
|
393
|
-
| `somtum
|
|
394
|
-
| `somtum
|
|
395
|
-
| `somtum
|
|
396
|
-
| `somtum
|
|
397
|
-
| `somtum
|
|
398
|
-
| `somtum
|
|
392
|
+
| Command | Description |
|
|
393
|
+
| -------------------------------------------- | ----------------------------------------------------------------------------- |
|
|
394
|
+
| `somtum list` | List stored memories (most recent first) |
|
|
395
|
+
| `somtum list --kind decision` | Filter by kind: `decision \| learning \| bugfix \| command \| file_summary` |
|
|
396
|
+
| `somtum list --limit 20` | Limit to 20 results |
|
|
397
|
+
| `somtum list --json` | Machine-readable JSON output |
|
|
398
|
+
| `somtum search <query>` | Search observations (default: `bm25` strategy) |
|
|
399
|
+
| `somtum search <query> --strategy hybrid` | Force a specific retrieval strategy |
|
|
400
|
+
| `somtum search <query> -k 16` | Return more results |
|
|
401
|
+
| `somtum show <id>` | Print the full body of an observation |
|
|
402
|
+
| `somtum remember` | Manually store an observation |
|
|
403
|
+
| `somtum forget <id>` | Soft-delete an observation by id |
|
|
404
|
+
| `somtum forget --all` | Soft-delete **all** observations in the current project |
|
|
405
|
+
| `somtum edit <id>` | Open an observation body in `$EDITOR` |
|
|
406
|
+
| `somtum rebuild` | Regenerate `index.md` from all observations |
|
|
407
|
+
| `somtum reindex` | Recompute embeddings (after enabling embeddings or changing model) |
|
|
408
|
+
| `somtum suggest-claude-md` | Suggest CLAUDE.md additions from accumulated observations (interactive) |
|
|
409
|
+
| `somtum suggest-claude-md --dry-run` | Preview suggestions without writing |
|
|
410
|
+
| `somtum suggest-claude-md --yes --limit 20` | Auto-confirm, limit to top 20 by tokens saved |
|
|
399
411
|
|
|
400
412
|
### Stats & Visibility
|
|
401
413
|
|
|
@@ -409,15 +421,17 @@ Press `Ctrl-C` to stop.
|
|
|
409
421
|
|
|
410
422
|
### Data Management
|
|
411
423
|
|
|
412
|
-
| Command | Description
|
|
413
|
-
| ------------------------------------------------- |
|
|
414
|
-
| `somtum export` | Export observations to stdout as JSON
|
|
415
|
-
| `somtum export --format jsonl --output obs.jsonl` | Export as JSONL file
|
|
416
|
-
| `somtum export --format markdown` | Export as readable Markdown
|
|
417
|
-
| `somtum export --include-deleted` | Include soft-deleted entries
|
|
418
|
-
| `somtum import <file>` | Import observations from JSON or JSONL
|
|
419
|
-
| `somtum purge --older-than 30d` | Hard-delete soft-deleted entries older than 30 days
|
|
420
|
-
| `somtum purge --older-than 30d --dry-run` | Preview without deleting
|
|
424
|
+
| Command | Description |
|
|
425
|
+
| ------------------------------------------------- | ------------------------------------------------------------------------- |
|
|
426
|
+
| `somtum export` | Export observations to stdout as JSON |
|
|
427
|
+
| `somtum export --format jsonl --output obs.jsonl` | Export as JSONL file |
|
|
428
|
+
| `somtum export --format markdown` | Export as readable Markdown |
|
|
429
|
+
| `somtum export --include-deleted` | Include soft-deleted entries |
|
|
430
|
+
| `somtum import <file>` | Import observations from JSON or JSONL |
|
|
431
|
+
| `somtum purge --older-than 30d` | Hard-delete soft-deleted entries older than 30 days |
|
|
432
|
+
| `somtum purge --older-than 30d --dry-run` | Preview without deleting |
|
|
433
|
+
| `somtum reset` | **Permanently** wipe all memories for the current project (asks to confirm) |
|
|
434
|
+
| `somtum reset --yes` | Skip confirmation (useful in CI or scripts) |
|
|
421
435
|
|
|
422
436
|
### Configuration
|
|
423
437
|
|
|
@@ -446,32 +460,55 @@ Somtum uses hostname-aware syncing — merging observations from multiple machin
|
|
|
446
460
|
|
|
447
461
|
When you run `somtum init --all`, Somtum registers an MCP server that Claude can call autonomously during a session:
|
|
448
462
|
|
|
449
|
-
| Tool
|
|
450
|
-
|
|
|
451
|
-
| `recall`
|
|
452
|
-
| `get`
|
|
453
|
-
| `remember`
|
|
454
|
-
| `
|
|
455
|
-
| `
|
|
456
|
-
| `
|
|
463
|
+
| Tool | What Claude does with it |
|
|
464
|
+
| ------------------- | ---------------------------------------------------------------------------------------------- |
|
|
465
|
+
| `recall` | Searches memories when unsure about a project detail. Accepts `strategy` and `scope` overrides |
|
|
466
|
+
| `get` | Retrieves full observation bodies by ID. Bumps `last_confirmed_at` on each hit |
|
|
467
|
+
| `remember` | Stores an observation manually. Accepts `scope: 'project' \| 'workspace' \| 'global'` |
|
|
468
|
+
| `update` | Updates an existing observation's title, body, tags, or files. Redaction applied |
|
|
469
|
+
| `cache_lookup` | Checks the prompt cache directly |
|
|
470
|
+
| `report_false_hit` | Reports that a cached response didn't answer the question (tunes fuzzy threshold data) |
|
|
471
|
+
| `forget` | Soft-deletes an observation |
|
|
472
|
+
| `stats` | Reports tokens saved, cache hit rate, false-hit count, and corpus size |
|
|
457
473
|
|
|
458
474
|
Every MCP response includes a `tokens` field so Claude can account for retrieval cost.
|
|
459
475
|
|
|
476
|
+
### Memory scope
|
|
477
|
+
|
|
478
|
+
Observations now carry a `scope` field:
|
|
479
|
+
|
|
480
|
+
| Scope | Meaning | Use it when |
|
|
481
|
+
| ----------- | --------------------------------------------------------------- | ---------------------------------------------------- |
|
|
482
|
+
| `project` | Default. Visible only in this project. | Most decisions, bugfixes, and learnings. |
|
|
483
|
+
| `workspace` | Shared across projects via the `recall` MCP tool. | Team conventions, preferred libraries, global rules. |
|
|
484
|
+
| `global` | Same as workspace; reserved for personal preferences that span all your projects. | Your personal coding preferences. |
|
|
485
|
+
|
|
486
|
+
```
|
|
487
|
+
# Store a workspace-scoped observation from within a session:
|
|
488
|
+
remember("Always use pnpm for Node projects", body="...", scope="workspace")
|
|
489
|
+
```
|
|
490
|
+
|
|
460
491
|
---
|
|
461
492
|
|
|
462
493
|
## Storage Layout
|
|
463
494
|
|
|
464
495
|
```
|
|
465
496
|
~/.somtum/
|
|
466
|
-
├── config.json
|
|
467
|
-
├── hook.log
|
|
497
|
+
├── config.json ← global config (merged with project config)
|
|
498
|
+
├── hook.log ← timestamped log of every hook execution
|
|
499
|
+
├── session/
|
|
500
|
+
│ └── lh_<id>.json ← last cache-hit state per project (false-hit detection)
|
|
501
|
+
│ files older than 24 h are evicted automatically
|
|
502
|
+
├── warmstart/
|
|
503
|
+
│ └── ws_<id>_<timestamp>.json ← warm-start context written after PreCompact (30 min TTL)
|
|
504
|
+
│ timestamped so concurrent windows don't clobber each other
|
|
468
505
|
└── projects/
|
|
469
506
|
└── <project_id>/
|
|
470
|
-
├── db.sqlite
|
|
471
|
-
├── index.md
|
|
507
|
+
├── db.sqlite ← source of truth (SQLite WAL)
|
|
508
|
+
├── index.md ← human-readable mirror (regenerated)
|
|
472
509
|
└── memories/
|
|
473
510
|
└── YYYY-MM/
|
|
474
|
-
└── <ulid>.md
|
|
511
|
+
└── <ulid>.md ← per-observation markdown files
|
|
475
512
|
```
|
|
476
513
|
|
|
477
514
|
The project ID is derived from the git remote URL (or directory path if no remote). The same project maps to the same ID across machines as long as the remote URL matches.
|
|
@@ -503,6 +540,11 @@ somtum config set file_gating.enabled true
|
|
|
503
540
|
|
|
504
541
|
# Limit observations extracted per session (default: 10)
|
|
505
542
|
somtum config set extraction.max_observations_per_session 5
|
|
543
|
+
|
|
544
|
+
# Control automatic memory injection on every prompt (default: on)
|
|
545
|
+
somtum config set injection.enabled false # turn off auto-inject
|
|
546
|
+
somtum config set injection.k 8 # inject more memories (default: 5)
|
|
547
|
+
somtum config set injection.max_chars 5000 # raise injection size cap (default: 3000)
|
|
506
548
|
```
|
|
507
549
|
|
|
508
550
|
### Full config reference
|
|
@@ -517,7 +559,7 @@ somtum config set extraction.max_observations_per_session 5
|
|
|
517
559
|
"cache": {
|
|
518
560
|
"enabled": true,
|
|
519
561
|
"fuzzy_match": true,
|
|
520
|
-
"fuzzy_threshold": 0.92, // raise to 0.95 once you have signal
|
|
562
|
+
"fuzzy_threshold": 0.92, // raise to 0.95 once you have false-hit signal
|
|
521
563
|
"max_entries": 10000,
|
|
522
564
|
"ttl_days": 90,
|
|
523
565
|
},
|
|
@@ -535,6 +577,13 @@ somtum config set extraction.max_observations_per_session 5
|
|
|
535
577
|
"model": "claude-haiku-4-5-20251001",
|
|
536
578
|
},
|
|
537
579
|
},
|
|
580
|
+
// Auto-inject: BM25-retrieved memories prepended to every UserPromptSubmit.
|
|
581
|
+
// Uses the hot path (< 2 ms at 1k memories). Disable if you prefer pull-only.
|
|
582
|
+
"injection": {
|
|
583
|
+
"enabled": true,
|
|
584
|
+
"k": 5, // max memories injected per prompt
|
|
585
|
+
"max_chars": 3000, // hard cap on injected text
|
|
586
|
+
},
|
|
538
587
|
"file_gating": {
|
|
539
588
|
"enabled": false, // set true to intercept large file reads
|
|
540
589
|
"min_file_size_tokens": 500,
|
|
@@ -620,8 +669,11 @@ src/
|
|
|
620
669
|
doctor.ts # somtum doctor — health checks
|
|
621
670
|
hook.ts # internal: dispatches hook events by name
|
|
622
671
|
search.ts / show.ts / forget.ts / edit.ts
|
|
672
|
+
list.ts # somtum list
|
|
673
|
+
reset.ts # somtum reset — wipe project DB
|
|
623
674
|
export.ts / import.ts / purge.ts / sync.ts / rebuild.ts / reindex.ts
|
|
624
675
|
config_cmd.ts
|
|
676
|
+
suggest_claude_md.ts # somtum suggest-claude-md
|
|
625
677
|
core/
|
|
626
678
|
db.ts # SQLite setup, migration runner
|
|
627
679
|
store.ts # MemoryStore — CRUD for observations
|
|
@@ -635,8 +687,8 @@ src/
|
|
|
635
687
|
privacy.ts # redact() — runs on every capture
|
|
636
688
|
tokens.ts # gpt-tokenizer wrapper
|
|
637
689
|
hooks/
|
|
638
|
-
post_session.ts # SessionEnd: extract → store → index →
|
|
639
|
-
pre_prompt.ts # UserPromptSubmit: cache lookup
|
|
690
|
+
post_session.ts # SessionEnd/PreCompact: extract → store → index → warm-start
|
|
691
|
+
pre_prompt.ts # UserPromptSubmit: cache lookup + auto-inject + false-hit detection
|
|
640
692
|
pre_read.ts # PreToolUse: file gating
|
|
641
693
|
mcp/ # MCP server + tool implementations
|
|
642
694
|
dashboard/
|
|
@@ -761,18 +813,51 @@ BM25 works fully offline and is fast at any corpus size.
|
|
|
761
813
|
|
|
762
814
|
---
|
|
763
815
|
|
|
764
|
-
### Claude
|
|
816
|
+
### Claude doesn't seem to have context from previous sessions
|
|
765
817
|
|
|
766
|
-
|
|
818
|
+
**Auto-inject is the first thing to check.** Since v1.3.0, Somtum automatically injects top-k memories into every `UserPromptSubmit` via the cache hook — no manual recall step needed.
|
|
819
|
+
|
|
820
|
+
1. Confirm the cache hook is installed: `somtum doctor` → look for `hooks_installed ✓`
|
|
821
|
+
2. If not installed: `somtum init --cache` (or `somtum init --all`)
|
|
822
|
+
3. Confirm injection is enabled: `somtum config get injection.enabled` → should be `true`
|
|
823
|
+
4. Check that memories actually exist: `somtum stats` → `memories > 0`
|
|
824
|
+
|
|
825
|
+
**Using the MCP server** (`somtum init --all`), Claude can also call `recall` directly when uncertain. If it's not happening:
|
|
767
826
|
|
|
768
827
|
1. Confirm `.mcp.json` exists: `cat .mcp.json`
|
|
769
828
|
2. Restart Claude Code to pick up the MCP config
|
|
770
|
-
3. Prompt explicitly: _"Check your Somtum memory for anything related to our auth setup"_
|
|
771
829
|
|
|
772
|
-
|
|
830
|
+
### Stale memory warning in `somtum doctor`
|
|
831
|
+
|
|
832
|
+
`doctor` warns when memories are older than 90 days with no confirmed retrievals. These are observations that have never come up in a search. Options:
|
|
833
|
+
|
|
834
|
+
```bash
|
|
835
|
+
# Review them before deciding
|
|
836
|
+
somtum search "old topic"
|
|
837
|
+
|
|
838
|
+
# Promote useful ones to workspace scope via MCP
|
|
839
|
+
remember("...", scope="workspace")
|
|
840
|
+
|
|
841
|
+
# Remove irrelevant ones
|
|
842
|
+
somtum purge --older-than 90d
|
|
843
|
+
```
|
|
844
|
+
|
|
845
|
+
---
|
|
846
|
+
|
|
847
|
+
### Starting fresh — wiping all memories
|
|
848
|
+
|
|
849
|
+
To hard-reset a project's memory (irreversible):
|
|
773
850
|
|
|
851
|
+
```bash
|
|
852
|
+
somtum reset
|
|
853
|
+
# Permanently delete all memories for this project? [y/N] y
|
|
854
|
+
# somtum: reset complete — project <id> wiped.
|
|
774
855
|
```
|
|
775
|
-
|
|
856
|
+
|
|
857
|
+
To just clear everything softly (recoverable via `somtum export --include-deleted`):
|
|
858
|
+
|
|
859
|
+
```bash
|
|
860
|
+
somtum forget --all
|
|
776
861
|
```
|
|
777
862
|
|
|
778
863
|
---
|
package/dist/cli/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,YAAY,CA0LnE;AAED,wBAAsB,aAAa,CACjC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7C,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -70,7 +70,7 @@ export function runDoctor(opts = {}) {
|
|
|
70
70
|
});
|
|
71
71
|
// 6. All expected migrations applied
|
|
72
72
|
const applied = appliedVersions(db);
|
|
73
|
-
const expectedVersions = [1, 2, 3];
|
|
73
|
+
const expectedVersions = [1, 2, 3, 4];
|
|
74
74
|
const missing = expectedVersions.filter((v) => !applied.includes(v));
|
|
75
75
|
checks.push({
|
|
76
76
|
name: 'migrations',
|
|
@@ -102,11 +102,20 @@ export function runDoctor(opts = {}) {
|
|
|
102
102
|
else {
|
|
103
103
|
checks.push({ name: 'breakeven_ratio', ok: true, detail: 'n/a (no extraction cost yet)' });
|
|
104
104
|
}
|
|
105
|
-
// 9.
|
|
105
|
+
// 9. Stale memories: older than 90 days, never confirmed via retrieval
|
|
106
|
+
const staleCount = store.countStale(projectId, 90);
|
|
107
|
+
checks.push({
|
|
108
|
+
name: 'stale_memories',
|
|
109
|
+
ok: staleCount === 0,
|
|
110
|
+
detail: staleCount === 0
|
|
111
|
+
? 'no stale memories detected'
|
|
112
|
+
: `${staleCount} memor${staleCount === 1 ? 'y' : 'ies'} older than 90 days with no retrieval — consider \`somtum purge\` or reviewing with \`somtum search\``,
|
|
113
|
+
});
|
|
114
|
+
// 10. Cache entries
|
|
106
115
|
const cache = new PromptCache(db);
|
|
107
116
|
const cacheCount = cache.count();
|
|
108
117
|
checks.push({ name: 'cache_entries', ok: true, detail: `${cacheCount} entries` });
|
|
109
|
-
//
|
|
118
|
+
// 11. Embeddings status
|
|
110
119
|
checks.push({
|
|
111
120
|
name: 'embeddings',
|
|
112
121
|
ok: true,
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/forget.d.ts
CHANGED
|
@@ -4,6 +4,13 @@ export declare function runForget(opts: {
|
|
|
4
4
|
dbPath?: string;
|
|
5
5
|
projectId?: string;
|
|
6
6
|
}): boolean;
|
|
7
|
+
export declare function forgetAllCommand(opts?: {
|
|
8
|
+
cwd?: string;
|
|
9
|
+
json?: boolean;
|
|
10
|
+
yes?: boolean;
|
|
11
|
+
dbPath?: string;
|
|
12
|
+
projectId?: string;
|
|
13
|
+
}): Promise<number>;
|
|
7
14
|
export declare function forgetCommand(id: string, options?: {
|
|
8
15
|
json?: boolean;
|
|
9
16
|
cwd?: string;
|
package/dist/cli/forget.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forget.d.ts","sourceRoot":"","sources":["../../src/cli/forget.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"forget.d.ts","sourceRoot":"","sources":["../../src/cli/forget.ts"],"names":[],"mappings":"AAQA,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAWV;AAED,wBAAsB,gBAAgB,CAAC,IAAI,GAAE;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,MAAM,CAAC,CA0CvB;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAYhG"}
|
package/dist/cli/forget.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import * as readline from 'node:readline/promises';
|
|
2
4
|
import { openDb } from '../core/db.js';
|
|
3
5
|
import { MemoryStore } from '../core/store.js';
|
|
4
6
|
import { resolveProjectId } from '../core/project_id.js';
|
|
@@ -16,6 +18,48 @@ export function runForget(opts) {
|
|
|
16
18
|
db.close();
|
|
17
19
|
}
|
|
18
20
|
}
|
|
21
|
+
export async function forgetAllCommand(opts = {}) {
|
|
22
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
23
|
+
const projectId = opts.projectId ?? resolveProjectId(cwd);
|
|
24
|
+
const dbPath = opts.dbPath ?? join(projectDir(projectId), 'db.sqlite');
|
|
25
|
+
if (!existsSync(dbPath)) {
|
|
26
|
+
console.error('somtum: no database found');
|
|
27
|
+
return 1;
|
|
28
|
+
}
|
|
29
|
+
if (!opts.yes) {
|
|
30
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
31
|
+
try {
|
|
32
|
+
const answer = await rl.question('Soft-delete all observations for this project? [y/N] ');
|
|
33
|
+
if (answer.trim().toLowerCase() !== 'y') {
|
|
34
|
+
console.log('Aborted.');
|
|
35
|
+
return 0;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
rl.close();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const db = openDb({ path: dbPath });
|
|
43
|
+
try {
|
|
44
|
+
const store = new MemoryStore(db);
|
|
45
|
+
const observations = store.listByProject(projectId);
|
|
46
|
+
let count = 0;
|
|
47
|
+
for (const o of observations) {
|
|
48
|
+
if (store.softDelete(o.id))
|
|
49
|
+
count++;
|
|
50
|
+
}
|
|
51
|
+
if (opts.json) {
|
|
52
|
+
console.log(JSON.stringify({ deleted: count }));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log(`forgotten: ${count} observation${count === 1 ? '' : 's'}`);
|
|
56
|
+
}
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
db.close();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
19
63
|
export function forgetCommand(id, options = {}) {
|
|
20
64
|
const deleted = runForget({ id, cwd: options.cwd ?? process.cwd() });
|
|
21
65
|
if (options.json) {
|
package/dist/cli/forget.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forget.js","sourceRoot":"","sources":["../../src/cli/forget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,SAAS,CAAC,IAKzB;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAU,EAAE,UAA4C,EAAE;IACtF,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
1
|
+
{"version":3,"file":"forget.js","sourceRoot":"","sources":["../../src/cli/forget.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/hook.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/cli/hook.ts"],"names":[],"mappings":"AAqCA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/cli/hook.ts"],"names":[],"mappings":"AAqCA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiF/D"}
|
package/dist/cli/hook.js
CHANGED
|
@@ -65,9 +65,15 @@ export async function hookCommand(name) {
|
|
|
65
65
|
}));
|
|
66
66
|
}
|
|
67
67
|
catch (err) {
|
|
68
|
-
|
|
68
|
+
const msg = err.message;
|
|
69
|
+
hookLog(`[post_session] ERROR: ${msg}`);
|
|
69
70
|
// Exit 0: hook failures must not break the user's Claude Code session.
|
|
70
|
-
|
|
71
|
+
if (/401|403|authentication|api.?key/i.test(msg)) {
|
|
72
|
+
console.error(`[somtum] post_session failed: ${msg}\n Hint: check that ANTHROPIC_API_KEY is set and valid.`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.error(`[somtum] post_session failed: ${msg}`);
|
|
76
|
+
}
|
|
71
77
|
}
|
|
72
78
|
return 0;
|
|
73
79
|
}
|
|
@@ -75,6 +81,12 @@ export async function hookCommand(name) {
|
|
|
75
81
|
try {
|
|
76
82
|
const payload = PrePromptPayloadSchema.parse(parsed);
|
|
77
83
|
const output = await raceTimeout(runPrePrompt(payload), timeoutMs, 'pre_prompt');
|
|
84
|
+
if (output.hookSpecificOutput && !output.hit) {
|
|
85
|
+
hookLog('[pre_prompt] injected memories into context');
|
|
86
|
+
}
|
|
87
|
+
else if (output.hit) {
|
|
88
|
+
hookLog(`[pre_prompt] cache hit kind=${output.matchKind ?? 'exact'}`);
|
|
89
|
+
}
|
|
78
90
|
console.log(JSON.stringify(output));
|
|
79
91
|
}
|
|
80
92
|
catch (err) {
|