@logicseek/hello-cc 0.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.
@@ -0,0 +1,409 @@
1
+ # hello-cc
2
+
3
+ <p align="center">
4
+ <img src="assets/logo.svg" width="160" alt="hello-cc logo">
5
+ </p>
6
+
7
+ <p align="center">
8
+ <a href="https://github.com/Dullne/hello-cc"><img src="https://img.shields.io/github/stars/Dullne/hello-cc?style=flat-square&color=40c4aa" alt="GitHub stars"></a>
9
+ <a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D24.0.0-brightgreen?style=flat-square" alt="node >=24"></a>
10
+ <a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-blue?style=flat-square" alt="license Apache 2.0"></a>
11
+ </p>
12
+
13
+ <p align="center"><a href="README.md">English</a> | <b>中文</b></p>
14
+
15
+ `hello-cc` 将 Claude Code、Codex 和其他编程 CLI 会话连接成一个**项目本地对等网格**。命令为 `hcc`。
16
+
17
+ hello-cc 的默认模型是扁平协作网格,不区分固定的 main/worker。每个终端会话都是一个命名 peer,可以看到同一项目中的未完成任务、接收发给自己的消息、持有锁、交接进度,也可以被 Web 控制台观察和操作。
18
+
19
+ ```text
20
+ <project>/.hello-cc/mesh.db
21
+ ```
22
+
23
+ ## 安装
24
+
25
+ **Node 24+ 是必需的**,因为 hello-cc 使用内置 `node:sqlite`。
26
+
27
+ 从 npm 全局安装 CLI:
28
+
29
+ ```bash
30
+ npm install -g @logicseek/hello-cc
31
+ ```
32
+
33
+ 也可以不全局安装,直接运行:
34
+
35
+ ```bash
36
+ npx @logicseek/hello-cc web
37
+ ```
38
+
39
+ 本地开发时,可以直接从仓库运行 CLI:
40
+
41
+ ```bash
42
+ node ./bin/hcc.mjs web
43
+ ```
44
+
45
+ 全局安装后,`hcc` 和 `hello-cc` 两个命令都可用;本文示例使用 `hcc`。
46
+
47
+ ## 默认入口
48
+
49
+ 安装后只需要在项目目录运行:
50
+
51
+ ```bash
52
+ cd /path/to/project
53
+ hcc web
54
+ ```
55
+
56
+ `hcc web` 是默认一条命令入口。它会自动完成这些事情:
57
+
58
+ 1. 在当前目录初始化 `.hello-cc/mesh.db`
59
+ 2. 写入受控项目指导块:`.hello-cc/HCC.md`、`CLAUDE.md`、`AGENTS.md`
60
+ 3. 安装或刷新 Claude Code hooks:`~/.claude/settings.json`
61
+ 4. 安装或刷新 Codex hooks:`~/.codex/hooks.json`
62
+ 5. 安装 `~/.hcc-shims/claude` 和 `~/.hcc-shims/codex`
63
+ 6. 将 `~/.hcc-shims` 加入 shell PATH
64
+ 7. 检查 `tmux`,缺失时尽量自动安装;安装失败会打印明确的系统安装命令
65
+ 8. 后台启动或复用全局 Web 控制台,注册当前项目,打印 URL、PID、runtime 文件和日志文件,然后把当前终端还给用户
66
+
67
+ 输出示例:
68
+
69
+ ```text
70
+ hello-cc web started in background
71
+ pid: 12345
72
+ project: /path/to/project
73
+ database: /path/to/project/.hello-cc/mesh.db
74
+ runtime: /path/to/project/.hello-cc/runtime.json
75
+ log: /path/to/project/.hello-cc/web.log
76
+ open: http://<machine-ip>:8787/?project=%2Fpath%2Fto%2Fproject
77
+ local: http://127.0.0.1:8787/?project=%2Fpath%2Fto%2Fproject
78
+ shims: installed claude, codex
79
+ PATH updated in ~/.bashrc; open a new terminal or source it
80
+ stop: hcc down
81
+ ```
82
+
83
+ `hcc web` 使用单个全局 Web runtime。你在另一个项目目录再次运行 `hcc web` 时,不会再开一个端口,而是把那个项目注册到同一个 Web 控制台。前端左侧的 Project 下拉框可以在不同项目 root 之间切换;每个项目仍然使用自己的 `.hello-cc/mesh.db`,任务、消息、锁和 peers 不会混在一起。
84
+
85
+ 第一次安装 shim 后,需要打开一个新终端,或执行:
86
+
87
+ ```bash
88
+ source ~/.bashrc
89
+ ```
90
+
91
+ 之后在这个项目目录中直接输入:
92
+
93
+ ```bash
94
+ claude
95
+ codex
96
+ claude --resume <session-id>
97
+ codex resume <session-id>
98
+ ```
99
+
100
+ 这些命令会被 hello-cc shim 包装为**本机 tmux 常驻终端**:
101
+
102
+ - 本地终端会 attach 到同一个 tmux 会话,仍然可以像普通 Claude/Codex 一样交互。
103
+ - Web 控制台看到并操作的是同一个 tmux pane,不是浏览器里临时创建的假终端。
104
+ - `hcc down` 只停止 Web runtime,不会杀掉这些 tmux 会话。
105
+ - 重新运行 `hcc web` 后,只要 tmux pane 还活着,Web 会重新接管。
106
+
107
+ 如果只想初始化本地通信、不启动 Web、不安装 shim,可使用低级命令:
108
+
109
+ ```bash
110
+ hcc up
111
+ ```
112
+
113
+ 普通用户优先使用 `hcc web`。
114
+
115
+ ## 项目边界
116
+
117
+ 默认项目边界就是**当前工作目录**。如果当前目录没有 `.hello-cc/mesh.db`,hello-cc 会在首次使用时创建:
118
+
119
+ ```text
120
+ /repo-a/.hello-cc/mesh.db
121
+ /repo-a/subdir/.hello-cc/mesh.db
122
+ ```
123
+
124
+ 这两个目录默认是两个不同项目,不会互相看到任务和消息。也就是说,想让多个终端自然通信,就在同一个项目目录启动它们。
125
+
126
+ 如果确实要让多个路径或 worktree 共用一个总线,需要显式指定:
127
+
128
+ ```bash
129
+ hcc --root /path/to/project web
130
+ export HCC_ROOT=/path/to/project
131
+ export HCC_DB=/path/to/project/.hello-cc/mesh.db
132
+ ```
133
+
134
+ hello-cc 不会自动向父目录继承项目边界,这样可以避免子目录会话误加入上层项目。
135
+
136
+ ## 通信模型
137
+
138
+ hello-cc 的通信不是 CLI 之间点对点互发,也不是必须依赖 MCP。核心是项目本地 SQLite WAL 总线:
139
+
140
+ ```text
141
+ Claude/Codex/普通 shell
142
+ -> hooks / hcc 命令 / Web runtime
143
+ -> .hello-cc/mesh.db
144
+ -> peers / tasks / messages / locks / handoffs / events
145
+ -> tmux-backed terminal control
146
+ ```
147
+
148
+ 任务和消息的读取规则不同:
149
+
150
+ - **任务**是项目事实。所有 peer 默认都能看到未 `done` 且未 `abandoned` 的任务。任务不因为某个终端读过就消失。
151
+ - **消息**是带收件人的邮箱消息。`hcc msg inbox` 默认读取当前 peer 的未读消息,`hcc msg ack` 记录每个 peer 的已读状态。
152
+ - `ask` 和 `broadcast` 会写入持久消息;加 `--inject` 时,还会把内容实时注入到 Web runtime 已接管的终端。
153
+ - 锁使用 SQLite 事务和 TTL,是协作式冲突避免,不是文件系统强制沙箱。
154
+
155
+ ## Claude/Codex 如何知道其他会话状态
156
+
157
+ 主链路是 hooks 注入,不是依赖 `CLAUDE.md`。
158
+
159
+ `hcc web` 会安装 Claude Code 和 Codex hooks。在会话启动、用户提交 prompt、工具调用前后、会话空闲等事件中,hooks 会把 hello-cc 当前快照注入给模型,包括:
160
+
161
+ - 当前 peer 身份
162
+ - 活跃 peer 列表
163
+ - 未完成任务
164
+ - 当前 peer 的未读消息
165
+ - 活跃锁
166
+ - 建议执行的 `hcc status`、`hcc peers`、`hcc task list`、`hcc msg inbox`、`hcc lock list`
167
+
168
+ 因此,当你在已接入的 Claude/Codex 里问“其他会话在做什么”,模型应该基于 hello-cc 注入的最新状态回答,而不是回答“我无法知道其他会话”。
169
+
170
+ 如果仍然回答不知道,通常是这些原因:
171
+
172
+ - 没有先在项目目录运行 `hcc web`
173
+ - 当前终端还没有加载 `~/.hcc-shims` PATH
174
+ - Codex hooks 没有开启,或安装后的 hook 还没有在 Codex 的 hook review 流程里信任
175
+ - Claude/Codex 是在不同项目目录启动的
176
+ - 当前会话是 `hcc web` 之前打开的 raw 终端,只能靠下一次 hook 事件加入通信,不能被 Web 视觉接管
177
+ - 对应 CLI 版本没有触发预期 hook
178
+
179
+ 可以在同一个项目目录用一次性 debug 调用确认 Claude Code 是否真实注入:
180
+
181
+ ```bash
182
+ claude -p 'Do you see hello-cc open tasks?' --debug hooks --debug-file /tmp/hcc-claude-hooks.log
183
+ ```
184
+
185
+ debug 日志里应该出现 `Hook UserPromptSubmit ... provided additionalContext`,并包含
186
+ `hello-cc coordination` 块。如果这里已经存在,但模型仍然按通用知识回答“会话隔离”,请通过
187
+ shim 重新启动或 resume 会话后再问;hello-cc 会在每次新用户 prompt 时注入更强的约束。
188
+
189
+ ## Web 控制台
190
+
191
+ 默认本机和内网访问:
192
+
193
+ ```bash
194
+ hcc web
195
+ ```
196
+
197
+ 需要令牌时再显式开启:
198
+
199
+ ```bash
200
+ HCC_WEB_TOKEN='choose-a-long-token' hcc web --host 0.0.0.0 --port 8787
201
+ ```
202
+
203
+ 同一内网机器打开:
204
+
205
+ ```text
206
+ http://<machine-ip>:8787/
207
+ ```
208
+
209
+ Web 控制台能做两类事情:
210
+
211
+ - 在一个端口里切换多个已注册项目 root
212
+ - 直接在浏览器里注册新的项目路径,不需要为每个项目再启动一个 Web 服务
213
+ - 查看项目状态:peers、tasks、messages、locks、handoffs、events
214
+ - 操作本地终端:启动 Claude/Codex/shell、发送键盘输入、查看输出、停止接管
215
+ - 启动新会话时只需要选择 kind;表单会自动生成当前项目内的下一个别名,使用当前选中的 Project root 作为工作目录,并运行该 kind 的默认命令
216
+
217
+ Web 操作的是 hello-cc 管理的本机 tmux 终端:
218
+
219
+ - 通过 Web 表单启动的新会话:tmux-backed
220
+ - 通过 `hcc peer start` 启动的新会话:tmux-backed
221
+ - 通过 shim 直接输入 `claude` / `codex` 启动的新会话:tmux-backed
222
+ - 通过 `hcc peer attach` 接入的已有 tmux pane:tmux-backed
223
+
224
+ 已经打开的普通 raw 终端不能被无条件捕获或控制,除非它原本就在 tmux、screen 或 hello-cc shim 之下。它仍然可以通过 hooks 和 `hcc` 命令参与任务、消息和锁。
225
+
226
+ ## 常用命令
227
+
228
+ ```text
229
+ # 默认入口
230
+ hcc web [--host HOST] [--port N] [--token TEXT] [--local] [--no-discover] [--no-guidance]
231
+ hcc down
232
+
233
+ # 本地协调,无 Web
234
+ hcc up [--no-discover] [--no-guidance]
235
+
236
+ # 对等节点和状态
237
+ hcc peers
238
+ hcc status [--peer ID]
239
+ hcc scan [--register]
240
+ hcc prompt --peer ID [--kind codex|claude|shell|other] [--role ROLE]
241
+ hcc join --peer ID [--kind codex|claude|shell|other] [--role ROLE]
242
+ hcc env --peer ID
243
+ hcc heartbeat [--peer ID] [--renew-locks --ttl 900]
244
+ hcc run --peer ID --kind codex|claude|shell --role ROLE -- COMMAND [ARGS...]
245
+
246
+ # Web 可控终端
247
+ hcc peer list
248
+ hcc peer start PEER [--kind K] [--role R] [--cwd DIR] [--restart-env] -- COMMAND [ARGS...]
249
+ hcc peer start PEER --kind codex --resume SESSION_ID [--restart-env]
250
+ hcc peer start PEER --kind codex --last
251
+ hcc peer start PEER --kind claude --resume SESSION_ID [--restart-env]
252
+ hcc peer start PEER --kind claude --continue
253
+ hcc peer attach PEER [--pane PANE] [--kind K] [--role R] [--cwd DIR]
254
+ hcc peer stop PEER
255
+ hcc inject PEER TEXT [--no-enter]
256
+
257
+ # 消息
258
+ hcc msg send [--from ID] [--to ID|all] --body TEXT [--task N] [--kind note|task|handoff]
259
+ hcc msg inbox [--peer ID] [--wait SEC] [--all] [--limit N]
260
+ hcc msg ack [--peer ID] --id N
261
+ hcc ask PEER MESSAGE [--from ID] [--task N] [--inject]
262
+ hcc broadcast MESSAGE [--from ID] [--task N] [--inject]
263
+
264
+ # 任务
265
+ hcc task create --title TEXT [--body TEXT] [--from ID] [--to ID] [--priority N]
266
+ hcc task list [--status S] [--peer ID] [--all]
267
+ hcc task claim [--peer ID] --id N
268
+ hcc task next [--peer ID]
269
+ hcc task update [--peer ID] --id N --status running|review|blocked|done|abandoned [--summary TEXT] [--body TEXT] [--to ID]
270
+ hcc task done [--peer ID] --id N --summary TEXT
271
+
272
+ # 锁和交接
273
+ hcc lock acquire [--peer ID] --resource PATH [--task N] [--ttl SEC] [--reason TEXT]
274
+ hcc lock renew [--peer ID] --resource PATH [--ttl SEC]
275
+ hcc lock release [--peer ID] --resource PATH [--force]
276
+ hcc lock list [--all]
277
+ hcc handoff create [--from ID] --summary TEXT [--task N] [--to ID] [--changed-files JSON_OR_CSV] [--tests TEXT] [--risks TEXT]
278
+ hcc handoff list [--task N] [--limit N]
279
+ hcc event tail [--limit N]
280
+ hcc gc [--older-than DAYS] [--yes]
281
+ ```
282
+
283
+ ## 稳定 peer 身份
284
+
285
+ hello-cc 会尽量让恢复会话复用稳定 peer ID:
286
+
287
+ | 启动方式 | peer ID |
288
+ |---|---|
289
+ | `claude --resume abc12345...` | `claude-abc12345` |
290
+ | `claude --session-id abc12345...` | `claude-abc12345` |
291
+ | `claude --continue` | 先使用终端派生 ID,随后 hooks 记录真实 session 元数据 |
292
+ | `claude --fork-session --resume abc12345...` | 先使用终端派生 ID,随后 hooks 记录新 session 元数据 |
293
+ | `codex resume abc12345...` | `codex-abc12345` |
294
+ | `codex resume --last` | 先使用终端派生 ID,随后 discovery 记录真实 session 元数据 |
295
+ | 普通 shell | `shell-<terminal>` |
296
+ | 手动 `HCC_PEER=xxx` | 使用 `xxx` |
297
+
298
+ 已知 resume ID 的会话重启后会保持同一个 peer ID。启动前不知道真实 provider session ID 的模式,会先用终端派生 ID,启动后再记录真实 provider session 元数据。
299
+
300
+ ## 典型工作流
301
+
302
+ 创建任务:
303
+
304
+ ```bash
305
+ hcc task create --title "重构路由诊断" \
306
+ --body "保持变更范围小。" --priority 20
307
+ ```
308
+
309
+ 认领并加锁:
310
+
311
+ ```bash
312
+ hcc task next
313
+ hcc lock acquire --resource vllm/router --ttl 900 --reason "实现路由诊断"
314
+ ```
315
+
316
+ 发消息或实时注入:
317
+
318
+ ```bash
319
+ hcc msg send --to claude-a --body "实现已准备好供审查。"
320
+ hcc ask claude-a "请审查当前实现。" --inject
321
+ hcc broadcast "暂停编辑 vllm/router,等待任务完成。" --inject
322
+ ```
323
+
324
+ 完成并交接:
325
+
326
+ ```bash
327
+ hcc handoff create --to claude-a \
328
+ --summary "已实现路由诊断变更。" \
329
+ --tests "pytest tests/router" \
330
+ --risks "未跑完整基准"
331
+
332
+ hcc task done --id 1 --summary "已完成并交接。"
333
+ hcc lock release --resource vllm/router
334
+ ```
335
+
336
+ ## 技术栈
337
+
338
+ ```text
339
+ Node.js >= 24
340
+ node:sqlite + SQLite WAL
341
+ Node HTTP server
342
+ ws WebSocket
343
+ xterm.js
344
+ tmux create/capture/send
345
+ Claude Code hooks
346
+ Codex hooks
347
+ shell shim wrappers
348
+ ```
349
+
350
+ A2A 和 MCP 不是核心必需项。A2A 更适合远程 agent 互操作,MCP 可以作为后续工具层;本地多终端协作的主链路是 hooks + SQLite + tmux。
351
+
352
+ ## 测试
353
+
354
+ ```bash
355
+ npm test
356
+ ```
357
+
358
+ 回归脚本会创建临时项目、临时 `HOME`、fake `claude`/`codex`、临时 runtime 端口和临时 tmux session。覆盖 `hcc web` 自动 bootstrap、单端口多项目注册、hooks/shims、SQLite 协作流、tmux-backed `peer start` 创建和恢复、shim 启动 tmux peer、tmux attach、WebSocket 终端流、终端注入、runtime 停止、package dry-run 和旧命名扫描。
359
+
360
+ ## 架构
361
+
362
+ ```text
363
+ hcc CLI
364
+ ├── lib/discover.mjs Claude/Codex 会话发现
365
+ ├── lib/setup.mjs hooks、shims、PATH 安装
366
+ ├── bin/hcc.mjs CLI、SQLite、Web runtime、tmux 控制
367
+ └── .hello-cc/
368
+ ├── mesh.db 协调状态
369
+ ├── HCC.md 项目指导规则
370
+ ├── runtime.json Web runtime 发现文件
371
+ └── web.log Web runtime 日志
372
+ ```
373
+
374
+ ## 环境变量
375
+
376
+ | 变量 | 用途 |
377
+ |---|---|
378
+ | `HCC_PEER` | 默认 peer 身份 |
379
+ | `HCC_ROOT` | 覆盖项目根目录 |
380
+ | `HCC_DB` | 覆盖数据库路径 |
381
+ | `HCC_WEB_TOKEN` | 可选 Web 访问令牌 |
382
+ | `HCC_RUNTIME_URL` | 直接指定 runtime URL |
383
+ | `HCC_NO_AUTO_INSTALL_TMUX=1` | 禁用 tmux 自动安装,主要用于测试 |
384
+
385
+ `claude` / `codex` shim 和 `hcc peer start` 会使用**当前启动终端**的环境变量创建 tmux-backed 会话,
386
+ 不使用后台 Web runtime 启动时的旧环境。这样你可以在新终端里先 `export ANTHROPIC_*`、
387
+ `CLAUDE_CODE_*` 或其他 provider 变量,再运行 `claude` / `codex`。
388
+
389
+ 已经运行的 CLI 进程不能被操作系统原地修改环境变量。`claude` / `codex` shim 会用
390
+ `--restart-env` 调用 `hcc peer start`,因此 hello-cc 会为同一个 resume/session peer
391
+ 记录启动环境指纹。当你从新终端再次启动它且环境已变化时,如果对应 tmux 会话没有本地
392
+ tmux client 或 Web client 正在连接,hello-cc 会自动重启这个 tmux 会话并应用新环境。
393
+ 如果会话正在被操作,会提示先 detach/关闭 Web 连接,或运行 `hcc peer stop <peer>` 后再启动。
394
+
395
+ 如果直接调用 `hcc peer start`,需要加 `--restart-env` 才会启用同样的环境变化自动重启行为。
396
+
397
+ shim 只接管交互式终端会话。元命令和维护命令会直通真实 provider CLI,例如
398
+ `claude --help`、`claude --version`、`claude --print`、`claude --bare`、`claude --safe-mode`、
399
+ `codex --help`、`codex --version`,以及 `codex exec`、`codex review`、`codex doctor`、
400
+ `codex mcp` 等非交互 Codex 子命令。交互式的 `claude`、`claude --resume ...`、`codex`、
401
+ `codex resume ...`、`codex fork ...` 会走 tmux-backed,会出现在 Web 控制台里。
402
+
403
+ ---
404
+
405
+ <p align="center">
406
+ <a href="https://star-history.com/#Dullne/hello-cc&Date">
407
+ <img src="https://api.star-history.com/svg?repos=Dullne/hello-cc&type=Date" width="600" alt="Star History Chart">
408
+ </a>
409
+ </p>