Skip to main content
Glama
README.md
# AgentBridge

[**简体中文**](README.md) | [English](README.en.md) | [Español](README.es.md) | [给 AI Agent 的部署手册](README.ai.md)

AgentBridge 是一个本地优先的 MCP 协作核心,让 Claude Code 和 Codex 能在同一个项目中互相提问、回复、重试、达成一致,并把讨论状态保存在项目本地的 SQLite 数据库中。

> 当前开发版本:v0.8.1。本项目以 GitHub Release 分发本地 stdio MCP;便携包自带 Node.js 运行时,不要求用户另外安装 Node 或 npm。Release 安装后程序独立位于用户目录,不依赖下载目录或源码仓库。

> 当前源码验证状态:UTF-8 校验、TypeScript 构建以及完整自动化测试均已通过,其中 Release MCP 使用官方 SDK 连续完成 30 次握手。`auto/reuse` 会通过同一项目的 collaboration session 复用 Provider 原生会话;`fresh` 会建立隔离 room,并在该 room 内复用自己的 Provider 会话。上述自动化测试不等同于真实 Provider 端到端验收;只有 Claude → Codex 和 Codex → Claude 两个方向都完成实际 `ask_peer` 调用,才能声明真实双向通信可用。

> 如果你准备把本项目交给 Claude、Codex 或其他 AI Agent 自动部署,请优先让它完整阅读 [README.ai.md](README.ai.md)。该手册要求 Agent 明确判断当前连接的是 Codex App 的 App Server 还是独立 Codex CLI,并完成 doctor、配置文件、MCP 工具、真实双向调用四层验收。

> 许可提醒:v0.5.0 起采用 `PolyForm-Noncommercial-1.0.0`,公开许可只允许非商业用途;商业使用需要 HeadStone1 的单独书面授权。v0.4.2 及更早已发布版本继续适用当时的 Apache-2.0,详见 [许可历史](LICENSE_HISTORY.md)。因此 v0.5.0 起应称为“源码可用(source-available)”,不应称为 OSI 开源软件。

## 使用方法(先看这里)

### v0.6 系列最重要的变化:只需全局注册一次

安装后只运行一次 `agentbridge setup`。它会在 `~/.claude.json` 和 `~/.codex/config.toml` 中各写入一个全局 AgentBridge MCP 条目,不固定项目路径、数据库路径或 Codex `cwd`。以后打开项目 A、项目 B 或新项目时,不需要再次 setup。

Claude Code/Codex 第一次调用 AgentBridge 工具时,服务会依次使用显式兼容路径、`CLAUDE_PROJECT_DIR`、MCP `roots/list`、客户端启动目录识别当前项目,并在 `<当前项目>/.agentbridge/agentbridge.sqlite` 建立独立数据库。一个 MCP 进程只绑定一个项目,防止切换工作区后串库。如果客户端没有提供可靠项目上下文,AgentBridge 会明确报错且不会在用户目录建库;让 Agent 在第一次 `ask_peer` 或 `list_discussions` 中传入绝对 `projectPath` 即可。

最短安装与验证命令:

```bash
npm install --global @headstone/agentbridge
agentbridge setup
agentbridge doctor
```

从 v0.5.x 升级时,安装最新版后执行一次 `agentbridge setup`。它会把已登记的项目级 Claude/Codex 条目迁移为全局条目,保留其他 MCP 配置和各项目已有数据库。然后彻底退出并重启 Claude Code 与 ChatGPT/Codex。

### 1. 先选择安装方式

| 你的情况 | 应选择 | 是否需要 Node.js |
|---|---|---|
| 普通用户、Codex App 用户、希望开箱即用 | **GitHub Release 便携包(推荐)** | 不需要,包内自带运行时 |
| 已经使用 Node.js `22.13+` 的开发者 | npm 全局安装 | 需要 |
| 要修改 AgentBridge 源码或参与开发 | 源码安装 | 需要 Node.js、npm 和 Git |

