gstack/ios-clean/SKILL.md.tmpl

105 lines
3.8 KiB
Cheetah

---
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.