一个会话把三十个文件读进上下文,后面还没开始写代码,窗口就满了;想让另一个 Agent 并行查资料,又得再开一个终端、再配一遍模型与权限。CXAgent 是一台终端里的编码 Agent 工作台:它把搜索这类「读很多、结论很少」的活委派给后台子智能体,父会话只收结论,每个子智能体有自己的上下文、会话标签页与逐次工具调用记录。本教程按官方 README 与 CONFIG.md 六步落地:从 --mock 零密钥试跑,到 fan-out 委派、技能与钩子、权限沙箱和成本读数,全部命令按官方文档原样给出。
--mock 或本地 Ollama 完成,不需要付费 API Key。先弄清:委派省的是父会话的上下文,不是总花费
官方对 fan-out 的说明很直白:子智能体各自有上下文、各自压缩,完成后回一条消息;父会话只保留结论,同一个答案从约 213k 字符降到约 23k 字符。但每个子智能体都是另一整套 turn,钱一分不少花。先把这张表读完再决定要不要开委派:
| 概念 | 作用 | 边界 |
|---|---|---|
| agent / agent_send | 派活给子智能体、向已完成的子智能体继续提问 | 只有能派活的 Agent 拿得到这两个工具,子智能体不能派自己的子智能体 |
| task_list / task_stop / task_output | 列出、停止、读取后台任务 | 结果只交付一次,用 wait: true 取过就不再追加消息 |
| SKILL.md / Hooks / 插件 | 按需加载规范、在工具调用前后插入检查、扩展工具 | 技能只把名称与描述放进提示词;插件是进程内 DLL,不受沙箱约束 |
| permissions / sandbox | 写操作与 shell 命令的询问、Linux 下的 bubblewrap 隔离 | 目录内读写默认放行,目录外与每条 shell 命令都要问 |
官方没有给出当前版本号,请用 cxagent -v 自查;仓库标注 .NET-10.0,但二进制安装路线不需要本机装 .NET,只有 dotnet tool 与源码构建才需要 .NET 10 SDK 或运行时。另外 README 结尾写得很清楚:cxagent 内部没有撤销,请在 Git 仓库里跑,用 git diff 当复核步骤。
Step 1:安装并用 --mock 零密钥跑通界面
# Linux / macOS(二进制安装,不需要本机 .NET)
curl -fsSL https://raw.githubusercontent.com/nickprotop/cxagent/master/install.sh | bash
cxagent
# Windows(PowerShell)
irm https://raw.githubusercontent.com/nickprotop/cxagent/master/install.ps1 | iex
# 作为 .NET 工具安装(需要 .NET 10 SDK 或运行时)
dotnet tool install -g cxagent
# 零密钥试跑:假 provider,只用来看 UI
cxagent --mock
cxagent -v
cxagent -h
CLI 参数沿用了 Claude Code 的命名:cxagent -c 接续最近会话,cxagent -r <id> 按 id 续,--resume 列出本目录会话,--sessions [all] 列出历史,--mode <single|fan-out> 选模式,--config-dir <dir> 换一份干净配置,--theme <name> 换主题。
cxagent --config-dir /tmp/scratch:官方注明这个路径直接当配置目录,不会再追加 cxagent 子目录,与 XDG_CONFIG_HOME 的行为不同。管道安装先审脚本:curl ... | bash 与 irm ... | iex 都会直接执行远端内容,团队机器建议改走 dotnet tool 或先下载查看。README 还提示卸载后配置与会话历史会保留(Linux/macOS 在 ~/.config/cxagent,Windows 在 %APPDATA%\cxagent),需要清干净要手动删目录。
Step 2:接一个真实 provider,先跑单 Agent
官方写明「起步不需要写任何配置」:初次运行时若没有可用 provider,配置对话框会自动打开,可选 Anthropic、OpenRouter、OpenAI、Ollama、llama.cpp 或任意 OpenAI 兼容端点,选定后它会列出该端点提供的模型并写进配置,且不会把配置写进仓库。之后按 F8 可随时重开同一个对话框。
# 手工配置示例(Linux/macOS: ~/.config/cxagent/config.json
# Windows: %APPDATA%\cxagent\config.json)
{
"providers": {
"local": {
"kind": "ollama",
"model": "qwen3:32b",
"baseUrl": "http://localhost:11434"
}
},
"defaultProvider": "local"
}
# 用某个 provider 实例启动
cxagent --model local
# 单 Agent 模式(关闭委派)
cxagent --mode single
provider kind 有 ollama、openai-compatible(必须给 baseUrl)、anthropic 三种;contextWindow 决定占用读数的分母与压缩触发点,不设时启动会询问端点。可选块还有 agents(子智能体类型)、mcp、plugins、orchestrator(上限),逐键说明在 config.sample.json 与 CONFIG.md。
数据去向要心里有数:官方安全章节写明,提示词、文件内容与 shell 输出会发给你配置的模型提供方以及启用的 MCP 服务器;跑本地 Ollama 时不出本机,接云端端点时等于把仓库内容交出去。F8 里换模型会保留对话继续,但会重新发送上下文,界面会先问你何时应用。
Step 3:打开 fan-out,把读资料的活派出去
# 启动时打开委派
cxagent --mode fan-out
# 会话内切换(在输入框里敲)
/mode agent fan-out
/mode agent single
/mode
# 给 Agent 的一句指令示例
用一个子智能体把这个仓库里所有与鉴权相关的测试读一遍,
只回报失败用例文件名与原因,不要改文件。
# 常用面板与命令
F7 打开任务面板
/tasks 列出后台命令与子智能体
/tasks output 看某个任务的进度或输出
/agents open 打开子智能体的会话标签页
/agents send 向已完成的子智能体继续提问
fan-out 是默认模式。agent 派活时默认后台执行,立刻回一张 receipt,父会话继续跑;结果在子智能体完成时作为消息送达。F7 面板里 Running 在前、Finished 在后,回车打开标签页,x 停止运行中的任务或删掉已完成的。Ctrl+B 可把当前 turn 正在等的前台子智能体与命令一次性挪到后台。
planner 会把计划写进 ./plans/ 并汇报决定,builder 负责实现计划且没有计划时拒绝开工;可在 F8 的 Agents 页给每种类型指定 provider 列表与 maxTurns。子智能体之间不共享上下文,agent_send 复用同一段会话,比重新派一个更省。两条不能想当然的规则:① 子智能体拿不到 agent 工具,所以不能再往下派一层,这是工具层面的限制而非提示词约定;② README 原话是「briefing 只是请求,不是权限」,在任务描述里写「永不改文件」并不会撤掉写工具,真正的边界是 permissions 与工具选择。另外,同一个消息里派出的子智能体并行跑,background: false 才会让父会话等齐再答。
Step 4:用 headless 把审查接进命令行与流水线
cxagent -p "in one sentence, what is this repo?"
git diff | cxagent -p "/review"
cxagent -p "list the TODOs" --output-format json | jq -r .result
cxagent -c -p "now fix the first one"
headless 沿用 Claude Code 的选项:--output-format text|json|stream-json、-c、-r、--permission-mode、--max-turns。每次运行都是普通会话,脚本下一行可用 -c 续上,之后也能在终端界面里打开。官方 SCRIPTING.md 给了 CI 审查门、pre-push 钩子、批处理文件等写法。
headless 没人替你点确认:README 明确写着「Nobody is there to answer a prompt」——任何需要询问的操作都会被拒绝并列在结果里;--trust 与 permission mode 决定哪些动作可以无人值守。别在 CI 里为了让它跑通就放宽权限,先在临时仓库验证输出格式与退出码。
agent、agent_send、task_list、task_stop、task_output、run_shell、todowrite、web_search。旧名兼容窗口已关闭,调用会得到 no such tool 并列出现行名称;写脚本时别照抄旧文档里的名字。Step 5:把团队规范固化成技能、命令与钩子
# 技能:.cxagent/skills/<name>/SKILL.md
---
name: double-entry-posting
description: Use when adding or fixing ledger posting or balance logic
in this repo. Covers house rules that are not obvious from the code.
---
Every posting must sum to exactly zero. Reject unbalanced
transactions with ERR-UNBALANCED in the message.
# 自定义命令:.cxagent/commands/review.md
---
description: Review a pull request
argument-hint: [pr-number]
---
Review PR $1 against the house style.
# 钩子:config.json 片段
"hooks": {
"PreToolUse": [
{ "matcher": "run_shell",
"hooks": [ { "type": "command", "command": "~/bin/guard.sh" } ] }
]
}
技能只有 name 与 description 常驻提示词,正文由模型判断适用时才读取,官方举例说二十个技能只占几百字符而不是六万字符;/skills 会列出找到的以及被跳过的 SKILL.md 与原因,同名时就近生效。自定义命令里 $1 会被参数替换,以叹号开头的 shell 行会先询问再执行。钩子从 stdin 读事件 JSON,退出码 2 会阻断并把消息交给模型,stdout 输出 JSON 时还能 allow、ask、deny 或改写工具调用。
.cxagent/hooks.json 与 .cxagent/hooks.local.json,官方说明它们只在目录被信任后才运行,并且同样作用于子智能体与 headless 运行,所以一道检查没法被绕开;/hooks 可列出当前会跑哪些。迁移时两个坑:① cxagent 不读取 .claude/skills/ 与 .claude/commands/,要把文件复制或链接到 .cxagent/ 下;② frontmatter 里的 allowed-tools 会被忽略,/commands 会说明这一点——权限仍由 cxagent 自己的闸门决定。模型是否会主动使用某个技能是模型属性,官方只给过本地模型的实测与提醒,别假定换模型后行为一致。
Step 6:收紧权限、沙箱与成本读数
# 会话内查看与切换
/sandbox 显示当前命令可触及的范围
/sandbox review 处理挂载无法保证的路径后重新放行
/mode edits 查看写入模式,默认 always-ask
/permissions 相关设置也可在 F8 的 General 里改
/stats 历史会话花费与填满上下文的工具
/hooks 确认生效的钩子
# 插件:F2 打开管理器,或按名加载
/plugin load csharp-lsp.dll
# 浏览器形态(默认只监听本机)
cxagent web
cxagent web status
cxagent web stop
权限模型很朴素:工作目录内读写放行,目录外的写入与每条 shell 命令都会停下问 Allow once / Always allow / Deny;「Always」授予的是命令名称,例如批准 git status 会写成 git status*,git push 仍会问。Linux 上在能启动 bubblewrap 时默认沙箱运行,把 ~/.ssh、~/.aws、~/.gnupg 与配置目录视作空,丢掉形如 *_API_KEY、*_TOKEN、AWS_* 的变量,并断开 D-Bus、SSH agent、tmux、X11 与 Docker;网络默认仍开,sandbox.network: false 可关但会连带破坏安装与推送。
/stats 看历史花费。orchestrator.maxTurns 与 agent 类型上的 maxTurns 可挡住停不下来的循环,但官方特别注明「turn 上限约束的是迭代次数,不是花费」——一次读大文件的 turn 可能比十个空 turn 更贵。四句原文要记住:①「Installing a plugin is not approving it」——插件 DLL 加载进 cxagent 自己的进程、不受沙箱约束,信任前会显示内容哈希,改动一个字节就会重新询问;②「A login is a shell on this machine」——cxagent web 默认只监听本机,绑到其它地址必须设登录,官方建议加 --self-signed 或反向代理;③ auto 模式把被静态检查挡下的命令交给模型判定,任何超时或解析失败都回退到询问,且含命令替换语法、出网动词、递归删除的命令永不进入自动判定;④ 文件会被真实编辑,cxagent 内部没有撤销,请在 Git 仓库里跑并复核 git diff。项目为 MIT,作者不对丢失的工作、泄露的凭据或模型账单负责。
常见问题速查
| 现象 | 排查方向 |
|---|---|
| 子智能体没有出现 | 确认 /mode agent fan-out 已开;委派是否发生取决于模型,官方建议把「用子智能体」写进指令 |
脚本里工具报 no such tool | 旧工具名兼容窗口已关闭,改成 task_list、task_output 等现行名称 |
| 技能没被读到 | 确认放在 .cxagent/skills/ 而非 .claude/skills/,用 /skills 看跳过原因 |
| headless 运行什么都没改 | 需要询问的操作在无人应答时会被拒绝并以结果列出,检查 --trust 与 permission mode |
| 命令一直问、auto 不生效 | 要求目录已信任、路径都在工作目录内、命令可完整解析;含命令替换或出网动词一律不进入自动判定 |
| token 花得比预期快 | 看 F3 与 /stats,子智能体是另一整套 turn;maxTurns 只挡迭代不封顶花费 |
| 插件加载后行为异常 | 插件在进程内运行且不受沙箱约束,先停用再排查,hash 变化会重新询问 |
做到哪一步算成功
依次应看到:cxagent --mock 能起界面且不产生任何模型调用;配好本地 provider 后 cxagent -p "in one sentence, what is this repo?" 返回一句话;开着 fan-out 派一个只读检索任务,F7 里出现后台子智能体、打开标签页能看到它每一次工具调用与耗时,父会话只收到结论;git diff | cxagent -p "/review" 能进脚本;放一个 SKILL.md 后 /skills 列出它,写一条 PreToolUse 钩子后 /hooks 能看到;/stats 有花费读数,/sandbox 能显示可触及范围。故意在未信任目录里试一次写操作,应当被明确询问——这条反例能证明权限闸门确实在起作用。