Stats
Actions
Tags
From ios-from-web-guide
Runs Node.js hooks on Bash commands, file writes, session start, and subagent start. PreToolUse hook can block Bash calls; PostToolUse hook runs after file edits.
4 events · 5 hooks
Safety signals detected in this hook configuration
Where this hook configuration is defined
Defined in hooks/hooks.json
Event handlers and matchers — expand Raw Configuration for the full JSON
Bashbash "${CLAUDE_PLUGIN_ROOT}/scripts/bash-guard.sh"Write|Editbash "${CLAUDE_PLUGIN_ROOT}/scripts/hook-lint.sh" preWrite|Editbash "${CLAUDE_PLUGIN_ROOT}/scripts/hook-lint.sh" postbash "${CLAUDE_PLUGIN_ROOT}/scripts/detect_project.sh" 2>/dev/null; exit 0printf '%s\n' '## iOS From Web Guide — Rules for Subagents
You are working in an iOS/SwiftUI project. Follow these rules strictly.
### SwiftUI Navigation
1. Use `.buttonStyle(.borderless)` on Buttons inside a NavigationLink, never `.plain`
2. Hoist `navigationDestination(for:)` to the root view that owns the NavigationStack
3. Prefer `NavigationLink(value:)` + `navigationDestination(for:)` over `NavigationLink(destination:)` (deprecated)
### State Management
1. Use `@Observable` (iOS 17+). Never `@Published`/`@ObservedObject`/`@StateObject`
2. Let Swift auto-synthesize Hashable. Never write a custom id-only `==` on a model struct
3. In Views, use `@State private var viewModel = FooViewModel()` for Observable classes
### API / Auth
1. Store tokens in Keychain (KeychainService). Never UserDefaults
2. Use snake_case on the wire — `.convertToSnakeCase` / `.convertFromSnakeCase` on JSONEncoder/Decoder
3. Always resolve relative paths via `.asBackendURL` — never `URL(string: relativePath)`
4. APIClient handles base URL internally; call sites pass relative paths
### Shipping
1. `CURRENT_PROJECT_VERSION` must strictly increment between TestFlight uploads
2. The primary app icon must be RGB, no alpha (dark variant: transparent background is expected; tinted: opaque grayscale)
3. Every import of PhotosUI/AVFoundation/CoreLocation/ATT requires its Usage Description in Info.plist
4. Keep `DEVELOPMENT_TEAM` in project.yml, not Xcode (XcodeGen wipes Xcode-only edits)
### Layout
1. Use `.containerRelativeFrame(.horizontal, alignment: .leading)` to pin width in ScrollView. `.frame(maxWidth: .infinity)` accepts infinity but does not cap'; exit 0npx claudepluginhub j-morgan6/ios-from-web-guide --plugin ios-from-web-guide4plugins reuse this hooks config
First indexed Mar 15, 2026