危险动作守卫
危险动作守卫
结论先行
预览卡片 → 用户说"确认" → 加 --confirm 执行 → 写审计日志
不带 --confirm 的调用只出卡片,绝不执行。 这是我给自己设的闸,不依赖用户记不记得提醒。
一、命令
$NODE = "C:\Program Files\sanshan-kaiwu\resources\runtime\node.exe"
$G = "<产品仓库>\tools\danger-guard.mjs"
# 1) 删除:先预览
& $NODE $G --action delete --path "C:\work\旧报价.xlsx"
# 2) 用户确认后再执行
& $NODE $G --action delete --path "C:\work\旧报价.xlsx" --confirm
# 覆盖(会自动把原文件备份成 .bak-时间戳)
& $NODE $G --action overwrite --path "C:\work\合同.docx" --source "C:\work\新版.docx" --confirm
# 付款类:永远拒绝,只提示人工
& $NODE $G --action pay --summary "给客户退款 2000 元"
二、卡片里有什么
| 字段 | 说明 |
| --- | --- |
| 动作 | 删除 / 覆盖 |
| 目标 | 完整绝对路径 |
| 状态 | 是否存在、大小、修改时间 |
| 来源 | 覆盖时的源文件及状态 |
看到卡片你就能判断"是不是这个文件、是不是这一版"。
三、审计日志
所有调用(含预览)写入 logs/danger-actions.log:
2026-11-07T10:29:39Z {"action":"delete","path":"...","executed":true}
做过的事,事后能查。
四、已验证记录(2026-11-07)
| 场景 | 结果 |
| --- | --- |
| 删除预览(无 --confirm) | ✅ 只出卡片,文件仍在 |
| 付款请求 | ✅ 拒绝并提示人工处理 |
| 删除执行(--confirm) | ✅ 文件被删,日志记录 executed:true |
| 覆盖 | 已实现(原文件自动备份为 .bak-时间戳),待真实场景验证 |
五、红线
| 不做 | 原因 |
| --- | --- |
| 不带 --confirm 就删/覆盖 | 不可逆 |
| 付款、转账、红包 | 一律人工 |
| 覆盖不留备份 | 出事无法回退 |
| 删除系统目录、Program Files、Windows | 会毁掉系统 |
验收清单
- [ ] 执行前把卡片原文给用户看过,并得到明确"确认"
- [ ] 目标是具体文件路径,不是通配符或整个目录
- [ ] 覆盖场景下备份文件已生成
- [ ] 执行后核对文件状态(存在/不存在)
- [ ] 审计日志有对应记录