跳到正文
dsh-market 浏览插件 GitHub EN

zhengjy01/dsh-task-dispatcher

滴答清单任务派发器:按间隔从指定清单拉取到期任务写入今日任务文件,仅在任务集变化时通知(微信 ClawBot / flomo / macOS);可为每个任务单独开一个 headless DSH 会话自动执行(worker 超时可配),并可选只在 DeepSeek 空闲(优惠)时段开跑——高峰期把任务排到下个空闲窗口而不是立刻执行;带 Web 设置面板(延迟回写队列、省钱模式时段与状态)与 dispatcher_status / dispatcher_config / dispatcher_run / dispatcher_report 工具。

Star 数 ★ 1 分类 通知与集成 收录于 2026-09-30 npm dsh-task-dispatcher

安装

在 DeepSeek Harness 里通过 dsh-market 安装

dsh plugin --profile web add dshmarket

或使用命令行

dsh plugin --profile web add dsh-task-dispatcher

装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络。请先审阅源码,并尽量锁定 commit(github:owner/repo#sha)。

README

把滴答清单(TickTick)当作 DSH 的任务派发器:插件内置 cordis 定时器,按可配置的间隔(默认每 30 分钟)从配置的来源清单(默认 In progress)拉取今天到期的任务,写入今日任务文件,并仅在任务有变化时发送通知(微信 ClawBot / flomo / macOS,按配置开关)。agent 读取今日任务文件后逐项执行,完成的用 ticktick_complete 回写滴答清单。

因为任务都是随手写进滴答清单的,插件会自动跟上:你随时加任务,下次拉取就带进来。

依赖本机已安装的 dsh-ticktick 插件(复用其数据层与 OAuth 凭据 ~/.dsh/dsh-ticktick.json),无需重复配置。

特性

  • 按间隔自动拉取:cordis ctx.interval 每分钟轮询,距上次拉取超过配置间隔(分钟)就拉取一次;间隔 0 = 关闭定时;dispatcher_run 可随时手动拉取。
  • 任务来源:默认滴答清单 5️⃣AI(改成 In progress 即可把「用户放要做/正在做任务的入口」当来源),可按 projectName / projectId 配置;dueMode=today 拉「今天到期/逾期 + 无截止」,dueMode=all 拉全部未完成。
  • 今日任务文件:每次拉取把任务写成 Markdown 清单(默认 ~/.dsh/dsh-task-dispatcher/today-tasks.md);每项任务除了标题与截止日期,还会把它在滴答清单里的**描述(备注)**以引用块形式附在标题下,agent 读文件时连同描述一起读。
  • 执行结果回执(notifyResult,默认开):自动执行的每个任务在 worker 结束后自动推一条简明结果(✅/❌ + 标题 + 一句话结果),一轮多任务再补一条批次汇总——跑完会自己汇报,不用靠 worker 记得调 dispatcher_report。摘要取 worker 的 stdout 最终答复(进度/思考走 stderr),剥 ANSI、丢 DONE 标记、截断到 220 字。
  • 有变化才通知:notifyWechat(微信,经本机 DSH-WeChatClawBot 网关转发,接收人默认自动识别)+ notifyFlomo(复用 ~/.dsh/dsh-flomo.json 凭据,标签可配置)+ notifyMac(osascript);任务集无变化时保持安静,避免刷屏。
  • 微信通知(ClawBot):插件把正文 POST 到本机网关 /send(默认 http://127.0.0.1:51235),由网关发给扫码登录的微信;插件不直连微信、不存微信凭据。接收人默认从 ClawBot 状态目录(~/.dsh-wechat,可用 DSH_WECHAT_HOME 覆盖)的 accounts/<botId>.json 里读 userId,也可用 wechatTo 显式指定;长正文自动分条(1200 字符/条)。通道不可用时只记为该路失败,不影响派发。
  • 自动执行(autoExecute):开启后,为每个拉到的新任务单独开一个 dsh --profile headless 会话(串行,一任务一会话)去执行;worker 只带基础工具(bash/文件/glob/grep/网络/目标工具);执行成功即用 ticktick_complete 回写滴答清单勾掉;失败任务在重试冷却期内不重复跑。
  • 选择执行会话的工作区(workerWorkspaceId):默认 worker 会话在用户主目录下运行;配置某个 DSH 工作区 id 后,worker 以该工作区目录为 cwd 启动,产生的会话会在该目录下读写文件,并在 GUI 侧边栏自动归入该工作区。设置面板提供工作区下拉(列表来自 ~/.dsh/storages/workspace.json),留空 = 默认主目录。
  • worker 超时(workerTimeoutMinutes):每个自动执行的 worker 到点被 SIGKILL,默认 30 分钟(范围 1–1440),可在 dispatcher_config / 设置面板调整。此前是写死的 10 分钟常量,长任务跑到 10 分钟就被杀并误报为失败。
  • 省钱模式(cheapMode,默认关):勾选后自动执行只在 DeepSeek 空闲(优惠)时段开跑,高峰期把任务排队到下一个空闲开始点(cheapStrategy=wait)或本轮跳过(skip)。判定点只在「准备开 worker 之前」——拉取节奏、过滤、串行执行全部不变;关闭时行为与旧版 100% 一致。官方口径(2026-08-17 起峰谷定价):高峰 = 北京时间周一至周五 09:00–12:00、14:00–18:00,其余时间空闲(约半价);代码里时段不写死,可用 cheapPreset(official-2026 / legacy-utc 旧版 UTC 16:30–00:30 / custom)+ peakWindows + cheapTimezone 配置。排队任务与 nextCheapStartAt 落盘,DSH 重启不丢;dispatcher_run 默认同样遵守,传 ignoreCheapMode: true 可立刻绕过。通知文案区分「省钱模式:已排入 XX:XX 空闲时段执行」与正常执行。
  • 延迟同步面板(agent → 滴答清单):设置页新增区块,直接配置并查看这条回写链路——静默阈值(分钟)、单会话顶层上限、定时器检查间隔(秒,改完自动重载 launchd),并显示队列条数/明细、当前静默(全机 DSH 口径)、定时器是否在跑、上次写入结果。按钮:保存阈值、立即写入、强制写入、重载定时器。控制面与执行面分离:写入仍由独立脚本 + launchd 完成(DSH 关着也能写),插件只做配置与观测,两者共用同一个队列文件,不重复实现任何写入逻辑。路由:GET /api/dsh-task-dispatcher/deferred、POST .../deferred/{config,flush,timer}。
  • agent 工具:dispatcher_status / dispatcher_config / dispatcher_run + Web 设置面板「任务派发器」。

兼容性

要求 DeepSeek Harness ≥ 0.1.5-rc.1(已在包清单的 dsh.engines.dsh 中声明,DSH 插件市场据此显示兼容版本),并已在 0.1.5-rc.1 上实测通过。本构建包含 DSH 0.1.5 的适配:工具结果的严格校验契约(lossless-JSON 快照、additionalProperties: false 的 schema 校验、output.render 必须返回 ContentBlock[]),以及不依赖宿主 PATH 的可执行文件解析(launchd 托管的宿主 PATH 只有 /usr/bin:/bin)。 本版起在 peerDependencies 中显式声明兼容 DSH 0.2.0-rc.2(官方 DSH 包的版本范围已含 ^0.2.0-rc.2),在 0.2.0-rc.2 上不会再出现兼容告警;功能与行为无变化。

安装

骨架:装 → 重启 → 确认加载。每步都写了「会发生什么」,照着做不会卡。

  1. 装插件:在终端执行 dsh plugin --profile web add dsh-task-dispatcher。 预期:命令正常结束,~/.dsh/profiles/web/package.json 的依赖里出现 dsh-task-dispatcher。
  2. 重启 DSH:重启 dsh web(Web GUI 侧边栏「重启」,或终端重跑同一条启动命令)。 预期:界面能重新打开,启动输出里没有插件加载报错。

📷 【截图位 2】这张图证明插件装上了 怎么截:终端里跑完第 1 步、停在安装命令的结果行(或重启后 DSH 启动完成的那几行);截取范围:终端窗口 敏感处理:本机路径、用户名、token 必须打码或裁掉 补图:截图存进仓库 docs/images/dsh-task-dispatcher-01-installed.png,再把本段整段替换为 ![装完的样子](docs/images/dsh-task-dispatcher-01-installed.png)

  1. 确认插件已加载:让 agent 跑一次 dispatcher_status(或看设置页是否出现「任务派发器」)。 预期:输出以 插件状态:已启用 开头,并列出来源清单、拉取间隔、通知通道。

启用与配置

  1. 打开设置页:DSH Web → 设置 → 找到 「任务派发器」 卡片并展开。 预期:看到总开关、拉取间隔、任务来源、通知通道、自动执行等区块。

📷 【截图位 4】这张图证明配置入口在哪(最容易卡的一步) 怎么截:设置页 → 停在「任务派发器」卡片展开后的上半部分(总开关 + 拉取间隔 + 来源清单) 敏感处理:卡片里的工作区路径 / 清单名如含个人信息就裁掉 补图:截图存进仓库 docs/images/dsh-task-dispatcher-02-settings.png,再把本段整段替换为 ![设置页里的任务派发器](docs/images/dsh-task-dispatcher-02-settings.png)

  1. 按需改配置:在卡片里设置任务来源(默认 5️⃣AI,要用「进行中」就填 In progress)、拉取间隔(0 = 关闭定时)、通知通道(微信 ClawBot / flomo / macOS 任选;微信默认关,需显式打开)、自动执行(开启后每个任务单独开一个 headless 会话执行)。 预期:保存后状态行刷新,dispatcher_status 里能看到同样的值。
  2. 打开省钱模式(可选;这是本版重点):在同一张卡片里勾选 「省钱模式(自动执行只在 DeepSeek 空闲时段开跑)」(默认关),然后设 时段口径(默认「官方现行(周中 09–12 / 14–18 高峰)」)、策略(默认「排队等空闲」,也可选跳过)、尾部余量(建议填 worker 超时分钟数,如 15 / 30)。 预期:展开出现时段表;状态行出现「当前时段:空闲/高峰」「下次执行时间」「排队任务:N」。

📷 【截图位 6】这张图证明省钱模式设对了 怎么截:设置页 →「任务派发器」→ 停在「省钱模式」展开后的完整设置区(开关 + 时段口径 + 策略 + 尾部余量 + 时段表) 敏感处理:无(注意别把顶部的工作区路径一起截进来) 补图:截图存进仓库 docs/images/dsh-task-dispatcher-03-cheap-mode.png,再把本段整段替换为 ![省钱模式设置](docs/images/dsh-task-dispatcher-03-cheap-mode.png)

验证能用

  1. 触发一次派发:让 agent 跑 dispatcher_run,或点面板上的立即拉取;想「不等空闲、马上跑一次」就点 「省钱模式(高峰也马上执行,仅本次)」。 预期:今日任务文件 ~/.dsh/dsh-task-dispatcher/today-tasks.md 出现条目(agent 会读它逐项执行);任务有变化时会收到一条通知。
  2. 看结果:跑一次 dispatcher_status,或看面板状态行。 预期:看到「上次拉取:<时间> · 项」;开着省钱模式且当前是高峰时,还会看到「排队任务:N 项」与「下次执行时间」——任务没被立刻执行、而是排到下个空闲段,就是省钱模式生效的样子。

📷 【截图位 8】这张图证明它真的能用(最重要的一张) 怎么截:触发一次后停在面板状态行,或 dispatcher_status 输出里的「上次拉取 / 排队任务 / 下次执行时间」那几行;截取范围:仅这块卡片或这段终端输出 敏感处理:真实任务标题、本机路径、微信昵称都要打码或换成测试任务 补图:截图存进仓库 docs/images/dsh-task-dispatcher-04-in-use.png,再把本段整段替换为 ![用起来的效果](docs/images/dsh-task-dispatcher-04-in-use.png)

当前版本:v0.6.0(CHANGELOG · Releases · npm)。

配置参考(~/.dsh/dsh-task-dispatcher.json,0600)

字段 说明 默认
enabled 插件总开关 true
dispatchIntervalMinutes 每隔多少分钟自动拉取一次(0 = 关闭定时) 30
autoExecute 是否自动执行(每个任务单独一个 DSH 会话,串行) false
retryCooldownMinutes 失败任务重试冷却分钟 60
workerTimeoutMinutes 单个执行会话的超时分钟数(到点 SIGKILL 该 worker) 30
workerPrompt 执行会话提示词模板({title}/{content}) 内置
workerWorkspaceId 执行会话运行的 DSH 工作区 id(空 = 默认主目录;见设置面板工作区下拉) ''
projectName / projectId 来源滴答清单(常见把 In progress 当来源) 5️⃣AI
dueMode today=今天到期/逾期;all=全部未完成 today
includeUndated 是否包含无截止任务 true
notifyResult 自动执行结束后推送每任务结果 + 批次汇总(走已开启的通道) true
notifyWechat 微信通知(经 ClawBot 网关;仅任务有变化时) false
wechatGatewayUrl ClawBot 网关地址(空 = http://127.0.0.1:51235) ''
wechatTo 微信接收人 id(空 = 自动识别扫码登录的那个微信) ''
wechatStateDir ClawBot 状态目录(空 = $DSH_WECHAT_HOME 或 ~/.dsh-wechat) ''
notifyFlomo / flomoTag flomo 通知与标签(仅任务有变化时) true / AI/DSH/派发
notifyMac macOS 通知(仅任务有变化时) true
taskFile 今日任务文件路径 ~/.dsh/dsh-task-dispatcher/today-tasks.md
cheapMode 省钱模式:自动执行只在 DeepSeek 空闲时段开跑 false
cheapPreset 时段口径:official-2026(官方现行)/ legacy-utc(旧版 UTC 16:30–00:30 空闲)/ custom official-2026
peakWindows / peakWindowsText 高峰时段黑名单(优惠 = 非高峰);peakWindowsText 每行 1,2,3,4,5 09:00-12:00(0=周日…6=周六,start>end 跨午夜) 周中 09–12 / 14–18
cheapTimezone 解释高峰时段的 IANA 时区 Asia/Shanghai
cheapStrategy 高峰期策略:wait=排队到下个空闲;skip=本轮跳过 wait
cheapMarginMinutes 尾部余量(距高峰不足则排到下段;0=关闭尾部保护) 0
nextCheapStartAt / cheapQueue 排队状态(落盘,重启不丢;自动维护,无需手改) '' / []

开发

pnpm install
pnpm build && node tests/smoke.mjs

License

MIT

内容来自项目 README(GitHub)↗

评论

评论存放在 GitHub Discussions。用 GitHub 账号登录后可发表评论或点表情。