hmem-mcp 7.0.4 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -130
- package/dist/cli-stats.d.ts +9 -0
- package/dist/cli-stats.js +101 -0
- package/dist/cli-stats.js.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -1
- package/dist/hmem-store.d.ts +11 -0
- package/dist/hmem-store.js +43 -2
- package/dist/hmem-store.js.map +1 -1
- package/dist/mcp-server.js +24 -23
- package/dist/mcp-server.js.map +1 -1
- package/package.json +1 -1
- package/skills/hmem-activate/SKILL.md +9 -0
- package/skills/hmem-curate/SKILL.md +7 -0
- package/skills/hmem-dispatch/SKILL.md +7 -0
- package/skills/hmem-session-start/SKILL.md +22 -1
- package/skills/hmem-update/SKILL.md +48 -0
- package/skills/hmem-write/SKILL.md +18 -0
package/README.md
CHANGED
|
@@ -1,203 +1,203 @@
|
|
|
1
1
|
# hmem — Humanlike Memory for AI Agents
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Your AI forgets everything between sessions. **hmem fixes that.**
|
|
4
4
|
|
|
5
|
-
One `
|
|
5
|
+
One `load_project()` call. 5k tokens. Your agent knows everything important about a project, every past mistake, every decision you ever made together — across sessions, devices, and AI providers. No setup per conversation. No "let me re-read the codebase." It just *remembers*.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## The Problem
|
|
10
10
|
|
|
11
|
-
Every AI
|
|
11
|
+
Every AI session starts from zero. Your agent asks the same questions, makes the same mistakes, contradicts last week's decisions, and wastes 50k tokens loading context it already processed yesterday.
|
|
12
12
|
|
|
13
|
-
You've tried workarounds — CLAUDE.
|
|
13
|
+
You've tried workarounds — CLAUDE.md files, custom prompts, manually pasting context. They don't scale. You have 10 projects. You switch between 3 devices. You use different AI tools.
|
|
14
14
|
|
|
15
15
|
## The Solution
|
|
16
16
|
|
|
17
17
|
```
|
|
18
|
-
You: "
|
|
19
|
-
Agent: [calls
|
|
20
|
-
Agent: "Got it.
|
|
21
|
-
3 open tasks, 9 ideas. Last
|
|
22
|
-
auto-checkpoints
|
|
18
|
+
You: "Load project hmem"
|
|
19
|
+
Agent: [calls load_project("P0048") — 700 tokens]
|
|
20
|
+
Agent: "Got it. v5.0.0, TypeScript/SQLite/npm, 10 source files,
|
|
21
|
+
3 open tasks, 9 ideas. Last session you implemented
|
|
22
|
+
auto-checkpoints via Haiku. What's next?"
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
That's it. 700
|
|
25
|
+
That's it. 700 tokens for a complete project briefing. The agent knows the stack, the architecture, the open bugs, the recent decisions, and exactly where you left off — even if "you" was a different AI on a different machine yesterday.
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
---
|
|
28
28
|
|
|
29
29
|
## How It Works
|
|
30
30
|
|
|
31
31
|
```
|
|
32
|
-
Level 1 ── One
|
|
33
|
-
Level 2 ──
|
|
34
|
-
Level 3 ── Full context
|
|
35
|
-
Level 4 ──
|
|
36
|
-
|
|
32
|
+
Level 1 ── One-line summary (always loaded — ~5k tokens for 300+ entries)
|
|
33
|
+
Level 2 ── Paragraph detail (loaded on demand)
|
|
34
|
+
Level 3 ── Full context (loaded on demand)
|
|
35
|
+
Level 4 ── Extended detail (loaded on demand)
|
|
36
|
+
Level 5 ── Raw/verbatim data (loaded on demand)
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
At session start, the agent loads
|
|
39
|
+
At session start, the agent loads Level 1 summaries — one line per memory. When it needs detail, it drills down. Your 300-entry memory costs 5k tokens to overview. A single project costs 700.
|
|
40
40
|
|
|
41
|
-
**Nothing is
|
|
41
|
+
**Nothing is summarized away.** Level 1 is a summary, but Levels 2-5 hold the complete original text, word for word, accessible on demand.
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
45
|
-
## What
|
|
45
|
+
## What Makes v5 Different
|
|
46
46
|
|
|
47
|
-
### Automatic Session
|
|
47
|
+
### Automatic Session Memory
|
|
48
48
|
|
|
49
|
-
Every conversation is recorded
|
|
49
|
+
Every conversation is recorded automatically. No "save your work" prompts. No manual checkpoints.
|
|
50
50
|
|
|
51
51
|
```
|
|
52
|
-
You type → Agent
|
|
53
|
-
→ Linked to active
|
|
52
|
+
You type → Agent responds → Stop hook fires → Exchange saved to O-entry
|
|
53
|
+
→ Linked to active project
|
|
54
54
|
→ Haiku auto-titles the session
|
|
55
|
-
```
|
|
55
|
+
```
|
|
56
56
|
|
|
57
|
-
Switch projects mid-session? The O-entry
|
|
57
|
+
Switch projects mid-session? The O-entry switches too. Start a new session on a different PC? The next agent sees every exchange from every device — **the conversation never dies**.
|
|
58
58
|
|
|
59
59
|
### Haiku Background Checkpoints
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
Every 20 exchanges, a Haiku subagent wakes up in the background. It reads the recent conversation, extracts lessons learned, errors encountered, and decisions made, then writes them to long-term memory — with full MCP tool access. Your main agent is never interrupted.
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
The checkpoint also writes a **handoff note** to the project: "Here's what was done, here's what's in progress, here's the next step." The next agent — on any device, any provider — picks up exactly where you left off.
|
|
64
64
|
|
|
65
|
-
###
|
|
65
|
+
### Project-Based, Not Session-Based
|
|
66
66
|
|
|
67
|
-
Sessions
|
|
67
|
+
Sessions are meaningless. Projects are everything.
|
|
68
68
|
|
|
69
|
-
- O
|
|
70
|
-
- Checkpoint counters count
|
|
71
|
-
- 10
|
|
72
|
-
- `load_project`
|
|
69
|
+
- O-entries are linked to the active project, not the session
|
|
70
|
+
- Checkpoint counters count project exchanges, not session messages
|
|
71
|
+
- 10 messages on your laptop + 10 on your server = checkpoint fires on message 20
|
|
72
|
+
- `load_project` shows recent conversations with full context — across all devices
|
|
73
73
|
|
|
74
74
|
---
|
|
75
75
|
|
|
76
|
-
## Key Features
|
|
76
|
+
## Key Features
|
|
77
77
|
|
|
78
78
|
| Feature | What it does |
|
|
79
|
-
|
|
80
|
-
| **5-level lazy loading** | Tokens
|
|
81
|
-
| **Smart
|
|
82
|
-
| **
|
|
83
|
-
| **Duplicate
|
|
84
|
-
| **Encrypted sync** | AES-
|
|
85
|
-
| **Auto-logging** | Every
|
|
86
|
-
| **
|
|
87
|
-
| **Project handoff** |
|
|
88
|
-
| **User skill tracking**
|
|
89
|
-
| **Hashtags** | Cross-
|
|
90
|
-
| **Obsolete chains** | Mark entries wrong
|
|
91
|
-
| **Cross-provider** | Claude, Gemini, GPT,
|
|
92
|
-
| **
|
|
93
|
-
| **Import/
|
|
79
|
+
|---------|--------------|
|
|
80
|
+
| **5-level lazy loading** | Tokens scale with need, not memory size |
|
|
81
|
+
| **Smart bulk reads** | Expands newest + most-accessed; compresses the rest to titles |
|
|
82
|
+
| **Project gate** | Activate a project — only relevant memories are expanded |
|
|
83
|
+
| **Duplicate detection** | Warns before creating entries that already exist |
|
|
84
|
+
| **Encrypted sync** | AES-256-GCM, zero-knowledge server, multi-server redundancy |
|
|
85
|
+
| **Auto-logging** | Every exchange recorded via Stop hook (O-prefix) |
|
|
86
|
+
| **Auto-checkpoint** | Haiku extracts L/D/E entries every N exchanges |
|
|
87
|
+
| **Project handoff** | Background agent maintains "current state" in Protocol section |
|
|
88
|
+
| **User skill tracking** | Agents track your expertise (1-10) and adapt communication |
|
|
89
|
+
| **Hashtags** | Cross-cutting tags for discovery across all categories |
|
|
90
|
+
| **Obsolete chains** | Mark entries wrong with correction reference — auto-follows |
|
|
91
|
+
| **Cross-provider** | Claude, Gemini, GPT, DeepSeek, local models — same memory |
|
|
92
|
+
| **Cross-tool** | Claude Code, Gemini CLI, Cursor, Windsurf, OpenCode, Cline |
|
|
93
|
+
| **Import/Export** | Share memories between agents or back up as Markdown |
|
|
94
94
|
|
|
95
95
|
### Categories
|
|
96
96
|
|
|
97
|
-
| Prefix |
|
|
98
|
-
|
|
99
|
-
| **P** | Project | `hmem-mcp \|
|
|
100
|
-
| **L** | Lesson | `HMEM_AGENT_ID must be
|
|
101
|
-
| **E** | Error | `158 spurious
|
|
102
|
-
| **D** | Decision | `
|
|
103
|
-
| **H** | Human |
|
|
104
|
-
| **R** | Rule | `Max one npm
|
|
105
|
-
| **O** |
|
|
106
|
-
| **I** |
|
|
97
|
+
| Prefix | Category | Example |
|
|
98
|
+
|--------|----------|---------|
|
|
99
|
+
| **P** | Project | `hmem-mcp \| Active \| TS/SQLite/npm \| Persistent AI memory` |
|
|
100
|
+
| **L** | Lesson | `HMEM_AGENT_ID must be set in hooks — resolveHmemPath falls back to wrong DB` |
|
|
101
|
+
| **E** | Error | `158 spurious O-entries created when Haiku MCP lacked HMEM_NO_SESSION guard` |
|
|
102
|
+
| **D** | Decision | `Project-based O-entries over session-based — sessions are meaningless` |
|
|
103
|
+
| **H** | Human | `User Skill: TypeScript 9, Architecture 9, React 3` |
|
|
104
|
+
| **R** | Rule | `Max one npm publish per day — batch changes` |
|
|
105
|
+
| **O** | Original | Auto-recorded conversation history (every exchange, every device) |
|
|
106
|
+
| **I** | Infra | `Strato Server \| Active \| Linux \| 87.106.22.11` |
|
|
107
107
|
|
|
108
108
|
---
|
|
109
109
|
|
|
110
110
|
## Quick Start
|
|
111
111
|
|
|
112
|
-
### 1.
|
|
112
|
+
### 1. Install
|
|
113
113
|
|
|
114
114
|
```bash
|
|
115
115
|
npm install -g hmem-mcp
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
-
###
|
|
118
|
+
### 2. Run the interactive installer
|
|
119
119
|
|
|
120
120
|
```bash
|
|
121
|
-
|
|
121
|
+
npx hmem init
|
|
122
122
|
```
|
|
123
123
|
|
|
124
|
-
This detects your AI tools,
|
|
124
|
+
This detects your AI tools, creates the memory directory, configures MCP, and installs all 4 hooks:
|
|
125
125
|
|
|
126
|
-
| Hook | When |
|
|
126
|
+
| Hook | When | What |
|
|
127
127
|
|------|------|------|
|
|
128
|
-
| `
|
|
129
|
-
| `
|
|
130
|
-
| `Stop` (async) | Every
|
|
131
|
-
| `SessionStart[clear]` | After /clear | Re-
|
|
128
|
+
| `UserPromptSubmit` | Every message | First message: load memory. Every Nth: checkpoint reminder |
|
|
129
|
+
| `Stop` (sync) | Every response | Log exchange to active O-entry |
|
|
130
|
+
| `Stop` (async) | Every response | Haiku auto-titles untitled sessions |
|
|
131
|
+
| `SessionStart[clear]` | After /clear | Re-inject project context |
|
|
132
132
|
|
|
133
133
|
### 3. Verify
|
|
134
134
|
|
|
135
|
-
|
|
135
|
+
Restart your AI tool, then:
|
|
136
136
|
|
|
137
137
|
```
|
|
138
138
|
read_memory()
|
|
139
|
-
|
|
139
|
+
```
|
|
140
140
|
|
|
141
|
-
Empty response = working (first run).
|
|
141
|
+
Empty response = working (first run). Error = check the [troubleshooting section](#troubleshooting).
|
|
142
142
|
|
|
143
143
|
### Manual setup
|
|
144
144
|
|
|
145
|
-
If you
|
|
145
|
+
If you prefer manual configuration over `hmem init`:
|
|
146
146
|
|
|
147
|
-
<
|
|
148
|
-
<summary>Claude Code — edit ~/.
|
|
147
|
+
<details>
|
|
148
|
+
<summary>Claude Code — edit ~/.claude/.mcp.json</summary>
|
|
149
149
|
|
|
150
150
|
```json
|
|
151
151
|
{
|
|
152
|
-
"
|
|
152
|
+
"mcpServers": {
|
|
153
153
|
"hmem": {
|
|
154
|
-
"command": "/
|
|
155
|
-
"args": ["/absolute/
|
|
156
|
-
"
|
|
157
|
-
"HMEM_PROJECT_DIR": "/home/
|
|
158
|
-
"HMEM_AGENT_ID": "
|
|
154
|
+
"command": "/absolute/path/to/node",
|
|
155
|
+
"args": ["/absolute/path/to/hmem-mcp/dist/mcp-server.js"],
|
|
156
|
+
"env": {
|
|
157
|
+
"HMEM_PROJECT_DIR": "/home/yourname/.hmem",
|
|
158
|
+
"HMEM_AGENT_ID": "DEVELOPER"
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
163
|
```
|
|
164
164
|
|
|
165
|
-
Find the
|
|
165
|
+
Find the paths:
|
|
166
166
|
```bash
|
|
167
167
|
echo "Node: $(which node)"
|
|
168
|
-
echo "
|
|
168
|
+
echo "Server: $(npm root -g)/hmem-mcp/dist/mcp-server.js"
|
|
169
169
|
```
|
|
170
170
|
</details>
|
|
171
171
|
|
|
172
172
|
<details>
|
|
173
|
-
<summary>Open Code — edit ~/.config/opencode/opencode.
|
|
173
|
+
<summary>Open Code — edit ~/.config/opencode/opencode.json</summary>
|
|
174
174
|
|
|
175
175
|
```json
|
|
176
176
|
{
|
|
177
177
|
"mcp": {
|
|
178
|
-
"hmem":
|
|
178
|
+
"hmem": {
|
|
179
179
|
"type": "local",
|
|
180
|
-
"command": ["
|
|
181
|
-
"
|
|
180
|
+
"command": ["/absolute/path/to/node", "/absolute/path/to/hmem-mcp/dist/mcp-server.js"],
|
|
181
|
+
"environment": { "HMEM_PROJECT_DIR": "/home/yourname/.hmem" },
|
|
182
182
|
"enabled": true
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
185
|
}
|
|
186
|
-
|
|
186
|
+
```
|
|
187
187
|
</details>
|
|
188
188
|
|
|
189
189
|
<details>
|
|
190
|
-
<summary>Cursor /
|
|
190
|
+
<summary>Cursor / Windsurf / Cline</summary>
|
|
191
191
|
|
|
192
|
-
Edit `~/.cursor/mcp.
|
|
192
|
+
Edit `~/.cursor/mcp.json`, `~/.codeium/windsurf/mcp_config.json`, or `.vscode/mcp.json`:
|
|
193
193
|
|
|
194
194
|
```json
|
|
195
195
|
{
|
|
196
|
-
"
|
|
196
|
+
"mcpServers": {
|
|
197
197
|
"hmem": {
|
|
198
|
-
"command": "/
|
|
199
|
-
"args": ["/absolute
|
|
200
|
-
|
|
198
|
+
"command": "/absolute/path/to/node",
|
|
199
|
+
"args": ["/absolute/path/to/hmem-mcp/dist/mcp-server.js"],
|
|
200
|
+
"env": { "HMEM_PROJECT_DIR": "/home/yourname/.hmem" }
|
|
201
201
|
}
|
|
202
202
|
}
|
|
203
203
|
}
|
|
@@ -206,68 +206,68 @@ Edit `~/.cursor/mcp. json`, `~/.codeium/windsurf/mcp_config.json`, or `.vscode/
|
|
|
206
206
|
|
|
207
207
|
---
|
|
208
208
|
|
|
209
|
-
##
|
|
209
|
+
## Configuration
|
|
210
210
|
|
|
211
|
-
`hmem.config.json` in your `
|
|
211
|
+
`hmem.config.json` in your `HMEM_PROJECT_DIR` (or `Agents/NAME/`):
|
|
212
212
|
|
|
213
|
-
```
|
|
213
|
+
```json
|
|
214
214
|
{
|
|
215
215
|
"memory": {
|
|
216
|
-
"maxCharsPerLevel": [
|
|
217
|
-
"maxDepth"
|
|
216
|
+
"maxCharsPerLevel": [200, 2500, 10000, 25000, 50000],
|
|
217
|
+
"maxDepth": 5,
|
|
218
218
|
"checkpointMode": "auto",
|
|
219
|
-
"
|
|
220
|
-
"recentOEntries": 10,
|
|
219
|
+
"checkpointInterval": 20,
|
|
220
|
+
"recentOEntries": 10,
|
|
221
221
|
"maxTitleChars": 50,
|
|
222
|
-
"prefixes": { "
|
|
222
|
+
"prefixes": { "X": "Custom" }
|
|
223
223
|
},
|
|
224
224
|
"sync": {
|
|
225
|
-
"
|
|
226
|
-
"
|
|
225
|
+
"serverUrl": "https://your-server/hmem-sync",
|
|
226
|
+
"userId": "yourname",
|
|
227
227
|
"salt": "...",
|
|
228
|
-
"
|
|
228
|
+
"token": "..."
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
```
|
|
232
232
|
|
|
233
|
-
| Key | Default | What
|
|
233
|
+
| Key | Default | What it does |
|
|
234
234
|
|-----|---------|-------------|
|
|
235
|
-
| `
|
|
236
|
-
| `checkpointInterval` |
|
|
237
|
-
| `recentOEntries` | `10` |
|
|
235
|
+
| `checkpointMode` | `"remind"` | `"auto"` = Haiku writes L/D/E in background. `"remind"` = asks the main agent |
|
|
236
|
+
| `checkpointInterval` | `20` | Exchanges between checkpoints. Set `0` to disable |
|
|
237
|
+
| `recentOEntries` | `10` | How many recent sessions to show in `load_project` |
|
|
238
238
|
|
|
239
|
-
All keys are optional. Missing keys
|
|
239
|
+
All keys are optional. Missing keys use defaults.
|
|
240
240
|
|
|
241
241
|
---
|
|
242
242
|
|
|
243
243
|
## Cross-Device Sync
|
|
244
244
|
|
|
245
|
-
Sync
|
|
245
|
+
Sync memories across all devices with zero-knowledge encryption.
|
|
246
246
|
|
|
247
247
|
```bash
|
|
248
|
-
npm install -g hmem-
|
|
249
|
-
npx hmem-sync connect # Interactive
|
|
250
|
-
|
|
248
|
+
npm install -g hmem-sync
|
|
249
|
+
npx hmem-sync connect # Interactive wizard — first device creates, others join
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Add `HMEM_SYNC_PASSPHRASE` to your MCP config for automatic sync on every read/write.
|
|
251
253
|
|
|
252
|
-
Add `HMEM_SYNC_PASSPHRASE` to your MCP co nfig for automatic sync on every read/write.
|
|
253
|
-
|
|
254
254
|
### Multi-server redundancy
|
|
255
255
|
|
|
256
256
|
```json
|
|
257
257
|
{
|
|
258
|
-
"
|
|
259
|
-
{ "name": "primary", "serverUrl":
|
|
260
|
-
{ "name"
|
|
258
|
+
"sync": [
|
|
259
|
+
{ "name": "primary", "serverUrl": "https://server1/hmem-sync", "userId": "me", "salt": "...", "token": "..." },
|
|
260
|
+
{ "name": "backup", "serverUrl": "https://server2/hmem-sync", "userId": "me", "salt": "...", "token": "..." }
|
|
261
261
|
]
|
|
262
262
|
}
|
|
263
263
|
```
|
|
264
264
|
|
|
265
265
|
### Announcements
|
|
266
266
|
|
|
267
|
-
|
|
267
|
+
Broadcast to all synced agents across all devices:
|
|
268
268
|
|
|
269
269
|
```bash
|
|
270
|
-
npx hmem-sync announce --message
|
|
270
|
+
npx hmem-sync announce --message "Server URL changing — update your config!"
|
|
271
271
|
```
|
|
272
272
|
|
|
273
273
|
|
|
@@ -309,27 +309,26 @@ Run `npm root -g` to get the correct `node_modules` path for your machine.
|
|
|
309
309
|
|
|
310
310
|
## Troubleshooting
|
|
311
311
|
|
|
312
|
-
| Problem |
|
|
312
|
+
| Problem | Fix |
|
|
313
313
|
|---------|-----|
|
|
314
|
-
| `read_memory()`
|
|
315
|
-
| nvm: `node not
|
|
316
|
-
| Hooks not firing | Restart
|
|
317
|
-
| Exchanges not logged |
|
|
318
|
-
| Sync fails | Run `npx hmem-
|
|
314
|
+
| `read_memory()` fails | Check `HMEM_PROJECT_DIR` is absolute path and directory exists |
|
|
315
|
+
| nvm: `node not found` | Use absolute path: `which node` → use as `"command"` |
|
|
316
|
+
| Hooks not firing | Restart Claude Code. Check `~/.claude/settings.json` has all 4 hooks |
|
|
317
|
+
| Exchanges not logged | Check `HMEM_AGENT_ID` matches your `Agents/` directory name |
|
|
318
|
+
| Sync fails | Run `npx hmem-sync connect` to re-authenticate |
|
|
319
319
|
|
|
320
320
|
---
|
|
321
321
|
|
|
322
|
-
##
|
|
322
|
+
## Updating
|
|
323
323
|
|
|
324
324
|
```bash
|
|
325
325
|
npm update -g hmem-mcp # MCP server
|
|
326
|
-
npm update -g hmem-sync #
|
|
326
|
+
npm update -g hmem-sync # Sync (if installed)
|
|
327
327
|
npx hmem update-skills # Refresh skill files
|
|
328
328
|
```
|
|
329
329
|
|
|
330
330
|
---
|
|
331
331
|
|
|
332
|
-
##
|
|
332
|
+
## License
|
|
333
333
|
|
|
334
334
|
MIT
|
|
335
|
-
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli-stats.ts
|
|
3
|
+
*
|
|
4
|
+
* Shows per-project token size estimates and global memory stats.
|
|
5
|
+
* Helps identify projects approaching the curation threshold (R0018: >4k tokens = trigger).
|
|
6
|
+
*
|
|
7
|
+
* Usage: hmem stats [project-id]
|
|
8
|
+
*/
|
|
9
|
+
export declare function printStats(filterProject?: string): Promise<void>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli-stats.ts
|
|
3
|
+
*
|
|
4
|
+
* Shows per-project token size estimates and global memory stats.
|
|
5
|
+
* Helps identify projects approaching the curation threshold (R0018: >4k tokens = trigger).
|
|
6
|
+
*
|
|
7
|
+
* Usage: hmem stats [project-id]
|
|
8
|
+
*/
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { resolveEnvDefaults } from "./cli-env.js";
|
|
11
|
+
import { HmemStore } from "./hmem-store.js";
|
|
12
|
+
import { loadHmemConfig } from "./hmem-config.js";
|
|
13
|
+
const C = {
|
|
14
|
+
green: "\x1b[01;32m",
|
|
15
|
+
yellow: "\x1b[01;33m",
|
|
16
|
+
red: "\x1b[01;31m",
|
|
17
|
+
cyan: "\x1b[00;36m",
|
|
18
|
+
gray: "\x1b[00;90m",
|
|
19
|
+
white: "\x1b[00;37m",
|
|
20
|
+
bold: "\x1b[01m",
|
|
21
|
+
reset: "\x1b[00m",
|
|
22
|
+
};
|
|
23
|
+
// R0018 thresholds (chars, not tokens — 1 token ≈ 4 chars)
|
|
24
|
+
const RED_THRESHOLD = 16_000; // ~4k tokens
|
|
25
|
+
const YELLOW_THRESHOLD = 14_000; // ~3.5k tokens
|
|
26
|
+
function sizeColor(chars) {
|
|
27
|
+
if (chars >= RED_THRESHOLD)
|
|
28
|
+
return C.red;
|
|
29
|
+
if (chars >= YELLOW_THRESHOLD)
|
|
30
|
+
return C.yellow;
|
|
31
|
+
return C.green;
|
|
32
|
+
}
|
|
33
|
+
function sizeLabel(chars) {
|
|
34
|
+
const tokens = Math.round(chars / 4);
|
|
35
|
+
if (tokens >= 1000)
|
|
36
|
+
return `~${(tokens / 1000).toFixed(1)}k tokens`;
|
|
37
|
+
return `~${tokens} tokens`;
|
|
38
|
+
}
|
|
39
|
+
function relativeDate(iso) {
|
|
40
|
+
if (!iso)
|
|
41
|
+
return "never";
|
|
42
|
+
const diff = Date.now() - new Date(iso).getTime();
|
|
43
|
+
const days = Math.floor(diff / 86_400_000);
|
|
44
|
+
if (days === 0)
|
|
45
|
+
return "today";
|
|
46
|
+
if (days === 1)
|
|
47
|
+
return "yesterday";
|
|
48
|
+
if (days < 30)
|
|
49
|
+
return `${days}d ago`;
|
|
50
|
+
return `${Math.floor(days / 30)}mo ago`;
|
|
51
|
+
}
|
|
52
|
+
export async function printStats(filterProject) {
|
|
53
|
+
resolveEnvDefaults();
|
|
54
|
+
const hmemPath = process.env.HMEM_PATH;
|
|
55
|
+
if (!hmemPath) {
|
|
56
|
+
console.error("HMEM_PATH not set.");
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
const dir = path.dirname(hmemPath);
|
|
60
|
+
const config = loadHmemConfig(dir);
|
|
61
|
+
const store = new HmemStore(hmemPath, config);
|
|
62
|
+
const global = store.stats();
|
|
63
|
+
const projects = store.projectTokenStats();
|
|
64
|
+
const totalTokens = Math.round(global.totalChars / 4);
|
|
65
|
+
console.log(`\n${C.bold}hmem stats${C.reset} ${C.gray}${path.basename(hmemPath)}${C.reset}`);
|
|
66
|
+
console.log(`${C.gray}${"─".repeat(60)}${C.reset}`);
|
|
67
|
+
console.log(` Total entries : ${C.white}${global.total}${C.reset}`);
|
|
68
|
+
console.log(` Total size : ${C.white}${totalTokens >= 1000 ? (totalTokens / 1000).toFixed(0) + "k" : totalTokens} tokens${C.reset} ${C.gray}(${(global.totalChars / 1024).toFixed(0)} KB)${C.reset}`);
|
|
69
|
+
if (global.staleCount > 0) {
|
|
70
|
+
console.log(` Stale (60d+) : ${C.yellow}${global.staleCount} entries${C.reset}`);
|
|
71
|
+
}
|
|
72
|
+
const prefixOrder = ["P", "L", "T", "E", "D", "R", "O", "I", "H", "M", "S", "N", "C", "A"];
|
|
73
|
+
const prefixLine = prefixOrder
|
|
74
|
+
.filter(p => global.byPrefix[p])
|
|
75
|
+
.map(p => `${C.gray}${p}${C.reset}${C.white}${global.byPrefix[p]}${C.reset}`)
|
|
76
|
+
.join(" ");
|
|
77
|
+
console.log(` By prefix : ${prefixLine}`);
|
|
78
|
+
const filtered = filterProject
|
|
79
|
+
? projects.filter(p => p.id.toLowerCase() === filterProject.toLowerCase())
|
|
80
|
+
: projects;
|
|
81
|
+
if (filtered.length === 0) {
|
|
82
|
+
console.log(`\n ${C.gray}No matching projects.${C.reset}\n`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
console.log(`\n${C.bold}Projects — load_project size estimate${C.reset} ${C.gray}(R0018: >4k = curate)${C.reset}`);
|
|
86
|
+
console.log(`${C.gray}${"─".repeat(60)}${C.reset}`);
|
|
87
|
+
for (const p of filtered) {
|
|
88
|
+
const color = sizeColor(p.estChars);
|
|
89
|
+
const flag = p.estChars >= RED_THRESHOLD ? " 🔴" : p.estChars >= YELLOW_THRESHOLD ? " 🟡" : "";
|
|
90
|
+
const activeMarker = p.active ? ` ${C.cyan}●${C.reset}` : "";
|
|
91
|
+
const label = sizeLabel(p.estChars);
|
|
92
|
+
const date = relativeDate(p.lastAccessed);
|
|
93
|
+
const idPart = `${C.cyan}${p.id}${C.reset}`;
|
|
94
|
+
const namePart = p.title.length > 28 ? p.title.substring(0, 27) + "…" : p.title.padEnd(28);
|
|
95
|
+
const sizePart = `${color}${label}${C.reset}${flag}`;
|
|
96
|
+
const datePart = `${C.gray}${date}${C.reset}`;
|
|
97
|
+
console.log(` ${idPart}${activeMarker} ${namePart} ${sizePart} ${datePart}`);
|
|
98
|
+
}
|
|
99
|
+
console.log(`\n${C.gray}Thresholds: 🟡 ~3.5k tokens 🔴 ~4k tokens${C.reset}\n`);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=cli-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-stats.js","sourceRoot":"","sources":["../src/cli-stats.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -62,6 +62,11 @@ switch (command) {
|
|
|
62
62
|
await summarizeSession(process.argv[3] || "");
|
|
63
63
|
break;
|
|
64
64
|
}
|
|
65
|
+
case "stats": {
|
|
66
|
+
const { printStats } = await import("./cli-stats.js");
|
|
67
|
+
await printStats(process.argv[3]);
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
65
70
|
case "delete": {
|
|
66
71
|
const { deleteEntry } = await import("./cli-delete.js");
|
|
67
72
|
await deleteEntry(process.argv.slice(3));
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,kFAAkF;AAClF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;AAC5C,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,OAAO;QACV,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAChC,MAAM;IAER,KAAK,MAAM,CAAC,CAAC,CAAC;QACZ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAClD,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM;IACR,CAAC;IAED,KAAK,eAAe,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACvD,YAAY,EAAE,CAAC;QACf,MAAM;IACR,CAAC;IAED,KAAK,cAAc,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC9D,MAAM,WAAW,EAAE,CAAC;QACpB,MAAM;IACR,CAAC;IAED,KAAK,gBAAgB,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAClE,MAAM,aAAa,EAAE,CAAC;QACtB,MAAM;IACR,CAAC;IAED,KAAK,YAAY,CAAC,CAAC,CAAC;QAClB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC3D,MAAM,UAAU,EAAE,CAAC;QACnB,MAAM;IACR,CAAC;IAED,KAAK,YAAY,CAAC,CAAC,CAAC;QAClB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC3D,MAAM,UAAU,EAAE,CAAC;QACnB,MAAM;IACR,CAAC;IAED,KAAK,cAAc,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC9D,MAAM,WAAW,EAAE,CAAC;QACpB,MAAM;IACR,CAAC;IAED,KAAK,YAAY,CAAC,CAAC,CAAC;QAClB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC3D,MAAM,UAAU,EAAE,CAAC;QACnB,MAAM;IACR,CAAC;IAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;QACzB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QACtE,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACxD,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM;IACR,CAAC;IAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;QACzB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC/D,MAAM,eAAe,EAAE,CAAC;QACxB,MAAM;IACR,CAAC;IAED,KAAK,YAAY,CAAC,CAAC,CAAC;QAClB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC1D,MAAM,SAAS,EAAE,CAAC;QAClB,MAAM;IACR,CAAC;IAED,KAAK,SAAS,CAAC;IACf,KAAK,WAAW,CAAC;IACjB,KAAK,IAAI,CAAC,CAAC,CAAC;QACV,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACnC,MAAM;IACR,CAAC;IAED;QACE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6EAiC6D,CAAC,CAAC;QAC3E,MAAM;AACV,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/hmem-store.d.ts
CHANGED
|
@@ -309,6 +309,17 @@ export declare class HmemStore {
|
|
|
309
309
|
totalChars: number;
|
|
310
310
|
staleCount: number;
|
|
311
311
|
};
|
|
312
|
+
/**
|
|
313
|
+
* Per-project token size estimates for `hmem stats`.
|
|
314
|
+
* Measures load_project payload size: level_1 + all node content/titles at depth ≤ 3.
|
|
315
|
+
*/
|
|
316
|
+
projectTokenStats(): Array<{
|
|
317
|
+
id: string;
|
|
318
|
+
title: string;
|
|
319
|
+
estChars: number;
|
|
320
|
+
lastAccessed: string | null;
|
|
321
|
+
active: number;
|
|
322
|
+
}>;
|
|
312
323
|
/**
|
|
313
324
|
* Update specific fields of an existing root entry (curator use only).
|
|
314
325
|
*/
|