buildanything 1.7.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +9 -3
- package/CHANGELOG.md +112 -0
- package/README.md +2 -2
- package/agents/a11y-architect.md +166 -0
- package/agents/business-model.md +80 -29
- package/agents/code-architect.md +75 -0
- package/agents/code-reviewer.md +255 -0
- package/agents/code-simplifier.md +64 -0
- package/agents/design-brand-guardian.md +293 -53
- package/agents/design-critic.md +139 -0
- package/agents/design-inclusive-visuals-specialist.md +6 -19
- package/agents/design-ui-designer.md +335 -56
- package/agents/design-ux-architect.md +403 -55
- package/agents/design-ux-researcher.md +264 -49
- package/agents/engineering-ai-engineer.md +26 -36
- package/agents/engineering-backend-architect.md +185 -36
- package/agents/engineering-data-engineer.md +225 -43
- package/agents/engineering-devops-automator.md +227 -74
- package/agents/engineering-frontend-developer.md +210 -34
- package/agents/engineering-mobile-app-builder.md +6 -1
- package/agents/engineering-rapid-prototyper.md +30 -9
- package/agents/engineering-security-engineer.md +263 -61
- package/agents/engineering-senior-developer.md +128 -19
- package/agents/engineering-sre.md +84 -0
- package/agents/engineering-technical-writer.md +285 -41
- package/agents/feature-intel.md +110 -0
- package/agents/ios-app-review-guardian.md +66 -0
- package/agents/ios-foundation-models-specialist.md +64 -0
- package/agents/ios-storekit-specialist.md +59 -0
- package/agents/ios-swift-architect.md +129 -0
- package/agents/ios-swift-search.md +137 -0
- package/agents/ios-swift-ui-design.md +136 -0
- package/agents/marketing-app-store-optimizer.md +246 -64
- package/agents/planner.md +216 -0
- package/agents/pr-test-analyzer.md +63 -0
- package/agents/product-feedback-synthesizer.md +8 -2
- package/agents/refactor-cleaner.md +102 -0
- package/agents/security-reviewer.md +128 -0
- package/agents/silent-failure-hunter.md +54 -0
- package/agents/swift-build-resolver.md +119 -0
- package/agents/swift-reviewer.md +112 -0
- package/agents/tech-feasibility.md +21 -1
- package/agents/testing-api-tester.md +236 -59
- package/agents/testing-evidence-collector.md +26 -1
- package/agents/testing-performance-benchmarker.md +21 -1
- package/agents/testing-reality-checker.md +6 -1
- package/agents/visual-research.md +116 -0
- package/bin/adapters/cycle-counter-tool.ts +155 -0
- package/bin/adapters/scribe-tool.ts +71 -0
- package/bin/adapters/state-save-tool.ts +130 -0
- package/bin/adapters/write-lease-tool.ts +127 -0
- package/bin/buildanything-runtime.js +15 -0
- package/bin/buildanything-runtime.ts +328 -0
- package/bin/setup.js +83 -8
- package/commands/add-feature.md +2 -0
- package/commands/build.md +752 -332
- package/commands/fix.md +65 -0
- package/commands/self-check.md +121 -0
- package/commands/setup.md +114 -0
- package/commands/ux-review.md +63 -0
- package/commands/verify.md +69 -0
- package/docs/migration/agents.yaml +729 -0
- package/docs/migration/phase-graph.yaml +1088 -0
- package/docs/migration/sdk-host-compat.md +18 -0
- package/hooks/compile-writer-owner-cache.ts +171 -0
- package/hooks/hooks.json +36 -0
- package/hooks/pre-tool-use +19 -0
- package/hooks/pre-tool-use.ts +776 -0
- package/hooks/record-mode-transitions.ts +178 -0
- package/hooks/session-start +89 -2
- package/hooks/subagent-start +17 -0
- package/hooks/subagent-start.ts +471 -0
- package/hooks/subagent-stop +17 -0
- package/hooks/subagent-stop.ts +153 -0
- package/package.json +28 -5
- package/protocols/architecture-schema.md +171 -0
- package/protocols/build-fix.md +52 -0
- package/protocols/cleanup.md +54 -0
- package/protocols/decision-log.md +131 -0
- package/protocols/eval-harness.md +61 -0
- package/protocols/fake-data-detector.md +64 -0
- package/protocols/ios-context.md +234 -0
- package/protocols/ios-frameworks-map.md +323 -0
- package/protocols/ios-phase-branches.md +337 -0
- package/protocols/ios-preflight.md +27 -0
- package/protocols/launch-readiness.md +258 -0
- package/protocols/metric-loop.md +153 -0
- package/protocols/smoke-test.md +118 -0
- package/protocols/state-schema.json +388 -0
- package/protocols/state-schema.md +172 -0
- package/protocols/verify.md +127 -0
- package/protocols/visual-dna.md +185 -0
- package/protocols/web-phase-branches.md +351 -0
- package/skills/ios/_VENDORED.md +62 -0
- package/skills/ios/activitykit/LICENSE +131 -0
- package/skills/ios/activitykit/SKILL.md +505 -0
- package/skills/ios/activitykit/references/activitykit-patterns.md +868 -0
- package/skills/ios/app-intents/LICENSE +131 -0
- package/skills/ios/app-intents/SKILL.md +494 -0
- package/skills/ios/app-intents/references/appintents-advanced.md +1076 -0
- package/skills/ios/app-store-connect-metadata/SKILL.md +148 -0
- package/skills/ios/apple-on-device-ai/LICENSE +131 -0
- package/skills/ios/apple-on-device-ai/SKILL.md +505 -0
- package/skills/ios/apple-on-device-ai/references/coreml-conversion.md +425 -0
- package/skills/ios/apple-on-device-ai/references/coreml-optimization.md +344 -0
- package/skills/ios/apple-on-device-ai/references/foundation-models.md +508 -0
- package/skills/ios/apple-on-device-ai/references/mlx-swift.md +285 -0
- package/skills/ios/asc-privacy-manifest/SKILL.md +350 -0
- package/skills/ios/hig-components-content/SKILL.md +86 -0
- package/skills/ios/hig-components-content/references/activity-views.md +79 -0
- package/skills/ios/hig-components-content/references/charts.md +180 -0
- package/skills/ios/hig-components-content/references/collections.md +48 -0
- package/skills/ios/hig-components-content/references/color-wells.md +42 -0
- package/skills/ios/hig-components-content/references/image-views.md +82 -0
- package/skills/ios/hig-components-content/references/image-wells.md +34 -0
- package/skills/ios/hig-components-content/references/lockups.md +78 -0
- package/skills/ios/hig-components-content/references/web-views.md +36 -0
- package/skills/ios/hig-components-controls/SKILL.md +88 -0
- package/skills/ios/hig-components-controls/references/combo-boxes.md +40 -0
- package/skills/ios/hig-components-controls/references/controls.md +112 -0
- package/skills/ios/hig-components-controls/references/gauges.md +74 -0
- package/skills/ios/hig-components-controls/references/labels.md +92 -0
- package/skills/ios/hig-components-controls/references/pickers.md +128 -0
- package/skills/ios/hig-components-controls/references/rating-indicators.md +38 -0
- package/skills/ios/hig-components-controls/references/segmented-controls.md +94 -0
- package/skills/ios/hig-components-controls/references/sliders.md +92 -0
- package/skills/ios/hig-components-controls/references/steppers.md +40 -0
- package/skills/ios/hig-components-controls/references/text-fields.md +88 -0
- package/skills/ios/hig-components-controls/references/text-views.md +56 -0
- package/skills/ios/hig-components-controls/references/toggles.md +127 -0
- package/skills/ios/hig-components-controls/references/token-fields.md +48 -0
- package/skills/ios/hig-components-controls/references/virtual-keyboards.md +156 -0
- package/skills/ios/hig-components-dialogs/SKILL.md +76 -0
- package/skills/ios/hig-components-dialogs/references/action-sheets.md +74 -0
- package/skills/ios/hig-components-dialogs/references/alerts.md +158 -0
- package/skills/ios/hig-components-dialogs/references/digit-entry-views.md +32 -0
- package/skills/ios/hig-components-dialogs/references/popovers.md +81 -0
- package/skills/ios/hig-components-dialogs/references/sheets.md +157 -0
- package/skills/ios/hig-components-layout/SKILL.md +99 -0
- package/skills/ios/hig-components-layout/references/boxes.md +48 -0
- package/skills/ios/hig-components-layout/references/column-views.md +44 -0
- package/skills/ios/hig-components-layout/references/lists-and-tables.md +99 -0
- package/skills/ios/hig-components-layout/references/ornaments.md +56 -0
- package/skills/ios/hig-components-layout/references/outline-views.md +64 -0
- package/skills/ios/hig-components-layout/references/panels.md +75 -0
- package/skills/ios/hig-components-layout/references/scroll-views.md +123 -0
- package/skills/ios/hig-components-layout/references/sidebars.md +109 -0
- package/skills/ios/hig-components-layout/references/split-views.md +110 -0
- package/skills/ios/hig-components-layout/references/tab-bars.md +173 -0
- package/skills/ios/hig-components-layout/references/tab-views.md +68 -0
- package/skills/ios/hig-components-layout/references/windows.md +188 -0
- package/skills/ios/hig-components-menus/SKILL.md +81 -0
- package/skills/ios/hig-components-menus/references/action-button.md +61 -0
- package/skills/ios/hig-components-menus/references/buttons.md +261 -0
- package/skills/ios/hig-components-menus/references/context-menus.md +105 -0
- package/skills/ios/hig-components-menus/references/disclosure-controls.md +84 -0
- package/skills/ios/hig-components-menus/references/dock-menus.md +40 -0
- package/skills/ios/hig-components-menus/references/edit-menus.md +88 -0
- package/skills/ios/hig-components-menus/references/menus.md +171 -0
- package/skills/ios/hig-components-menus/references/pop-up-buttons.md +70 -0
- package/skills/ios/hig-components-menus/references/pull-down-buttons.md +77 -0
- package/skills/ios/hig-components-menus/references/the-menu-bar.md +303 -0
- package/skills/ios/hig-components-menus/references/toolbars.md +256 -0
- package/skills/ios/hig-components-search/SKILL.md +68 -0
- package/skills/ios/hig-components-search/references/page-controls.md +120 -0
- package/skills/ios/hig-components-search/references/path-controls.md +40 -0
- package/skills/ios/hig-components-search/references/search-fields.md +189 -0
- package/skills/ios/hig-components-status/SKILL.md +80 -0
- package/skills/ios/hig-components-status/references/activity-rings.md +105 -0
- package/skills/ios/hig-components-status/references/progress-indicators.md +116 -0
- package/skills/ios/hig-components-status/references/status-bars.md +38 -0
- package/skills/ios/hig-components-system/SKILL.md +88 -0
- package/skills/ios/hig-components-system/references/app-clips.md +387 -0
- package/skills/ios/hig-components-system/references/app-shortcuts.md +114 -0
- package/skills/ios/hig-components-system/references/complications.md +425 -0
- package/skills/ios/hig-components-system/references/home-screen-quick-actions.md +42 -0
- package/skills/ios/hig-components-system/references/live-activities.md +442 -0
- package/skills/ios/hig-components-system/references/notifications.md +153 -0
- package/skills/ios/hig-components-system/references/top-shelf.md +135 -0
- package/skills/ios/hig-components-system/references/watch-faces.md +40 -0
- package/skills/ios/hig-components-system/references/widgets.md +517 -0
- package/skills/ios/hig-foundations/SKILL.md +98 -0
- package/skills/ios/hig-foundations/references/accessibility.md +291 -0
- package/skills/ios/hig-foundations/references/app-icons.md +210 -0
- package/skills/ios/hig-foundations/references/branding.md +44 -0
- package/skills/ios/hig-foundations/references/color.md +274 -0
- package/skills/ios/hig-foundations/references/dark-mode.md +116 -0
- package/skills/ios/hig-foundations/references/icons.md +263 -0
- package/skills/ios/hig-foundations/references/images.md +176 -0
- package/skills/ios/hig-foundations/references/immersive-experiences.md +174 -0
- package/skills/ios/hig-foundations/references/inclusion.md +189 -0
- package/skills/ios/hig-foundations/references/layout.md +425 -0
- package/skills/ios/hig-foundations/references/materials.md +238 -0
- package/skills/ios/hig-foundations/references/motion.md +103 -0
- package/skills/ios/hig-foundations/references/privacy.md +231 -0
- package/skills/ios/hig-foundations/references/right-to-left.md +206 -0
- package/skills/ios/hig-foundations/references/sf-symbols.md +310 -0
- package/skills/ios/hig-foundations/references/spatial-layout.md +142 -0
- package/skills/ios/hig-foundations/references/typography.md +1146 -0
- package/skills/ios/hig-foundations/references/writing.md +91 -0
- package/skills/ios/hig-inputs/SKILL.md +94 -0
- package/skills/ios/hig-inputs/references/apple-pencil-and-scribble.md +148 -0
- package/skills/ios/hig-inputs/references/camera-control.md +107 -0
- package/skills/ios/hig-inputs/references/digital-crown.md +83 -0
- package/skills/ios/hig-inputs/references/eyes.md +120 -0
- package/skills/ios/hig-inputs/references/focus-and-selection.md +120 -0
- package/skills/ios/hig-inputs/references/game-controls.md +156 -0
- package/skills/ios/hig-inputs/references/gestures.md +208 -0
- package/skills/ios/hig-inputs/references/gyro-and-accelerometer.md +40 -0
- package/skills/ios/hig-inputs/references/keyboards.md +234 -0
- package/skills/ios/hig-inputs/references/nearby-interactions.md +70 -0
- package/skills/ios/hig-inputs/references/pointing-devices.md +237 -0
- package/skills/ios/hig-inputs/references/remotes.md +67 -0
- package/skills/ios/hig-inputs/references/spatial-interactions.md +70 -0
- package/skills/ios/hig-patterns/SKILL.md +104 -0
- package/skills/ios/hig-patterns/references/charting-data.md +81 -0
- package/skills/ios/hig-patterns/references/collaboration-and-sharing.md +86 -0
- package/skills/ios/hig-patterns/references/drag-and-drop.md +134 -0
- package/skills/ios/hig-patterns/references/entering-data.md +69 -0
- package/skills/ios/hig-patterns/references/feedback.md +67 -0
- package/skills/ios/hig-patterns/references/file-management.md +135 -0
- package/skills/ios/hig-patterns/references/going-full-screen.md +79 -0
- package/skills/ios/hig-patterns/references/launching.md +81 -0
- package/skills/ios/hig-patterns/references/live-viewing-apps.md +79 -0
- package/skills/ios/hig-patterns/references/loading.md +59 -0
- package/skills/ios/hig-patterns/references/managing-accounts.md +107 -0
- package/skills/ios/hig-patterns/references/managing-notifications.md +99 -0
- package/skills/ios/hig-patterns/references/modality.md +82 -0
- package/skills/ios/hig-patterns/references/multitasking.md +131 -0
- package/skills/ios/hig-patterns/references/offering-help.md +117 -0
- package/skills/ios/hig-patterns/references/onboarding.md +69 -0
- package/skills/ios/hig-patterns/references/playing-audio.md +124 -0
- package/skills/ios/hig-patterns/references/playing-haptics.md +280 -0
- package/skills/ios/hig-patterns/references/playing-video.md +180 -0
- package/skills/ios/hig-patterns/references/printing.md +50 -0
- package/skills/ios/hig-patterns/references/ratings-and-reviews.md +48 -0
- package/skills/ios/hig-patterns/references/searching.md +70 -0
- package/skills/ios/hig-patterns/references/settings.md +84 -0
- package/skills/ios/hig-patterns/references/undo-and-redo.md +58 -0
- package/skills/ios/hig-patterns/references/workouts.md +76 -0
- package/skills/ios/hig-platforms/SKILL.md +84 -0
- package/skills/ios/hig-platforms/references/designing-for-games.md +159 -0
- package/skills/ios/hig-platforms/references/designing-for-ios.md +66 -0
- package/skills/ios/hig-platforms/references/designing-for-ipados.md +64 -0
- package/skills/ios/hig-platforms/references/designing-for-macos.md +70 -0
- package/skills/ios/hig-platforms/references/designing-for-tvos.md +68 -0
- package/skills/ios/hig-platforms/references/designing-for-visionos.md +85 -0
- package/skills/ios/hig-platforms/references/designing-for-watchos.md +74 -0
- package/skills/ios/hig-project-context/SKILL.md +133 -0
- package/skills/ios/hig-technologies/SKILL.md +107 -0
- package/skills/ios/hig-technologies/references/airplay.md +125 -0
- package/skills/ios/hig-technologies/references/always-on.md +62 -0
- package/skills/ios/hig-technologies/references/apple-pay.md +441 -0
- package/skills/ios/hig-technologies/references/augmented-reality.md +247 -0
- package/skills/ios/hig-technologies/references/carekit.md +224 -0
- package/skills/ios/hig-technologies/references/carplay.md +119 -0
- package/skills/ios/hig-technologies/references/game-center.md +343 -0
- package/skills/ios/hig-technologies/references/generative-ai.md +110 -0
- package/skills/ios/hig-technologies/references/healthkit.md +120 -0
- package/skills/ios/hig-technologies/references/homekit.md +343 -0
- package/skills/ios/hig-technologies/references/icloud.md +52 -0
- package/skills/ios/hig-technologies/references/id-verifier.md +73 -0
- package/skills/ios/hig-technologies/references/imessage-apps-and-stickers.md +105 -0
- package/skills/ios/hig-technologies/references/in-app-purchase.md +263 -0
- package/skills/ios/hig-technologies/references/live-photos.md +54 -0
- package/skills/ios/hig-technologies/references/mac-catalyst.md +216 -0
- package/skills/ios/hig-technologies/references/machine-learning.md +394 -0
- package/skills/ios/hig-technologies/references/maps.md +221 -0
- package/skills/ios/hig-technologies/references/nfc.md +51 -0
- package/skills/ios/hig-technologies/references/photo-editing.md +40 -0
- package/skills/ios/hig-technologies/references/researchkit.md +134 -0
- package/skills/ios/hig-technologies/references/shareplay.md +142 -0
- package/skills/ios/hig-technologies/references/shazamkit.md +47 -0
- package/skills/ios/hig-technologies/references/sign-in-with-apple.md +288 -0
- package/skills/ios/hig-technologies/references/siri.md +523 -0
- package/skills/ios/hig-technologies/references/tap-to-pay-on-iphone.md +208 -0
- package/skills/ios/hig-technologies/references/voiceover.md +90 -0
- package/skills/ios/hig-technologies/references/wallet.md +420 -0
- package/skills/ios/ios-26-platform/SKILL.md +53 -0
- package/skills/ios/ios-26-platform/references/automatic-adoption.md +161 -0
- package/skills/ios/ios-26-platform/references/backward-compat.md +238 -0
- package/skills/ios/ios-26-platform/references/liquid-glass.md +255 -0
- package/skills/ios/ios-26-platform/references/swiftui-apis.md +277 -0
- package/skills/ios/ios-26-platform/references/toolbar-navigation.md +250 -0
- package/skills/ios/ios-bootstrap/SKILL.md +107 -0
- package/skills/ios/ios-bootstrap/references/apple-docs-mcp-config.md +28 -0
- package/skills/ios/ios-bootstrap/references/new-project-dialog.md +41 -0
- package/skills/ios/ios-bootstrap/references/xcode-mcp-config.md +29 -0
- package/skills/ios/ios-debugger-agent/LICENSE +21 -0
- package/skills/ios/ios-debugger-agent/SKILL.md +58 -0
- package/skills/ios/ios-debugger-agent/agents/openai.yaml +4 -0
- package/skills/ios/ios-entitlements-generator/SKILL.md +47 -0
- package/skills/ios/ios-info-plist-hardening/SKILL.md +130 -0
- package/skills/ios/ios-maestro-flow-author/SKILL.md +68 -0
- package/skills/ios/ios-maestro-flow-author/references/input-and-scroll.yaml +17 -0
- package/skills/ios/ios-maestro-flow-author/references/modal-and-dismiss.yaml +14 -0
- package/skills/ios/ios-maestro-flow-author/references/onboarding-flow.yaml +16 -0
- package/skills/ios/ios-maestro-flow-author/references/tab-navigation.yaml +13 -0
- package/skills/ios/ios-maestro-flow-author/references/tap-and-assert.yaml +9 -0
- package/skills/ios/swift-accessibility/LICENSE +21 -0
- package/skills/ios/swift-accessibility/SKILL.md +371 -0
- package/skills/ios/swift-accessibility/examples/before-after-appkit.md +446 -0
- package/skills/ios/swift-accessibility/examples/before-after-swiftui.md +441 -0
- package/skills/ios/swift-accessibility/examples/before-after-uikit.md +464 -0
- package/skills/ios/swift-accessibility/references/assistive-access.md +441 -0
- package/skills/ios/swift-accessibility/references/display-settings.md +491 -0
- package/skills/ios/swift-accessibility/references/dynamic-type.md +420 -0
- package/skills/ios/swift-accessibility/references/media-accessibility.md +421 -0
- package/skills/ios/swift-accessibility/references/motor-input.md +393 -0
- package/skills/ios/swift-accessibility/references/nutrition-labels.md +362 -0
- package/skills/ios/swift-accessibility/references/platform-specifics.md +515 -0
- package/skills/ios/swift-accessibility/references/semantic-structure.md +585 -0
- package/skills/ios/swift-accessibility/references/testing-auditing.md +507 -0
- package/skills/ios/swift-accessibility/references/voice-control.md +317 -0
- package/skills/ios/swift-accessibility/references/voiceover-swiftui.md +584 -0
- package/skills/ios/swift-accessibility/references/voiceover-uikit.md +519 -0
- package/skills/ios/swift-accessibility/references/wcag-mapping.md +167 -0
- package/skills/ios/swift-accessibility/resources/audit-template.swift +128 -0
- package/skills/ios/swift-accessibility/resources/qa-checklist.md +258 -0
- package/skills/ios/swift-actor-persistence/SKILL.md +143 -0
- package/skills/ios/swift-concurrency/LICENSE +21 -0
- package/skills/ios/swift-concurrency/SKILL.md +171 -0
- package/skills/ios/swift-concurrency/references/_index.md +50 -0
- package/skills/ios/swift-concurrency/references/actors.md +660 -0
- package/skills/ios/swift-concurrency/references/async-algorithms.md +847 -0
- package/skills/ios/swift-concurrency/references/async-await-basics.md +266 -0
- package/skills/ios/swift-concurrency/references/async-sequences.md +710 -0
- package/skills/ios/swift-concurrency/references/core-data.md +560 -0
- package/skills/ios/swift-concurrency/references/glossary.md +135 -0
- package/skills/ios/swift-concurrency/references/linting.md +155 -0
- package/skills/ios/swift-concurrency/references/memory-management.md +569 -0
- package/skills/ios/swift-concurrency/references/migration.md +1104 -0
- package/skills/ios/swift-concurrency/references/performance.md +593 -0
- package/skills/ios/swift-concurrency/references/sendable.md +598 -0
- package/skills/ios/swift-concurrency/references/tasks.md +636 -0
- package/skills/ios/swift-concurrency/references/testing.md +592 -0
- package/skills/ios/swift-concurrency/references/threading.md +495 -0
- package/skills/ios/swift-concurrency-6-2/SKILL.md +216 -0
- package/skills/ios/swift-protocol-di-testing/SKILL.md +190 -0
- package/skills/ios/swift-security-expert/LICENSE +21 -0
- package/skills/ios/swift-security-expert/SKILL.md +470 -0
- package/skills/ios/swift-security-expert/references/biometric-authentication.md +565 -0
- package/skills/ios/swift-security-expert/references/certificate-trust.md +592 -0
- package/skills/ios/swift-security-expert/references/common-anti-patterns.md +690 -0
- package/skills/ios/swift-security-expert/references/compliance-owasp-mapping.md +537 -0
- package/skills/ios/swift-security-expert/references/credential-storage-patterns.md +721 -0
- package/skills/ios/swift-security-expert/references/cryptokit-public-key.md +505 -0
- package/skills/ios/swift-security-expert/references/cryptokit-symmetric.md +497 -0
- package/skills/ios/swift-security-expert/references/keychain-access-control.md +508 -0
- package/skills/ios/swift-security-expert/references/keychain-fundamentals.md +596 -0
- package/skills/ios/swift-security-expert/references/keychain-item-classes.md +476 -0
- package/skills/ios/swift-security-expert/references/keychain-sharing.md +458 -0
- package/skills/ios/swift-security-expert/references/migration-legacy-stores.md +727 -0
- package/skills/ios/swift-security-expert/references/secure-enclave.md +539 -0
- package/skills/ios/swift-security-expert/references/testing-security-code.md +781 -0
- package/skills/ios/swift-testing-expert/LICENSE +21 -0
- package/skills/ios/swift-testing-expert/SKILL.md +79 -0
- package/skills/ios/swift-testing-expert/references/_index.md +12 -0
- package/skills/ios/swift-testing-expert/references/async-testing-and-waiting.md +127 -0
- package/skills/ios/swift-testing-expert/references/expectations.md +145 -0
- package/skills/ios/swift-testing-expert/references/fundamentals.md +141 -0
- package/skills/ios/swift-testing-expert/references/migration-from-xctest.md +127 -0
- package/skills/ios/swift-testing-expert/references/parallelization-and-isolation.md +95 -0
- package/skills/ios/swift-testing-expert/references/parameterized-testing.md +284 -0
- package/skills/ios/swift-testing-expert/references/performance-and-best-practices.md +187 -0
- package/skills/ios/swift-testing-expert/references/traits-and-tags.md +114 -0
- package/skills/ios/swift-testing-expert/references/xcode-workflows.md +70 -0
- package/skills/ios/swiftdata-pro/LICENSE +21 -0
- package/skills/ios/swiftdata-pro/SKILL.md +102 -0
- package/skills/ios/swiftdata-pro/agents/openai.yaml +10 -0
- package/skills/ios/swiftdata-pro/assets/swiftdata-pro-icon.png +0 -0
- package/skills/ios/swiftdata-pro/assets/swiftdata-pro-icon.svg +29 -0
- package/skills/ios/swiftdata-pro/references/class-inheritance.md +104 -0
- package/skills/ios/swiftdata-pro/references/cloudkit.md +10 -0
- package/skills/ios/swiftdata-pro/references/core-rules.md +20 -0
- package/skills/ios/swiftdata-pro/references/indexing.md +27 -0
- package/skills/ios/swiftdata-pro/references/predicates.md +73 -0
- package/skills/ios/swiftui-design-principles/AGENTS.md +21 -0
- package/skills/ios/swiftui-design-principles/LICENSE +21 -0
- package/skills/ios/swiftui-design-principles/README.md +41 -0
- package/skills/ios/swiftui-design-principles/SKILL.md +605 -0
- package/skills/ios/swiftui-design-principles/metadata.json +10 -0
- package/skills/ios/swiftui-design-tokens/SKILL.md +475 -0
- package/skills/ios/swiftui-liquid-glass/LICENSE +21 -0
- package/skills/ios/swiftui-liquid-glass/SKILL.md +95 -0
- package/skills/ios/swiftui-liquid-glass/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-liquid-glass/references/liquid-glass.md +280 -0
- package/skills/ios/swiftui-performance-audit/LICENSE +21 -0
- package/skills/ios/swiftui-performance-audit/SKILL.md +111 -0
- package/skills/ios/swiftui-performance-audit/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-performance-audit/references/code-smells.md +150 -0
- package/skills/ios/swiftui-performance-audit/references/demystify-swiftui-performance-wwdc23.md +46 -0
- package/skills/ios/swiftui-performance-audit/references/optimizing-swiftui-performance-instruments.md +29 -0
- package/skills/ios/swiftui-performance-audit/references/profiling-intake.md +44 -0
- package/skills/ios/swiftui-performance-audit/references/report-template.md +47 -0
- package/skills/ios/swiftui-performance-audit/references/understanding-hangs-in-your-app.md +33 -0
- package/skills/ios/swiftui-performance-audit/references/understanding-improving-swiftui-performance.md +52 -0
- package/skills/ios/swiftui-pro/LICENSE +21 -0
- package/skills/ios/swiftui-pro/SKILL.md +108 -0
- package/skills/ios/swiftui-pro/agents/openai.yaml +10 -0
- package/skills/ios/swiftui-pro/assets/swiftui-pro-icon.png +0 -0
- package/skills/ios/swiftui-pro/assets/swiftui-pro-icon.svg +29 -0
- package/skills/ios/swiftui-pro/references/accessibility.md +13 -0
- package/skills/ios/swiftui-pro/references/api.md +39 -0
- package/skills/ios/swiftui-pro/references/data.md +43 -0
- package/skills/ios/swiftui-pro/references/design.md +31 -0
- package/skills/ios/swiftui-pro/references/hygiene.md +9 -0
- package/skills/ios/swiftui-pro/references/navigation.md +14 -0
- package/skills/ios/swiftui-pro/references/performance.md +46 -0
- package/skills/ios/swiftui-pro/references/swift.md +56 -0
- package/skills/ios/swiftui-pro/references/views.md +35 -0
- package/skills/ios/swiftui-ui-patterns/LICENSE +21 -0
- package/skills/ios/swiftui-ui-patterns/SKILL.md +100 -0
- package/skills/ios/swiftui-ui-patterns/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-ui-patterns/references/app-wiring.md +201 -0
- package/skills/ios/swiftui-ui-patterns/references/async-state.md +96 -0
- package/skills/ios/swiftui-ui-patterns/references/components-index.md +50 -0
- package/skills/ios/swiftui-ui-patterns/references/controls.md +57 -0
- package/skills/ios/swiftui-ui-patterns/references/deeplinks.md +66 -0
- package/skills/ios/swiftui-ui-patterns/references/focus.md +90 -0
- package/skills/ios/swiftui-ui-patterns/references/form.md +97 -0
- package/skills/ios/swiftui-ui-patterns/references/grids.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/haptics.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/input-toolbar.md +51 -0
- package/skills/ios/swiftui-ui-patterns/references/lightweight-clients.md +93 -0
- package/skills/ios/swiftui-ui-patterns/references/list.md +86 -0
- package/skills/ios/swiftui-ui-patterns/references/loading-placeholders.md +38 -0
- package/skills/ios/swiftui-ui-patterns/references/macos-settings.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/matched-transitions.md +59 -0
- package/skills/ios/swiftui-ui-patterns/references/media.md +73 -0
- package/skills/ios/swiftui-ui-patterns/references/menu-bar.md +101 -0
- package/skills/ios/swiftui-ui-patterns/references/navigationstack.md +159 -0
- package/skills/ios/swiftui-ui-patterns/references/overlay.md +45 -0
- package/skills/ios/swiftui-ui-patterns/references/performance.md +62 -0
- package/skills/ios/swiftui-ui-patterns/references/previews.md +48 -0
- package/skills/ios/swiftui-ui-patterns/references/scroll-reveal.md +133 -0
- package/skills/ios/swiftui-ui-patterns/references/scrollview.md +87 -0
- package/skills/ios/swiftui-ui-patterns/references/searchable.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/sheets.md +155 -0
- package/skills/ios/swiftui-ui-patterns/references/split-views.md +72 -0
- package/skills/ios/swiftui-ui-patterns/references/tabview.md +114 -0
- package/skills/ios/swiftui-ui-patterns/references/theming.md +71 -0
- package/skills/ios/swiftui-ui-patterns/references/title-menus.md +93 -0
- package/skills/ios/swiftui-ui-patterns/references/top-bar.md +49 -0
- package/skills/ios/swiftui-view-refactor/LICENSE +21 -0
- package/skills/ios/swiftui-view-refactor/SKILL.md +207 -0
- package/skills/ios/swiftui-view-refactor/agents/openai.yaml +4 -0
- package/skills/ios/swiftui-view-refactor/references/mv-patterns.md +161 -0
- package/skills/ios/widgetkit/LICENSE +131 -0
- package/skills/ios/widgetkit/SKILL.md +502 -0
- package/skills/ios/widgetkit/references/widgetkit-advanced.md +871 -0
- package/skills/ios/writing-for-interfaces/SKILL.md +75 -0
- package/skills/web/accessibility/SKILL.md +146 -0
- package/skills/web/aceternity-ui/SKILL.md +719 -0
- package/skills/web/aceternity-ui/metadata.json +10 -0
- package/skills/web/api-design/SKILL.md +523 -0
- package/skills/web/chart-accessibility/SKILL.md +332 -0
- package/skills/web/composition-patterns/AGENTS.md +946 -0
- package/skills/web/composition-patterns/README.md +60 -0
- package/skills/web/composition-patterns/SKILL.md +89 -0
- package/skills/web/composition-patterns/metadata.json +11 -0
- package/skills/web/composition-patterns/rules/_sections.md +29 -0
- package/skills/web/composition-patterns/rules/_template.md +24 -0
- package/skills/web/composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/skills/web/composition-patterns/rules/architecture-compound-components.md +112 -0
- package/skills/web/composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/skills/web/composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/skills/web/composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/skills/web/composition-patterns/rules/state-context-interface.md +191 -0
- package/skills/web/composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/skills/web/composition-patterns/rules/state-lift-state.md +125 -0
- package/skills/web/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/skills/web/database-migrations/SKILL.md +429 -0
- package/skills/web/deployment-patterns/SKILL.md +427 -0
- package/skills/web/docker-patterns/SKILL.md +364 -0
- package/skills/web/e2e-testing/SKILL.md +326 -0
- package/skills/web/lighthouse-ci/SKILL.md +361 -0
- package/skills/web/mcp-server-patterns/SKILL.md +69 -0
- package/skills/web/next-best-practices/SKILL.md +153 -0
- package/skills/web/next-best-practices/async-patterns.md +87 -0
- package/skills/web/next-best-practices/bundling.md +180 -0
- package/skills/web/next-best-practices/data-patterns.md +297 -0
- package/skills/web/next-best-practices/debug-tricks.md +105 -0
- package/skills/web/next-best-practices/directives.md +73 -0
- package/skills/web/next-best-practices/error-handling.md +227 -0
- package/skills/web/next-best-practices/file-conventions.md +140 -0
- package/skills/web/next-best-practices/font.md +245 -0
- package/skills/web/next-best-practices/functions.md +108 -0
- package/skills/web/next-best-practices/hydration-error.md +91 -0
- package/skills/web/next-best-practices/image.md +173 -0
- package/skills/web/next-best-practices/metadata.md +301 -0
- package/skills/web/next-best-practices/parallel-routes.md +287 -0
- package/skills/web/next-best-practices/route-handlers.md +146 -0
- package/skills/web/next-best-practices/rsc-boundaries.md +159 -0
- package/skills/web/next-best-practices/runtime-selection.md +39 -0
- package/skills/web/next-best-practices/scripts.md +141 -0
- package/skills/web/next-best-practices/self-hosting.md +371 -0
- package/skills/web/next-best-practices/suspense-boundaries.md +67 -0
- package/skills/web/next-cache-components/SKILL.md +411 -0
- package/skills/web/postgres-best-practices/SKILL.md +14 -0
- package/skills/web/postgres-best-practices/references/schema-design.md +9 -0
- package/skills/web/react-best-practices/AGENTS.md +3810 -0
- package/skills/web/react-best-practices/README.md +123 -0
- package/skills/web/react-best-practices/SKILL.md +149 -0
- package/skills/web/react-best-practices/metadata.json +15 -0
- package/skills/web/react-best-practices/rules/_sections.md +46 -0
- package/skills/web/react-best-practices/rules/_template.md +28 -0
- package/skills/web/react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/skills/web/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/skills/web/react-best-practices/rules/advanced-init-once.md +42 -0
- package/skills/web/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/skills/web/react-best-practices/rules/async-api-routes.md +38 -0
- package/skills/web/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/skills/web/react-best-practices/rules/async-defer-await.md +82 -0
- package/skills/web/react-best-practices/rules/async-dependencies.md +51 -0
- package/skills/web/react-best-practices/rules/async-parallel.md +28 -0
- package/skills/web/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/skills/web/react-best-practices/rules/bundle-analyzable-paths.md +63 -0
- package/skills/web/react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/skills/web/react-best-practices/rules/bundle-conditional.md +31 -0
- package/skills/web/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/skills/web/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/skills/web/react-best-practices/rules/bundle-preload.md +50 -0
- package/skills/web/react-best-practices/rules/client-event-listeners.md +74 -0
- package/skills/web/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/skills/web/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/skills/web/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/skills/web/react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/skills/web/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/skills/web/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/skills/web/react-best-practices/rules/js-cache-storage.md +70 -0
- package/skills/web/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/skills/web/react-best-practices/rules/js-early-exit.md +50 -0
- package/skills/web/react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/skills/web/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/skills/web/react-best-practices/rules/js-index-maps.md +37 -0
- package/skills/web/react-best-practices/rules/js-length-check-first.md +49 -0
- package/skills/web/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/skills/web/react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/skills/web/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/skills/web/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/skills/web/react-best-practices/rules/rendering-activity.md +26 -0
- package/skills/web/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/skills/web/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/skills/web/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/skills/web/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/skills/web/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/skills/web/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/skills/web/react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/skills/web/react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/skills/web/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/skills/web/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/skills/web/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/skills/web/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/skills/web/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/skills/web/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/skills/web/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/skills/web/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/skills/web/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/skills/web/react-best-practices/rules/rerender-memo.md +44 -0
- package/skills/web/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/skills/web/react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/skills/web/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/skills/web/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/skills/web/react-best-practices/rules/rerender-transitions.md +40 -0
- package/skills/web/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/skills/web/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/skills/web/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/skills/web/react-best-practices/rules/server-auth-actions.md +96 -0
- package/skills/web/react-best-practices/rules/server-cache-lru.md +41 -0
- package/skills/web/react-best-practices/rules/server-cache-react.md +76 -0
- package/skills/web/react-best-practices/rules/server-dedup-props.md +65 -0
- package/skills/web/react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/skills/web/react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/skills/web/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/skills/web/react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/skills/web/react-best-practices/rules/server-serialization.md +38 -0
- package/skills/web/seo/SKILL.md +154 -0
- package/skills/web/web-design-guidelines/SKILL.md +39 -0
- package/skills/web/zap-scan-config/SKILL.md +444 -0
- package/skills/web/zap-scan-config/assets/.gitkeep +9 -0
- package/skills/web/zap-scan-config/assets/github_action.yml +207 -0
- package/skills/web/zap-scan-config/assets/gitlab_ci.yml +226 -0
- package/skills/web/zap-scan-config/assets/zap_automation.yaml +196 -0
- package/skills/web/zap-scan-config/assets/zap_context.xml +192 -0
- package/skills/web/zap-scan-config/references/EXAMPLE.md +40 -0
- package/skills/web/zap-scan-config/references/api_testing_guide.md +475 -0
- package/skills/web/zap-scan-config/references/authentication_guide.md +431 -0
- package/skills/web/zap-scan-config/references/false_positive_handling.md +427 -0
- package/skills/web/zap-scan-config/references/owasp_mapping.md +255 -0
- package/src/lrr/aggregator.ts +80 -0
- package/src/orchestrator/hooks/context-header.ts +95 -0
- package/src/orchestrator/hooks/token-accounting-emitter.ts +77 -0
- package/src/orchestrator/hooks/token-accounting.ts +101 -0
- package/src/orchestrator/mcp/cycle-counter.ts +129 -0
- package/src/orchestrator/mcp/scribe.ts +283 -0
- package/src/orchestrator/mcp/state-save.ts +149 -0
- package/src/orchestrator/mcp/write-lease.ts +167 -0
- package/src/orchestrator/phase4-shared-context.ts +41 -0
- package/src/orchestrator/schemas/backward-edge.ts +46 -0
- package/agents/agentic-identity-trust.md +0 -121
- package/agents/data-consolidation-agent.md +0 -39
- package/agents/design-image-prompt-engineer.md +0 -105
- package/agents/design-visual-storyteller.md +0 -147
- package/agents/design-whimsy-injector.md +0 -89
- package/agents/engineering-autonomous-optimization-architect.md +0 -105
- package/agents/market-intel.md +0 -35
- package/agents/marketing-instagram-curator.md +0 -111
- package/agents/marketing-reddit-community-builder.md +0 -121
- package/agents/marketing-social-media-strategist.md +0 -74
- package/agents/marketing-tiktok-strategist.md +0 -123
- package/agents/marketing-twitter-engager.md +0 -124
- package/agents/marketing-wechat-official-account.md +0 -143
- package/agents/marketing-xiaohongshu-specialist.md +0 -136
- package/agents/marketing-zhihu-strategist.md +0 -160
- package/agents/product-behavioral-nudge-engine.md +0 -78
- package/agents/project-management-experiment-tracker.md +0 -102
- package/agents/report-distribution-agent.md +0 -43
- package/agents/risk-analysis.md +0 -45
- package/agents/sales-data-extraction-agent.md +0 -46
- package/agents/specialized-cultural-intelligence-strategist.md +0 -65
- package/agents/specialized-developer-advocate.md +0 -146
- package/agents/support-analytics-reporter.md +0 -133
- package/agents/support-executive-summary-generator.md +0 -64
- package/agents/support-finance-tracker.md +0 -145
- package/agents/support-legal-compliance-checker.md +0 -129
- package/agents/support-support-responder.md +0 -91
- package/agents/testing-accessibility-auditor.md +0 -110
- package/agents/testing-test-results-analyzer.md +0 -97
- package/agents/testing-tool-evaluator.md +0 -76
- package/agents/testing-workflow-optimizer.md +0 -99
- package/agents/user-research.md +0 -40
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
# Platform-Specific Accessibility
|
|
2
|
+
|
|
3
|
+
Accessibility APIs and behavior differ across supported platforms. This reference covers macOS, watchOS, tvOS, and visionOS — where behavior diverges from iOS patterns.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
- [macOS](#macos)
|
|
7
|
+
- [watchOS](#watchos)
|
|
8
|
+
- [tvOS](#tvos)
|
|
9
|
+
- [visionOS](#visionos)
|
|
10
|
+
- [Cross-Platform Conditional Code](#cross-platform-conditional-code)
|
|
11
|
+
- [Common Cross-Platform Mistakes](#common-cross-platform-mistakes)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## macOS
|
|
16
|
+
|
|
17
|
+
### NSAccessibility vs UIAccessibility
|
|
18
|
+
|
|
19
|
+
macOS uses `NSAccessibility` (AppKit) instead of `UIAccessibility`. SwiftUI handles most cases automatically, but AppKit code requires explicit NSAccessibility work.
|
|
20
|
+
|
|
21
|
+
### NSAccessibility Protocol
|
|
22
|
+
|
|
23
|
+
```swift
|
|
24
|
+
import AppKit
|
|
25
|
+
|
|
26
|
+
class CustomControl: NSView {
|
|
27
|
+
// REQUIRED: Declare what this element is
|
|
28
|
+
override func accessibilityRole() -> NSAccessibility.Role? {
|
|
29
|
+
return .button
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
override func accessibilityLabel() -> String? {
|
|
33
|
+
return "Share Document"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
override func accessibilityHelp() -> String? {
|
|
37
|
+
return "Shares the current document with other users."
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
override func isAccessibilityEnabled() -> Bool {
|
|
41
|
+
return isEnabled
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
override func isAccessibilityElement() -> Bool {
|
|
45
|
+
return true
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
override func accessibilityPerformPress() -> Bool {
|
|
49
|
+
// Handle VoiceOver activation (Space/Return key)
|
|
50
|
+
performAction()
|
|
51
|
+
return true
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### NSAccessibility Role Reference
|
|
57
|
+
|
|
58
|
+
| Role | `NSAccessibility.Role` | When to Use |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| Button | `.button` | Clickable controls |
|
|
61
|
+
| Checkbox | `.checkBox` | Two-state toggles |
|
|
62
|
+
| Radio button | `.radioButton` | Mutually exclusive options |
|
|
63
|
+
| Text field | `.textField` | Editable text |
|
|
64
|
+
| Static text | `.staticText` | Non-interactive labels |
|
|
65
|
+
| Slider | `.slider` | Range controls |
|
|
66
|
+
| Progress indicator | `.progressIndicator` | Loading/progress |
|
|
67
|
+
| Table | `.table` | Tabular data |
|
|
68
|
+
| List | `.list` | Lists of items |
|
|
69
|
+
| Group | `.group` | Containers |
|
|
70
|
+
| Toolbar | `.toolbar` | Toolbars |
|
|
71
|
+
| Menu | `.menu` | Menus |
|
|
72
|
+
| Window | `.window` | Windows |
|
|
73
|
+
|
|
74
|
+
### Custom Actions on macOS
|
|
75
|
+
|
|
76
|
+
```swift
|
|
77
|
+
class InteractiveRow: NSView {
|
|
78
|
+
override func accessibilityCustomActions() -> [NSAccessibilityCustomAction]? {
|
|
79
|
+
return [
|
|
80
|
+
NSAccessibilityCustomAction(name: "Reply", target: self, selector: #selector(reply)),
|
|
81
|
+
NSAccessibilityCustomAction(name: "Archive", target: self, selector: #selector(archive)),
|
|
82
|
+
NSAccessibilityCustomAction(name: "Delete") { [weak self] in
|
|
83
|
+
self?.delete()
|
|
84
|
+
return true
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### NSAccessibilityElement (Custom Elements)
|
|
92
|
+
|
|
93
|
+
For custom-drawn content (Core Graphics, Metal):
|
|
94
|
+
|
|
95
|
+
```swift
|
|
96
|
+
class ChartView: NSView {
|
|
97
|
+
var bars: [BarData] = []
|
|
98
|
+
|
|
99
|
+
override func isAccessibilityElement() -> Bool { false }
|
|
100
|
+
|
|
101
|
+
override func accessibilityChildren() -> [Any]? {
|
|
102
|
+
return bars.enumerated().map { index, bar in
|
|
103
|
+
let element = NSAccessibilityElement()
|
|
104
|
+
element.setAccessibilityRole(.staticText)
|
|
105
|
+
element.setAccessibilityFrame(convert(frameForBar(at: index), to: nil))
|
|
106
|
+
element.setAccessibilityLabel(bar.label)
|
|
107
|
+
element.setAccessibilityValue(bar.value)
|
|
108
|
+
element.setAccessibilityParent(self)
|
|
109
|
+
return element
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Custom Rotors on macOS
|
|
116
|
+
|
|
117
|
+
```swift
|
|
118
|
+
class DocumentViewController: NSViewController, NSAccessibilityCustomRotorItemSearchDelegate {
|
|
119
|
+
var headingViews: [NSView] = []
|
|
120
|
+
|
|
121
|
+
override func viewDidLoad() {
|
|
122
|
+
super.viewDidLoad()
|
|
123
|
+
let rotor = NSAccessibilityCustomRotor(label: "Headings", itemSearchDelegate: self)
|
|
124
|
+
view.setAccessibilityCustomRotors([rotor])
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
func rotor(_ rotor: NSAccessibilityCustomRotor, resultFor searchParameters: NSAccessibilityCustomRotor.SearchParameters) -> NSAccessibilityCustomRotor.ItemResult? {
|
|
128
|
+
// Navigate through headingViews based on searchParameters.searchDirection
|
|
129
|
+
// Return nil when no more headings in that direction
|
|
130
|
+
return nil
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### VoiceOver on macOS Differences
|
|
136
|
+
|
|
137
|
+
On macOS, VoiceOver uses a **cursor** model (not a swipe model):
|
|
138
|
+
- VoiceOver Cursor moves through elements with Tab, arrow keys, and VO+arrow
|
|
139
|
+
- Keyboard shortcuts are different from iOS swipe gestures
|
|
140
|
+
- QuickNav mode (VO+Q) lets users navigate without holding VO keys
|
|
141
|
+
- Web content uses the same VoiceOver gestures as Safari
|
|
142
|
+
|
|
143
|
+
**Keyboard navigation is first-class on macOS.** Every interactive element must be reachable by Tab and activated by Space/Return.
|
|
144
|
+
|
|
145
|
+
### Focus Ring
|
|
146
|
+
|
|
147
|
+
macOS displays a focus ring around the currently focused element. NSView provides this by default for standard controls.
|
|
148
|
+
|
|
149
|
+
```swift
|
|
150
|
+
// Custom view — draw focus ring manually
|
|
151
|
+
class FocusableView: NSView {
|
|
152
|
+
override var focusRingType: NSFocusRingType {
|
|
153
|
+
get { .default }
|
|
154
|
+
set { }
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
override func drawFocusRingMask() {
|
|
158
|
+
NSBezierPath(roundedRect: bounds, xRadius: 4, yRadius: 4).fill()
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
override var focusRingMaskBounds: NSRect { bounds }
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Mac Catalyst
|
|
166
|
+
|
|
167
|
+
Mac Catalyst apps use UIKit APIs but run on macOS. Most UIAccessibility APIs work directly. Notable differences:
|
|
168
|
+
- `UIFocusSystem` enables keyboard navigation automatically in Catalyst
|
|
169
|
+
- Full Keyboard Access is always active on Mac
|
|
170
|
+
- Pointer / hover events differ from touch — test hover states
|
|
171
|
+
- `NSCursor` management for custom views
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## watchOS
|
|
176
|
+
|
|
177
|
+
### VoiceOver on watchOS
|
|
178
|
+
|
|
179
|
+
WatchOS VoiceOver interaction model:
|
|
180
|
+
- **Tap** on element to select
|
|
181
|
+
- **Double-tap** to activate
|
|
182
|
+
- **Swipe up/down** to navigate (not left/right like iOS)
|
|
183
|
+
- **Digital Crown** rotates to change values on adjustable elements
|
|
184
|
+
|
|
185
|
+
```swift
|
|
186
|
+
// watchOS VoiceOver works with standard SwiftUI modifiers
|
|
187
|
+
// accessibilityLabel, accessibilityHint, accessibilityValue, etc.
|
|
188
|
+
Button("Start Workout") { startWorkout() }
|
|
189
|
+
.accessibilityLabel("Start running workout")
|
|
190
|
+
.accessibilityHint("Begins tracking your run")
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Digital Crown Accessibility
|
|
194
|
+
|
|
195
|
+
```swift
|
|
196
|
+
// ✅ Support Digital Crown for adjustable controls
|
|
197
|
+
struct VolumeControl: View {
|
|
198
|
+
@State private var volume = 0.5
|
|
199
|
+
|
|
200
|
+
var body: some View {
|
|
201
|
+
Slider(value: $volume, in: 0...1)
|
|
202
|
+
.accessibilityLabel("Volume")
|
|
203
|
+
.accessibilityValue("\(Int(volume * 100)) percent")
|
|
204
|
+
.accessibilityAdjustableAction { direction in
|
|
205
|
+
switch direction {
|
|
206
|
+
case .increment: volume = min(1, volume + 0.1)
|
|
207
|
+
case .decrement: volume = max(0, volume - 0.1)
|
|
208
|
+
@unknown default: break
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
.focusable()
|
|
212
|
+
.digitalCrownRotation($volume, from: 0, through: 1, sensitivity: .medium)
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Reduce Motion (watchOS)
|
|
218
|
+
|
|
219
|
+
```swift
|
|
220
|
+
import WatchKit
|
|
221
|
+
|
|
222
|
+
// watchOS equivalent of isReduceMotionEnabled
|
|
223
|
+
if WKAccessibilityIsReduceMotionEnabled() {
|
|
224
|
+
// Disable animations
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Observe changes
|
|
228
|
+
NotificationCenter.default.addObserver(
|
|
229
|
+
forName: NSNotification.Name(rawValue: WKAccessibilityReduceMotionStatusDidChange),
|
|
230
|
+
object: nil,
|
|
231
|
+
queue: .main
|
|
232
|
+
) { _ in
|
|
233
|
+
updateAnimationPreferences()
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Small Screen Considerations
|
|
238
|
+
|
|
239
|
+
watchOS screens are small — especially important to test Dynamic Type:
|
|
240
|
+
|
|
241
|
+
```swift
|
|
242
|
+
// watchOS minimum: support 140% scaling (not 200% like iOS)
|
|
243
|
+
// Always test:
|
|
244
|
+
#Preview {
|
|
245
|
+
MyWatchView()
|
|
246
|
+
.environment(\.dynamicTypeSize, .xxLarge) // watchOS max commonly used
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Complications and App Shortcuts
|
|
251
|
+
|
|
252
|
+
Complications should have descriptive labels. watchOS complication accessibility uses system accessibility:
|
|
253
|
+
|
|
254
|
+
```swift
|
|
255
|
+
// Complications are read by VoiceOver using their accessibilityLabel
|
|
256
|
+
// Ensure widget/complication text is meaningful without visual context
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## tvOS
|
|
262
|
+
|
|
263
|
+
### Focus Engine
|
|
264
|
+
|
|
265
|
+
tvOS has **no pointer and no touch** — all navigation uses the Siri Remote directional pad and the Focus Engine.
|
|
266
|
+
|
|
267
|
+
Every interactive element must:
|
|
268
|
+
1. Be focusable (`canBecomeFocused` returns `true`)
|
|
269
|
+
2. Show a clear visual focus state
|
|
270
|
+
3. Respond to Select button (return key equivalent)
|
|
271
|
+
4. Handle the Menu button (= back/escape)
|
|
272
|
+
|
|
273
|
+
### Making Custom Views Focusable
|
|
274
|
+
|
|
275
|
+
```swift
|
|
276
|
+
// UIKit (tvOS)
|
|
277
|
+
class FocusableCardView: UIView {
|
|
278
|
+
override var canBecomeFocused: Bool { true }
|
|
279
|
+
|
|
280
|
+
override func didUpdateFocus(
|
|
281
|
+
in context: UIFocusUpdateContext,
|
|
282
|
+
with coordinator: UIFocusAnimationCoordinator
|
|
283
|
+
) {
|
|
284
|
+
if context.nextFocusedView === self {
|
|
285
|
+
coordinator.addCoordinatedAnimations {
|
|
286
|
+
self.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
|
|
287
|
+
self.layer.shadowOpacity = 0.5
|
|
288
|
+
self.layer.shadowRadius = 12
|
|
289
|
+
}
|
|
290
|
+
} else if context.previouslyFocusedView === self {
|
|
291
|
+
coordinator.addCoordinatedAnimations {
|
|
292
|
+
self.transform = .identity
|
|
293
|
+
self.layer.shadowOpacity = 0
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Setting Default Focus
|
|
301
|
+
|
|
302
|
+
```swift
|
|
303
|
+
// UIKit — return the element that should receive focus first
|
|
304
|
+
override var preferredFocusEnvironments: [UIFocusEnvironment] {
|
|
305
|
+
return [primaryContentButton]
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Deprecated — use preferredFocusEnvironments (shown above) instead
|
|
309
|
+
override weak var preferredFocusedView: UIView? { primaryContentButton }
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### UIFocusGuide — Bridge Focus Gaps
|
|
313
|
+
|
|
314
|
+
When directional navigation leaves a gap (empty space between two rows of buttons), use `UIFocusGuide` to redirect focus:
|
|
315
|
+
|
|
316
|
+
```swift
|
|
317
|
+
let focusGuide = UIFocusGuide()
|
|
318
|
+
view.addLayoutGuide(focusGuide)
|
|
319
|
+
|
|
320
|
+
// Guide redirects focus to the right button when navigating from left button
|
|
321
|
+
focusGuide.preferredFocusEnvironments = [rightButton]
|
|
322
|
+
|
|
323
|
+
NSLayoutConstraint.activate([
|
|
324
|
+
focusGuide.leadingAnchor.constraint(equalTo: leftButton.trailingAnchor),
|
|
325
|
+
focusGuide.trailingAnchor.constraint(equalTo: rightButton.leadingAnchor),
|
|
326
|
+
focusGuide.topAnchor.constraint(equalTo: leftButton.topAnchor),
|
|
327
|
+
focusGuide.bottomAnchor.constraint(equalTo: leftButton.bottomAnchor)
|
|
328
|
+
])
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### SwiftUI on tvOS
|
|
332
|
+
|
|
333
|
+
```swift
|
|
334
|
+
// SwiftUI Button is focusable by default on tvOS
|
|
335
|
+
Button("Play") { play() }
|
|
336
|
+
.buttonStyle(.card) // tvOS card style with lift animation
|
|
337
|
+
|
|
338
|
+
// Use focusable() for non-button interactive views
|
|
339
|
+
CustomCardView()
|
|
340
|
+
.focusable()
|
|
341
|
+
.onMoveCommand { direction in
|
|
342
|
+
// Handle directional pad navigation within the view
|
|
343
|
+
switch direction {
|
|
344
|
+
case .up: navigateUp()
|
|
345
|
+
case .down: navigateDown()
|
|
346
|
+
case .left: navigateLeft()
|
|
347
|
+
case .right: navigateRight()
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### VoiceOver on tvOS
|
|
353
|
+
|
|
354
|
+
tvOS VoiceOver is similar to iOS but uses Siri Remote gestures:
|
|
355
|
+
- Swipe on the touch surface to navigate
|
|
356
|
+
- Tap to activate focused element
|
|
357
|
+
- All standard `accessibilityLabel`, `accessibilityHint`, `accessibilityAction` APIs apply
|
|
358
|
+
|
|
359
|
+
### Menu Button = Escape
|
|
360
|
+
|
|
361
|
+
The Siri Remote Menu button is the back/escape action. Implement `accessibilityPerformEscape()` on custom view controllers:
|
|
362
|
+
|
|
363
|
+
```swift
|
|
364
|
+
override func accessibilityPerformEscape() -> Bool {
|
|
365
|
+
navigationController?.popViewController(animated: true)
|
|
366
|
+
return true
|
|
367
|
+
}
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Debugging Focus
|
|
371
|
+
|
|
372
|
+
```
|
|
373
|
+
Simulator: Debug menu → View → Show Focus for Focus Engine Debug
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## visionOS
|
|
379
|
+
|
|
380
|
+
### Accessibility in Spatial Computing
|
|
381
|
+
|
|
382
|
+
visionOS uses a mix of eye tracking, hand gestures, and voice input. VoiceOver on visionOS uses look + pinch to navigate.
|
|
383
|
+
|
|
384
|
+
### SwiftUI — Standard Modifiers Work
|
|
385
|
+
|
|
386
|
+
Standard SwiftUI accessibility modifiers (`.accessibilityLabel`, `.accessibilityHint`, traits, actions) apply directly to visionOS:
|
|
387
|
+
|
|
388
|
+
```swift
|
|
389
|
+
// ✅ Works on visionOS
|
|
390
|
+
RealityView { content in
|
|
391
|
+
// 3D content
|
|
392
|
+
}
|
|
393
|
+
.accessibilityLabel("3D Model: Red Cube")
|
|
394
|
+
.accessibilityHint("Pinch to interact")
|
|
395
|
+
.accessibilityAddTraits(.isButton)
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### RealityKit — AccessibilityComponent
|
|
399
|
+
|
|
400
|
+
For 3D entities in RealityKit, use `AccessibilityComponent`:
|
|
401
|
+
|
|
402
|
+
```swift
|
|
403
|
+
import RealityKit
|
|
404
|
+
|
|
405
|
+
// Add accessibility info to a 3D entity
|
|
406
|
+
var accessibilityComponent = AccessibilityComponent()
|
|
407
|
+
accessibilityComponent.label = "Spinning Globe"
|
|
408
|
+
accessibilityComponent.value = "Currently rotating"
|
|
409
|
+
accessibilityComponent.isAccessibilityElement = true
|
|
410
|
+
accessibilityComponent.traits = [.isButton]
|
|
411
|
+
accessibilityComponent.customActions = [
|
|
412
|
+
AccessibilityCustomAction(name: "Stop rotation") { entity in
|
|
413
|
+
entity.components.remove(RotationComponent.self)
|
|
414
|
+
return true
|
|
415
|
+
}
|
|
416
|
+
]
|
|
417
|
+
myGlobeEntity.components.set(accessibilityComponent)
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### Hover Effects
|
|
421
|
+
|
|
422
|
+
visionOS elements highlight when the user looks at them. For custom interactive views:
|
|
423
|
+
|
|
424
|
+
```swift
|
|
425
|
+
// ✅ Standard hover effect — required for interactive elements
|
|
426
|
+
MyView()
|
|
427
|
+
.hoverEffect(.lift) // or .highlight
|
|
428
|
+
|
|
429
|
+
// Ensure VoiceOver alternative exists for look-based interaction
|
|
430
|
+
MyView()
|
|
431
|
+
.hoverEffect(.highlight)
|
|
432
|
+
.accessibilityLabel("Interactive Panel")
|
|
433
|
+
.accessibilityAddTraits(.isButton)
|
|
434
|
+
.accessibilityAction { performAction() }
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### Voice Control on visionOS
|
|
438
|
+
|
|
439
|
+
Voice Control on visionOS works similarly to iOS. Elements must appear in "Show numbers" and have matching "Show names" labels. `accessibilityInputLabels` applies.
|
|
440
|
+
|
|
441
|
+
### VoiceOver on visionOS Navigation
|
|
442
|
+
|
|
443
|
+
- **Look** at an element → VoiceOver reads it
|
|
444
|
+
- **Pinch** (index finger + thumb) → Activates the focused element
|
|
445
|
+
- **Double pinch** → Navigate back
|
|
446
|
+
- **Swipe gesture** → Move to next/previous element (like iOS)
|
|
447
|
+
|
|
448
|
+
All standard accessibility modifiers apply. Ensure 3D content via `AccessibilityComponent` is complete.
|
|
449
|
+
|
|
450
|
+
### Spatial Audio and Accessibility
|
|
451
|
+
|
|
452
|
+
```swift
|
|
453
|
+
// Use AVAudioSession for spatial audio apps
|
|
454
|
+
// .spokenAudio mode is supported on visionOS
|
|
455
|
+
try? AVAudioSession.sharedInstance().setCategory(
|
|
456
|
+
.playback,
|
|
457
|
+
mode: .spokenAudio
|
|
458
|
+
)
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
## Cross-Platform Conditional Code
|
|
464
|
+
|
|
465
|
+
```swift
|
|
466
|
+
// Platform-conditional accessibility code
|
|
467
|
+
var body: some View {
|
|
468
|
+
MyView()
|
|
469
|
+
.accessibilityLabel("Chart")
|
|
470
|
+
#if os(macOS)
|
|
471
|
+
// macOS: additional keyboard shortcut hint
|
|
472
|
+
.accessibilityHint("Press Space to toggle data view")
|
|
473
|
+
#elseif os(tvOS)
|
|
474
|
+
// tvOS: focus feedback note
|
|
475
|
+
.accessibilityHint("Press Select to expand")
|
|
476
|
+
#else
|
|
477
|
+
// iOS/iPadOS/visionOS: swipe hint
|
|
478
|
+
.accessibilityHint("Double-tap to expand")
|
|
479
|
+
#endif
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### Shared Accessibility Logic
|
|
484
|
+
|
|
485
|
+
```swift
|
|
486
|
+
// Protocol abstracts platform differences
|
|
487
|
+
protocol AccessibilityProvider {
|
|
488
|
+
var accessibilityName: String { get }
|
|
489
|
+
var accessibilityDescription: String? { get }
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// Shared extension that works on all platforms
|
|
493
|
+
extension View {
|
|
494
|
+
func applyAccessibility(from provider: AccessibilityProvider) -> some View {
|
|
495
|
+
self
|
|
496
|
+
.accessibilityLabel(provider.accessibilityName)
|
|
497
|
+
.accessibilityHint(provider.accessibilityDescription ?? "")
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
## Common Cross-Platform Mistakes
|
|
505
|
+
|
|
506
|
+
| Mistake | Platform | Fix |
|
|
507
|
+
|---|---|---|
|
|
508
|
+
| Using `UIAccessibility` in a macOS/AppKit target | macOS | Use `NSAccessibility` protocol instead |
|
|
509
|
+
| No focus animation on tvOS custom view | tvOS | Implement `didUpdateFocus` with `coordinator.addCoordinatedAnimations` |
|
|
510
|
+
| No `canBecomeFocused` override on tvOS custom view | tvOS | Override `canBecomeFocused` to return `true` |
|
|
511
|
+
| Assuming iOS swipe gestures work on watchOS | watchOS | watchOS uses tap/double-tap/crown, not swipe for VoiceOver |
|
|
512
|
+
| Missing `AccessibilityComponent` on RealityKit entities | visionOS | Add `AccessibilityComponent` with label, traits, and actions |
|
|
513
|
+
| Focus trapping not working in Mac Catalyst modal | macOS (Catalyst) | Set `accessibilityViewIsModal = true` — same as UIKit |
|
|
514
|
+
| WKAccessibilityIsReduceMotionEnabled not checked | watchOS | Use WatchKit function, not `UIAccessibility.isReduceMotionEnabled` |
|
|
515
|
+
| Hover effect without accessibility alternative | visionOS | Add `accessibilityLabel` + `accessibilityAddTraits(.isButton)` |
|