dsh-offhours:低谷时段自动消化看板待办

前言

在 DeepSeek Harness(DSH)里和 agent 对话时,常会留下一批明确的小任务:补错误提示、改一处交互、跑通测试。白天忙着主线,这些事容易一直压在脑子里或散落在聊天记录里。用外部 cron 调脚本可以定时跑,但要自己管 worktree、证据和合并,成本高;纯手动又很难在夜间批量推进。

dsh-offhours 是社区插件 shuke52tt/dsh-offhours,把看板上的 todo 卡在低谷/夜间按规则自动执行:每卡独占一个 git worktree,headless worker 干活并自证,证据写回卡面,再合并回收。数据在本地(KANBAN.json 与 stateDir),不依赖单独的 systemd/cron 调度。下面介绍定位、能力与从零接上的步骤。

这是什么

  • 名称:dsh-offhours(npm 包名同)
  • 维护者:shuke52tt
  • 分类:工作流
  • 一句话:配置一个(或多个)git 仓库后,用看板管理待办,插件进程内按 interval 扫描,或在 CLI/面板手动触发跑批。
  • 许可:MIT(见 GitHub 仓库)

源码与说明:GitHub - shuke52tt/dsh-offhours
社区目录页:SkillHub 插件页

核心功能

资料中的设计可以概括为一条闭环,只做「待办卡 → 自动做 → 可核对完成」这一件事。

  1. 看板与卡:看板文件为仓库内的 KANBAN.json;用 CLI 或 DSH 会话建卡,卡上写目标、判据与边界。
  2. 一卡一 worktree:每张待办在独立 git worktree 里执行,避免互相污染工作区。
  3. headless worker:通过配置中的 dshBin、dshProfile(默认 headless)拉起 worker;完成须满足卡里可机械核对的判据(例如测试命令),否则不得报 done。
  4. 证据与合并:证据写回卡;引擎在跑批前后侦测主检出,并做合并回收。
  5. 调度方式:scheduler 可为 plugin(插件内按 schedule.intervalMin 扫描),也可 npx dsh-offhours run --once 或面板「立即跑」。
  6. 闸门:gates 限制单次/每日卡数及每日成本上限(如 maxCnyPerDay)。
  7. Web 面板:安装到 web profile 后,左侧出现「夜间跑批」面板,可查看状态并触发运行。

安装与启用

在已安装 DSH 的环境中,按官方 README 使用 profile web 安装插件:

dsh plugin --profile web add dsh-offhours

装完后重启一次 dsh web(或等待 HMR 生效),左侧应出现「夜间跑批」面板。升级插件后同样需要重启 dsh web,面板才会加载新代码。

说明:安装插件不会把 CLI 放进全局 PATH;下文示例用 npx dsh-offhours。若已全局安装同名入口,可简写为 offhours。也可使用 profile 下 node_modules/.bin/offhours 的绝对路径(例如 ~/.dsh/profiles/web/node_modules/.bin/offhours)。

运行环境(README 写明):Linux(含 WSL)需要 bash、python3、git、jq、flock、dsh;zstd 可选。macOS 暂不支持;原生 Windows 需走 WSL。Node 版本要求 >=20;DSH 引擎要求 >=0.2.0(见 package.json)。

典型用法:三步开始

以下命令来自 README,在你要跑批的 git 仓库中执行。

1)初始化配置与看板

在项目仓库根目录写入 offhours 配置、关联特性并生成看板:

cd ~/code/myapp
npx dsh-offhours init --repo . --name myapp

会在用户目录生成 ~/.dsh/offhours/config.json(并建立 stateDir、featuresRoot 等路径)。

2)体检

检查依赖、路径与 worker 权限;失败时进程退出码非 0:

npx dsh-offhours doctor

3)建卡(须带会话)

卡必须带有 sourceSessionId(通过 --session 或在 DSH 会话里用 offhours 技能建卡),否则跑批不会捡这张卡:

