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.
Files changed (3) hide show
  1. package/README.md +126 -113
  2. package/index.js +114 -47
  3. 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 的主页。</strong>你的所有会话,一目了然。<br/>
15
- <strong>Your homepage for Claude Code.</strong> All your sessions, at a glance.
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
- const PKG = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'), 'utf-8'));
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
- if (args.includes('--version') || args.includes('-v') || args.includes('-V')) {
1518
- console.log(`claude-starter v${PKG.version}`);
1519
- process.exit(0);
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('--update') || args.includes('-u')) {
1523
- const C = {
1524
- reset: '\x1b[0m', dim: '\x1b[2m', bold: '\x1b[1m',
1525
- cyan: '\x1b[36m', yellow: '\x1b[33m', green: '\x1b[32m',
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
- try {
1531
- const latest = execSync('npm view claude-starter version 2>/dev/null', {
1532
- stdio: ['pipe', 'pipe', 'pipe'],
1533
- timeout: 10000,
1534
- }).toString().trim();
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
- if (latest === PKG.version) {
1537
- console.log(`${C.green}✓ Already on the latest version (v${PKG.version})${C.reset}\n`);
1538
- process.exit(0);
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
- console.log(`${C.yellow} Current: v${PKG.version}${C.reset}`);
1542
- console.log(`${C.green} Latest: v${latest}${C.reset}\n`);
1543
- console.log(`${C.cyan}📦 Updating…${C.reset}\n`);
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
- try {
1546
- execSync('npm install -g claude-starter@latest', { stdio: 'inherit', timeout: 60000 });
1547
- console.log(`\n${C.green}${C.bold}✓ Updated to v${latest}${C.reset}\n`);
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(`\n${C.red}✗ Update failed. Try manually:${C.reset}`);
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
- process.exit(0);
1559
- }
1620
+ process.exit(0);
1621
+ }
1560
1622
 
1561
- if (args.includes('--help') || args.includes('-h')) {
1562
- console.log(`
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
- process.exit(0);
1589
- }
1654
+ process.exit(0);
1655
+ }
1590
1656
 
1591
- if (args.includes('--list') || args.includes('-l')) {
1592
- const limitIdx = args.indexOf('--list') !== -1 ? args.indexOf('--list') : args.indexOf('-l');
1593
- const limit = parseInt(args[limitIdx + 1]) || 30;
1594
- runListMode(limit);
1595
- process.exit(0);
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.4",
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
  },