🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

蜂群任务编排 february2015/dsh-taskswarm

DeepSeek Harness
february201579 天前有提交已提供中文文档扫描:高危

把任务排成波次,多智能体隔离并行执行并自动评审合并

28.9/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add february2015/dsh-taskswarm
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · dev
装得上吗
静态安装检查有提示项,装前建议看一眼 README
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 79 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-taskswarm(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/24 00:03:09

🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

命令参数由运行时变量拼接读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 89 处,展示前 56 条)
  • 执行外部命令运行时拼接
    dashboard/server.mjs:388
    exec(`${cmd} ${url}`, () => {})
  • 读取本地文件
    dashboard/adapters.mjs:211
    sessions = readdirSync(dir)
  • 读取本地文件
    dashboard/adapters.mjs:220
    files = readdirSync(sessionDir).filter((f) => f.endsWith('.jsonl') || f.endsWith('.jsonl.zstd'))
  • 执行外部命令固定命令
    dashboard/adapters.mjs:229
    text = execFileSync('zstd', ['-dc', full], { maxBuffer: 64 * 1024 * 1024, encoding: 'utf8', timeout: 5000 })
  • 读取本地文件
    dashboard/adapters.mjs:231
    text = readFileSync(full, 'utf8')
  • 读取本地文件
    dashboard/adapters.mjs:268
    const doneFileFound = taskFolder ? existsSync(join(taskFolder, '.DONE')) : false
  • 读取本地文件
    dashboard/adapters.mjs:296
    if (!existsSync(statusPath)) return null
  • 读取本地文件
    dashboard/adapters.mjs:298
    const content = readFileSync(statusPath, 'utf-8')
  • 读取本地文件
    dashboard/history.mjs:73
    if (!existsSync(dir)) return []
  • 读取本地文件
    dashboard/history.mjs:76
    names = readdirSync(dir).filter((n) => n.endsWith('.json'))
  • 读取本地文件
    dashboard/history.mjs:188
    if (existsSync(p)) return p
  • 读取本地文件
    dashboard/history.mjs:194
    if (tasksRoot && existsSync(tasksRoot)) {
  • 读取本地文件
    dashboard/history.mjs:197
    if (existsSync(p)) return p
  • 读取本地文件
    dashboard/history.mjs:214
    return readdirSync(tasksRoot).sort().filter((n) => n.startsWith(`${taskId}-`))
  • 写入本地文件
    dashboard/history.mjs:320
    mkdirSync(dirname(p), { recursive: true })
  • 写入本地文件
    dashboard/history.mjs:321
    writeFileSync(p, JSON.stringify(merged, null, 2), 'utf-8')
  • 删除本地文件递归
    dashboard/adapters.spec.mjs:27
    rmSync(root, { recursive: true, force: true })
  • 写入本地文件
    dashboard/adapters.spec.mjs:32
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    dashboard/adapters.spec.mjs:62
    writeFileSync(join(dir, 'PROMPT.md'), prompt, 'utf-8')
  • 写入本地文件
    dashboard/adapters.spec.mjs:63
    writeFileSync(join(dir, 'STATUS.md'), statusMd, 'utf-8')
  • 写入本地文件
    dashboard/adapters.spec.mjs:93
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    dashboard/adapters.spec.mjs:94
    writeFileSync(join(dir, `${state.id}.json`), JSON.stringify(state, null, 2), 'utf-8')
  • 写入本地文件
    dashboard/adapters.spec.mjs:100
    mkdirSync(full, { recursive: true })
  • 删除本地文件递归
    dashboard/history.spec.mjs:34
    rmSync(root, { recursive: true, force: true })
  • 写入本地文件
    dashboard/history.spec.mjs:39
    mkdirSync(join(stateRoot, 'batches'), { recursive: true })
  • 写入本地文件
    dashboard/history.spec.mjs:58
    writeFileSync(join(stateRoot, 'batches', `${id}.json`), JSON.stringify(state, null, 2))
  • 写入本地文件
    dashboard/history.spec.mjs:79
    writeFileSync(join(stateRoot, 'batches', 'b-corrupt.json'), '{ this is not json !!!')
  • 写入本地文件
    dashboard/history.spec.mjs:278
    mkdirSync(worktreeDir, { recursive: true })
  • 写入本地文件
    dashboard/history.spec.mjs:279
    writeFileSync(join(worktreeDir, 'STATUS.md'), '# TASK-001 worktree status\n\n- [x] lane worktree\n')
  • 写入本地文件
    dashboard/history.spec.mjs:282
    mkdirSync(taskDir, { recursive: true })
  • 读取本地文件
    dashboard/history.spec.mjs:289
    loadBatch: () => JSON.parse(readFileSync(join(stateRoot, 'batches', 'b-1.json'), 'utf-8')),
  • 读取本地文件
    dashboard/history.spec.mjs:411
    assert.equal(existsSync(join(ctx.stateRoot, 'dashboard-preferences.json')), false)
  • 读取本地文件
    dashboard/history.spec.mjs:417
    const persisted = JSON.parse(readFileSync(join(ctx.stateRoot, 'dashboard-preferences.json'), 'utf-8'))
  • 写入剪贴板
    dashboard/public/app.js:199
    navigator.clipboard.writeText(sessionName).then(() => {
  • 发起网络请求
    dashboard/public/app.js:2085
    fetch(endpoint)
  • 发起网络请求
    dashboard/public/app.js:2407
    fetch(`/api/status-md/${encodeURIComponent(viewerTarget)}`)
  • 发起网络请求
    dashboard/public/app.js:2645
    fetch("/api/history")
  • 发起网络请求
    dashboard/public/app.js:2694
    fetch(`/api/history/${encodeURIComponent(batchId)}`)
  • 发起网络请求
    dashboard/public/app.js:2835
    fetch("/api/preferences")
  • 发起网络请求
    dashboard/public/app.js:2842
    fetch("/api/preferences", {
  • 删除本地文件递归
    dashboard/server.spec.mjs:27
    rmSync(root, { recursive: true, force: true })
  • 写入本地文件
    dashboard/server.spec.mjs:33
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    dashboard/server.spec.mjs:34
    writeFileSync(join(dir, `${state.id}.json`), JSON.stringify(state, null, 2), 'utf-8')
  • 发起网络请求
    dashboard/server.spec.mjs:105
    const missing = await fetch(`${base}/nope`)
  • 发起网络请求
    dashboard/server.spec.mjs:110
    const hit = await fetch(`${base}/x`)
  • 发起网络请求
    dashboard/server.spec.mjs:116
    const wrongMethod = await fetch(`${base}/x`, { method: 'POST' })
  • 发起网络请求
    dashboard/server.spec.mjs:130
    await fetch(`${base}/api/status-md/ALPHA-001-one`)
  • 发起网络请求
    dashboard/server.spec.mjs:131
    await fetch(`${base}/api/status-md/other-2`)
  • 发起网络请求
    dashboard/server.spec.mjs:135
    const extra = await fetch(`${base}/api/status-md/a/b`)
  • 写入本地文件
    dashboard/server.spec.mjs:144
    mkdirSync(join(root, '.taskswarm', 'batches'), { recursive: true })
  • 写入本地文件
    dashboard/server.spec.mjs:201
    mkdirSync(join(root, 'tasks'), { recursive: true })
  • 写入本地文件
    dashboard/server.spec.mjs:248
    mkdirSync(join(root, '.taskswarm', 'batches'), { recursive: true })
  • 写入本地文件
    dashboard/server.spec.mjs:271
    mkdirSync(join(root, '.taskswarm', 'batches'), { recursive: true })
  • 执行外部命令来自配置/变量
    dashboard/server.spec.mjs:278
    const child = spawn(
  • 执行外部命令来自配置/变量
    dashboard/server.spec.mjs:339
    const child = spawn(
  • 执行外部命令来自配置/变量
    dashboard/server.spec.mjs:379
    const child = spawn(process.execPath, [serverPath, '--help'], { cwd: repoRoot })
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-default-model@deepseek-ai/dsh-cmdline@deepseek-ai/dsh-commands@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-tools@deepseek-ai/dsh-tool-bash@deepseek-ai/dsh-tool-fs@deepseek-ai/dsh-tool-fs-search
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 波次并行执行
  • 工作树隔离
  • 跨模型评审合并
展开完整介绍(172 字)↓

TaskSwarm(蜂群)— DeepSeek Harness 上的多智能体任务编排插件:waves/lanes 并行执行、git worktree 隔离、任务包与跨模型评审、崩溃可恢复 | 在 DeepSeek Harness 上编排多智能体任务:waves/lanes 并行执行、git worktree 隔离、任务包、跨模型评审、崩溃恢复

README

由 DeepSeek 最新模型翻译生成
TaskSwarm(蜂群) ⚠️ 临时安装通告(2026-08-17 ~ 08-18):npm 包 dsh-taskswarm 因清理历史版本被整体删除,需要 24 小时冷却(npm 防抢注保护)。8月17日、8月18日这两天请用 GitHub 安装: dsh plugin add https://github.com/february2015/dsh-taskswarm.git 8月19日起恢复 npm 安装:dsh plugin add dsh-taskswarm,届时本通告移除。 DeepSeek Harness 上的多智能体任务编排插件 —— 把一批任务按依赖排成波次,让多个 AI worker 在相互隔离的环境里并行执行,再自动评审、合并产出。 蜂群(自然隐喻):蜂后指挥全局,工蜂各自埋头推进自己的任务,成百上千个个体并行协作——正是这个项目做的事:supervisor 先规划波次,worker 再在自己的 lane 里并行执行。
展开完整文档(README 剩余 1 节)
TaskSwarm(蜂群)

⚠️ 临时安装通告(2026-08-17 ~ 08-18):npm 包 dsh-taskswarm 因清理历史版本被整体删除,需要 24 小时冷却(npm 防抢注保护)。8月17日、8月18日这两天请用 GitHub 安装:
dsh plugin add https://github.com/february2015/dsh-taskswarm.git
8月19日起恢复 npm 安装:dsh plugin add dsh-taskswarm,届时本通告移除。

DeepSeek Harness 上的多智能体任务编排插件 —— 把一批任务按依赖排成波次,让多个 AI worker 在相互隔离的环境里并行执行,再自动评审、合并产出。

蜂群(自然隐喻):蜂后指挥全局,工蜂各自埋头推进自己的任务,成百上千个个体并行协作——正是这个项目做的事:supervisor 先规划波次,worker 再在自己的 lane 里并行执行。

- License: MIT
- 上游: TaskPlane(Pi 生态多智能体编排)—— 本项目的原生移植
- English: README.md

核心特性

- Waves / Lanes 并行编排 —— 按依赖 DAG 把任务排成波次,每波任务并行执行;依赖关系自动分层
- Git worktree 隔离 —— 每个任务(lane)在独立 git worktree 里工作,互不干扰,产物通过 taskswarm/orch 集成分支合并
- 任务包(Task Packets) —— 每个任务 = PROMPT.md(使命/步骤/约束)+ STATUS.md(进度),持久记忆,worker 能扛过上下文重置
- 检查点纪律 —— 步骤边界自动 git commit;worker 崩溃不丢已完成的活
- 跨模型评审(Reviewer) —— 独立 reviewer 按任务 Review Level 评审产出,PASS 才合并,REVISE 打回修订
- 文件邮箱(Mailbox) —— worker ↔ supervisor 异步通信(notify / escalate / request),不依赖共享上下文
- 对话式 Supervisor —— 与你共享会话:wave 完成、lane 失败、批次完成自动汇报;可指挥它 start / pause / abort / integrate / 开 dashboard;通知与提示词中英双语("用英文汇报"即可切换,自动按你的会话语言判断,写入 .taskswarm/config.json 跨重启生效)
- Web Dashboard —— 本地实时仪表盘,零依赖 node:http + SSE,多仓库多实例、端口自动避让。启动批次时自动拉起并打印链接到会话——同一工作区始终只有一个 dashboard 实例(已运行的会被复用,绝不重复拉起)
- 崩溃可恢复 —— 磁盘状态持久化 + 检查点 + lane 分支保留,进程被杀/重启后可抢救产物、清理残留、重跑
- orch 基线 lane —— 每个 lane 工作树从 taskswarm/orch 集成 HEAD 创建,直接继承此前全部已合并产物,不重造共享代码
- 任务包校验 —— /tswarm-check + npm run check:tasks 让坏格式任务包(ID 缺连字符、缺步骤/验收标准)报出可操作原因,不再静默跳过
- LLM merge agent —— lane 并入 taskswarm/orch 冲突时,独立 merger agent 在 orch worktree 内语义化解冲突;无法解决时 lane 进入 conflict 态并暂停批次等 supervisor 处置

为什么用 TaskSwarm,DSH 不是已经有 subagent 了吗?

DSH 原生 subagent / workflow / goal 是会话式、一次性调度——适合临时委派。TaskSwarm 是架在其上的项目级编排层:

| | DSH 原生 subagent | TaskSwarm |
| 任务形态 | 聊天里一句话 | 任务包(PROMPT.md / STATUS.md)——可版本化、可批量、可复用 |
| 并行度 | 手动 | 波次规划:按依赖拓扑分波、每波并行 lane |
| 隔离 | 共享工作区(写文件会冲突) | git worktree 隔离:每 lane 独立分支 + 检查点,合并进 taskswarm/orch |
| 质量门 | 无 | 独立 Reviewer(PASS / REVISE) |
| 可恢复 | 进程结束即消失 | 持久批次状态(.taskswarm/batches/.json):重启 / resume / 跳过已完成 lane |
| 可观测 | 盯着聊天 | supervisor 事件汇报 + Web Dashboard,批次启动自动拉起、链接打印到会话 |

快速开始

1. 安装(三选一)

npm registry
dsh plugin --profile web add dsh-taskswarm

GitHub
dsh plugin --profile web add https://github.com/february2015/dsh-taskswarm.git

本地目录(开发/离线)
git clone https://github.com/february2015/dsh-taskswarm.git && cd dsh-taskswarm
npm install && npm run build
dsh plugin --profile web add $(pwd)

安装后重启 dsh web,插件即生效。

升级已装的版本:dsh plugin --profile web add dsh-taskswarm 对已满足依赖范围的旧版会报 "Already up to date" 不升级;要拉新版本需显式指定:dsh plugin --profile web add dsh-taskswarm@(或在该 profile 目录 pnpm update --latest),然后重启 dsh web。

2. 初始化示例任务

/tswarm-init # 生成两个示例任务包(EXAMPLE-001 / EXAMPLE-002)

3. 预览波次计划(不执行)

/tswarm-plan all # 展示任务按依赖排成的波次

4. 启动批次

/tswarm all # 并行执行所有任务;也可以指定任务:/tswarm EXAMPLE-002 /tswarm-status # 随时查看进度

5. 看 Dashboard

启动批次(/tswarm)会自动启动 dashboard 并把链接打印在会话里,波次执行期间随时可看进度。手动控制仍然可用:

DSH 会话内(supervisor 命令) /tswarm-dashboard

独立 CLI —— 安装插件后 bin 即在 PATH 上:
npx taskswarm-dashboard --root

不安装、临时拉取(npm 发布后可用):
npx --package dsh-taskswarm taskswarm-dashboard --root [--port 8100] [--no-open]

同一工作区只保留一个 dashboard:若该仓库已有实例在跑(手动启动或上次会话残留),会自动探测并复用,不会拉起第二个。

工作原理

TaskSwarm 编排 4 类角色:

| 角色 | 职责 |
| Supervisor | 规划波次、调度 lane、处理事件、与你对话(你发起 /tswarm 的会话即 supervisor) |
| Worker | 每个任务一个 DSH agent,在隔离的 lane worktree 里逐步推进任务包 |
| Reviewer | 独立 agent 评审 worker 产出,给出 PASS / REVISE |
| Merger | lane 完成后自动把产物合并进 taskswarm/orch 集成分支 |

Git 模型:

taskswarm/orch ← 集成分支:所有 lane 产物汇总(常驻,勿手动删除) taskswarm/ ← 每个 lane 的工作分支(含步骤检查点 commit,合并后自动删除)

持久状态(/.taskswarm/):

.taskswarm/batches/.json # 批次唯一权威状态(phase + lanes) .taskswarm/mailbox// # agent 间消息 .taskswarm/worktrees/_orch/ # 集成分支 worktree .taskswarm/worktrees// # 各 lane 的隔离 worktree

命令参考

| 命令 | 作用 |
| /tswarm [scope] | 启动批次(scope: all / 任务 ID / 路径) |
| /tswarm-plan [scope] | 预览波次计划与依赖图(不执行) |
| /tswarm-status | 查看当前批次 / lane 进度 |
| /tswarm-pause / /tswarm-resume | 当前波次结束后暂停 / 恢复。failed lane 也会在该波结束后自动暂停(pauseOnLaneFailure,默认开)——resume 时跳过该失败 lane;要重跑用 /tswarm |
| /tswarm-stop-lane | 立即停掉单个 lane(终止 worker、标记 failed、保留 worktree/检查点);同波其他 lane 继续,该波结束后批次暂停等处置 |
| /tswarm-switch-model | 一条命令更换单个 lane 的模型:停掉它、记录覆盖、自动从下一步重跑(检查点保留)。优先级:覆盖 > workerModel > 父会话默认 |
| /tswarm-abort | 当前波次结束后中止(并终止运行中 lane) |
| /tswarm-deps [scope] | 查看依赖图 |
| /tswarm-sessions | 列出活跃 lane 及其 worktree |
| /tswarm-integrate | 把 taskswarm/orch 合并进当前工作分支 |
| /tswarm-dashboard | 启动 Web Dashboard |
| /tswarm-init [ID] | 生成示例任务包 |

兼容别名:/orch、/orch-status 等 /orch- 命令等价。

热更 / HMR 行为

- 配置热更:TaskSwarm 是标准 DSH bundle,配置在 profile 的 cordis.patch.yml 中覆盖后由 DSH 热重载、无需重启。但注意:orchestrator 插件被重载时(例如修改它的配置行),卸载清理会 abort 当前运行中的所有批次——批次运行期间请勿修改 orchestrator 配置。
- 源码热更:DSH 官方在 web profile 上未启用插件源码 HMR(cordis-plugin-hmr 默认禁用);修改 TaskSwarm 源码需 npm run build 后重启 dsh web 生效。
- 批次可恢复:即使重启,.taskswarm/ 磁盘状态 + 检查点 + lane 分支都会保留;重启后可用 /orch-status 查看,并通过 supervisor 恢复或重跑失败 lane,不丢已完成工作。
- 波次计划在批次启动时固定:wave 结构(几个波、每波哪些任务)持久化且绝不在执行中重算——暂停/恢复、崩溃恢复、单个 lane 重跑都在原始 wave 布局内继续。已完成的波保持完成,剩余任务保留原始波次号,dashboard 与 dingo 的 Wave 分段保持一致。

通知与 Token 效率

supervisor 通知按「省 token 且不丢信息」设计:

- 完善的本地位消息 —— 每条通知(定时汇报 / 波次完成 / lane 失败 / 卡住 / 批次完成)都用完整、可直接阅读的语言写成(随会话 locale 中/英),例如:

[TaskSwarm] ⏱️ 定时汇报(每 5 分钟):批次 b-msvinu6n — running(已完成 1/4)· 波次 1/2 lane 1 [已合并] JM-402 · 步骤 8/8,218 步

- supervisor agent 不再翻译/复述 —— 系统提示词明确指示:通知已是完整可读的文本,不要翻译、不要复述;只判断是否有异常或需要动作——有就简要处理/汇报,没有就保持安静或一句话确认。 这才是真正省 token 的地方:通知只在最便宜的一端(引擎)写一次,模型不用再花 token 向用户重述一遍。

- 设计原则:不是「把消息压短」,而是「消除复述」。极简消息会逼模型去翻译/展开(更贵);完善消息让用户直接可读、让模型只在异常时行动。

与 dsh-dingo 配合

TaskSwarm 向其它 DSH 插件暴露标准 Cordis 服务:

const taskswarm = ctx.get('taskswarm')
const { batches } = taskswarm.getSnapshot()

每个 batch 都带有 ownerSessionId,所以像 dsh-dingo 这样的插件可以在主对话卡片上显示“等待后台/子任务/蜂群”状态,只要批次还在跑。

这样你就能在 dsh-dingo 的卡片面板里直接看到:

卡片清单干净 —— TaskSwarm 内部的 worker / reviewer / merger 会话不会作为用户卡片出现在 dsh-dingo 里:没有多余的紫色草稿计数、没有游离卡片、不会收到子 agent 的提醒。只有发起批次的主会话以用户卡片形式出现(带"等待蜂群"状态)。

主对话已经完成,但蜂群还在跑,还没有真正交付。

文档

- 运维手册(Runbook) —— 清理残留 / 错误恢复 / 工作抢救的标准作业程序(supervisor / AI 代理必读)
- 发布手册(Release) —— npm 发布、版本号管理、2FA bypass token 的坑(维护者用)
- 已知问题(Known Issues) —— 已修复问题的根因分析与修复记录
- 更新日志(Changelog) —— 逐版本更新说明(English: CHANGELOG.md)

许可与致谢

- MIT License,可自由使用、修改、分发
- 上游 TaskPlane(github.com/HenryLach/taskplane):波次编排、任务包、mailbox、supervisor 的原始设计,本项目的原生移植
- 运行环境:DeepSeek Harness (DSH)
预览分享卡片长什么样 ↓february2015/dsh-taskswarm
分享 · DeepSeek Harness Hub
february2015/dsh-taskswarm

把任务排成波次,多智能体隔离并行执行并自动评审合并

这是你的仓库?认领条目

回到顶部