mirror of
https://github.com/garrytan/gstack.git
synced 2026-09-21 20:30:47 +02:00
Detect host-native browser tools before offering the isolated local Chromium fallback, add a common readiness fixture, harden managed browser startup, and verify standards installs expose one canonical QA skill.
94 lines
4.2 KiB
Markdown
94 lines
4.2 KiB
Markdown
<!-- GENERATED by scripts/gstack2/generate-skill-tree.ts; do not edit. -->
|
|
<!-- GSTACK2_PROVENANCE source=ios-sync/SKILL.md.tmpl base=bb57306d98c97011b0919c6132705a15b1579781 blob=156a33c4c35d3bad804e44c93ae4c931878489f3 baseline_render_sha256=3b3bbcd550b43c26761774c1f9c461c3af53a1b4cbcbc722d9dbc024d317acbd ported_render_sha256=88f9f20aa406c13098ebd2709afc6487bb42c5466ac9f757bf4d9baff7f028d0 disposition=BUG_FIX -->
|
|
<!-- GSTACK2_ROUTING replacement=$ship --mode Prepare --module ios-sync visibility=internal depth=standard mutation=code-generation web=none -->
|
|
|
|
<!-- GSTACK2_LEGACY_BODY_START source=ios-sync -->
|
|
## Host-neutral runtime bindings
|
|
|
|
These assignments select stable paths only; they do not install anything or grant consent:
|
|
|
|
```bash
|
|
GSTACK_HOME="${GSTACK_HOME:-$HOME/.gstack}"
|
|
GSTACK_ROOT="$GSTACK_HOME"
|
|
GSTACK_STATE_ROOT="$GSTACK_HOME"
|
|
GSTACK_BIN="$GSTACK_HOME/bin"
|
|
BUN_CMD="$GSTACK_BIN/bun"
|
|
B="$GSTACK_BIN/browse"
|
|
D="$GSTACK_BIN/gstack-design"
|
|
P="$GSTACK_BIN/make-pdf"
|
|
```
|
|
# Resync the iOS debug bridge
|
|
|
|
After `$qa --mode Report --module ios-qa` is installed in an app, the user may:
|
|
|
|
1. Add new `@Observable` classes or properties that need accessor coverage.
|
|
2. Upgrade gstack to a newer version with hardening fixes.
|
|
3. Move the `@Snapshotable` marker to a different field.
|
|
|
|
This skill regenerates the relevant artifacts in place.
|
|
|
|
**Templates live in upstream gstack.** This skill resolves them from
|
|
`references/artifacts/ios-qa/templates/` (or the worktree's
|
|
`ios-qa/templates/` when developing gstack itself). The fork's HTTP-fetch
|
|
pattern is gone.
|
|
|
|
## Phase 1: Detect installed version
|
|
|
|
1. Read `<app>/DebugBridgeGenerated/.gstack-version` (written by $qa --mode Report --module ios-qa
|
|
during install). If missing, treat the install as "unknown old version".
|
|
2. Read upstream version from the version reported by `$GSTACK_BIN/gstack --version`.
|
|
3. If versions match AND no new `@Observable` classes were added, exit
|
|
early with "already up to date".
|
|
|
|
## Phase 2: Regenerate codegen output
|
|
|
|
Run `gstack-ios-qa-regen` (or the underlying SwiftPM tool directly):
|
|
|
|
```bash
|
|
swift run --package-path "$($GSTACK_BIN/gstack runtime path ios-qa/scripts/gen-accessors-tool)" \
|
|
gen-accessors --input "$APP_SOURCE_DIR" --output "$APP_SOURCE_DIR/DebugBridgeGenerated"
|
|
```
|
|
|
|
The composite-hash cache key handles whether anything actually needs
|
|
regenerating; if Swift version, generator git rev, lockfile, source content,
|
|
and platform triple all match the cache, this is a ~50ms no-op.
|
|
|
|
## Phase 3: Update templated Swift files in place
|
|
|
|
For each file that comes from `ios-qa/templates/*.swift.template`:
|
|
|
|
1. Read the current installed file at
|
|
`<app>/DebugBridgeGenerated/<Name>.swift`.
|
|
2. Read the upstream template at
|
|
`references/artifacts/ios-qa/templates/<Name>.swift.template`.
|
|
3. If the installed file has a `// GSTACK-EDIT-LINE` marker, fold the user's
|
|
edits forward.
|
|
4. Otherwise, replace the file outright with the new template (after
|
|
AskUserQuestion if the diff is non-trivial).
|
|
|
|
## Phase 4: Verify
|
|
|
|
1. `swift build` succeeds against the app's package.
|
|
2. `xcodebuild -scheme <SchemeName>` succeeds.
|
|
3. Re-launch the app on the device; daemon connects + rotates token.
|
|
4. `GET /state/snapshot` returns the new accessor schema hash.
|
|
|
|
## Failure modes
|
|
|
|
| Symptom | Action |
|
|
|---|---|
|
|
| Swift compile fails after regen | Revert via `git restore` + AskUserQuestion: surface the compile error |
|
|
| Schema hash unchanged after adding new @Observable | The new class isn't marked `@Snapshotable` — the codegen excludes it correctly. If the user wanted it snapshotted, add the wrapper. |
|
|
| `--input` source dir contains test fixtures | gen-accessors scans the input dir recursively; exclude test/ via `--exclude` |
|
|
<!-- GSTACK2_LEGACY_BODY_END source=ios-sync -->
|
|
|
|
<!-- GSTACK2_BUG_FIX_START pr=679 anchor=GSTACK2_FIX_679_MATCH_USER_LANGUAGE -->
|
|
## Upstream judgment port: PR #679
|
|
|
|
[Match the user language](https://github.com/garrytan/gstack/pull/679)
|
|
|
|
### User-language rule
|
|
|
|
Write questions, progress updates, reports, and artifacts in the language used by the user. Source material, code identifiers, commands, and quotations may remain in their original language when translating them would reduce accuracy.
|
|
<!-- GSTACK2_BUG_FIX_END pr=679 -->
|