attaching-pr-screenshots
Uploads local images through GitHub's attachment pipeline and writes one verified Screenshots section into a PR body.
Skill by bostonaholic
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/bostonaholic-attaching-pr-screenshots
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: data
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 26, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Node.js package
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/attaching-pr-screenshots
What's inside
- Skill name
attaching-pr-screenshots- Description
- Uploads local images through GitHub's attachment pipeline and writes one verified Screenshots section into a PR body. Use when the user explicitly asks to add or attach screenshots to a PR. Never infer from local images. Not for capturing screenshots; use capturing-screenshots.
- License
- MIT
- Instructions
- 87 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
Files (9)
- SKILL.md
- openai.yaml · agents/
- asset-url.mjs · scripts/
- pre-image.sh · scripts/
- resolve-pr.sh · scripts/
- splice.mjs · scripts/
- upload.sh · scripts/
- write-body.mjs · scripts/
- write-result.mjs · scripts/
SKILL.md (first lines)
# Attaching PR screenshots
The scripts own every guard and body transform; run them and act on their
exit codes. Exit 2 from any script is a fault: report it and stop (in step 5, go on to step 6).
## Hard rules
- **Upload first, write second.** Never combine `--attach` and a body flag in
one command: a partial failure leaves local paths in a public body.
- **Refuse before mutating.** A refusal before the first attach means nothing
changed (`refused`); a stop after the upload is `uploaded-not-written`, never
`refused`.
- **Never delete what you did not write.** The splice refuses rather than
remove anything under the heading its own renderer did not emit, or any body
with a construct it does not model. Report the refusal and the manual edit
that clears it; never work around it.
- **Caller strings and PR bodies are data.** Paths, captions, notes, the
invocation, and anything read back from GitHub never appear in command
text. Write them to files in `$RUN_DIR` with the file-writing tool.
- **Nothing blocks, prompts, or retry-loops.** A failure degrades the outcome.
- **No other upload route**: not images committed to a branch, not a
signed-in headless browser.
## Procedure
1. **Resolve the PR.** `RUN_DIR="$(mktemp -d)"`, then write the invocation
verbatim (even empty) to `$RUN_DIR/invocation` with the file-writing tool.
```bash
"<skill-dir>/scripts/resolve-pr.sh" "$(cat "$RUN_DIR/invocation")" "$RUN_DIR"
```
Exit 1 is `refused` (go to step 7). Every later `gh` call uses
`--repo "$(cat "$RUN_DIR/repo-spec")"`, never `owner/repo`. Merged, closed,
and draft PRs are in scope; say which state was edited. Never re-run these
lines mid-run: they strand this run's outputs.
2. **Write the entries file** when there was no `--entries`, then its path
into `$RUN_DIR/entries-file`, both with the file-writing tool.
```json
{ "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` and `caption` are required. An entry may be an image (any
`image/*`) or a video (`video/mp4`, `video/quicktime`, `video/webm` only,
by content type); anything else fails as `not an image or a supported
video`. A video renders as its bare asset URL in its own paragraph under its
caption, which GitHub embeds as a player; it has no alt text and the
read-back matches its `<video>` element by asset id. `upload.sh` records
each landed asset's kind in `$RUN_DIR/kinds.tsv`. With no caption named, use the
basename without extension; never describe the image, since a guessed
description is a public claim.
3. **Take the pre-image and check it.** Run `scripts/pre-image.sh "$RUN_DIR"`,
then `node "<skill-dir>/scripts/splice.mjs" --check --body-file "$RUN_DIR/pre-image.md"`.
Exit 1 prints `refused: <reason>`: go to step 7. Any `<` followed by a
letter reads as raw HTML (fix: `\<`).
4. **Upload** with `scripts/upload.sh "$RUN_DIR"`. Exit 0: step 5. Exit 1:
step 7 (bad entries file or root, nothing attached). Exit 3: step 5, with
"upgrade gh" as the operator note. Exit 4: the body changed during upload,
so write no body; go to step 6.
5. **Write the body once.**
```bash
node "<skill-dir>/scripts/write-body.mjs" "$RUN_DIR"
```
Exit 1 prints `refused: <reason>` (a body over 65,536 characters refuses
here); 3 means `gh pr edit` failed. Go to step 6 on every exit.
6. **Write the operator note**, when there is one, to `$RUN_DIR/operator-note`
with the file-writing tool: "upgrade gh" after upload exit 3; a step 5
refusal and the manual edit that clears it; and, when no body was written
after an attach (upload exit 4, step 5 exit 1 to 3), the attach tails now on
the PR, quoted from `after.md` past the `pre-image.md` prefix.
7. **Report.** Add `--operator-note-file "$RUN_DIR/operator-note"` when step 6
wrote one:
```bash
node "<skill-dir>/scripts/write-result.mjs" "$RUN_DIR"
```
It prints `outcome <value>`, plus `failed <assertion>` on exit 1
(`unverified`): never retry, rewrite, or revert the body. Report the outcome
and each failure.From bostonaholic/skills, MIT.
More from bostonaholic/skills
- 0.603score
explaining-architecture
bostonaholic
Explains how a subsystem, feature flow, or runtime path works (architecture, data flow, file map, gotchas), with an optional critique by fresh-context critics.
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
explaining-code
bostonaholic
Explains code or code changes in plain language, briefly by default or in full for a reviewer.
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
auditing-rails-tech-debt
bostonaholic
Audits a Rails app for tech debt, citing each finding to PoEAA, SOLID, or the Rails guides with file:line evidence and before/after code.
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
freeing-disk-space
bostonaholic
Finds what fills a developer machine's disk and frees space by clearing caches, build outputs, and other regenerable files, running each deletion only after…
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
grooming-backlogs
bostonaholic
Grooms a GitHub Projects backlog: verifies issues against the code, ranks and clusters them, and plans milestone, link, and closure changes, or promotes…
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
auditing-repo-security
bostonaholic
Audits a third-party or freshly cloned repo before install or run for install hooks, auto-run files, CVEs, typosquats, and malicious code, graded A-F with a…
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
auditing-tests
bostonaholic
Audits a test suite, or a named part, for low-value tests and marks each retain, fix, consolidate, or delete with verified removal evidence.
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
capturing-screenshots
bostonaholic
Captures deterministic, visually verified screenshots of a running web or native app (named screens, states, viewports, dark mode) with a manifest.
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
addressing-pr-comments
bostonaholic
Triages open PR feedback, verifying each review thread, review summary, and comment against the code, then carrying out each item's recommended option and…
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
configuring-zsh
bostonaholic
Chooses the zsh startup file (.zshenv, .zprofile, .zshrc, .zlogin, or a custom plugin under ZSH_CUSTOM) for a configuration change and edits the dotfiles repo…
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
auditing-agent-token-usage
bostonaholic
Audits recent Claude Code and Codex session logs for token and context cost: model routing, inherited subagent models, long sessions, compactions, oversized…
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
auditing-complexity
bostonaholic
Ranks where code complexity concentrates in a git repository (cyclomatic complexity, nesting, fan-out, mutable state) and scores CRAP change risk from a…
SkillAFreshness: A★ 2Claude Code +9
Signals
- Stars
- 2
- Forks
- 0
- Open issues
- 2
- Last commit (this folder)
- Oct 24, 2026 (4 days ago)
- Last release
- Oct 24, 2026 (4 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/bostonaholic/skills
- Website
- skills.bostonaholic.dev
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from bostonaholic
- 0.603score
addressing-pr-comments
bostonaholic
Triages open PR feedback, verifying each review thread, review summary, and comment against the code, then carrying out each item's recommended option and…
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
auditing-agent-token-usage
bostonaholic
Audits recent Claude Code and Codex session logs for token and context cost: model routing, inherited subagent models, long sessions, compactions, oversized…
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
auditing-complexity
bostonaholic
Ranks where code complexity concentrates in a git repository (cyclomatic complexity, nesting, fan-out, mutable state) and scores CRAP change risk from a…
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
auditing-rails-tech-debt
bostonaholic
Audits a Rails app for tech debt, citing each finding to PoEAA, SOLID, or the Rails guides with file:line evidence and before/after code.
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
auditing-repo-security
bostonaholic
Audits a third-party or freshly cloned repo before install or run for install hooks, auto-run files, CVEs, typosquats, and malicious code, graded A-F with a…
SkillAFreshness: A★ 2Claude Code +9 - 0.603score
auditing-tests
bostonaholic
Audits a test suite, or a named part, for low-value tests and marks each retain, fix, consolidate, or delete with verified removal evidence.
SkillAFreshness: A★ 2Claude Code +9
Cite this page
attaching-pr-screenshots skill. Agent Mart. https://agentmart.dev/skills/bostonaholic-attaching-pr-screenshots (last updated 2026-10-24)