xuym-codex-collab 0.7.0 → 0.8.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 +3 -1
- package/docs/architecture.md +13 -5
- package/docs/legacy-center.md +12 -52
- package/docs/protocol.md +1 -1
- package/docs/releases/0.8.0.md +21 -0
- package/package.json +1 -2
- package/schemas/event.schema.json +1 -1
- package/schemas/task.schema.json +1 -1
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
把企业微信群的任务交给指定的已有 Codex 对话:管理员统一创建并分配机器人,同事导入个人接入包、绑定对话,即可接单、提交结果、通知真人审核并接力。每位成员只运行本机工具;共享任务协议和交接记录保存在业务仓库的 `agent-collab` 分支。
|
|
4
4
|
|
|
5
|
+
当前只支持企业微信,先集中完善接入、任务协作和稳定性;其他 IM 的接入在企微流程稳定后再评估。
|
|
6
|
+
|
|
5
7
|
## 安装与入口
|
|
6
8
|
|
|
7
9
|
需要 Node.js 20+、Git、Codex 桌面应用,以及业务仓库的读取和 push 权限。业务仓库需已有至少一个远程业务分支;可以使用独立的本机 clone,也可以让向导拉取新目录。成员无需 clone 本工具源码。
|
|
@@ -153,7 +155,7 @@ node bin/codex-collab.mjs setup
|
|
|
153
155
|
- [团队签名协议与目录](docs/team-registry.md)
|
|
154
156
|
- [Peer 机制与底层命令](docs/peer.md)
|
|
155
157
|
- [已有桌面对话轮询机制](docs/desktop-poll.md)
|
|
156
|
-
- [
|
|
158
|
+
- [旧中心服务与企业微信接入](docs/legacy-center.md)
|
|
157
159
|
|
|
158
160
|
2026-10-10 已由用户验证本机真实企业微信群 + Alice/Bob 两个已有 Codex 对话的接力闭环。网页向导与真人审核闭环通过临时 Git 仓库、模拟机器人和实际浏览器操作验证;2026-10-12 这轮测试没有连接真实机器人,原生 @ 尚未验证。跨两台机器的部署尚未验证。
|
|
159
161
|
|
package/docs/architecture.md
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 架构与范围
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
当前只支持企业微信。优先稳定企微的接入、收发、任务领取、交接和真人审核;其他 IM 的接入以后再评估。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 推荐:本机 Peer 与网页向导
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
每位成员运行本机 Peer,通过自己的企业微信智能机器人接收群消息,将任务交给绑定的已有 Codex 对话。管理员在网页向导中配置项目、分配机器人并批准成员;同事导入加密个人接入包、验证企微身份并绑定对话。项目可以包含多个机器人,每个机器人保留独立身份与权限。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
团队目录、任务与交接记录存放在业务仓库的 `agent-collab` 分支,以签名记录校验身份和操作;代码在独立业务分支流转。协作远程与基准分支由向导识别和确认,每个任务固定基准 commit。已有桌面对话依赖显式启用的轮询自动化领取任务,安装 MCP 或 Skill 本身不会唤醒对话。详见 [Peer 机制](peer.md)、[签名团队协议](team-registry.md) 和 [桌面对话轮询](desktop-poll.md)。
|
|
10
|
+
|
|
11
|
+
## 兼容:旧中心服务
|
|
12
|
+
|
|
13
|
+
旧模式从源码启动一个 HTTP/MCP 服务,由它维护 `agent-collab` 的独立 Git worktree,串行追加版本化任务事件。每位同事配置个人 MCP/Skill,按需运行 Runner;Runner 创建任务 worktree 和新的 Codex SDK 会话。代码在 `codex/task-*` 分支,任务事件在 `agent-collab` 分支。群消息只提供任务指令和状态摘要,不共享原始私聊记录。此模式由一个 Bot 代表不同账号发送消息,不提供多个独立机器人路由。
|
|
14
|
+
|
|
15
|
+
消息路径:企微群消息 → 群允许列表与 `wecom_userid` 身份映射 → 命令解析 → 服务权限检查 → Git 提交 → Bot 回复。任务路径:分配 → Runner 领取 → worktree 编码、提交与可信测试 → 审查 → 真人批准 → 管理员完成。只有明确属于当前企微群的任务才能通过群命令访问;历史未知通道数据保留原始来源,不自动转为企微任务。
|
|
16
|
+
|
|
17
|
+
旧中心服务只支持单实例写入,没有持久消息投递队列、租约、失败自动恢复或 Git push 冲突重放。默认监听 localhost;跨机器需配置 HTTPS 与访问限制。企微智能机器人使用出站 WebSocket,无需公网回调;认证成功与实际群收发需分别验证。旧模式操作见 [中心服务指南](legacy-center.md),不与推荐的 Peer 接入步骤混用。
|
package/docs/legacy-center.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
日常团队接入请使用 [本机网页向导](onboarding.md)。本页保留旧 HTTP 服务操作,npm 包只分发 Peer 与本机向导;旧中心服务须从工具源码启动。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
以下为保留的**旧中心服务模式**操作;不要与 Peer 混用机器人连接和命令。Peer 不使用 `localhost:38765`、HTTP 令牌或手工 `协作 分配` / `协作 交接` 命令。
|
|
6
6
|
|
|
7
7
|
## Codex 之间的代码接力
|
|
8
8
|
|
|
@@ -22,14 +22,14 @@ pnpm install --frozen-lockfile
|
|
|
22
22
|
pnpm test
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
演示目标仓库 `codex-collab-demo` 的 `main` 执行 `sh test.sh`,而任务事件在 `agent-collab`。示例任务 T-001 为故意未完成的编程任务;可用两个不同用户通过 API/MCP 和 Runner 测试。现有 T-001
|
|
25
|
+
演示目标仓库 `codex-collab-demo` 的 `main` 执行 `sh test.sh`,而任务事件在 `agent-collab`。示例任务 T-001 为故意未完成的编程任务;可用两个不同用户通过 API/MCP 和 Runner 测试。现有 T-001 未指定审核人,建议通过企微群命令创建**新任务**以获得默认管理员审核人。
|
|
26
26
|
|
|
27
27
|
## 本地启动
|
|
28
28
|
|
|
29
29
|
生成账号文件(不要放进 Git,执行完把终端输出的个人令牌安全地分发给对应用户):
|
|
30
30
|
|
|
31
31
|
```sh
|
|
32
|
-
node scripts/create-accounts.mjs /tmp/collab-accounts.json alice:admin:
|
|
32
|
+
node scripts/create-accounts.mjs /tmp/collab-accounts.json alice:admin:wx_alice bob:member:wx_bob
|
|
33
33
|
COLLAB_REPO=/path/to/codex-collab-demo \
|
|
34
34
|
COLLAB_ACCOUNTS_FILE=/tmp/collab-accounts.json \
|
|
35
35
|
COLLAB_DATA_DIR=/tmp/collab-service \
|
|
@@ -37,7 +37,7 @@ COLLAB_REPO_ID=jack506255560/codex-collab-demo \
|
|
|
37
37
|
node apps/server/main.mjs
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
运行成功后 `curl http://127.0.0.1:38765/health`。`
|
|
40
|
+
运行成功后 `curl http://127.0.0.1:38765/health`。`wx_alice` 与 `wx_bob` 需要换为企微成员的真实 `userid`,可用下方发现脚本获取。账号参数格式为 `id:role:wecom_userid`;暂时仅通过 API 使用时填 `id:role:-`。旧四段账号参数不再接受,已有账号文件与个人令牌可继续使用,补充企微身份时使用 `scripts/bind-wecom-users.mjs`。管理员身份为默认审核人;编码负责人不能与审核人为同一人。如需自动领取任务,同事机器运行:
|
|
41
41
|
|
|
42
42
|
```sh
|
|
43
43
|
COLLAB_REPO=/path/to/codex-collab-demo \
|
|
@@ -50,57 +50,17 @@ node apps/runner/main.mjs
|
|
|
50
50
|
|
|
51
51
|
`COLLAB_API` 单机实验可用 `http://127.0.0.1:38765`;不同机器应提供 HTTPS,且每台机器的目标仓库含 `main` 和 `agent-collab` 分支。若跨机器分发代码分支,需要在服务和 Runner 均设置 `COLLAB_PUSH=1`,保证 origin 可访问且个人 Git 凭据已配置。服务向 `agent-collab` 推送账本,Runner 向 `codex/task-*` 推送代码;**没有凭据会失败**。不能直接把 localhost 地址给其他同事。
|
|
52
52
|
|
|
53
|
-
##
|
|
53
|
+
## 企业微信群接入
|
|
54
54
|
|
|
55
|
-
1.
|
|
56
|
-
2.
|
|
57
|
-
3.
|
|
58
|
-
4.
|
|
55
|
+
1. 在企业微信创建支持 API 长连接的智能机器人,取得 Bot ID 和 Secret,并加入协作群。它通过官方 `@wecom/aibot-node-sdk` 建立出站 WebSocket,无需公网回调。一个 Bot 对应这一个中心服务,由私有账号文件区分成员。
|
|
56
|
+
2. 在本机交互终端设置 `WECOM_BOT_ID`、`WECOM_BOT_SECRET` 后,运行 `node scripts/discover-wecom.mjs`。等待认证成功,再在目标群 @机器人发送文本。脚本只输出 `chatid` 和 `userid`,不输出正文。记录群和成员 ID 后,按 `Ctrl-C` 停止发现脚本,再启动服务;同一个机器人只保留一个连接。
|
|
57
|
+
3. 新账号直接按上方三段格式生成;已有账号可运行 `node scripts/bind-wecom-users.mjs <旧账号文件> <新账号文件> 'alice:<真实userid>' 'bob:<真实userid>'`,再将 `COLLAB_ACCOUNTS_FILE` 指向新文件。此脚本保留个人令牌哈希,不改原文件。不同账号不能绑定相同 `userid`。
|
|
58
|
+
4. 启动中心服务时同时设置 `WECOM_BOT_ID`、`WECOM_BOT_SECRET` 和 `WECOM_CHAT_IDS`,多个群 ID 用逗号分隔。凭据保存在本机私有环境,群 ID 和成员 ID 不提交到 Git。未配置机器人时只启用 HTTP/MCP API。
|
|
59
|
+
5. 在允许的群由已映射成员依次验证:`协作 创建 写一个功能 | 验收一;验收二`、管理员 `协作 分配 T-... bob`、`协作 状态 T-...`。Bob 的 Runner 领取后,提交代码与测试证据并请求审查;指定审核人核对结果后执行 `协作 审核 T-... 通过` 或 `协作 审核 T-... 退回`,管理员最终执行 `协作 完成 T-...`。批准和完成均需真人明确操作。
|
|
59
60
|
|
|
60
|
-
|
|
61
|
+
认证成功、群消息到达、群回复和主动任务通知需分别验证。排查无回复时可临时设置 `COLLAB_WECOM_DIAGNOSTICS=1` 并重启服务;诊断不输出正文、凭据或群/成员 ID。Runner 需单独启动,HTTP 服务不会代为启动它。
|
|
61
62
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
当前单机测试目录可以这样找(不要打印里面的令牌或环境文件):
|
|
65
|
-
|
|
66
|
-
```sh
|
|
67
|
-
cd "$HOME/codex-collab"
|
|
68
|
-
# 确保 Node.js >= 20 已安装并且 node 位于 PATH。
|
|
69
|
-
root="$(cat "$HOME/.codex-collab-local-test/current")"
|
|
70
|
-
# 仅在你的本机交互终端输入;不要把实际值放在命令行参数或聊天中。
|
|
71
|
-
printf 'Bot ID: '; IFS= read -r WECOM_BOT_ID
|
|
72
|
-
printf '新 Bot Secret(不回显): '; IFS= read -rs WECOM_BOT_SECRET; echo
|
|
73
|
-
export WECOM_BOT_ID WECOM_BOT_SECRET
|
|
74
|
-
node scripts/discover-wecom.mjs
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
等待输出 `WeCom authenticated`,在目标群里向机器人发送文本,例如 `@机器人 协作 状态 T-NONE`;发现脚本仅输出 `{"chatid":"...","userid":"..."}`,**不会输出正文**。这一步如果只有认证而没有群消息,不代表群已接通:检查群是否已加入机器人、消息触发方式和企业管理员配置。在发现脚本按 `Ctrl-C` 关闭连接,再继续下面步骤;**同一个机器人不要让发现脚本和服务同时建立连接**。至少记下一个真实群 `chatid` 及你(管理员 alice)的 `userid`,若同事要在群里发命令,再收集其 `userid`。不要猜 ID、不要贴到 Git。以下命令的引号和交互输入要保留:
|
|
78
|
-
|
|
79
|
-
```sh
|
|
80
|
-
printf '刚发现的群 chatid: '; IFS= read -r WECOM_CHAT_IDS
|
|
81
|
-
printf '你自己的 userid(alice): '; IFS= read -r ALICE_WECOM_USERID
|
|
82
|
-
export WECOM_CHAT_IDS
|
|
83
|
-
node scripts/bind-wecom-users.mjs "$root/accounts.json" "$root/accounts.wecom.json" "alice:$ALICE_WECOM_USERID"
|
|
84
|
-
# 可选:另一位真人需在群里操作时,用他的 userid 重建私有文件;不要把两人的 userid 填成同一个。
|
|
85
|
-
# node scripts/bind-wecom-users.mjs "$root/accounts.json" "$root/accounts.team.json" "alice:$ALICE_WECOM_USERID" 'bob:<同事的真实userid>'
|
|
86
|
-
# 新文件只保留原有的个人 token 哈希,原有 Runner 令牌不会变化。
|
|
87
|
-
. "$root/private.env"
|
|
88
|
-
export COLLAB_ACCOUNTS_FILE="$root/accounts.wecom.json"
|
|
89
|
-
# 仅停原中心服务,保持两个 Runner;先确认旧 PID 确实是本工具的服务。
|
|
90
|
-
old="$(cat "$root/server.pid")"
|
|
91
|
-
ps -p "$old" -o command=
|
|
92
|
-
# 仅在确认该进程属于当前仓库的 apps/server/main.mjs 后,才手动执行:kill "$old"
|
|
93
|
-
node apps/server/main.mjs
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
上面最后一条**前台运行**,该终端不要退出;另开终端 `curl http://127.0.0.1:38765/health` 检查服务。若提示端口占用,先核对旧服务 PID,勿盲目杀其他进程。若群中收到真实回复才算接通。群里的任务示例:
|
|
97
|
-
|
|
98
|
-
1. `协作 创建 给 greet.sh 增加 --upper 行为 | sh test.sh 通过;sh greet.sh --upper 输出 HELLO, WORLD;保留原有默认输出`,记下新任务 `T-...`;不要重复使用历史任务。
|
|
99
|
-
2. `协作 分配 T-... bob`;本机 Bob Runner 自动领取并在隔离副本创建 `codex/task-*` 代码分支。Alice Runner 可读取审查任务并写私有审查记录。
|
|
100
|
-
3. `协作 状态 T-...`;人工核对 `git -C "$root/demo" branch --list 'codex/task-*'`、`sh test.sh`(需要在**任务分支**的 worktree 执行;`main` 故意未完成,不能直接把它的失败当任务失败)和 `$root/server-data` 的 Git 账本;不能把 Runner 记录当人工批准。
|
|
101
|
-
4. 确认代码和测试证据后,由 **alice 真人**发 `协作 审核 T-... 通过`,再发 `协作 完成 T-...`;这两个动作不会由 Runner 自动执行。失败就 `协作 审核 T-... 退回`。
|
|
102
|
-
|
|
103
|
-
**注意**:发现、认证、模拟 E2E、真实群消息送达、群回复、主动任务通知是不同的成功条件;逐项核实。这里使用 `$root/demo` 隔离副本,不修改或推送原始 demo 仓库。`COLLAB_PUSH` 单机保持默认关闭;源仓库与真实企业账号信息勿放入 Git。若之前本机 Runner 不在运行,查看 `ps` 与 `apps/runner/README.md`;不要以为启动 HTTP 服务就会自动启动 Runner。
|
|
63
|
+
当前只支持企微;新群任务明确写入 `channel: "wecom"`。历史任务的原始来源保留,不会被自动改写成企微来源;缺少通道或属于其他通道的任务不能在企微群查询,也不会向企微群发送通知。API 任务可继续通过已授权 API/MCP 操作。
|
|
104
64
|
|
|
105
65
|
## 同事接入 MCP 和 Skill
|
|
106
66
|
|
package/docs/protocol.md
CHANGED
|
@@ -16,6 +16,6 @@ Task IDs are opaque and unique within a repository. `spec.json` defines reposito
|
|
|
16
16
|
|
|
17
17
|
From `open` (the task creator's desktop work), `assigned` (the current owner), or `running`, a verified `handoff` becomes `waiting`. It must contain a concise summary and `refs.branch`, `refs.commit` and `refs.tests`; the server verifies that the pinned commit is the tip of its own `codex/*` branch (on `origin` when Git push is enabled). Only the creator may hand off an open task and only the assignee may hand off assigned/running work. An admin then explicitly assigns the waiting task to the next person; that person's Runner fetches the handoff branch and starts from the pinned commit, not `main`. From `running`, `progress` stays `running`, `blocked` or `run_failed` becomes `blocked`; from `blocked` or `waiting`, `assigned` returns to `assigned`. From `review`, `review_started` records a review run and `review_note` records concise review notes while preserving `review`; `reviewed(changes_requested)` becomes `blocked`. A `review_requested` event must name the reviewing agent. `cancelled` terminates any nonterminal state. A `completed` event is allowed only after approved review, and must carry evidence references as required by the server policy. Run completion and task completion are different events.
|
|
18
18
|
|
|
19
|
-
The server must deduplicate
|
|
19
|
+
WeCom is the only supported chat channel. The server must deduplicate WeCom message IDs with `wecom:<message-id>` idempotency keys. New group-created task `spec.source` includes `chat_id` and `channel: "wecom"`; new group assignments carry the same explicit channel. Unsupported channel values are rejected on create, assign and report. Group commands cannot access a task from another group or a task without explicit WeCom provenance. The schemas describe supported writes; historical metadata can still be read through the API without being rewritten or reinterpreted as WeCom, and tasks from an unsupported or unknown channel do not generate WeCom notifications. For two concurrent modifications, assignments and sequence allocation are serialized at the Git-writing service. A Git commit author string is not an authorization mechanism. Do not commit full chat transcripts, authentication material or private filesystem paths.
|
|
20
20
|
|
|
21
21
|
Schemas: `schemas/task.schema.json`, `schemas/event.schema.json`. A simple executable reducer lives in `packages/protocol/src/index.mjs`.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# 0.8.0:专注企业微信
|
|
2
|
+
|
|
3
|
+
当前只支持企业微信,优先稳定接入、群收发、任务领取、代码交接与真人审核。其他 IM 的接入在企微流程稳定后再评估。
|
|
4
|
+
|
|
5
|
+
- 移除飞书适配器、群信息发现脚本、身份映射入口及 SDK;安装依赖减少 24 个包。
|
|
6
|
+
- 网页向导和 Peer 保持现有企微接入方式,同一项目多个机器人、个人接入包及已绑定 Codex 对话继续使用。
|
|
7
|
+
- 旧中心服务保留企微、HTTP/MCP、Git 任务账本和 Runner。新群任务与分配明确记录 `channel: "wecom"`;其他通道写入被拒绝。
|
|
8
|
+
- 历史任务保留原始来源。属于其他通道或缺少明确企微来源的任务仍可通过已授权 API 读取,不允许企微群查询或发送群通知。
|
|
9
|
+
|
|
10
|
+
## 升级
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
npm install --global xuym-codex-collab@0.8.0
|
|
14
|
+
codex-collab
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
现有 Peer 配置与业务仓库无需迁移。升级后重新启动本机工作台与已运行的机器人连接,使进程加载新版本;需要时在对应 Codex 对话重新连接 MCP。
|
|
18
|
+
|
|
19
|
+
从源码使用旧中心服务时,账号生成脚本只接受 `id:role:wecom_userid`,仅用 API 则填 `id:role:-`。旧四段参数会报错,避免身份错配。已有账号文件与个人令牌继续有效;补充企微身份可使用 `scripts/bind-wecom-users.mjs`,无需重新生成令牌。
|
|
20
|
+
|
|
21
|
+
本轮验证使用临时 Git 仓库、企微消息与 Codex mock,另检查 npm 安装和向导启动;不新增真实群或跨设备验收结论。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xuym-codex-collab",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Git-backed collaboration tools for Codex teams, with MCP, WeCom, and local runners.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -52,7 +52,6 @@
|
|
|
52
52
|
"peer": "node scripts/peer/cli.mjs"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@larksuiteoapi/node-sdk": "1.74.0",
|
|
56
55
|
"@modelcontextprotocol/node": "2.1.1",
|
|
57
56
|
"@modelcontextprotocol/server": "2.3.1",
|
|
58
57
|
"@openai/codex-sdk": "0.161.0",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"summary": { "type": "string", "maxLength": 4000 },
|
|
35
35
|
"assignee": { "type": "string", "minLength": 1 },
|
|
36
36
|
"chat_id": { "type": "string", "minLength": 1 },
|
|
37
|
-
"channel": { "
|
|
37
|
+
"channel": { "const": "wecom" },
|
|
38
38
|
"run_id": { "type": "string", "minLength": 1 },
|
|
39
39
|
"decision": { "enum": ["approved", "changes_requested"] },
|
|
40
40
|
"refs": {
|
package/schemas/task.schema.json
CHANGED
|
@@ -13,6 +13,6 @@
|
|
|
13
13
|
"description": { "type": "string" },
|
|
14
14
|
"base_branch": { "type": "string", "minLength": 1 },
|
|
15
15
|
"acceptance": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
|
|
16
|
-
"source": { "type": "object", "additionalProperties": { "type": "string" } }
|
|
16
|
+
"source": { "type": "object", "properties": { "channel": { "const": "wecom" } }, "additionalProperties": { "type": "string" } }
|
|
17
17
|
}
|
|
18
18
|
}
|