【开源】防止AI的骚操作,给agent做了一键 ctrl+z 撤销

lintsinghua 2026-10-14 19:11 1

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容:



  • 我的帖子已经打上 开源推广 标签: 是

  • 我的开源项目完整开源,无未开源部分: 是

  • 我的开源项目已链接认可 LINUX DO 社区: 是

  • 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是

  • 以上选择我承诺是永久有效的,接受社区和佬友监督: 是


以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出




各位佬好,附链接:



写在前面


关于是怎么被agent坑到的


上周收尾项目堆了二十来个一次性脚本,就让 Codex把 scripts 目录收拾一下,package.json 里用不上的脚本也删掉


一轮下来动了30个文件吧应该,scripts清到剩了1个、package.json也改了、src里几个文件的 import也排了序


问题在于让Agent改之前,这些文件一个都没提交过啊 ^-^感觉有点炸肛啊

我下意识去找撤销,但对话一多,具体的某轮的撤销就会覆盖掉找不着,codex上没找到解决方案

但如果直接让Agent改回去,又怕没有100%还原,越改越乱


于是开始传统艺能:



  • git checkout .?连我自己上午没提交的改动一起冲掉了

  • 让 Agent 自己改回去?它不知道改前是什么样的,只是写脚本批量做了但是没有读,越改越乱

  • 一个个文件手动比对,啊


去翻issue,发现不是只有我 ^-^


去翻了下Codex的issue列表,第一条相关的是这个:



Codex #9203:「Please make “/undo” back」——2026-01-14 开的,482 个赞、93 条评论,至今仍是 open。原帖作者写得很直白


底下的评论基本是同款。Codex 原本是有 /undo 的,4月被移除了(PR #19481 “Remove ghost snapshots”)。官方给的理由是使用量低,而且原实现给很多用户(包括没用这个功能的人)带来了严重问题;如果要回归,得重新设计 ^-^


同类的/rewind需求(#11626)也有 228 个赞


然后我又去看了 Claude Code 那边,这个场景的话我在 CC 上也遇到过:



三家现状:



于是有了 oops


oops —— Agent 的 Ctrl+Z:一键精准撤销/重做。


思路简单直接在文件系统这层看。通过各家Agent的hook来,每一轮开始前和结束后各拍一次增量快照,两者的差就是这一轮的全部改动——不管它是用内置Edit工具、sed、Python heredoc,还是 rm -rf干的,也不管这些文件有没有进git



那个30个文件现在可以这样:


$ oops undo
✓ Undid turn #42 · codex · "clean up the build scripts"

restored 28 files scripts/ (26), src/ (2)
removed 1 file scripts/build.mjs
reverted 1 file package.json

Changed your mind? oops redo

src/里我自己上午改的那两个文件,都可以不动


演示


1. 不用切窗口,在对话里直接打 /oops


在 Claude Code 的对话框里敲 /oops,这一轮的改动就全撤回了;想反悔就敲 /oops redo。



在本地执行,不发给模型,不消耗 token(你也可以直接发给agent让它用oops撤销或者重做)。Claude Code 会把这段回复显示成 hook 拦截(“operation blocked by hook”)——以 ✓ oops 开头的那一行才是结果,不是报错 ^-^


目前支持 Claude Code、Codex、Gemini CLI、Cursor CLI 四家。别的工具(opencode、自研 harness)的话暂时用 oops run -- <你的命令> 包一层,效果其实一样


2. 完整时间线,撤销和重做可以来回切


终端里直接敲 oops,会打开时间线:每一轮是谁做的、什么时候、提示词是什么、改了几个文件、加了多少行减了多少行,都是有的



选中哪一轮,回车撤销,R 重做,d 看 diff,r 直接回到这一轮之前,/ 过滤。按回车之前看预览——这一轮要还原哪些文件、要删掉哪个新增文件


3. 最在意的一点,不误伤自己的改动


Agent 改完之后,如果你又手动改过同一个文件,oops 认得出来这是你改的,撤销时原样保留,并且明确告诉你保留了哪个、为什么


最后提一点是 项目是Go语言写的,性能还不错,然后运行是静默的不会常驻内存


更多功能不赘述了,大家可以去看README吧~


写在最后


项目很热乎嗯

现在也许佬会认为这个功能不太用得到,或者现有的agent能力已经可以解决 ^-^

但希望有一天佬们也许遇到类似于我遇到的情况的时候,找不到解决方案的时候,能够想到这个项目,也希望这个项目能够带来一点便利 ^-^

欢迎佬友们试用、提issue、拍砖、PR,多^-^多^-^


链接:

最新回复 (11)
  • Zane你发财 10-14 19:33
    1楼

    好东西!这就去试试

  • Taocrypt 10-14 19:38
    2楼

    desktop是不是用不了^-^

  • lintsinghua 楼主 10-14 19:40
    3楼

    hook是一样的 能用的

  • Ys Ltr 10-15 11:25
    4楼

    这是加了个全局版本管理吗?

  • 哈雷彗星 10-15 11:29
    5楼

    我哩个db啊

  • lintsinghua 楼主 10-15 13:40
    6楼

    也可以这么理解

  • lintsinghua 楼主 10-15 13:41
    7楼

    哈雷佬大驾光临 ^-^

  • dage1819 10-15 13:44
    8楼

    git不是更轻量通用吗,这个优势是啥?

  • lintsinghua 楼主 10-15 13:45
    9楼

    在于我们用Agent的时候不会每一轮turn都git commit,也不会自动保存临时的diff


    同一个feature或者fix任务,让agent干的时候,可能会经过多轮对话,那如果后续的对话改动并不是想要的,而之前的版本会更好,这个时候可以撤销到具体的某一轮,从那个时候开始

  • tangsong404 10-15 13:52
    10楼

    我去这是真好东西,感谢佬开源^-^

  • nob 10-26 23:08
    11楼

    请问下desktop咋用

* 帖子来源Linux.do
返回