buildanything 1.8.0 → 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 +57 -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 +19 -2
- package/agents/ios-foundation-models-specialist.md +20 -2
- package/agents/ios-storekit-specialist.md +9 -2
- package/agents/ios-swift-architect.md +28 -1
- package/agents/ios-swift-search.md +8 -1
- package/agents/ios-swift-ui-design.md +33 -1
- 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 +782 -266
- package/commands/fix.md +1 -1
- package/commands/self-check.md +121 -0
- package/commands/setup.md +50 -9
- package/commands/ux-review.md +2 -2
- package/commands/verify.md +6 -9
- 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 +71 -1
- 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 +24 -4
- package/protocols/architecture-schema.md +171 -0
- package/protocols/decision-log.md +131 -0
- package/protocols/ios-context.md +10 -11
- package/protocols/ios-phase-branches.md +208 -33
- package/protocols/launch-readiness.md +258 -0
- package/protocols/metric-loop.md +62 -2
- package/protocols/smoke-test.md +9 -1
- package/protocols/state-schema.json +388 -0
- package/protocols/state-schema.md +172 -0
- package/protocols/verify.md +62 -2
- package/protocols/visual-dna.md +185 -0
- package/protocols/web-phase-branches.md +222 -72
- 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 +16 -7
- 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/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
- 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
|
@@ -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)*
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Activity views | Apple Developer Documentation"
|
|
3
|
+
source: https://developer.apple.com/design/human-interface-guidelines/activity-views
|
|
4
|
+
|
|
5
|
+
# Activity views
|
|
6
|
+
|
|
7
|
+
An activity view — often called a _share sheet_ — presents a range of tasks that people can perform in the current context.
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
Activity views present sharing activities like messaging and actions like Copy and Print, in addition to quick access to frequently used apps. People typically reveal a share sheet by choosing an Action button while viewing a page or document, or after they’ve selected an item. An activity view can appear as a sheet or a popover, depending on the device and orientation.
|
|
12
|
+
|
|
13
|
+
You can provide app-specific activities that can appear in a share sheet when people open it within your app or game. For example, Photos provides app-specific actions like Copy Photo, Add to Album, and Adjust Location. By default, the system lists app-specific actions before actions — such as Add to Files or AirPlay — that are available in multiple apps or throughout the system. People can edit the list of actions to ensure that it displays the ones they use most and to add new ones.
|
|
14
|
+
|
|
15
|
+
You can also create app extensions to provide custom share and action activities that people can use in other apps. (An _app extension_ is code you provide that people can install and use outside of your app.) For example, you might create a custom share activity that people can install to help them share a webpage with a specific social media service. Even though macOS doesn’t provide an activity view, you can create share and action app extensions that people can use on a Mac. For guidance, see [Share and action extensions](https://developer.apple.com/design/human-interface-guidelines/activity-views#Share-and-action-extensions).
|
|
16
|
+
|
|
17
|
+
## [Best practices](https://developer.apple.com/design/human-interface-guidelines/activity-views#Best-practices)
|
|
18
|
+
|
|
19
|
+
**Avoid creating duplicate versions of common actions that are already available in the activity view.** For example, providing a duplicate Print action is unnecessary and confusing because people wouldn’t know how to distinguish your action from the system-provided one. If you need to provide app-specific functionality that’s similar to an existing action, give it a custom title. For example, if you let people use custom formatting to print a bank transaction, use a title that helps people understand what your print activity does, like “Print Transaction.”
|
|
20
|
+
|
|
21
|
+
**Consider using a symbol to represent your custom activity.** [SF Symbols](https://developer.apple.com/design/human-interface-guidelines/sf-symbols) provides a comprehensive set of configurable symbols you can use to communicate items and concepts in an activity view. If you need to create a custom interface icon, center it in an area measuring about 70x70 pixels. For guidance, see [Icons](https://developer.apple.com/design/human-interface-guidelines/icons).
|
|
22
|
+
|
|
23
|
+
**Write a succinct, descriptive title for each custom action you provide.** If a title is too long, the system wraps it and may truncate it. Prefer a single verb or a brief verb phrase that clearly communicates what the action does. Avoid including your company or product name in an action title. In contrast, the share sheet displays the title of a share activity — typically a company name — below the icon that represents it.
|
|
24
|
+
|
|
25
|
+
**Make sure activities are appropriate for the current context.** Although you can’t reorder system-provided tasks in an activity view, you can exclude tasks that aren’t applicable to your app. For example, if it doesn’t make sense to print from within your app, you can exclude the Print activity. You can also identify which custom tasks to show at any given time.
|
|
26
|
+
|
|
27
|
+
**Use the Share button to display an activity view.** People are accustomed to accessing system-provided activities when they choose the Share button. Avoid confusing people by providing an alternative way to do the same thing.
|
|
28
|
+
|
|
29
|
+

|
|
30
|
+
|
|
31
|
+

|
|
32
|
+
|
|
33
|
+
## [Share and action extensions](https://developer.apple.com/design/human-interface-guidelines/activity-views#Share-and-action-extensions)
|
|
34
|
+
|
|
35
|
+
Share extensions give people a convenient way to share information from the current context with apps, social media accounts, and other services. Action extensions let people initiate content-specific tasks — like adding a bookmark, copying a link, editing an inline image, or displaying selected text in another language — without leaving the current context.
|
|
36
|
+
|
|
37
|
+
The system presents share and action extensions differently depending on the platform:
|
|
38
|
+
|
|
39
|
+
* In iOS and iPadOS, share and action extensions are displayed in the share sheet that appears when people choose an Action button.
|
|
40
|
+
|
|
41
|
+
* In macOS, people access share extensions by clicking a Share button in the toolbar or choosing Share in a context menu. People can access an action extension by holding the pointer over certain types of embedded content — like an image they add to a Mail compose window — clicking a toolbar button, or choosing a quick action in a Finder window.
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
**If necessary, create a custom interface that feels familiar to people.** For a share extension, prefer the system-provided composition view because it provides a consistent sharing experience that people already know. For an action extension, include your app name. If you need to present an interface, include elements of your app’s interface to help people understand that your extension and your app are related.
|
|
47
|
+
|
|
48
|
+
**Streamline and limit interaction.** People appreciate extensions that let them perform a task in just a few steps. For example, a share extension might immediately post an image to a social media account with a single tap or click.
|
|
49
|
+
|
|
50
|
+
**Avoid placing a modal view above your extension.** By default, the system displays an extension within a modal view. While it might be necessary to display an alert above an extension, avoid displaying additional modal views.
|
|
51
|
+
|
|
52
|
+
**If necessary, provide an image that communicates the purpose of your extension.** A share extension automatically uses your app icon, helping give people confidence that your app provided the extension. For an action extension, prefer using a [symbol](https://developer.apple.com/design/human-interface-guidelines/sf-symbols) or creating an interface [icon](https://developer.apple.com/design/human-interface-guidelines/icons) that clearly identifies the task.
|
|
53
|
+
|
|
54
|
+
**Use your main app to denote the progress of a lengthy operation.** An activity view dismisses immediately after people complete the task in your share or action extension. If a task is time-consuming, continue it in the background, and give people a way to check the status in your main app. Although you can use a notification to tell people about a problem, don’t notify them simply because the task completes.
|
|
55
|
+
|
|
56
|
+
## [Platform considerations](https://developer.apple.com/design/human-interface-guidelines/activity-views#Platform-considerations)
|
|
57
|
+
|
|
58
|
+
_No additional considerations for iOS, iPadOS, or visionOS. Not supported in macOS, tvOS, or watchOS._
|
|
59
|
+
|
|
60
|
+
## [Resources](https://developer.apple.com/design/human-interface-guidelines/activity-views#Resources)
|
|
61
|
+
|
|
62
|
+
#### [Related](https://developer.apple.com/design/human-interface-guidelines/activity-views#Related)
|
|
63
|
+
|
|
64
|
+
[Sheets](https://developer.apple.com/design/human-interface-guidelines/sheets)
|
|
65
|
+
|
|
66
|
+
[Popovers](https://developer.apple.com/design/human-interface-guidelines/popovers)
|
|
67
|
+
|
|
68
|
+
#### [Developer documentation](https://developer.apple.com/design/human-interface-guidelines/activity-views#Developer-documentation)
|
|
69
|
+
|
|
70
|
+
[`UIActivityViewController`](https://developer.apple.com/documentation/UIKit/UIActivityViewController) — UIKit
|
|
71
|
+
|
|
72
|
+
[`UIActivity`](https://developer.apple.com/documentation/UIKit/UIActivity) — UIKit
|
|
73
|
+
|
|
74
|
+
[App Extension Support](https://developer.apple.com/documentation/Foundation/app-extension-support) — Foundation
|
|
75
|
+
|
|
76
|
+
#### [Videos](https://developer.apple.com/design/human-interface-guidelines/activity-views#Videos)
|
|
77
|
+
|
|
78
|
+
[ Design for Collaboration with Messages ](https://developer.apple.com/videos/play/wwdc2022/10015)
|
|
79
|
+
|