qiqll/dsh-task-suite:在 DSH 里跑一份可验收的任务池

前言

智能体在真实项目里连续交付多个任务时,常见三类问题:任务状态只存在对话里,跑完的任务没法核对改动,循环派活没有人卡验收。qiqll/dsh-task-suite 把 Claude 的 task-* 任务体系移植到 DeepSeek Harness(DSH),提供一份磁盘上的任务池,加上状态机、主会话调度、后台 worker 和机器验收。

它没有 Web 任务板,backlog.md 就是看板;也不强制 git,没有 git 仓库时用文件快照完成基线比对、改动归属和回滚。下面介绍它的安装、目录结构、用法和验收逻辑。

一、这是什么

qiqll/dsh-task-suite 是 DSH 的本地插件,维护者 qiqll,许可证为 MIT(见 package.json),运行要求 Node >= 20。

它把四个角色拆进一份任务池加一套工具:主 agent 负责与需求方对话、排期、派活、验收;后台 subagent 在全新上下文里完成单个任务并输出结构化报告。任务池是磁盘上的 Markdown,需求方可以直接看、直接改。

与已有做法的区别:Claude 的 task-* 生态状态目录在 .claude/,本插件只使用 .dsh/tasks/,默认不碰 .claude/ 池。它没有内置心跳或 cron,长循环需要外部定时器提醒主会话 tick;也没有 Web 任务板。

二、安装与启用

从 GitHub 源码安装,这是当前推荐的方式:

dsh plugin add qiqll/dsh-task-suite

npm 包发布后也可以直接按包名安装:

dsh plugin add dsh-task-suite
# 或指定 profile
dsh plugin --profile web add dsh-task-suite

桌面版在 设置 → 插件 里搜索 dsh-task-suite 安装。首次安装后工具与三个 skill(task-admin / task-loop / task-worker)自动注册,无需重启。

插件按 awesome-dsh-plugin 的收录格式准备,市场卡片、安装与更新由该目录和 npm 版本驱动。这是社区目录,与 DeepSeek / 幻方无官方从属关系。

本地开发时把本目录用 link: 指向 profile 的依赖即可;改代码后对该插件行禁用再启用,就完成热重载。

三、状态目录与状态机

任务池落在 .dsh/tasks/:

.dsh/tasks/
├── backlog.md          # 需求方入口:P0–P3 表、待决策、人工阻塞、ID 规则
├── dev-plan.md         # AI 维护:当前批次、进行中、技术前置
├── dev-progress.md     # 已完成归档(按月)
├── inbox/              # 需求方/调度方投递(task_*.json),merge 后移到 .merged/
└── auto/               # 运行时状态,整目录 gitignore
    ├── current.json    # 当前任务:nonce / startSha / 脏文件 / 阶段
    ├── session.json    # 循环会话:active / max / hours / done / noprog
    ├── run.log         # 运行流水
    ├── STOP            # 停机标记
    └── snapshots/      # 非 git 模式:开工快照 + manifest(确认后删)
        └── T-001-<nonce>/
            ├── manifest.json
            └── files/

task_init 在 git 仓库里会把 .dsh/tasks/ 加进 .gitignore,非 git 目录不创建该文件。每个工作区独立一份池;任务池是运行态,不进业务提交。

状态机:

待开始 → 进行中 → 待验证 → 已完成
             └→ 阻塞 / 待决策 → 待开始
             └→ 打回 → 进行中

同一时刻只允许一个「进行中」;P0 可中断,旧任务记录断点。

四、建池与录入

先用 task_init 建目录,再用 task_add 录入任务:

task_init                                   # 建 .dsh/tasks/(git 仓库里顺带写 .gitignore)
task_add items=[{title, module, priority, deps, acceptance, note}]
task_status                                 # 全局视图 / 待决策 / 阻塞 / 流水

task_add 一次可以录入 1..N 条,会自动判重、分配 ID、检查依赖和验收字段,参数有 items[] 和 source。task_status 给出全局视图与下一步建议。

单步手动模式:

task_pick mode=manual task_id=T-001         # 自己认领并实施
task_accept report="<报告块>"               # 机器验收
task_confirm task_id=T-001 conclusion="..." # 需求方确认后归档

