dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH diagnostic tools: dependency-closure & decoupling checks + chat image attachment reconciliation. Zero deps, read-only, reproducible | DSH 诊断取证工具组:依赖闭包/解耦体检 + 会话图片附件对账,零依赖只读
English: README.en.md
一句话:一个仓、两个子目录,回答长期跑编码 agent 的人迟早会问的两个问题 —— 我的环境有没有坏(依赖闭包 / 解耦)· 我的数据缺不缺(会话图片实体)。
零 npm 依赖(只用 Node 标准库)· 默认只读(写操作要显式加
--apply,且留回滚清单)· 不联网 · 判据可复跑(每个子目录自带验证脚本,不需要相信维护者的自述)。
本工具组是「ops-handoff-design」所述运维体系的一个实现, 设计依据(对应文档仓约定的固定四问):
设计稿里不写具体仓库地址(写死即死链),实现清单统一收在文档仓的组件索引表里——本仓只负责回链章节。
| 你遇到的现象 | 用哪个子目录 | 入口 |
|---|---|---|
| 宿主(主包)升级后,插件启动就崩 / 判定悄悄失准 / 换机后重启即崩 | closure/ —— 依赖闭包体检 4 件 | node closure/closure-check.mjs |
| 含图的历史会话一续聊就报传输错误(换过机器、或用过两台机器) | attachments/ —— 附件对账二件 | node attachments/attachments-audit.mjs |
两者的共同点:症状看着像别的问题(一个像"插件质量差",一个像"网络故障"), 按表面方向排障永远修不好 —— 所以各配一个只读工具,先把事实变成看得见的。
三个最反直觉的结论(先看这三条,再决定要不要往下读):
import 了宿主的运行时符号,而宿主把那个符号删了 / 改名 / 拆包了。dsh-diagnostic-tools/
├─ README.md 仓级说明(本文件)
├─ LICENSE 仓级许可(MIT)
├─ CHANGELOG.md 仓级:只记结构级变更
├─ docs/RELEASING.md 仓级发布流程
├─ closure/ 依赖闭包体检 4 件(解耦检查 / 闭包指向体检 / 修法 / 共享判据库)
│ ├─ README.md · CHANGELOG.md · LICENSE · docs/RELEASING.md
│ ├─ check-decoupling.mjs · closure-check.mjs · repair-closure-links.mjs
│ ├─ lib/ · scripts/ · examples/
└─ attachments/ 会话图片附件对账二件(只读对账 + 按需取回)
├─ README.md · CHANGELOG.md · LICENSE · docs/RELEASING.md
├─ attachments-audit.mjs · attachments-fetch.mjs
└─ lib/ · scripts/
安装(零依赖、无构建步骤):
git clone https://github.com/kira905/dsh-diagnostic-tools
cd dsh-diagnostic-tools
node closure/closure-check.mjs --help # 或 node attachments/attachments-audit.mjs --help
每个子目录的 README 里有完整的用法表 / 参数 / 退出码含义 / 已知限制。
--help 与 --dry-run 是安全的:所有写操作都必须显式加 --apply,且会先打印将要做的事与回滚清单。
理由
README / LICENSE / 发布流程 / 自检脚本形态,维护成本更低;代价与对策
CHANGELOG.md,
仓级 CHANGELOG.md 只记结构级变更(新增子目录、仓名变更、许可变更);AGPL-3.0-only + 商业授权(双许可;见仓根 LICENSE)。两个子目录各自也带一份同文本的 LICENSE,便于单独取用;
合仓后以仓根 LICENSE 为准,改许可必须三处一起改(见 docs/RELEASING.md §2)。
v0.1.0 ~ v0.1.3 的全部历史 tag 以 MIT 发布;自 v0.1.4 起(含两个子包 0.1.1)改为 AGPL-3.0-only + 商业授权。已经按 MIT 发布的版本授权收不回,变更只约束未来版本。本仓是独立 CLI 工具组(两个子目录都不 import 任何 @deepseek-ai/dsh-* 包)⇒ 不声明 peerDependencies(声明会误导成"与宿主版本绑定")。下表只记录实测过的环境。
| 环境 | 状态 | 依据 |
|---|---|---|
DSH 主包 0.2.0-rc.2(隔离实例:独立数据根 + 端口 3090) | ✅ 已真跑(2026-10-16) | closure/closure-check.mjs → rc=0(判定干净);attachments/attachments-audit.mjs → rc=0(无缺失)。两者都指向隔离实例的独立数据根,未碰生产 |
| 其它宿主版本 | ⚠️ 未实测,不作承诺 | 两个子目录的判据都基于宿主的字符串契约(目录形态 / 事件名 / 服务名),宿主升级后可能失准 —— 这正是 closure/ 要体检的对象 |
0.1.0 = 首个公开版本,0.1.1 = 许可变更);v0.1.4 = closure 0.1.1 / attachments 0.1.1,仓级 tag 只随仓根文档更新推进);docs/RELEASING.md;只发 Release,不发 npm。closure/ —— 依赖闭包体检 4 件,已完成通用化改造;自带静态验证(语法 + 配置行为 + 脱敏扫描)
与干净夹具验证(4 种判定 + dry-run 不回退)。attachments/ —— 附件对账二件,同上,另外在隔离的真实实例上做过只读对账核对(不动生产数据)。closure/ 要体检的对象,也是为什么
每个子目录都把宿主相关名字集中在一个文件(lib/host-protocol.* / lib/closure-links.mjs)里,
而不是散落在功能代码中。同属 DSH 生态的伴生组件,各自独立仓、独立版本、许可各自独立;它们都回链到同一份文档仓
ops-handoff-design
(Gitee 镜像 https://gitee.com/kira905/ops-handoff-design):
| 组件仓 | 做什么 | 与本工具组的关系 |
|---|---|---|
dsh-diagnostic-tools | 依赖闭包体检 + 会话图片附件对账 | 本仓 |
dsh-ecosystem-panel | 只读生态总览面板(持续、三色、不落盘) | 分工互补:它回答**「今天怎么样」(持续观察、只渲染不复算),本仓回答「具体坏在哪、怎么修」**(离线、可复跑、带修法与回滚清单)——两者都只诊断,谁也没写谁 |
dsh-butler-archive | 会话归档管理(列表 / 预览 / 恢复 / 删除 + 可选自动归档) | 本仓 closure/ 的体检对象包括它:靠 cordis.patch.yml 的 insert 注册的组件,最容易在宿主编排变更后「实体缺失、启动不报」 |
dsh-session-title-live | 会话标题跟着对话实时更新 | 同上:它把宿主契约集中在 lib/host-protocol.js,那份常量清单与本仓 closure/ 要体检的是同一类风险(宿主升级后字符串契约失效) |
dsh-task-board-local | 自维护任务看板(卡片 = 一次真实会话 + 人工验收闸) | 它是"自研 + insert 注册"的代表件,也正是本仓 closure/ 与宿主契约体检的重点对象;它的执行记录缺失(跨机并回)曾把本仓的判据坑出来一次——见《任务卡「假完成」与「被打断会话」的识别》 |
dsh-firstaid | 零依赖急救台:起不来 / 假死 / 要撤销改动 / 数据被删四类现场压成一个入口 | 分工:本仓是离线专项体检(升级前后主动跑),它是现场分诊(已经出事时先跑)——都不动手,都只出证据 |
组件之间没有代码依赖,也不共享运行时 —— 之所以互指,是因为它们回答的是同一类人的同一批问题 (长期在自有机器上跑 agent:装得下、找得到、看得见、查得清)。谁装谁不装,互不影响。