dsh-tower:在 DSH 里用 Tower 模式做多代理交付

前言

在 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 仓库。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