chord-cli 0.2.0 → 0.2.2

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/dist/trust.js CHANGED
@@ -3,7 +3,7 @@
3
3
  import fs from 'node:fs';
4
4
  import os from 'node:os';
5
5
  import path from 'node:path';
6
- export const claudeConfigPath = () => path.join(os.homedir(), '.claude.json');
6
+ const claudeConfigPath = () => path.join(os.homedir(), '.claude.json');
7
7
  // Claude Code keys projects by the cwd with forward slashes, even on Windows
8
8
  const norm = (p) => p.replace(/\\/g, '/').toLowerCase();
9
9
  /** Whether the user has answered yes to Claude Code's "do you trust this folder?" dialogue for `dir`. */
@@ -31,7 +31,7 @@ export function claudeMcpChoices(dir, file = claudeConfigPath()) {
31
31
  return { all: false, enabled: [], disabled: [] };
32
32
  }
33
33
  }
34
- export const codexConfigPath = () => path.join(os.homedir(), '.codex', 'config.toml');
34
+ const codexConfigPath = () => path.join(os.homedir(), '.codex', 'config.toml');
35
35
  /** Codex keeps a trust hash and an on/off switch per hook in ~/.codex/config.toml. One keypress in its
36
36
  * "Hooks need review" screen switches a hook off, and chord then silently loses the feature behind it, so
37
37
  * chord names the switched-off hooks at launch. Returns Codex event names such as "session_start". */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chord-cli",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Run several coding agents in one git project, each in its own worktree, with shared file claims and messaging",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -33,7 +33,8 @@
33
33
  },
34
34
  "os": [
35
35
  "win32",
36
- "linux"
36
+ "linux",
37
+ "darwin"
37
38
  ],
