前言¶
在 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 插件页
核心功能¶
资料中的设计可以概括为一条闭环,只做「待办卡 → 自动做 → 可核对完成」这一件事。
- 看板与卡:看板文件为仓库内的
KANBAN.json;用 CLI 或 DSH 会话建卡,卡上写目标、判据与边界。 - 一卡一 worktree:每张待办在独立 git worktree 里执行,避免互相污染工作区。
- headless worker:通过配置中的
dshBin、dshProfile(默认headless)拉起 worker;完成须满足卡里可机械核对的判据(例如测试命令),否则不得报 done。 - 证据与合并:证据写回卡;引擎在跑批前后侦测主检出,并做合并回收。
- 调度方式:
scheduler可为plugin(插件内按schedule.intervalMin扫描),也可npx dsh-offhours run --once或面板「立即跑」。 - 闸门:
gates限制单次/每日卡数及每日成本上限(如maxCnyPerDay)。 - Web 面板:安装到
webprofile 后,左侧出现「夜间跑批」面板,可查看状态并触发运行。
安装与启用¶
在已安装 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
webprofile,希望在本地用看板沉淀「可验收」小任务,并在非高峰自动推进的实现者。 - 仓库习惯用 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。
- 目录页:https://www.skillhub.cn/plugins/shuke52tt/dsh-offhours
- 源码与 README:https://github.com/shuke52tt/dsh-offhours
- npm:https://www.npmjs.com/package/dsh-offhours
反馈可发到仓库 issue 或 README 所列社区讨论帖。