三种方式只需选择一种。不要把 Release、npm 和源码命令混用。普通用户直接从 [AgentBridge Releases](https://github.com/HeadStone1/AgentBridge/releases/latest) 下载即可。

### 2. 安装前必须满足

- Claude Code 和 Codex 必须与 AgentBridge 安装在**同一台机器或同一个虚拟机**中,并且都能访问目标项目目录。宿主机安装的 Codex App 不能直接为虚拟机内的 AgentBridge 提供本地 App Server。
- 先安装并登录 Claude Code。AgentBridge 当前对接的是 Claude Code,不是只有聊天界面的 Claude Desktop。
- Codex 只需满足下面任意一种:
  - 已安装并登录 **Codex App**;**不要求另外安装 Codex CLI**。
  - 已安装并登录 Codex CLI,供没有 Codex App 的服务器或虚拟机使用。
- 使用 Codex App 时,建议先正常打开并完成一次登录。AgentBridge 会发现 App 自带的 Codex 可执行文件并启动受控的 `app-server` 子进程,不会接管已经打开的 GUI 进程。
- 每个要使用 AgentBridge 的项目都必须拥有本地读写权限。项目路径必须真实存在,建议始终使用绝对路径。

### 3. GitHub Release 安装(推荐)

#### Windows 10/11 x64

1. 从 [最新 Release](https://github.com/HeadStone1/AgentBridge/releases/latest) 下载以下两个文件:

   - `AgentBridge-v0.7.1-win32-x64.zip`
   - `SHA256SUMS.txt`

2. 在下载目录校验压缩包。下面命令在哈希不一致时会直接报错:

```powershell
$asset = 'AgentBridge-v0.7.1-win32-x64.zip'
$line = Get-Content -LiteralPath '.\SHA256SUMS.txt' |
  Where-Object { $_ -match "\s+$([regex]::Escape($asset))$" }
if (-not $line) { throw "SHA256SUMS.txt 中找不到 $asset" }
$expected = (($line -split '\s+')[0]).ToLowerInvariant()
$actual = (Get-FileHash -LiteralPath ".\$asset" -Algorithm SHA256).Hash.ToLowerInvariant()
if ($actual -ne $expected) { throw "SHA-256 校验失败,禁止安装" }
"SHA-256 verified: $asset"
```

3. 解压 ZIP,进入解压后的 `AgentBridge-v0.7.1-win32-x64` 目录,然后执行一次全局安装:

```powershell
Unblock-File -LiteralPath '.\install.ps1'
powershell -ExecutionPolicy Bypass -File .\install.ps1
```

`Test-Path` 必须返回 `True`。安装完成时,最后应看到类似输出:

```text
AgentBridge 0.7.1 installed in C:\Users\<用户名>\.agentbridge
Launcher: C:\Users\<用户名>\.agentbridge\bin\agentbridge.cmd
Full uninstall: & "C:\Users\<用户名>\.agentbridge\bin\agentbridge.cmd" uninstall-all --yes --remove-program
AgentBridge is registered globally. Restart Claude Code and Codex, then open any project.
```

在这些提示之前会依次输出 `setup` 和 `doctor` 的 JSON。`setup.configured` 应列出 Claude 和 Codex 两项配置结果;`changed: false` 只表示配置已经是最新状态,不是失败。`doctor.ok: false` 表示仍有环境或登录项要处理,按 `recommendations` 修复后重跑即可;只有 doctor 命令本身无法启动时安装脚本才会失败。

4. 运行诊断:

```powershell
$ab = "$env:USERPROFILE\.agentbridge\bin\agentbridge.cmd"
& $ab version
& $ab doctor
```

常见 Windows 错误:

- `Resolve-Path` 或“找不到路径”:项目目录不存在或路径写错;先让 `Test-Path` 返回 `True`。
- 脚本被阻止:确认压缩包来自本项目 Release 且 SHA-256 已通过,然后运行上面的 `Unblock-File` 和 `-ExecutionPolicy Bypass`。
- `Access denied`:默认安装到当前用户的 `%USERPROFILE%\.agentbridge`,通常不需要管理员权限;检查安全软件的“受控文件夹访问”以及当前用户是否能写入自己的用户目录。
- 找不到 launcher:确认 `%USERPROFILE%\.agentbridge\current` 和 `%USERPROFILE%\.agentbridge\bin\agentbridge.cmd` 均存在,不要从解压目录直接移动安装后的内部文件。

#### Linux x64 / macOS Apple Silicon

先确认系统与架构:

```bash
uname -s
uname -m
```

| 输出 | 下载文件 |
|---|---|
| `Linux` + `x86_64` | `AgentBridge-v0.7.1-linux-x64.tar.gz` |
| `Darwin` + `arm64` | `AgentBridge-v0.7.1-darwin-arm64.tar.gz` |

当前 Release 不提供 Linux ARM64 或 Intel Mac x64 便携包;这些平台请使用 npm 或源码安装。

下载对应压缩包和 `SHA256SUMS.txt` 后校验。Linux 示例:

```bash
asset='AgentBridge-v0.7.1-linux-x64.tar.gz'
grep "  $asset$" SHA256SUMS.txt | sha256sum -c -
```

macOS 示例:

```bash
asset='AgentBridge-v0.7.1-darwin-arm64.tar.gz'
expected=$(awk -v file="$asset" '$2 == file {print $1}' SHA256SUMS.txt)
actual=$(shasum -a 256 "$asset" | awk '{print $1}')
test -n "$expected" && test "$actual" = "$expected" || { echo 'SHA-256 校验失败,禁止安装' >&2; exit 1; }
echo "SHA-256 verified: $asset"
```

解压、补充执行权限并安装:

```bash
tar -xzf "$asset"
cd "${asset%.tar.gz}"
chmod +x install.sh
./install.sh
~/.agentbridge/bin/agentbridge version
~/.agentbridge/bin/agentbridge doctor
```

压缩包通常已经保留执行权限;如果出现 `Permission denied`,重新执行 `chmod +x install.sh`。安装脚本会依次运行全局 `setup` 和 `doctor`;完成时应看到 `AgentBridge 0.7.1 installed in ...`、`Launcher: ...`、`Full uninstall: ...` 和重启提示。

### 4. npm 安装(已有 Node.js 的开发者)

npm 包名为 [`@headstone/agentbridge`](https://www.npmjs.com/package/@headstone/agentbridge),要求 Node.js `22.13` 或更高版本。建议全局安装,不建议使用一次性的 `npx` 执行 `setup`,因为 MCP 配置需要稳定的程序路径。

```bash
node --version
npm install --global @headstone/agentbridge
agentbridge --version
agentbridge setup
agentbridge doctor
```

升级 npm 安装版本:

```bash
npm install --global @headstone/agentbridge@latest
agentbridge setup
```

npm 安装不携带 Node 运行时。不想自行管理 Node/npm 时使用 GitHub Release 便携包。

### 5. 源码安装(仅用于开发)

```bash
git clone https://github.com/HeadStone1/AgentBridge.git
cd AgentBridge
npm ci
npm test
node packages/cli/dist/index.js setup
node packages/cli/dist/index.js doctor
```

`npm test` 会先构建全部 workspace,再运行单元和集成测试。源码安装的详细开发流程见后文“开发与发布”。

### 6. 只安装 Codex App、没有 Codex CLI

这是受支持的正常用法,不需要为了 AgentBridge 再全局安装 Codex CLI。运行 `doctor` 后重点检查:

```json
{
  "providers": {
    "codexAppServer": true,
    "codexSelectedBackend": {
      "mode": "app-server",
      "source": "desktop"
    }
  }
}
```

- `mode: "app-server"` 表示实际选择了 App Server 协议。
- `source: "desktop"` 表示发现的是 Codex App 自带运行文件。
- `codexAppDetected` 只表示 GUI 进程是否正在运行,是诊断信息,不是可用性的判定条件。
- 没有独立 PATH 安装的 Codex CLI 时,不能把 `codex --version` 是否成功当成唯一验收标准;以 `codexSelectedBackend` 和后面的真实 MCP 调用为准。
- 如果显示 `source: "system"` 或 `mode: "cli"`,说明当前实际走的是系统 CLI,而不是 Codex App 后端。

### 7. 全局注册与多项目隔离

安装时执行一次 `setup` 即可。Claude 的全局条目位于 `~/.claude.json`,Codex App、CLI 和 IDE 共用的全局条目位于 `~/.codex/config.toml`。配置中只保存启动命令和 `AGENTBRIDGE_AGENT` 身份,不保存固定项目路径、数据库路径或 `cwd`。

每个客户端项目会启动或绑定自己的 stdio MCP 进程。首次工具调用自动创建该项目的 `.agentbridge/project.json` 和 `.agentbridge/agentbridge.sqlite`,因此项目 A 与项目 B 的讨论仍然物理隔离。切换到另一个项目时请打开新的客户端任务/窗口;一个已经绑定的 MCP 进程不会在运行中改绑,以免串库。

配置后完全退出并重新启动 Claude Code 和 Codex App;仅关闭项目窗口不一定会重新加载 MCP。从 v0.5.x 升级也只需重新执行一次无参数 `agentbridge setup`。

### 配置自主调用与讨论生命周期

AgentBridge 的运行时配置分为“全局默认”和“项目覆盖”两层,不需要再为每个项目手工设置环境变量:

- 全局配置:`~/.agentbridge/config.json`;可通过 `AGENTBRIDGE_CONFIG_HOME` 更换配置根目录。
- 项目配置:`<项目>/.agentbridge/config.json`;可以提交到 Git,与团队共享项目规则。
- 生效优先级:程序默认值 < 全局配置 < 项目配置 < 兼容性的 `AGENTBRIDGE_*` 环境变量。
- 没有写入项目配置的字段会继承全局值;项目配置只需要保存差异。

直接在项目目录运行下面的命令,会打开一次性的本地配置页面(监听 `127.0.0.1`;关闭页面或空闲超时后退出):

```bash
agentbridge ui
```

页面可以分别编辑全局默认、当前项目覆盖,并显示最终生效值及其来源。Release 用户和源码用户分别替换为自己的 launcher 或 `node packages/cli/dist/index.js ui` 即可。项目路径未指定时会使用当前工作目录;从用户根目录、磁盘根目录或安装目录启动时不会把这些目录误当成项目。

最小配置示例:

```json
{
  "version": 1,
  "invocation": {
    "autonomous": true
  },
  "discussion": {
    "maxDuration": "2h",
    "idleTimeout": "10m",
    "turnHardLimit": "1h",
    "maxTurns": 20
  },
  "session": {
    "retentionDays": 30,
    "archiveOnClose": false
  }
}
```

`invocation.autonomous` 默认是 `true`,允许 Agent 在判断需要跨模型协作时自主调用 `ask_peer`。设置为 `false` 后,MCP 只接受明确由用户发起的调用;调用方需要把 `ask_peer.invocationOrigin` 标记为 `user_requested`,标记为 `autonomous` 的调用会被拒绝。Skill 只描述讨论流程和质量要求,不能绕过这项配置。

生命周期字段支持 `ms`、`s`、`m`、`h`、`d`:

- `discussion.maxDuration`:整场讨论的最长墙钟时间,支持 `null` 表示不设置整体时限。
- `discussion.idleTimeout`:讨论在无新消息时的静默超时。
- `discussion.startupTimeout`、`stallGrace`、`turnHardLimit`、`leaseTimeout`、`terminationGrace`:启动、卡顿、单轮、租约和终止宽限控制。
- `discussion.maxTurns`:1–50 的安全上限,不代表必须完成这么多轮。

即使将 `maxDuration` 设为 `null`,静默、单轮、provider 和进程级安全控制仍然生效。完整字段、校验范围、备份行为及环境变量兼容映射见 [配置说明](docs/CONFIGURATION.md)。

### 8. 分四层验证安装结果

`doctor` 会检查安装模式、Node、项目元数据、项目登记、数据库读写、Claude/Codex MCP 配置、启动命令和 provider 后端。单项失败会写入 JSON 的 `recommendations`,不会因项目未初始化或 provider 不可用而中途崩溃,也不会为了检查而创建不存在的项目。它仍然**不能证明已经打开的 Claude Code 或 Codex App 已重新加载 MCP 配置**,因此请依次完成下面四层验证。

#### 第一层:运行环境

```powershell
& "$env:USERPROFILE\.agentbridge\bin\agentbridge.cmd" doctor 'C:\你的项目目录'
```

Linux/macOS 或 npm 安装时使用对应的 `agentbridge doctor` 命令。重点检查:

- 顶层 `ok` 为 `true`;若为 `false`,按 `recommendations` 从上到下处理后重跑。
- `node.ok` 和 `installation.valid` 为 `true`;Release/npm 用户还应确认 `installation.sourceIndependent` 为 `true`,源码开发模式为 `false` 是预期结果。
- `project.initialized`、`project.metadataValid` 和 `registry.registered` 为 `true`。
- `database.ok`、`configuration.claude.ok`、`configuration.codex.ok` 为 `true`。
- `providers.claudeCli` 为 `true`。
- Codex App 用户检查 `codexSelectedBackend.mode=app-server`、`source=desktop`。
- Codex CLI 用户检查 `codexSelectedBackend.mode=cli`,并确认选择的是预期命令。

#### 第二层:配置文件确实写入

Windows:

```powershell
Select-String -LiteralPath "$env:USERPROFILE\.claude.json" -Pattern 'agentbridge'
Select-String -LiteralPath "$env:USERPROFILE\.codex\config.toml" -Pattern 'mcp_servers.agentbridge|AGENTBRIDGE_AGENT|AGENTBRIDGE_PROJECT_PATH|AGENTBRIDGE_DB_PATH|cwd'
```

Linux/macOS:

```bash
grep -n 'agentbridge' ~/.claude.json
grep -nE 'mcp_servers.agentbridge|AGENTBRIDGE_AGENT|AGENTBRIDGE_PROJECT_PATH|AGENTBRIDGE_DB_PATH|cwd' ~/.codex/config.toml
```

Claude 条目应位于用户级 `mcpServers.agentbridge`;Codex 条目应位于用户级 `[mcp_servers.agentbridge]`。Claude 身份为 `claude`,Codex 身份为 `codex`;两边都不应固定 `AGENTBRIDGE_PROJECT_PATH`、`AGENTBRIDGE_DB_PATH` 或 `cwd`。

#### 第三层:两个客户端已经加载 MCP

1. 完全退出并重新打开 Claude Code 和 Codex App/CLI,然后在两边打开同一个项目。
2. 在各客户端的 MCP/工具列表中确认服务器名 `agentbridge` 已加载。客户端版本不同,入口可能显示为 MCP、Tools 或 Integrations。
3. 应能看到八个工具:`ask_peer`、`reply_peer`、`get_discussion`、`wait_discussion`、`list_discussions`、`close_discussion`、`cancel_discussion`、`retry_discussion`。
4. 如果配置文件正确但工具没有出现,查看客户端自己的 MCP 启动错误;`doctor` 无法代替这一检查。

#### 第四层:真实双向调用

先在 Claude Code 中执行:

```text
请使用 AgentBridge 的 ask_peer 工具询问 Codex:检查当前项目 README,并概括项目用途。
```

再在 Codex 中执行相反方向的请求:

```text
请使用 AgentBridge 的 ask_peer 工具询问 Claude:检查当前项目 README,并指出一项可以改进的地方。
```

最后检查讨论是否已保存:

```powershell
& "$env:USERPROFILE\.agentbridge\bin\agentbridge.cmd" status 'C:\你的项目目录'
```

Linux/macOS 或 npm 安装使用 `agentbridge status /absolute/path/to/your-project`。只有两个方向的真实工具调用都成功,才能确认端到端联通。

### 9. 检查更新、安装更新和回滚

Windows:

```powershell
$ab = "$env:USERPROFILE\.agentbridge\bin\agentbridge.cmd"
& $ab version
& $ab update
& $ab update --install
& $ab rollback
```

Linux/macOS:

```bash
~/.agentbridge/bin/agentbridge version
~/.agentbridge/bin/agentbridge update
~/.agentbridge/bin/agentbridge update --install
~/.agentbridge/bin/agentbridge rollback
```

`update` 只检查,不修改文件;只有 `update --install` 才会下载对应平台的 Release 包,校验 `SHA256SUMS.txt` 后安装。程序按版本保存在 `~/.agentbridge/versions/`,项目中的配置和 SQLite 数据不会被覆盖。`rollback` 只切换到已经安装的上一版本。

升级后重新运行 `setup` 可以确认 Claude/Codex 配置仍指向当前安装位置。

### 10. 项目卸载和一键完整卸载

删除某一个项目的数据时执行:

```powershell
& "$env:USERPROFILE\.agentbridge\bin\agentbridge.cmd" uninstall 'C:\你的项目目录' --yes
```

或 npm/Unix:

```bash
agentbridge uninstall /absolute/path/to/your-project --yes
```

该命令只会:

- 删除当前项目的 `.agentbridge` 运行数据和讨论数据库,但保留 `.agentbridge/config.json` 项目配置。
- 从自动清理登记中移除该项目。
- 保留全局 Claude/Codex MCP 条目、其他项目、其他 MCP 服务以及 AgentBridge 程序本身。

它**不会删除** Release 安装目录 `%USERPROFILE%\.agentbridge` 或 `~/.agentbridge`,也不会卸载 npm 全局包。需要保留讨论记录时,先备份项目的 `.agentbridge` 目录;项目配置会被自动保留。Windows、Linux、macOS 使用相同语义。

要删除所有已登记项目的 AgentBridge 配置、讨论数据和程序本身,使用一键完整卸载。该命令需要两个明确确认参数,避免误操作。

Windows Release 安装:

```powershell
& "$env:USERPROFILE\.agentbridge\bin\agentbridge.cmd" uninstall-all --yes --remove-program
```

Linux/macOS Release 安装:

```bash
~/.agentbridge/bin/agentbridge uninstall-all --yes --remove-program
```

npm 安装:

```bash
agentbridge uninstall-all --yes --remove-program
```

完整卸载会读取 `~/.agentbridge/projects.json`,并兼容发现旧版本已写入 `~/.claude.json` 的 AgentBridge 项目;先删除各项目 `.agentbridge` 数据和全局/旧版 MCP 条目,再卸载程序。若任一项目清理失败,程序文件会保留,方便修复权限后重试。源码开发模式不会自动删除 Git 仓库;请先运行 `uninstall-all --yes` 清配置和数据,再自行决定是否删除源码目录。

可以在 Claude Code 或 Codex 编码任务中要求代理运行上述命令,但它仍必须获得你的命令执行授权。AgentBridge 不提供可被普通 MCP 调用直接触发的自毁工具。Windows Release 完整卸载会在后台等待 AgentBridge 进程退出;执行命令后请完全退出 Claude Code 与 Codex,程序目录随后会被删除。Linux/macOS 可在当前命令退出后删除已打开的程序文件。

## 目录

- [它如何工作](#它如何工作)
- [使用方法(先看这里)](#使用方法先看这里)
- [给 AI Agent 的部署手册](README.ai.md)
- [English README](README.en.md)
- [README en español](README.es.md)
- [当前功能与边界](#当前功能与边界)
- [虚拟机源码开发快速开始](#虚拟机源码开发快速开始)
- [配置 Claude 和 Codex](#配置-claude-和-codex)
- [配置自主调用与讨论生命周期](#配置自主调用与讨论生命周期)
- [首次真实联通测试](#首次真实联通测试)
- [MCP 工具说明](#mcp-工具说明)
- [讨论状态说明](#讨论状态说明)
- [管理命令](#管理命令)
- [环境变量](#环境变量)
- [更新到最新版](#更新到最新版)
- [备份、恢复与卸载](#备份恢复与卸载)
- [常见问题](#常见问题)
- [开发与发布](#开发与发布)
- [安全说明](#安全说明)

## 它如何工作

Claude Code 和 Codex 各自启动一个短生命周期的 stdio MCP 进程。两个 MCP 进程共享项目中的 SQLite 数据库,但各自代表不同的代理身份。

```mermaid
flowchart LR
    C["Claude Code"] -->|"stdio · AGENT=claude"| CM["AgentBridge MCP"]
    X["Codex"] -->|"stdio · AGENT=codex"| XM["AgentBridge MCP"]
    CM -->|"App Server 优先 · CLI 回退"| XP["Codex peer"]
    XM -->|"调用 Claude CLI"| CP["Claude peer"]
    CM --> DB[(".agentbridge/agentbridge.sqlite")]
    XM --> DB
```

AgentBridge 不会把代码或讨论上传到自己的云服务。实际模型请求仍由本机安装并已登录的 Claude/Codex 客户端发送给各自的服务商。

## 当前功能与边界

已实现:

- 使用 Node 内置 `node:sqlite` 的 SQLite WAL 存储。
- 双 MCP 进程共享讨论、消息、决定、审计事件、会话租约和 provider 原生会话 ID。
- `ask_peer`、`reply_peer`、`get_discussion`、`wait_discussion`、`list_discussions`、`close_discussion`、`cancel_discussion`、`retry_discussion` 八个 MCP 工具。
- Claude CLI、Codex CLI 和 Codex App Server 的会话 ID 通过项目级 collaboration session 持久化;`auto/reuse` 可跨同项目 discussion 续接 AgentBridge 所有的会话,`fresh` 保持隔离;续接失败时使用 SQLite 历史重建有界上下文。
- 自动发现 Codex Desktop 或新版 ChatGPT Desktop 自带的 Codex 运行程序,优先使用 App Server stdio 协议。
- App Server 不可用时自动回退到 Codex CLI `exec --json` 和 `exec resume`。
- 讨论轮数、重试次数、总消息长度和持续时间限制。
- 全局/项目两级 JSON 配置、配置来源追踪,以及用完即走的 `agentbridge ui` 配置页面。
- `init`、`setup`、`ui`、`doctor`、`status`、`register-session`、`version`、`update`、`rollback`、项目 `uninstall` 和系统级 `uninstall-all` 管理命令。
- 增量修改 Claude JSON 与 Codex TOML 配置,修改前生成备份。
- 并发 SQLite 启动锁等待与双进程回归测试。

当前边界:

- 必须在运行 AgentBridge 的系统或虚拟机内安装并登录 Claude/Codex;宿主机登录状态不会自动进入虚拟机。
- Codex App Server 适配器会启动一个新的受控子进程,不会接管已打开的 Codex Desktop 私有进程。
- `agentbridge ui` 只启动一次性的本地 HTTP 配置页面;没有常驻 Web 服务、PostgreSQL/Redis、严格模式或等待队列。
- 正在执行中的 provider 请求仍无法在进程崩溃后原地恢复;代码签名、静默后台更新和云端部署仍是后续工作。
- 是否能完成真实调用最终取决于本机 provider 版本、账号权限、网络和模型配额。

## 虚拟机源码开发快速开始

本节只适用于需要从源码构建 AgentBridge 的开发者。只想在虚拟机中使用 AgentBridge 时,优先按 README 顶部选择 Release 或 npm 安装。以下命令以 Linux/bash 为主;PowerShell 可执行同样的 `git`、`npm` 和 `node` 命令,只需把路径换成 Windows 路径。

### 1. 检查必需软件

```bash
git --version
node --version
npm --version
claude --version
# 仅 Codex CLI 用户需要:
codex --version
```

要求:

- Node.js `22.13` 或更高版本。
- Git。
- Claude 侧需要可调用的 Claude CLI;Codex 侧可以只安装 Codex Desktop,也可以安装 Codex CLI。
- Claude/Codex 已在虚拟机内完成登录,并能各自单独执行一次普通请求。

GUI 用户不要求手工把 Codex 加入 `PATH`。新版 ChatGPT Desktop 的 MSIX 包内 runtime 不允许包外程序直接执行,因此 AgentBridge v0.7.1 随 npm/便携包安装官方 `@openai/codex` CLI,并优先用它启动独立 stdio App Server;同时兼容旧 Codex Desktop 的 `%LOCALAPPDATA%\OpenAI\Codex\bin\codex.exe` 及其版本化运行文件,最后才尝试 PATH 中的 `codex`。ChatGPT Desktop 登录不保证独立 CLI 已登录;若 `codex login status` 未登录,在同一 Windows 用户下执行一次 `codex login`。

如果 `node --version` 低于 `v22.13.0`,先升级 Node。Node 22.5–22.12 的 `node:sqlite` 默认仍需要实验开关,不在本项目支持范围内。

### 2. 获取或更新代码

首次下载:

```bash
git clone --branch main --single-branch https://github.com/HeadStone1/AgentBridge.git
cd AgentBridge
```

已经克隆过:

```bash
cd AgentBridge
git pull --ff-only origin main
```

确认版本:

```bash
git log -1 --oneline
```

### 3. 安装依赖并构建

```bash
npm ci
npm test
```

`npm test` 会先完成构建,再运行全部测试。测试成功时应看到所有测试通过;构建产物位于各 package 的 `dist/` 目录。

### 4. 全局配置

源码模式也只需运行一次:

```bash
node packages/cli/dist/index.js setup
node packages/cli/dist/index.js doctor
```

`setup` 会增量更新用户级 `~/.claude.json` 和 `~/.codex/config.toml`,修改前创建 `*.agentbridge.bak`,并保留其他 MCP 服务。两个条目使用同一入口,但身份分别为 `AGENTBRIDGE_AGENT=claude` 和 `AGENTBRIDGE_AGENT=codex`。

全局条目不能包含固定的 `AGENTBRIDGE_PROJECT_PATH`、`AGENTBRIDGE_DB_PATH` 或 Codex `cwd`。项目路径在 MCP 运行时识别,数据库始终位于识别出的 `<项目>/.agentbridge/agentbridge.sqlite`。

如果使用自定义配置位置:

```bash
node packages/cli/dist/index.js setup \
  --claude-config /path/to/claude.json \
  --codex-config /path/to/codex/config.toml
```

### 5. 运行诊断

```bash
node packages/cli/dist/index.js doctor
node packages/cli/dist/index.js status /absolute/path/to/project
```

重点检查 `doctor`:`configuration.claude.scope` 和 `configuration.codex.scope` 应为 `global`,两端 `dynamicRouting` 应为 `true`;`providers.codexSelectedBackend.mode` 默认优先为 `app-server`,`source: desktop` 表示发现 Codex App 自带后端。尚未调用过工具的项目没有 `.agentbridge` 属于正常状态,doctor 会显示 `autoInitialize: true`,不要求为每个项目 setup。

相关用户级配置和 MCP roots 能力见 [Claude Code MCP 文档](https://code.claude.com/docs/en/mcp) 与 [OpenAI Codex MCP 文档](https://learn.chatgpt.com/docs/extend/mcp?surface=cli)。

### Codex GUI 优先与 App Server

默认策略为 `auto`,无需提供 Codex CLI 路径:

1. 先检查显式环境变量。
2. 自动查找 Codex Desktop 自带的可执行程序。
3. 对每个候选程序运行 `app-server --help` 能力探测。
4. 优先启动独立的 stdio App Server;不支持时才回退到 `codex exec`。

App Server 是 OpenAI 为富客户端集成提供的公开协议,stdio 是默认传输。参见 [OpenAI Codex App Server 文档](https://learn.chatgpt.com/docs/app-server)。

一般用户只需运行:

```bash
node packages/cli/dist/index.js setup
node packages/cli/dist/index.js doctor
```

如果自动发现失败,可以显式指定支持 App Server 的可执行程序:

```bash
node packages/cli/dist/index.js setup \
  --codex-app-command /absolute/path/to/codex-executable
```

也可以设置:

```bash
export AGENTBRIDGE_CODEX_APP_COMMAND=/absolute/path/to/codex-executable
```

也可以强制后端模式:

```bash
# 只允许 App Server,探测失败时直接报错
node packages/cli/dist/index.js setup --codex-mode app-server

# 强制使用传统 CLI 通道
node packages/cli/dist/index.js setup --codex-mode cli \
  --codex-command /absolute/path/to/codex
```

GUI 优先不等于接管当前窗口。AgentBridge 会复用 GUI 安装中公开的 Codex 运行程序和登录配置,但会启动新的受控 App Server 子进程;它不会连接到已经打开的 Codex Desktop 私有会话,也不会读取当前 GUI 对话。

## 首次真实联通测试

完成配置后,完全退出并重新启动 Claude Code 和 Codex,使 MCP 配置重新加载。

### 从 Claude 发起

在 Claude Code 中输入类似请求:

```text
请使用 AgentBridge 的 ask_peer 工具询问 Codex:
检查当前项目的 README,并用一句话回复是否能正常读取项目。
```

Claude 调用的工具参数应类似:

```json
{
  "peer": "codex",
  "message": "检查当前项目的 README,并用一句话回复是否能正常读取项目。",
  "projectPath": "/absolute/path/to/AgentBridge"
}
```

成功响应通常包含:

- `discussionId`,例如 `dsc_...`。
- `messageId`。
- `status: "DISCUSSING"`。
- provider 可用时的 `peerResponse`。

### 从 Codex 发起

在 Codex 中输入:

```text
请使用 AgentBridge 的 ask_peer 工具询问 Claude:
总结 package.json 中提供的 npm scripts。
```

Codex 侧 `peer` 必须是 `claude`。

### 检查持久化结果

```bash
node packages/cli/dist/index.js status .
```

也可以让任一代理调用:

```json
{
  "name": "list_discussions",
  "arguments": {
    "projectPath": "/absolute/path/to/AgentBridge"
  }
}
```

如果真实调用失败,讨论记录仍可能保存为 `PEER_BUSY`、`FAILED` 或 `TIMEOUT`,可通过 `status` 或 `get_discussion` 查看。

## MCP 工具说明

### `ask_peer`

开始一场新讨论,并调用另一代理。

```json
{
  "peer": "codex",
  "message": "请审查这个实现方案。",
  "projectPath": "/project/path",
  "mode": "review"
}
```

- Claude 侧只能选择 `codex`。
- Codex 侧只能选择 `claude`。
- `projectPath` 可省略,默认使用 MCP 进程当前工作目录。
- 返回的 `discussionId` 用于后续所有操作。
- `mode` 可选:`review`、`discussion`、`deep-discussion`。`review` 是一次独立评审;`discussion` 和 `deep-discussion` 会在两个 Provider 间自动交替,达成共识后立即进行结论 hash 双签;安全上限分别为 3、12、20,不是必须完成的次数。
- 自动模式要求 Claude 和 Codex 两个 connector 都已配置;缺少任意一个时会明确返回 `UNAVAILABLE`,不会静默降级为单轮回答。
- `ask_peer` 固定同步执行:`review` 等待本次对端回复,自动模式等待整场讨论到完成、需要用户决策或已记录失败后才返回,不再转入后台并返回中间 `WAIT`。
- `maxTurns` 可选,范围 1–50;它覆盖模式默认值,只是安全上限,不是必须聊满的目标。
- `get_discussion` 会返回持久化的 `mode`、`maxTurns` 和最新 `lastSignal`;对端明确返回 `NEEDS_USER_DECISION` 时讨论会暂停交给用户决策。

### `reply_peer`

继续手动/review 讨论,并把回复发送给另一参与者;自动讨论运行期间不能插入回复,暂停后可用它提交用户决定并恢复讨论。

```json
{
  "discussionId": "dsc_xxxxxxxxxxxx",
  "message": "我接受第一点,但建议修改超时策略。"
}
```

发送者由当前 MCP 宿主身份决定,不需要在参数中指定。

### `get_discussion`

读取讨论详情、全部消息以及最终决定。

```json
{
  "discussionId": "dsc_xxxxxxxxxxxx"
}
```

### `wait_discussion`

兼容性观察工具,用于读取已有 discussion 的后续状态;正常的同步 `ask_peer` / `reply_peer` 流程不需要调用它,等待超时也不会改变讨论状态:

```json
{
  "discussionId": "dsc_xxxxxxxxxxxx",
  "timeoutMs": 30000,
  "afterMessageId": "msg_xxxxxxxxxxxx"
}
```

同一问题必须复用原 `discussionId`;不要为了读取状态再次调用 `ask_peer`。`setup` 会为 Claude Code 和 Codex 安全安装四项轻量 Skill:核心协作 Skill 可自动路由,三个专项 Skill 仅在明确调用时启用;同名自定义或已修改 Skill 不会被覆盖。

### `list_discussions`

列出讨论。可按项目路径过滤:

```json
{
  "projectPath": "/project/path"
}
```

不传 `projectPath` 时会列出当前数据库中的全部讨论。

### `close_discussion`

记录当前代理对结论的接受,并自动请求对端确认:

```json
{
  "discussionId": "dsc_xxxxxxxxxxxx",
  "conclusion": "采用 WAL,并在申请写锁前设置有界等待。"
}
```

重要规则:

- AgentBridge 会把规范结论和 decision hash 发送给对端,要求对端返回结构化的接受或拒绝结果。
- 对端接受同一 hash 时自动记录第二份 agreement,进入 `COMPLETED` 并生成决定记录。
- 对端接受同一 hash 时自动完成;拒绝确认时会根据 `resolution` 区分继续讨论或进入 `NEEDS_USER_DECISION`。无法统一的目标、风险或偏好会保留双方观点并交给用户决策。
- 对端临时不可用、回复格式无效或需要重试时保持可恢复状态,调用方可以在同一讨论上继续或重试。
- 自动确认不可用时仍兼容手工双签:另一个代理可使用相同 `discussionId` 和完全相同的 `conclusion` 调用一次 `close_discussion`。

讨论消息始终完整保存在 SQLite 中。发送给新 provider 会话的恢复上下文采用“首条提案 + 尽可能多的最近消息”,默认历史字符预算为 48,000,并对单条历史消息截断;成功续接 provider 原生会话时不会重复注入历史。

### `cancel_discussion`

取消讨论并释放本地会话租约:

```json
{
  "discussionId": "dsc_xxxxxxxxxxxx"
}
```

### `retry_discussion`

在 `FAILED`、`PEER_BUSY`、`TIMEOUT` 或 `NEEDS_USER_DECISION` 后,重新派发最后一条消息:

```json
{
  "discussionId": "dsc_xxxxxxxxxxxx"
}
```

失败重试会消耗重试预算。达到上限后,讨论进入 `NEEDS_USER_DECISION`。

## 讨论状态说明

| 状态 | 含义 | 常用后续操作 |
|---|---|---|
| `CREATED` | 已创建,尚未正式讨论 | 等待派发 |
| `DISCUSSING` | 正在讨论 | `reply_peer`、`close_discussion` |
| `AGREED` | 双方已同意,正在生成/完成决定 | 通常自动进入 `COMPLETED` |
| `IMPLEMENTING` | 预留的实现阶段 | 当前本地流程较少使用 |
| `REVIEWING` | 预留的审查阶段 | 当前本地流程较少使用 |
| `COMPLETED` | 已完成 | `get_discussion` |
| `FAILED` | provider 或处理失败 | `retry_discussion` |
| `PEER_BUSY` | 对端繁忙或不可用 | 检查 provider,再重试 |
| `TIMEOUT` | 超时或达到资源限制 | 检查原因,再重试或取消 |
| `NEEDS_USER_DECISION` | 存在无法自动统一的分歧,或自动恢复/重试预算已用尽 | 用户解决分歧、决定重试或取消 |
| `CANCELLED` | 已取消 | 只读查看历史 |

## 管理命令

Release 安装用户在 Windows 使用:

```powershell
& "$env:USERPROFILE\.agentbridge\bin\agentbridge.cmd" <command> [path] [options]
```

Linux/macOS 使用:

```bash
~/.agentbridge/bin/agentbridge <command> [path] [options]
```

从源码运行的开发者使用:

```bash
node packages/cli/dist/index.js <command> [path] [options]
```

| 命令 | 作用 |
|---|---|
| `init [path]` | 只创建 `.agentbridge/project.json` |
| `setup [path]` | 全局配置 MCP;可选 path 只用于预初始化一个项目 |
| `doctor [path]` | 分项检查安装、项目登记、配置、数据库、启动命令和 provider;返回修复建议 |
| `status [path]` | 显示会话、讨论和审计指标 |
| `cleanup [path] --older-than-days N [--yes]` | 预览或删除过期的已完成/已取消讨论;无 `--yes` 时只预览 |
| `register-session` | 手动登记 provider 原生会话 |
| `version` | 显示当前程序版本 |
| `update` | 从 GitHub Releases 检查稳定版更新,不安装 |
| `update --install` | 下载、校验并安装当前平台的最新稳定版 |
| `update --channel beta` | 检查包含预发布版本的更新通道 |
| `rollback` | 切换到本机已经安装的上一版本 |
| `ui [path]` | 打开一次性的全局/项目配置页面;默认使用当前项目目录 |
| `uninstall [path] --yes` | 删除该项目状态;保留全局 MCP 条目和程序目录 |
| `uninstall-all --yes` | 删除所有已登记项目状态及全局/旧版 MCP 条目;保留程序 |
| `uninstall-all --yes --remove-program` | 完整卸载所有项目和 Release/npm 程序;源码仓库不会自动删除 |

查看帮助:

```bash
node packages/cli/dist/index.js help
```

手动登记会话示例:

```bash
node packages/cli/dist/index.js register-session \
  --provider codex \
  --session-id SESSION_ID \
  --status IDLE \
  --project-path . \
  --metadata '{"source":"manual"}'
```

支持的会话状态为 `IDLE`、`BUSY`、`BRIDGE_OWNED`、`ARCHIVED` 和 `UNKNOWN`。

## 环境变量

| 变量 | 用途 | 默认值/说明 |
|---|---|---|
| `AGENTBRIDGE_AGENT` | 当前 MCP 身份 | `claude`;Codex 侧必须显式设置为 `codex` |
| `AGENTBRIDGE_CONFIG_HOME` | 全局/项目配置根目录 | `~/.agentbridge` |
| `AGENTBRIDGE_PROJECT_PATH` | 显式项目路径兼容覆盖 | 全局 setup 不写入;运行时优先于 `CLAUDE_PROJECT_DIR`、MCP roots 和 cwd |
| `AGENTBRIDGE_DB_PATH` | 旧版/测试数据库覆盖 | 全局模式不写入;数据库自动位于 `<项目>/.agentbridge/agentbridge.sqlite` |
| `AGENTBRIDGE_CLAUDE_COMMAND` | Claude CLI 命令或绝对路径 | `claude` |
| `AGENTBRIDGE_CODEX_MODE` | Codex 后端策略 | `auto`;也可设为 `app-server` 或 `cli` |
| `AGENTBRIDGE_CODEX_COMMAND` | Codex 可执行程序覆盖路径 | 未设置时自动发现 Desktop,再尝试 PATH |
| `CODEX_CLI_PATH` | Codex CLI 备用路径 | 无 |
| `AGENTBRIDGE_CODEX_MODEL` | Codex CLI 模型覆盖 | 使用 Codex 默认模型 |
| `AGENTBRIDGE_CODEX_APP_COMMAND` | 仅用于 App Server 的可执行程序覆盖路径 | 未设置时自动发现 Desktop |
| `AGENTBRIDGE_RECOVERY_MAX_AGE_MS` | 旧讨论恢复阈值 | 默认 30 分钟 |
| `AGENTBRIDGE_MAX_TURNS` | 覆盖所有模式的实质性 Provider 回复安全上限 | 未设置时按模式取 3/12/20;协议确认不消耗上限,设置范围 1–50 |
| `AGENTBRIDGE_DISCUSSION_RETENTION_DAYS` | 启动时清理终态讨论 | 未设置或 `0` 表示永久保留;可选 1–3650 |
| `AGENTBRIDGE_ARCHIVE_SESSIONS_ON_CLOSE` | close/cancel 后尝试归档 Provider 原生会话 | 默认关闭;设为 `1` 启用,Provider 不支持时安全跳过 |
| `AGENTBRIDGE_AUTONOMOUS_INVOCATION` / `AGENTBRIDGE_ALLOW_AUTONOMOUS` | 兼容性覆盖自主调用开关 | `true`;JSON 配置优先级较低 |
| `AGENTBRIDGE_MAX_DURATION_MS` | 兼容性覆盖整场讨论最长时间 | 毫秒;设为 `0` 表示不限制整体时长 |
| `AGENTBRIDGE_IDLE_TIMEOUT_MS` | 兼容性覆盖静默超时 | 毫秒 |
| `AGENTBRIDGE_STARTUP_TIMEOUT_MS`、`AGENTBRIDGE_STALL_GRACE_MS` | 兼容性覆盖启动/卡顿控制 | 毫秒 |
| `AGENTBRIDGE_TURN_HARD_LIMIT_MS`、`AGENTBRIDGE_TIMEOUT_MS`、`AGENTBRIDGE_TERMINATION_GRACE_MS` | 兼容性覆盖单轮、租约/旧版超时和终止宽限 | 毫秒 |

不要把测试专用的 `AGENTBRIDGE_TEST_*` 变量用于生产配置。

## 更新到最新版

### Release 安装用户

检查新版不会修改本机:

```powershell
& "$env:USERPROFILE\.agentbridge\bin\agentbridge.cmd" update
```

确认后安装:

```powershell
& "$env:USERPROFILE\.agentbridge\bin\agentbridge.cmd" update --install
```

更新流程会:

1. 调用 `HeadStone1/AgentBridge` 的 GitHub Releases API。
2. 选择当前操作系统和 CPU 架构对应的包。
3. 下载 Release 包与 `SHA256SUMS.txt`。
4. 校验 SHA-256;缺少校验文件或校验失败时拒绝安装。
5. 安装到 `~/.agentbridge/versions/<版本>/`,再切换 `current` 版本指针。
6. 保留旧版本、项目 MCP 配置和项目 SQLite 数据。

安装成功后重启 Claude Code 和 Codex。需要回退时:

```powershell
& "$env:USERPROFILE\.agentbridge\bin\agentbridge.cmd" rollback
```

Linux/macOS 把命令入口替换为 `~/.agentbridge/bin/agentbridge`。

### 源码安装用户

在虚拟机或目标机器中执行:

```bash
cd AgentBridge
git status
git pull --ff-only origin main
npm install
npm test
npm run build
node packages/cli/dist/index.js setup
node packages/cli/dist/index.js doctor
```

如果 `git status` 显示有未提交修改,先确认这些修改是否需要保留。需要保留时:

```bash
git stash
git pull --ff-only origin main
git stash pop
```

不要在不了解本地修改用途时执行强制重置。

## 备份、恢复与卸载

### 配置备份

AgentBridge 修改已有配置前会创建:

- `~/.claude.json.agentbridge.bak`
- `~/.codex/config.toml.agentbridge.bak`

每次配置前建议另外复制一份带时间戳的备份,因为固定名称的 `.agentbridge.bak` 可能被后续操作覆盖。

Linux 恢复示例:

```bash
cp ~/.claude.json.agentbridge.bak ~/.claude.json
cp ~/.codex/config.toml.agentbridge.bak ~/.codex/config.toml
```

### 讨论数据备份

停止 Claude/Codex 后,复制整个 `.agentbridge` 目录:

```bash
cp -a .agentbridge .agentbridge.backup
```

数据库可能使用 `-wal` 和 `-shm` 文件,因此不要只复制主 `.sqlite` 文件,也不要在活跃写入期间直接复制。

### 卸载

```bash
node packages/cli/dist/index.js uninstall . --yes
```

该操作会:

- 从 Claude/Codex 配置中移除名为 `agentbridge` 的 MCP 条目。
- 保留其他 MCP 服务和 provider 配置。
- 删除当前项目的 `.agentbridge` 运行数据和讨论数据库,保留 `.agentbridge/config.json`。

卸载会删除本地讨论数据;项目配置不会被删除,需要保留讨论数据时仍应先执行备份。

这只是“项目卸载”:不会删除 Release 安装目录 `%USERPROFILE%\.agentbridge` / `~/.agentbridge`,也不会卸载 npm 全局包。完整卸载直接运行:

```bash
agentbridge uninstall-all --yes --remove-program
```

Release 安装用户使用固定 launcher 的完整路径运行同一命令;详见 README 顶部“项目卸载和一键完整卸载”。完整卸载失败时不会继续删除程序,修复输出中的权限或配置错误后可以重试。

## 常见问题

### `Cannot find module 'node:sqlite'` 或 SQLite 实验功能错误

原因:Node 版本过低。

```bash
node --version
```

升级到 Node `22.13` 或更高版本,然后重新执行:

```bash
npm install
npm run build
```

### Claude 或 Codex 后端诊断异常

Claude Code 用户先执行:

```bash
claude --version
```

Codex CLI 用户再执行:

```bash
codex --version
```

只安装 Codex App 的用户不要求 PATH 中存在 `codex` 命令,应检查 `providers.codexSelectedBackend.mode` 是否为 `app-server`、`source` 是否为 `desktop`。如果 provider 只在某个 shell 中可用,请在 MCP 配置中把 `AGENTBRIDGE_CLAUDE_COMMAND` 或 `AGENTBRIDGE_CODEX_COMMAND` 设置为绝对路径。还要确认 provider 已在 AgentBridge 所在的同一台机器或虚拟机内完成登录。

### MCP 工具中出现了错误的 `peer`

例如 Codex 侧的 `ask_peer` 仍只允许选择 `codex`,通常说明 Codex MCP 被错误识别成 Claude。

检查 Codex 的 `config.toml`:

```toml
env.AGENTBRIDGE_AGENT = 'codex'
```

Claude 侧则应为:

```json
"AGENTBRIDGE_AGENT": "claude"
```

修改后完全重启两个 provider。

### 两边看不到同一场讨论

确认两个配置中的 `AGENTBRIDGE_DB_PATH` 完全相同,并且虚拟机用户对该目录有读写权限。建议使用绝对路径。

### `database is locked`

当前版本会在启动阶段进行 5 秒有界等待。若仍出现锁错误:

1. 确认使用的是最新 `main` 并已重新构建。
2. 确认数据库不在不可靠的网络共享或不支持标准文件锁的挂载点。
3. 关闭遗留的 Claude/Codex/MCP 进程后重试。
4. 不要让多个不同项目误用同一个数据库路径。

### `peer is not available` 或 `PEER_BUSY`

执行:

```bash
node packages/cli/dist/index.js doctor .
```

确认 Claude CLI 或 Codex 实际选中的 App Server/CLI 后端可运行、账号已登录、网络正常。问题解决后调用 `retry_discussion`,无需重新创建讨论。

### Codex 后端不可用或返回 `no agent message`

先运行诊断并查看实际选中的后端:

```bash
node packages/cli/dist/index.js doctor .
```

如果 `codexSelectedBackend.mode` 是 `app-server`,检查对应程序能否执行 `app-server --help`。如果模式是 `cli`,再独立验证:

```bash
codex --version
codex exec --json "只回复 OK"
```

如果底层命令本身失败,先修复 Codex 安装、登录或网络;AgentBridge 无法绕过 provider 的认证或账号限制。

### 修改配置后 MCP 工具没有出现

1. 检查 JSON/TOML 语法。
2. 确认 `command` 和 `args` 都是绝对路径。
3. 重新执行 `npm run build`。
4. 完全退出并重启 Claude Code/Codex。
5. 再运行 `doctor`。

### `git pull --ff-only` 失败

先执行:

```bash
git status
git branch --show-current
git remote -v
```

确认当前在 `main`,远端是 `https://github.com/HeadStone1/AgentBridge.git`,并处理未提交修改后再更新。

### Windows 提示 Git `dubious ownership`

仅在确认仓库确实属于当前用户后执行:

```powershell
git config --global --add safe.directory C:/absolute/path/to/AgentBridge
```

不要把不可信目录加入安全列表。

## 开发与发布

开发要求 Node.js `22.13` 或更高版本。

```bash
npm install
npm test
npm run build
npm run baseline
npm run release
npm run release:package
npm run release:npm
```

脚本说明:

- `npm test`:运行单元和集成测试。
- `npm run build`:按依赖顺序构建所有 workspace。
- `npm run baseline`:测量 MCP 启动时间和内存基线。
- `npm run release`:重新构建并生成 `release/agentbridge-mcp.mjs` 与 `release/agentbridge-cli.mjs`。
- `npm run release:package`:为当前平台生成包含 Node 运行时、固定 launcher 和安装脚本的 `artifacts/AgentBridge-v版本-平台-架构/`。
- `npm run release:npm`:生成只包含编译 bundle 和必要文档的 `artifacts/npm/`,包名为 `@headstone/agentbridge`。

`release/*.mjs` 是需要 Node 的单文件 bundle;最终 GitHub Release 压缩包会同时携带 Node 运行时,因此普通用户不需要预装 Node/npm。它仍不是代码签名的原生 EXE。

### 发布新版本

1. 修改根目录 `package.json` 的版本号,并更新 README/DEVLOG。
2. 执行:

```bash
npm ci
npm test
npm run release:package
```

3. 提交代码后创建与 `package.json` 完全一致的标签:

```bash
git tag v0.7.1
git push origin main
git push origin v0.7.1
```

标签推送后,[GitHub Actions Release 工作流](.github/workflows/release.yml) 会再次执行构建和测试,然后分别在 Windows、Linux、macOS runner 上打包自带运行时的压缩包,生成 `SHA256SUMS.txt`,最后创建 GitHub Release。标签与 `package.json` 版本不一致时工作流会拒绝发布。

预发布版本使用标准 SemVer,例如把版本改为 `0.4.1-beta.1`,再推送 `v0.4.1-beta.1` 标签;工作流会把它标记为 GitHub prerelease,用户通过 `update --channel beta` 检查。

### 首次发布 npm 包

第一次创建 `@headstone/agentbridge` 时,需要包所有者在自己的终端完成 npm 登录和首次发布,不要把密码、Token 或一次性验证码提交到仓库或发送给其他人:

```bash
npm login
npm run release:npm
npm pack ./artifacts/npm --dry-run
npm publish ./artifacts/npm --access public
```

首次发布成功后,在 npmjs.com 的 `@headstone/agentbridge` 包设置中添加 GitHub Actions Trusted Publisher:

- GitHub owner:`HeadStone1`
- Repository:`AgentBridge`
- Workflow:`release.yml`
- Environment:留空,除非以后专门创建 npm 发布 environment

之后推送与 `package.json` 版本一致的 Git 标签时,Release 工作流会通过 GitHub OIDC 发布 npm 包并生成 provenance,不需要在 GitHub Secrets 中保存长期 npm Token。若相同版本已由首次手工发布,工作流会检测后跳过,避免重复版本导致失败。

项目主要目录:

```text
packages/protocol       协议类型和状态机
packages/storage        SQLite 存储
packages/audit          审计与指标
packages/connectors     Claude/Codex/App Server 连接器
packages/collaboration  协作业务逻辑
packages/mcp            MCP Server 与 stdio 入口
packages/cli            管理命令与配置写入
tests                   单元和双进程集成测试
release                 打包后的 Node artifacts
artifacts               当前平台的便携 Release 目录(不提交 Git)
scripts                 打包、安装与固定 launcher
.github/workflows       标签触发的跨平台 Release 自动化
```

## 安全说明

- Claude 连接器使用 print/plan 模式,不开启 permission bypass。
- Codex 连接器默认使用 `read-only` sandbox,不默认启用危险权限绕过。
- 子进程通过参数数组启动,未使用 shell 字符串拼接。
- 对端讨论内容被标记为不可信上下文,但模型输出仍应由调用方审查。
- `.agentbridge/agentbridge.sqlite` 包含讨论消息和审计信息,默认未加密;请按项目敏感级别保护文件权限和备份。
- provider 配置备份可能包含其他 MCP 环境变量或凭据,不要上传到公共仓库。
- AgentBridge 不会替代 Claude/Codex 自身的权限、沙箱、认证和网络安全策略。

## 许可证与商业使用

AgentBridge v0.5.0 及以后版本采用 [PolyForm Noncommercial License 1.0.0](LICENSE):

- 个人研究、实验、学习、业余项目等许可证列明的非商业用途可以使用。
- 除版权持有人外,公开许可证不授予商业使用权;销售、付费托管、纳入商业产品或把 AgentBridge 作为付费交付的重要组成部分前,必须取得 HeadStone1 的单独书面商业授权。
- 对用途是否属于商业用途存在疑问时,请先停止部署并联系作者确认,不要自行推定获准。
- 第三方依赖和随包运行时继续适用各自的许可证。

完整条款见 [LICENSE](LICENSE),必需版权通知见 [NOTICE](NOTICE),实际场景说明见 [COMMERCIAL_LICENSE.md](COMMERCIAL_LICENSE.md)。这些说明不能追溯改变已经按 Apache-2.0 发布的 v0.4.2 及更早版本;版本边界见 [LICENSE_HISTORY.md](LICENSE_HISTORY.md)。

由于禁止商业用途不符合 OSI 对开源许可证“不得限制使用领域”的定义,本项目从 v0.5.0 起是公开源代码的非商业软件,而不是 OSI 认可的开源软件。此处是项目许可说明,不是法律意见。

## 最小验收清单

部署完成后逐项确认:

- [ ] `node --version` 不低于 `22.13`。
- [ ] `npm test` 全部通过。
- [ ] `npm run build` 成功。
- [ ] Claude 配置包含 `AGENTBRIDGE_AGENT=claude`。
- [ ] Codex 配置包含 `AGENTBRIDGE_AGENT=codex`。
- [ ] 两边使用同一个绝对 `AGENTBRIDGE_DB_PATH`。
- [ ] `doctor` 能检测到需要的 provider。
- [ ] Claude 能通过 `ask_peer` 收到 Codex 回复。
- [ ] Codex 能通过 `ask_peer` 收到 Claude 回复。
- [ ] `status` 能看到刚才的讨论记录。
- [ ] 一边提交结论且对端结构化接受后,讨论自动进入 `COMPLETED`;无法自动确认时手工双签仍可完成。