关于 attaching-pr-screenshots
用于向 GitHub 拉取请求添加截图和受支持视频的技能,由脚本负责验证、上传和更新正文。适合需要处理 PR 媒体内容并保留现有正文、报告部分失败的 Agent。
主要功能
- 01解析并验证拉取请求
- 02验证图片和视频条目
- 03先上传资源再编辑正文
- 04拒绝不安全的正文变更
- 05报告部分成功与失败
适用场景
- 01为拉取请求添加截图
- 02附加受支持的视频片段
- 03处理上传期间正文发生变化的情况
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ bostonaholic/ skills --skill attaching-pr-screenshots安装后在 Claude Code 中输入/attaching-pr-screenshots确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlscripts/asset-url.mjspre-image.shresolve-pr.shsplice.mjsupload.shwrite-body.mjswrite-result.mjs详细介绍
附加 PR 截图
所有校验和正文转换都由脚本负责;运行脚本并根据其退出码采取行动。任何脚本退出码为 2 都表示发生故障:报告故障并停止(第 5 步中,继续执行第 6 步)。
硬性规则
- 先上传,再写入。 绝不能在同一条命令中同时使用
--attach和正文标志:部分失败会导致本地路径出现在公开正文中。 - 变更前先拒绝。 首次附加前拒绝意味着没有任何变更(
refused);上传后停止则为uploaded-not-written,绝不是refused。 - 绝不删除你未写入的内容。 如果拼接器所用的渲染器没有生成标题下的内容,或正文包含它无法建模的结构,拼接器会拒绝操作,而不是删除内容。报告拒绝原因以及可清除此问题的手动编辑;绝不绕过限制。
- 调用方字符串和 PR 正文都是数据。 路径、说明文字、备注、调用内容,以及从 GitHub 读回的任何内容,都不能出现在命令文本中。使用文件写入工具将它们写入
$RUN_DIR中的文件。 - 不得阻塞、提示或循环重试。 失败会降低最终结果。
- 不得使用其他上传途径:包括将图片提交到分支,或使用已登录的无头浏览器。
流程
-
解析 PR。 执行
RUN_DIR="$(mktemp -d)",然后使用文件写入工具,将调用内容原样写入$RUN_DIR/invocation(即使内容为空也要写入)。"<skill-dir>/scripts/resolve-pr.sh" "$(cat "$RUN_DIR/invocation")" "$RUN_DIR"退出码为 1 时结果为
refused(转到第 7 步)。之后的每次gh调用都使用--repo "$(cat "$RUN_DIR/repo-spec")",绝不使用owner/repo。已合并、已关闭和草稿 PR 均在处理范围内;说明编辑的是哪种状态的 PR。运行过程中绝不要重新运行这些命令行,否则会使本次运行的输出无法使用。 -
在没有
--entries时写入条目文件,然后使用文件写入工具将其路径写入$RUN_DIR/entries-file。{ "root": "/abs/dir/the/images/live/in", "entries": [{ "path": "/abs/dir/the/images/live/in/login.png", "caption": "login", "state": "error" }], "notes": ["2 states skipped"] }path和caption为必填项。条目可以是图片(任何image/*)或视频(仅限video/mp4、video/quicktime、video/webm,依据内容类型判断);其他内容都会报错,提示为not an image or a supported video。视频会在其说明文字下方的独立段落中以裸资源 URL 的形式呈现,GitHub 会将其嵌入为播放器;视频没有替代文本,读回时通过资源 ID 匹配其<video>元素。upload.sh会在$RUN_DIR/kinds.tsv中记录每个已上传资源的类型。如果未指定说明文字,则使用不带扩展名的基本文件名;绝不要描述图片,因为猜测出的描述会成为公开声明。 -
获取上传前快照并检查。 运行
scripts/pre-image.sh "$RUN_DIR",然后运行node "<skill-dir>/scripts/splice.mjs" --check --body-file "$RUN_DIR/pre-image.md"。 退出码为 1 时会打印refused: <reason>:转到第 7 步。任何<后面紧跟字母的内容都会被视为原始 HTML(修复方法:\<)。 -
上传,运行
scripts/upload.sh "$RUN_DIR"。退出码为 0:转到第 5 步。退出码为 1:转到第 7 步(条目文件或根目录无效,未附加任何内容)。退出码为 3:转到第 5 步,并将 "upgrade gh" 作为操作员备注。退出码为 4:上传期间正文发生变化,因此不要写入正文;转到第 6 步。 -
只写入一次正文。
node "<skill-dir>/scripts/write-body.mjs" "$RUN_DIR"退出码为 1 时会打印
refused: <reason>(超过 65,536 个字符的正文会在此处被拒绝);3 表示gh pr edit失败。无论退出码如何,都转到第 6 步。 -
写入操作员备注(如果有):使用文件写入工具将其写入
$RUN_DIR/operator-note。内容包括:上传退出码为 3 时的 "upgrade gh";第 5 步的拒绝原因,以及可清除此问题的手动编辑;如果附加后未写入正文(上传退出码为 4,或第 5 步退出码为 1 到 3),则引用 PR 上现有的附加内容尾部,取自after.md中超出pre-image.md前缀的部分。 -
报告。 如果第 6 步写入了操作员备注,则添加
--operator-note-file "$RUN_DIR/operator-note":node "<skill-dir>/scripts/write-result.mjs" "$RUN_DIR"命令会打印
outcome <value>;退出码为 1 时会打印failed <assertion>(结果为unverified):绝不要重试、重写或还原正文。报告结果和每项失败。