mirror of
https://github.com/garrytan/gstack.git
synced 2026-08-19 04:27:19 +02:00
feat(ios): author 5 iOS device-farm skill templates + generated docs
Authors ios-qa, ios-fix, ios-design-review, ios-clean, ios-sync as upstream gstack skills. Each follows the standard SKILL.md.tmpl pattern with preamble-tier:3 frontmatter. The fork at time-attack/gstack shipped these but as byte-identical .md/.tmpl pairs that wouldn't pass skill-docs.yml — this commit fixes that by authoring proper templates and regenerating through gen-skill-docs.
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
---
|
||||
name: ios-clean
|
||||
preamble-tier: 3
|
||||
version: 1.0.0
|
||||
description: |
|
||||
Remove the DebugBridge SPM package and all #if DEBUG wiring from an iOS
|
||||
app. Cleans up StateServer, DebugOverlay, accessor codegen output, and
|
||||
app-side hooks installed by /ios-qa. This is a convenience wrapper —
|
||||
the structural Release-build guard (Package.swift conditional + CI
|
||||
swift build -c release check) is the safety-critical path.
|
||||
Use when asked to "clean the iOS debug bridge", "remove DebugBridge",
|
||||
or "strip the gstack iOS instrumentation". (gstack)
|
||||
voice-triggers:
|
||||
- "clean the iOS debug bridge"
|
||||
- "remove DebugBridge"
|
||||
- "strip the gstack iOS instrumentation"
|
||||
allowed-tools:
|
||||
- Bash
|
||||
- Read
|
||||
- Edit
|
||||
- Glob
|
||||
- Grep
|
||||
- AskUserQuestion
|
||||
triggers:
|
||||
- clean the ios debug bridge
|
||||
- remove debugbridge
|
||||
- strip the gstack ios instrumentation
|
||||
---
|
||||
|
||||
{{PREAMBLE}}
|
||||
|
||||
# Strip the DebugBridge from an iOS app
|
||||
|
||||
This skill is a **convenience flow**, not a safety mechanism. The structural
|
||||
guard against shipping DebugBridge in Release is in `Package.swift.template`
|
||||
(`.when(configuration: .debug)`) plus the CI invariant test that runs
|
||||
`swift build -c release` and asserts the DebugBridge symbol is absent. Both
|
||||
ship as part of `/ios-qa`'s template installation.
|
||||
|
||||
This skill exists for developers who:
|
||||
|
||||
- Manually copied DebugBridge files (without using `/ios-qa`'s SPM install).
|
||||
- Want a guided, reversible removal flow before a security audit.
|
||||
- Are migrating away from gstack and want a clean exit.
|
||||
|
||||
## What it removes
|
||||
|
||||
Each item is reverted only after AskUserQuestion confirmation:
|
||||
|
||||
1. The `DebugBridge` SPM target from `Package.swift`.
|
||||
2. The `#if DEBUG` block in the app's `@main` entry that calls
|
||||
`DebugBridgeManager.shared.start()`.
|
||||
3. Any `@Snapshotable` property wrappers on the canonical app state struct
|
||||
(the codegen-detection markers — the wrapper file lives inside
|
||||
DebugBridge so removing the SPM dep removes the wrapper too).
|
||||
4. Generated `StateAccessor.swift` files anywhere under the app source.
|
||||
5. The `gstack-ios-qa.token` file under `NSTemporaryDirectory()` on the
|
||||
device (best-effort — only works if device is connected when /ios-clean
|
||||
runs).
|
||||
|
||||
## What it does NOT touch
|
||||
|
||||
- App business logic, view models, view code.
|
||||
- Anything outside `#if DEBUG` blocks.
|
||||
- Other test or QA infrastructure.
|
||||
|
||||
## Phase 1: Inventory
|
||||
|
||||
1. Glob for `import DebugBridge` across the app source.
|
||||
2. Glob for `#if DEBUG ... DebugBridgeManager` blocks.
|
||||
3. Glob for `// Auto-generated state accessor` headers in
|
||||
`StateAccessor.swift` files.
|
||||
4. Parse `Package.swift` for the DebugBridge dependency entry.
|
||||
5. Show the user what's about to be removed (file list + line counts).
|
||||
AskUserQuestion: proceed, dry-run, or abort.
|
||||
|
||||
## Phase 2: Remove
|
||||
|
||||
For each item the user approved:
|
||||
|
||||
1. Use Edit tool to strip the import + the `#if DEBUG` block (keep the
|
||||
surrounding code intact).
|
||||
2. Use Edit tool to remove the `.package(url:...DebugBridge...)` entry
|
||||
from `Package.swift` and any `targets` referencing `"DebugBridge"`.
|
||||
3. Delete generated `StateAccessor.swift` files.
|
||||
4. Run `xcodebuild -scheme <SchemeName> -destination 'platform=iOS,id=<UDID>'
|
||||
build install -configuration Release` to verify Release builds without
|
||||
the bridge. If it fails on a missing DebugBridge symbol, the removal
|
||||
was incomplete — STOP and report.
|
||||
|
||||
## Phase 3: Verify
|
||||
|
||||
1. `! grep -r "DebugBridge" <app-source-dir>` (no matches).
|
||||
2. `! grep -r "@Snapshotable" <app-source-dir>` (no matches).
|
||||
3. `swift build -c release` succeeds.
|
||||
4. `nm -j` on the built binary doesn't show DebugBridge symbols.
|
||||
|
||||
Report the cleanup result + a one-line summary of what got removed.
|
||||
|
||||
## Reversibility
|
||||
|
||||
Every Edit + delete is a git operation; the user can `git restore` to undo.
|
||||
This skill never force-pushes, never amends, never deletes the SPM cache —
|
||||
those are user choices.
|
||||
Reference in New Issue
Block a user