@vinh0809it/claude-sessions 0.1.0 → 0.2.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 (3) hide show
  1. package/README.md +49 -36
  2. package/index.js +673 -289
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -1,38 +1,30 @@
1
1
  # claude-sessions
2
2
 
3
- A zero-dependency terminal UI for browsing, resuming, moving, and deleting [Claude Code](https://claude.ai/code) sessions.
3
+ A zero-dependency terminal UI for browsing, previewing, resuming, renaming, moving, and deleting [Claude Code](https://claude.ai/code) sessions.
4
4
 
5
- ```
6
- claude-sessions path:/home/you/projects/acme
7
- [.claude-main]
8
- /home/you/projects/acme/api
9
- > booking-overlap-check 2026-05-11 23:00
10
- ekyc-japan-fallback 2026-05-11 22:52
11
- [.claude-company]
12
- /home/you/projects/acme/api
13
- payment-status-check 2026-05-11 16:10
14
- ↑↓/jk=nav /=search Enter=open n=new m=move d=del q=quit [42]
15
- ```
5
+ ![claude-sessions demo](https://raw.githubusercontent.com/vinh0809it/claude-sessions/main/docs/demo.gif)
16
6
 
17
7
  ## Features
18
8
 
19
- - **Auto-discovers** all `~/.claude*` config directories — works with multiple Claude Code profiles out of the box
20
- - **Live search** across session titles and first messages; results show `[profile] project ›` inline
21
- - **Open in new tab** — press Enter to resume a session in a new terminal tab (kitty, WezTerm, tmux, or custom)
22
- - **New session** — press `n` to open a fresh Claude session in any profile and folder
23
- - **Move sessions** — press `m` to move a session to a different profile, an existing folder, or a custom path
24
- - **Delete sessions** with confirmation (removes both the `.jsonl` file and companion directory)
25
- - **Filter by folder** — pass a path to scope the list to sessions in that directory tree
9
+ - **Fast** — reads only the head and tail of each session file and caches the result, so even multi-GB histories load in well under a second
10
+ - **Auto-discovers** all `~/.claude*` config directories and `$CLAUDE_CONFIG_DIR` — multiple Claude Code profiles just work
11
+ - **Live search** across session titles, first messages and project paths
12
+ - **Preview** — press `p` to see the last few messages of the selected session
13
+ - **Resume anywhere** — `Enter` opens a new tab in kitty, WezTerm, tmux, iTerm2 or Terminal.app, and otherwise resumes right in the current terminal (you return to the list when Claude exits). `o` always resumes in place
14
+ - **Rename** — press `r`; writes the same record `/rename` does
15
+ - **Move** sessions to another profile, an existing folder, or a typed path
16
+ - **Delete safely** — sessions go to a trash folder; mark several with `Space` to delete in bulk; `--empty-trash` frees the space
17
+ - **Sort** by date, size or name — find the huge sessions eating your disk
26
18
  - Zero runtime dependencies — pure Node.js stdlib
27
19
 
28
20
  ## Install
29
21
 
30
22
  ```sh
31
23
  # Global install (recommended)
32
- npm install -g cli-claude-sessions
24
+ npm install -g @vinh0809it/claude-sessions
33
25
 
34
26
  # Or run without installing
35
- npx cli-claude-sessions
27
+ npx @vinh0809it/claude-sessions
36
28
 
37
29
  # Or manually
38
30
  curl -fsSL https://raw.githubusercontent.com/vinh0809it/claude-sessions/main/index.js \
@@ -50,8 +42,12 @@ claude-sessions --named-only # Only show /rename'd sessions
50
42
  claude-sessions --list # Plain list (pipe-friendly)
51
43
  claude-sessions --json # JSON output
52
44
  claude-sessions -d ~/.claude-work # Scan a specific config dir
45
+ claude-sessions --empty-trash # Permanently remove deleted sessions
46
+ claude-sessions --no-cache # Ignore the metadata cache
53
47
  ```
54
48
 
49
+ Tip: `alias ccs=claude-sessions`
50
+
55
51
  ### TUI keys
56
52
 
57
53
  | Key | Action |
@@ -59,12 +55,18 @@ claude-sessions -d ~/.claude-work # Scan a specific config dir
59
55
  | `↑` `↓` / `j` `k` | Navigate |
60
56
  | `PgUp` `PgDn` | Page up / down |
61
57
  | `g` / `G` | Jump to top / bottom |
62
- | `/` | Search by title or message content |
63
- | `Esc` | Clear search |
64
- | `Enter` | Open session in a new terminal tab |
58
+ | `/` | Search by title, message or path |
59
+ | `Esc` | Clear search and marks |
60
+ | `Enter` | Open session (new tab if supported, otherwise here) |
61
+ | `o` | Open session in this terminal |
62
+ | `p` | Toggle preview of recent messages |
63
+ | `r` | Rename session |
64
+ | `s` | Cycle sort: date / size / name |
65
+ | `Space` | Mark session for bulk delete |
65
66
  | `n` | New session (choose profile + folder) |
66
67
  | `m` | Move session to another profile / folder |
67
- | `d` | Delete session (asks confirmation) |
68
+ | `d` | Move marked (or selected) sessions to trash |
69
+ | `?` | Help |
68
70
  | `q` / `Ctrl-C` | Quit |
69
71
 
70
72
  ## Multiple profiles
@@ -79,16 +81,20 @@ alias claude-work='CLAUDE_CONFIG_DIR=~/.claude-work claude'
79
81
 
80
82
  Sessions are grouped by profile in the UI. Press `m` to move a session to a different profile or folder (including a custom typed path). Press `n` to open a new session in any profile and folder.
81
83
 
82
- ## Open in new tab
84
+ ## Opening sessions
83
85
 
84
- Press `Enter` on any session to resume it in a new terminal tab. The terminal is auto-detected:
86
+ `Enter` opens the session in a new tab when the terminal supports it, and otherwise runs `claude -r <id>` right in the current terminal — when Claude exits you're back in the list.
85
87
 
86
88
  | Terminal | Support | Notes |
87
89
  |----------|---------|-------|
88
- | **Kitty** | ✅ | Requires `allow_remote_control yes` in `kitty.conf` |
89
- | **WezTerm** | ✅ | Uses `wezterm cli spawn` |
90
- | **tmux** | ✅ | Opens a new window in the current session |
91
- | Others | ⚙️ | Use `CLAUDE_SESSIONS_OPEN_CMD` |
90
+ | **Kitty** | ✅ new tab | Requires `allow_remote_control yes` in `kitty.conf` |
91
+ | **WezTerm** | ✅ new tab | Uses `wezterm cli spawn` |
92
+ | **tmux** | ✅ new window | In the current session |
93
+ | **iTerm2** | ✅ new tab | Via `osascript` |
94
+ | **Terminal.app** | ✅ new window | Via `osascript` |
95
+ | Anything else | ✅ same terminal | GNOME Terminal, Ghostty, VS Code, … |
96
+
97
+ Set `CLAUDE_SESSIONS_TERMINAL=here` to always resume in place.
92
98
 
93
99
  ### Custom open command
94
100
 
@@ -101,17 +107,23 @@ export CLAUDE_SESSIONS_OPEN_CMD="ghostty --command=bash -i -c %cmd%"
101
107
  # iTerm2 via osascript
102
108
  export CLAUDE_SESSIONS_OPEN_CMD="osascript -e 'tell app \"iTerm\" to create window with default profile command \"bash -i -c %cmd%\"'"
103
109
 
104
- # Force a specific supported terminal
110
+ # Force a specific mode: kitty | wezterm | tmux | iterm2 | apple-terminal | here
105
111
  export CLAUDE_SESSIONS_TERMINAL=wezterm
106
112
  ```
107
113
 
108
114
  ## How sessions are stored
109
115
 
110
- Claude Code stores sessions in `~/.claude*/projects/<encoded-path>/<uuid>.jsonl`. Each line is a JSON record. `claude-sessions` reads:
116
+ Claude Code stores sessions in `~/.claude*/projects/<encoded-path>/<uuid>.jsonl`, where `<encoded-path>` is the project path with every non-alphanumeric character replaced by `-`. Each line is a JSON record. `claude-sessions` reads:
117
+
118
+ - `type: "custom-title"` → the name set by `/rename` (the last one wins)
119
+ - First real `type: "user"` message → shown as a fallback title
120
+ - `cwd` field → the project path (used for filtering and resuming)
121
+
122
+ Only the first and last 256 KB of each file are read. Results are cached in `~/.cache/claude-sessions/index.json` (or `$XDG_CACHE_HOME`), keyed by file size and mtime.
123
+
124
+ Deleted sessions are moved to `<config dir>/.claude-sessions-trash/`; run `claude-sessions --empty-trash` to remove them for good.
111
125
 
112
- - `type: "custom-title"` → the name set by `/rename`
113
- - First `type: "user"` message → shown as a fallback title
114
- - `cwd` field → the actual project path (used for filtering)
126
+ > **Renaming a session that is open in Claude Code:** Claude keeps re-writing its own title, so rename it from inside that session with `/rename` instead.
115
127
 
116
128
  ## Contributing
117
129
 
@@ -123,6 +135,7 @@ cd claude-sessions
123
135
  node index.js # run directly
124
136
  npm link # install globally from source
125
137
  npm test # run the test suite (Node built-in test runner, no extra deps)
138
+ scripts/demo/record.sh # re-record docs/demo.gif from fake sessions (needs Pillow + ffmpeg)
126
139
  ```
127
140
 
128
141
  ## License