modules/home/coding-agents/common/skills/macos-gui-debug/SKILL.md
Verify a rendering or window-chrome change in any macOS GUI app unattended — find its CGWindowID via JXA, capture that window alone (with per-pixel alpha) using screencapture -l, and read exact RGBA via NSBitmapImageRep. Use for blur/opacity/corner-radius/glyph/color rendering bugs where a screenshot or pixel value is the ground truth. No Python and no Accessibility permission needed; for Linux/Wayland use wayland-gui-debug instead.
npx skillsauth add natsukium/dotfiles macos-gui-debugInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Verify a rendering or window-chrome change by launching the app,
capturing just its window, and probing pixels. None of this needs
Accessibility permission. (System Events / keystroke injection does
need it and is usually blocked — don't plan on typing into the window
unattended.) Screen Recording permission is required for screenshots:
if screencapture -x /tmp/full.png produces a non-black image, you
have it.
Throughout, replace MyApp with the app's window-owner name (what
shows in the menu bar / Activity Monitor) and myapp with the process
name for pkill -x.
./path/to/MyApp 2>/tmp/app.log & sleep 4 # or: open -a MyApp
WID=$(osascript -l JavaScript -e '
ObjC.import("CoreGraphics");
const list = ObjC.castRefToObject($.CGWindowListCopyWindowInfo($.kCGWindowListOptionOnScreenOnly, $.kCGNullWindowID));
const arr = ObjC.deepUnwrap(list);
const w = arr.filter(x => x.kCGWindowOwnerName === "MyApp")[0];
w ? w.kCGWindowNumber : "none";')
screencapture -o -l$WID /tmp/app-win.png # window only, no drop shadow
ObjC.castRefToObject is required — ObjC.deepUnwrap on the raw
CFArrayRef fails with "Ref has incompatible type".screencapture -o -l<id> captures the window's own composited
content with per-pixel alpha: a translucent background shows its
real alpha (e.g. 153 for opacity = 0.6), and rounded-corner pixels
read fully transparent. This is the ground truth for transparency /
corner-clip checks — a full-screen capture is not.kCGWindowBounds instead of assuming a fixed size. The
post-resize capture also catches relayout bugs (AppKit reorders
sublayers on the first layout pass).osascript -l JavaScript -e '
ObjC.import("AppKit");
const rep = $.NSBitmapImageRep.imageRepWithContentsOfFile("/tmp/app-win.png");
function p(x,y){const c=rep.colorAtXY(x,y);return [c.redComponent,c.greenComponent,c.blueComponent,c.alphaComponent].map(v=>Math.round(v*255)).join(",");}
const h = rep.pixelsHigh*1, w = rep.pixelsWide*1;
JSON.stringify({w:w,h:h,center:p(Math.floor(w/2),Math.floor(h/2)),tl:p(2,2),bl:p(2,h-3),br:p(w-3,h-3)});'
0,0,0,0 = the rounded clip works.NSVisualEffectView) behind a
Metal/CALayer reads centre alpha 255 even when "transparent" —
that's the opaque blur material, not a transparency failure. Test raw
alpha with blur disabled.pkill -x myapp — match the exact process name. Never
pkill -f path/to/MyApp, which also matches helper processes
(renderers, daemons) whose argv contains that path and can kill
unrelated user sessions.screencapture -x -R<x,y,w,h> fails with "could not create image
from rect" across display boundaries. Capture per display (-D 1,
-D 2) or stick to window captures (-l<id>), which are
display-agnostic.development
Verify a rendering or window-chrome change in a GUI app unattended on Linux/Wayland under the niri compositor — enumerate windows and read output scale via niri msg --json, capture a specific window to a file with niri msg action screenshot-window --id, and probe exact pixel RGBA with ImageMagick. Use for layout/glyph/color/HiDPI rendering bugs where a screenshot or pixel value is the ground truth. For macOS use macos-gui-debug instead.
development
Clone and reuse GitHub/GitLab repositories under a single managed root (`ghq root`) instead of fetching files one-by-one via `gh api`/`WebFetch` or scratch-cloning into `/tmp`. Use this skill whenever investigating, reading, grepping, or referencing source code from any remote repository — even for a single file. Triggers include "look at X's source", "how does X implement Y", "check the X repo", "find Z in nixpkgs/react/linux/etc.", or any moment a remote repo URL appears and you need to read more than one file from it. Skip only for one-shot GitHub API operations that have no source code in them (PR comments, issue bodies, workflow runs — those belong to the `gh` skill).
tools
GitHub CLI for pull requests, issues, releases, workflows, and repository operations. Use for creating PRs, managing issues, viewing repository information, and accessing GitHub URLs.
tools
AST-based code search and transformation tool using tree-sitter. Use for structural pattern matching, refactoring deprecated APIs, detecting anti-patterns, migrating code between library versions, and enforcing coding standards.