npx dsh-offhours card add "给登录页补错误提示" \
  --summary "目标:登录失败有提示。判据:npm test 通过。不做什么:不改后端。" \
  --session <当前 dsh 会话 id>

README 建议:在 dsh 里对 agent 说「用 offhours 技能建一张卡:给登录页补错误提示」往往更省事。

之后若 schedule.enabled 为 true,插件会按 intervalMin 自动扫描;也可在面板点「立即跑」,或执行:

npx dsh-offhours run --once

仅预览本轮会挑哪张卡:

npx dsh-offhours run --dry-run

若面板提示「先完成一次性初始化」,在项目仓库执行 init 后刷新即可,无需重装插件。

配置要点

npx dsh-offhours init 生成的 ~/.dsh/offhours/config.json 示例结构如下(字段含义以 README 为准):

{
  "stateDir": "~/.dsh/offhours/state",
  "featuresRoot": "~/.dsh/offhours/features",
  "dshBin": "dsh",
  "dshProfile": "headless",
  "scheduler": "plugin",
  "repos": {
    "myapp": { "path": "~/code/myapp", "baseBranch": "main" }
  },
  "boards": [
    { "id": "myapp", "file": "~/code/myapp/KANBAN.json", "workdir": "~/code/myapp", "repos": ["myapp"] }
  ],
  "gates": { "maxCardsPerRun": 3, "maxCardsPerDay": 8, "maxCnyPerDay": 20 },
  "schedule": { "enabled": true, "intervalMin": 5 },
  "worker": { "permissionMode": "danger-full-access" }
}
  • baseBranch 可写 main、master 或任意分支;省略时按 origin/HEAD、main、master 依次探测。
  • worker.permissionMode 默认为 danger-full-access:worker 需要向 <repo>/.git/worktrees 写入才能提交,属于无人值守的结构性要求;不信任仓库内容时不应安装此插件。

常用 CLI

命令 作用
npx dsh-offhours init --repo . 初始化配置/看板/特性
npx dsh-offhours doctor 依赖与权限体检
npx dsh-offhours card add "<标题>" --summary "<目标/判据/边界>" [--session <id>] 建卡并关联会话
npx dsh-offhours card list 列卡
npx dsh-offhours run --once / --dry-run 手动跑一轮 / 预演挑卡
npx dsh-offhours status 看板计数、心跳、最近状态(JSON)
npx dsh-offhours boards 看板列表

适用场景与注意

更适合谁

  • 已有 DSH web profile,希望在本地用看板沉淀「可验收」小任务,并在非高峰自动推进的实现者。
  • 仓库习惯用 git worktree 隔离特性分支,且能接受 headless agent 在独立 worktree 内改代码、跑判据命令。

安全与边界(README 强调)

  • worker 在独立 worktree 工作;建议同时启用 feature-guard 钩子,与引擎对主检出的侦测一起兜底。
  • 插件以当前 dsh 进程权限运行;danger-full-access 意味着对配置中仓库具备较强写权限。安装前请阅读源码与 MIT 许可证,确认仓库与机器环境可信。
  • 送审(需人介入)仅保留五类:选型不确定、影响演进、实施成本、条件做不成、政策风险。
  • 卡里必须写明可机械核对的判据(命令),否则 worker 不能标记完成。

生态说明

DSH 社区奉行「一切皆插件」;SkillHub 等目录为社区站点,与 DeepSeek / 幻方无官方从属关系。本插件当前在 GitHub 星标为 0,适合自行评估后试用。

结尾

dsh-offhours 把「看板待办 → worktree → headless worker → 证据 → 合并」收到一个插件与一份 config.json 里,减少自建夜间批处理的胶水代码。若你要在低谷时段批量消化带测试判据的小卡,可按上文安装、在项目内 init/doctor、在 DSH 会话中建卡后交给调度或手动 run --once。

反馈可发到仓库 issue 或 README 所列社区讨论帖。

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

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

小夜