← All skills
ios-qa
67 / 100 · Review before installing
Check before installing.
By garrytan/gstack (GitHub) · other · 141,312 stars · scanned at commit bc858ff
Live-device iOS QA for SwiftUI apps. (gstack)
Works with any agent that supports SKILL.md skills.
What this skill can do
Runs commands on your computer
This is disclosed by the author in the skill's SKILL.md or README.
Found in 31 places.
Show 17 more
- ios-qa/SKILL.md, line 107
GSTACK_STATE_ROOT=$(~/.claude/skills/gstack/bin/gstack-paths --get GSTACK_STATE_ROOT); : "${GSTACK_STATE_ROOT:?gstack-paths failed; reinstall with ./setup or /g - ios-qa/SKILL.md, line 123
~/.claude/skills/gstack/bin/gstack-skill-end --skill "ios-qa" --outcome OUTCOME \ - ios-qa/SKILL.md, line 192
GSTACK_STATE_ROOT=$(~/.claude/skills/gstack/bin/gstack-paths --get GSTACK_STATE_ROOT); : "${GSTACK_STATE_ROOT:?gstack-paths failed; reinstall with ./setup or /g - ios-qa/SKILL.md, line 236
~/.claude/skills/gstack/bin/gstack-ios-qa-regen \ - ios-qa/daemon/src/devicectl.ts, line 7
import { spawnSync, type SpawnSyncReturns } from 'child_process'; - ios-qa/daemon/src/devicectl.ts, line 32
const defaultSpawn: SpawnImpl = (cmd, args) => spawnSync(cmd, args, { stdio: 'pipe', timeout: 60_000 }); - ios-qa/daemon/src/single-instance.ts, line 11
import { spawn } from 'child_process'; - ios-qa/daemon/src/tunnel-bootstrap.ts, line 24
import { spawnSync } from 'child_process'; - ios-qa/daemon/src/tunnel-bootstrap.ts, line 171
const defaultSpawn: SpawnImpl = (cmd, args) => spawnSync(cmd, args, { - ios-qa/daemon/test/cli-mint.test.ts, line 10
import { spawnSync } from 'child_process'; - ios-qa/daemon/test/cli-mint.test.ts, line 17
return spawnSync(MINT_BIN, args, { stdio: 'pipe', encoding: 'utf-8', timeout: 30_000 }); - ios-qa/daemon/test/cli-mint.test.ts, line 111
const r = spawnSync(DAEMON_BIN, [], { - ios-qa/daemon/test/devicectl-launch-env.test.ts, line 7
import type { SpawnSyncReturns } from 'child_process'; - ios-qa/scripts/gen-accessors.test.ts, line 11
import { spawnSync } from 'child_process'; - ios-qa/scripts/gen-accessors.test.ts, line 609
const result = spawnSync('bun', [ - ios-qa/scripts/gen-accessors.test.ts, line 721
if (spawnSync('swiftc', ['--version'], { encoding: 'utf8', timeout: 30_000 }).status !== 0) return; - ios-qa/scripts/gen-accessors.test.ts, line 750
const emitModule = spawnSync('swiftc', [
and 11 more places
Connects to the internet
The author does not mention this.
Found in 16 places.
Show 13 more
- ios-qa/daemon/test/loopback-request.test.ts, line 51
const res = await fetch(base() + route, { - ios-qa/daemon/test/loopback-request.test.ts, line 65
const res = await fetch(base() + '/session/acquire', { - ios-qa/daemon/test/loopback-request.test.ts, line 78
const res = await fetch(base() + '/screenshot', { headers: { Host: host } }); - ios-qa/daemon/test/loopback-request.test.ts, line 81
const sameOrigin = await fetch(base() + '/healthz', { headers: { Origin: base() } }); - ios-qa/daemon/test/loopback-request.test.ts, line 90
const res = await fetch(base() + route, { headers: { 'Sec-Fetch-Site': site, 'Sec-Fetch-Mode': 'no-cors' } }); - ios-qa/daemon/test/proxy-transport.test.ts, line 358
const request = () => fetch(url, { - ios-qa/daemon/test/proxy-transport.test.ts, line 407
const result = await fetch(`http://127.0.0.1:${daemon.loopbackPort}/screenshot`, { - ios-qa/daemon/test/proxy-transport.test.ts, line 444
const result = await fetch(`http://127.0.0.1:${daemon.loopbackPort}/${method === 'GET' ? 'screenshot' : 'tap'}`, { - ios-qa/daemon/test/proxy-transport.test.ts, line 480
const first = await fetch(url, { headers: { connection: 'close' }, signal: AbortSignal.timeout(SCHEDULING_TOLERANCE_MS) }); - ios-qa/daemon/test/proxy-transport.test.ts, line 486
const next = await fetch(url, { headers: { connection: 'close' }, signal: AbortSignal.timeout(SCHEDULING_TOLERANCE_MS) }); - ios-qa/daemon/test/session-cache.test.ts, line 114
const res = await fetch(`http://127.0.0.1:${d.loopbackPort}${path}`, { method, body: method === 'POST' ? '{}' : undefined }); - ios-qa/docs/tailscale-acl-example.md, line 85
curl -X POST http://<mac-tailnet-ip>:9999/auth/mint \ - lib/result-codes-release.ts, line 42
fix: 'fix the fetch (git fetch origin <base>), then rerun the same command',
Downloads and installs other software
The author does not mention this.
Found in 1 place.
Changes files outside its own folder
The author does not mention this.
Found in 1 place.
Safer alternatives
Low-risk skills in the same category (other) that look related. Check that one does what you need.
Install
Paste this into your terminal. It downloads exactly the version we scanned, not whatever is newest.
if [ -e ~/.agents/skills/'ios-qa' ] || [ -L ~/.agents/skills/'ios-qa' ]; then echo 'A skill folder named ios-qa already exists — not replacing it' >&2; false; else d=$(mktemp -d) && git clone --quiet --filter=blob:none --no-checkout 'https://github.com/garrytan/gstack' "$d" && git -C "$d" checkout --quiet 'bc858ffc659bcc61558f60d0e023a009817dd48f' -- 'ios-qa' && mkdir -p ~/.agents/skills && cp -R "$d"/'ios-qa' ~/.agents/skills/'ios-qa' && rm -rf "$d"; fi
Codex reads ~/.agents/skills directly. For Claude Code, Cursor, Copilot, Gemini CLI, Antigravity or OpenCode, also link it. For Claude Code: ln -s ~/.agents/skills/'ios-qa' ~/.claude/skills/'ios-qa' (other agents: ~/.cursor/skills, ~/.copilot/skills, ~/.gemini/skills, ~/.gemini/config/skills, ~/.config/opencode/skills). Or install through the finder skill, which does both.
Badge for your README
The badge for garrytan/gstack shows the score of its lowest-scoring skill.

[](https://zalavijaysinh.github.io/skilltrust/repos/garrytan/gstack/)
Score history
| Date | Version | Score |
|---|
| 2026-11-12 | bc858ff | 67 |
| 2026-11-11 | f0cd9f8 | 67 |
| 2026-11-10 | 6b32714 | 67 |
| 2026-11-09 | c25580e | 67 |
| 2026-11-08 | 9740bfd | 67 |
| 2026-11-08 | d479c5b | 67 |
| 2026-11-06 | 0c41ced | 57 |