claude-starter 1.3.4 → 1.4.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 +126 -113
- package/index.js +114 -47
- package/package.json +15 -3
package/README.md
CHANGED
|
@@ -11,8 +11,12 @@
|
|
|
11
11
|
<h1 align="center">🚀 Claude Starter</h1>
|
|
12
12
|
|
|
13
13
|
<p align="center">
|
|
14
|
-
<strong>Claude Code
|
|
15
|
-
<strong>
|
|
14
|
+
<strong>Your homepage for Claude Code.</strong> All your sessions, at a glance.<br/>
|
|
15
|
+
<strong>Claude Code 的主页。</strong>你的所有会话,一目了然。
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
<p align="center">
|
|
19
|
+
Built for <strong>AI-native developer workflows</strong>: local-first, searchable, resumable, and fast — so the next session starts faster than the last one ended.
|
|
16
20
|
</p>
|
|
17
21
|
|
|
18
22
|
<p align="center">
|
|
@@ -25,122 +29,14 @@
|
|
|
25
29
|
|
|
26
30
|
---
|
|
27
31
|
|
|
28
|
-
#
|
|
29
|
-
|
|
30
|
-
## 痛点
|
|
31
|
-
|
|
32
|
-
用过 Claude Code 的 `/resume` 吗?它给你的是这样一坨东西:
|
|
33
|
-
|
|
34
|
-
```
|
|
35
|
-
? Select a conversation
|
|
36
|
-
3ee0f33a-b882-424f-9ba4-260342e4dd5b - 4/3/2026, 10:53:41 AM
|
|
37
|
-
87570bab-ee92-4681-9591-54abf2fcb486 - 4/3/2026, 10:18:55 AM
|
|
38
|
-
...200 个 UUID...
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
一堆 UUID,没有上下文,无法搜索。**想找到上周帮你调过 bug 的那个 session?祝你好运。**
|
|
42
|
-
|
|
43
|
-
## 解决方案
|
|
44
|
-
|
|
45
|
-
**Claude Starter** 是一个精美的终端可视化工具,让你能像浏览网页一样浏览所有 Claude 历史会话。它是你的 **Claude 主页** —— 每次打开终端,`claude-starter` 一敲,所有 session 一目了然。
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
claude-starter
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
精美的分屏 UI,Tokyo Night 配色。左侧列表一目了然,右侧实时预览对话详情。不是 UUID,是你**真正说过的话**。
|
|
52
|
-
|
|
53
|
-
## 🔍 搜索 — 杀手级功能
|
|
54
|
-
|
|
55
|
-
按 `/` 开始输入,**就这么简单**。无需按回车。
|
|
56
|
-
|
|
57
|
-
跨项目名、Git 分支、对话内容**全文实时搜索**。输入即过滤,`↑↓` 直接导航结果。
|
|
58
|
-
|
|
59
|
-
- `auth` → 所有认证相关的对话
|
|
60
|
-
- `refactor` → 上周的代码重构
|
|
61
|
-
- `web-app fix` → 某个项目的 bug 修复
|
|
62
|
-
|
|
63
|
-
**不需要管理模式,不需要确认。输入即搜,方向键即走。**
|
|
64
|
-
|
|
65
|
-
## 核心能力
|
|
66
|
-
|
|
67
|
-
| | 功能 | 说明 |
|
|
68
|
-
|---|---|---|
|
|
69
|
-
| 🎨 | **精美 TUI** | Tokyo Night 配色,分屏布局,终端里的 App |
|
|
70
|
-
| ✨ | **一键新建** | 列表顶部直接新建对话 |
|
|
71
|
-
| 🔍 | **即时搜索** | `/` 全文搜索,无需回车 |
|
|
72
|
-
| 📂 | **项目过滤** | `p` 按项目筛选 |
|
|
73
|
-
| ⚡ | **秒级恢复** | 选中 → Enter → 回到对话 |
|
|
74
|
-
| 📋 | **对话预览** | 右侧面板展示完整元数据和对话历史 |
|
|
75
|
-
| 🔀 | **多种排序** | 时间 / 大小 / 消息数 / 项目 |
|
|
76
|
-
| 📎 | **复制 ID** | `c` 一键复制到剪贴板 |
|
|
77
|
-
| 🔒 | **权限模式** | `m` 设置权限模式,`d` 一键 danger 模式恢复 |
|
|
78
|
-
| ✏️ | **重命名会话** | `r` 直接重命名,支持中文输入 |
|
|
79
|
-
| 🗑️ | **删除会话** | `x` 删除不需要的会话 |
|
|
80
|
-
| ⌨️ | **Vim 快捷键** | `j`/`k` 上下,`g`/`G` 跳顶/底 |
|
|
81
|
-
| 🧠 | **智能 CLI** | 自动检测 `mai-claude` / `claude` |
|
|
82
|
-
| 🔐 | **完全本地** | 不联网,不上传,不追踪 |
|
|
83
|
-
|
|
84
|
-
## 安装
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
npm install -g claude-starter
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
或者从源码安装:
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
git clone https://github.com/Bojun-Vvibe/claude-starter.git
|
|
94
|
-
cd claude-starter
|
|
95
|
-
npm install
|
|
96
|
-
npm link
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
然后运行 `claude-starter`,就这么简单。
|
|
100
|
-
|
|
101
|
-
## CLI 参数
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
claude-starter # 启动交互式 TUI
|
|
105
|
-
claude-starter --list [N] # 打印最近 N 个会话(默认 30)
|
|
106
|
-
claude-starter --version # 显示版本号
|
|
107
|
-
claude-starter --update # 检查并更新到最新版本
|
|
108
|
-
claude-starter --help # 显示帮助信息
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
## 快捷键
|
|
112
|
-
|
|
113
|
-
| 按键 | 功能 |
|
|
114
|
-
|:---:|------|
|
|
115
|
-
| `↑` `↓` / `j` `k` | 上下导航 |
|
|
116
|
-
| `Enter` | 新建 / 恢复对话 |
|
|
117
|
-
| `n` | 直接新建 |
|
|
118
|
-
| `d` | Danger 模式恢复(bypassPermissions) |
|
|
119
|
-
| `m` | 权限模式选择器 |
|
|
120
|
-
| `r` | 重命名会话 |
|
|
121
|
-
| `/` | 搜索 |
|
|
122
|
-
| `Backspace` | 删除搜索字符,删空自动退出 |
|
|
123
|
-
| `Esc` | 清空搜索 |
|
|
124
|
-
| `p` | 按项目过滤 |
|
|
125
|
-
| `s` | 切换排序(时间/大小/消息数/项目) |
|
|
126
|
-
| `c` | 复制 Session ID |
|
|
127
|
-
| `x` / `Delete` | 删除会话 |
|
|
128
|
-
| `g` / `G` | 跳到顶 / 底 |
|
|
129
|
-
| `Ctrl-D` / `Ctrl-U` | 翻页 |
|
|
130
|
-
| `q` / `Ctrl-C` | 退出 |
|
|
131
|
-
|
|
132
|
-
## 原理
|
|
133
|
-
|
|
134
|
-
读取 `~/.claude/projects/` 下的 JSONL 会话文件,解析元数据和对话内容。200 个 session 加载耗时 ~10ms。**所有数据留在本地,不联网。**
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
# 🇬🇧 English
|
|
32
|
+
# English
|
|
139
33
|
|
|
140
34
|
## The Problem
|
|
141
35
|
|
|
142
36
|
Claude Code's `/resume` gives you a wall of UUIDs:
|
|
143
37
|
|
|
38
|
+
If you use Claude Code as part of a real development loop, session history stops being archive data and becomes working context. You need to find old agent work by repo, topic, and intent — not by opaque IDs.
|
|
39
|
+
|
|
144
40
|
```
|
|
145
41
|
? Select a conversation
|
|
146
42
|
3ee0f33a-b882-424f-9ba4-260342e4dd5b - 4/3/2026, 10:53:41 AM
|
|
@@ -158,6 +54,8 @@ claude-starter
|
|
|
158
54
|
|
|
159
55
|
Beautiful split-pane UI with Tokyo Night colors. The left panel shows every session with project, time, and topic. The right panel previews the full conversation. Not UUIDs — your **actual words**.
|
|
160
56
|
|
|
57
|
+
`claude-starter` is built for developers treating coding agents as part of a daily workflow: keep everything local, cut resume friction, and make past conversations actually reusable.
|
|
58
|
+
|
|
161
59
|
## 🔍 Search — The Killer Feature
|
|
162
60
|
|
|
163
61
|
Press `/` and start typing. **That's it.** No Enter needed.
|
|
@@ -250,12 +148,127 @@ Reads the JSONL session files from `~/.claude/projects/`, parses metadata and co
|
|
|
250
148
|
- **Node.js** >= 18
|
|
251
149
|
- **Claude Code** ([`claude`](https://docs.anthropic.com/en/docs/claude-code) in PATH)
|
|
252
150
|
|
|
151
|
+
## Related Projects
|
|
152
|
+
|
|
153
|
+
- **[codex-starter](https://github.com/Bojun-Vvibe/codex-starter)** — the Codex counterpart with the same local-first workflow philosophy
|
|
154
|
+
- **[Bojun-Vvibe](https://github.com/Bojun-Vvibe)** — more terminal UX and AI-native workflow experiments
|
|
155
|
+
|
|
253
156
|
## License
|
|
254
157
|
|
|
255
158
|
MIT
|
|
256
159
|
|
|
257
160
|
---
|
|
258
161
|
|
|
162
|
+
# 中文
|
|
163
|
+
|
|
164
|
+
## 痛点
|
|
165
|
+
|
|
166
|
+
用过 Claude Code 的 `/resume` 吗?它给你的是这样一坨东西:
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
? Select a conversation
|
|
170
|
+
3ee0f33a-b882-424f-9ba4-260342e4dd5b - 4/3/2026, 10:53:41 AM
|
|
171
|
+
87570bab-ee92-4681-9591-54abf2fcb486 - 4/3/2026, 10:18:55 AM
|
|
172
|
+
...200 个 UUID...
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
一堆 UUID,没有上下文,无法搜索。**想找到上周帮你调过 bug 的那个 session?祝你好运。**
|
|
176
|
+
|
|
177
|
+
## 解决方案
|
|
178
|
+
|
|
179
|
+
**Claude Starter** 是一个精美的终端可视化工具,让你能像浏览网页一样浏览所有 Claude 历史会话。它是你的 **Claude 主页** —— 每次打开终端,`claude-starter` 一敲,所有 session 一目了然。
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
claude-starter
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
精美的分屏 UI,Tokyo Night 配色。左侧列表一目了然,右侧实时预览对话详情。不是 UUID,是你**真正说过的话**。
|
|
186
|
+
|
|
187
|
+
## 🔍 搜索 — 杀手级功能
|
|
188
|
+
|
|
189
|
+
按 `/` 开始输入,**就这么简单**。无需按回车。
|
|
190
|
+
|
|
191
|
+
跨项目名、Git 分支、对话内容**全文实时搜索**。输入即过滤,`↑↓` 直接导航结果。
|
|
192
|
+
|
|
193
|
+
- `auth` → 所有认证相关的对话
|
|
194
|
+
- `refactor` → 上周的代码重构
|
|
195
|
+
- `web-app fix` → 某个项目的 bug 修复
|
|
196
|
+
|
|
197
|
+
**不需要管理模式,不需要确认。输入即搜,方向键即走。**
|
|
198
|
+
|
|
199
|
+
## 核心能力
|
|
200
|
+
|
|
201
|
+
| | 功能 | 说明 |
|
|
202
|
+
|---|---|---|
|
|
203
|
+
| 🎨 | **精美 TUI** | Tokyo Night 配色,分屏布局,终端里的 App |
|
|
204
|
+
| ✨ | **一键新建** | 列表顶部直接新建对话 |
|
|
205
|
+
| 🔍 | **即时搜索** | `/` 全文搜索,无需回车 |
|
|
206
|
+
| 📂 | **项目过滤** | `p` 按项目筛选 |
|
|
207
|
+
| ⚡ | **秒级恢复** | 选中 → Enter → 回到对话 |
|
|
208
|
+
| 📋 | **对话预览** | 右侧面板展示完整元数据和对话历史 |
|
|
209
|
+
| 🔀 | **多种排序** | 时间 / 大小 / 消息数 / 项目 |
|
|
210
|
+
| 📎 | **复制 ID** | `c` 一键复制到剪贴板 |
|
|
211
|
+
| 🔒 | **权限模式** | `m` 设置权限模式,`d` 一键 danger 模式恢复 |
|
|
212
|
+
| ✏️ | **重命名会话** | `r` 直接重命名,支持中文输入 |
|
|
213
|
+
| 🗑️ | **删除会话** | `x` 删除不需要的会话 |
|
|
214
|
+
| ⌨️ | **Vim 快捷键** | `j`/`k` 上下,`g`/`G` 跳顶/底 |
|
|
215
|
+
| 🧠 | **智能 CLI** | 自动检测 `mai-claude` / `claude` |
|
|
216
|
+
| 🔐 | **完全本地** | 不联网,不上传,不追踪 |
|
|
217
|
+
|
|
218
|
+
## 安装
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
npm install -g claude-starter
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
或者从源码安装:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
git clone https://github.com/Bojun-Vvibe/claude-starter.git
|
|
228
|
+
cd claude-starter
|
|
229
|
+
npm install
|
|
230
|
+
npm link
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
然后运行 `claude-starter`,就这么简单。
|
|
234
|
+
|
|
235
|
+
## CLI 参数
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
claude-starter # 启动交互式 TUI
|
|
239
|
+
claude-starter --list [N] # 打印最近 N 个会话(默认 30)
|
|
240
|
+
claude-starter --version # 显示版本号
|
|
241
|
+
claude-starter --update # 检查并更新到最新版本
|
|
242
|
+
claude-starter --help # 显示帮助信息
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## 快捷键
|
|
246
|
+
|
|
247
|
+
| 按键 | 功能 |
|
|
248
|
+
|:---:|------|
|
|
249
|
+
| `↑` `↓` / `j` `k` | 上下导航 |
|
|
250
|
+
| `Enter` | 新建 / 恢复对话 |
|
|
251
|
+
| `n` | 直接新建 |
|
|
252
|
+
| `d` | Danger 模式恢复(bypassPermissions) |
|
|
253
|
+
| `m` | 权限模式选择器 |
|
|
254
|
+
| `r` | 重命名会话 |
|
|
255
|
+
| `/` | 搜索 |
|
|
256
|
+
| `Backspace` | 删除搜索字符,删空自动退出 |
|
|
257
|
+
| `Esc` | 清空搜索 |
|
|
258
|
+
| `p` | 按项目过滤 |
|
|
259
|
+
| `s` | 切换排序(时间/大小/消息数/项目) |
|
|
260
|
+
| `c` | 复制 Session ID |
|
|
261
|
+
| `x` / `Delete` | 删除会话 |
|
|
262
|
+
| `g` / `G` | 跳到顶 / 底 |
|
|
263
|
+
| `Ctrl-D` / `Ctrl-U` | 翻页 |
|
|
264
|
+
| `q` / `Ctrl-C` | 退出 |
|
|
265
|
+
|
|
266
|
+
## 原理
|
|
267
|
+
|
|
268
|
+
读取 `~/.claude/projects/` 下的 JSONL 会话文件,解析元数据和对话内容。200 个 session 加载耗时 ~10ms。**所有数据留在本地,不联网。**
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
259
272
|
<p align="center">
|
|
260
273
|
<sub>Built with 💜 by <a href="https://github.com/Bojun-Vvibe">Bojun</a> — powered by Claude Code itself</sub>
|
|
261
274
|
</p>
|
package/index.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* claude-starter # Launch interactive TUI
|
|
10
10
|
* claude-starter --list # Print sessions as a table (no TUI)
|
|
11
11
|
* claude-starter --list N # Print the latest N sessions
|
|
12
|
+
* claude-starter --exclude "pat" # Exclude sessions matching regex (repeatable)
|
|
12
13
|
* claude-starter --version # Show version
|
|
13
14
|
* claude-starter --update # Update to the latest version
|
|
14
15
|
*
|
|
@@ -35,6 +36,10 @@ const path = require('path');
|
|
|
35
36
|
const { spawn, execSync } = require('child_process');
|
|
36
37
|
const os = require('os');
|
|
37
38
|
|
|
39
|
+
let excludePatterns = [];
|
|
40
|
+
|
|
41
|
+
function setExcludePatterns(patterns) { excludePatterns = patterns; }
|
|
42
|
+
|
|
38
43
|
// ─── CLI Detection ──────────────────────────────────────────────────────────
|
|
39
44
|
// Detect whether `mai-claude` is available (binary, alias, or function).
|
|
40
45
|
// First checks PATH directly, then sources shell config non-interactively
|
|
@@ -417,6 +422,7 @@ function loadAllSessions() {
|
|
|
417
422
|
if (session.firstTs
|
|
418
423
|
&& session.topic !== '(no user messages)'
|
|
419
424
|
&& !/^warmup$/i.test(session.topic.trim())
|
|
425
|
+
&& !excludePatterns.some(re => re.test(session.topic))
|
|
420
426
|
) sessions.push(session);
|
|
421
427
|
} catch (e) { /* skip */ }
|
|
422
428
|
}
|
|
@@ -1508,67 +1514,127 @@ function createApp() {
|
|
|
1508
1514
|
listPanel.focus();
|
|
1509
1515
|
}
|
|
1510
1516
|
|
|
1517
|
+
// ─── Exports for Testing ────────────────────────────────────────────────────
|
|
1518
|
+
// When required as a module (e.g. by tests), export helpers without launching
|
|
1519
|
+
// the CLI / TUI. The entry-point logic only runs when executed directly.
|
|
1520
|
+
|
|
1521
|
+
if (typeof module !== 'undefined') {
|
|
1522
|
+
module.exports = {
|
|
1523
|
+
// Data helpers
|
|
1524
|
+
getProjectDisplayName,
|
|
1525
|
+
extractUserText,
|
|
1526
|
+
loadSessionQuick,
|
|
1527
|
+
loadSessionDetail,
|
|
1528
|
+
loadAllSessions,
|
|
1529
|
+
// Formatting
|
|
1530
|
+
formatTimestamp,
|
|
1531
|
+
formatFileSize,
|
|
1532
|
+
getProjectColor,
|
|
1533
|
+
esc,
|
|
1534
|
+
// Meta
|
|
1535
|
+
loadMeta,
|
|
1536
|
+
saveMeta,
|
|
1537
|
+
getSessionMeta,
|
|
1538
|
+
getEffectivePermissionMode,
|
|
1539
|
+
setSessionPermissionMode,
|
|
1540
|
+
setGlobalPermissionMode,
|
|
1541
|
+
setExcludePatterns,
|
|
1542
|
+
// Constants
|
|
1543
|
+
PERMISSION_MODES,
|
|
1544
|
+
PROJECT_COLORS,
|
|
1545
|
+
CLAUDE_DIR,
|
|
1546
|
+
PROJECTS_DIR,
|
|
1547
|
+
META_FILE,
|
|
1548
|
+
// CLI
|
|
1549
|
+
detectCLI,
|
|
1550
|
+
// List mode (for integration tests)
|
|
1551
|
+
runListMode,
|
|
1552
|
+
// TUI (for interaction tests)
|
|
1553
|
+
createApp,
|
|
1554
|
+
};
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1511
1557
|
// ─── Entry Point ─────────────────────────────────────────────────────────────
|
|
1558
|
+
// Only run CLI/TUI when executed directly (not when required as a module).
|
|
1512
1559
|
|
|
1513
|
-
|
|
1560
|
+
if (require.main === module) {
|
|
1561
|
+
const PKG = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'), 'utf-8'));
|
|
1514
1562
|
|
|
1515
|
-
const args = process.argv.slice(2);
|
|
1563
|
+
const args = process.argv.slice(2);
|
|
1516
1564
|
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1565
|
+
for (let i = 0; i < args.length; i++) {
|
|
1566
|
+
if (args[i] === '--exclude' && args[i + 1]) {
|
|
1567
|
+
try { excludePatterns.push(new RegExp(args[i + 1], 'i')); } catch {}
|
|
1568
|
+
i++;
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
if (process.env.CLAUDE_STARTER_EXCLUDE) {
|
|
1572
|
+
for (const p of process.env.CLAUDE_STARTER_EXCLUDE.split(',')) {
|
|
1573
|
+
if (p.trim()) {
|
|
1574
|
+
try { excludePatterns.push(new RegExp(p.trim(), 'i')); } catch {}
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
}
|
|
1521
1578
|
|
|
1522
|
-
if (args.includes('--
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
red: '\x1b[31m',
|
|
1527
|
-
};
|
|
1528
|
-
console.log(`\n${C.cyan}🔄 Checking for updates…${C.reset}\n`);
|
|
1579
|
+
if (args.includes('--version') || args.includes('-v') || args.includes('-V')) {
|
|
1580
|
+
console.log(`claude-starter v${PKG.version}`);
|
|
1581
|
+
process.exit(0);
|
|
1582
|
+
}
|
|
1529
1583
|
|
|
1530
|
-
|
|
1531
|
-
const
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1584
|
+
if (args.includes('--update') || args.includes('-u')) {
|
|
1585
|
+
const C = {
|
|
1586
|
+
reset: '\x1b[0m', dim: '\x1b[2m', bold: '\x1b[1m',
|
|
1587
|
+
cyan: '\x1b[36m', yellow: '\x1b[33m', green: '\x1b[32m',
|
|
1588
|
+
red: '\x1b[31m',
|
|
1589
|
+
};
|
|
1590
|
+
console.log(`\n${C.cyan}🔄 Checking for updates…${C.reset}\n`);
|
|
1535
1591
|
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1592
|
+
try {
|
|
1593
|
+
const latest = execSync('npm view claude-starter version 2>/dev/null', {
|
|
1594
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
1595
|
+
timeout: 10000,
|
|
1596
|
+
}).toString().trim();
|
|
1597
|
+
|
|
1598
|
+
if (latest === PKG.version) {
|
|
1599
|
+
console.log(`${C.green}✓ Already on the latest version (v${PKG.version})${C.reset}\n`);
|
|
1600
|
+
process.exit(0);
|
|
1601
|
+
}
|
|
1540
1602
|
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1603
|
+
console.log(`${C.yellow} Current: v${PKG.version}${C.reset}`);
|
|
1604
|
+
console.log(`${C.green} Latest: v${latest}${C.reset}\n`);
|
|
1605
|
+
console.log(`${C.cyan}📦 Updating…${C.reset}\n`);
|
|
1544
1606
|
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1607
|
+
try {
|
|
1608
|
+
execSync('npm install -g claude-starter@latest', { stdio: 'inherit', timeout: 60000 });
|
|
1609
|
+
console.log(`\n${C.green}${C.bold}✓ Updated to v${latest}${C.reset}\n`);
|
|
1610
|
+
} catch (e) {
|
|
1611
|
+
console.error(`\n${C.red}✗ Update failed. Try manually:${C.reset}`);
|
|
1612
|
+
console.log(`${C.yellow} npm install -g claude-starter@latest${C.reset}\n`);
|
|
1613
|
+
process.exit(1);
|
|
1614
|
+
}
|
|
1548
1615
|
} catch (e) {
|
|
1549
|
-
console.error(
|
|
1550
|
-
console.log(`${C.yellow} npm install -g claude-starter@latest${C.reset}\n`);
|
|
1616
|
+
console.error(`${C.red}✗ Could not check for updates (network error or npm not found)${C.reset}\n`);
|
|
1551
1617
|
process.exit(1);
|
|
1552
1618
|
}
|
|
1553
|
-
} catch (e) {
|
|
1554
|
-
console.error(`${C.red}✗ Could not check for updates (network error or npm not found)${C.reset}\n`);
|
|
1555
|
-
process.exit(1);
|
|
1556
|
-
}
|
|
1557
1619
|
|
|
1558
|
-
|
|
1559
|
-
}
|
|
1620
|
+
process.exit(0);
|
|
1621
|
+
}
|
|
1560
1622
|
|
|
1561
|
-
if (args.includes('--help') || args.includes('-h')) {
|
|
1562
|
-
|
|
1623
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
1624
|
+
console.log(`
|
|
1563
1625
|
\x1b[36m🚀 Claude Starter\x1b[0m \x1b[2mv${PKG.version}\x1b[0m
|
|
1564
1626
|
|
|
1565
1627
|
Usage:
|
|
1566
1628
|
claude-starter Launch interactive TUI
|
|
1567
1629
|
claude-starter --list [N] Print latest N sessions (default: 30)
|
|
1630
|
+
claude-starter --exclude "pat" Exclude sessions matching regex (repeatable)
|
|
1568
1631
|
claude-starter --version Show version
|
|
1569
1632
|
claude-starter --update Update to the latest version
|
|
1570
1633
|
claude-starter --help Show this help
|
|
1571
1634
|
|
|
1635
|
+
Environment Variables:
|
|
1636
|
+
CLAUDE_STARTER_EXCLUDE=pat1,pat2 Comma-separated regex patterns to exclude
|
|
1637
|
+
|
|
1572
1638
|
TUI Keyboard Shortcuts:
|
|
1573
1639
|
↑/↓ Navigate sessions
|
|
1574
1640
|
Enter Start new / resume selected session
|
|
@@ -1585,14 +1651,15 @@ TUI Keyboard Shortcuts:
|
|
|
1585
1651
|
Esc Clear filter
|
|
1586
1652
|
q / Ctrl-C Quit
|
|
1587
1653
|
`);
|
|
1588
|
-
|
|
1589
|
-
}
|
|
1654
|
+
process.exit(0);
|
|
1655
|
+
}
|
|
1590
1656
|
|
|
1591
|
-
if (args.includes('--list') || args.includes('-l')) {
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
}
|
|
1657
|
+
if (args.includes('--list') || args.includes('-l')) {
|
|
1658
|
+
const limitIdx = args.indexOf('--list') !== -1 ? args.indexOf('--list') : args.indexOf('-l');
|
|
1659
|
+
const limit = parseInt(args[limitIdx + 1]) || 30;
|
|
1660
|
+
runListMode(limit);
|
|
1661
|
+
process.exit(0);
|
|
1662
|
+
}
|
|
1597
1663
|
|
|
1598
|
-
createApp();
|
|
1664
|
+
createApp();
|
|
1665
|
+
}
|
package/package.json
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-starter",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "A beautiful terminal UI for managing Claude Code sessions — start new or resume past conversations",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"claude-starter": "./index.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
|
-
"start": "node index.js"
|
|
10
|
+
"start": "node index.js",
|
|
11
|
+
"test": "node --test test.js",
|
|
12
|
+
"test:tui": "node --test --test-force-exit test-tui.js",
|
|
13
|
+
"test:all": "node --test --test-force-exit test.js test-tui.js",
|
|
14
|
+
"prepublishOnly": "npm run test:all"
|
|
11
15
|
},
|
|
12
16
|
"keywords": [
|
|
13
17
|
"claude",
|
|
@@ -16,7 +20,11 @@
|
|
|
16
20
|
"terminal",
|
|
17
21
|
"session",
|
|
18
22
|
"resume",
|
|
19
|
-
"ai"
|
|
23
|
+
"ai",
|
|
24
|
+
"ai-native",
|
|
25
|
+
"developer-workflow",
|
|
26
|
+
"local-first",
|
|
27
|
+
"agentic-tooling"
|
|
20
28
|
],
|
|
21
29
|
"author": "Bojun Chai <just_cbj@sina.com>",
|
|
22
30
|
"license": "MIT",
|
|
@@ -24,6 +32,10 @@
|
|
|
24
32
|
"type": "git",
|
|
25
33
|
"url": "https://github.com/Bojun-Vvibe/claude-starter.git"
|
|
26
34
|
},
|
|
35
|
+
"homepage": "https://github.com/Bojun-Vvibe/claude-starter#readme",
|
|
36
|
+
"bugs": {
|
|
37
|
+
"url": "https://github.com/Bojun-Vvibe/claude-starter/issues"
|
|
38
|
+
},
|
|
27
39
|
"engines": {
|
|
28
40
|
"node": ">=18"
|
|
29
41
|
},
|