buildanything 1.7.1 → 2.0.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 +3 -3
- package/.claude-plugin/plugin.json +9 -3
- package/CHANGELOG.md +112 -0
- package/README.md +2 -2
- package/agents/a11y-architect.md +166 -0
- package/agents/business-model.md +80 -29
- package/agents/code-architect.md +75 -0
- package/agents/code-reviewer.md +255 -0
- package/agents/code-simplifier.md +64 -0
- package/agents/design-brand-guardian.md +293 -53
- package/agents/design-critic.md +139 -0
- package/agents/design-inclusive-visuals-specialist.md +6 -19
- package/agents/design-ui-designer.md +335 -56
- package/agents/design-ux-architect.md +403 -55
- package/agents/design-ux-researcher.md +264 -49
- package/agents/engineering-ai-engineer.md +26 -36
- package/agents/engineering-backend-architect.md +185 -36
- package/agents/engineering-data-engineer.md +225 -43
- package/agents/engineering-devops-automator.md +227 -74
- package/agents/engineering-frontend-developer.md +210 -34
- package/agents/engineering-mobile-app-builder.md +6 -1
- package/agents/engineering-rapid-prototyper.md +30 -9
- package/agents/engineering-security-engineer.md +263 -61
- package/agents/engineering-senior-developer.md +128 -19
- package/agents/engineering-sre.md +84 -0
- package/agents/engineering-technical-writer.md +285 -41
- package/agents/feature-intel.md +110 -0
- package/agents/ios-app-review-guardian.md +66 -0
- package/agents/ios-foundation-models-specialist.md +64 -0
- package/agents/ios-storekit-specialist.md +59 -0
- package/agents/ios-swift-architect.md +129 -0
- package/agents/ios-swift-search.md +137 -0
- package/agents/ios-swift-ui-design.md +136 -0
- package/agents/marketing-app-store-optimizer.md +246 -64
- package/agents/planner.md +216 -0
- package/agents/pr-test-analyzer.md +63 -0
- package/agents/product-feedback-synthesizer.md +8 -2
- package/agents/refactor-cleaner.md +102 -0
- package/agents/security-reviewer.md +128 -0
- package/agents/silent-failure-hunter.md +54 -0
- package/agents/swift-build-resolver.md +119 -0
- package/agents/swift-reviewer.md +112 -0
- package/agents/tech-feasibility.md +21 -1
- package/agents/testing-api-tester.md +236 -59
- package/agents/testing-evidence-collector.md +26 -1
- package/agents/testing-performance-benchmarker.md +21 -1
- package/agents/testing-reality-checker.md +6 -1
- package/agents/visual-research.md +116 -0
- package/bin/adapters/cycle-counter-tool.ts +155 -0
- package/bin/adapters/scribe-tool.ts +71 -0
- package/bin/adapters/state-save-tool.ts +130 -0
- package/bin/adapters/write-lease-tool.ts +127 -0
- package/bin/buildanything-runtime.js +15 -0
- package/bin/buildanything-runtime.ts +328 -0
- package/bin/setup.js +83 -8
- package/commands/add-feature.md +2 -0
- package/commands/build.md +752 -332
- package/commands/fix.md +65 -0
- package/commands/self-check.md +121 -0
- package/commands/setup.md +114 -0
- package/commands/ux-review.md +63 -0
- package/commands/verify.md +69 -0
- package/docs/migration/agents.yaml +729 -0
- package/docs/migration/phase-graph.yaml +1088 -0
- package/docs/migration/sdk-host-compat.md +18 -0
- package/hooks/compile-writer-owner-cache.ts +171 -0
- package/hooks/hooks.json +36 -0
- package/hooks/pre-tool-use +19 -0
- package/hooks/pre-tool-use.ts +776 -0
- package/hooks/record-mode-transitions.ts +178 -0
- package/hooks/session-start +89 -2
- package/hooks/subagent-start +17 -0
- package/hooks/subagent-start.ts +471 -0
- package/hooks/subagent-stop +17 -0
- package/hooks/subagent-stop.ts +153 -0
- package/package.json +28 -5
- package/protocols/architecture-schema.md +171 -0
- package/protocols/build-fix.md +52 -0
- package/protocols/cleanup.md +54 -0
- package/protocols/decision-log.md +131 -0
- package/protocols/eval-harness.md +61 -0
- package/protocols/fake-data-detector.md +64 -0
- package/protocols/ios-context.md +234 -0
- package/protocols/ios-frameworks-map.md +323 -0
- package/protocols/ios-phase-branches.md +337 -0
- package/protocols/ios-preflight.md +27 -0
- package/protocols/launch-readiness.md +258 -0
- package/protocols/metric-loop.md +153 -0
- package/protocols/smoke-test.md +118 -0
- package/protocols/state-schema.json +388 -0
- package/protocols/state-schema.md +172 -0
- package/protocols/verify.md +127 -0
- package/protocols/visual-dna.md +185 -0
- package/protocols/web-phase-branches.md +351 -0
- package/skills/ios/_VENDORED.md +62 -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/app-store-connect-metadata/SKILL.md +148 -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/asc-privacy-manifest/SKILL.md +350 -0
- package/skills/ios/hig-components-content/SKILL.md +86 -0
- package/skills/ios/hig-components-content/references/activity-views.md +79 -0
- package/skills/ios/hig-components-content/references/charts.md +180 -0
- package/skills/ios/hig-components-content/references/collections.md +48 -0
- package/skills/ios/hig-components-content/references/color-wells.md +42 -0
- package/skills/ios/hig-components-content/references/image-views.md +82 -0
- package/skills/ios/hig-components-content/references/image-wells.md +34 -0
- package/skills/ios/hig-components-content/references/lockups.md +78 -0
- package/skills/ios/hig-components-content/references/web-views.md +36 -0
- package/skills/ios/hig-components-controls/SKILL.md +88 -0
- package/skills/ios/hig-components-controls/references/combo-boxes.md +40 -0
- package/skills/ios/hig-components-controls/references/controls.md +112 -0
- package/skills/ios/hig-components-controls/references/gauges.md +74 -0
- package/skills/ios/hig-components-controls/references/labels.md +92 -0
- package/skills/ios/hig-components-controls/references/pickers.md +128 -0
- package/skills/ios/hig-components-controls/references/rating-indicators.md +38 -0
- package/skills/ios/hig-components-controls/references/segmented-controls.md +94 -0
- package/skills/ios/hig-components-controls/references/sliders.md +92 -0
- package/skills/ios/hig-components-controls/references/steppers.md +40 -0
- package/skills/ios/hig-components-controls/references/text-fields.md +88 -0
- package/skills/ios/hig-components-controls/references/text-views.md +56 -0
- package/skills/ios/hig-components-controls/references/toggles.md +127 -0
- package/skills/ios/hig-components-controls/references/token-fields.md +48 -0
- package/skills/ios/hig-components-controls/references/virtual-keyboards.md +156 -0
- package/skills/ios/hig-components-dialogs/SKILL.md +76 -0
- package/skills/ios/hig-components-dialogs/references/action-sheets.md +74 -0
- package/skills/ios/hig-components-dialogs/references/alerts.md +158 -0
- package/skills/ios/hig-components-dialogs/references/digit-entry-views.md +32 -0
- package/skills/ios/hig-components-dialogs/references/popovers.md +81 -0
- package/skills/ios/hig-components-dialogs/references/sheets.md +157 -0
- package/skills/ios/hig-components-layout/SKILL.md +99 -0
- package/skills/ios/hig-components-layout/references/boxes.md +48 -0
- package/skills/ios/hig-components-layout/references/column-views.md +44 -0
- package/skills/ios/hig-components-layout/references/lists-and-tables.md +99 -0
- package/skills/ios/hig-components-layout/references/ornaments.md +56 -0
- package/skills/ios/hig-components-layout/references/outline-views.md +64 -0
- package/skills/ios/hig-components-layout/references/panels.md +75 -0
- package/skills/ios/hig-components-layout/references/scroll-views.md +123 -0
- package/skills/ios/hig-components-layout/references/sidebars.md +109 -0
- package/skills/ios/hig-components-layout/references/split-views.md +110 -0
- package/skills/ios/hig-components-layout/references/tab-bars.md +173 -0
- package/skills/ios/hig-components-layout/references/tab-views.md +68 -0
- package/skills/ios/hig-components-layout/references/windows.md +188 -0
- package/skills/ios/hig-components-menus/SKILL.md +81 -0
- package/skills/ios/hig-components-menus/references/action-button.md +61 -0
- package/skills/ios/hig-components-menus/references/buttons.md +261 -0
- package/skills/ios/hig-components-menus/references/context-menus.md +105 -0
- package/skills/ios/hig-components-menus/references/disclosure-controls.md +84 -0
- package/skills/ios/hig-components-menus/references/dock-menus.md +40 -0
- package/skills/ios/hig-components-menus/references/edit-menus.md +88 -0
- package/skills/ios/hig-components-menus/references/menus.md +171 -0
- package/skills/ios/hig-components-menus/references/pop-up-buttons.md +70 -0
- package/skills/ios/hig-components-menus/references/pull-down-buttons.md +77 -0
- package/skills/ios/hig-components-menus/references/the-menu-bar.md +303 -0
- package/skills/ios/hig-components-menus/references/toolbars.md +256 -0
- package/skills/ios/hig-components-search/SKILL.md +68 -0
- package/skills/ios/hig-components-search/references/page-controls.md +120 -0
- package/skills/ios/hig-components-search/references/path-controls.md +40 -0
- package/skills/ios/hig-components-search/references/search-fields.md +189 -0
- package/skills/ios/hig-components-status/SKILL.md +80 -0
- package/skills/ios/hig-components-status/references/activity-rings.md +105 -0
- package/skills/ios/hig-components-status/references/progress-indicators.md +116 -0
- package/skills/ios/hig-components-status/references/status-bars.md +38 -0
- package/skills/ios/hig-components-system/SKILL.md +88 -0
- package/skills/ios/hig-components-system/references/app-clips.md +387 -0
- package/skills/ios/hig-components-system/references/app-shortcuts.md +114 -0
- package/skills/ios/hig-components-system/references/complications.md +425 -0
- package/skills/ios/hig-components-system/references/home-screen-quick-actions.md +42 -0
- package/skills/ios/hig-components-system/references/live-activities.md +442 -0
- package/skills/ios/hig-components-system/references/notifications.md +153 -0
- package/skills/ios/hig-components-system/references/top-shelf.md +135 -0
- package/skills/ios/hig-components-system/references/watch-faces.md +40 -0
- package/skills/ios/hig-components-system/references/widgets.md +517 -0
- package/skills/ios/hig-foundations/SKILL.md +98 -0
- package/skills/ios/hig-foundations/references/accessibility.md +291 -0
- package/skills/ios/hig-foundations/references/app-icons.md +210 -0
- package/skills/ios/hig-foundations/references/branding.md +44 -0
- package/skills/ios/hig-foundations/references/color.md +274 -0
- package/skills/ios/hig-foundations/references/dark-mode.md +116 -0
- package/skills/ios/hig-foundations/references/icons.md +263 -0
- package/skills/ios/hig-foundations/references/images.md +176 -0
- package/skills/ios/hig-foundations/references/immersive-experiences.md +174 -0
- package/skills/ios/hig-foundations/references/inclusion.md +189 -0
- package/skills/ios/hig-foundations/references/layout.md +425 -0
- package/skills/ios/hig-foundations/references/materials.md +238 -0
- package/skills/ios/hig-foundations/references/motion.md +103 -0
- package/skills/ios/hig-foundations/references/privacy.md +231 -0
- package/skills/ios/hig-foundations/references/right-to-left.md +206 -0
- package/skills/ios/hig-foundations/references/sf-symbols.md +310 -0
- package/skills/ios/hig-foundations/references/spatial-layout.md +142 -0
- package/skills/ios/hig-foundations/references/typography.md +1146 -0
- package/skills/ios/hig-foundations/references/writing.md +91 -0
- package/skills/ios/hig-inputs/SKILL.md +94 -0
- package/skills/ios/hig-inputs/references/apple-pencil-and-scribble.md +148 -0
- package/skills/ios/hig-inputs/references/camera-control.md +107 -0
- package/skills/ios/hig-inputs/references/digital-crown.md +83 -0
- package/skills/ios/hig-inputs/references/eyes.md +120 -0
- package/skills/ios/hig-inputs/references/focus-and-selection.md +120 -0
- package/skills/ios/hig-inputs/references/game-controls.md +156 -0
- package/skills/ios/hig-inputs/references/gestures.md +208 -0
- package/skills/ios/hig-inputs/references/gyro-and-accelerometer.md +40 -0
- package/skills/ios/hig-inputs/references/keyboards.md +234 -0
- package/skills/ios/hig-inputs/references/nearby-interactions.md +70 -0
- package/skills/ios/hig-inputs/references/pointing-devices.md +237 -0
- package/skills/ios/hig-inputs/references/remotes.md +67 -0
- package/skills/ios/hig-inputs/references/spatial-interactions.md +70 -0
- package/skills/ios/hig-patterns/SKILL.md +104 -0
- package/skills/ios/hig-patterns/references/charting-data.md +81 -0
- package/skills/ios/hig-patterns/references/collaboration-and-sharing.md +86 -0
- package/skills/ios/hig-patterns/references/drag-and-drop.md +134 -0
- package/skills/ios/hig-patterns/references/entering-data.md +69 -0
- package/skills/ios/hig-patterns/references/feedback.md +67 -0
- package/skills/ios/hig-patterns/references/file-management.md +135 -0
- package/skills/ios/hig-patterns/references/going-full-screen.md +79 -0
- package/skills/ios/hig-patterns/references/launching.md +81 -0
- package/skills/ios/hig-patterns/references/live-viewing-apps.md +79 -0
- package/skills/ios/hig-patterns/references/loading.md +59 -0
- package/skills/ios/hig-patterns/references/managing-accounts.md +107 -0
- package/skills/ios/hig-patterns/references/managing-notifications.md +99 -0
- package/skills/ios/hig-patterns/references/modality.md +82 -0
- package/skills/ios/hig-patterns/references/multitasking.md +131 -0
- package/skills/ios/hig-patterns/references/offering-help.md +117 -0
- package/skills/ios/hig-patterns/references/onboarding.md +69 -0
- package/skills/ios/hig-patterns/references/playing-audio.md +124 -0
- package/skills/ios/hig-patterns/references/playing-haptics.md +280 -0
- package/skills/ios/hig-patterns/references/playing-video.md +180 -0
- package/skills/ios/hig-patterns/references/printing.md +50 -0
- package/skills/ios/hig-patterns/references/ratings-and-reviews.md +48 -0
- package/skills/ios/hig-patterns/references/searching.md +70 -0
- package/skills/ios/hig-patterns/references/settings.md +84 -0
- package/skills/ios/hig-patterns/references/undo-and-redo.md +58 -0
- package/skills/ios/hig-patterns/references/workouts.md +76 -0
- package/skills/ios/hig-platforms/SKILL.md +84 -0
- package/skills/ios/hig-platforms/references/designing-for-games.md +159 -0
- package/skills/ios/hig-platforms/references/designing-for-ios.md +66 -0
- package/skills/ios/hig-platforms/references/designing-for-ipados.md +64 -0
- package/skills/ios/hig-platforms/references/designing-for-macos.md +70 -0
- package/skills/ios/hig-platforms/references/designing-for-tvos.md +68 -0
- package/skills/ios/hig-platforms/references/designing-for-visionos.md +85 -0
- package/skills/ios/hig-platforms/references/designing-for-watchos.md +74 -0
- package/skills/ios/hig-project-context/SKILL.md +133 -0
- package/skills/ios/hig-technologies/SKILL.md +107 -0
- package/skills/ios/hig-technologies/references/airplay.md +125 -0
- package/skills/ios/hig-technologies/references/always-on.md +62 -0
- package/skills/ios/hig-technologies/references/apple-pay.md +441 -0
- package/skills/ios/hig-technologies/references/augmented-reality.md +247 -0
- package/skills/ios/hig-technologies/references/carekit.md +224 -0
- package/skills/ios/hig-technologies/references/carplay.md +119 -0
- package/skills/ios/hig-technologies/references/game-center.md +343 -0
- package/skills/ios/hig-technologies/references/generative-ai.md +110 -0
- package/skills/ios/hig-technologies/references/healthkit.md +120 -0
- package/skills/ios/hig-technologies/references/homekit.md +343 -0
- package/skills/ios/hig-technologies/references/icloud.md +52 -0
- package/skills/ios/hig-technologies/references/id-verifier.md +73 -0
- package/skills/ios/hig-technologies/references/imessage-apps-and-stickers.md +105 -0
- package/skills/ios/hig-technologies/references/in-app-purchase.md +263 -0
- package/skills/ios/hig-technologies/references/live-photos.md +54 -0
- package/skills/ios/hig-technologies/references/mac-catalyst.md +216 -0
- package/skills/ios/hig-technologies/references/machine-learning.md +394 -0
- package/skills/ios/hig-technologies/references/maps.md +221 -0
- package/skills/ios/hig-technologies/references/nfc.md +51 -0
- package/skills/ios/hig-technologies/references/photo-editing.md +40 -0
- package/skills/ios/hig-technologies/references/researchkit.md +134 -0
- package/skills/ios/hig-technologies/references/shareplay.md +142 -0
- package/skills/ios/hig-technologies/references/shazamkit.md +47 -0
- package/skills/ios/hig-technologies/references/sign-in-with-apple.md +288 -0
- package/skills/ios/hig-technologies/references/siri.md +523 -0
- package/skills/ios/hig-technologies/references/tap-to-pay-on-iphone.md +208 -0
- package/skills/ios/hig-technologies/references/voiceover.md +90 -0
- package/skills/ios/hig-technologies/references/wallet.md +420 -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 +107 -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-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-actor-persistence/SKILL.md +143 -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-concurrency-6-2/SKILL.md +216 -0
- package/skills/ios/swift-protocol-di-testing/SKILL.md +190 -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-design-tokens/SKILL.md +475 -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
- package/skills/ios/writing-for-interfaces/SKILL.md +75 -0
- package/skills/web/accessibility/SKILL.md +146 -0
- package/skills/web/aceternity-ui/SKILL.md +719 -0
- package/skills/web/aceternity-ui/metadata.json +10 -0
- package/skills/web/api-design/SKILL.md +523 -0
- package/skills/web/chart-accessibility/SKILL.md +332 -0
- package/skills/web/composition-patterns/AGENTS.md +946 -0
- package/skills/web/composition-patterns/README.md +60 -0
- package/skills/web/composition-patterns/SKILL.md +89 -0
- package/skills/web/composition-patterns/metadata.json +11 -0
- package/skills/web/composition-patterns/rules/_sections.md +29 -0
- package/skills/web/composition-patterns/rules/_template.md +24 -0
- package/skills/web/composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/skills/web/composition-patterns/rules/architecture-compound-components.md +112 -0
- package/skills/web/composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/skills/web/composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/skills/web/composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/skills/web/composition-patterns/rules/state-context-interface.md +191 -0
- package/skills/web/composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/skills/web/composition-patterns/rules/state-lift-state.md +125 -0
- package/skills/web/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/skills/web/database-migrations/SKILL.md +429 -0
- package/skills/web/deployment-patterns/SKILL.md +427 -0
- package/skills/web/docker-patterns/SKILL.md +364 -0
- package/skills/web/e2e-testing/SKILL.md +326 -0
- package/skills/web/lighthouse-ci/SKILL.md +361 -0
- package/skills/web/mcp-server-patterns/SKILL.md +69 -0
- package/skills/web/next-best-practices/SKILL.md +153 -0
- package/skills/web/next-best-practices/async-patterns.md +87 -0
- package/skills/web/next-best-practices/bundling.md +180 -0
- package/skills/web/next-best-practices/data-patterns.md +297 -0
- package/skills/web/next-best-practices/debug-tricks.md +105 -0
- package/skills/web/next-best-practices/directives.md +73 -0
- package/skills/web/next-best-practices/error-handling.md +227 -0
- package/skills/web/next-best-practices/file-conventions.md +140 -0
- package/skills/web/next-best-practices/font.md +245 -0
- package/skills/web/next-best-practices/functions.md +108 -0
- package/skills/web/next-best-practices/hydration-error.md +91 -0
- package/skills/web/next-best-practices/image.md +173 -0
- package/skills/web/next-best-practices/metadata.md +301 -0
- package/skills/web/next-best-practices/parallel-routes.md +287 -0
- package/skills/web/next-best-practices/route-handlers.md +146 -0
- package/skills/web/next-best-practices/rsc-boundaries.md +159 -0
- package/skills/web/next-best-practices/runtime-selection.md +39 -0
- package/skills/web/next-best-practices/scripts.md +141 -0
- package/skills/web/next-best-practices/self-hosting.md +371 -0
- package/skills/web/next-best-practices/suspense-boundaries.md +67 -0
- package/skills/web/next-cache-components/SKILL.md +411 -0
- package/skills/web/postgres-best-practices/SKILL.md +14 -0
- package/skills/web/postgres-best-practices/references/schema-design.md +9 -0
- package/skills/web/react-best-practices/AGENTS.md +3810 -0
- package/skills/web/react-best-practices/README.md +123 -0
- package/skills/web/react-best-practices/SKILL.md +149 -0
- package/skills/web/react-best-practices/metadata.json +15 -0
- package/skills/web/react-best-practices/rules/_sections.md +46 -0
- package/skills/web/react-best-practices/rules/_template.md +28 -0
- package/skills/web/react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/skills/web/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/skills/web/react-best-practices/rules/advanced-init-once.md +42 -0
- package/skills/web/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/skills/web/react-best-practices/rules/async-api-routes.md +38 -0
- package/skills/web/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/skills/web/react-best-practices/rules/async-defer-await.md +82 -0
- package/skills/web/react-best-practices/rules/async-dependencies.md +51 -0
- package/skills/web/react-best-practices/rules/async-parallel.md +28 -0
- package/skills/web/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/skills/web/react-best-practices/rules/bundle-analyzable-paths.md +63 -0
- package/skills/web/react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/skills/web/react-best-practices/rules/bundle-conditional.md +31 -0
- package/skills/web/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/skills/web/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/skills/web/react-best-practices/rules/bundle-preload.md +50 -0
- package/skills/web/react-best-practices/rules/client-event-listeners.md +74 -0
- package/skills/web/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/skills/web/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/skills/web/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/skills/web/react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/skills/web/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/skills/web/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/skills/web/react-best-practices/rules/js-cache-storage.md +70 -0
- package/skills/web/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/skills/web/react-best-practices/rules/js-early-exit.md +50 -0
- package/skills/web/react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/skills/web/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/skills/web/react-best-practices/rules/js-index-maps.md +37 -0
- package/skills/web/react-best-practices/rules/js-length-check-first.md +49 -0
- package/skills/web/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/skills/web/react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/skills/web/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/skills/web/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/skills/web/react-best-practices/rules/rendering-activity.md +26 -0
- package/skills/web/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/skills/web/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/skills/web/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/skills/web/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/skills/web/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/skills/web/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/skills/web/react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/skills/web/react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/skills/web/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/skills/web/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/skills/web/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/skills/web/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/skills/web/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/skills/web/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/skills/web/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/skills/web/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/skills/web/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/skills/web/react-best-practices/rules/rerender-memo.md +44 -0
- package/skills/web/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/skills/web/react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/skills/web/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/skills/web/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/skills/web/react-best-practices/rules/rerender-transitions.md +40 -0
- package/skills/web/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/skills/web/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/skills/web/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/skills/web/react-best-practices/rules/server-auth-actions.md +96 -0
- package/skills/web/react-best-practices/rules/server-cache-lru.md +41 -0
- package/skills/web/react-best-practices/rules/server-cache-react.md +76 -0
- package/skills/web/react-best-practices/rules/server-dedup-props.md +65 -0
- package/skills/web/react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/skills/web/react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/skills/web/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/skills/web/react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/skills/web/react-best-practices/rules/server-serialization.md +38 -0
- package/skills/web/seo/SKILL.md +154 -0
- package/skills/web/web-design-guidelines/SKILL.md +39 -0
- package/skills/web/zap-scan-config/SKILL.md +444 -0
- package/skills/web/zap-scan-config/assets/.gitkeep +9 -0
- package/skills/web/zap-scan-config/assets/github_action.yml +207 -0
- package/skills/web/zap-scan-config/assets/gitlab_ci.yml +226 -0
- package/skills/web/zap-scan-config/assets/zap_automation.yaml +196 -0
- package/skills/web/zap-scan-config/assets/zap_context.xml +192 -0
- package/skills/web/zap-scan-config/references/EXAMPLE.md +40 -0
- package/skills/web/zap-scan-config/references/api_testing_guide.md +475 -0
- package/skills/web/zap-scan-config/references/authentication_guide.md +431 -0
- package/skills/web/zap-scan-config/references/false_positive_handling.md +427 -0
- package/skills/web/zap-scan-config/references/owasp_mapping.md +255 -0
- package/src/lrr/aggregator.ts +80 -0
- package/src/orchestrator/hooks/context-header.ts +95 -0
- package/src/orchestrator/hooks/token-accounting-emitter.ts +77 -0
- package/src/orchestrator/hooks/token-accounting.ts +101 -0
- package/src/orchestrator/mcp/cycle-counter.ts +129 -0
- package/src/orchestrator/mcp/scribe.ts +283 -0
- package/src/orchestrator/mcp/state-save.ts +149 -0
- package/src/orchestrator/mcp/write-lease.ts +167 -0
- package/src/orchestrator/phase4-shared-context.ts +41 -0
- package/src/orchestrator/schemas/backward-edge.ts +46 -0
- package/agents/agentic-identity-trust.md +0 -121
- package/agents/data-consolidation-agent.md +0 -39
- package/agents/design-image-prompt-engineer.md +0 -105
- package/agents/design-visual-storyteller.md +0 -147
- package/agents/design-whimsy-injector.md +0 -89
- package/agents/engineering-autonomous-optimization-architect.md +0 -105
- package/agents/market-intel.md +0 -35
- package/agents/marketing-instagram-curator.md +0 -111
- package/agents/marketing-reddit-community-builder.md +0 -121
- package/agents/marketing-social-media-strategist.md +0 -74
- package/agents/marketing-tiktok-strategist.md +0 -123
- package/agents/marketing-twitter-engager.md +0 -124
- package/agents/marketing-wechat-official-account.md +0 -143
- package/agents/marketing-xiaohongshu-specialist.md +0 -136
- package/agents/marketing-zhihu-strategist.md +0 -160
- package/agents/product-behavioral-nudge-engine.md +0 -78
- package/agents/project-management-experiment-tracker.md +0 -102
- package/agents/report-distribution-agent.md +0 -43
- package/agents/risk-analysis.md +0 -45
- package/agents/sales-data-extraction-agent.md +0 -46
- package/agents/specialized-cultural-intelligence-strategist.md +0 -65
- package/agents/specialized-developer-advocate.md +0 -146
- package/agents/support-analytics-reporter.md +0 -133
- package/agents/support-executive-summary-generator.md +0 -64
- package/agents/support-finance-tracker.md +0 -145
- package/agents/support-legal-compliance-checker.md +0 -129
- package/agents/support-support-responder.md +0 -91
- package/agents/testing-accessibility-auditor.md +0 -110
- package/agents/testing-test-results-analyzer.md +0 -97
- package/agents/testing-tool-evaluator.md +0 -76
- package/agents/testing-workflow-optimizer.md +0 -99
- package/agents/user-research.md +0 -40
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
# MLX Swift & llama.cpp Reference
|
|
2
|
+
|
|
3
|
+
Complete reference for running open-source LLMs on Apple platforms using
|
|
4
|
+
MLX Swift and llama.cpp.
|
|
5
|
+
|
|
6
|
+
## Contents
|
|
7
|
+
|
|
8
|
+
- [MLX Swift](#mlx-swift)
|
|
9
|
+
- [llama.cpp](#llamacpp)
|
|
10
|
+
- [Multi-Backend Architecture](#multi-backend-architecture)
|
|
11
|
+
- [Built-in Apple Frameworks](#built-in-apple-frameworks)
|
|
12
|
+
- [Performance Best Practices](#performance-best-practices)
|
|
13
|
+
- [Review Checklist](#review-checklist)
|
|
14
|
+
|
|
15
|
+
## MLX Swift
|
|
16
|
+
|
|
17
|
+
Apple's ML framework for Swift. Highest sustained generation throughput on
|
|
18
|
+
Apple Silicon via unified memory architecture.
|
|
19
|
+
|
|
20
|
+
### Key Characteristics
|
|
21
|
+
|
|
22
|
+
- Unified memory: operations run on CPU or GPU without data transfer
|
|
23
|
+
- Lazy computation: operations computed only when needed
|
|
24
|
+
- Automatic differentiation for training
|
|
25
|
+
- Metal GPU acceleration
|
|
26
|
+
- Research-oriented but increasingly used in production
|
|
27
|
+
|
|
28
|
+
### Loading and Running LLMs
|
|
29
|
+
|
|
30
|
+
```swift
|
|
31
|
+
import MLX
|
|
32
|
+
import MLXLLM
|
|
33
|
+
|
|
34
|
+
let config = ModelConfiguration(
|
|
35
|
+
id: "mlx-community/Mistral-7B-Instruct-v0.3-4bit"
|
|
36
|
+
)
|
|
37
|
+
let model = try await LLMModelFactory.shared.loadContainer(
|
|
38
|
+
configuration: config
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
try await model.perform { context in
|
|
42
|
+
let input = try await context.processor.prepare(
|
|
43
|
+
input: UserInput(prompt: "Hello")
|
|
44
|
+
)
|
|
45
|
+
let stream = try generate(
|
|
46
|
+
input: input,
|
|
47
|
+
parameters: GenerateParameters(temperature: 0.0),
|
|
48
|
+
context: context
|
|
49
|
+
)
|
|
50
|
+
for await part in stream {
|
|
51
|
+
print(part.chunk ?? "", terminator: "")
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Recommended Models by Device
|
|
57
|
+
|
|
58
|
+
| Device | RAM | Recommended Model | Disk Size | RAM Usage |
|
|
59
|
+
|---|---|---|---|---|
|
|
60
|
+
| iPhone 12-14 | 4-6 GB | SmolLM2-135M or Qwen 2.5 0.5B | ~278 MB | ~0.3 GB |
|
|
61
|
+
| iPhone 15 Pro+ | 8 GB | Gemma 3n E4B 4-bit | ~2.7 GB | ~3.5 GB |
|
|
62
|
+
| Mac 8 GB | 8 GB | Llama 3.2 3B 4-bit | ~1.8 GB | ~3 GB |
|
|
63
|
+
| Mac 16 GB+ | 16 GB+ | Mistral 7B 4-bit | ~4 GB | ~6 GB |
|
|
64
|
+
|
|
65
|
+
### Memory Management Rules
|
|
66
|
+
|
|
67
|
+
1. Never exceed 60% of total RAM on iOS
|
|
68
|
+
2. Set GPU cache limits:
|
|
69
|
+
```swift
|
|
70
|
+
MLX.GPU.set(cacheLimit: 512 * 1024 * 1024) // 512 MB
|
|
71
|
+
```
|
|
72
|
+
3. Monitor memory pressure and reduce cache under pressure
|
|
73
|
+
4. Unload models on app backgrounding
|
|
74
|
+
5. Use "Increased Memory Limit" entitlement for larger models on iOS
|
|
75
|
+
6. Pre-flight memory checks before loading models
|
|
76
|
+
7. Physical device required (no simulator support for Metal GPU)
|
|
77
|
+
|
|
78
|
+
### Model Lifecycle Management
|
|
79
|
+
|
|
80
|
+
```swift
|
|
81
|
+
@Observable
|
|
82
|
+
class ModelManager {
|
|
83
|
+
private var model: LLMModelContainer?
|
|
84
|
+
private var generationCount = 0
|
|
85
|
+
|
|
86
|
+
func loadModel() async throws {
|
|
87
|
+
let config = ModelConfiguration(
|
|
88
|
+
id: "mlx-community/Llama-3.2-3B-Instruct-4bit"
|
|
89
|
+
)
|
|
90
|
+
model = try await LLMModelFactory.shared.loadContainer(
|
|
91
|
+
configuration: config
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
func unloadModel() {
|
|
96
|
+
model = nil
|
|
97
|
+
MLX.GPU.set(cacheLimit: 0)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Key lifecycle patterns:
|
|
103
|
+
- Track active generation count to distinguish "loaded but idle" from
|
|
104
|
+
"generating"
|
|
105
|
+
- Unconditional cancellation on app backgrounding
|
|
106
|
+
- 5-second delayed force-unload after backgrounding
|
|
107
|
+
- Platform-specific memory monitoring (UIKit on iOS, DispatchSource on macOS)
|
|
108
|
+
|
|
109
|
+
### Background Handling
|
|
110
|
+
|
|
111
|
+
```swift
|
|
112
|
+
// iOS: Observe app lifecycle
|
|
113
|
+
NotificationCenter.default.addObserver(
|
|
114
|
+
forName: UIApplication.didEnterBackgroundNotification,
|
|
115
|
+
object: nil, queue: .main
|
|
116
|
+
) { _ in
|
|
117
|
+
modelManager.cancelGeneration()
|
|
118
|
+
Task {
|
|
119
|
+
try await Task.sleep(for: .seconds(5))
|
|
120
|
+
modelManager.unloadModel()
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## llama.cpp
|
|
126
|
+
|
|
127
|
+
C/C++ LLM inference engine. Best cross-platform support. Uses GGUF model format.
|
|
128
|
+
|
|
129
|
+
### Swift Integration (swift-llama-cpp)
|
|
130
|
+
|
|
131
|
+
```swift
|
|
132
|
+
import SwiftLlamaCpp
|
|
133
|
+
|
|
134
|
+
let service = LlamaService(
|
|
135
|
+
modelUrl: modelURL,
|
|
136
|
+
config: .init(
|
|
137
|
+
batchSize: 256,
|
|
138
|
+
maxTokenCount: 4096,
|
|
139
|
+
useGPU: true
|
|
140
|
+
)
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
let messages = [
|
|
144
|
+
LlamaChatMessage(role: .system, content: "You are helpful."),
|
|
145
|
+
LlamaChatMessage(role: .user, content: "Hello")
|
|
146
|
+
]
|
|
147
|
+
|
|
148
|
+
let stream = try await service.streamCompletion(
|
|
149
|
+
of: messages,
|
|
150
|
+
samplingConfig: .init(temperature: 0.8)
|
|
151
|
+
)
|
|
152
|
+
for try await token in stream {
|
|
153
|
+
print(token, terminator: "")
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### GGUF Quantization Levels
|
|
158
|
+
|
|
159
|
+
| Level | Quality | Size | Use Case |
|
|
160
|
+
|---|---|---|---|
|
|
161
|
+
| Q2_K | Lowest | Smallest | Extreme memory constraints |
|
|
162
|
+
| Q4_K_M | Good | Balanced | Mobile devices (recommended) |
|
|
163
|
+
| Q5_K_M | Higher | Larger | When quality matters more |
|
|
164
|
+
| Q8_0 | Near-original | Largest | Desktop with ample RAM |
|
|
165
|
+
|
|
166
|
+
### llama.cpp vs MLX Swift
|
|
167
|
+
|
|
168
|
+
| Aspect | llama.cpp | MLX Swift |
|
|
169
|
+
|---|---|---|
|
|
170
|
+
| Model format | GGUF | Hugging Face / MLX format |
|
|
171
|
+
| Platform support | Cross-platform | Apple only |
|
|
172
|
+
| Throughput (Apple Silicon) | Good | Best |
|
|
173
|
+
| Model ecosystem | Broadest | mlx-community models |
|
|
174
|
+
| Maturity | Very mature | Evolving |
|
|
175
|
+
| Memory efficiency | Excellent | Good |
|
|
176
|
+
|
|
177
|
+
## Multi-Backend Architecture
|
|
178
|
+
|
|
179
|
+
When an app needs multiple AI backends:
|
|
180
|
+
|
|
181
|
+
### Fallback Chain Pattern
|
|
182
|
+
|
|
183
|
+
```swift
|
|
184
|
+
func respond(to prompt: String) async throws -> String {
|
|
185
|
+
// Try Foundation Models first (zero setup, best integration)
|
|
186
|
+
if SystemLanguageModel.default.isAvailable {
|
|
187
|
+
return try await foundationModelsRespond(prompt)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Fall back to MLX Swift (best throughput)
|
|
191
|
+
if canLoadMLXModel() {
|
|
192
|
+
return try await mlxRespond(prompt)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Fall back to llama.cpp (broadest compatibility)
|
|
196
|
+
if llamaModelAvailable() {
|
|
197
|
+
return try await llamaRespond(prompt)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
throw AIError.noBackendAvailable
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Architecture Guidelines
|
|
205
|
+
|
|
206
|
+
1. Create a router that checks Foundation Models availability first
|
|
207
|
+
2. Fall back to MLX or llama.cpp when Foundation Models is unavailable
|
|
208
|
+
3. Define model tiers based on device capabilities
|
|
209
|
+
4. Serialize all model access through a coordinator actor to prevent contention
|
|
210
|
+
5. Ensure tool systems work across backends (schema translation may be needed)
|
|
211
|
+
|
|
212
|
+
### Coordinator Actor
|
|
213
|
+
|
|
214
|
+
```swift
|
|
215
|
+
actor ModelCoordinator {
|
|
216
|
+
private var activeBackend: Backend?
|
|
217
|
+
|
|
218
|
+
func withExclusiveAccess<T>(
|
|
219
|
+
_ work: () async throws -> T
|
|
220
|
+
) async rethrows -> T {
|
|
221
|
+
try await work()
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
enum Backend {
|
|
225
|
+
case foundationModels
|
|
226
|
+
case mlx
|
|
227
|
+
case llamaCpp
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Built-in Apple Frameworks
|
|
233
|
+
|
|
234
|
+
Before reaching for custom models, consider built-in frameworks:
|
|
235
|
+
|
|
236
|
+
### Natural Language Framework
|
|
237
|
+
|
|
238
|
+
No model downloads required:
|
|
239
|
+
|
|
240
|
+
- `NLLanguageRecognizer` -- Language detection
|
|
241
|
+
- `NLTokenizer` -- Word, sentence, paragraph tokenization
|
|
242
|
+
- `NLTagger` -- Parts of speech, named entity recognition, sentiment
|
|
243
|
+
- `NLEmbedding` -- Word and sentence vectors, similarity search
|
|
244
|
+
|
|
245
|
+
### Vision Framework
|
|
246
|
+
|
|
247
|
+
Built-in computer vision (legacy `VN*` API; for iOS 18+ prefer modern Swift equivalents like `RecognizeTextRequest`):
|
|
248
|
+
|
|
249
|
+
- `VNRecognizeTextRequest` -- OCR
|
|
250
|
+
- `VNClassifyImageRequest` -- Image classification
|
|
251
|
+
- `VNDetectFaceRectanglesRequest` -- Face detection
|
|
252
|
+
- `VNDetectHumanBodyPoseRequest` -- Body pose estimation
|
|
253
|
+
|
|
254
|
+
### Create ML
|
|
255
|
+
|
|
256
|
+
Training custom classifiers directly on device or Mac:
|
|
257
|
+
|
|
258
|
+
- Image classification
|
|
259
|
+
- Text classification
|
|
260
|
+
- Tabular data models
|
|
261
|
+
- Sound classification
|
|
262
|
+
|
|
263
|
+
## Performance Best Practices
|
|
264
|
+
|
|
265
|
+
1. Run outside debugger for accurate benchmarks (Xcode: Cmd-Opt-R, uncheck
|
|
266
|
+
"Debug Executable")
|
|
267
|
+
2. Use `session.prewarm()` for Foundation Models before user interaction
|
|
268
|
+
3. Batch Vision framework requests in a single `perform()` call
|
|
269
|
+
4. Use `.fast` recognition level for real-time camera processing
|
|
270
|
+
5. Neural Engine (Core ML) is most energy-efficient for compatible operations
|
|
271
|
+
6. For MLX Swift, monitor token generation speed and adjust model size if
|
|
272
|
+
below acceptable thresholds
|
|
273
|
+
|
|
274
|
+
## Review Checklist
|
|
275
|
+
|
|
276
|
+
- [ ] Model size appropriate for target device RAM
|
|
277
|
+
- [ ] Memory pressure monitoring implemented
|
|
278
|
+
- [ ] Models unloaded on app backgrounding
|
|
279
|
+
- [ ] GPU cache limits set appropriately
|
|
280
|
+
- [ ] Pre-flight memory check before loading large models
|
|
281
|
+
- [ ] Fallback strategy when model unavailable
|
|
282
|
+
- [ ] All model access serialized through coordinator
|
|
283
|
+
- [ ] Quantization level appropriate for quality/size tradeoff
|
|
284
|
+
- [ ] Energy efficiency considered (Neural Engine vs GPU)
|
|
285
|
+
- [ ] Physical device testing (not simulator) for Metal-dependent code
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: asc-privacy-manifest
|
|
3
|
+
description: Generate and validate PrivacyInfo.xcprivacy files for iOS apps — required reason APIs, collected data types, tracking declarations, and SDK aggregation.
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
author: oneshot
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# iOS Privacy Manifest (PrivacyInfo.xcprivacy)
|
|
11
|
+
|
|
12
|
+
Since iOS 17 / Xcode 15, every app and third-party SDK must ship a `PrivacyInfo.xcprivacy` file declaring what data it collects, which privacy-sensitive APIs it calls, and whether it tracks users. App Store Connect rejects submissions that omit required entries (ITMS-91053, ITMS-91055).
|
|
13
|
+
|
|
14
|
+
## File structure
|
|
15
|
+
|
|
16
|
+
`PrivacyInfo.xcprivacy` is a property list (XML plist) with four top-level keys:
|
|
17
|
+
|
|
18
|
+
| Key | Type | Purpose |
|
|
19
|
+
|-----|------|---------|
|
|
20
|
+
| `NSPrivacyTracking` | Boolean | `true` if the app tracks users per ATT definition |
|
|
21
|
+
| `NSPrivacyTrackingDomains` | Array of String | Domains contacted for tracking (only when tracking is true) |
|
|
22
|
+
| `NSPrivacyCollectedDataTypes` | Array of Dict | Each data category collected, with purpose and linkage |
|
|
23
|
+
| `NSPrivacyAccessedAPITypes` | Array of Dict | Each required-reason API category used, with reason codes |
|
|
24
|
+
|
|
25
|
+
## 1. Required reason APIs (NSPrivacyAccessedAPITypes)
|
|
26
|
+
|
|
27
|
+
Five API categories require declared reasons. Each entry is a dict with `NSPrivacyAccessedAPIType` (category string) and `NSPrivacyAccessedAPITypeReasons` (array of reason codes).
|
|
28
|
+
|
|
29
|
+
### File timestamp APIs — `NSPrivacyAccessedAPICategoryFileTimestamp`
|
|
30
|
+
|
|
31
|
+
Triggered by: `FileManager` attribute reads (`modificationDate`, `creationDate`), `stat()`, `fstat()`, `getattrlist()`, `NSFileModificationDate`, `NSURLContentModificationDateKey`, `NSURLCreationDateKey`.
|
|
32
|
+
|
|
33
|
+
| Code | Meaning |
|
|
34
|
+
|------|---------|
|
|
35
|
+
| `DDA9.1` | Display file timestamps to the user on-device only (no off-device transmission) |
|
|
36
|
+
| `C617.1` | Access file metadata inside app container, app group container, or CloudKit container |
|
|
37
|
+
| `3B52.1` | Access metadata for files the user explicitly selected (document picker, drag-and-drop) |
|
|
38
|
+
| `0A2A.1` | Third-party SDK wrapper — only when the host app invokes the wrapper API |
|
|
39
|
+
|
|
40
|
+
### System boot time APIs — `NSPrivacyAccessedAPICategorySystemBootTime`
|
|
41
|
+
|
|
42
|
+
Triggered by: `ProcessInfo.processInfo.systemUptime`, `mach_absolute_time()`, `clock_gettime(CLOCK_MONOTONIC)`.
|
|
43
|
+
|
|
44
|
+
| Code | Meaning |
|
|
45
|
+
|------|---------|
|
|
46
|
+
| `35F9.1` | Measure elapsed time between events within the app |
|
|
47
|
+
| `8FFB.1` | Calculate absolute timestamps for events (e.g. UIKit or AVFAudio timestamps) |
|
|
48
|
+
| `3D61.1` | Include boot time in an optional, user-initiated bug report |
|
|
49
|
+
|
|
50
|
+
### Disk space APIs — `NSPrivacyAccessedAPICategoryDiskSpace`
|
|
51
|
+
|
|
52
|
+
Triggered by: `FileManager` `attributesOfFileSystem(forPath:)`, `volumeAvailableCapacityKey`, `volumeTotalCapacityKey`, `statfs()`, `statvfs()`.
|
|
53
|
+
|
|
54
|
+
| Code | Meaning |
|
|
55
|
+
|------|---------|
|
|
56
|
+
| `85F4.1` | Display disk space information to the user on-device |
|
|
57
|
+
| `E174.1` | Check available space before writing files or delete files on low disk |
|
|
58
|
+
| `7D9E.1` | Include disk space in an optional, user-initiated bug report |
|
|
59
|
+
| `B728.1` | Health research apps detecting low disk for data integrity |
|
|
60
|
+
|
|
61
|
+
### Active keyboards APIs — `NSPrivacyAccessedAPICategoryActiveKeyboards`
|
|
62
|
+
|
|
63
|
+
Triggered by: `UITextInputMode.activeInputModes`.
|
|
64
|
+
|
|
65
|
+
| Code | Meaning |
|
|
66
|
+
|------|---------|
|
|
67
|
+
| `3EC4.1` | Custom keyboard app checking which keyboards are active |
|
|
68
|
+
| `54BD.1` | Customize UI or input behavior based on active keyboards |
|
|
69
|
+
|
|
70
|
+
### User defaults APIs — `NSPrivacyAccessedAPICategoryUserDefaults`
|
|
71
|
+
|
|
72
|
+
Triggered by: `UserDefaults` standard or suite access. Almost every app hits this.
|
|
73
|
+
|
|
74
|
+
| Code | Meaning |
|
|
75
|
+
|------|---------|
|
|
76
|
+
| `CA92.1` | Read/write data accessible only to the app itself |
|
|
77
|
+
| `1C8F.1` | Read/write data shared via App Group (app + widgets/extensions) |
|
|
78
|
+
| `C56D.1` | Third-party SDK wrapper providing access to user defaults |
|
|
79
|
+
| `AC6B.1` | Read managed app configuration or write feedback for MDM |
|
|
80
|
+
|
|
81
|
+
## 2. Collected data types (NSPrivacyCollectedDataTypes)
|
|
82
|
+
|
|
83
|
+
Each dict in the array declares one data category with four keys:
|
|
84
|
+
|
|
85
|
+
| Key | Type | Description |
|
|
86
|
+
|-----|------|-------------|
|
|
87
|
+
| `NSPrivacyCollectedDataType` | String | Identifier from Apple's predefined list |
|
|
88
|
+
| `NSPrivacyCollectedDataTypeLinked` | Boolean | `true` if this data is linked to the user's identity |
|
|
89
|
+
| `NSPrivacyCollectedDataTypeTracking` | Boolean | `true` if this data is used for tracking |
|
|
90
|
+
| `NSPrivacyCollectedDataTypePurposes` | Array of String | Why this data is collected |
|
|
91
|
+
|
|
92
|
+
### Common data type identifiers
|
|
93
|
+
|
|
94
|
+
| Identifier | Category |
|
|
95
|
+
|------------|----------|
|
|
96
|
+
| `NSPrivacyCollectedDataTypeName` | Contact info — name |
|
|
97
|
+
| `NSPrivacyCollectedDataTypeEmailAddress` | Contact info — email |
|
|
98
|
+
| `NSPrivacyCollectedDataTypePhoneNumber` | Contact info — phone |
|
|
99
|
+
| `NSPrivacyCollectedDataTypeUserID` | Identifiers — user ID |
|
|
100
|
+
| `NSPrivacyCollectedDataTypeDeviceID` | Identifiers — device ID (IDFA, IDFV) |
|
|
101
|
+
| `NSPrivacyCollectedDataTypePreciseLocation` | Location — precise |
|
|
102
|
+
| `NSPrivacyCollectedDataTypeCoarseLocation` | Location — coarse |
|
|
103
|
+
| `NSPrivacyCollectedDataTypeProductInteraction` | Usage data — product interaction |
|
|
104
|
+
| `NSPrivacyCollectedDataTypeOtherUsageData` | Usage data — other |
|
|
105
|
+
| `NSPrivacyCollectedDataTypeCrashData` | Diagnostics — crash data |
|
|
106
|
+
| `NSPrivacyCollectedDataTypePerformanceData` | Diagnostics — performance |
|
|
107
|
+
| `NSPrivacyCollectedDataTypeOtherDiagnosticData` | Diagnostics — other |
|
|
108
|
+
| `NSPrivacyCollectedDataTypePaymentInfo` | Financial — payment info |
|
|
109
|
+
| `NSPrivacyCollectedDataTypePhotosorVideos` | User content — photos/videos |
|
|
110
|
+
| `NSPrivacyCollectedDataTypeContacts` | User content — contacts |
|
|
111
|
+
| `NSPrivacyCollectedDataTypeHealth` | Health & fitness |
|
|
112
|
+
| `NSPrivacyCollectedDataTypeFitness` | Health & fitness |
|
|
113
|
+
| `NSPrivacyCollectedDataTypeOtherDataTypes` | Catch-all |
|
|
114
|
+
|
|
115
|
+
### Purpose identifiers
|
|
116
|
+
|
|
117
|
+
| Identifier | Meaning |
|
|
118
|
+
|------------|---------|
|
|
119
|
+
| `NSPrivacyCollectedDataTypePurposeAppFunctionality` | Core app features |
|
|
120
|
+
| `NSPrivacyCollectedDataTypePurposeAnalytics` | Analytics |
|
|
121
|
+
| `NSPrivacyCollectedDataTypePurposeProductPersonalization` | Personalization |
|
|
122
|
+
| `NSPrivacyCollectedDataTypePurposeDeveloperAdvertising` | Developer's own ads/marketing |
|
|
123
|
+
| `NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising` | Third-party ad networks |
|
|
124
|
+
| `NSPrivacyCollectedDataTypePurposeOther` | Other purposes |
|
|
125
|
+
|
|
126
|
+
## 3. Tracking and ATT (NSPrivacyTracking)
|
|
127
|
+
|
|
128
|
+
Set `NSPrivacyTracking` to `true` only if the app links collected data with third-party data for advertising or ad measurement. This aligns with Apple's App Tracking Transparency (ATT) definition.
|
|
129
|
+
|
|
130
|
+
When `NSPrivacyTracking` is `true`:
|
|
131
|
+
- The app **must** call `ATTrackingManager.requestTrackingAuthorization()` before tracking.
|
|
132
|
+
- `NSPrivacyTrackingDomains` must list every domain contacted for tracking purposes.
|
|
133
|
+
- iOS blocks network requests to listed domains when the user denies tracking permission.
|
|
134
|
+
- `Info.plist` must include `NSUserTrackingUsageDescription` with a user-facing explanation.
|
|
135
|
+
|
|
136
|
+
When `NSPrivacyTracking` is `false`, leave `NSPrivacyTrackingDomains` as an empty array.
|
|
137
|
+
|
|
138
|
+
## 4. Third-party SDK manifests and aggregation
|
|
139
|
+
|
|
140
|
+
Each SDK must bundle its own `PrivacyInfo.xcprivacy` inside its framework or Swift package bundle. During archival, Xcode aggregates all manifests into a unified **Privacy Report** (accessible via Product > Generate Privacy Report in Xcode).
|
|
141
|
+
|
|
142
|
+
Rules:
|
|
143
|
+
- The app's manifest covers the app target only — not its dependencies.
|
|
144
|
+
- Each framework/xcframework/Swift package provides its own manifest.
|
|
145
|
+
- Xcode merges all manifests at archive time; duplicates are union-merged.
|
|
146
|
+
- If an SDK lacks a manifest, App Store Connect flags the submission (ITMS-91061).
|
|
147
|
+
- Update third-party SDKs regularly — most major SDKs (Alamofire, Firebase, Sentry, etc.) ship manifests since mid-2024.
|
|
148
|
+
|
|
149
|
+
For Swift packages: place `PrivacyInfo.xcprivacy` in the package's resource bundle and declare it in `Package.swift` via `.process("PrivacyInfo.xcprivacy")` in the target's `resources` array.
|
|
150
|
+
|
|
151
|
+
## 5. Xcode integration
|
|
152
|
+
|
|
153
|
+
### Where to place the file
|
|
154
|
+
- **App target**: project root, alongside `Info.plist`. Xcode copies it into the app bundle at build time.
|
|
155
|
+
- **Framework target**: inside the framework's bundle resources.
|
|
156
|
+
- **Swift Package**: in `Sources/<Target>/` and declared in `Package.swift` resources.
|
|
157
|
+
|
|
158
|
+
### How to create it in Xcode
|
|
159
|
+
1. File > New > File (or Cmd-N).
|
|
160
|
+
2. Search for "App Privacy" and select the template.
|
|
161
|
+
3. Choose the correct target in the file inspector.
|
|
162
|
+
4. Xcode creates `PrivacyInfo.xcprivacy` with a visual editor for the four top-level keys.
|
|
163
|
+
|
|
164
|
+
The file **must** be named exactly `PrivacyInfo.xcprivacy` — Apple's tooling scans for this specific filename.
|
|
165
|
+
|
|
166
|
+
### Generate a privacy report
|
|
167
|
+
1. Archive the app (Product > Archive).
|
|
168
|
+
2. Right-click the archive in the Organizer > Generate Privacy Report.
|
|
169
|
+
3. Review the aggregated report for missing entries before submission.
|
|
170
|
+
|
|
171
|
+
## 6. Common App Store rejection reasons
|
|
172
|
+
|
|
173
|
+
| Error code | Cause | Fix |
|
|
174
|
+
|------------|-------|-----|
|
|
175
|
+
| ITMS-91053 | App uses a required-reason API without declaring it in the manifest | Add the missing `NSPrivacyAccessedAPIType` entry with valid reason codes |
|
|
176
|
+
| ITMS-91055 | Invalid reason code for a declared API category | Replace with a valid reason code from Apple's predefined list |
|
|
177
|
+
| ITMS-91056 | Malformed or invalid privacy manifest file | Validate plist XML structure; re-create via Xcode template |
|
|
178
|
+
| ITMS-91061 | A third-party SDK is missing its privacy manifest | Update the SDK or add a manifest to its bundle |
|
|
179
|
+
|
|
180
|
+
**TestFlight catches these errors** — always run a TestFlight build before production submission.
|
|
181
|
+
|
|
182
|
+
Other common pitfalls:
|
|
183
|
+
- Declaring `NSPrivacyTracking = true` but omitting `NSUserTrackingUsageDescription` in `Info.plist`.
|
|
184
|
+
- Using reason code `CA92.1` (app-only) when the app actually shares `UserDefaults` via App Group — use `1C8F.1` instead.
|
|
185
|
+
- Forgetting to declare `NSPrivacyAccessedAPICategoryFileTimestamp` when using `SDWebImage`, `Kingfisher`, or other caching libraries that call `stat()`.
|
|
186
|
+
- Declaring collected data types without matching entries in the App Store Connect privacy questionnaire.
|
|
187
|
+
|
|
188
|
+
## 7. Complete example
|
|
189
|
+
|
|
190
|
+
A typical app using `UserDefaults`, file timestamps (caching), and analytics with crash reporting:
|
|
191
|
+
|
|
192
|
+
```xml
|
|
193
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
194
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
|
195
|
+
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
196
|
+
<plist version="1.0">
|
|
197
|
+
<dict>
|
|
198
|
+
|
|
199
|
+
<!-- Tracking -->
|
|
200
|
+
<key>NSPrivacyTracking</key>
|
|
201
|
+
<false/>
|
|
202
|
+
<key>NSPrivacyTrackingDomains</key>
|
|
203
|
+
<array/>
|
|
204
|
+
|
|
205
|
+
<!-- Collected data types -->
|
|
206
|
+
<key>NSPrivacyCollectedDataTypes</key>
|
|
207
|
+
<array>
|
|
208
|
+
<!-- Crash data for stability monitoring -->
|
|
209
|
+
<dict>
|
|
210
|
+
<key>NSPrivacyCollectedDataType</key>
|
|
211
|
+
<string>NSPrivacyCollectedDataTypeCrashData</string>
|
|
212
|
+
<key>NSPrivacyCollectedDataTypeLinked</key>
|
|
213
|
+
<false/>
|
|
214
|
+
<key>NSPrivacyCollectedDataTypeTracking</key>
|
|
215
|
+
<false/>
|
|
216
|
+
<key>NSPrivacyCollectedDataTypePurposes</key>
|
|
217
|
+
<array>
|
|
218
|
+
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
|
|
219
|
+
</array>
|
|
220
|
+
</dict>
|
|
221
|
+
<!-- Performance metrics -->
|
|
222
|
+
<dict>
|
|
223
|
+
<key>NSPrivacyCollectedDataType</key>
|
|
224
|
+
<string>NSPrivacyCollectedDataTypePerformanceData</string>
|
|
225
|
+
<key>NSPrivacyCollectedDataTypeLinked</key>
|
|
226
|
+
<false/>
|
|
227
|
+
<key>NSPrivacyCollectedDataTypeTracking</key>
|
|
228
|
+
<false/>
|
|
229
|
+
<key>NSPrivacyCollectedDataTypePurposes</key>
|
|
230
|
+
<array>
|
|
231
|
+
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
|
|
232
|
+
</array>
|
|
233
|
+
</dict>
|
|
234
|
+
<!-- User ID for account features -->
|
|
235
|
+
<dict>
|
|
236
|
+
<key>NSPrivacyCollectedDataType</key>
|
|
237
|
+
<string>NSPrivacyCollectedDataTypeUserID</string>
|
|
238
|
+
<key>NSPrivacyCollectedDataTypeLinked</key>
|
|
239
|
+
<true/>
|
|
240
|
+
<key>NSPrivacyCollectedDataTypeTracking</key>
|
|
241
|
+
<false/>
|
|
242
|
+
<key>NSPrivacyCollectedDataTypePurposes</key>
|
|
243
|
+
<array>
|
|
244
|
+
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
|
|
245
|
+
</array>
|
|
246
|
+
</dict>
|
|
247
|
+
</array>
|
|
248
|
+
|
|
249
|
+
<!-- Required reason APIs -->
|
|
250
|
+
<key>NSPrivacyAccessedAPITypes</key>
|
|
251
|
+
<array>
|
|
252
|
+
<!-- UserDefaults: app-only storage -->
|
|
253
|
+
<dict>
|
|
254
|
+
<key>NSPrivacyAccessedAPIType</key>
|
|
255
|
+
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
|
256
|
+
<key>NSPrivacyAccessedAPITypeReasons</key>
|
|
257
|
+
<array>
|
|
258
|
+
<string>CA92.1</string>
|
|
259
|
+
</array>
|
|
260
|
+
</dict>
|
|
261
|
+
<!-- File timestamps: cache management -->
|
|
262
|
+
<dict>
|
|
263
|
+
<key>NSPrivacyAccessedAPIType</key>
|
|
264
|
+
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
|
|
265
|
+
<key>NSPrivacyAccessedAPITypeReasons</key>
|
|
266
|
+
<array>
|
|
267
|
+
<string>C617.1</string>
|
|
268
|
+
</array>
|
|
269
|
+
</dict>
|
|
270
|
+
<!-- System boot time: elapsed time measurement -->
|
|
271
|
+
<dict>
|
|
272
|
+
<key>NSPrivacyAccessedAPIType</key>
|
|
273
|
+
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
|
|
274
|
+
<key>NSPrivacyAccessedAPITypeReasons</key>
|
|
275
|
+
<array>
|
|
276
|
+
<string>35F9.1</string>
|
|
277
|
+
</array>
|
|
278
|
+
</dict>
|
|
279
|
+
</array>
|
|
280
|
+
|
|
281
|
+
</dict>
|
|
282
|
+
</plist>
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### Variant: app with App Group sharing and tracking
|
|
286
|
+
|
|
287
|
+
If the app shares data with a widget via App Group and uses an ad SDK:
|
|
288
|
+
|
|
289
|
+
```xml
|
|
290
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
291
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
|
292
|
+
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
293
|
+
<plist version="1.0">
|
|
294
|
+
<dict>
|
|
295
|
+
|
|
296
|
+
<key>NSPrivacyTracking</key>
|
|
297
|
+
<true/>
|
|
298
|
+
<key>NSPrivacyTrackingDomains</key>
|
|
299
|
+
<array>
|
|
300
|
+
<string>analytics.example.com</string>
|
|
301
|
+
<string>ads.example.com</string>
|
|
302
|
+
</array>
|
|
303
|
+
|
|
304
|
+
<key>NSPrivacyCollectedDataTypes</key>
|
|
305
|
+
<array>
|
|
306
|
+
<dict>
|
|
307
|
+
<key>NSPrivacyCollectedDataType</key>
|
|
308
|
+
<string>NSPrivacyCollectedDataTypeDeviceID</string>
|
|
309
|
+
<key>NSPrivacyCollectedDataTypeLinked</key>
|
|
310
|
+
<false/>
|
|
311
|
+
<key>NSPrivacyCollectedDataTypeTracking</key>
|
|
312
|
+
<true/>
|
|
313
|
+
<key>NSPrivacyCollectedDataTypePurposes</key>
|
|
314
|
+
<array>
|
|
315
|
+
<string>NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising</string>
|
|
316
|
+
</array>
|
|
317
|
+
</dict>
|
|
318
|
+
</array>
|
|
319
|
+
|
|
320
|
+
<key>NSPrivacyAccessedAPITypes</key>
|
|
321
|
+
<array>
|
|
322
|
+
<dict>
|
|
323
|
+
<key>NSPrivacyAccessedAPIType</key>
|
|
324
|
+
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
|
325
|
+
<key>NSPrivacyAccessedAPITypeReasons</key>
|
|
326
|
+
<array>
|
|
327
|
+
<string>CA92.1</string>
|
|
328
|
+
<string>1C8F.1</string>
|
|
329
|
+
</array>
|
|
330
|
+
</dict>
|
|
331
|
+
</array>
|
|
332
|
+
|
|
333
|
+
</dict>
|
|
334
|
+
</plist>
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
Note: when `NSPrivacyTracking` is `true`, the app must also declare `NSUserTrackingUsageDescription` in `Info.plist` and call `ATTrackingManager.requestTrackingAuthorization()` before any tracking occurs.
|
|
338
|
+
|
|
339
|
+
## Decision checklist
|
|
340
|
+
|
|
341
|
+
Before generating the manifest, answer these:
|
|
342
|
+
|
|
343
|
+
1. Does the app use `UserDefaults`? (almost always yes) --> `CA92.1` or `1C8F.1`
|
|
344
|
+
2. Does the app or any dependency read file timestamps? (caching libraries do) --> `C617.1`
|
|
345
|
+
3. Does the app measure elapsed time or call `mach_absolute_time()`? --> `35F9.1`
|
|
346
|
+
4. Does the app check disk space before writes? --> `E174.1`
|
|
347
|
+
5. Does the app inspect active keyboards? (rare) --> `54BD.1`
|
|
348
|
+
6. Does the app collect crash/performance data? --> add collected data type entries
|
|
349
|
+
7. Does the app link data to user identity? --> set `Linked` to `true` on those types
|
|
350
|
+
8. Does the app track users for advertising? --> `NSPrivacyTracking = true` + ATT + tracking domains
|