dsh-loopx-plugin
loopx-project/loopxLoopX——面向长周期 Agent 的提供商中立、本地优先状态内核与控制平面:在 DeepSeek Harness 执行层之上持久化 Goal、Todo、门禁、证据、配额、恢复与交接状态;插件负责引导安装 CLI 与技能、准入有界的同会话续跑,并为精确绑定的工作循环提供本地 GoalBar。
默认拦截缺少「验收通过」独立记录、或验收提交与 worktree HEAD 不一致的团队任务完成操作,并提供依赖 DAG 看板与设置页。
把「智能体团队模式并行开发」从建议变成有门禁、可校验的机制。
面向 DeepSeek Harness 的编排插件。它不重造任务板,只补上平台没做的那一件事:把任务标记为「完成」时,必须有一份独立验收记录。
team_task_update(complete) 没有验收记录会被真的拒绝,不是提示。当前版本:v0.3.0(实验性)。
平台已经提供了团队任务板(team_task_create/list/get/update)和完整的状态机。但它允许任何成员直接把任务标成 completed —— 没有验收、没有证据、没有独立核对。
「实施和验收是同一个人」是并行开发里最隐蔽的失败方式:看板全绿,交付物却没人独立看过。本插件用 tools/pre-execute 钩子拦截「标记完成」这个动作,把「验收通过」从模型的声称变成一个能被机器校验、且能被强制的状态。
team_task_update 的 complete 动作必须命中一份 passed 的验收记录,否则拒绝。subagent)登记,带逐条判据、可定位证据、验收方标识;实施方自己签字的记录会被拒(自证检查,默认开启,可在设置里放宽)。pdev_waive 逐字核对用户原话后放行,并留痕。/pdev/board,纵向依赖图 + 关键路径 + 同泳道排队 + 并发时间轴;可嵌在 DSH 侧栏。cordis.patch.yml)。
看板:5 层 / 最宽 6,红色为关键路径,紫色虚线为同泳道排队(
?demo=1演示数据)。
pdev_preflight,确认团队工具、git、项目占用都没问题。spawn_teammate,每个任务一个 worktree;完成后派一次性 subagent 验收,由它调 pdev_verify_record,再 complete。| 项 | 说明 |
|---|---|
| DSH | 0.2.1-rc 系列(插件以 @deepseek-ai/dsh-tools、@deepseek-ai/schemastery 为运行时依赖) |
| Node.js | >= 20 |
| git | 命令行可用;验收记录要读 worktree 的 HEAD |
| Agent Teams | profile 需挂载 @deepseek-ai/dsh-experimental-agent-team 和 @deepseek-ai/dsh-experimental-tool-agent-team,否则团队工具不存在 |
| Web Server | 要看看板或设置页,profile 需挂载 host-webserver(@deepseek-ai/dsh-host-webserver) |
| Settings | 要在设置页里保存配置,profile 需挂载 @deepseek-ai/dsh-settings 服务;没有则设置页只读 |
缺 Agent Teams 时,插件仍会加载,但团队工具不可用,门禁没有可拦截的对象 —— 请先装团队包。
把本仓库目录交给 DSH 会话里的 Agent,让它调用插件管理器:
plugin_manager({
action: "install_bundle",
target: "/绝对路径/dsh-parallel-dev"
})
安装结果以返回的 application 字段为准;为 applied 后重启 DSH。
安装后无需手工改 cordis.patch.yml:本包自带的 cordis.patch.yml 会插入 parallel-dev 这一行。
卸载:从 profile package.json 的 dsh.profile.bundles 移除 dsh-parallel-dev,删除 node_modules/dsh-parallel-dev,重启 DSH。
重启 DSH 后,在会话里调用:
pdev_gate_status()
看到 plugin: dsh-parallel-dev v0.3.0、gateInstalled: true 即安装成功。
设置 → 并行开发配置 也应出现;看板地址是 /pdev/board。
pdev_preflight(project_root = "/path/to/project")
它会检查:团队工具是否真的存在、项目根是否被另一个编排会话占用、git 是否可用、已有验收记录覆盖情况。
返回的 blockers 不为空时不要降级硬做 —— 先告诉用户。
team_task_create 建任务,写清 blocked_by 和 write_scopes;第一层尽量做宽。spawn_teammate;每个实施任务一个独立 worktree + 分支。subagent)独立核对。pdev_verify_record 登记记录(判据 + 证据 + commit sha)。team_task_update(action = "complete");门禁命中记录才放行。没有验收记录的 complete 会被拒绝,并返回正确做法与所需参数。
用户本人明确表示某任务不需要验收时:
pdev_waive(task_id = "task-3", user_quote = "task-3 不用验收", reason = "文档改动")
插件会去本会话的用户消息里核对这句原话,并要求包含明确的豁免意思。编造的引用会被拒绝。 豁免会留痕,最终验收报告应列出所有豁免项。
/pdev/board(拼在 DSH Web UI 地址后面)。/pdev/board/data,支持 ?session=<sessionId> 与 ?demo=1。设置 → 并行开发配置:
查看插件版本、加载状态、5 个服务是否可用、安装目录 / profile / 配置文件 / 数据目录、插件提供的能力、最近插件事件;
配置 8 项行为并保存(写入当前 profile 的 cordis.patch.yml)。
| 工具 | 作用 | 关键参数 |
|---|---|---|
pdev_preflight | 开工前门禁检查 | project_root? |
pdev_verify_record | 登记独立验收记录(完成任务的唯一凭据) | task_id、commit_sha、worktree、verdict、verifier_id、evidence、criteria?、notes?、project_root? |
pdev_waive | 登记用户豁免(逐字核对用户原话) | task_id、user_quote、reason?、project_root? |
pdev_gate_status | 查看门禁与验收记录,排查为什么被拒 | project_root? |
pdev_board | 给出看板地址与依赖图摘要 | 无 |
project_root 省略时使用当前会话的 session.header.cwd。
配置全局一份,存在当前 profile 的 cordis.patch.yml,由设置页写入;默认值全部保持最严格行为。
| 分组 | 配置 | 默认 | 作用 |
|---|---|---|---|
| 功能 | injectPolicy | 开 | 是否把编排纪律注入系统提示 |
| 功能 | autoOpen | 开 | 检测到未完成任务时自动打开侧栏看板 |
| 时间线 | timelineEnabled | 开 | 记录任务状态变更到 .pdev/timeline.jsonl |
| 时间线 | timelineMaxEntries | 60 | 内存中每个任务保留条数(10–500) |
| 门禁 | gateMode | enforce | enforce 拒绝;advise 只记录、不拒绝 |
| 门禁 | requireEvidence | 开 | 验收记录必须至少一条证据 |
| 门禁 | requireCommitMatch | 开 | 完成时 HEAD 必须等于验收记录的 sha |
| 门禁 | blockSelfCertification | 开 | 禁止任务所有者给自己登记验收 |
放宽
gateMode或任一严格项会让「完成」的可信度下降;设置页会二次确认并显示警告。修改只在保存后生效,Host 读侧最多 1 秒缓存。
所有数据都在项目根下,可读、可 diff、可进版本库(默认建议把 .pdev/ 加进 .gitignore):
<项目根>/.pdev/
├── verify/
│ ├── team-<leadId>__task-3.json # 验收记录
│ └── team-<leadId>__task-7.waiver.json # 用户豁免
└── timeline.jsonl # 任务状态变更(append-only)
验收记录按团队隔离:key 取团队 Lead 的会话 id;一次性验收 subagent 会归属到它所属的根会话,避免「记录落在 subagent 自己的命名空间里、Lead 找不到」。这样多个并行会话的同名 task-1 不会串。
Lead / teammate ──team_task_update(complete)──▶ tools/pre-execute 钩子
│
┌───────────────────────┴───────────────────────┐
│ 用户豁免? │ 放行
│ 验收记录存在且 passed? │
│ 记录 worktree 的 HEAD == commit_sha? │
└───────────────────────┬───────────────────────┘
│ 任一不满足
▼
拒绝并说明原因
pdev_verify_record 写入,工具自己跑 git rev-parse HEAD 取证,不采信调用方转述。ownerName 与调用方成员)。gateMode = enforce 时拒绝;advise 时只打一行「仅提醒」并放行。src/client/client.js 注册 settings.section(id dsh-parallel-dev,order 50,文案「并行开发配置」)。
页面是原生 React(不是 iframe),只展示插件自身的信息,不展示任务状态:
配置接口:GET /pdev/plugin/status、POST /pdev/plugin/config(同源、JSON、修订号保护)。
dsh-parallel-dev/
├── src/
│ ├── host/
│ │ ├── index.js # 插件入口:门禁、看板路由、工具注册、配置接线
│ │ ├── config.js # 配置默认值 / 归一化 / 白名单校验(纯逻辑)
│ │ ├── config-schema.js # schemastery Config(8 个 volatile 字段)
│ │ ├── gate-decision.js # 门禁决策纯函数
│ │ ├── team-key.js # 验收记录命名空间(含 subagent 归属修复)
│ │ ├── plugin-api.js # /pdev/plugin/status、/pdev/plugin/config
│ │ ├── graph.js # 依赖分层 / 关键路径 / 阻塞半径
│ │ ├── board-page.js # 自包含看板 HTML + SVG
│ │ └── policy.js # 注入系统提示的编排纪律
│ └── client/
│ └── client.js # 侧栏看板面板 + 设置页(手写 React,无构建)
├── scripts/
│ ├── check-host.mjs # Host 纯逻辑与 teamKey 行为测试
│ └── bsk-auto-browser.sh # 开发期浏览器辅助
├── docs/ # 设计契约、版本报告、看板快照与截图
├── cordis.patch.yml # bundle 补丁:插入 parallel-dev 行
├── dev-sync.sh # 开发同步到 profile
├── LICENSE
├── README.md
└── package.json
# 语法检查(注意:node --check 一次传多个文件只会检查第一个)
for f in src/host/index.js src/host/config.js src/host/config-schema.js \
src/host/gate-decision.js src/host/team-key.js src/host/plugin-api.js; do
node --check "$f"
done
node --check src/client/client.js
# Host 纯逻辑测试(不依赖 node_modules)
node scripts/check-host.mjs
# 同步到本地 profile(macOS/Linux)
./dev-sync.sh desktop
window.__ModuleLoader__ 工厂 + React.createElement。.volatile():设置保存后即时生效,不重载插件。git 子进程,理论上跨平台;开发脚本 dev-sync.sh 仅适用于 macOS/Linux。pdev_preflight 会警告,提交绑定无法生效。host-webserver 时页面读不到状态;没有 settings 服务时只读。pdev_waive 只能核对用户在本会话里说过的话,插件不判断任务是否真的该豁免。.pdev/verify/ 下的文件。settings.section,order 50)。cordis.patch.yml。GET /pdev/plugin/status、POST /pdev/plugin/config。complete 找不到记录。0.3.0。本项目使用 MIT 许可证,详见 LICENSE。