claude-memory-admin 1.5.0 → 1.5.2

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 CHANGED
@@ -19,17 +19,26 @@ and this README were written by Claude Code, with a human directing the design
19
19
  and reviewing what landed. Fitting for a tool about what Claude writes for
20
20
  itself, and worth saying out loud.
21
21
 
22
- <sub>Brought to you by [BitSpire](https://bitspire.ch/).</sub>
23
-
24
22
  ---
25
23
 
26
24
  ### Prune: see what MEMORY.md actually costs you
27
25
 
28
26
  ![The Prune tab, showing how much of the MEMORY.md load limit a project uses and a sortable list of memories by age, size and inbound links](assets/prune.webp)
29
27
 
28
+ ### Health: every problem found, worst first
29
+
30
+ ![The Health tab in the light theme, listing checks ranked by severity: a broken wikilink, a memory no index entry points at, index hooks over 200 characters, hooks that only restate the file's own description, and an empty section](assets/health.webp)
31
+
30
32
  ### Graph: see how memories link to each other
31
33
 
32
- ![The Graph tab, showing memories as nodes coloured by type with wikilinks as edges](assets/graph.webp)
34
+ ![The Graph tab, showing memories as nodes coloured by type with wikilinks as edges, orphans below a dashed line and a dashed outline where a link points at nothing](assets/graph.webp)
35
+
36
+ ### Context: what every session loads before a project is even chosen
37
+
38
+ ![The Global entry's Context tab, showing the estimated token cost of the user-scope instruction files, a file reached twice through both an import and the rules directory, and the order the files load in](assets/context.webp)
39
+
40
+ There is a light theme and a dark one, toggled with `t`; the Health shot above is
41
+ the light one and the rest are dark.
33
42
 
34
43
  ---
35
44
 
@@ -106,7 +115,11 @@ project is to the cliff, and makes it quick to get back under it.
106
115
  memory exists can no longer be traced from anything on disk.
107
116
  - **Sessions**: the transcripts beside a store, with the retention window drawn
108
117
  the way MEMORY.md's cutoff is - each session a tick, the sweep line where it
109
- falls. Titles are the ones Claude Code generated, falling back to the session
118
+ falls. Under it, a tile per day shades how much work that day held, and
119
+ clicking one narrows the list to it; the grid spans the retention window
120
+ rather than a fixed year, because a year of empty tiles would read as *no
121
+ sessions* when it only means *already swept*. Titles are the ones Claude Code
122
+ generated, falling back to the session
110
123
  slug and then the opening prompt; a session that names itself nowhere in the
111
124
  part read is shown by id rather than given an invented name. Only the head of
112
125
  each file is ever read, so a 200MB store of transcripts costs a quarter of a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-memory-admin",
3
- "version": "1.5.0",
3
+ "version": "1.5.2",
4
4
  "description": "Browse, audit and prune the auto memory Claude Code keeps under ~/.claude/projects",
5
5
  "keywords": [
6
6
  "claude",
package/public/api.mjs ADDED
@@ -0,0 +1,26 @@
1
+ import * as ui from '/ui.mjs';
2
+ import { el, node } from '/dom.mjs';
3
+
4
+ export async function api(path, options) {
5
+ const response = await fetch(path, {
6
+ headers: { 'content-type': 'application/json' },
7
+ ...options,
8
+ });
9
+ const data = await response.json().catch(() => ({ error: 'Bad response from server' }));
10
+ if (!response.ok) throw new Error(data.error || `Request failed (${response.status})`);
11
+ return data;
12
+ }
13
+
14
+ export function toast(message, { error = false, action } = {}) {
15
+ const element = node('div', { class: ui.toast(error) });
16
+ element.append(document.createTextNode(message));
17
+ if (action) {
18
+ element.append(node('button', {
19
+ class: ui.toastAction,
20
+ text: action.label,
21
+ onclick: () => { element.remove(); action.run(); },
22
+ }));
23
+ }
24
+ el('toast-root').append(element);
25
+ setTimeout(() => element.remove(), action ? 12000 : 4500);
26
+ }