somtum 1.3.4 → 1.5.1

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.
Files changed (62) hide show
  1. package/README.md +173 -79
  2. package/dist/cli/doctor.d.ts.map +1 -1
  3. package/dist/cli/doctor.js +12 -3
  4. package/dist/cli/doctor.js.map +1 -1
  5. package/dist/cli/forget.d.ts +7 -0
  6. package/dist/cli/forget.d.ts.map +1 -1
  7. package/dist/cli/forget.js +44 -0
  8. package/dist/cli/forget.js.map +1 -1
  9. package/dist/cli/hook.d.ts.map +1 -1
  10. package/dist/cli/hook.js +14 -2
  11. package/dist/cli/hook.js.map +1 -1
  12. package/dist/cli/index.js +49 -3
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/cli/init.d.ts.map +1 -1
  15. package/dist/cli/init.js +7 -1
  16. package/dist/cli/init.js.map +1 -1
  17. package/dist/cli/list.d.ts +9 -0
  18. package/dist/cli/list.d.ts.map +1 -0
  19. package/dist/cli/list.js +54 -0
  20. package/dist/cli/list.js.map +1 -0
  21. package/dist/cli/reset.d.ts +7 -0
  22. package/dist/cli/reset.d.ts.map +1 -0
  23. package/dist/cli/reset.js +66 -0
  24. package/dist/cli/reset.js.map +1 -0
  25. package/dist/cli/suggest_claude_md.d.ts +9 -0
  26. package/dist/cli/suggest_claude_md.d.ts.map +1 -0
  27. package/dist/cli/suggest_claude_md.js +106 -0
  28. package/dist/cli/suggest_claude_md.js.map +1 -0
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +19 -7
  31. package/dist/config.js.map +1 -1
  32. package/dist/core/schema.d.ts +51 -0
  33. package/dist/core/schema.d.ts.map +1 -1
  34. package/dist/core/schema.js +18 -0
  35. package/dist/core/schema.js.map +1 -1
  36. package/dist/core/store.d.ts +8 -1
  37. package/dist/core/store.d.ts.map +1 -1
  38. package/dist/core/store.js +61 -6
  39. package/dist/core/store.js.map +1 -1
  40. package/dist/dashboard/index.html +49 -6
  41. package/dist/db/migrations/004_scope_and_staleness.sql +11 -0
  42. package/dist/hooks/post_session.d.ts.map +1 -1
  43. package/dist/hooks/post_session.js +50 -2
  44. package/dist/hooks/post_session.js.map +1 -1
  45. package/dist/hooks/pre_prompt.d.ts.map +1 -1
  46. package/dist/hooks/pre_prompt.js +231 -48
  47. package/dist/hooks/pre_prompt.js.map +1 -1
  48. package/dist/hooks/pre_read.d.ts.map +1 -1
  49. package/dist/hooks/pre_read.js +7 -1
  50. package/dist/hooks/pre_read.js.map +1 -1
  51. package/dist/index.d.ts +4 -0
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +4 -0
  54. package/dist/index.js.map +1 -1
  55. package/dist/mcp/server.d.ts.map +1 -1
  56. package/dist/mcp/server.js +35 -2
  57. package/dist/mcp/server.js.map +1 -1
  58. package/dist/mcp/tools.d.ts +33 -0
  59. package/dist/mcp/tools.d.ts.map +1 -1
  60. package/dist/mcp/tools.js +68 -3
  61. package/dist/mcp/tools.js.map +1 -1
  62. package/package.json +7 -3
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Local-first memory and prompt-cache layer for Claude Code.**
4
4
 
