🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

硬链接发布回退 Mushroomcowisheggs/dsh-hardlink-publish-fallback

DeepSeek Harness
Mushroomcowisheggs41 天前有提交已提供中文文档扫描:未发现敏感能力

让不支持硬链接的卷也能正常创建新文件

28.3/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/11 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Mushroomcowisheggs/dsh-hardlink-publish-fallback
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]—
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
数据截至 2026/10/11·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 41 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 不支持硬链接卷创建文件

README

由 DeepSeek 最新模型翻译生成
dsh-hardlink-publish-fallback 补全一次 write 工具调用——它因为所在卷无法用硬链接发布新文件而失败。 它解决的问题 在 Windows 上,@deepseek-ai/dsh-fs-local 发布新文件时,会把暂存的临时文件硬链接到目标位置。这个链接就是防覆盖守卫:如果写入意图确定之后又有文件冒出来,它会拒绝覆盖。 不支持硬链接的卷——exFAT、FAT32(可移动驱动器),以及部分网络共享——会拒绝这次调用。Node 把拒绝暴露成 EISDIR(而不是 ENOTSUP/EPERM),于是写入失败,报错如下: cannot write "<workspace>\<file>": EISDIR: illegal operation on a directory, link '<workspace>\.<file>.<pid>.<uuid>.tmpdir\<file>.tmp' -> '<workspace>\<file>' 调用方「不存在才创建」的意图始终无法满足,于是在这个工作区里创建新文件的每一次尝试都会失败,而且是永久性的。更新已有文件不受影响:那条路径改用 rename/ReplaceFileW 发布。结果就是一个让人摸不着头脑的半残工具——「编辑能用,创建永远不行」。
展开完整文档(README 剩余 1 节)
dsh-hardlink-publish-fallback

补全一次 write 工具调用——它因为所在卷无法用硬链接发布新文件而失败。

它解决的问题

在 Windows 上,@deepseek-ai/dsh-fs-local 发布新文件时,会把暂存的临时文件硬链接到目标位置。这个链接就是防覆盖守卫:如果写入意图确定之后又有文件冒出来,它会拒绝覆盖。

不支持硬链接的卷——exFAT、FAT32(可移动驱动器),以及部分网络共享——会拒绝这次调用。Node 把拒绝暴露成 EISDIR(而不是 ENOTSUP/EPERM),于是写入失败,报错如下:

cannot write "<workspace>\<file>": EISDIR: illegal operation on a directory,
link '<workspace>\.<file>.<pid>.<uuid>.tmpdir\<file>.tmp' -> '<workspace>\<file>'

调用方「不存在才创建」的意图始终无法满足,于是在这个工作区里创建新文件的每一次尝试都会失败,而且是永久性的。更新已有文件不受影响:那条路径改用 rename/ReplaceFileW 发布。结果就是一个让人摸不着头脑的半残工具——「编辑能用,创建永远不行」。

这类卷同样不支持符号链接,对 dsh 本身来说这是另一个更严重的限制:dsh-app-boot 的 healProfilesModuleFallback 会在组装阶段把安装目录软链进配置档,所以把 DSH_HOME 放在这种卷上,任何配置档都启动不了。本插件不处理这个问题;请把 DSH_HOME 放在支持符号链接的文件系统上。

本插件做什么

1. 让真正的 write 照常运行,不做任何改动。
2. 只有当它因硬链接发布的特征而失败时,才重新检查目标是否仍然不存在,然后用一次不带意图的写入来发布——也就是该卷支持的 rename 路径,也是每次文件更新已经在用的那条路径。
3. 记录与一次成功写入相同的观测结果。
4. 接管过程中任何一步失败,都原样返回原始错误。

默认行为不会被改动。 不受影响的写入永远不会进入接管流程,不会覆盖任何已有记录,也不会替换任何服务。检测很严格:FS_IO_ERROR 消息里必须同时出现 .tmpdir 暂存标记和 link 动词,所以无关的 EISDIR 失败(目标是目录、路径组件有问题)绝不会被碰。

安装

从 GitHub 安装。请固定 tag 或 commit——不带 ref 的话,pnpm 会安装默认分支此刻指向的内容,之后一次推送就会悄悄改变用户机器上运行的东西:

dsh plugin --profile web add "github:Mushroomcowisheggs/dsh-hardlink-publish-fallback#v0.1.0"

strongest: pin the exact commit
dsh plugin --profile web add "github:Mushroomcowisheggs/dsh-hardlink-publish-fallback#<40-char-sha>"

