buildanything 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +55 -0
- package/README.md +71 -61
- package/agents/ios-app-review-guardian.md +49 -0
- package/agents/ios-foundation-models-specialist.md +46 -0
- package/agents/ios-storekit-specialist.md +52 -0
- package/agents/ios-swift-architect.md +102 -0
- package/agents/ios-swift-search.md +130 -0
- package/agents/ios-swift-ui-design.md +104 -0
- package/commands/build.md +80 -176
- package/commands/fix.md +65 -0
- package/commands/setup.md +73 -0
- package/commands/ux-review.md +63 -0
- package/commands/verify.md +72 -0
- package/hooks/session-start +18 -1
- package/package.json +5 -2
- package/protocols/brainstorm.md +99 -0
- package/protocols/build-fix.md +52 -0
- package/protocols/cleanup.md +54 -0
- package/protocols/design.md +269 -0
- package/protocols/eval-harness.md +61 -0
- package/protocols/fake-data-detector.md +64 -0
- package/protocols/ios-context.md +235 -0
- package/protocols/ios-frameworks-map.md +323 -0
- package/protocols/ios-phase-branches.md +162 -0
- package/protocols/ios-preflight.md +27 -0
- package/protocols/metric-loop.md +93 -0
- package/protocols/planning.md +87 -0
- package/protocols/smoke-test.md +110 -0
- package/protocols/verify.md +67 -0
- package/protocols/web-phase-branches.md +201 -0
- package/skills/ios/_VENDORED.md +60 -0
- package/skills/ios/activitykit/LICENSE +131 -0
- package/skills/ios/activitykit/SKILL.md +505 -0
- package/skills/ios/activitykit/references/activitykit-patterns.md +868 -0
- package/skills/ios/app-intents/LICENSE +131 -0
- package/skills/ios/app-intents/SKILL.md +494 -0
- package/skills/ios/app-intents/references/appintents-advanced.md +1076 -0
- package/skills/ios/apple-on-device-ai/LICENSE +131 -0
- package/skills/ios/apple-on-device-ai/SKILL.md +505 -0
- package/skills/ios/apple-on-device-ai/references/coreml-conversion.md +425 -0
- package/skills/ios/apple-on-device-ai/references/coreml-optimization.md +344 -0
- package/skills/ios/apple-on-device-ai/references/foundation-models.md +508 -0
- package/skills/ios/apple-on-device-ai/references/mlx-swift.md +285 -0
- package/skills/ios/ios-26-platform/SKILL.md +53 -0
- package/skills/ios/ios-26-platform/references/automatic-adoption.md +161 -0
- package/skills/ios/ios-26-platform/references/backward-compat.md +238 -0
- package/skills/ios/ios-26-platform/references/liquid-glass.md +255 -0
- package/skills/ios/ios-26-platform/references/swiftui-apis.md +277 -0
- package/skills/ios/ios-26-platform/references/toolbar-navigation.md +250 -0
- package/skills/ios/ios-bootstrap/SKILL.md +98 -0
- package/skills/ios/ios-bootstrap/references/apple-docs-mcp-config.md +28 -0
- package/skills/ios/ios-bootstrap/references/new-project-dialog.md +41 -0
- package/skills/ios/ios-bootstrap/references/xcode-mcp-config.md +29 -0
- package/skills/ios/ios-debugger-agent/LICENSE +21 -0
- package/skills/ios/ios-debugger-agent/SKILL.md +58 -0
- package/skills/ios/ios-debugger-agent/agents/openai.yaml +4 -0
- package/skills/ios/ios-entitlements-generator/SKILL.md +47 -0
- package/skills/ios/ios-hig/SKILL.md +41 -0
- package/skills/ios/ios-hig/references/accessibility.md +81 -0
- package/skills/ios/ios-hig/references/content.md +142 -0
- package/skills/ios/ios-hig/references/feedback.md +123 -0
- package/skills/ios/ios-hig/references/interaction.md +199 -0
- package/skills/ios/ios-hig/references/performance-platform.md +129 -0
- package/skills/ios/ios-hig/references/privacy-permissions.md +181 -0
- package/skills/ios/ios-hig/references/visual-design.md +84 -0
- package/skills/ios/ios-info-plist-hardening/SKILL.md +130 -0
- package/skills/ios/ios-maestro-flow-author/SKILL.md +68 -0
- package/skills/ios/ios-maestro-flow-author/references/input-and-scroll.yaml +17 -0
- package/skills/ios/ios-maestro-flow-author/references/modal-and-dismiss.yaml +14 -0
- package/skills/ios/ios-maestro-flow-author/references/onboarding-flow.yaml +16 -0
- package/skills/ios/ios-maestro-flow-author/references/tab-navigation.yaml +13 -0
- package/skills/ios/ios-maestro-flow-author/references/tap-and-assert.yaml +9 -0
- package/skills/ios/swift-accessibility/LICENSE +21 -0
- package/skills/ios/swift-accessibility/SKILL.md +371 -0
- package/skills/ios/swift-accessibility/examples/before-after-appkit.md +446 -0
- package/skills/ios/swift-accessibility/examples/before-after-swiftui.md +441 -0
- package/skills/ios/swift-accessibility/examples/before-after-uikit.md +464 -0
- package/skills/ios/swift-accessibility/references/assistive-access.md +441 -0
- package/skills/ios/swift-accessibility/references/display-settings.md +491 -0
- package/skills/ios/swift-accessibility/references/dynamic-type.md +420 -0
- package/skills/ios/swift-accessibility/references/media-accessibility.md +421 -0
- package/skills/ios/swift-accessibility/references/motor-input.md +393 -0
- package/skills/ios/swift-accessibility/references/nutrition-labels.md +362 -0
- package/skills/ios/swift-accessibility/references/platform-specifics.md +515 -0
- package/skills/ios/swift-accessibility/references/semantic-structure.md +585 -0
- package/skills/ios/swift-accessibility/references/testing-auditing.md +507 -0
- package/skills/ios/swift-accessibility/references/voice-control.md +317 -0
- package/skills/ios/swift-accessibility/references/voiceover-swiftui.md +584 -0
- package/skills/ios/swift-accessibility/references/voiceover-uikit.md +519 -0
- package/skills/ios/swift-accessibility/references/wcag-mapping.md +167 -0
- package/skills/ios/swift-accessibility/resources/audit-template.swift +128 -0
- package/skills/ios/swift-accessibility/resources/qa-checklist.md +258 -0
- package/skills/ios/swift-concurrency/LICENSE +21 -0
- package/skills/ios/swift-concurrency/SKILL.md +171 -0
- package/skills/ios/swift-concurrency/references/_index.md +50 -0
- package/skills/ios/swift-concurrency/references/actors.md +660 -0
- package/skills/ios/swift-concurrency/references/async-algorithms.md +847 -0
- package/skills/ios/swift-concurrency/references/async-await-basics.md +266 -0
- package/skills/ios/swift-concurrency/references/async-sequences.md +710 -0
- package/skills/ios/swift-concurrency/references/core-data.md +560 -0
- package/skills/ios/swift-concurrency/references/glossary.md +135 -0
- package/skills/ios/swift-concurrency/references/linting.md +155 -0
- package/skills/ios/swift-concurrency/references/memory-management.md +569 -0
- package/skills/ios/swift-concurrency/references/migration.md +1104 -0
- package/skills/ios/swift-concurrency/references/performance.md +593 -0
- package/skills/ios/swift-concurrency/references/sendable.md +598 -0
- package/skills/ios/swift-concurrency/references/tasks.md +636 -0
- package/skills/ios/swift-concurrency/references/testing.md +592 -0
- package/skills/ios/swift-concurrency/references/threading.md +495 -0
- package/skills/ios/swift-security-expert/LICENSE +21 -0
- package/skills/ios/swift-security-expert/SKILL.md +470 -0
- package/skills/ios/swift-security-expert/references/biometric-authentication.md +565 -0
- package/skills/ios/swift-security-expert/references/certificate-trust.md +592 -0
- package/skills/ios/swift-security-expert/references/common-anti-patterns.md +690 -0
- package/skills/ios/swift-security-expert/references/compliance-owasp-mapping.md +537 -0
- package/skills/ios/swift-security-expert/references/credential-storage-patterns.md +721 -0
- package/skills/ios/swift-security-expert/references/cryptokit-public-key.md +505 -0
- package/skills/ios/swift-security-expert/references/cryptokit-symmetric.md +497 -0
- package/skills/ios/swift-security-expert/references/keychain-access-control.md +508 -0
- package/skills/ios/swift-security-expert/references/keychain-fundamentals.md +596 -0
- package/skills/ios/swift-security-expert/references/keychain-item-classes.md +476 -0
- package/skills/ios/swift-security-expert/references/keychain-sharing.md +458 -0
- package/skills/ios/swift-security-expert/references/migration-legacy-stores.md +727 -0
- package/skills/ios/swift-security-expert/references/secure-enclave.md +539 -0
- package/skills/ios/swift-security-expert/references/testing-security-code.md +781 -0
- package/skills/ios/swift-testing-expert/LICENSE +21 -0
- package/skills/ios/swift-testing-expert/SKILL.md +79 -0
- package/skills/ios/swift-testing-expert/references/_index.md +12 -0
- package/skills/ios/swift-testing-expert/references/async-testing-and-waiting.md +127 -0
- package/skills/ios/swift-testing-expert/references/expectations.md +145 -0
- package/skills/ios/swift-testing-expert/references/fundamentals.md +141 -0
- package/skills/ios/swift-testing-expert/references/migration-from-xctest.md +127 -0
- package/skills/ios/swift-testing-expert/references/parallelization-and-isolation.md +95 -0
- package/skills/ios/swift-testing-expert/references/parameterized-testing.md +284 -0
- package/skills/ios/swift-testing-expert/references/performance-and-best-practices.md +187 -0
- package/skills/ios/swift-testing-expert/references/traits-and-tags.md +114 -0
- package/skills/ios/swift-testing-expert/references/xcode-workflows.md +70 -0
- package/skills/ios/swiftdata-pro/LICENSE +21 -0
- package/skills/ios/swiftdata-pro/SKILL.md +102 -0
- package/skills/ios/swiftdata-pro/agents/openai.yaml +10 -0
- package/skills/ios/swiftdata-pro/assets/swiftdata-pro-icon.png +0 -0
- package/skills/ios/swiftdata-pro/assets/swiftdata-pro-icon.svg +29 -0
- package/skills/ios/swiftdata-pro/references/class-inheritance.md +104 -0
- package/skills/ios/swiftdata-pro/references/cloudkit.md +10 -0
- package/skills/ios/swiftdata-pro/references/core-rules.md +20 -0
- package/skills/ios/swiftdata-pro/references/indexing.md +27 -0
- package/skills/ios/swiftdata-pro/references/predicates.md +73 -0
- package/skills/ios/swiftui-design-principles/AGENTS.md +21 -0
- package/skills/ios/swiftui-design-principles/LICENSE +21 -0
- package/skills/ios/swiftui-design-principles/README.md +41 -0
- package/skills/ios/swiftui-design-principles/SKILL.md +605 -0
- package/skills/ios/swiftui-design-principles/metadata.json +10 -0
- package/skills/ios/swiftui-liquid-glass/LICENSE +21 -0
- package/skills/ios/swiftui-liquid-glass/SKILL.md +95 -0
- package/skills/ios/swiftui-liquid-glass/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-liquid-glass/references/liquid-glass.md +280 -0
- package/skills/ios/swiftui-performance-audit/LICENSE +21 -0
- package/skills/ios/swiftui-performance-audit/SKILL.md +111 -0
- package/skills/ios/swiftui-performance-audit/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-performance-audit/references/code-smells.md +150 -0
- package/skills/ios/swiftui-performance-audit/references/demystify-swiftui-performance-wwdc23.md +46 -0
- package/skills/ios/swiftui-performance-audit/references/optimizing-swiftui-performance-instruments.md +29 -0
- package/skills/ios/swiftui-performance-audit/references/profiling-intake.md +44 -0
- package/skills/ios/swiftui-performance-audit/references/report-template.md +47 -0
- package/skills/ios/swiftui-performance-audit/references/understanding-hangs-in-your-app.md +33 -0
- package/skills/ios/swiftui-performance-audit/references/understanding-improving-swiftui-performance.md +52 -0
- package/skills/ios/swiftui-pro/LICENSE +21 -0
- package/skills/ios/swiftui-pro/SKILL.md +108 -0
- package/skills/ios/swiftui-pro/agents/openai.yaml +10 -0
- package/skills/ios/swiftui-pro/assets/swiftui-pro-icon.png +0 -0
- package/skills/ios/swiftui-pro/assets/swiftui-pro-icon.svg +29 -0
- package/skills/ios/swiftui-pro/references/accessibility.md +13 -0
- package/skills/ios/swiftui-pro/references/api.md +39 -0
- package/skills/ios/swiftui-pro/references/data.md +43 -0
- package/skills/ios/swiftui-pro/references/design.md +31 -0
- package/skills/ios/swiftui-pro/references/hygiene.md +9 -0
- package/skills/ios/swiftui-pro/references/navigation.md +14 -0
- package/skills/ios/swiftui-pro/references/performance.md +46 -0
- package/skills/ios/swiftui-pro/references/swift.md +56 -0
- package/skills/ios/swiftui-pro/references/views.md +35 -0
- package/skills/ios/swiftui-ui-patterns/LICENSE +21 -0
- package/skills/ios/swiftui-ui-patterns/SKILL.md +100 -0
- package/skills/ios/swiftui-ui-patterns/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-ui-patterns/references/app-wiring.md +201 -0
- package/skills/ios/swiftui-ui-patterns/references/async-state.md +96 -0
- package/skills/ios/swiftui-ui-patterns/references/components-index.md +50 -0
- package/skills/ios/swiftui-ui-patterns/references/controls.md +57 -0
- package/skills/ios/swiftui-ui-patterns/references/deeplinks.md +66 -0
- package/skills/ios/swiftui-ui-patterns/references/focus.md +90 -0
- package/skills/ios/swiftui-ui-patterns/references/form.md +97 -0
- package/skills/ios/swiftui-ui-patterns/references/grids.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/haptics.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/input-toolbar.md +51 -0
- package/skills/ios/swiftui-ui-patterns/references/lightweight-clients.md +93 -0
- package/skills/ios/swiftui-ui-patterns/references/list.md +86 -0
- package/skills/ios/swiftui-ui-patterns/references/loading-placeholders.md +38 -0
- package/skills/ios/swiftui-ui-patterns/references/macos-settings.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/matched-transitions.md +59 -0
- package/skills/ios/swiftui-ui-patterns/references/media.md +73 -0
- package/skills/ios/swiftui-ui-patterns/references/menu-bar.md +101 -0
- package/skills/ios/swiftui-ui-patterns/references/navigationstack.md +159 -0
- package/skills/ios/swiftui-ui-patterns/references/overlay.md +45 -0
- package/skills/ios/swiftui-ui-patterns/references/performance.md +62 -0
- package/skills/ios/swiftui-ui-patterns/references/previews.md +48 -0
- package/skills/ios/swiftui-ui-patterns/references/scroll-reveal.md +133 -0
- package/skills/ios/swiftui-ui-patterns/references/scrollview.md +87 -0
- package/skills/ios/swiftui-ui-patterns/references/searchable.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/sheets.md +155 -0
- package/skills/ios/swiftui-ui-patterns/references/split-views.md +72 -0
- package/skills/ios/swiftui-ui-patterns/references/tabview.md +114 -0
- package/skills/ios/swiftui-ui-patterns/references/theming.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/title-menus.md +93 -0
- package/skills/ios/swiftui-ui-patterns/references/top-bar.md +49 -0
- package/skills/ios/swiftui-view-refactor/LICENSE +21 -0
- package/skills/ios/swiftui-view-refactor/SKILL.md +207 -0
- package/skills/ios/swiftui-view-refactor/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-view-refactor/references/mv-patterns.md +161 -0
- package/skills/ios/widgetkit/LICENSE +131 -0
- package/skills/ios/widgetkit/SKILL.md +502 -0
- package/skills/ios/widgetkit/references/widgetkit-advanced.md +871 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ios-info-plist-hardening
|
|
3
|
+
description: Generates and audits Info.plist defaults (usage-description strings, URL schemes, background modes, scene manifest) AND produces PrivacyInfo.xcprivacy so the app clears App Review and launches cleanly. Use during Phase 4 Foundation on every iOS project.
|
|
4
|
+
version: 0.2.0
|
|
5
|
+
status: ready
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# iOS Info.plist Hardening (Phase 4)
|
|
9
|
+
|
|
10
|
+
## Purpose
|
|
11
|
+
Ensures `Info.plist` carries every required usage-description string, correctly registered URL schemes, declared background modes, and a sane SwiftUI scene manifest. Also emits the iOS 17+ `PrivacyInfo.xcprivacy` manifest. Catches "rejected because NSCameraUsageDescription is missing" before it happens.
|
|
12
|
+
|
|
13
|
+
## When this fires
|
|
14
|
+
- Phase 4 Foundation (always, for iOS projects)
|
|
15
|
+
- Whenever a new API that requires a usage-description is added
|
|
16
|
+
- Pre-archive audit
|
|
17
|
+
|
|
18
|
+
## Inputs
|
|
19
|
+
- `ios_features` from `docs/plans/.build-state.md` (boolean flags: camera, microphone, location_when_in_use, location_always, photos, contacts, calendar, reminders, motion, health, bluetooth, localNetwork, tracking, faceID, music, homeKit, siri, nearbyInteraction, speech, appleMusic)
|
|
20
|
+
- `url_schemes` (string[], optional)
|
|
21
|
+
- `background_modes` (string[], optional)
|
|
22
|
+
- `app_lifecycle` (enum: `swiftui_app` | `uikit_appdelegate`, default `swiftui_app`)
|
|
23
|
+
- `tracking_required_reasons` (object, optional) — required-reason API categories in use
|
|
24
|
+
- `collects_tracking_data` (bool, default false)
|
|
25
|
+
|
|
26
|
+
## Outputs
|
|
27
|
+
- Updated `Info.plist` with merged keys (via XcodeBuildMCP)
|
|
28
|
+
- `PrivacyInfo.xcprivacy` at target root (iOS 17+)
|
|
29
|
+
- Audit report `docs/plans/plist-audit.md`: missing keys, stale keys, weak description strings
|
|
30
|
+
|
|
31
|
+
## Required usage-description keys
|
|
32
|
+
|
|
33
|
+
| Info.plist key | Triggered by |
|
|
34
|
+
|---|---|
|
|
35
|
+
| `NSCameraUsageDescription` | Camera / AVFoundation / Vision / ARKit / VisionKit |
|
|
36
|
+
| `NSMicrophoneUsageDescription` | Microphone / Speech / ShazamKit |
|
|
37
|
+
| `NSPhotoLibraryUsageDescription` | PhotoKit read |
|
|
38
|
+
| `NSPhotoLibraryAddUsageDescription` | Writing to photo library |
|
|
39
|
+
| `NSLocationWhenInUseUsageDescription` | CoreLocation foreground |
|
|
40
|
+
| `NSLocationAlwaysAndWhenInUseUsageDescription` | CoreLocation background |
|
|
41
|
+
| `NSContactsUsageDescription` | Contacts |
|
|
42
|
+
| `NSCalendarsUsageDescription` / `NSCalendarsFullAccessUsageDescription` | EventKit (iOS 17+ split) |
|
|
43
|
+
| `NSRemindersUsageDescription` / `NSRemindersFullAccessUsageDescription` | EventKit reminders |
|
|
44
|
+
| `NSMotionUsageDescription` | CoreMotion |
|
|
45
|
+
| `NSHealthShareUsageDescription` | HealthKit read |
|
|
46
|
+
| `NSHealthUpdateUsageDescription` | HealthKit write |
|
|
47
|
+
| `NSSpeechRecognitionUsageDescription` | Speech |
|
|
48
|
+
| `NSBluetoothAlwaysUsageDescription` | CoreBluetooth |
|
|
49
|
+
| `NSLocalNetworkUsageDescription` | Bonjour / Multipeer / Network framework LAN |
|
|
50
|
+
| `NSUserTrackingUsageDescription` | AppTrackingTransparency / IDFA |
|
|
51
|
+
| `NSFaceIDUsageDescription` | LocalAuthentication biometrics |
|
|
52
|
+
| `NSAppleMusicUsageDescription` | MediaPlayer / MusicKit |
|
|
53
|
+
| `NSHomeKitUsageDescription` | HomeKit |
|
|
54
|
+
| `NSSiriUsageDescription` | SiriKit / App Intents w/ Siri |
|
|
55
|
+
| `NSNearbyInteractionUsageDescription` | NearbyInteraction (UWB) |
|
|
56
|
+
|
|
57
|
+
Usage descriptions must be **specific and user-facing** ("To scan receipts with your camera" beats "Needs camera"). Reject strings under 20 characters or containing placeholder text.
|
|
58
|
+
|
|
59
|
+
## URL scheme registration template
|
|
60
|
+
```xml
|
|
61
|
+
<key>CFBundleURLTypes</key>
|
|
62
|
+
<array>
|
|
63
|
+
<dict>
|
|
64
|
+
<key>CFBundleURLName</key>
|
|
65
|
+
<string>com.acme.habitforge</string>
|
|
66
|
+
<key>CFBundleURLSchemes</key>
|
|
67
|
+
<array>
|
|
68
|
+
<string>habitforge</string>
|
|
69
|
+
</array>
|
|
70
|
+
<key>CFBundleTypeRole</key>
|
|
71
|
+
<string>Editor</string>
|
|
72
|
+
</dict>
|
|
73
|
+
</array>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## UIBackgroundModes enumeration
|
|
77
|
+
Valid values (set only what the app actually uses):
|
|
78
|
+
- `fetch` — background app refresh
|
|
79
|
+
- `remote-notification` — silent push wake
|
|
80
|
+
- `audio` — background audio playback
|
|
81
|
+
- `location` — continuous location updates
|
|
82
|
+
- `bluetooth-central` — BLE central role
|
|
83
|
+
- `bluetooth-peripheral` — BLE peripheral role
|
|
84
|
+
- `voip` — VoIP calls
|
|
85
|
+
- `external-accessory`
|
|
86
|
+
- `processing` — BGProcessingTask (long-running)
|
|
87
|
+
- `nearby-interaction`
|
|
88
|
+
|
|
89
|
+
## Scene manifest (SwiftUI app lifecycle default)
|
|
90
|
+
```xml
|
|
91
|
+
<key>UIApplicationSceneManifest</key>
|
|
92
|
+
<dict>
|
|
93
|
+
<key>UIApplicationSupportsMultipleScenes</key>
|
|
94
|
+
<true/>
|
|
95
|
+
<key>UISceneConfigurations</key>
|
|
96
|
+
<dict/>
|
|
97
|
+
</dict>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## PrivacyInfo.xcprivacy (iOS 17+ — this skill owns creation at Phase 4)
|
|
101
|
+
Generate with four top-level keys:
|
|
102
|
+
|
|
103
|
+
- **`NSPrivacyTracking`** — bool; true only if `collects_tracking_data` is true.
|
|
104
|
+
- **`NSPrivacyTrackingDomains`** — array of tracking domains contacted (only if tracking is true).
|
|
105
|
+
- **`NSPrivacyCollectedDataTypes`** — array of dicts, one per data category collected, each with: `NSPrivacyCollectedDataType`, `NSPrivacyCollectedDataTypeLinked`, `NSPrivacyCollectedDataTypeTracking`, `NSPrivacyCollectedDataTypePurposes`.
|
|
106
|
+
- **`NSPrivacyAccessedAPITypes`** — array of required-reason API declarations. Each entry has `NSPrivacyAccessedAPIType` + `NSPrivacyAccessedAPITypeReasons`. Common categories:
|
|
107
|
+
- `NSPrivacyAccessedAPICategoryFileTimestamp`
|
|
108
|
+
- `NSPrivacyAccessedAPICategorySystemBootTime`
|
|
109
|
+
- `NSPrivacyAccessedAPICategoryDiskSpace`
|
|
110
|
+
- `NSPrivacyAccessedAPICategoryActiveKeyboards`
|
|
111
|
+
- `NSPrivacyAccessedAPICategoryUserDefaults`
|
|
112
|
+
|
|
113
|
+
Detect required-reason API usage by scanning code for patterns (e.g. `FileManager` attributes, `UserDefaults` access, `UIDevice` boot time). Emit a declaration for each detected category with the appropriate reason code.
|
|
114
|
+
|
|
115
|
+
## Workflow
|
|
116
|
+
1. **Read state** — load `ios_features` flags from `docs/plans/.build-state.md`.
|
|
117
|
+
2. **Select required keys** — for each true flag, resolve to usage-description key(s) from the table above (cross-check `ios-frameworks-map.md §4` column "Info.plist keys").
|
|
118
|
+
3. **Scan code for required-reason APIs** — grep for `FileManager`, `UserDefaults`, `systemUptime`, `.systemFreeSize`, keyboard APIs; build privacy-manifest entries.
|
|
119
|
+
4. **Generate patches** — compute Info.plist additions and PrivacyInfo.xcprivacy content.
|
|
120
|
+
5. **Write via XcodeBuildMCP** — merge Info.plist (never clobber user keys), create/overwrite `PrivacyInfo.xcprivacy` at target root.
|
|
121
|
+
6. **Emit audit report** — `docs/plans/plist-audit.md` listing additions, weak descriptions, and any manual follow-ups (e.g. "add tracking domain list").
|
|
122
|
+
|
|
123
|
+
## Validation
|
|
124
|
+
- Every usage-description string is ≥ 20 chars and references the concrete app action.
|
|
125
|
+
- No placeholder strings (`TODO`, `lorem`, `test`, `permission required`).
|
|
126
|
+
- Background modes in plist match entitlements and actual runtime usage.
|
|
127
|
+
- PrivacyInfo.xcprivacy includes a required-reason entry for every detected API category — missing entries block App Store submission.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
_Part of buildanything iOS mode. See `protocols/ios-context.md` for persona. Cross-references `protocols/ios-frameworks-map.md §4`._
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ios-maestro-flow-author
|
|
3
|
+
description: Generates Maestro .yaml E2E flow files from natural-language user journeys. Use during /verify iOS branch whenever a critical user journey needs automated coverage.
|
|
4
|
+
version: 0.2.0
|
|
5
|
+
status: ready
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# iOS Maestro Flow Author (Phase 6, /verify twin)
|
|
9
|
+
|
|
10
|
+
## Purpose
|
|
11
|
+
Converts a plain-English user journey ("sign up, create first habit, mark complete") into a runnable Maestro flow YAML, ready to execute against a booted simulator via `maestro test`.
|
|
12
|
+
|
|
13
|
+
## When this fires
|
|
14
|
+
- `/verify` iOS branch
|
|
15
|
+
- A new critical user journey needs E2E coverage
|
|
16
|
+
- Regression: existing flow drifted from current UI
|
|
17
|
+
|
|
18
|
+
## Inputs
|
|
19
|
+
- `journey_nl` (string) — natural-language user journey
|
|
20
|
+
- `app_id` (string) — bundle identifier under test (e.g. `com.acme.HabitForge`)
|
|
21
|
+
- `test_name` (string, optional) — defaults to slugified journey
|
|
22
|
+
|
|
23
|
+
## Outputs
|
|
24
|
+
- `maestro/<test_name>.yaml`
|
|
25
|
+
- Dry-run summary (commands emitted, accessibility-id assumptions, skipped steps)
|
|
26
|
+
|
|
27
|
+
## Workflow
|
|
28
|
+
1. Parse `journey_nl` into ordered discrete user actions (one sentence = one action group).
|
|
29
|
+
2. Match each action to a Maestro command pattern from the cheat-sheet below; prefer accessibility IDs over visible text when the app exposes them.
|
|
30
|
+
3. Emit YAML with `appId: {app_id}` header and one command per step.
|
|
31
|
+
4. Write to `maestro/<test_name>.yaml`.
|
|
32
|
+
5. Validate via `maestro test maestro/<test_name>.yaml` on a booted simulator (Maestro has no true `--dry-run`; shortest validation is to run it once against the sim).
|
|
33
|
+
|
|
34
|
+
## Maestro cheat-sheet (10 core commands)
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
- launchApp # launches the appId declared in the header
|
|
38
|
+
- tapOn: "Sign Up" # tap element by visible text
|
|
39
|
+
- tapOn:
|
|
40
|
+
id: "emailField" # tap by accessibility identifier (preferred)
|
|
41
|
+
- assertVisible: "Welcome back" # assert text/element visible, fails flow if not
|
|
42
|
+
- inputText: "alice@example.com" # types into currently focused field
|
|
43
|
+
- scroll # scroll down on current screen
|
|
44
|
+
- swipe:
|
|
45
|
+
direction: LEFT # swipe: LEFT | RIGHT | UP | DOWN
|
|
46
|
+
- hideKeyboard # dismiss soft keyboard
|
|
47
|
+
- back # system back / pop navigation
|
|
48
|
+
- pressKey: Enter # hardware key: Enter, Backspace, Home, Lock
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
See `references/` for five copy-and-adapt templates covering the 90% cases.
|
|
52
|
+
|
|
53
|
+
## Authoring rules
|
|
54
|
+
- Always start with `- launchApp`.
|
|
55
|
+
- Prefer `id:` selectors (stable) over raw text (fragile to copy changes).
|
|
56
|
+
- After every `inputText`, insert `hideKeyboard` before the next `tapOn` to avoid the keyboard intercepting taps.
|
|
57
|
+
- End every flow with at least one `assertVisible` that confirms the user reached the destination screen.
|
|
58
|
+
- Keep flows single-purpose — one user journey per file. Compose with `runFlow:` in a parent flow if needed.
|
|
59
|
+
|
|
60
|
+
## Reference templates
|
|
61
|
+
- `references/onboarding-flow.yaml` — launch → splash → signup → main screen
|
|
62
|
+
- `references/tap-and-assert.yaml` — minimal tap + assertVisible pattern
|
|
63
|
+
- `references/input-and-scroll.yaml` — form input + scroll + tap
|
|
64
|
+
- `references/modal-and-dismiss.yaml` — open sheet, interact, dismiss
|
|
65
|
+
- `references/tab-navigation.yaml` — switch tabs, verify each screen
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
_Part of buildanything iOS mode. See `protocols/ios-context.md` for Senior iOS Engineer persona._
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Form fill + scroll + submit
|
|
2
|
+
appId: com.acme.HabitForge
|
|
3
|
+
---
|
|
4
|
+
- launchApp
|
|
5
|
+
- tapOn: "Add Habit"
|
|
6
|
+
- assertVisible: "New Habit"
|
|
7
|
+
- tapOn:
|
|
8
|
+
id: "habitNameField"
|
|
9
|
+
- inputText: "Drink water"
|
|
10
|
+
- hideKeyboard
|
|
11
|
+
- tapOn:
|
|
12
|
+
id: "notesField"
|
|
13
|
+
- inputText: "Eight glasses per day, spread across mornings and afternoons"
|
|
14
|
+
- hideKeyboard
|
|
15
|
+
- scroll
|
|
16
|
+
- tapOn: "Save"
|
|
17
|
+
- assertVisible: "Drink water"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Open modal sheet, interact, dismiss
|
|
2
|
+
appId: com.acme.HabitForge
|
|
3
|
+
---
|
|
4
|
+
- launchApp
|
|
5
|
+
- tapOn: "Settings"
|
|
6
|
+
- assertVisible: "Preferences"
|
|
7
|
+
- tapOn: "Appearance"
|
|
8
|
+
- assertVisible: "Theme"
|
|
9
|
+
- tapOn: "Dark"
|
|
10
|
+
- swipe:
|
|
11
|
+
direction: DOWN
|
|
12
|
+
- assertVisible: "Preferences"
|
|
13
|
+
- back
|
|
14
|
+
- assertVisible: "Your Habits"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Onboarding: launch -> splash -> sign up -> main screen
|
|
2
|
+
appId: com.acme.HabitForge
|
|
3
|
+
---
|
|
4
|
+
- launchApp
|
|
5
|
+
- assertVisible: "Welcome"
|
|
6
|
+
- tapOn: "Sign Up"
|
|
7
|
+
- assertVisible: "Create your account"
|
|
8
|
+
- tapOn:
|
|
9
|
+
id: "emailField"
|
|
10
|
+
- inputText: "alice@example.com"
|
|
11
|
+
- tapOn:
|
|
12
|
+
id: "passwordField"
|
|
13
|
+
- inputText: "hunter2hunter2"
|
|
14
|
+
- hideKeyboard
|
|
15
|
+
- tapOn: "Continue"
|
|
16
|
+
- assertVisible: "Your Habits"
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Tab bar navigation — verify each tab loads its root screen
|
|
2
|
+
appId: com.acme.HabitForge
|
|
3
|
+
---
|
|
4
|
+
- launchApp
|
|
5
|
+
- assertVisible: "Your Habits"
|
|
6
|
+
- tapOn: "Stats"
|
|
7
|
+
- assertVisible: "Weekly Progress"
|
|
8
|
+
- tapOn: "Journal"
|
|
9
|
+
- assertVisible: "Entries"
|
|
10
|
+
- tapOn: "Settings"
|
|
11
|
+
- assertVisible: "Preferences"
|
|
12
|
+
- tapOn: "Habits"
|
|
13
|
+
- assertVisible: "Your Habits"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pasquale Vittoriosi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|