关于 clipboard-screenshot
供编码 Agent 使用的技能,通过本地 Unix socket 获取剪贴板中的截图或其他图像,按检测到的格式保存并读取。它还说明如何区分获取失败的原因,并在处理图像前确认内容。
主要功能
- 01通过 Unix socket 获取剪贴板内容
- 02按检测到的格式扩展名保存图像
- 03输出保存路径和检测到的类型
- 04说明不同剪贴板连接故障
- 05建议检查 PNG gamma 元数据
适用场景
- 01查看用户复制的截图
- 02对比先后获取的剪贴板截图
- 03排查剪贴板桥接缺失或卡顿
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ getcolors/ skills --skill clipboard-screenshot安装后在 Claude Code 中输入/clipboard-screenshot确认已加载。
附带文件evals/evals.jsonscripts/grab-clipboard-image.sh
详细介绍
剪贴板截图
你无法直接看到用户的剪贴板。这台机器上有一个小型桥接程序,让你可以访问剪贴板:连接到它的 Unix 套接字,它就会将剪贴板的当前内容写给你,然后关闭连接。剪贴板中如果是截图,这些字节就是 PNG(有时也会是其他图像格式)。
套接字路径为 $HOME/.clipboard.sock($CLIPBOARD_SOCKET 可覆盖此路径)。
将套接字放在主目录中,可以确保同一台机器上的多个用户彼此隔离:每个登录用户的桥接程序——或通过 SSH 配置中的
RemoteForward /home/%r/.clipboard.sock <local> 转发的套接字——都位于各自的主目录中,因此路径不会冲突,抓取内容时也绝不会读取到或收到其他用户的桥接程序所提供的内容。切勿将 CLIPBOARD_SOCKET 指向其他用户的套接字:那是他们的剪贴板,不是当前用户的。
这样,你就有了从“用户复制了一张图片”到“你正在查看这张图片”的途径——缺失的步骤是,图片字节只能通过你 Read 的文件进入上下文,因此必须先将这些字节写入磁盘,并使用与实际格式匹配的扩展名。
抓取图片
运行随附的脚本。如果有临时目录,请将其传入,这样抓取的图片就不会出现在用户的项目中:
~/.claude/skills/clipboard-screenshot/scripts/grab-clipboard-image.sh <scratchpad-dir>
(如果此技能位于其他位置,脚本就在相对于此文件的 scripts/grab-clipboard-image.sh 路径下。)
脚本会输出保存路径和检测到的类型:
path: /path/to/scratchpad/clipboard-20260821-072411-317849213.png
type: PNG image data, 670 x 586, 8-bit/color RGBA, non-interlaced
然后 Read 该路径。图片就会显示在对话中,你也就能看到了。
有了这个脚本,就只需调用一次,而不必调用四次;它还避免了两个手动操作时容易出错的细节:nc 的标准输入必须重定向到 /dev/null,否则它会一直保持连接;文件扩展名也必须与实际格式相符——如果图像实际上是 JPEG,却保存为 .png,可能无法显示。
先说明你看到了什么,再继续
在对图片采取行动之前,用一两句话说明图片显示了什么。
这并非形式主义。用户看不到你获取了哪些字节,而且剪贴板的内容可能已经过时——用户可能在此之后复制了其他内容,也可能截错了窗口。如果你说“这是一个显示 bb golden 运行失败的终端”,但这不是用户想发给你的内容,他们就能立即发现,在你花费这一轮时间调试错误内容之前及时纠正。抓取错误却不提及,代价远高于多说一句话。
之后,继续处理用户实际提出的请求。抓取图片通常只是达成目的的手段——真正的请求可能是“为什么会失败”“修复这个布局”或“转录这个表格”。如果没有其他请求,描述图片本身就是答案,你也可以详细说明。
请直接阅读图片,而不是依据用户对图片的描述来处理。用户可能只说“日志里有个错误”,但截图还显示了产生该错误的命令、工作目录和行号——这些都是用户没想到要提及、却可能起关键作用的细节。
你看到的颜色可能并非最终呈现的颜色
抓取的图像在读取时可能看起来完美无瑕,但在网页上呈现时却会褪色——海军蓝变成石板灰,饱和的绿色变得苍白。实际遇到的罪魁祸首是 PNG 的 gAMA 块携带了反向的伽马值:219998(γ 2.2),而正常文件中存储的是 45455(γ 1/2.2)。浏览器会遵循这个块并提亮所有中间调;Read、sharp 和大多数图像查看器会忽略它,所以你看不出颜色褪变。这个块来自剪贴板字节本身——由导出图像的工具写入,而非桥接程序写入。
因此,如果用户说重新发布的抓取图像看起来褪色,而“原图”看起来正常,先别急着检查网页的 CSS:列出 PNG 的块并检查 gAMA。修复方法是无损重新编码(用 sharp 执行 .png() 往返处理会去掉该块);比较处理前后的解码原始像素,确认变化仅涉及元数据。此问题曾于 2026-08-31 出现过一次;从未查明写入该块的导出流程,因此应将所有要用于网页的抓取 PNG 都视为可疑,而不只是某个来源的图像。
抓取失败时
脚本将失败情况分开处理,因为不同情况需要不同的应对方式:
| 退出码 | 含义 | 应对方式 |
|---|---|---|
| 3 | 没有可连接的对象——可能没有套接字文件,也可能套接字文件已过期且没有进程监听 | 用户的剪贴板桥接程序未运行(通过 ssh 连接时,用户的远程转发已断开,或套接字已过期)。说明这一点,并请用户启动桥接程序或重新连接;也可以让用户将图像保存到文件并提供路径。不要重试,也不要让用户重新复制——桥接程序未运行与剪贴板里的内容无关。 |
| 4 | 已连接,但剪贴板没有发送任何内容 | 剪贴板确实为空。请用户重新复制屏幕截图;有时看似成功的复制其实并未成功。 |
| 5 | 剪贴板中是其他内容 | 报告检测到的内容类型。如果检测到的是用户想粘贴的文本,他们可以直接将其粘贴到聊天中。 |
| 6 | 已连接,但桥接程序始终未发送完毕 | 桥接程序卡住了,而不是未运行。可以重试一次;如果再次超时,用户需要重启桥接程序。 |
退出码 3 和 4 一定要区分清楚。桥接程序崩溃后,其套接字文件仍会留在磁盘上,因此文件存在并不能证明什么——如果告诉用户剪贴板为空,而实际情况是桥接程序已停止运行,就会让他们白白重新复制一张原本已经在剪贴板里的屏幕截图。
清楚地说明发生了什么,让用户能解决问题。猜测未能加载的图像内容,比直接说明无法加载更糟糕。
再次抓取
每次抓取都会添加时间戳,因此第二次抓取不会覆盖第一次。用户复制了新内容并说“现在看看这个”时,请再次运行脚本——如果重复使用之前的文件,你看到的会是旧图像,但用户以为你看到的是当前内容。如果需要比较两张屏幕截图,请逐张抓取,并保留两个路径。