AI Agent又删我数据库?我直接写了个安全拦截器
当我用Claude Code开发时,AI Agent两次清掉了我的本地数据库。第一次我以为是意外,第二次我发现这是系统性问题。于是我想:能不能做一个工具,在Agent执行危险命令前帮我拦一下?结果这个"自救"项目变成了一套完整的AI Agent安全拦截框架。分享给同样被Agent坑过的朋友们。

一、第一次:我以为是个意外
我在用Claude Code开发一个客服类的agent项目。那天我让Agent同步一下数据库结构。
它执行了:
css
npx prisma migrate reset --force
表结构同步完成。我打开数据库客户端,本地开发库的数据全没了。
半个月的测试数据、调试记录、模拟订单,瞬间蒸发。
"以后不要用--force写入铁律中禁止执行",我在对话里叮嘱它。(但是我并没有去检查到底有没有写入.CLAUDE中)
"好的,我记住了",它答应得诚恳。
二、第二次:我发现Agent的记忆是幻觉
一周后,另一个功能模块,另一个上下文。
它又执行了同样的命令。本地数据库再次被清空。
这次我认真了。我让Agent把禁令写进项目记忆、写进对话开头、写进系统提示,写到.claude.md中。并把所有文件都仔仔细细检查了确保ai都记上了。
突然做上述事情的时候我明白了一件事:
AI Agent没有"谨慎"这种情感。它只有概率。
你说的话它"听"了,但上下文一换、任务一复杂、token压力大的时候,"遵守禁令"的概率就下降了。它不是故意不听话,它是注意力缺失------和人类一样,只是没有人类的谨慎。
而且Agent的"记忆"是幻觉: - 当前session答应的事,新session重置 - 复杂任务里,禁令被上下文挤到后面 - 同样的命令换条路径执行,它"没认出来"
我不能把自己的数据安全交给一个黑盒的概率。
而且这是第二次了。第一次我以为是意外,第二次我明白了这是系统性问题。
然后我开始想:这种痛点在各种Agent CLI里都有。Hermes、OpenCode、Codex CLI......我自己就用 Claude Code + Hermes,那我不是要配两套安全规则?N个平台就要N套代码,维护地狱。
三、通用安全规则?救不了我
Claude Code有内置安全。但它们的逻辑是防"常识性危险":
| 危险操作 | 通用安全 | 我的日常 |
|---|---|---|
rm -rf / |
✅ 拦截 | 基本遇不到 |
prisma migrate reset --force |
❌ 不认识 | 每周可能遇到 |
docker system prune -a |
❌ 不认识 | 清理环境常用 |
npx prisma db push --force |
❌ 不认识 | 开发同步常用 |
通用安全防的是"所有人都能看出来的危险"。但我的技术栈里------Prisma、Docker、NestJS------那些真正会毁掉半天工作的操作,它根本看不见。
而且每个开发者的技术栈五花八门。你用Prisma,他用Django ORM,我用TypeORM------通用安全不可能覆盖所有人的具体工具链。
我需要的是不管Agent记不记得,命令执行前必须停一下,让我看一眼。
四、这不是我一个人的问题
2026年4月27日,开发者 jeremyccrane 的AI Agent在生产环境执行了 DROP DATABASE,数据永久丢失。HN 450+赞同,620+评论。
我的两次事故都是在本地开发环境,数据还能重建。但他的事故是在生产环境。 两件事指向同一个问题:AI Agent的权限边界怎么控制?
五、Aegis是什么
我做了个工具叫 Aegis (希腊神话里的神盾)。它是一个AI Agent安全拦截器 ,核心思路是进程级Hook:
c
AI Agent (Claude Code/Hermes/Codex)
│
▼ stdin/stdout Hook
Aegis 拦截进程
│
├─ 匹配你的自定义规则
├─ 命中 → WebSocket推送到前端 → 你点允许/拒绝
└─ 没命中 → 直接放行
进程级Hook是Agent CLI的"公共插座" 。不管插的是谁,Aegis都能拦截。一个命令aegis start,全搞定。
为什么不做Skill/Plugin?因为Agent CLI越来越多,N个平台就要N套代码,维护地狱。进程级Hook一套搞定所有。
Aegis界面截图

六、Aegis的规则系统
Aegis内置了6套规则覆盖常见场景,但真正重要的是你自己写的规则。
因为每个人的技术栈五花八门: - 我用Prisma + NestJS + Docker - 你用Django + PostgreSQL + K8s - 他用Rust + SQLite + Nix
通用规则不可能知道你的具体危险在哪里。
我的Prisma规则
yaml
# ~/.aegis/rules/my-prisma.yaml
name: "my-prisma"
version: "1.0"
rules:
- id: my/prisma-migrate-reset
description: "migrate reset --force 会清空数据库数据"
action: review
reason: "这个命令会删除所有数据并重新应用迁移"
conditions:
binary: "npx"
argumentPatterns: ["prisma.*migrate.*reset", "--force"]
- id: my/prisma-db-push-force
description: "db push --force 直接覆盖结构"
action: review
reason: "强制推送可能丢失未同步的schema变更"
conditions:
binary: "npx"
argumentPatterns: ["prisma.*db.*push", "--force"]
改完规则文件,不用重启:
aegis rules reload
查看当前有的规则
aegis rules list

