Every skill now runs bin/gstack-update-check on invocation. If an upgrade
is available, reads gstack-upgrade/SKILL.md inline upgrade flow.
Also adds AskUserQuestion to 5 skills that lacked it (gstack root, browse,
qa, retro, setup-browser-cookies) and Bash to plan-eng-review.
Simplifies qa and setup-browser-cookies setup blocks (removes META parsing).
Fast headless browser for QA testing and site dogfooding. Navigate any URL, interact with
elements, verify page state, diff before/after actions, take annotated screenshots, check
responsive layouts, test forms and uploads, handle dialogs, and assert element states.
~100ms per command. Use when you need to test a feature, verify a deployment, dogfood a
user flow, or file a bug with evidence.
If output shows UPGRADE_AVAILABLE <old> <new>: read ~/.claude/skills/gstack/gstack-upgrade/SKILL.md and follow the "Inline upgrade flow" (AskUserQuestion → upgrade if yes, touch ~/.gstack/last-update-check if no). If JUST_UPGRADED <from> <to>: tell user "Running gstack v{to} (just updated!)" and continue.
browse: QA Testing & Dogfooding
Persistent headless Chromium. First call auto-starts (~3s), then ~100ms per command.
State persists between calls (cookies, tabs, login sessions).
Core QA Patterns
1. Verify a page loads correctly
$B goto https://yourapp.com
$B text # content loads?$B console # JS errors?$B network # failed requests?$B is visible ".main-content"# key elements present?
2. Test a user flow
$B goto https://app.com/login
$B snapshot -i # see all interactive elements$B fill @e3 "user@test.com"$B fill @e4 "password"$B click @e5 # submit$B snapshot -D # diff: what changed after submit?$B is visible ".dashboard"# success state present?
3. Verify an action worked
$B snapshot # baseline$B click @e3 # do something$B snapshot -D # unified diff shows exactly what changed
5. Find all clickable elements (including non-ARIA)
$B snapshot -C # finds divs with cursor:pointer, onclick, tabindex$B click @c1 # interact with them
6. Assert element states
$B is visible ".modal"$B is enabled "#submit-btn"$B is disabled "#submit-btn"$B is checked "#agree-checkbox"$B is editable "#name-field"$B is focused "#search-input"$B js "document.body.textContent.includes('Success')"
7. Test responsive layouts
$B responsive /tmp/layout # mobile + tablet + desktop screenshots$B viewport 375x812 # or set specific viewport$B screenshot /tmp/mobile.png
8. Test file uploads
$B upload "#file-input" /path/to/file.pdf
$B is visible ".upload-success"
9. Test dialogs
$B dialog-accept "yes"# set up handler$B click "#delete-button"# trigger dialog$B dialog # see what appeared$B snapshot -D # verify deletion happened
The snapshot is your primary tool for understanding and interacting with pages.
-i Interactive elements only (buttons, links, inputs) with @e refs
-c Compact (no empty structural nodes)
-d <N> Limit depth
-s <sel> Scope to CSS selector
-D Diff against previous snapshot (what changed?)
-a Annotated screenshot with ref labels
-o <path> Output path for screenshot
-C Cursor-interactive elements (@c refs — divs with pointer, onclick)
Combine flags: $B snapshot -i -a -C -o /tmp/annotated.png