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.
Files changed (62) hide show
  1. package/README.md +175 -90
  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 +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 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
@@ -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
- Or as a project dependency:
205
-
206
- ```bash
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 | Description |
389
- | ----------------------------------------- | ------------------------------------------------------------------ |
390
- | `somtum search <query>` | Search observations (default: `bm25` strategy) |
391
- | `somtum search <query> --strategy hybrid` | Force a specific retrieval strategy |
392
- | `somtum search <query> -k 16` | Return more results |
393
- | `somtum show <id>` | Print the full body of an observation |
394
- | `somtum remember` | Manually store an observation |
395
- | `somtum forget <id>` | Soft-delete an observation |
396
- | `somtum edit <id>` | Open an observation body in `$EDITOR` |
397
- | `somtum rebuild` | Regenerate `index.md` from all observations |
398
- | `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 |
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 | What Claude does with it |
450
- | -------------- | ------------------------------------------------------ |
451
- | `recall` | Searches memories when unsure about a project detail |
452
- | `get` | Retrieves the full body of specific observations by ID |
453
- | `remember` | Stores an observation manually from within a session |
454
- | `cache_lookup` | Checks the prompt cache directly |
455
- | `forget` | Soft-deletes an observation |
456
- | `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 |
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 ← global config (merged with project config)
467
- ├── 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
468
505
  └── projects/
469
506
  └── <project_id>/
470
- ├── db.sqlite ← source of truth (SQLite WAL)
471
- ├── index.md ← human-readable mirror (regenerated)
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 ← per-observation markdown files
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 → log
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 isn't using the memories
816
+ ### Claude doesn't seem to have context from previous sessions
765
817
 
766
- If you are using the MCP server (`somtum init --all`), Claude calls `recall` automatically when uncertain about project details. If it's not happening:
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
- 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`
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
- 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
776
861
  ```
777
862
 
778
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) {