工程可用性评估与实操指南:现在能用吗?应该怎么用?
全面评估当前开源仓库的工程完备度、外部依赖条件与安全隔离要求,提供从环境准备、账号包装器(CLI Shims)配置、Web 面板与 Management API 调优,到安全渐进式投产(Off → Observe → Auto)的完整落地指南。
现状评估:这个项目现在可以直接用吗?
1. 源码完备度极高:本仓库绝非“空壳 Demo”或“伪代码”,它包含了完整的 SQLite 状态机(Schema v11)、全套 React 18 监管面板前端、GitHub 与飞书双源轮询/事件实现、完善的退避重试队列,以及多达 52 个单元测试与集成测试文件(tests/*.spec.ts)。
2. 核心运行前提:它是一个打包为 DeepSeek Harness Bundle 的插件(package.json 中声明 "engines": { "dsh": "^0.2.1-alpha.2" },安装指南使用 @deepseek-ai/dsh@0.2.1-rc.3)。这意味着你必须能够安装并运行 DeepSeek Harness (`dsh`) 宿主环境并配置好大模型 Provider,才能启动本系统。
运行环境与账号硬性前置条件清单
| 类别 | 具体要求与版本约束 | 为什么必须满足(底层机制原因) |
|---|---|---|
| 基础运行环境 |
• OS:macOS 或 Linux(依赖 POSIX Shell 与 tmux)• Node.js: ^22.19.0 || >=24.0.0• 包管理器与工具: pnpm (v11+), git >= 2.32, tmux, python3 >= 3.8
|
git 2.32+ 是为了支持 worker-gitconfig 中的特定凭证辅助配置;tmux 用于承载后台守护会话 dsh-superagent。
|
| 宿主框架与模型 |
• DeepSeek Harness:@deepseek-ai/dsh(满足 ^0.2.1-alpha.2,推荐 0.2.1-rc.3)• LLM Provider:在 DSH 中配置可用的模型服务商 |
提供底层的 Cordis 插件容器、Agent Session 管理、tool-bash/tool-fs/tool-jobs 工具链以及 Web UI 渲染插槽。
|
| GitHub 专属账号与 CLI |
• GitHub CLI:gh >= 2.48• 独立的 Agent GitHub 用户账号(拥有目标 github.com 仓库的 Write 权限) |
严禁使用个人主账号,且不能用 GitHub App!因为系统需要通过 gh api notifications 读取账号的通知流(GitHub App 没有用户级 Notifications API),且所有评论/PR 均以该账号身份发出。
|
| 飞书机器人(可选) |
• Lark CLI:lark-cli(测试版本 1.0.90)• 飞书自建应用:开启机器人能力,具备读取/发送群消息、读取群成员及订阅消息事件权限 |
必须配置为 strict-mode bot --global(纯 Bot 身份模式)。若 CLI 允许以普通用户身份行动,Setup 探针会直接拒绝启动以确保安全。
|
工程成熟度与直接上生产的注意事项
- 崩溃恢复与幂等性:进程重启后自动对中断的 Assignment 注入恢复提示(要求先检查
git status/git log与线上 PR 状态,避免重复执行外部副作用);Outbox 保证消息绝不重复发送。 - 网络抖动自愈:针对 LLM 供应商或网络的 HTTP
408 / 429 / 5xx及连接重置,内置最多 3 次指数退避自动重试(15s → 30s → 60s)。 - 全链路可观测性:内置
HealthBoard监控 13 项子系统健康指标,配合 Web Panel 可精确追溯每一条 Trigger 的过滤、评估、扇出与退回轨迹。
- 操作系统级账号隔离:由于 Worker 运行在
danger-full-access模式,在团队共享服务器上部署时,强烈建议为其创建专门的 Linux/macOS 系统低权限用户(如useradd superagent),避免与个人开发机主账号混用。 - 仓库本地克隆维护:系统默认通过
git worktree add从本地基准仓库切出工单目录,需要确保磁盘空间充足且基准仓库未配置额外的个人凭证 Header。
这个东西应该怎么用?(两种标准部署与配置方式)
方式 A:极具特色的“Agent 引导式安装(Agent-Assisted Setup)”
因为配置涉及多个 CLI 包装脚本、DSH Profile 隔离、Management API 调用以及策略初始化,作者将“注意力最小化”哲学直接用在了安装流程上——编写了一份专门给 Coding Agent 阅读的 SETUP.md。你只需在当前仓库目录下对你的 AI 编程助手(如 DSH、Claude Code 或 Antigravity)发送一句话:
Read SETUP.md in this repository and set up dsh-superagent with me.
你的 Coding Agent 会严格遵循 SETUP.md 的契约执行以下 5 步:
- 静默环境探测(Probe):自动在后台运行一行探测脚本检查
node,pnpm,git,tmux,python3,gh,dsh版本及当前 GitHub 登录名,已满足的项绝不多问。 - 单步极简提问(最多 9 题):每次只问 1 个问题(每条消息控制在 300 词以内,并附带推荐默认值,你只需回复一个词即可确认),依次收集:监听源(仅 GitHub 还是含飞书)、目标仓库
owner/name、Agent 专用账号名、允许派单的白名单成员、本地基准克隆路径、Commit 署名作者、是否开启自动合并。 - 生成完整计划并等待一次确认:在真正动手前,汇总展示所有将创建的脚本、配置与默认值。
- 分离敏感操作与自动执行:绝不在聊天框索要密码或 Secret!需要人工扫码或输入 Token 的步骤会生成精确的终端命令让你在自己的终端执行;其余包装器创建、编译、服务启动与 HTTP API 配置保存全部由 Agent 自动完成。
- 自检与移交:确认
scripts/dsh-superagent status返回退出码0,配置每小时自愈巡检任务,并输出面板 URL 与第一条测试指令。
方式 B:五步手工标准部署流程(深入理解底层配置)
如果你希望完全掌控每一个工程细节,可以按照 docs/006-deployment.md 执行以下五个标准步骤:
Step 1:创建隔离的 CLI 账号包装器(Account Wrappers)
为了保证 Agent 只使用它自己的专用凭证,而不触碰你个人的 ~/.config/gh,需在 ~/.local/bin/ 下创建独立的包装脚本:
# 1. 配置 Agent 专用 GitHub CLI 包装器 (gh-agent)
mkdir -p ~/.local/bin
cat > ~/.local/bin/gh-agent <<'EOF'
#!/bin/sh
GH_CONFIG_DIR="$HOME/.config/gh-agent" exec gh "$@"
EOF
chmod +x ~/.local/bin/gh-agent
# 使用 Agent 的专用 GitHub 账号登录并验证
gh-agent auth login
gh-agent api user --jq .login
# 2. (可选) 若启用飞书,配置纯 Bot 模式的 lark-bot 包装器
LARKSUITE_CLI_CONFIG_DIR="$HOME/.lark-cli-dsh-superagent" lark-cli config init --app-id <cli_xxx> --app-secret-stdin
LARKSUITE_CLI_CONFIG_DIR="$HOME/.lark-cli-dsh-superagent" lark-cli config strict-mode bot --global
cat > ~/.local/bin/lark-bot <<'EOF'
#!/bin/sh
export LARKSUITE_CLI_CONFIG_DIR="$HOME/.lark-cli-dsh-superagent"
exec lark-cli "$@"
EOF
chmod +x ~/.local/bin/lark-bot
Step 2:安装 DSH、编译仓库并创建独立的 superagent Profile
切记:必须将 dsh-superagent 安装在独立的 Profile(如 superagent)中,与你日常交互使用的默认 Profile 分开,因为该插件会改写进程级的 PATH(注入 worker-bin)与全局 Git 配置(注入 worker-gitconfig):
# 1. 安装指定版本的 DeepSeek Harness
npm install -g @deepseek-ai/dsh@0.2.1-rc.3
# 2. 在当前仓库安装依赖并执行类型检查、测试与构建
pnpm install && pnpm build
# 3. 从 Web 模板初始化名为 superagent 的独立 Profile (仅首次安装执行!)
dsh superagent --from-default-profile web --dump-config > /dev/null
# 4. 将当前仓库作为插件链接到 superagent Profile
dsh plugin --profile superagent add "link:$PWD"
Step 3:编写机器级配置 cordis.patch.yml 并启动守护进程
参考 examples/profile.cordis.patch.yml,编辑 ~/.dsh/profiles/superagent/cordis.patch.yml:
- id: webserver
config:
host: 127.0.0.1
port: 3082
- id: dsh-superagent
config:
stateDir: /Users/yourname/.dsh/state/superagent
# 若需启用飞书源,取消以下两行注释:
# - id: dsh-superagent-feishu
# disabled: false
随后使用内置的生命周期脚本启动服务:
scripts/dsh-superagent start
scripts/dsh-superagent status
Step 4:通过 Web 面板或 Management HTTP API 完成四大模块初始化
打开浏览器访问 http://127.0.0.1:3082,点击左侧边栏的 Superagent 进入管理面板(或直接通过带有 x-orchestrator-request: 1 请求头的本地 API 配置):
# 示例:通过 Management API 配置 GitHub Source、Policy 白名单与 Git Worktree Prepare 命令
api=http://127.0.0.1:3082/orchestrator/api
# 1. 设置 GitHub 监听仓库与专属 CLI
rev=$(curl -s -H 'x-orchestrator-request: 1' $api/settings | jq '.sources[] | select(.id == "github") | .revision')
curl -s -X PUT -H 'x-orchestrator-request: 1' -H 'content-type: application/json' $api/settings/source:github \
-d "{\"value\": {\"enabled\": true, \"config\": {\"repository\": \"owner/repo\", \"cli\": \"$HOME/.local/bin/gh-agent\"}}, \"revision\": $rev}"
# 2. 配置 Executor 的 Git Worktree 自动准备命令 (每个工单自动拉取最新分支并切出独立工作树)
# Prepare 命令模板:
# git -C ~/src/repo fetch --no-tags "https://github.com/$DSH_SUPERAGENT_GITHUB_REPOSITORY.git" "${DSH_SUPERAGENT_GITHUB_PR_HEAD:-HEAD}:refs/dsh-superagent/$DSH_SUPERAGENT_TICKET" &&
# git -C ~/src/repo worktree add -b "agent/$DSH_SUPERAGENT_NAME" "$DSH_SUPERAGENT_DIR" "refs/dsh-superagent/$DSH_SUPERAGENT_TICKET"
Step 5:发起第一个任务验证闭环
使用白名单内的 GitHub 账号,在目标仓库新建一个 Issue 或在任意已有 Issue 下发表一条新评论(注意:直接编辑旧 Issue 的正文不会触发 GitHub 通知,必须发新评论):
@<agent-github-login> 请帮我检查并修复某模块中的拼写错误,并提交 PR。
在 1 分钟(默认轮询间隔)内,Web 面板的 Overview 和 Execution 标签页就会出现新创建的 Ticket,Agent 会在原评论下回复一句简短的接单确认,随后在 ~/.dsh/state/superagent/work/<worktree-name> 中静默完成代码修改、测试验证并提交 PR。
日常运维最佳实践:三阶段渐进式投产与健康监控
推荐的三阶段安全投产路线图(Progressive Rollout)
遵循 docs/000-philosophy.md 中“Start narrow, tune for less noise”的操作员责任准则,严禁在第一天就向全员开放主动模式。推荐按以下三步演进:
- Allowed 白名单:仅添加操作员自己 1 个账号。
- Accept Mode:保持默认
observe(或off)。 - Auto-merge:关闭(所有 PR 由人工审查合入)。
-
阶段目标:在真实 Issue 中通过
@agent显式指派任务,验证 Git Worktree 准备命令、测试执行与 PR 质量。
- Allowed 白名单:扩展至核心研发小组成员,或绑定飞书群成员自动同步。
- 开启全量观察开关:打开 GitHub 观察开关或飞书群“全部消息”,但保持
observe模式。 -
阶段目标:在 Web 面板 Eval 页审查标记为
would_accept的影子决策记录,调优主动规则与团队 Prompt,做到零误报、零噪音。
- Accept Mode:正式切换为
auto(主动接单开启)。 - 主动修复闭环:针对满足三元语义事实与启用规则的文案、局部样式或默认分支 CI 失败,自动静默提 PR。
- 受控自动合入:可选配置独立 Merge CLI,对变更 < 200 行且人类 Reviewer 已 Approve 最新 Commit 的 PR 自动开启 Auto-merge。
服务控制脚本(scripts/dsh-superagent)与 4 类退出码契约
运维脚本 scripts/dsh-superagent 提供了严密的进程管理(支持 start, stop, restart, status),其退出码专为外部自动化巡检(Watchdog)设计:
| 退出码 (Exit Code) | 状态含义 | 重启能否解决? | 运维人员 / 巡检 Agent 应对动作 |
|---|---|---|---|
| Exit 0 | 服务运行完全正常,所有已 claims 的健康项均为 ready / starting / paused。 |
无需操作 | 保持静默,无需任何干预。 |
| Exit 1 | 服务未运行、存在重复实例、HTTP 接口无响应,或核心 runtime 报错。 |
能(可尝试重启恢复) | 执行 scripts/dsh-superagent --respect-stop restart(若存在人工 stop 标记则跳过)。 |
| Exit 2 | 宿主运行正常,但某个外围组件(如 github 连续 3 次轮询失败、evals 超时未决、reply 发送连续失败)处于 error 状态。 |
不能(重启无效) | 不要盲目重启!读取输出 JSON 中的 errors 字段或打开 Web 面板 Overview 查看具体故障原因(如网络断连、权限失效)。 |
| Exit 3 | 服务正在运行,但正在等待初始设置(Setup Pending)或账号校验未通过。 | 不能(重启无效) | 读取输出中的 setup 详情,前往 Web 面板 Settings → Sources / Deployment 补全仓库或 CLI 认证后点击 Check again。 |
二次开发指南:如何接入团队内部的自定义事件源(如 Jira / GitLab / Slack / 内部工单)?
得益于 src/sources/kind.ts 的 SourceKind 插件化协议与 docs/008-cookbook.md 的详尽规范,为系统新增一个事件源(例如名为 webhook 或 gitlab)无需修改 src/core 的任何一行代码,只需按以下 5 步实现一个独立模块:
- 声明配置表单(
schema&fields):使用 Zod 定义配置结构,声明fields数组后,Web 面板会自动生成对应的图形化配置卡片,无需手写 React 代码。 - 实现幂等事件转换(Trigger Translation):使用
key('<kind>', nativeId)生成稳定 ID,丢弃 Agent 自身发出的消息,将外部事件映射为包含threads,actor,human,addressed,channel的标准Trigger。 - 实现纯函数范围判断(
scope):仅根据trigger.meta和当前配置返回{ listened, observed, row },确保历史 Mandate 在重校验(Revalidate)时可随时复算。
- 幂等回复通道(
channel.send):利用message.id作为幂等键调用外部 CLI/API 发送回复;成功返回'sent',目标会话永久删除(如 HTTP 410/404)返回'gone',其余错误直接抛出由Outbox自动指数退避重试。 - 挂载 Cordis 插件生命周期(
apply(ctx)):在ctx.effect中注册SourceKind并启动带AbortSignal的轮询循环。注意必须先完成一批内所有ctx.receive(trigger)存储,最后再推进KV中的持久化游标(Cursor),从而保证任何时刻断电重启都绝不漏消息。