Skip to content

Releases

dsh-workbench v0.7.0 —— 审批理由、记录器 CLI、记录健康度与快照占用、写接口同源闸

Choose a tag to compare

@liiydong liiydong released this 20 Oct 16:49

这一版把「审 / 记 / 存」三件事各自没收口的地方补齐,并给文档迭代流程加了命令行记录器。0.6.2 的 note 显示修复也随本版一起发布(0.6.2 没有单独发 Release)。

审批有理由了

  • 选中一轮后,按钮旁边多一个理由输入框;点【通过】/【要改】/【重置为待审】都会把它写进 decisions.jsonl;
  • 再点开同一轮时理由回填进输入框,悬停卡显示「你的意见」;手动刷新历史也不会冲掉正在写的那句。

记录器:AI 产出一版就记一条

node bin/record.mjs "D:\论文\毕业论文" 论文全文.docx `
  --summary "第3章:修正转化率 0.62→0.58,重算全表" `
  --sources "03-第3章.md" `
  --tool "python build.py"
  • 和面板的【记一版】共用 lib/record.js 同一套实现:复制快照 + 追加 produced.jsonl;
  • at 取产物 mtime(补记旧版本不会被排到今天最前),快照是复制而不是硬链接(原地覆盖不会改坏旧快照);
  • 同一分钟里生成了两版会自动让号;同一版重复记会被拒绝,不产生重复轮次;
  • 快照还在、记录被删或写坏时会复用那份快照补记录(自愈);
  • 零依赖、不需要 DSH 跑着;--json 给程序解析,--help 看全部选项。

时间轴会报「会变坏的两件事」

  • 产线头显示 .versions/ 里的快照个数与占用(只认快照命名,顺手放的笔记文件不算);
  • 记录文件里的坏行 / 缺 id 行数会报出来——坏行仍被跳过(不让整页打不开),但不再静默消失。

写接口的同源闸

实测宿主 web server 不拦 Origin;插件入口补两道:四个 POST 接口按 MIME essence 只收 application/json(挡掉跨站的 text/plain 简单请求),带 Origin 时必须同源。

自检

node test/host-routes.mjs 204 项、node test/smoke.mjs 263 项、node test/record-cli.mjs 44 项,全绿(共 511 项)。CI 在 windows-latest × Node 22/24 上跑这三套。

这一版发布前做过一次独立只读审计(三套自检 + 端到端 + 变异测试);审计报的收编恢复路径死锁、快照并发覆盖、content-type 判据过宽、-h 没实现等问题都已在发布前修掉,详见 CHANGELOG.md。

安装 / 升级

dsh plugin --profile <你的 profile> add github:liiydong/dsh-workbench

装完重启 dsh web:客户端 bundle 在启动时快照,刷新页面不够。

dsh-workbench v0.6.1 —— 根产线的【通过】点不动

Choose a tag to compare

@liiydong liiydong released this 11 Oct 12:33

记录放在项目根目录的项目(单产线项目、或一个项目里带根产线),时间轴上看是看得见的,审批却点不动:/decide 的产线名校验把 . 当成非法值挡掉了,点【通过】只弹一句「line 只能是产线目录名」。/adopt(收编一版)一直是支持 . 的,只有这里漏了。

这一版做了什么

把 /decide 的校验对齐 /adopt。 line 允许 .(表示记录就在根目录),其余照旧拒绝路径成分、目标仍收在根目录围栏内。

  • 根目录自己也成一条产线,产线名照常显示目录名;
  • line: '.' 的审批真的写进根目录的 .versions/decisions.jsonl(不是弹个提示就完事)。

自检

node test/smoke.mjs 251 项、node test/host-routes.mjs 177 项,全绿。本轮新增四条:根目录自己也成一条产线、产线名显示目录名、line: '.' 能审批、且真的写进根目录的 .versions/decisions.jsonl(host-routes 从 173 加到 177)。

dsh-workbench v0.6.0 —— 去掉演示数据、产线按最近动过排、技能库补上本机技能

Choose a tag to compare

@liiydong liiydong released this 01 Oct 05:27

这一版做了什么

演示数据删了。 「载入演示」是给「先看看长什么样」用的,副作用是那个目录会被记进浏览器本地存储,
下次打开看见的还是那份假数据(三条产线、编到 9 月中旬)。所以按钮、/demo 路由、仓库里的
examples/(27 轮假记录)与演示截图一并删掉;两套自检改成自建临时目录,不再依赖示例数据。

目录入口换成「最近用过…」下拉。 候选=最近打开过的目录 + DSH 已登记的工作区,选一下即切过去。
记住的目录改成确认读得到才记;读不到就撤掉,并把它从下拉里划掉——留着只会让人再点一次错。

产线按「最近动过」排。 最上面那条就是你上一轮在改的线;产线头补上「最近 N 天前」(悬停看具体时间)
与「待审 N」。

技能库补上了本机技能目录。 ctx.skills.snapshot() 跑在没有会话上下文的 HTTP 路由里,
只给得出随包发布的那几个技能(本机实测 2 个),用户自己装在 ~/.agents/skills、~/.dsh/skills
里的一个都看不到。现在改成注册表为主、本机技能目录补缺(只扫一层、只认 SKILL.md、不建索引文件),
/skill 问不到全文时直接读文件。实测本机从 2 个补到 13 个。

迭代页多一枚【迭代流程】。 装了 doc-iteration-control 这类迭代流程技能时,顶栏直接摆出来,
点一下跳到技能库看全文——要问的其实是「这一轮该怎么记」,不该先想起「技能库里好像有这么个技能」。

两个小修:安装位被删之后不再反复读空那一屏;/scan 归因断言的偶发假失败
(源与产物同毫秒写入,文件的先后分不出来)。

验证

  • node test/smoke.mjs 251 项、node test/host-routes.mjs 173 项,全绿;
  • 两套自检都不需要浏览器:组件树自检用桩 __ModuleLoader__ + 迷你 React,路由自检用假 req/res +
    真实文件系统 + 真写审批与快照;
  • 测试全部自建临时目录(mkdtemp),不依赖仓库里的任何示例数据。

与上一个 Release 之间

v0.3.0 之后还有 0.4.0(时间轴上「和上一版比」:段落级 diff + 词级高亮)与
0.5.0(xlsx 一行一块,改了哪个格子自己跳出来)两个版本没发 Release,改动都记在
CHANGELOG.md 里。

dsh-workbench v0.3.0

Choose a tag to compare

@liiydong liiydong released this 19 Sep 13:28

dsh-workbench v0.3.0

这一版补上了一个一直说不出口的短板,并让工作台能和对话并排看。

这个版本解决的事

时间轴以前是空的。 迭代页读的是各产线目录下的 .versions/produced.jsonl,而记录得由产出那一刻写下来——插件不猜、不补写。可现实里往往一个脚本跑完就覆盖了 Word,一行记录都没有,于是迭代页对真实项目永远没东西可看。

现在有一个补救办法:把漏掉的版本捡回来。

新增

① 未入记录 → 收编成一版

  • 迭代页顶栏的【未入记录】列出「文件躺在产线目录里、记录里却没有」的产物。判据只有一条:记录里有同名产物、且记录时间不早于文件时间(留 3 秒时钟差)。
  • 每一条后面补一句「这一版改了什么」,点【记一版】,才真的收编:复制一份快照到 .versions/ + 往 produced.jsonl 追加一行。快照同名时只新建不覆盖。
  • 它还会去 DSH 会话日志里翻「最近一次生成它的命令」和「那前后改过哪几个 md」。说得保守:soffice --convert-to pdf 论文.docx 里那个 docx 是读入的一方,不算生成;删除命令不算;找不到就如实写「没找到生成命令」。

② 看完一版,下一步能直接打开它

点开某一轮,底部多三个按钮:【打开这一版】(那一版的快照)、【打开成品】(产线目录里随时被覆盖的最新版)、【在文件夹里】(打开文件管理器并选中它)。

③ 工作台能停到右栏

面板右上角【搬到右栏】:对话留在中间,时间轴在右手边——「改一章 → 扫一眼这一版」这个动作终于能两边对照着看。它同时是右栏的一种页签类型,右栏「+」的引导页里也能找到它。

④ 左栏图标上的「待我审」角标

不用点开就知道有没有活干:还有几轮没审。0 时整个角标不显示。

边界(这个插件会碰外界的三个地方)

接口 做什么 边界
POST /decide 记一次审批 只往 <产线>/.versions/decisions.jsonl 追加一行
POST /adopt 收编一版 只往 <产线>/.versions/ 写;拒绝路径穿越、非产物类型、目标不存在;同名快照不覆盖
POST /reveal 打开文件 / 在文件夹里定位 只认白名单文档类型(不是偏好,是安全边界)、只认项目根目录里的文件、文件必须真的存在;三个平台各一套启动方式,都不经过 shell

其余全部只读。不做任何模型调用,不采集遥测,不碰你的 Word 本身。

自检

不需要浏览器的两套自检,共 285 项:

  • node test/smoke.mjs —— 184 项:桩 __ModuleLoader__ + 迷你 React 跑真实组件树,覆盖「载入演示 → 渲染 → 悬停 → 审批 → 收编 → 角标 → 右栏」整条回路。
  • node test/host-routes.mjs —— 101 项:假 req/res 逐条打路由,在系统临时目录里真写一次审批与一份快照,并用桩会话服务验证归因反例(读入方、删除命令、别的项目)。

安装

dsh plugin --profile web add github:liiydong/dsh-workbench

装完重启一次 dsh web。MIT 许可,零运行时依赖。

v0.2.0 — 目录选择、返回对话、面板导航、内容自动检测

Choose a tag to compare

@liiydong liiydong released this 19 Sep 12:37

四个新功能,都在浏览器半边——客户端插件有热重载,源码一改存盘即生效,不用重启 dsh web。

目录不用手打了

迭代页与文档页的目录行各加一个 浏览…。它走 DSH 自己的目录选择服务(ctx.uiWorkspace),两条路自动挑:

  • 宿主挂的是操作系统原生选择器(本地 127.0.0.1 部署)→ 弹系统的选文件夹框;
  • 宿主挂的是 browse 后端(远程 / SSH 启动 / 其它部署)→ 原生 pick() 会被宿主明确拒绝,
    这时自动改用插件自绘的应用内目录浏览器:面包屑 + 子目录列表 + 手输路径 + 上一层 / 主目录。

选中即读取 / 即扫描,取消什么都不做。插件自己不碰文件系统、也不拼路径,拿到的都是宿主给的绝对路径。

一键回当前会话

面板右上角 ← 返回对话,调 layout.selectPanel(null)——只把中央区域换回会话,不改变当前会话。

面板里的上一步 / 下一步

左上角一对箭头(手写 SVG chevron)。切页签、换目录、打开技能、点开某一轮、改筛选,每一步都能退回来再进回去;
只有「用户明确做的一步」入栈——连续打字、列表刷新、悬停卡不算一步。退回去再做新动作会清掉「下一步」,和浏览器一致。

为此把三页的位置状态提升到面板层统一管,附带两个改善:切页签不再丢位置;后退 / 前进回到某页时会按那个位置重新拉一次数据。

目录里多了内容会自动发现

目录行多了一个档位按钮:自动:10 秒 → 30 秒 → 1 分钟 → 关,点一下换一档。

它只负责发现,不擅自改屏幕:探到变化时顶栏出现一条提示「这个目录有新内容:多了 N 轮」+【现在刷新】【稍后】。
点【现在刷新】才真正重读并换掉屏幕上的内容;点【稍后】则这一版变化先不管,等内容再变一次才会重新提醒。

实现上没有新增宿主路由:检测就是把既有的 /history(或 /docs)再读一遍、算个指纹比一比。

顺带

  • 脱敏:审批记录与演示数据里硬编码的 by 改成 human,测试脚本注释里的本机路径改成相对路径。
  • 已安装的用户:拉一下最新源码就行(本次只动浏览器半边,无需重启)。

自检

两套都不需要浏览器:

node test/smoke.mjs         # 129 项:桩 __ModuleLoader__ + 迷你 React 跑真实组件树
node test/host-routes.mjs   #  49 项:假 req/res + 真实文件系统扫描 + 真写一次审批

完整变更见 CHANGELOG.md。

v0.1.0 — 工作台:AI 改 md、你审 Word,一条看得见的时间轴

Choose a tag to compare

@liiydong liiydong released this 17 Sep 17:00

dsh-workbench v0.1.0

给 DSH Web 侧栏加一个「工作台」:AI 改 Markdown → 生成 Word/PDF/Excel → 你审这一版,一条看得见的时间轴。

它解决什么

为什么做这个:我平时用 AI 反复改论文这类文档,改一轮就生成一版 Word。改得快了以后,中间那些版本会被同名覆盖掉,回头看不出「这一版到底改了什么、我审过没有」。做到一半发现侧栏里已经有一个「文件变动」(看的是「这次会话里 AI 碰过哪些文件」),我想要的比它多一层 —— 跨天、跨产线、每一版带摘要和审批状态的版本线,于是就在它旁边做了这块派生,并把工作台挂成了它的一个页签。

它把「谁改了什么 → 生成了哪一版 → 我审没审」记下来并显示出来。

三个页签

① 迭代(默认)

  • 按产线分组、产线内按天分小节,一轮一行:时间 / 产物类型(Word·PDF·Excel)/ 这一版干了什么 / 改自哪几个 md / 审批状态
  • 鼠标悬停浮出摘要卡:摘要、产出时间与体积、生成命令、改动来源、快照路径、你的历史意见
  • 点开一轮可【通过】【要改】【重置为待审】
  • 自带演示项目(3 条产线 27 轮),点「载入演示」先看效果

② 技能库 —— 读核心 ctx.skills 注册表(模型实际加载的同一份目录),可搜索、按来源过滤、读 SKILL.md 全文

③ 文档 —— 把 md/tex 源与 docx/pdf 产物按主干配对,把「产物比源旧」排最前

记录格式

时间轴不是猜的,是产出时记下来的:

产线/
├── *.md                          ← 源(AI 改的就是这些)
├── 论文全文.docx                  ← 工作副本,名字永远不变
└── .versions/
    ├── produced.jsonl            ← 每次产出追加一行:摘要 / 来源 / 工具 / 快照
    ├── decisions.jsonl           ← 每次审批追加一行
    └── 20260911T2210-论文全文.docx ← 快照

安装

# 从源码(link: 方式,改源码只需重启宿主)
dsh plugin --profile web add link:/绝对路径/dsh-workbench

# 或从 GitHub
dsh plugin --profile web add github:liiydong/dsh-workbench

装完必须重启 dsh web(客户端 bundle 在组合阶段被快照进内存,刷新页面不够)。

落点

落点 出现在哪 条件
官方左栏面板座位 系统左栏的面板图标行 总是注册
better-sidebar 页签 dsh-better-sidebar 的面板菜单 装了 better-sidebar 时额外注册

数据与隐私

  • 7 条 JSON 路由,其中 6 条只读;/decide(POST)是唯一的写操作,只往你自己项目目录下的
    .versions/decisions.jsonl 追加一行,带路径越界与状态校验。
  • 不写别的任何文件,不发任何模型调用,不采集遥测,不联网。
  • 零运行时依赖;宿主半侧只用 node:*,客户端半侧只用外壳提供的 react 与浏览器 fetch。

验证

node test/smoke.mjs        # 69 项:桩 __ModuleLoader__ + 迷你 React 跑真实组件树
node test/host-routes.mjs  # 46 项:假 req/res 调路由 + 真文件系统扫描 + 真写一次审批
node examples/make-demo.mjs

两套都不需要浏览器。完整变更见仓库的 CHANGELOG.md。

已知限制

  • 界面观感未经人眼逐一核对(下面这张是插件自带演示项目的实拍)

迭代页:产线分组 + 按天时间轴 + 悬停摘要卡

  • 历史里已同名覆盖的版本找不回来
  • 「产物过期」按文件修改时间判定,不看内容
  • 目录扫描不递归,一次最多 1000 轮

MIT License