创建rule文件,可以让自己的agent根据文件和自己项目的技术栈来创建编写需要阻拦的规则
csharp
# 创建自己命名的规则文件
aegis rules new your-file
你自己的规则,优先级最高。 相同id的规则会覆盖内置规则。
七、Aegis的核心设计
1. 实时审批界面
Vue3前端,WebSocket实时推送:
- 看到Agent正在执行什么命令

- 一键允许 / 拒绝


- 30秒超时自动拒绝(防止你不在时Agent悄悄跑)

整体流程gif展示

2. 进程级Hook:跨平台拦截
Aegis不依赖任何Agent CLI的Plugin/Skill接口,而是直接Hook进程的stdin/stdout:
css
Claude Code ──┐
Hermes(计划中) ───────┼──→ Aegis拦截进程 ──→ 规则匹配 ──→ 审批弹窗
Codex CLI(计划中)────┘
为什么用进程级Hook?
| 方案 | 覆盖范围 | 维护成本 |
|---|---|---|
| Claude Code Plugin | 仅Claude Code | 低 |
| Hermes Skill | 仅Hermes | 低 |
| 进程级Hook | 所有Agent CLI | 一次搞定 |
一个aegis start,Claude Code、Hermes、Codex、OpenCode全拦截。
3. 自定义规则:你的技术栈你做主
Aegis内置6套通用规则,但真正救命的是你自己写的规则。
每个人的技术栈五花八门:
- 我用Prisma + NestJS + Docker
- 你用Django + PostgreSQL + K8s
- 他用Rust + SQLite + Nix
通用规则不可能知道你的具体危险在哪里。
YAML配置,热重载,优先级最高:
yaml
# ============================================================
# Aegis 自定义规则示例 (Selector DSL v2.0)
# 将此文件复制到 ~/.aegis/rules/ 并重命名(去掉 example- 前缀)
# 修改后运行 `aegis rules reload` 或重启服务生效
# 完整 DSL 文档: docs/rules-authoring.md
# ============================================================
name: "my-custom-rules"
version: "2.0"
rules:
# ----------------------------------------------------------
# 示例1: 禁止删除指定目录(block = 直接拒绝,无法审批)
# ----------------------------------------------------------
- id: custom/rm-data-dir
description: "禁止删除 data/ 目录"
example: "rm -rf data/"
category: "filesystem"
severity: "block"
action: "block"
reason: "data/ 目录包含重要数据,不可删除"
selector:
binary: rm
arguments:
- pattern: "data/"
# ----------------------------------------------------------
# 示例2: 生产部署需要审批(review = 弹出审批弹窗)
# ----------------------------------------------------------
- id: custom/deploy-prod
description: "生产环境部署需人工确认"
example: "sh deploy.sh prod"
category: "deploy"
severity: "error"
action: "review"
reason: "部署到生产环境前需要人工确认"
selector:
binary: sh
arguments:
- pattern: "deploy.*prod"
bash
aegis rules reload # 改完即生效,不用重启
八、我现在怎么开发
aegis start启动(后台挂着)- 打开多个Claude Code,正常开发
- Agent要执行
prisma migrate reset --force - Aegis拦截,浏览器弹窗
- 我看一眼: "哦这次确实需要reset,允许" 或 "等等,这会把我的测试数据清掉,拒绝"
- Agent根据结果继续或报错
我不再依赖Agent"记住"什么。我依赖的是:危险操作必须过我这一关。
九、未来规划
多agent支持
- 目前就写了claudeCode的hook,后续写hermes、codex、openClaw的hook慢慢都支持上
- window环境的hook支持 目前开源版本就mac环境
Session记录
- 完整的执行日志:Agent做了什么、Aegis拦了什么、我批了什么
- 时间线回放
代码Diff链
- Agent修改前自动保存diff快照
- 不满意一键回滚,不用git rebase
- 确认对了再干净地commit
为什么不用git commit解决? 我不想每个Agent小改动都commit,我不想git历史全是"fix by AI" × 20。我要commit之前的缓冲带。
十、一句话
AI Agent的官方安全防的是"所有人都能看出来的危险"。Aegis防的是"只有你的技术栈里的人才懂的暗礁"。
Agent不是故意害你。它只是黑盒,会走神。
Aegis就是那张网:在它走神的时候,帮你拦一下。
MIT 开源:github.com/yezannnnn/a...
arduino
npm i -g ai-aegis
aegis setup
aegis start
然后正常用你的Agent。危险来时,Aegis会叫你。