五、自动循环与后台 worker

自动循环是推荐用法:

task_loop action=start max=10 hours=8
task_loop action=tick        # 返回 worker_prompt
# 把 worker_prompt 原样交给 subagent 工具;然后结束回合等完成通知
# 收到 worker 的最后一条消息后:
task_accept report="<整段报告块>"
# 通过 → 待验证;需求方确认 → task_confirm;不通过 → task_reject
task_loop action=tick        # 派下一个

task_loop 的 action 有 start / tick / stop / halt / resume / requeue / status。正常停机用 task_loop action=stop reason="...";中途叫停要先调用 interrupt_agent,再 task_loop action=halt,halt 保留提交但不回滚。叫停后继续用 action=resume(同一任务带断点重派),放回队列用 action=requeue。

没有内置心跳,长循环可以用 schedule_create 定时提醒主会话 tick。

六、工具一览

工具 作用 关键参数
task_init 初始化池 + .gitignore —
task_add 录入 1..N 条,自动判重/ID/依赖/验收 items[], source
task_status 全局视图与下一步建议 —
task_list 按状态/优先级/关键词筛选 status, priority, query
task_show 单任务完整简报 task_id
task_pick 认领任务;auto 返回 worker_prompt mode(auto/manual), task_id, interrupt
task_accept 机器验收 worker 报告 report, rollback
task_confirm 需求方确认 → 归档 task_id, conclusion, gate
task_reject 需求方打回 → 待开始 task_id, reason
task_answer 答复待决策/阻塞,回到待开始 task_id, answer
task_inbox 投递需求/决策(worker 在跑时用) type, text, title, ref
task_merge 立即合并 inbox —
task_loop 循环状态机 action, max, hours, reason
task_verify 只读重跑测试 + 基线比对 + 改弱审计 test_cmd, start_sha
task_audit 只读审计提交归属/越界/脏文件/改弱 start_sha, task_id

七、Worker 报告契约

worker 最后一条消息只输出结构化报告块:

=== TASK-AUTO REPORT ===
NONCE: <current.json 的口令>
RESULT: DONE | NEEDS_DECISION | BLOCKED | BASELINE_RED | FAILED | GATE_PENDING_REVIEW
TASK: T-001
START_SHA: <开工 SHA>
COMMITS: <sha...>
TEST_CMD: <[cd dir &&] 单条测试命令 路径...>
TEST_RESULT: 基线 x passed, y failed → 交付后 z passed, w failed;既有失败:...
TEST_CHANGES: 仅新增 / 无改动 / 有修改(说明)
GATE: <code-reviewer H×n M×n;跳过原因;...>
ACCEPTANCE: <对照验收标准>
ASSUMPTIONS: — / ...
DECISION: — / 问题 / 选项 / 推荐
BLOCKER: — / ...
DERIVED:
- [P2] 标题 | 涉及文件 ... | 来源 ...
BRIEF:
给需求方的 1–3 句人话说明
=== END REPORT ===

task_accept 校验 nonce、任务归属、阶段、提交信息里的任务 ID、脏文件、测试范围与基线失败集合、测试是否被改弱、高风险路径。通过后把任务落到「待验证」并生成衍生任务;失败则按 RESULT 进入待决策 / 阻塞 / 自动失败计数。

GATE_PENDING_REVIEW 时验收暂停在 review_pending:调度员自己看 start_sha..HEAD,通过就再调用 task_accept 并传 review="pass: ..."(同一报告即可);不通过就把发现发回 worker 修复并重交。

八、两种基线模式

mode 默认 auto:能拿到 git HEAD 就用 git 模式,否则自动用文件模式;也可以强制 mode: file / mode: git。

git 模式 文件模式(非 git 目录)
开工基线 START_SHA auto/snapshots/<T-NNN>-<nonce>/ 全量快照 + manifest.json
改动归属 commit message 含任务 ID 快照与当前目录的文件差异(新增/修改/删除)
基线测试 git worktree 回到 START_SHA 快照复制到临时目录,回放开工时代码
回滚 git reset --keep START_SHA + ref 从快照恢复文件,恢复前再备份当前树
提交要求 每个 commit 带任务 ID 不 commit;COMMITS: —
局限 要求有 HEAD 无法区分「谁改的」;快照占磁盘;依赖目录/构建产物被排除

