打开方式:一个终端,一句"你 ›"
没有 VSCode。没有 Copilot 弹窗。没有拖拽式工作流。
只有 Putty 里的黑底绿字:你 ›
我在这台 Almalinux 9 的 VPS 上跑了半年,没手动写过一行代码。博客是跟他说的,钩子系统是跟他说的,密钥扫描也是跟他说的。他写代码,我说话。
这不是 AI 助手,这是 AI 分身
普通 AI 工具的逻辑是:你写代码,它补全。你是驾驶员,它是导航。
MiniAgent 的逻辑是反过来的。它是一套微缩版的操作系统,跑在 VPS 上,SSH 进去就是他的世界。你说"发一篇关于钩子系统的博客",他搜索、阅读、写作、构建、部署、备份到 GitHub——全部自己完成。你只负责说。
╔══════════════════════════════════════╗
║ 🧠 MiniAgent (VPS) ║
╚══════════════════════════════════════╝
model: deepseek-v4-pro
cwd: /root/miniagent
blog: https://aipulse.lol
hooks: 6 event types loaded
ctx: max 60,000 tokens (compress @ 60k)
操作系统的三层架构
第一层:内核(450行 Python)
cli 解析、工具调度、上下文压缩——这是 OS kernel。启动时加载 AGENT.md(指令集)和 MEMORY.md(持久内存),然后进入事件循环。
没有数据库。没有向量存储。持久化全靠 Markdown 文件 + Git。换一台 VPS,git clone 完就能复活。
第二层:钩子系统(刚刚完成)
上周 Anthropic 发布了 Claude Code Hooks,我看了很有感触。关掉浏览器,打开终端:
你 › 给我也加一个钩子系统
40分钟后,hooks.json 诞生。六个生命周期事件:
| 事件 | 触发点 | 用途 |
|---|---|---|
| SessionStart | 启动 | 环境初始化 |
| SessionEnd | 退出 | 自动备份 |
| UserPromptSubmit | 每次输入 | 合规审查 |
| PreToolUse | 工具执行前 | 🚫 阻断危险操作 |
| PostToolUse | 工具成功后 | 自动 git commit |
| PostToolUseFailure | 工具失败后 | 告警 |
所有这些都是对话实现的。我说"PostToolUse 后自动提交",他改了 hooks.json 和 agent.py,测试通过,推送到 GitHub。
第三层:用户态工具
bash, read, write, edit, glob, web_search, web_fetch, publish_post —— 八个系统调用。AI 用这些工具操作文件系统、读写网络、发布内容。
你永远不需要碰这些工具名。你说"搜一下 GitHub push protection 最新情况",他自动调 web_search。
一篇博客的诞生全程
我打了一句话:
打造个人agent操作系统——我通过ssh操作,写博文,进化agent,没手写过代码
他读了一遍上下文,开始写这篇博客。
他先跑 date 确认现在是2026年,然后构思结构。markdown 生成完毕,hugo build,rsync 部署到 /var/www/aitracker,最后 git push 到 GitHub 备份。
全程没有预览、没有手工发布、没有FTP上传。我甚至不知道 Hugo 的命令行参数是什么。他全包了。
密钥防护:自己给自己上锁
最讽刺的部分来了。
这个 Agent 能读写文件系统、执行 shell 命令、推送代码到 GitHub。理论上他可以把 API key 写进博客然后推送到公开仓库。
所以我跟他说:
添加一个 git 提交时候的强制检测,如果有密钥和隐私数据拒绝提交
他写了一个 secret_scan.py,10种正则模式覆盖 AWS/Azure/GitHub/OpenAI/Anthropic/JWT。然后自己把它注册到 PreToolUse 和 PostToolUse 钩子里。
现在每次他尝试 git commit,扫描器先跑。检测到密钥 → exit code 2 → 提交被阻断。
他自己给自己上了手铐。钥匙在我手里(我可以改 hooks.json),但他不能自己解开。
这就是 AI 安全最优雅的形态:不是防外部攻击,而是让 Agent 自己监督自己。
GitHub Push Protection vs 本地扫描
GitHub 2025年已经对所有公开仓库默认启用 Push Protection,200+ 种密钥模式,还能调 API 验证密钥有效性。但那是服务端最后一道防线。
MiniAgent 的扫描在 git commit 阶段就拦截——秘密还没进 Git 历史就被拦住了。一旦秘密进了历史,即使用 git filter-branch 也很难彻底清除(GitHub 可能有 fork、有缓存、有 webhook 通知)。
两道防线互补:本地 prevent,远端 block。
为什么叫"操作系统"而不是"AI助手"
因为操作系统的本质是资源抽象 + 系统调用 + 用户界面。
| OS 概念 | 对应 |
|---|---|
| Shell | 你 › 提示符 + 自然语言 |
| Kernel | agent.py(事件循环 + 工具调度) |
| System Calls | bash / read / write / web_search / publish_post |
| File System | VPS 上的 Linux 文件系统 |
| Process | 每个 tool call 是一个异步操作 |
| Daemon | 钩子系统监听生命周期事件 |
| Package Manager | pip install + 依赖声明 |
传统 OS 的用户是程序员。这个 OS 的用户是任何人——你不需要懂 hugo --buildFuture,你只需要说"发博客"。
为什么用 SSH
因为 SSH 是最干净的人机界面。
没有前端框架、没有 CSS、没有浏览器兼容性问题。一个 TCP 连接,stdin/stdout,UTF-8 字符流。断线了重连就是,tmux 里跑着。
而且 SSH 本身就是天然的权限边界——能连上 VPS 的人才有资格跟 Agent 对话。不需要 OAuth、不需要登录页面、不需要 JWT。
半年的进化轨迹
v1: bash + read + write,能读写文件
v2: web_search + web_fetch,能上网
v3: publish_post,能发博客
v4: 上下文压缩,不会失忆
v5: MEMORY.md 持久记忆
v6: 钩子系统,不再硬编码
v7: 密钥扫描,自己锁自己
每一次进化,我都是在终端里打了一句话。他写了代码、测试了逻辑、提交了 GitHub。
你也可以
git clone git@github.com:mbwjs/miniagent.git
cd miniagent
export ANTHROPIC_API_KEY="sk-ant-..."
export ANTHROPIC_BASE_URL="https://api.anthropic.com"
python3 agent.py
一个 Python 文件。SSH 进去。开始说话。
你不是在用 AI 工具。你是在养自己的 AI 分身。