Skip to content

About

DeepseekHarness AI修改的diff查看器

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

@dsh-external/diff-viewer

DSH 正式 bundle 插件:按会话隔离跟踪各会话 AI 通过 edit/write 工具对工作区的文件改动,提供文件级聚合 diff(基线 vs 当前,LCS 行级)与一键确认/撤回。

特性

  • 后处理捕获:监听 tools/result(edit/write),读返回值 before 作基线,零拦截零阻塞
  • 多会话隔离(v21 模型):每条记录带改动所属会话(子 agent 归父会话)+ 工作区 cwd;sessionId 随 RPC 上报即自动登记(自愈,无"首绑定生效"竞态);各窗口面板只显示自己会话的改动
  • 聚合 diff:同一文件改 N 次只呈现最终增删;长上下文自动折叠、↑↓ 变更块跳转、空白差异可见化(␍/·/→/空行占位 + 「仅空白差异」徽标)
  • 居中模态弹窗:点文件行弹出(shell.overlay 框架层,脱出会话列),点遮罩空白 / Esc / × 关闭
  • 确认/回退:单文件与全局两档;回退按记录自身 cwd 直接写盘(宿主身份 node fs,无沙箱限制),新建文件删除
  • 插件独立配置(Settings 服务 + settings.section 设置面板):忽略换行符变化(CRLF / LF 视为相同)——开启后比较前剥除 \r,仅换行符差异的文件不再显示为改动,内容差异照常呈现;即时生效、持久化(dsh-settings-file)
  • 诊断条:rev/results/captured/skipped/foreign/sess/root/errors/lfIgnored/unchanged 一目了然

安装

⚠️ 不要用 dev_install_package,也不要把本包加进 dsh.profile.bundles: bundles 列表要求每个包在 package.json 声明 dsh.bundle(组合包 patch 层),本包是注入式模组 (只有 dsh.client),误加会让 dsh web 启动直接崩溃: profile bundle "@dsh-external/diff-viewer" declares no dsh.bundle in its package.json (实测踩坑,2026-08)

本机(已装好,重启自动恢复)

已通过 dev_inject_plugin 注入,注入器清单持久化在 ~/.dsh/super-injector/registry.json:

  • 运行时:junction ~/.dsh/profiles/web/node_modules/@dsh-external/diff-viewer → 本目录 + loader entry
  • 重启后由注入器(bundles 里的 @dsh-external/dsh-super-injector)按 registry 自动恢复
  • profile package.json 的 dependencies 保留 "@dsh-external/diff-viewer": "link:<本目录>"(junction 可解析);dsh.profile.bundles 不含本包

其他机器

  1. 拷贝目录:把整个 diff-viewer/(含 lib/ 预构建产物)拷到目标机器任意位置
  2. 前提:目标机器装有 DSH 与 dsh-super-injector(dev_* 工具可用)
  3. 安装(对目标机器的 AI 说,或直接调工具):
    dev_inject_plugin  F:\DeepSeekHarnessPlugins\diff-viewer
    
    注入器 registry 持久化,重启自动恢复
  4. 改代码后重新构建(可选):目标机器需能访问一个 DSH 源码 checkout(build.ps1 默认探测 D:\DeepSeekHarness\deepseek-harness-master,可用 DSH_CHECKOUT 环境变量覆盖):
    $env:DSH_CHECKOUT = 'D:\path\to\deepseek-harness-master'
    pwsh -File scripts\build.ps1
    构建产物是平台无关 JS,不依赖本机任何环境

只改 lib/ 后热重载:dev_reload_package diff-viewer(不用重装) 卸载:dev_uninject_plugin diff-viewer(卸载即净)

构建与注入

# 环境无 bash 时用 PowerShell 版构建(本仓库自带 scripts/build.ps1)
pwsh -File scripts\build.ps1          # tsc 编译 host + tsdown 打包 client → lib/

# 安装(注入器持久化,重启自动恢复;本插件的正确方式)
dev_inject_plugin  F:\DeepSeekHarnessPlugins\diff-viewer
# ⚠️ 不要用 dev_install_package(会写 bundles,无 dsh.bundle 声明 → 启动崩溃)

产物:lib/index.js(host:tools/result 监听 + /diff-viewer/api JSON 路由)、lib/client.js(client:dock 面板 + overlay 弹窗,ModuleLoader 模块)。

API(POST /diff-viewer/api,body: { method, payload })

method payload 说明
state {sessionId} 该会话的记录快照(调用即登记会话)
confirm {sessionId} 接受该会话全部改动,清空记录
revert {sessionId} 按基线回退该会话全部改动(新建文件删除)
confirm-file {rel, sessionId} 接受单文件
revert-file {rel, sessionId} 回退单文件
poll {sessionId} rev + total(备用)
settings.get {} { ignoreLineEndings, persisted }
settings.set {ignoreLineEndings} 更新开关(Settings 服务持久化),返回新值

设置

打开 DSH 设置 → Diff Viewer,勾选「忽略换行符变化(CRLF / LF 视为相同)」即时生效。 数据经 ctx.settings(dsh-settings-file)持久化;host 无 Settings 服务时退化为内存开关。

边界

  • shell/pwsh 直写、宿主工具(dev_*)写入检测不到
  • 1MB 文件只标记不记基线(不可撤回)

  • 同一绝对路径被多个会话修改时,首次触碰的会话锁定基线

About

DeepseekHarness AI修改的diff查看器

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages