---
title: "支持哪些 agent"
description: "「支持哪些 agent」：yokoten 使用指南的一章。"
canonical: https://yokoten.app/zh/docs/guide/works-with
lang: zh-CN
source: https://github.com/yokoten-labs/yokoten/blob/v0.1.2/docs/i18n/zh-CN/guide.md
ref: "v0.1.2"
---

> For AI agents: the documentation index is at https://yokoten.app/llms.txt. To set up yokoten in a project, follow https://yokoten.app/agents.md.

# 支持哪些 agent

yokoten 能管住九种 AI 编程 agent，它们守的是同一套规矩。下表是唯一的名单，也写明每种覆盖得怎么样。表里写“是”的，
都真跑过：在一个用完就删的仓库里让 agent 执行 `git push --tags`，守卫把它拦了下来。“没有完整跑过”的意思是：
agent 列在这里，但还没有确认它的守卫能端到端拦住。光看文档不算数。这张表由
`src/agents/runtimes/runtime.ts` 里的运行时契约和上面带日期的实跑记录生成。两者不一致时测试会失败。

| Agent | 钩子写在哪（`init` 负责写） | 怎么拦 | 能力（改写 · 收尾 · 信任 · 失败 · 角色） | 真跑过吗 | 要注意 |
|---|---|---|---|---|---|
| Claude Code | `.claude/settings.json`：PreToolUse 和 Stop | 退出码 2，理由写在 stderr | 是 · 是 · 是 · 拦下 · 是 | 是，2026-10-19：无界面模式，模型用 DeepSeek 的 `deepseek-flash` | 无 |
| GitHub Copilot CLI | 也是 `.claude/settings.json`：Copilot 会读这个文件 | 退出码 2，理由同时以 JSON 写到 stdout | 否 · 是 · 是 · 放行 · 是 | 是，2026-10-19：Copilot CLI 1.0.98，`copilot -p`，模型 `gpt-6-luna`（Auto 自动选的） | 要先信任这个文件夹，才跑仓库钩子：在那里运行 `yokoten trust`。没信任就一声不吭地跳过。钩子超时的话，这次调用会放行 |
| Antigravity CLI（`agy`） | `.agents/hooks.json`：名叫 `yokoten` 的那一项，PreToolUse | 在 stdout 输出 `{"decision": "deny"}` | 否 · 否 · 否 · 拦下 · 是 | 是，2026-10-19：agy 1.4.2，`agy -p`，模型 `gemini-3.8-flash-high` | 还没有收尾检查。`.yokoten/` 不在的话，每次调用都会被拒：agy 出错时一律拦下 |
| Codex CLI | `.codex/hooks.json`：PreToolUse 和 Stop | 退出码 2，理由写在 stderr | 否 · 是 · 是 · 拦下 · 是 | 是，2026-10-19：Codex 0.163.0，`codex exec`，模型用 DeepSeek 的 `deepseek-flash` | 要先信任这个文件夹，再信任这两个钩子，才会跑：在那里运行 `yokoten trust`。没信任的钩子，`codex exec` 一声不吭地跳过 |
| Muse Code | `.muse/hooks.json`：PreToolUse 和 Stop | 退出码 2，理由写在 stderr | 否 · 是 · 是 · 放行 · 否 | 是，2026-10-19：Muse Code 1.4.10，`muse exec --trust-workspace`，模型 `muse-spark-1.3-contributor` | 要先信任这个文件夹，才跑钩子：运行 `yokoten trust`。Muse 不把 `YOKOTEN_ROLE` 传给钩子，所以在 Muse 里每个会话都当成 lead。也没见过它传 `YOKOTEN_RELEASE_APPROVAL`，所以发版要到 Muse 外面去。钩子出错或超时的话，这次调用会放行 |
| DeepSeek Harness（`dsh`） | `.dsh/hooks.json`：PreToolUse；再用 `.dsh/yokoten.patch.yml` 让 dsh 加载它 | 退出码 2，理由写在 stderr | 否 · 否 · 否 · 放行 · 是 | 是，2026-10-20：dsh 0.2.1-rc.2，`dsh headless --patch .dsh/yokoten.patch.yml`，DeepSeek 的默认模型 | 钩子要靠一个桥接插件才会跑，每个 profile 都得自己装，见 [DeepSeek Harness](https://yokoten.app/zh/docs/guide/works-with.md#deepseek-harness)。没装插件或启动时没带 patch，dsh 一个钩子都不跑，也不提醒。Windows 上还管不住（#332）。还没有收尾检查 |
| Grok CLI（`grok`） | `.grok/hooks/yokoten.json`：PreToolUse 和 Stop | 在 stdout 输出 `permissionDecision: "deny"`，退出码 2 | 是 · 是 · 是 · 拦下 · 是 | 是，2026-10-20：Grok CLI 1.0.52，`grok -p --trust --always-approve`，默认模型 | 要先信任这个文件夹，才跑项目钩子：在那里运行 `yokoten trust`。没信任就一声不吭地跳过。它也会跑 `.claude/settings.json` 里的钩子，所以一次调用可能查两遍，这是有意的 |
| Gemini CLI | `.gemini/settings.json`：BeforeTool 和 AfterAgent | 退出码 2，理由写在 stderr | 否 · 是 · 是 · 拦下 · 否 | 没有完整跑过：个人 Google 账号 2026-06-18 起不能再登录，要付费 API key 或企业授权 | 谷歌给个人用户的 agent 现在是 Antigravity CLI |
| OpenCode | `.opencode/plugins/yokoten.ts`：OpenCode 2 的 permission `evaluate`，以及 OpenCode 1 的 `tool.execute.before` | OpenCode 2 把 `effect` 设为 deny；OpenCode 1 抛出理由 | 否 · 否 · 否 · 拦下 · 否 | 是，2026-10-23：OpenCode 2.1.4，`opencode-go/deepseek-v4.1-flash`，插件就是 `init` 写的那份；2026-10-25：`opencode-go/glm-5.3-flash`（Z.ai 的 GLM-5.3 Flash）跑的命令被守卫拦下 | 没有收尾检查。守卫失败或超时就拒绝这次调用。不是只读、又读不出命令或路径时，也拒绝。子 agent 的调用没有完整跑过 |
| 其他 agent | 无 | `AGENTS.md` 里的规则；还有提交检查，不管是谁提交的，坏提交都会被拦下 | — | | |
>
用户级的钩子由 `install` 写：会话开头的带路提示，加上命令守卫。它们写进
`~/.claude/settings.json`；有 `~/.codex`、`~/.gemini` 文件夹的话，也写进
`~/.codex/hooks.json` 和 `~/.gemini/settings.json`。有 Muse 的配置文件夹的话，Muse Code 两个都装，写进
`~/.config/muse/settings.json`（设了 `$XDG_CONFIG_HOME` 就写进 `$XDG_CONFIG_HOME/muse/settings.json`）。有 `~/.grok` 的话，Grok CLI 只装命令守卫，写进
`~/.grok/hooks/yokoten.json`：会话开头钩子的输出，Grok 只给你看，不给 agent 看。有 `~/.gemini/config` 的话，Antigravity CLI 只装命令守卫，写进 `~/.gemini/config/hooks.json`。有 `~/.copilot` 的话，Copilot CLI 也装命令守卫，写进 `~/.copilot/hooks/yokoten.json`。两者都还没有收尾检查：agy 的 Stop 事件没有重入信号，Copilot 的钩子超时后会放行调用。有 `~/.config/opencode` 的话，OpenCode 只装命令守卫，写进 `~/.config/opencode/plugins/yokoten.ts`。Grok 的信任检查关掉时（设了 `GROK_FOLDER_TRUST=0`，或者 `~/.grok/config.toml` 里写了 `[folder_trust] enabled = false`），`doctor` 把每个文件夹都当成已信任。在 Codex 里，`apply_patch` 要改哪些
文件，守卫都会查，在 shell 里跑的也查。
`CLAUDE_CONFIG_DIR`、`CODEX_HOME` 或 `XDG_CONFIG_HOME` 设成完整路径的话，`install` 就写进那个文件夹，工具自己也从那里读。

每个工具都要你先信任，项目钩子才会跑：

- **Claude Code**：在你信任的文件夹里跑项目钩子。
- **Copilot CLI**：也是在你信任的文件夹里才跑。用 `copilot -p` 时，要设
  `COPILOT_ALLOW_ALL=true`，只有正好写成 `true` 才会顺带信任当前文件夹。只加
  `--allow-all-tools` 不行，钩子不会跑。
- **Antigravity CLI**：我们用 `agy -p` 跑的时候，文件夹不在它的信任列表里，`.agents/hooks.json`
  照样跑了。它跑钩子时，工作目录是 `.agents` 文件夹。网上的指南说
  `--dangerously-skip-permissions` 会跳过钩子；但在 agy 1.4.2 里，加了这个参数钩子照样跑。
  两种说法都别指望。
- **Codex**：项目要先设成信任，项目钩子才会跑。然后在 `/hooks` 里逐个批准，或者在文件夹里运行
  `yokoten trust`。Codex 记的是命令本身，命令一改，就得重新批准；`yokoten trust` 会写进新的哈希。
- **Muse Code**：工作区要先设成信任，才会跑 `.muse/hooks.json`；没信任就一声不吭地跳过。
  用 `muse exec` 时，加 `--trust-workspace` 就是这一次信任当前文件夹。项目里
  `.agents/skills` 下的技能，也要信任以后才读。在工位外面，Muse Code 会读
  `~/.claude/CLAUDE.md`，并把这个文件发给 Muse 的模型。把 Muse 放进工位里跑，你的主目录
  就会藏起来。那个文件在的时候，`doctor` 会告诉你。工位里仍能看见这个文件时，`doctor`
  会说主目录还看得见，这个工位需要处理。
- **Grok CLI**：文件夹要先设成信任，才跑 `.grok/hooks/`；没信任就一声不吭地跳过。在文件夹里运行
  `yokoten trust`，或者在这里的会话里输入 `/hooks-trust`。`yokoten trust` 只写 Grok 自己的信任文件，只针对这个文件夹。信任以后，
  Grok 也会跑 `.claude/settings.json` 里的钩子，所以一次调用可能查两遍。这是有意的：
  Grok 自己的钩子可能被跳过，比如文件夹没信任，或者仓库提交了一个空的钩子文件。这时
  Claude Code 的钩子照样守着。多查一遍大约多花 0.1 秒。
- **Gemini CLI**：文件夹要先设成信任，项目钩子才会跑。要在仓库根目录启动 Gemini：它只读
  启动时所在文件夹里的 `.gemini/settings.json`。新加或改过的钩子，第一次跑之前它会提醒你一次。

`init` 会给每个工具打印一句话，告诉你怎么信任这个文件夹。之后 `doctor` 去读各个工具
自己记信任的文件（只读），哪个工具还没信任这个文件夹，就提醒你：

| 工具 | 信任记在哪 | 怎样才算信任了 |
|---|---|---|
| Copilot CLI | `~/.copilot/config.json` 里的 `trustedFolders`（设了 `$COPILOT_HOME` 就在那里） | 这个文件夹本身，或者它的上级文件夹 |
| Codex | `~/.codex/config.toml`（设了 `$CODEX_HOME` 就在那里）里的 `[projects]` 和 `[hooks.state]` | 仓库文件夹本身，一个字都不能差；每个钩子也要按现在的内容信任过 |
| Muse Code | `~/.config/muse/trust.json`（设了 `$XDG_CONFIG_HOME` 就是 `$XDG_CONFIG_HOME/muse/trust.json`） | 仓库文件夹本身，一个字都不能差 |
| Grok CLI | `~/.grok/trusted_folders.toml`（设了 `$GROK_HOME` 就在那里）里的 `[folders."<文件夹>"]`，`trusted = true` | 仓库文件夹本身，一个字都不能差 |

只有这个工具的主目录在（`~/.copilot`、`~/.codex`、`~/.config/muse`、`~/.grok`），`doctor` 才查它。
主目录在、文件却没有或读不了时，`doctor` 会说 "can't check"（查不了），不会说 ok。

worker 靠 `YOKOTEN_ROLE=worker` 认出来。在 Codex 里，子 agent 的 `agent_type` 带 worker
字样的，也算 worker。Copilot CLI、Antigravity CLI 和 DeepSeek Harness 调钩子时不说是哪种子 agent，只看
`YOKOTEN_ROLE`。Gemini CLI 开了严格的环境变量清理后，钩子里拿不到 `YOKOTEN_ROLE`。
这时 yokoten 在 Gemini CLI 里分不出谁是 worker：每个会话都当成 lead，只有 lead 能改的
文件，worker 改了也拦不住。Muse Code 跑钩子时只留下几个环境变量，`YOKOTEN_ROLE` 不在其中，
所以在 Muse Code 里也一样：每个会话都当成 lead。Grok CLI 会把 `YOKOTEN_ROLE` 传给钩子；子 agent 的
`subagentType` 带 worker 字样的，也算 worker。服务器上的锁照样有效：代码负责人，还有一个
改不了 CI 的 bot。

取消或删除一次 Actions 运行，lead 和 worker 都会被拦住。
守卫会拦 `gh run cancel` 和 `gh run delete`。用 `gh api` 或 `yokoten bot` 做同样的事，也会被拦住。
`gh run rerun`、`view`、`list` 和 `watch` 仍然放行。请仓库主人在 Actions 页面上取消或删除。
`repositories/<id>` 和 `repos/<owner>/<repo>` 是同一种路径。
路径里的 `.` 和 `..` 会先化简，再拿来比对。
路径里的词不分大小写，所以 `Actions` 和 `Cancel` 也算同一次调用。
`gh api` 里连写的短选项会被拦住。一个短选项自己带着值，例如 `-XDELETE`，仍然放行。
方法或路径来自 shell 变量，而且可能指向一次运行时，会被拦住。
`repos/` 或 `repositories/` 后面只有一个变量，而且方法不是 GET，也会被拦住。
`gh run` 的子命令如果来自 shell，会被拦住。
`gh` 必须写出它自己的命令名。`gh extension install`、`upgrade`、`exec` 和 `browse` 会被拦住。
`exec` 会运行已经装好的扩展。`browse` 可以装上一个扩展。
`gh config set aliases` 会被拦住。`gh alias list` 和 `gh extension list` 仍然放行。
`gh alias set` 和 `gh alias import` 对 lead 和 worker 都拦住。别名要仓库主人自己加上。

worker 用 shell 写只有 lead 能改的文件，守卫也会拦，跟拦编辑一样（#402）。它看这些写法：
重定向（`>`、`>>`、`>|`、`&>`），`sed -i`、`perl -i`、`tee`、`cp`、`mv`、`install`、`ln`、
`dd of=`、`truncate`、`rm`，还有 git 的 `checkout`、`restore`、`rm`、`mv` 和 `apply`。
重定向的文件名加了引号，或者跟前面的词连在一起（`echo x>"AGENTS.md"`），也照样算。
`git apply` 时，守卫会读补丁，看它改哪些文件，但只读不超过 1 MB 的普通文件；别的补丁文件
一律拦下 worker。worker 的 `git commit` 如果会提交这类文件，也会被拦。原因是提交检查只能从
`YOKOTEN_ROLE` 知道谁是 worker，而 Claude Code 的子 agent（比如 `yokoten:worker`）没有这个
变量。`cat`、`grep` 这种只读不写的命令照常放行。跟拦编辑一样，只在用了 yokoten 的仓库（有
`yokoten.json`）里才拦。如果任务本来就要改这类文件，lead 启动 worker 时加上
`YOKOTEN_LEAD_ONLY_OK=AGENTS.md,.github/workflows/ci.yml`：从仓库根目录写起的路径，用逗号
隔开，带 `*` 的按通配符算。只写一个 `*` 就是放行所有只有 lead 能改的文件。守卫和提交检查
都会放行这些路径。子 agent 跟 lead 用同一套环境变量，所以这种任务要交给单独开的会话。会话
开始时，带 `YOKOTEN_ROLE=worker` 的会话会听到 `doctor` 说 "this session is a worker:
lead-only files are guarded"。单独开的 worker 会话没看到这句话，就是没设这个变量。子 agent
不会开新会话，所以听不到这句话。

## DeepSeek Harness

DeepSeek Harness（`dsh`）靠一个桥接插件来跑 Claude Code 格式的命令钩子。这个插件不在 dsh
的安装包里。`init` 只写钩子文件和启动用的 patch，剩下的步骤打印出来让你自己做。它什么都不装，
也不碰 `~/.dsh`。

1. 给你用的每个 profile（`tui`、`headless`、`web`）装上桥接插件，再装它依赖的协议包。
   `dsh plugin add` 要用 `pnpm`，得先装好。少了协议包，插件就加载不了钩子。

   ```sh
   dsh plugin --profile tui add @deepseek-ai/dsh-hooks-claude-code@0.2.1-rc.2
   dsh plugin --profile tui add @deepseek-ai/dsh-hook-protocol@0.2.1-rc.2
   ```

2. 在仓库根目录启动 dsh，`--patch` 紧跟在 profile 名字后面：

   ```sh
   dsh tui --patch .dsh/yokoten.patch.yml
   dsh headless --patch .dsh/yokoten.patch.yml --json "<任务>"
   ```

   patch 里写的 `.dsh/hooks.json` 是相对路径，dsh 从启动时所在的文件夹去找。在别的文件夹启动，
   或者启动时没带 patch，dsh 就一个钩子都不跑。
   `.dsh/yokoten.patch.yml` 归 yokoten 管，每次 `init` 都会整个重写。你自己的配置请写到别的文件里。

dsh 认工具名时要一字不差，而且是小写，所以钩子的 matcher 写的是 `bash|pwsh|edit|write`。
`pwsh` 是 dsh 在 Windows 上用的 shell，先写进去，留给以后用；现在 Windows 上还管不住。
在 Windows 上，dsh 用 PowerShell 来跑钩子，可 yokoten 的守卫是一条 POSIX shell 命令，PowerShell
跑不了。插件把这种失败当成“放行”，所以每次调用都会直接通过。在 Windows 上，`doctor` 和 `init`
都会照实说（#332）。
这里没有收尾检查：插件的 Stop 事件没有防死循环的机制。`doctor` 会查这两个文件，也会去
`${DSH_HOME:-~/.dsh}/profiles` 里看两个包装了没有；找不到 dsh 的目录，就说 can't check。
插件出了问题也不吭声，直接放行，所以文件都在也说明不了什么。要确认守卫真的在跑，只能真拦一次：
在一个用完就删的仓库里让 dsh 执行 `git push --tags`，看它被拒。

## 让 Claude Code 或 Codex 用 DeepSeek 的模型

守卫装在 agent 里，跟用哪个模型无关。所以 Claude Code 和 Codex 换成 DeepSeek 的模型，
规矩还是一样。上表里这两次都用的是 `deepseek-flash`。

Claude Code 走 DeepSeek 兼容 Anthropic 的接口：

```sh
export CLAUDE_CONFIG_DIR=~/.config/claude-deepseek   # 一个没登录 claude.ai 的配置文件夹
export ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic
export ANTHROPIC_API_KEY=<你的 DeepSeek key>
export ANTHROPIC_MODEL=deepseek-flash
claude
```

一定要单独设 `CLAUDE_CONFIG_DIR`。配置文件夹里要是登录过 claude.ai，Claude Code 发出去的
是那个账号的令牌，不是你的 key。DeepSeek 每次都回 401，Claude Code 不提示，一直重试到
超时，看起来就像卡住了。也别用 `--bare`：它会跳过钩子，守卫就不跑了。

Codex 走 DeepSeek 兼容 OpenAI 的接口。把下面这段写进 `$CODEX_HOME/config.toml`
（默认是 `~/.codex/config.toml`），再设好 `DEEPSEEK_API_KEY`：

```toml
model = "deepseek-flash"
model_provider = "deepseek"

[model_providers.deepseek]
name = "DeepSeek"
base_url = "https://api.deepseek.com"
env_key = "DEEPSEEK_API_KEY"
wire_api = "responses"
```

Codex 0.163.0 已经不接受 `wire_api = "chat"`。它会提示找不到 `deepseek-flash` 的模型信息，
但照样能跑。

---

上一章: [四层](https://yokoten.app/zh/docs/guide/four-layers.md)
下一章: [安装和命令](https://yokoten.app/zh/docs/guide/install-and-commands.md)
