deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
DeepSeek Harness 的任务看板插件:人建卡、agent 认领执行、人验收。任务挂项目(workspace)、可指定模型、支持手动与定时执行,全流程双向协作。


看板协作
taskboard_checklist 增补/勾选(附证据 note);用户在详情页直接勾选;待验收时未完成项红色高亮 + 卡片「☑ n/m」角标(未全勾显红);清单编辑在表单中整组管理(勾选状态与证据保留)taskboard_execution_report 提交(摘要 / 改动文件 / 自验 / 产物 / 剩余风险),自动挂到当前执行记录;待验收详情页分栏渲染;开场框架行明示提交时序(报告 → 评论 → 移待验收)git show / 文件 git diff,128KB·2000 行封顶标注截断);worktree 已删时回落主仓(仅限提交与带基线的范围 diff)Agent 工具(taskboard_*)
执行
<项目>/.dsh-worktrees/<任务ID> 独立 worktree 上进行,分支 task/<标题>+<任务ID>(首次创建后定死,改名不改);执行会话归属项目根目录(分组、工具与文件沙箱完整可用——DSH 要求会话 cwd 即工作区根,0.3.2 修正),worktree 路径与边界纪律在开场指令中明确下达;结算自动采集提交列表 / 未提交修改警告 / 改动统计;非 git 项目或 git 不可用时自动降级原目录执行(执行记录注明降级原因,台账与执行主流程永不因 git 失败而失败);验收时详情页一键 --no-ff 合并到主工作区(主区脏或冲突原样报告,不自动解决)、删除 worktree(有未提交修改时拒绝)、可选删分支;支持「↻ 续跑」在现有 worktree/分支上继续执行(保留上次改动与提交)Worktree 隔离是协作约定而非沙箱:执行会话拥有完整工具权限,隔离依赖分支约定,不适用于运行不可信代码的场景。
dsh plugin --profile <name> add dsh-taskboard # npm(推荐,预构建免授权)
dsh plugin --profile <name> add github:cloader/dsh-taskboard # GitHub 源
官方
@deepseek-ai/dsh-*包只写进 profile 的bundles列表,不要plugin add进 dependencies(避免 SDK 双实例遮蔽)。
npm install && npm run build # host ESM + client CJS 双构建
npm test # vitest 全量
node tests/manual-git-e2e.mjs # 真 git 端到端手测(worktree 全链路 + 续跑 + diff 查看器)
node scripts/screenshot.mjs # 重新生成 img/ 截图(需本机 Edge)
验收效率包——把「人验收」环节在看板内闭环:
checklist(≤30 项 × 200 字,勾选人/时间/证据 note 全程留痕)。建卡表单整组编辑(编辑保留勾选状态与证据);agent 侧新工具 taskboard_checklist(add 增补 / check 勾选附证据 / uncheck 重开,代码闸:勾选永远不等于完成);执行开场框架行注入清单并下达「完成一项勾一项」纪律;待验收卡片与详情未完成项红色高亮,「✓ 完成」在有未勾项时二次确认并显示数量report { summary, changedFiles, checks, artifacts, risk };agent 收尾用新工具 taskboard_execution_report 提交——按「调用会话 + 运行中执行」定位挂载(agent 无需知道执行 id,重复提交覆盖);待验收详情页分栏渲染(摘要 / 改动文件 / 自验 / 产物 / 风险);开场交接协议更新为「报告 → 评论 → 移待验收」三步validateLedgerImport 纯函数逐卡校验分类(新增 / 覆盖 / 无效+原因,文件内重复 id 拒绝;schemaVersion 不符明确报错;导入时残留 running 执行标记为失败——其结算守望已随源主机消亡);POST /import/preview 干跑 + POST /import 提交(merge 按 id upsert;replace 整册替换前自动写 ledger.backup-<ts>.json);GUI「⬆ 导入」弹窗全流程可视化,整册替换双重确认templates.json side file(首启播种内置 Bug 修复 / 发布检查 / 例行巡检);「+ 新建任务 ▼」下拉选模板预填全部配置(含清单与 preset);任务详情「⌗ 存为模板」;管理弹窗改名 / 删除 / 直接使用showCommit / showPathDiff(fail-soft,128KB / 2000 行封顶标注截断);详情页隔离块的提交行与未提交修改文件行点击即懒加载展开 diff;worktree 已删时自动回落主仓taskboard_get 详情渲染清单与报告标记;复制任务携带清单修复执行会话拿不到工具(非标准模式):0.3.0 起部署引入 preset 体系后,工具不再是全局注册,而是各 preset 组合在会话创建时挂载(GUI 建会话走 apiproxy 的 composeAgent → presets.mount)。我们的执行服务此前直接 agents.create,不挂任何组合 → 会话无工具。现对齐该链路:执行会话按 preset 组合创建,agentPreset 记入会话头
任务级 preset 字段:创建任务时可选「执行模式(preset)」,默认预选部署默认 preset(本部署即标准模式)——即按你的决定「默认标准模式」;可切任意 preset(如梁神模式)或选「跟随部署默认」(不落字段,随部署默认变);编辑随时可改(每轮执行现组合,无锁定);复制任务携带;taskboard_create 增 presetId 参数;详情页显示 preset chip
坏 preset 防护:preset 解析失败(不存在/损坏)→ 执行直接失败、原因写入执行记录、任务退回待办——不产出半组合会话(与 apiproxy 回滚语义一致)
preset 目录用来自 agentPreset.list 连接 RPC(无 roster 或离线时下拉隐藏,行为回落到裸组合);测试 111 → 116 项
修复 worktree 执行会话脱离项目组、工具不可用:0.3.0–0.3.1 把执行会话 cwd 指向 worktree 子目录,而 DSH 的会话模型要求 cwd === 工作区根目录(全等)——子目录导致会话无法挂入项目组(显示「未分组」),且文件沙箱边界与相对路径解析全部失效(agent 无法创建文件)。现改回:会话 cwd = 项目根(分组、工具、沙箱完整可用),worktree 绝对路径与边界纪律(命令 workdir 指向 worktree、文件读写用绝对路径、禁改主工作区其它文件、提交到任务分支)在开场框架行中明确下达。git 隔离与证据采集不受影响
.dsh-worktrees/ 一目了然,仍不自动修改);「悬挂执行中」更名为「执行中」taskboard_create 增 isolation 参数;复制任务携带;首次执行前可改、开始后锁定git worktree add --force 到固定路径 .dsh-worktrees/<任务ID>,固定分支 task/<标题>+<任务ID>,标题清洗+截断、空标题回退纯 ID、改名不改分支);执行会话 cwd 指向 worktree;开场框架行引导 agent 把改动提交到该分支--no-ff,主区脏/冲突原样报告且自动 merge --abort 复原)、🗑 删除 worktree(有未提交修改拒绝,可选连分支删除)、保留分支退回继续修改.dsh-worktrees/ 目录;所有 git 操作带超时(查询 2s / 结构操作 15s)src/host/git.ts:窄接口 GitFace(detect/prepare/collect/merge/remove/deleteBranch),exec 层可注入(测试零真 git);workspaces 路由下发 git 检测结果(60s 缓存);启动时对未忽略 .dsh-worktrees/ 的项目提示 gitignore 建议(不自动改)taskboard_get 详情输出隔离与分支信息;测试 67 → 97 项待办|进行中|待验收 计数(如 0|1|2),三个数字分别着蓝/橙/紫状态色,悬停提示含义与实时数字,数字变化时上下滚动动画(增长上滚、减少下滚,尊重 prefers-reduced-motion)DSH_TASKBOARD_MAX_CONCURRENT 可调);调度器满载时保留到期窗口不烧掉,下个 tick 重试{{lastExecution}}(上次执行结果)、{{lastComments}}(最近 3 条评论)——巡检类定时任务能看到上次跑出了什么taskboard- 中缀,各记录可区分claimedBy/claimedAt 字段(原先从 updatedBy 推断,用户编辑会误清持锁);执行期间任务由执行会话持有,其他会话不可移动;旧台账加载时自动迁移store.snapshot()/get() 返回冻结副本,外部修改直接抛错,杜绝绕过版本号的原地改数据store.flush / routes taskPath)sessionTitle.rename 写入,不会被自动重命名覆盖);首条消息以正常用户消息呈现(不再是插件上下文行)alert() 全部替换为主题化模态弹窗(Esc/遮罩可关)License: Apache-2.0
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。