Repository navigation
ccnm v0.10.1
v0.10.0 的 tag 打了,但发布流程在 macOS 门禁上被一条测试的时序问题挡住,
没有产出下载。这一版就是它,只多了修好的那条测试和版本号。
这一版主要是把"会话控制"和"出了事说得清"补扎实:停得准、结果拿得全、
写锁先看再起、结束的会话能清,以及第一轮真机验收(P62)查出来的问题。
两台机器要一起升。 内部协议从 v0.9.0 的 6 升到了 10,混装时 doctor 和
起会话都会报 CCNM_E_VERSION。ccnm.machine/1(ccnm rpc)和
ccnm.workspace-mcp/1 仍是冻结的契约,这一版没有不兼容的改动。
Machine API(ccnm rpc)
session.stop按会话精确停止,停得到--print运行,不会误停同项目的
交互会话;停止标志先落盘,Agent 发 SIGTERM 后最多等 5 秒确认。- 客户端断开不再连累已经接受的会话:每个会话由自己的 owner 进程跑完,
回来用 session id 照样查得到。ssh 在认证前就失败的记failed,不再是
unknown。 session.result的输出完整保留(每个流最后 32 MiB)、倒序分页、能取
stderr;会话没起来时多一个failure,给出原因(第 10 节同一套错误码)。session.start先问一次写锁:有人正写回-32008,残留或读不了回
-32007并给原因。只是观察,不是预留。
人用的 CLI
ccnm cleanup <项目>:先预览会删什么、留什么,再凭预览给的令牌删;
Operator、Agent、Runtime 执行账号各删各的,项目、写锁、凭据和还在跑的
会话都不碰。- 交互会话的 stop 会等通道退出再确认;
ccnm log把被停掉的会话记成
"被停止",时长是真的。 ccnm status <项目>显示写锁的状态;终端被别的实例占着时会指出来。ccnm controller install会把--config/CCNM_CONFIG和
XDG_CONFIG_HOME、XDG_STATE_HOME写进 LaunchAgent(以前不写,装完
Controller 在默认目录监听)。- 中文帮助补全;
--print末尾写实际的 Agent 节点名。
doctor
- 版本号相同、内部协议不同的两个构建会被认出来(
not the same build)。
只有新的那一端看得出:以后在 v0.10.1 之后自己从 main 编的构建也叫
0.10.1,两台都跑一遍 doctor,以新的那台为准。 - Agent 拒绝所选实例时,第一行就是 Agent 给的原因(比如 profile 目录
权限不对),不再误报身份不符或"在同一台机器上"。 - Codex 登录那一行写明只看了本地登录状态——令牌被吊销它看不出来。
Linux Runtime
- 项目可以放在执行账号的家目录里,哪怕你(Operator)进不去(Debian 12
起家目录默认 0700):不再误报"不在这台机器上",由执行账号回答。
可靠性
- MCP relay 的 leader 退出后,同进程组里留下的子进程会被整组清掉并确认,
清不掉就不交出写权。 apply_patch两处并发误判:两次检查撞在一起时不再放过一次被打断的提交;
同账号几个项目同时改文件时,不再删掉别人正在写的日志、让那一次无故失败。- 后台命令两处高负载下的竞态(server 死后的 run 被报成"还在跑"、取消调用
白等 10 秒)。
验到了哪一步
macOS Agent → Debian 13 Runtime 的真机轮里,Claude 那一半(受管会话、外部
Claude Code、Machine API)跑通;Codex 那一半当时被账号额度挡住,正在补。
真机轮查出的问题在 P63–P67 修好,那些修复目前只有离线证据。逐项证据见
docs/support-matrix.md,已知限制见 README。
Two downloads, for the two halves of ccnm.
macos-universal— arm64 + x86_64. This is the one an Agent Node
needs, and it also works as a Runtime.linux-x86_64— the Runtime half only (internal mcp-serveand its
tools). The Agent half is a launchd LaunchAgent and does not run on
Linux. Needs glibc >= 2.39; Debian 13 has 2.41.
Both machines need the same ccnm version.
Take the one for that machine -- a glob here would match both:
tar -xzf ccnm-<version>-<platform>.tar.gz
mv ccnm ~/.local/bin/ccnm.new && mv ~/.local/bin/ccnm.new ~/.local/bin/ccnm
Two things that bite:
- Never
cpover a ccnm that has already run. On Apple Silicon the next
exec of it dies with SIGKILL (exit 137) while the running one carries on
with the old code. Rename over it, as above. - Downloaded through a browser it arrives quarantined and macOS refuses to
run it:xattr -d com.apple.quarantine ccnm.curldoes not set that.
Setup, the doctor table and troubleshooting: README.md