better-er/dsh-write-create-only
write 仅创建:禁止 write 覆盖已存在文件,目标已存在时自动拒绝并提示改用 edit,防止模型误覆写已有内容。纯 host 端 dsh 插件。
Project Overview项目介绍
This is a DeepSeek Harness (DSH) plugin that restricts the write tool to only create new files. It checks target paths before execution, denies calls for existing files and prompts to use edit. Use it to prevent accidental overwriting of existing files. It only blocks write, no impact on other tools.
这是一款DSH插件,限制write工具仅能创建新文件。它会在write执行前检查目标路径,若文件已存在则直接拒绝调用,并提示改用edit修改。需要防止模型误使用write覆写已有文件时可使用,仅拦截write,不影响其他工具。
请帮我了解并安装插件:【dsh-write-create-only】【https://github.com/better-er/dsh-write-create-only】
Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。
Or use CLI install (for developers)或使用命令行安装(适合开发者)
CLI Install命令行安装
dsh plugin --profile web add dsh-write-create-only
把 better-er/dsh-write-create-only 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
dsh·write 仅创建插件
禁止 write 覆盖已存在的文件:write 只允许创建新文件,目标已存在时在工具执行前直接拒绝并提示改用 edit,全局所有会话生效,防止模型用 write 把已有文件整体冲掉。纯 host 端插件,不碰 DSH 源码。
为什么
write 是全文件覆写。模型一旦误用 write 去改一个已有文件,原内容会被整段覆盖,而 dsh 默认的 fs-observation-policy 只要求「先读过」,并不禁止覆写。与其事后靠模型自觉,不如把「write = 仅创建」立成硬约束。
功能
- 只拦 write:
edit、read等其余工具完全不受影响。 - 目标已存在 → 拒绝:在
tools/pre-execute瀑布里对 write 调用先fs.stat目标,已存在则返回deny,错误信息明确提示「请改用 edit 做定向修改;只有创建新文件时才使用 write」,模型看到后会改走edit。 - 目标不存在 → 放行:新建文件一切照常。
- 保守放行:路径无效、stat 抛错等不确定情形一律放行,绝不误伤合法调用。
- 全局生效:所有 agent 与会话统一适用。
安装
从 GitHub 安装:源码在 src/,lib/ 不入仓库,安装时 npm 会触发 prepare 脚本现场构建。
dsh plugin --profile web add github:better-er/dsh-write-create-only
从 npm 安装:包内已含构建产物 lib/index.js,安装时不再构建。
dsh plugin --profile web add dsh-write-create-only
两种方式装完都会自动挂载,重启 DSH web 后启用,无需手工编辑组合文件。
卸载
dsh plugin --profile web remove dsh-write-create-only
重启 DSH web 后不再加载。
原理
dsh 的每个工具在执行前都会走 tools/pre-execute 这个异步瀑布,每个监听器按序决定 allow / ask / deny。本插件注册一个全局监听器:
- 只对
exec.name === 'write'生效; - 取出
exec.arguments.file_path,用会话工作目录ctx.fs.resolve成绝对目标,再ctx.fs.stat; - stat 返回非空即目标已存在,返回
{ kind: 'deny', reason }拒绝本次调用; - 其余情况一律
return next()放行到瀑布下一环。
选择 tools/pre-execute 而不是 fs/write-intent,是因为后者是单槽瀑布且已被默认的 fs-observation-policy 占用;而 tools/pre-execute 是多监听器瀑布,位置在工具执行最前面,既不影响 write 的 schema,也不与现有策略抢位。
开发与验证
npm install
npm run build # 产出 lib/index.js
node scripts/smoke.mjs # 无运行时冒烟验证:5 项断言覆盖拦截/放行/容错
GanyuanRan/Aegis
shengsheng90/DSH-taskboard
pengyue-polaron/deepseek-harness-genui
Jayden-X-L/forkprobe
BeforeWave/dsh-with-chatgpt
sluminositys/dsh-nested-followups
Meredith2328/dsh-sticky-note
cloader/dsh-taskboard