JIAQI23333
dsh-visual-plan
DeepSeek Harness 可视化计划模式:将 Plan Mode 生成的计划变为可编辑节点图,支持批注、Plan Diff 与版本化回写。
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 15, 2026
- Updated
- Aug 15, 2026
Introduction
dsh-visual-plan
简体中文 · English
为 DeepSeek Harness(dsh)提供可视化计划模式:
Agent 在 Plan Mode 中生成的计划会自动变成一张可编辑的节点图。你可以拖动节点、修改依赖、添加批注,
确认后系统生成 Plan Diff、创建新版本,并把用户批准的修订计划可靠地交还给 DSH 继续执行。
核心流程
用户需求 → DSH Plan Mode → 结构化 VisualPlan JSON → 节点图画布
→ 查看 / 编辑 / 批注 → Apply Changes → Plan Diff → 用户确认
→ 生成新版本(v1 → v2 → …)→ 修订计划回写 DSH → 按批准的计划执行
演示

特性
- 计划自动可视化:Plan Mode 的
exit_plan_mode输出自动转为 VisualPlan JSON,并用 DAG 自动布局渲染为节点图(节点不重叠、依赖清晰)。 - 完整编辑能力:新增 / 删除 / 编辑任务,拖拽修改依赖关系,任务类型与状态一目了然。
- 批注系统:给任意任务添加评论,随版本一起保存、可追溯。
- Plan Diff:提交前展示新增 / 删除 / 修改 / 依赖变更,用户确认后才写入。
- 版本化存储:每次 Apply 生成不可变新版本(
.plan/revisions/vN.json),绝不覆盖用户已批准的计划。 - 可靠回写:以明确的修订消息把**批准版本(Plan vN)**交还 Agent,Agent 按该版本继续执行; 执行中遇到变化不得静默修改已批准的计划,必须先提出新计划由用户批准。
- 数据双轨:
plan.json(机器接口)+plan.md(人类 / Agent 阅读、Git 保存、调试)。 - Plan ↔ Agent 状态边界:
plan.status / version / approvedVersion / executionVersion, 执行绑定到批准版本,为后续动态重新规划打好基础。 - 健壮性:JSON 校验、依赖不存在检测、循环依赖检测;解析失败时回退 Markdown 计划。
- 界面能力:主题跟随 / 白天 / 黑夜、地图开关、全屏、交互开关、Undo/Redo、 快捷键(Delete、Cmd/Ctrl+Z、Cmd/Ctrl+S、F 等)、工具栏「更多」下拉(视图/外观分组)、 左下角高对比度控件。
- 国际化:中文 / English,跟随 DSH 自带 Language 设置(默认中文)。
- 与 DSH 解耦:UI 与 Agent Core 隔离;关闭插件后 DSH 原有 Plan Mode 完全不受影响。
安装
需要 DSH
>= 0.1.0-rc.6(当前验证于0.1.0-rc.6)。
本地目录(开发中)
dsh plugin --profile web add /path/to/dsh-visual-plan
GitHub(发布后)
dsh plugin --profile web add github:<owner>/dsh-visual-plan
pnpm ≥ 10 首次安装 Git 依赖会拒绝执行
prepare构建脚本,按提示把dsh-visual-plan加入 profile 的pnpm-workspace.yaml的allowBuilds后重试即可。
安装后验证配置层并重启:
dsh --profile web --dump-config # 应看到 "dsh-visual-plan" 层
dsh --profile web
使用
- 在 Web GUI(
dsh web,默认http://127.0.0.1:3080)打开一个会话,进入 Plan Mode 并生成计划。 - 切换到「可视化计划」标签(位于「对话」与「轨迹」之间)。
- 编辑节点:拖拽 / 缩放 / 平移画布,点击节点打开编辑面板,修改标题、描述、类型、状态、依赖; 也可新增或删除任务、添加批注。
- 点击「应用修改」,在 Diff 弹窗中确认。
- DSH 创建新版本,并按修订后的计划继续执行。
架构
DSH Plan Mode (exit_plan_mode markdown)
│
▼
DeepSeekHarnessAdapter ──► VisualPlan JSON(唯一机器接口)
│ │
▼ ▼
revised message React Flow canvas(可编辑)
│ │
└────────── Apply Changes ◄────┘
│
▼
Plan Diff → 用户确认
│
▼
.plan/plan.json + plan.md + revisions/vN.json
│
▼
修订计划回写 DSH → 按批准的计划执行
模块划分:
src/schema— VisualPlan / Task / Edge / Comment / Version 类型与校验(依赖存在性、自依赖、循环依赖检测)。src/engine— Markdown ⇄ Plan 转换、Plan Diff、版本创建。src/adapter— 适配器接缝;v1 提供 DSH 适配器(exit_plan_mode→ VisualPlan,VisualPlan → 修订计划消息)。src/index.ts— host 面:.plan/持久化与回环 API。src/client— 「可视化计划」标签页(React Flow 画布、任务编辑器、评论、Diff 弹窗、Apply)。
数据布局
每次批准的计划保存在会话工作区:
.plan/
├── plan.json 最新 VisualPlan
├── plan.md 最新 Markdown(Agent 可读)
└── revisions/
├── v1.json 不可变的批准快照
└── v2.json
版本与执行边界
每次 Apply 都会把新版本同时记为 approvedVersion 与 executionVersion:
Plan v1(Agent 生成) reviewing approvedVersion = null executionVersion = null
│ 用户 Apply
▼
Plan v2(用户批准) executing approvedVersion = 2 executionVersion = 2
│ 后续草稿 v3
▼
Plan v3(新草稿) draft approvedVersion = 2 executionVersion = 2
执行永远绑定到批准版本;即使后续生成了更新的草稿,正在执行的版本也不会被悄悄替换。
本地开发
npm install
npm run typecheck # host + client 类型检查
npm run build # host + client 构建
npm run verify # 离线契约 + 纯逻辑验证(93 项)
E2E
配合运行中的 DSH web profile(已组合本包):
node scripts/gui-probe.mjs [url] # tab 注册 + 视图挂载
node scripts/e2e-plan-flow.mjs [url] # /plan → 批准 → 画布节点
完整 plan-flow 脚本需要可用的模型,覆盖验收链路:
Plan Mode → exit_plan_mode → VisualPlan → 画布。