本包是纯 JavaScript,没有 prepare/构建脚本,所以 pnpm 没有生命周期脚本要跑,也不需要 allowBuilds 授权。(那条要求针对的是从源码构建的 git 依赖;如果将来如果 version 以后加了构建步骤,用户必须在配置档的 pnpm-workspace.yaml 里把它加入允许列表。)

路径一定要加引号

从本地检出或 tarball 安装时,给路径加双引号。不加引号的 Windows 路径在 pnpm 看到之前就已经被改坏了:\d、\h、\t 这类序列会被当成转义符,所以

WRONG — backslash escapes eat path separators; pnpm then looks for a registry package literally named "dir\my-plugin"
dsh plugin --profile web add some\dir\my-plugin

RIGHT
dsh plugin --profile web add "some\dir\my-plugin"

from a local checkout
dsh plugin --profile web add "<path-to-checkout>"

from a tarball
pnpm pack
dsh plugin --profile web add "<path-to-checkout>\dsh-hardlink-publish-fallback-0.1.0.tgz"

dsh plugin add 会把 bundle 自动追加到配置档的 dsh.profile.bundles,因为这个包声明了 dsh.bundle。

验证

dsh --profile web --dump-config # look for "# == dsh-hardlink-publish-fallback"

然后,在受影响卷上的工作区里,让智能体新建一个文件。没有插件时会报上面的 EISDIR/link 错误;装上插件后,调用会正常返回 Created file。

已在真实硬件上确认(修复过的 exFAT 卷,插件从已发布的 tag 安装):新建文件、在需要先创建的目录里新建、不经过读取就再次写入同一个文件,都没有残留的暂存文件。这个插件创建的文件,记录的观测结果和正常写入成功时一样,所以之后的行为跟其他文件没有区别。

适用范围与限制

- 只修复新建文件。 更新和 edit 从来不走硬链接路径,所以本来就没问题,不会被拦截。
- 症状偏 Windows,逻辑与宿主无关。 插件依据的是失败特征,不是平台,所以任何 POSIX 文件系统只要以同样的形式拒绝 link(),也一并覆盖。
- 写入盘符根目录时无效。 另一个跨文件系统的缺陷会让 writeFileAtomic 调用 mkdir(<root>, { recursive: true }),这在 Windows 盘符根目录上返回 EPERM(这里在 NTFS 和 exFAT 卷上都验证过)。由于这个插件是通过同一个服务完成写入的,直接在盘符根目录新建文件仍然会失败。请改用子目录。
- 不能替代上游修复。 这是针对 dsh-fs-local 发布逻辑缺陷的运行时变通方案;完整分析和建议的修复见 DEFECT-REPORT.md。
- 存在一个继承来的小 TOCTOU 窗口。 不存在性复查和写入是两次独立调用。原来的 writeText 在自己的探测和发布之间本来就有同样的窗口;复查保住的是防覆盖保护,在这个窗口之外,竞争的创建者仍然无法被悄悄覆盖。

测试

npm test # or: node test/plugin.test.mjs
这套测试套件把插件的接缝(fs、sandboxPolicy)替换成假实现,用来复现无硬链接卷的语义,因此不需要 exFAT 卷,不需要运行中的 harness,也没有任何依赖——只要 Node 能跑,它就能跑。它断言的是这个插件契约里真正要紧的结果:硬链接失败会在没有 no-replace 保护的情况下完成,接管运行时已经存在的目标绝不会被覆盖,无关的失败和成功的写入原样透传,接管内部出错时调用方原本的结果保持不变。

仓库结构

.
├── package.json # declares dsh.bundle.patch
├── cordis.patch.yml # the configuration layer this bundle contributes
├── index.js # the plugin module
├── README.md
├── LICENSE
├── test/
│ └── plugin.test.mjs # behavioural tests (no exFAT volume needed)
├── DEFECT-REPORT.md # the upstream analysis (not published to npm)
├── POST.md # candidate discussion write-up (see PRIOR-REPORTS.md)
└── PRIOR-REPORTS.md # this defect is already reported - read before filing

包文件必须留在仓库根目录:git 安装会打包整个仓库,而不是套用 files 白名单,所以 package.json、index.js 和 cordis.patch.yml 都必须能从根目录解析到。

发现

仓库带有 GitHub dsh-plugin 话题,CONTRIBUTING.md 就是要求社区插件用这种方式让自己可被发现。

许可证

MIT —— 见 LICENSE。
预览分享卡片长什么样 ↓Mushroomcowisheggs/dsh-hardlink-publish-fallback
分享 · DeepSeek Harness Hub
Mushroomcowisheggs/dsh-hardlink-publish-fallback

让不支持硬链接的卷也能正常创建新文件

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部