前言¶
在 DeepSeek Harness(DSH)里让多个 agent 同时改同一个 Git 仓库时,常见做法是并行子代理或 Agent Teams:前者没有 worktree 与合并门禁,后者共享任务板、集成往往仍靠人收尾。若你希望把「完成」定义为可审查的分支变更、可选独立审查与证据门,而不是会话里一句「好了」,就需要一套面向仓库变更的交付协议。
dsh-tower(维护者 louifinn,npm 包名 dsh-tower,当前发布版本 2.0.4,MIT 许可证)是 DSH 的多代理编排插件:会话充当控制塔,worker 在隔离的 Git worktree 中实现 mission,改动经 scope 与合并门禁合入基线;审查可在配置中强制开启。设计灵感来自 Moonshot AI Kimi Code 中实验性的 Tower 模式,本项目为面向 DSH 的独立实现,与 Moonshot AI 无隶属关系。社区目录页:louifinn/dsh-tower;源码与文档:GitHub。
这是什么¶
Tower 把一个 agent 会话变成小型工程团队:控制塔负责规划与派发,worker 在独立分支与 worktree 里写代码并提交,可选 reviewer 只读审查;合并前门禁会重新校验 scope、分支新鲜度、任务完成度、审查记录与 worktree 归属,通过后才执行 --no-ff 合并。协作状态(roster、inbox、findings、reviews、mission 状态)持久化在 .git/dsh-tower/,重启后可恢复。
仓库根目录即 DSH bundle 包根:package.json 声明 dsh.bundle.patch,cordis.patch.yml 位于根目录,符合 DSH 插件规范。分类上属于工作流类插件。
核心功能¶
下面按 README 已列能力归纳,只写资料中明确出现的行为。
Tower 模式与会话控制¶
/tower切换会话级 Tower 模式:收窄工具面并注入 Tower 协议;/tower on|off <指令>可把指令作为下一步用户消息转发给模型。- 默认允许 Agent 通过
tower_control带理由进出;在 profile 中设mode.allowAgentControl: false可改为仅人类控制。 - Tower 模式开启期间会拒绝
create_goal、update_goal(resume)、todo_write、Team 任务板与spawn_teammate等,并与 plan mode 互斥,避免两套编排协议同时驱动同一会话。
任务隔离与角色¶
- 每个 mission 使用独立分支和 Git worktree,worker 不触碰主检出。
- worker 不能直接完成或放弃 mission 或扩界,完成须走
tower_complete证据门;tower 可用tower_interrupt或tower_send(interrupt:true)中止跑偏的 agent。 - 可选
mode.workspaceLock让同一仓库只有一个 Tower 会话;spawn.maxLiveWorkers、send.maxPerMinute等约束并发与消息风暴。
审查与合并门禁¶
review.requireReview: true时,审查者针对当前分支 tip 给出clean/merge结论;默认审查可选。tower_merge前门禁校验 scope、审查记录等;全局开启审查时,单个 mission 可用reviewPolicy: "none"加理由并在gates.allowReviewExemption: true下做更窄豁免。- finding 经
tower_findings按open → triaged → fixed/wontfix流转;仅 tower 或 worker 可改状态,reviewer 只读。
配置、错误码与运维工具¶
- 仓库级
<git-common-dir>/dsh-tower/config.json可覆盖 review、merge、worktree、spawn 等;优先级为代码默认 < profile < 仓库配置 < 工具参数。 - 工具失败统一带
[tower:<code>]前缀(如mission-not-found、preset-missing、config-invalid)。 - 2.x 还提供
tower_test、tower_doctor、tower_batch、tower_resource等验证与运营向工具;支持 HMR 下/tower reload与tower_reload热重载 linked 插件代码。
组件采用 all-or-nothing:cordis.patch.yml 只插入一个 tower-bundle 组,关闭时 Host、skills、worker/reviewer preset 一并关闭。
环境要求¶
- DeepSeek Harness
0.2.1-rc.2(详见仓库 COMPATIBILITY.md) - Node.js 22+
- Git(worktree 在本地创建,不需要联网)
安装与启用¶
把已发布包安装到 DSH profile(Host 插件在 DSH 进程启动时加载,安装或更新后需重启 DSH):
dsh plugin --profile web add dsh-tower
在 DSH 内也可用插件管理器:
plugin_manager({ action: "install_bundle", target: "dsh-tower" })
开发时可从 GitHub 安装或链接本地 checkout:
dsh plugin --profile web add github:louifinn/dsh-tower
dsh plugin --profile <profile> add <本仓库的绝对路径>
卸载使用 remove_bundle,包名 dsh-tower。
已知冲突: 不要与第三方包 dsh-plugins-tower 同时安装;二者 loader 名冲突可能导致本包被加载两次。tower_doctor 的 loader-conflicts 可检查该情况。
插件以当前 DSH 进程的权限访问本机 Git 与文件系统;安装前请阅读源码与 MIT 许可证,确认符合你的安全与合规要求。
典型用法¶
先做环境安装并重启 DSH,再在会话中进入 Tower 模式,按 mission 生命周期调用工具。README 快速开始示例如下(路径请换成你的仓库根目录):
/tower on
tower_init repoRoot=D:\work\repo
tower_plan repoRoot=D:\work\repo missions=[{"title":"Feature A","scope":["src/a/**"],"tasks":["implement","commit"],"kind":"build"}]
tower_spawn repoRoot=D:\work\repo missionId=M1 role=worker
# worker 在 worktree 内实现并提交,调用 tower_complete
tower_spawn repoRoot=D:\work\repo missionId=M1 role=reviewer # 需要强制独立审查时先开启 review.requireReview:true
tower_preflight repoRoot=D:\work\repo missionId=M1
tower_merge repoRoot=D:\work\repo missionId=M1
tower_teardown repoRoot=D:\work\repo
/tower off
小改动通常一轮 worker 即可;需要独立审查时再加 reviewer。更完整示例见仓库 docs/examples/first-mission.md,工具参数见 docs/reference/tools.md。
常用斜杠命令¶
| 输入 | 行为 |
|---|---|
/tower |
开启 Tower 模式(已开启则保持) |
/tower on / /tower on <指令> |
开启并保持;带指令时转发为下一条用户消息 |
/tower off / /tower off <指令> |
退出;可附带转发指令 |
/tower ack |
记录人类确认(供 mode.requireHumanAckOnFirstEntry 使用) |
Profile 配置片段¶
在 DSH profile 中可配置 Tower 段(节选 README 示例):
- id: tower
name: 'dsh-tower'
config:
mode:
allowAgentControl: true
autoPauseGoal: true
denyTools: [create_goal, todo_write, team_task_create, team_task_update, team_task_reopen, spawn_teammate]
review:
requireReview: false
maxRoundsPerReviewer: 5
merge:
timeoutMs: 900000
worktrees:
root: ''
spawn:
workerPreset: tower-worker
reviewerPreset: tower-reviewer
maxDepth: 1
随包 cordis.patch.yml 还默认开启 mode.workspaceLock、send.interruptDefault、init.autoGitInit 等;全部键与默认值见 docs/reference/config.md。
适用场景与注意¶
适合:
- 一个特性或重构能拆成 2–8 个 scope 清晰、可独立审查的 mission;
- 有依赖顺序、需要分支新鲜度与 scope 约束的迁移;
- 需要可审计合并与测试证据(可按需开启独立审查)的仓库变更;
- 跨天协作、需从
.git/dsh-tower/恢复状态的工作。
不适合: 单文件一行 hotfix、需求仍在探索、开放式研究、大量极小独立任务、交互式 UI 配对或跨仓库工作。判断标准:若你不会为它开 PR,Tower 很可能过重。
与其他模式对比(README 归纳):普通并行子代理便宜灵活但无 worktree 与合并门禁;Agent Teams 适合横切决策但无 Git 隔离硬门禁;Ralph 循环适合迭代搜索但无 mission 契约;Workflow 适合批量流水线但不做分支隔离。可按阶段组合,例如先用 Workflow/Team 分析,再用 Tower 执行仓库变更。
可选 Web UI 随 npm 包发布在 ui-bundle/;安装后通过 plugin_manager 指向对应目录并重启 DSH。DSH 生态理念是「一切皆插件」;skillhub.cn 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-tower 把多代理协作收敛成「少量 mission + worktree 隔离 + 可选审查 + 合并门禁」的交付协议,适合在 DSH 里把仓库改动做成可恢复、可审计的流程。进一步了解请查阅 插件目录页 与 GitHub 仓库。