38
39
  "scripts": {
39
40
  "build": "tsc -p tsconfig.build.json",
package/README.zh-CN.md DELETED
@@ -1,169 +0,0 @@
1
- # chord
2
-
3
- **把编码 agent 当成一个集群来跑。**
4
-
5
- <p align="center">
6
- <a href="LICENSE"><img alt="MIT licence" src="https://img.shields.io/badge/licence-MIT-blue"></a>
7
- <img alt="Node 24 or later" src="https://img.shields.io/badge/node-%E2%89%A5%2024-339933?logo=nodedotjs&logoColor=white">
8
- <img alt="Windows and Linux" src="https://img.shields.io/badge/platform-Windows%20%7C%20Linux-blue">
9
- <a href="README.md"><img alt="English README" src="https://img.shields.io/badge/README-English-2F7CF6"></a>
10
- </p>
11
-
12
- 一个仓库,想开几个 agent 就开几个。每个 agent 在自己的 worktree 里干活;一块共享的看板记着谁占着哪个文件;想改别人占着的文件,先问,等对方回话;活干完提交了,一个调用把分支 rebase 到 main 并快进。空闲的 agent 一有消息就被叫醒,所以 agent 之间自己协商,你只管用大白话继续派活。
13
-
14
- <p align="center">
15
- <picture>
16
- <source media="(prefers-color-scheme: dark)" srcset="docs/demo-dark.svg">
17
- <img alt="两个 agent 各在自己的终端里占用文件,通过消息商量一个共用文件,然后 finish 合进 main;chord ls 显示它们的状态" src="docs/demo-light.svg" width="100%">
18
- </picture>
19
- </p>
20
-
21
- ## ✨ 特点
22
-
23
- - 一个仓库、N 个 agent、每人一个 worktree:并行干活,互不踩脚
24
- - 文件级的占用看板:改之前先登记,先占的人先说话,没登记过的写入被 hook 挡回去
25
- - agent 之间的异步消息:空闲的被叫醒,忙着的在下一次工具调用时听到
26
- - `finish` 一步到位:rebase、快进 main、释放占用、通知其他人;遇到冲突什么都不动,让 agent 自己 rebase、解决、再 finish,解决不了才来问你
27
- - 规则由 chord 自己教给 agent,启动时讲一遍,每条 prompt 再提醒一次;你只派任务,不用解释 chord
28
- - 设计上不绑定某一家 agent:接一个新工具只是加一条启动配方,不用新写协调器
29
- - `chord ls` 看全局,`messages` 和 `events` 回放发生过什么,`stop` 和 `clean` 收尾
30
-
31
- ## 📊 基准测试
32
-
33
- 在 [CooperBench](https://github.com/cooperbench/CooperBench) 上,两个 agent 在同一个仓库里各做一个功能,合并后的结果通过两个功能的测试才算这一对通过。gpt-6-luna 的数字只算两边都做完的那些对。
34
-
35
- | chord 对比 | gpt-6.1-sol | gpt-6-luna |
36
- |---|---|---|
37
- | solo(一个 agent 做两个功能) | 76% vs 74% | 63% vs 51% |
38
- | coop + git(消息加一个共享的 git 远端) | 76% vs 73% | 63% vs 47% |
39
- | team(一个主管派活) | 76% vs 69% | **63% vs 34%** |
40
- | coop(只有消息) | 76% vs 11% | 63% vs 11% |
41
-
42
- 在强模型上 chord 和最好的基线持平。在弱模型上它是唯一不掉到单 agent 以下的双 agent 方案,比 team 高 20 个点。chord 的 agent 只拿到功能描述,而 coop + git 和 team 的 prompt 里把怎么分工、怎么合并都写明了。
43
-
44
- ## 🤖 支持的 agent
45
-
46
- | agent | 状态 |
47
- |---|---|
48
- | Claude Code | 支持 |
49
- | Codex CLI | 支持 |
50
- | OpenCode | 计划中 |
51
- | Gemini CLI | 计划中 |
52
- | Cursor CLI | 计划中 |
53
- | GitHub Copilot CLI | 计划中 |
54
- | Qwen Code | 计划中 |
55
- | DeepSeek Harness | 计划中 |
56
-
57
- 接一个新 agent 需要它的工具提供三样东西:启动时注入 hook 和 MCP server 的办法、hook 事件的名字和载荷、一个空闲/忙碌信号。
58
-
59
- ## 🧩 工作原理
60
-
61
- <p align="center">
62
- <picture>
63
- <source media="(prefers-color-scheme: dark)" srcset="docs/architecture-dark.svg">
64
- <img alt="你把任务交给一群 agent,每人一个 worktree;agent 共享一块占用和消息的看板,做完 finish 进 main" src="docs/architecture-light.svg" width="100%">
65
- </picture>
66
- </p>
67
-
68
- 1. **隔离。** 每个 agent 在自己的分支、自己的 worktree 里干活。主 checkout 只通过 `finish` 变化。
69
- 2. **协调。** 一块共享看板存着占用、消息和事件。agent 用 chord 给的工具登记、占用、对话;hook 在每次写入前查占用,并在它干活时把新消息递过去。
70
- 3. **合并。** `finish` 把分支 rebase 到 main 再快进。rebase 干净就合进去;其他任何情况都停在原地等你。
71
-
72
- ## 📦 安装
73
-
74
- 机器上有 Node 24 和 git:
75
-
76
- ```
77
- npm install -g chord-cli
78
- ```
79
-
80
- Linux 上加 `--allow-scripts=node-pty`,并装好 python3、make 和 g++:node-pty 不带 Linux 的二进制,安装时现场编译。
81
-
82
- 或者从源码:
83
-
84
- ```
85
- git clone https://github.com/Cedr1cSun/chord-cli && cd chord-cli
86
- npm install && npm link
87
- ```
88
-
89
- ## 🚀 快速开始
90
-
91
- 一个项目是一个文件夹,仓库放在它的子目录里:
92
-
93
- ```
94
- my-project/
95
- my-repo/ 主 checkout
96
- chord/ chord 自己的文件,在仓库之外
97
- ```
98
-
99
- 在项目文件夹里,一个终端开一个 agent:
100
-
101
- ```
102
- chord claude # 开一个 agent
103
- chord codex --name api # 再开一个,起个名字
104
- chord claude "fix the flaky test in tests/auth" # 工具名后面的参数原样交给工具
105
- ```
106
-
107
- 在这些终端里像平时一样派任务。另开一个终端:
108
-
109
- ```
110
- chord ls # agent、各自在做什么、未读消息、分支状态、文件占用
111
- chord messages api # 某个 agent 说过什么、收到过什么
112
- chord events # 占用、释放、合并、冲突
113
- chord stop api # 让它做完这一轮再退出
114
- chord clean # 删掉已经离开的 agent 的工作区和分支
115
- ```
116
-
117
- `--name` 固定 agent 的名字、工作区和分支,以后用同一个名字启动就回到同一个 worktree。`chord resume <agent>` 也是这样,还会接着打开这个 agent 自己的对话,Claude 和 Codex 都一样。在仓库根目录里跑 chord,它会先提议把仓库移进一个子目录。
118
-
119
- agent 在项目文件夹里启动,也就是你平时直接敲 `claude` 或 `codex` 的那个目录,所以那仍然是它们的项目:同一份 `/resume` 列表,同一个 CLAUDE.md,同一次信任确认。每个 agent 只改 `chord/agents/<名字>/` 下自己的 worktree;chord 拒绝对主 checkout 和其他 agent 的 worktree 的编辑(编辑器工具、apply_patch),shell 命令在那里跑过之后也会说一声。
120
-
121
- ## 🧰 命令
122
-
123
- | 命令 | 作用 |
124
- |---|---|
125
- | `chord <agent> [--name x] [tool args...]` | 开一个 agent:`claude` 或 `codex` |
126
- | `chord resume <agent> [tool args...]` | 把离开的 agent 再开起来,回到它的 worktree,接着它自己的对话 |
127
- | `chord ls [--all]` | 本项目的 agent 和占用,或所有项目的 |
128
- | `chord messages [agent] [-n N]` | 消息记录 |
129
- | `chord events [agent] [-n N]` | 占用、释放、合并、冲突的记录 |
130
- | `chord stop <agent>` | 等 agent 这一轮结束、输入框为空时退出它 |
131
- | `chord clean [--force] [agent...]` | 删掉离线 agent 的工作区、worktree 和分支;还没到 main 上的工作留着,除非 `--force` |
132
-
133
- ## ⚙️ 配置
134
-
135
- `<项目>/chord/config.json`:
136
-
137
- ```json
138
- { "setup": "npm ci", "test": "npm test" }
139
- ```
140
-
141
- `setup` 在每个新建的 worktree 里、agent 启动前跑一次,环境里带着 `CHORD_*` 变量,这样新 worktree 一来就装好了依赖。setup 失败则放弃这次启动并删掉 worktree。
142
-
143
- `test` 设置了的话,每次 `finish` 把分支 rebase 到 main 之后、main 移动之前,在 agent 的 worktree 里跑一遍。失败就什么都不合,agent 拿到输出的末尾:rebase 干净也可能弄坏别人刚合进去的东西。它跑的时候其他 agent 的 `finish` 等着。
144
-
145
- 仓库自带的 Claude 配置(`.claude/settings*.json`、`.mcp.json`)在你自己在 Claude Code 里信任过这个仓库之后才会到达 agent;你在那里批准过的 MCP server 才会启动。
146
-
147
- ## 🔌 chord 怎么和你的工具相处
148
-
149
- - **叫醒 agent** 就是往它的终端里敲一句短话。chord 只在输入框为空、键盘安静了几秒、终端回显了这句话之后才这么做;对话框永远收不到那个回车。
150
- - **信任**:agent 在项目文件夹里跑,所以 Claude 像平时敲 `claude` 一样只问一次;chord 不往 `~/.claude.json` 里写任何东西。Codex 会让你审核一次 chord 的 hook,hook 定义变了会再问一次;选 "trust all"。有 hook 被关掉时 chord 会在启动时告诉你。
151
- - **分支和 worktree。** 每个 agent 添一个 `chord/<名字>` 分支和一个 worktree;`chord clean` 在 agent 离开后删掉它们,还没到 main 上的东西留着。
152
- - **权限。** chord 自己的工具对 Claude 预先放行,所以独自干活的 agent 不会卡在它们的确认框上;你平时的 shell 和编辑审批照旧。Codex 以完全访问运行。Windows 上 chord 拒绝带沙箱启动,因为那个沙箱起不来 hook;Linux 上 hook 在沙箱里运行,但 Codex 会让你逐个批准 chord 的工具调用。
153
- - **终端标题**是 `chord <agent> · <任务>`,每个窗口都说得出自己是谁。
154
- - **hook 把关的是编辑器工具。** 从 shell 改的文件在每条命令之后按名字报出来,并附上该做的占用。
155
-
156
- ## 🗺️ 范围
157
-
158
- - 在 Windows 11 和 Linux 上运行。
159
- - 每个项目一个仓库。
160
- - 项目路径最长约 190 个字符。
161
- - 仓库里有 CRLF 文件和一条从未重新规范化过的 `* text` 属性时,每个 worktree 都会出现假改动;chord 会报出文件名和把仓库修好的命令。
162
-
163
- ## 🧪 测试
164
-
165
- `npm test` 在临时文件夹里的真实 git 仓库上跑单元测试。协调本身用真实工具做过端到端验证,从两个 agent 商量一个文件到二十个 agent 合进同一个 main,还有 Python、Rust 和 JavaScript 的开源仓库。
166
-
167
- ## 📄 许可
168
-
169
- [MIT](LICENSE)