buildanything 1.8.0 → 2.1.1
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 +17 -3
- package/CHANGELOG.md +57 -0
- package/README.md +57 -61
- package/agents/a11y-architect.md +168 -0
- package/agents/briefing-officer.md +172 -0
- package/agents/business-model.md +82 -29
- package/agents/code-architect.md +80 -0
- package/agents/code-reviewer.md +256 -0
- package/agents/code-simplifier.md +72 -0
- package/agents/design-brand-guardian.md +312 -53
- package/agents/design-critic.md +144 -0
- package/agents/design-inclusive-visuals-specialist.md +8 -19
- package/agents/design-ui-designer.md +352 -56
- package/agents/design-ux-architect.md +418 -55
- package/agents/design-ux-researcher.md +359 -49
- package/agents/engineering-ai-engineer.md +28 -36
- package/agents/engineering-backend-architect.md +187 -36
- package/agents/engineering-data-engineer.md +227 -43
- package/agents/engineering-devops-automator.md +229 -74
- package/agents/engineering-frontend-developer.md +223 -34
- package/agents/engineering-mobile-app-builder.md +8 -1
- package/agents/engineering-rapid-prototyper.md +45 -11
- package/agents/engineering-security-engineer.md +265 -61
- package/agents/engineering-senior-developer.md +141 -19
- package/agents/engineering-sre.md +86 -0
- package/agents/engineering-technical-writer.md +287 -41
- package/agents/feature-intel.md +111 -0
- package/agents/ios-app-review-guardian.md +21 -2
- package/agents/ios-foundation-models-specialist.md +22 -2
- package/agents/ios-product-reality-auditor.md +292 -0
- package/agents/ios-storekit-specialist.md +11 -2
- package/agents/ios-swift-architect.md +29 -1
- package/agents/ios-swift-search.md +9 -1
- package/agents/ios-swift-ui-design.md +40 -5
- package/agents/marketing-app-store-optimizer.md +248 -64
- package/agents/planner.md +221 -0
- package/agents/pr-test-analyzer.md +64 -0
- package/agents/product-feedback-synthesizer.md +70 -2
- package/agents/product-owner.md +163 -0
- package/agents/product-reality-auditor.md +216 -0
- package/agents/product-spec-writer.md +176 -0
- package/agents/refactor-cleaner.md +110 -0
- package/agents/security-reviewer.md +129 -0
- package/agents/silent-failure-hunter.md +55 -0
- package/agents/swift-build-resolver.md +121 -0
- package/agents/swift-reviewer.md +113 -0
- package/agents/tech-feasibility.md +26 -4
- package/agents/testing-api-tester.md +238 -59
- package/agents/testing-evidence-collector.md +50 -1
- package/agents/testing-performance-benchmarker.md +23 -1
- package/agents/testing-reality-checker.md +7 -1
- package/agents/visual-research.md +118 -0
- package/bin/adapters/cycle-counter-tool.ts +155 -0
- package/bin/adapters/scribe-tool.ts +73 -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 +241 -0
- package/bin/graph-index.js +24 -0
- package/bin/graph-index.ts +340 -0
- package/bin/mcp-servers/graph-mcp.js +26 -0
- package/bin/mcp-servers/graph-mcp.ts +481 -0
- package/bin/mcp-servers/orchestrator-mcp.js +26 -0
- package/bin/mcp-servers/orchestrator-mcp.ts +361 -0
- package/bin/setup.js +312 -76
- package/commands/add-feature.md +2 -0
- package/commands/build.md +994 -265
- package/commands/fix.md +1 -1
- package/commands/idea-sweep.md +2 -2
- package/commands/self-check.md +121 -0
- package/commands/setup.md +61 -9
- package/commands/ux-review.md +5 -5
- package/commands/verify.md +9 -9
- package/docs/migration/agents.yaml +729 -0
- package/docs/migration/phase-graph.yaml +1504 -0
- package/docs/migration/sdk-host-compat.md +18 -0
- package/hooks/compile-writer-owner-cache.ts +171 -0
- package/hooks/design-md-lint +4 -0
- package/hooks/design-md-lint.ts +295 -0
- package/hooks/hooks.json +36 -0
- package/hooks/pre-tool-use +19 -0
- package/hooks/pre-tool-use.ts +807 -0
- package/hooks/record-mode-transitions.ts +235 -0
- package/hooks/session-start +71 -1
- package/hooks/subagent-start +17 -0
- package/hooks/subagent-start.ts +472 -0
- package/hooks/subagent-stop +17 -0
- package/hooks/subagent-stop.ts +153 -0
- package/package.json +26 -4
- package/protocols/agent-prompt-authoring.md +165 -0
- package/protocols/architecture-schema.md +178 -0
- package/protocols/cleanup.md +4 -0
- package/protocols/decision-log.md +135 -0
- package/protocols/design-md-authoring.md +520 -0
- package/protocols/design-md-spec.md +362 -0
- package/protocols/fake-data-detector.md +1 -1
- package/protocols/ios-context.md +10 -11
- package/protocols/ios-fake-data-detector.md +65 -0
- package/protocols/ios-phase-branches.md +299 -39
- package/protocols/launch-readiness.md +262 -0
- package/protocols/metric-loop.md +62 -2
- package/protocols/page-spec-schema.md +234 -0
- package/protocols/product-spec-schema.md +354 -0
- package/protocols/smoke-test.md +9 -1
- package/protocols/sprint-tasks-schema.md +53 -0
- package/protocols/state-schema.json +423 -0
- package/protocols/state-schema.md +202 -0
- package/protocols/verify.md +91 -3
- package/protocols/web-phase-branches.md +395 -75
- package/skills/ios/_VENDORED.md +2 -0
- package/skills/ios/app-store-connect-metadata/SKILL.md +148 -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-bootstrap/SKILL.md +17 -8
- package/skills/ios/swift-actor-persistence/SKILL.md +143 -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/swiftui-design-tokens/SKILL.md +475 -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/graph/ids.ts +86 -0
- package/src/graph/index.ts +32 -0
- package/src/graph/parser/architecture.ts +603 -0
- package/src/graph/parser/component-manifest.ts +268 -0
- package/src/graph/parser/decisions-jsonl.ts +407 -0
- package/src/graph/parser/design-md-pass2.ts +253 -0
- package/src/graph/parser/design-md.ts +477 -0
- package/src/graph/parser/page-spec.ts +496 -0
- package/src/graph/parser/product-spec.ts +930 -0
- package/src/graph/parser/screenshot.ts +342 -0
- package/src/graph/parser/sprint-tasks.ts +317 -0
- package/src/graph/storage/index.ts +1154 -0
- package/src/graph/types.ts +432 -0
- package/src/graph/util/dhash.ts +84 -0
- package/src/lrr/aggregator.ts +175 -0
- package/src/orchestrator/hooks/context-header.ts +119 -0
- package/src/orchestrator/hooks/token-accounting-emitter.ts +77 -0
- package/src/orchestrator/hooks/token-accounting.ts +112 -0
- package/src/orchestrator/mcp/cycle-counter.ts +130 -0
- package/src/orchestrator/mcp/scribe.ts +294 -0
- package/src/orchestrator/mcp/state-save.ts +149 -0
- package/src/orchestrator/mcp/write-lease.ts +184 -0
- package/src/orchestrator/phase4-shared-context.ts +57 -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
- package/protocols/brainstorm.md +0 -99
- package/protocols/design.md +0 -269
- package/protocols/planning.md +0 -87
- package/skills/ios/ios-hig/SKILL.md +0 -41
- package/skills/ios/ios-hig/references/accessibility.md +0 -81
- package/skills/ios/ios-hig/references/content.md +0 -142
- package/skills/ios/ios-hig/references/feedback.md +0 -123
- package/skills/ios/ios-hig/references/interaction.md +0 -199
- package/skills/ios/ios-hig/references/performance-platform.md +0 -129
- package/skills/ios/ios-hig/references/privacy-permissions.md +0 -181
- package/skills/ios/ios-hig/references/visual-design.md +0 -84
package/skills/ios/_VENDORED.md
CHANGED
|
@@ -9,6 +9,7 @@ _Wholesale copies from `research/swift-skills/` per `research/swift-skills/_docs
|
|
|
9
9
|
| swift-security-expert | ivan-magda/swift-security-skill | MIT | Ivan Magda | 2026-04-04 |
|
|
10
10
|
| swiftdata-pro | twostraws/SwiftData-Agent-Skill | MIT | Paul Hudson | 2026-04-04 |
|
|
11
11
|
| swift-testing-expert | AvdLee/Swift-Testing-Agent-Skill | MIT | Antoine van der Lee | 2026-04-04 |
|
|
12
|
+
| swift-testing | bocato/swift-testing-agent-skill | MIT | bocato | 2026-04-18 |
|
|
12
13
|
| swift-accessibility | PasqualeVittoriosi/swift-accessibility-skill | MIT | Pasquale Vittoriosi | 2026-04-04 |
|
|
13
14
|
| swiftui-ui-patterns | Dimillian/Skills | MIT | Dimillian | 2026-04-04 |
|
|
14
15
|
| swiftui-view-refactor | Dimillian/Skills | MIT | Dimillian | 2026-04-04 |
|
|
@@ -58,3 +59,4 @@ Authored in-house for the buildanything plugin. Not vendored from upstream.
|
|
|
58
59
|
| ios-entitlements-generator | expanding | Derive `.entitlements` file from required iOS capabilities (Keychain, Push, HealthKit, etc.) | stub | 2026-04-04 |
|
|
59
60
|
| ios-info-plist-hardening | expanding | Populate Info.plist usage-description strings, ATS settings, privacy manifest alignment | stub | 2026-04-04 |
|
|
60
61
|
| ios-maestro-flow-author | expanding | Author Maestro `.yaml` E2E flows for critical user journeys | stub | 2026-04-04 |
|
|
62
|
+
| writing-for-interfaces | ready | Microcopy + tone review for iOS interface text | stub | 2026-04-18 |
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: asc-metadata-sync
|
|
3
|
+
description: Sync and validate App Store metadata and localizations with asc, including legacy metadata format migration. Use when updating metadata or translations.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# asc metadata sync
|
|
7
|
+
|
|
8
|
+
Use this skill to keep local metadata in sync with App Store Connect.
|
|
9
|
+
|
|
10
|
+
## Two Types of Localizations
|
|
11
|
+
|
|
12
|
+
### 1. Version Localizations (per-release)
|
|
13
|
+
Fields: `description`, `keywords`, `whatsNew`, `supportUrl`, `marketingUrl`, `promotionalText`
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# List version localizations
|
|
17
|
+
asc localizations list --version "VERSION_ID"
|
|
18
|
+
|
|
19
|
+
# Download
|
|
20
|
+
asc localizations download --version "VERSION_ID" --path "./localizations"
|
|
21
|
+
|
|
22
|
+
# Upload from .strings files
|
|
23
|
+
asc localizations upload --version "VERSION_ID" --path "./localizations"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 2. App Info Localizations (app-level)
|
|
27
|
+
Fields: `name`, `subtitle`, `privacyPolicyUrl`, `privacyChoicesUrl`, `privacyPolicyText`
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# First, find the app info ID
|
|
31
|
+
asc apps info list --app "APP_ID"
|
|
32
|
+
|
|
33
|
+
# List app info localizations
|
|
34
|
+
asc localizations list --app "APP_ID" --type app-info --app-info "APP_INFO_ID"
|
|
35
|
+
|
|
36
|
+
# Upload app info localizations
|
|
37
|
+
asc localizations upload --app "APP_ID" --type app-info --app-info "APP_INFO_ID" --path "./app-info-localizations"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Note:** If you get "multiple app infos found", you must specify `--app-info` with the correct ID.
|
|
41
|
+
|
|
42
|
+
## Legacy Fastlane Metadata Workflow
|
|
43
|
+
|
|
44
|
+
### Export current state
|
|
45
|
+
```bash
|
|
46
|
+
asc migrate export --app "APP_ID" --version-id "VERSION_ID" --output-dir "./fastlane"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Validate local files
|
|
50
|
+
```bash
|
|
51
|
+
asc migrate validate --fastlane-dir "./fastlane"
|
|
52
|
+
```
|
|
53
|
+
This checks character limits and required fields.
|
|
54
|
+
|
|
55
|
+
### Import updates
|
|
56
|
+
```bash
|
|
57
|
+
asc migrate import --app "APP_ID" --version-id "VERSION_ID" --fastlane-dir "./fastlane" --dry-run
|
|
58
|
+
asc migrate import --app "APP_ID" --version-id "VERSION_ID" --fastlane-dir "./fastlane"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Quick Field Updates
|
|
62
|
+
|
|
63
|
+
### Version-specific fields
|
|
64
|
+
```bash
|
|
65
|
+
# What's New
|
|
66
|
+
asc apps info edit --app "APP_ID" --locale "en-US" --whats-new "Bug fixes and improvements"
|
|
67
|
+
|
|
68
|
+
# Description
|
|
69
|
+
asc apps info edit --app "APP_ID" --locale "en-US" --description "Your app description here"
|
|
70
|
+
|
|
71
|
+
# Keywords
|
|
72
|
+
asc apps info edit --app "APP_ID" --locale "en-US" --keywords "keyword1,keyword2,keyword3"
|
|
73
|
+
|
|
74
|
+
# Support URL
|
|
75
|
+
asc apps info edit --app "APP_ID" --locale "en-US" --support-url "https://support.example.com"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Version metadata
|
|
79
|
+
```bash
|
|
80
|
+
# Copyright
|
|
81
|
+
asc versions update --version-id "VERSION_ID" --copyright "2026 Your Company"
|
|
82
|
+
|
|
83
|
+
# Release type
|
|
84
|
+
asc versions update --version-id "VERSION_ID" --release-type AFTER_APPROVAL
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### TestFlight notes
|
|
88
|
+
```bash
|
|
89
|
+
asc build-localizations create --build "BUILD_ID" --locale "en-US" --whats-new "TestFlight notes here"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## .strings File Format
|
|
93
|
+
|
|
94
|
+
For bulk updates, use .strings files:
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
// en-US.strings
|
|
98
|
+
"description" = "Your app description";
|
|
99
|
+
"keywords" = "keyword1,keyword2,keyword3";
|
|
100
|
+
"whatsNew" = "What's new in this version";
|
|
101
|
+
"supportUrl" = "https://support.example.com";
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
For app-info type:
|
|
105
|
+
```
|
|
106
|
+
// en-US.strings (app-info type)
|
|
107
|
+
"privacyPolicyUrl" = "https://example.com/privacy";
|
|
108
|
+
"name" = "Your App Name";
|
|
109
|
+
"subtitle" = "Your subtitle";
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Multi-Language Workflow
|
|
113
|
+
|
|
114
|
+
1. Export all localizations:
|
|
115
|
+
```bash
|
|
116
|
+
asc localizations download --version "VERSION_ID" --path "./localizations"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
2. Translate the .strings files (or use translation service)
|
|
120
|
+
|
|
121
|
+
3. Upload all at once:
|
|
122
|
+
```bash
|
|
123
|
+
asc localizations upload --version "VERSION_ID" --path "./localizations"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
4. Verify:
|
|
127
|
+
```bash
|
|
128
|
+
asc localizations list --version "VERSION_ID" --output table
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Character Limits
|
|
132
|
+
|
|
133
|
+
| Field | Limit |
|
|
134
|
+
|-------|-------|
|
|
135
|
+
| Name | 30 |
|
|
136
|
+
| Subtitle | 30 |
|
|
137
|
+
| Keywords | 100 (comma-separated) |
|
|
138
|
+
| Description | 4000 |
|
|
139
|
+
| What's New | 4000 |
|
|
140
|
+
| Promotional Text | 170 |
|
|
141
|
+
|
|
142
|
+
Use `asc metadata validate --dir "./metadata"` for canonical metadata trees.
|
|
143
|
+
Use `asc migrate validate --fastlane-dir "./fastlane"` for legacy fastlane-format metadata.
|
|
144
|
+
|
|
145
|
+
## Notes
|
|
146
|
+
- Version localizations and app info localizations are different; use the right command and `--type` flag.
|
|
147
|
+
- Use `asc localizations list` to confirm available locales and IDs.
|
|
148
|
+
- Privacy Policy URL is in app info localizations, not version localizations.
|
|
@@ -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
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hig-components-content
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: >-
|
|
5
|
+
Apple Human Interface Guidelines for content display components. Use this skill when the user asks about
|
|
6
|
+
"charts component", "collection view", "image view", "web view", "color well", "image well",
|
|
7
|
+
"activity view", "lockup", "data visualization", "content display", displaying images, rendering
|
|
8
|
+
web content, color pickers, or presenting collections of items in Apple apps.
|
|
9
|
+
Also use when the user says "how should I display charts", "what's the best way to show images",
|
|
10
|
+
"should I use a web view", "how do I build a grid of items", "what component shows media",
|
|
11
|
+
or "how do I present a share sheet".
|
|
12
|
+
Cross-references: hig-foundations for color/typography/accessibility, hig-patterns for data
|
|
13
|
+
visualization patterns, hig-components-layout for structural containers, hig-platforms for
|
|
14
|
+
platform-specific component behavior.
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Apple HIG: Content Components
|
|
18
|
+
|
|
19
|
+
Check for `.claude/apple-design-context.md` before asking questions. Use existing context and only ask for information not already covered.
|
|
20
|
+
|
|
21
|
+
## Key Principles
|
|
22
|
+
|
|
23
|
+
1. **Adapt to different sizes and contexts.** Content components must work across screen sizes, orientations, and multitasking configurations. Use Auto Layout and size classes.
|
|
24
|
+
|
|
25
|
+
2. **Make content accessible.** Charts need audio graph support. Images need alt text. Collections need proper VoiceOver navigation order. All content components need labels and descriptions.
|
|
26
|
+
|
|
27
|
+
3. **Maintain visual hierarchy.** Use spacing, sizing, and grouping to establish clear information hierarchy. Primary content should be visually prominent.
|
|
28
|
+
|
|
29
|
+
4. **Use system components first.** Evaluate UICollectionView, SwiftUI Charts, WKWebView before building custom. System components come with built-in accessibility and platform adaptation.
|
|
30
|
+
|
|
31
|
+
5. **Respect platform conventions.** A collection on tvOS uses large lockups with parallax. The same collection on iOS uses compact cells with touch targets. On visionOS, content gains depth and hover effects.
|
|
32
|
+
|
|
33
|
+
6. **Handle empty states.** Show a meaningful empty state with guidance on how to populate it, not a blank screen.
|
|
34
|
+
|
|
35
|
+
7. **Optimize for performance.** Use lazy loading, cell reuse, pagination, and prefetching for large datasets.
|
|
36
|
+
|
|
37
|
+
## Reference Index
|
|
38
|
+
|
|
39
|
+
| Reference | Topic | Key content |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| [charts.md](references/charts.md) | Charts | Swift Charts, bar/line/area/point marks, chart accessibility, audio graphs |
|
|
42
|
+
| [collections.md](references/collections.md) | Collections | Grid/list layouts, compositional layout, selection, reordering, diffable data sources |
|
|
43
|
+
| [image-views.md](references/image-views.md) | Image Views | Aspect ratio handling, content modes, SF Symbol images, accessibility |
|
|
44
|
+
| [image-wells.md](references/image-wells.md) | Image Wells | Drag-and-drop image selection, macOS-specific, placeholder content |
|
|
45
|
+
| [color-wells.md](references/color-wells.md) | Color Wells | Color selection UI, system color picker, custom color spaces |
|
|
46
|
+
| [web-views.md](references/web-views.md) | Web Views | WKWebView, SFSafariViewController, navigation controls, content restrictions |
|
|
47
|
+
| [activity-views.md](references/activity-views.md) | Activity Views | Share sheets, activity items, custom activities, action extensions |
|
|
48
|
+
| [lockups.md](references/lockups.md) | Lockups | Image+text elements, tvOS card layouts, focus effects, shelf layouts |
|
|
49
|
+
|
|
50
|
+
## Component Selection Guide
|
|
51
|
+
|
|
52
|
+
| Content Need | Recommended Component | Platform Notes |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| Visualizing quantitative data | Charts (Swift Charts) | iOS 16+, macOS 13+, watchOS 9+ |
|
|
55
|
+
| Browsing a grid or list of items | Collection View | Compositional layout for complex arrangements |
|
|
56
|
+
| Displaying a single image | Image View | Support aspect ratio fitting; provide accessibility description |
|
|
57
|
+
| Selecting an image via drag or browse | Image Well | macOS primarily; use image pickers on iOS |
|
|
58
|
+
| Selecting a color | Color Well | Triggers system color picker; macOS, iOS 14+ |
|
|
59
|
+
| Showing web content inline | Web View (WKWebView) | Use SFSafariViewController for external browsing |
|
|
60
|
+
| Sharing content to other apps | Activity View | System share sheet with configurable activity types |
|
|
61
|
+
| Content card (image + text) | Lockup | Primarily tvOS; adaptable to other platforms |
|
|
62
|
+
|
|
63
|
+
## Output Format
|
|
64
|
+
|
|
65
|
+
1. **Component recommendation with rationale**, referencing the relevant HIG reference file.
|
|
66
|
+
2. **Configuration guidance** -- key properties and setup.
|
|
67
|
+
3. **Accessibility requirements** for the recommended component.
|
|
68
|
+
4. **Platform-specific notes** for targeted platforms.
|
|
69
|
+
|
|
70
|
+
## Questions to Ask
|
|
71
|
+
|
|
72
|
+
1. What type of content? (Quantitative data, images, web content, browsable collection, share action?)
|
|
73
|
+
2. Which platforms?
|
|
74
|
+
3. Static or dynamic content?
|
|
75
|
+
4. How much content? (Few items vs hundreds/thousands affects component choice and optimization.)
|
|
76
|
+
|
|
77
|
+
## Related Skills
|
|
78
|
+
|
|
79
|
+
- **hig-foundations** -- Color, typography, accessibility, and image guidelines
|
|
80
|
+
- **hig-patterns** -- Data visualization, sharing, and loading patterns
|
|
81
|
+
- **hig-components-layout** -- Structural containers (scroll views, lists, split views) hosting content
|
|
82
|
+
- **hig-platforms** -- Platform-specific component behavior (lockups on tvOS, web views on macOS)
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
*Built by [Raintree Technology](https://raintree.technology) · [More developer tools](https://raintree.technology)*
|