快照默认排除 .git、node_modules、.venv/venv、__pycache__、dist/build、.dsh/tasks 等。项目很大时用 snapshotIgnore 排除更多目录,或调大 snapshotMaxBytes / snapshotMaxFiles。任务确认/打回后快照会删除,默认只保留最近 10 份快照。

文件模式的 TEST_CMD、测试改弱审计、nonce、遗留文件检查与 git 模式完全一致;只是「提交归属」换成「快照差异归属」。

九、验收与防作弊

1、nonce:每次 claim 生成一次性口令,旧报告/重复通知直接丢弃。
2、提交归属(git):git log START_SHA..HEAD 里每个 commit 的 message 必须含任务 ID;出现别人的 commit 就停下,不自动处理。
3、改动归属(文件):与开工快照比对,新增/修改/删除都列出;报告 CHANGES 与实际不符会告警。
4、基线比对:当前测试失败时,在 git worktree 的 START_SHA(git)或快照副本(文件)上重跑同一命令,只有「基线也失败」的用例才算既有失败;新失败 → 打回。
5、测试范围:TEST_CMD 必须是单条命令,禁止 ; | & $( > < 与 -k/--deselect/--ignore/--lf/--collect-only/--passWithNoTests;改动/删除的测试文件必须落在命令路径参数覆盖范围内。
6、改弱审计:删除用例、移走文件、skip/xfail、注释断言、断言净减少、测试配置 ignore 都会产生告警;DONE 带告警 → 转「待决策」。
7、高风险路径:认证、支付、迁移、部署、CI、依赖清单等;命中时要求报告写 GATE 与 ASSUMPTIONS,否则转人工 review。

机器验收在原 verify_tests.sh / check_test_weakening.sh 的基础上重写为 Node 实现,判定口径保持一致。

十、配置项

插件配置写在 cordis.patch.yml 的 config,可以覆盖以下默认值:

键 默认 说明
stateDir .dsh/tasks 相对项目根
testTimeoutSec 900 单次测试超时
defaultMaxTasks 10 循环最多交付数
defaultMaxHours 8 循环最长小时数
maxNoprog 3 连续无进展自动停机
maxDerivedPerParent 3 单任务衍生上限
maxDerivedDepth 2 衍生层级上限
mode auto auto / git / file;强制文件模式可让 git 仓库也走快照
snapshotIgnore [] 额外排除的相对路径或 * glob
snapshotMaxBytes 536870912 单次快照体积上限(512MB)
snapshotMaxFiles 20000 单次快照文件数上限
snapshotKeep 10 保留最近多少份快照

十一、适用场景与注意

适合需要在本地项目里连续做多个任务、希望每一条交付都有验收和归档的 DSH 使用者;也适合没有 git 仓库,但仍要区分「这次改动属于哪个任务」的场景。

需要注意几点:插件以当前 dsh 进程的权限运行,会写 .dsh/tasks/,并按配置做快照、git worktree 和测试命令回放。安装前应阅读源码与许可证,确认测试命令、进程派生与文件操作范围符合项目要求。

开发自测可以直接执行:

cd dsh-task-suite
node selftest.mjs

自测覆盖两种模式:git 下的建池/录入/解析、认领、报告解析、DONE 验收与归档、FAIL_NEW 基线比对、测试改弱、inbox、待决策、循环启停、halt/resume/requeue;非 git 下的快照认领、快照差异归属、DONE 验收、FAIL_NEW 基线、测试改弱、失败回滚。

结尾

dsh-task-suite 把 task-* 的排期、派活、验收三件事落到磁盘上:backlog.md 可读可改,验收由机器按基线比对与改弱审计完成,git 仓库和非 git 目录都能跑。目录页在 https://www.skillhub.cn/plugins/qiqll/dsh-task-suite,源码在 https://github.com/qiqll/dsh-task-suite。

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

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

小夜