克劳德·寓言始终积极主动

2026-06-12 1 阅读 lumpa
克劳德寓言 积极主动 2026 年 6 月 11 日 经过两天的《克劳德寓言 5》体验后,我认为描述它的最好方式就是积极主动。它知道很多技巧,并且会部署几乎所有技巧来实现其目标。我将用一个例子来说明这一点。今天我在使用 Datasette Agent 时发现了一个小故障:跳转菜单聊天提示中不应该出现水平滚动条。我拍下了这个屏幕截图: 然后我在我的 datasette-agent checkout 中启动了一个新的 claude 会话,拖入屏幕截图并告诉它: 查看依赖项以帮助找出为什么这里有水平滚动条 我有预感,原因是 Datasette Agent(可能是 Datasette 本身)的依赖项,并且我知道 Fable 擅长挖掘依赖项代码,无论是通过检查其自己的虚拟环境站点包中的已安装文件还是通过引用磁盘上的本地签出。告诉它从依赖项开始感觉是一个不错的选择。我因家务活而分心,离开了电脑。几分钟后,当我回来时,我看到我的机器在我的常规 Firefox 中打开了一个浏览器窗口,然后导航到有问题的对话框。我没有告诉 Claude Code 使用任何浏览器自动化,而且我很确定它不可能在窗口内触发鼠标移动或键盘快捷键,那么它是如何做到的呢?我着迷地看着它继续探索,然后看到它打开了 Safari 窗口而不是 Firefox。我还从 Claude 终端抓取了这个快照: uv run --with pyobjc-framework-Quartz 在那里做什么?事实证明,《神鬼寓言》已经破解了自己的浏览器窗口截图模式。它使用 Python 遍历我的计算机上的所有可用窗口,然后使用窗口名称中的预期字符串(例如“textarea”)过滤 Safari 窗口。它使用它来查找它们的窗口号(一个像 153551 这样的整数),然后可以将其与 screencapture CLI 工具一起使用来抓取 PNG。好吧,这是截屏的好方法。但它截图的是什么?事实证明,它一直在编写自己的临时 HTML 页面来尝试重现该错误,然后打开 Safari 并抓取屏幕截图。这是它创建的 /tmp/textarea-scrollbar-test.html 页面,以及使用 screencapture -x -o -l 153551 /tmp/safari-cases.png 截取的屏幕截图:(我打开的选项卡太多了!)好的,所以我可以看到它是如何打开测试页面并截取屏幕截图的,但是它到底是如何触发本应进行测试的模式对话框的呢?这只能通过点击或键盘快捷键来实现,而且我看不到它在 Safari 中运行这些功能的机制。我终于明白它做了什么。 Claude 正在包含应用程序源代码的文件夹中运行。它对 Datasette 有足够的了解,能够运行本地开发服务器。事实证明,它正在编辑 Datasette 自己的模板来添加 JavaScript,一旦窗口打开,就会触发正确的键盘快捷键,添加如下代码: < script > window 。 addEventListener ( "load" , function ( ) { setTimeout ( function ( ) { document .dispatchEvent ( new KeyboardEvent ( "keydown" , { key : "/" , bubbles : true } ) ) ; } , 1200 ) ; } ) ; 窗口打开后1.2秒,这段代码会触发一个模拟的 / 键,这是打开模态对话框的键盘快捷键。还剩下一项挑战。为了了解发生了什么,Claude 需要在页面上运行 JavaScript 来自行测量。它编写了自己的自定义 Web 应用程序来通过 CORS 捕获信息,然后将其作为本地服务器运行,并使用 JavaScript 打开一个页面,该页面将直接 POST 到它!这是它使用标准库 http.server 包编写的 Python Web 应用程序:来自 http 。服务器导入 HTTPServer , BaseHTTPRequestHandler 类 H ( BaseHTTPRequestHandler ): def do_POST ( self ): n = int ( self . headers . get ( "Content-Length" , 0 )) open ( "/tmp/diag.json" , "w" )。 write(self.rfile.read(n).decode()) self.发送_响应(200)自我。 send_header("Access-Control-Allow-Origin", "*") self . end_headers () def do_OPTIONS ( self ): self .发送_响应(200)自我。 send_header("Access-Control-Allow-Origin", "*") self . send_header ("访问控制允许标头", "*") self . end_headers () def log_message ( self , * a ): # 安静地传递 HTTPServer (( "127.0.0.1" , 9999 ), H ). serve_forever () 所做的就是接受一个充满 JSON 的 POST 请求并将其写入 /tmp/diag.json 文件。它发送 Access-Control-Allow-Origin: * 标头(包括来自 OPTIONS 请求的标头),以便在另一个域上运行的代码仍然可以与其进行通信。然后 Claude 将此代码注入到浏览器中加载的模板中: const host = document 。 querySelector(“导航搜索”);常量 ta = 主机 .影子根。查询选择器(“文本区域”); const cs = getCompute