5
- [**Landing Page & Demo**](https://riz007.github.io/somtum/)
5
+ [**Docs**](https://riz007.github.io/somtum/guide/getting-started) · [**Landing Page**](https://riz007.github.io/somtum/) · [**npm**](https://www.npmjs.com/package/somtum)
6
6
 
7
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
8
8
  [![npm version](https://badge.fury.io/js/somtum.svg)](https://www.npmjs.com/package/somtum)
@@ -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.5.0** — Multi-page VitePress docs site · `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 injected back into context the next time you ask something related.
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 fires automatically
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
- │ next session
101
+ │ every prompt (UserPromptSubmit)
96
102
  ▼
97
103
  ┌─────────────────────────────────────────────────────────────┐
98
- │ Query Pipeline │
104
+ │ Auto-Inject Pipeline (new) │
99
105
  │ │
100
- │ user prompt ──► BM25 / embeddings / hybrid ──► top-k hits │
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 into Claude Code context automatically │
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
- │ Capture Pipeline │ │ Query Pipeline │
139
- │ │ │ │
140
- │ UserPromptSubmit ──┼─────────┼▶ cache_lookup │
141
- │ SessionEnd ────────┼─────────┼▶ recall / get │
142
- │ PreToolUse (Read) ─┼─────────┼▶ remember / forget │
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 │ │ MemoryStore │ │ Retriever │ │
151
- │ │ │ │ │ │ │ │
152
- │ │ exact hash │ │ observations │ │ bm25 (default) │ │
153
- │ │ fuzzy embed │ │ + embeddings │ │ embeddings │ │
154
- │ │ fingerprint │ │ + redaction │ │ index │ │
155
- │ │ invalidation │ │ │ │ hybrid │ │
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
- │ <ulid>.md │
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
@@ -367,26 +380,34 @@ Press `Ctrl-C` to stop.
367
380
 
368
381
  | Command | Description |
369
382
  | --------------------------- | ------------------------------------------------------------ |
370
- | `somtum init` | Install the SessionEnd capture hook |
371
- | `somtum init --cache` | Also install the UserPromptSubmit cache hook |
372
- | `somtum init --file-gating` | Also install the PreToolUse file-gating hook |
373
- | `somtum init --all` | Install all hooks + MCP server |
374
- | `somtum init --force` | Reinstall even if hooks already present |
375
- | `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 |
376
389
 
377
390
  ### Memory
378
391
 
379
- | Command | Description |
380
- | ----------------------------------------- | ------------------------------------------------------------------ |
381
- | `somtum search <query>` | Search observations (default: `bm25` strategy) |
382
- | `somtum search <query> --strategy hybrid` | Force a specific retrieval strategy |
383
- | `somtum search <query> -k 16` | Return more results |
384
- | `somtum show <id>` | Print the full body of an observation |
385
- | `somtum remember` | Manually store an observation |
386
- | `somtum forget <id>` | Soft-delete an observation |
387
- | `somtum edit <id>` | Open an observation body in `$EDITOR` |
388
- | `somtum rebuild` | Regenerate `index.md` from all observations |
389
- | `somtum reindex` | Recompute embeddings (after enabling embeddings or changing model) |
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 |
390
411
 
391
412
  ### Stats & Visibility
392
413
 
@@ -400,15 +421,17 @@ Press `Ctrl-C` to stop.
400
421
 
401
422
  ### Data Management
402
423
 
403
- | Command | Description |
404
- | ------------------------------------------------- | --------------------------------------------------- |
405
- | `somtum export` | Export observations to stdout as JSON |
406
- | `somtum export --format jsonl --output obs.jsonl` | Export as JSONL file |
407
- | `somtum export --format markdown` | Export as readable Markdown |
408
- | `somtum export --include-deleted` | Include soft-deleted entries |
409
- | `somtum import <file>` | Import observations from JSON or JSONL |
410
- | `somtum purge --older-than 30d` | Hard-delete soft-deleted entries older than 30 days |
411
- | `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) |
412
435
 
413
436
  ### Configuration
414
437
 
@@ -437,32 +460,55 @@ Somtum uses hostname-aware syncing — merging observations from multiple machin
437
460
 
438
461
  When you run `somtum init --all`, Somtum registers an MCP server that Claude can call autonomously during a session:
439
462
 
440
- | Tool | What Claude does with it |
441
- | -------------- | ------------------------------------------------------ |
442
- | `recall` | Searches memories when unsure about a project detail |
443
- | `get` | Retrieves the full body of specific observations by ID |
444
- | `remember` | Stores an observation manually from within a session |
445
- | `cache_lookup` | Checks the prompt cache directly |
446
- | `forget` | Soft-deletes an observation |
447
- | `stats` | Reports tokens saved, cache hit rate, and corpus size |
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 |
448
473
 
449
474
  Every MCP response includes a `tokens` field so Claude can account for retrieval cost.
450
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
+
451
491
  ---
452
492
 
453
493
  ## Storage Layout
454
494
 
455
495
  ```
456
496
  ~/.somtum/
457
- ├── config.json ← global config (merged with project config)
458
- ├── hook.log ← timestamped log of every hook execution
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
459
505
  └── projects/
460
506
  └── <project_id>/
461
- ├── db.sqlite ← source of truth (SQLite WAL)
462
- ├── index.md ← human-readable mirror (regenerated)
507
+ ├── db.sqlite ← source of truth (SQLite WAL)
508
+ ├── index.md ← human-readable mirror (regenerated)
463
509
  └── memories/
464
510
  └── YYYY-MM/
465
- └── <ulid>.md ← per-observation markdown files
511
+ └── <ulid>.md ← per-observation markdown files
466
512
  ```
467
513
 
468
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.
@@ -494,6 +540,11 @@ somtum config set file_gating.enabled true
494
540
 
495
541
  # Limit observations extracted per session (default: 10)
496
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)
497
548
  ```
498
549
 
499
550
  ### Full config reference
@@ -508,7 +559,7 @@ somtum config set extraction.max_observations_per_session 5
508
559
  "cache": {
509
560
  "enabled": true,
510
561
  "fuzzy_match": true,
511
- "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
512
563
  "max_entries": 10000,
513
564
  "ttl_days": 90,
514
565
  },
@@ -526,6 +577,13 @@ somtum config set extraction.max_observations_per_session 5
526
577
  "model": "claude-haiku-4-5-20251001",
527
578
  },
528
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
+ },
529
587
  "file_gating": {
530
588
  "enabled": false, // set true to intercept large file reads
531
589
  "min_file_size_tokens": 500,
@@ -611,8 +669,11 @@ src/
611
669
  doctor.ts # somtum doctor — health checks
612
670
  hook.ts # internal: dispatches hook events by name
613
671
  search.ts / show.ts / forget.ts / edit.ts
672
+ list.ts # somtum list
673
+ reset.ts # somtum reset — wipe project DB
614
674
  export.ts / import.ts / purge.ts / sync.ts / rebuild.ts / reindex.ts
615
675
  config_cmd.ts
676
+ suggest_claude_md.ts # somtum suggest-claude-md
616
677
  core/
617
678
  db.ts # SQLite setup, migration runner
618
679
  store.ts # MemoryStore — CRUD for observations
@@ -626,8 +687,8 @@ src/
626
687
  privacy.ts # redact() — runs on every capture
627
688
  tokens.ts # gpt-tokenizer wrapper
628
689
  hooks/
629
- post_session.ts # SessionEnd: extract → store → index → log
630
- 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
631
692
  pre_read.ts # PreToolUse: file gating
632
693
  mcp/ # MCP server + tool implementations
633
694
  dashboard/
@@ -752,18 +813,51 @@ BM25 works fully offline and is fast at any corpus size.
752
813
 
753
814
  ---
754
815
 
755
- ### Claude isn't using the memories
816
+ ### Claude doesn't seem to have context from previous sessions
817
+
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`
756
824
 
757
- If you are using the MCP server (`somtum init --all`), Claude calls `recall` automatically when uncertain about project details. If it's not happening:
825
+ **Using the MCP server** (`somtum init --all`), Claude can also call `recall` directly when uncertain. If it's not happening:
758
826
 
759
827
  1. Confirm `.mcp.json` exists: `cat .mcp.json`
760
828
  2. Restart Claude Code to pick up the MCP config
761
- 3. Prompt explicitly: _"Check your Somtum memory for anything related to our auth setup"_
762
829
 
763
- If you are not using the MCP server, memories are injected via `index.md`. Reference it in your CLAUDE.md:
830
+ ### Stale memory warning in `somtum doctor`
764
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):
850
+
851
+ ```bash
852
+ somtum reset
853
+ # Permanently delete all memories for this project? [y/N] y
854
+ # somtum: reset complete — project <id> wiped.
765
855
  ```
766
- See ~/.somtum/projects/<project_id>/index.md for prior session learnings.
856
+
857
+ To just clear everything softly (recoverable via `somtum export --include-deleted`):
858
+
859
+ ```bash
860
+ somtum forget --all
767
861
  ```
768
862
 
769
863
  ---
@@ -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,CA+KnE;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"}
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"}
@@ -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. Cache entries
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
- // 10. Embeddings status
118
+ // 11. Embeddings status
110
119
  checks.push({
111
120
  name: 'embeddings',
112
121
  ok: true,
@@ -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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"}
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"forget.d.ts","sourceRoot":"","sources":["../../src/cli/forget.ts"],"names":[],"mappings":"AAMA,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,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"}
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"}
@@ -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) {
@@ -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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"}
@@ -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,CAqE/D"}
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
- hookLog(`[post_session] ERROR: ${err.message}`);
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
- console.error(`[somtum] post_session failed: ${err.message}`);
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/cli/hook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/cli/hook.ts"],"names":[],"mappings":"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"}