@devo-bmad-custom/agent-orchestration 1.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/bin/bmad.js +36 -0
- package/lib/cli.js +137 -0
- package/lib/filter.js +73 -0
- package/lib/installer.js +787 -0
- package/package.json +30 -0
- package/src/.agents/skills/audit-website/README.md +20 -0
- package/src/.agents/skills/audit-website/SKILL.md +470 -0
- package/src/.agents/skills/audit-website/agents/openai.yaml +6 -0
- package/src/.agents/skills/audit-website/assets/icon-small.svg +41 -0
- package/src/.agents/skills/audit-website/references/OUTPUT-FORMAT.md +250 -0
- package/src/.agents/skills/clean-code-standards/SKILL.md +105 -0
- package/src/.agents/skills/excalidraw-dark-standard/SKILL.md +282 -0
- package/src/.agents/skills/excalidraw-diagram-generator/SKILL.md +613 -0
- package/src/.agents/skills/excalidraw-diagram-generator/references/element-types.md +497 -0
- package/src/.agents/skills/excalidraw-diagram-generator/references/excalidraw-schema.md +350 -0
- package/src/.agents/skills/excalidraw-diagram-generator/scripts/README.md +193 -0
- package/src/.agents/skills/excalidraw-diagram-generator/scripts/add-arrow.py +312 -0
- package/src/.agents/skills/excalidraw-diagram-generator/scripts/add-icon-to-diagram.py +404 -0
- package/src/.agents/skills/excalidraw-diagram-generator/scripts/split-excalidraw-library.py +183 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/business-flow-swimlane-template.excalidraw +334 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/class-diagram-template.excalidraw +558 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/data-flow-diagram-template.excalidraw +279 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/er-diagram-template.excalidraw +662 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/flowchart-template.excalidraw +179 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/mindmap-template.excalidraw +244 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/relationship-template.excalidraw +145 -0
- package/src/.agents/skills/excalidraw-diagram-generator/templates/sequence-diagram-template.excalidraw +509 -0
- package/src/.agents/skills/frontend-responsive-design-standards/SKILL.md +434 -0
- package/src/.agents/skills/java-fundamentals/SKILL.md +116 -0
- package/src/.agents/skills/java-performance/SKILL.md +119 -0
- package/src/.agents/skills/next-best-practices/SKILL.md +153 -0
- package/src/.agents/skills/next-best-practices/async-patterns.md +87 -0
- package/src/.agents/skills/next-best-practices/bundling.md +180 -0
- package/src/.agents/skills/next-best-practices/data-patterns.md +297 -0
- package/src/.agents/skills/next-best-practices/debug-tricks.md +105 -0
- package/src/.agents/skills/next-best-practices/directives.md +73 -0
- package/src/.agents/skills/next-best-practices/error-handling.md +227 -0
- package/src/.agents/skills/next-best-practices/file-conventions.md +140 -0
- package/src/.agents/skills/next-best-practices/font.md +245 -0
- package/src/.agents/skills/next-best-practices/functions.md +108 -0
- package/src/.agents/skills/next-best-practices/hydration-error.md +91 -0
- package/src/.agents/skills/next-best-practices/image.md +173 -0
- package/src/.agents/skills/next-best-practices/metadata.md +301 -0
- package/src/.agents/skills/next-best-practices/parallel-routes.md +287 -0
- package/src/.agents/skills/next-best-practices/route-handlers.md +146 -0
- package/src/.agents/skills/next-best-practices/rsc-boundaries.md +159 -0
- package/src/.agents/skills/next-best-practices/runtime-selection.md +39 -0
- package/src/.agents/skills/next-best-practices/scripts.md +141 -0
- package/src/.agents/skills/next-best-practices/self-hosting.md +371 -0
- package/src/.agents/skills/next-best-practices/suspense-boundaries.md +67 -0
- package/src/.agents/skills/nextjs-app-router-patterns/SKILL.md +537 -0
- package/src/.agents/skills/postgresql-optimization/SKILL.md +404 -0
- package/src/.agents/skills/python-backend/SKILL.md +153 -0
- package/src/.agents/skills/python-fundamentals/SKILL.md +234 -0
- package/src/.agents/skills/python-performance/SKILL.md +404 -0
- package/src/.agents/skills/react-expert/SKILL.md +335 -0
- package/src/.agents/skills/redis-best-practices/SKILL.md +438 -0
- package/src/.agents/skills/security-best-practices/SKILL.md +288 -0
- package/src/.agents/skills/security-review/LICENSE +22 -0
- package/src/.agents/skills/security-review/SKILL.md +312 -0
- package/src/.agents/skills/security-review/infrastructure/docker.md +432 -0
- package/src/.agents/skills/security-review/languages/javascript.md +388 -0
- package/src/.agents/skills/security-review/languages/python.md +363 -0
- package/src/.agents/skills/security-review/references/api-security.md +519 -0
- package/src/.agents/skills/security-review/references/authentication.md +353 -0
- package/src/.agents/skills/security-review/references/authorization.md +372 -0
- package/src/.agents/skills/security-review/references/business-logic.md +443 -0
- package/src/.agents/skills/security-review/references/cryptography.md +329 -0
- package/src/.agents/skills/security-review/references/csrf.md +398 -0
- package/src/.agents/skills/security-review/references/data-protection.md +378 -0
- package/src/.agents/skills/security-review/references/deserialization.md +410 -0
- package/src/.agents/skills/security-review/references/error-handling.md +436 -0
- package/src/.agents/skills/security-review/references/file-security.md +457 -0
- package/src/.agents/skills/security-review/references/injection.md +259 -0
- package/src/.agents/skills/security-review/references/logging.md +433 -0
- package/src/.agents/skills/security-review/references/misconfiguration.md +435 -0
- package/src/.agents/skills/security-review/references/modern-threats.md +475 -0
- package/src/.agents/skills/security-review/references/ssrf.md +415 -0
- package/src/.agents/skills/security-review/references/supply-chain.md +405 -0
- package/src/.agents/skills/security-review/references/xss.md +336 -0
- package/src/.agents/skills/subagent-driven-development/SKILL.md +275 -0
- package/src/.agents/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/src/.agents/skills/subagent-driven-development/implementer-prompt.md +113 -0
- package/src/.agents/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/src/.agents/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/src/.agents/skills/systematic-debugging/SKILL.md +296 -0
- package/src/.agents/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/src/.agents/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/src/.agents/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/src/.agents/skills/systematic-debugging/find-polluter.sh +63 -0
- package/src/.agents/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/src/.agents/skills/systematic-debugging/test-academic.md +14 -0
- package/src/.agents/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/src/.agents/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/src/.agents/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/src/.agents/skills/typescript-best-practices/SKILL.md +373 -0
- package/src/.agents/skills/ui-ux-pro-custom/SKILL.md +348 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/charts.csv +26 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/colors.csv +97 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/icons.csv +101 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/SKILL.md +106 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/accessibility.md +475 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/animation.md +466 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/composition-locals.md +231 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/deprecated-patterns.md +323 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/lists-scrolling.md +400 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/modifiers.md +331 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/navigation.md +416 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/performance.md +446 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/side-effects.md +516 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/foundation-source.md +13327 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/material3-source.md +19097 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/navigation-source.md +2947 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/runtime-source.md +11316 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/ui-source.md +7896 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/state-management.md +377 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/styles-experimental.md +470 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/theming-material3.md +349 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/view-composition.md +595 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/landing.csv +31 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/mobile-ui-layout.md +654 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/products.csv +97 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/react-performance.csv +45 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/astro.csv +54 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/flutter.csv +53 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/html-tailwind.csv +56 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/jetpack-compose.csv +53 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/nextjs.csv +53 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/nuxt-ui.csv +51 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/nuxtjs.csv +59 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/react-native.csv +56 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/react.csv +54 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/shadcn.csv +61 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/svelte.csv +54 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/swiftui.csv +51 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/vue.csv +50 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/styles.csv +68 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/alarmkit/SKILL.md +438 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/alarmkit/references/alarmkit-patterns.md +584 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-clips/SKILL.md +436 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-intents/SKILL.md +489 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-intents/references/appintents-advanced.md +1076 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-store-review/SKILL.md +340 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-store-review/references/privacy-manifest.md +90 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-store-review/references/review-checklists.md +106 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/SKILL.md +500 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/coreml-conversion.md +425 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/coreml-optimization.md +344 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/foundation-models.md +508 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/mlx-swift.md +285 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/authentication/SKILL.md +496 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/authentication/references/keychain-biometric.md +211 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/background-processing/SKILL.md +499 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/background-processing/references/background-task-patterns.md +390 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/callkit-voip/SKILL.md +461 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/callkit-voip/references/callkit-patterns.md +425 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/cloudkit-sync/SKILL.md +492 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/cloudkit-sync/references/cloudkit-patterns.md +461 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/codable-patterns/SKILL.md +467 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/contacts-framework/SKILL.md +425 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/contacts-framework/references/contacts-patterns.md +409 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-bluetooth/SKILL.md +491 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-bluetooth/references/ble-patterns.md +435 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-motion/SKILL.md +388 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-motion/references/motion-patterns.md +405 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-nfc/SKILL.md +495 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-nfc/references/nfc-patterns.md +420 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/coreml/SKILL.md +459 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/coreml/references/coreml-swift-integration.md +765 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/debugging-instruments/SKILL.md +422 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/debugging-instruments/references/instruments-guide.md +387 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/debugging-instruments/references/lldb-patterns.md +298 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/device-integrity/SKILL.md +477 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/energykit/SKILL.md +460 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/energykit/references/energykit-patterns.md +541 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/eventkit-calendar/SKILL.md +483 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/eventkit-calendar/references/eventkit-patterns.md +326 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/healthkit/SKILL.md +498 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/healthkit/references/healthkit-patterns.md +602 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/homekit-matter/SKILL.md +496 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/homekit-matter/references/matter-commissioning.md +455 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-accessibility/SKILL.md +301 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-accessibility/references/a11y-patterns.md +140 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-localization/SKILL.md +418 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-localization/references/formatstyle-locale.md +627 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-localization/references/string-catalogs.md +462 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/SKILL.md +441 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/background-websocket.md +862 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/lightweight-clients.md +93 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/network-framework.md +563 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/urlsession-patterns.md +1116 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/SKILL.md +496 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/app-review-guidelines.md +174 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/cryptokit-advanced.md +297 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/file-storage-patterns.md +354 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/privacy-manifest.md +117 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/live-activities/SKILL.md +500 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/live-activities/references/live-activity-patterns.md +868 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/mapkit-location/SKILL.md +485 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/mapkit-location/references/corelocation-patterns.md +730 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/mapkit-location/references/mapkit-patterns.md +748 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/metrickit-diagnostics/SKILL.md +479 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/musickit-audio/SKILL.md +395 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/musickit-audio/references/musickit-patterns.md +363 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/natural-language/SKILL.md +412 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/natural-language/references/translation-patterns.md +311 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/passkit-wallet/SKILL.md +398 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/passkit-wallet/references/wallet-passes.md +254 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/pencilkit-drawing/SKILL.md +387 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/pencilkit-drawing/references/paperkit-integration.md +376 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/pencilkit-drawing/references/pencilkit-patterns.md +302 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/permissionkit/SKILL.md +446 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/permissionkit/references/permissionkit-patterns.md +435 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/SKILL.md +501 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/av-playback.md +701 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/camera-capture.md +774 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/image-loading-caching.md +869 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/photospicker-patterns.md +597 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/push-notifications/SKILL.md +501 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/push-notifications/references/notification-patterns.md +677 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/push-notifications/references/rich-notifications.md +745 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/realitykit-ar/SKILL.md +479 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/realitykit-ar/references/realitykit-patterns.md +480 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/shareplay-activities/SKILL.md +483 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/shareplay-activities/references/shareplay-patterns.md +544 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/speech-recognition/SKILL.md +485 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/storekit/SKILL.md +478 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/storekit/references/app-review-guidelines.md +58 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/storekit/references/storekit-advanced.md +755 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-charts/SKILL.md +487 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-charts/references/charts-patterns.md +895 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/SKILL.md +408 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/approachable-concurrency.md +80 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/swift-6-2-concurrency.md +233 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/swiftui-concurrency.md +187 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/synchronization-primitives.md +341 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-language/SKILL.md +498 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-language/references/swift-patterns-extended.md +505 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-testing/SKILL.md +467 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-testing/references/testing-patterns.md +504 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/SKILL.md +334 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/references/core-data-coexistence.md +504 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/references/swiftdata-advanced.md +975 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/references/swiftdata-queries.md +675 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-animation/SKILL.md +481 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-animation/references/animation-advanced.md +804 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-animation/references/core-animation-bridge.md +553 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-gestures/SKILL.md +450 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-gestures/references/gesture-patterns.md +425 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/SKILL.md +336 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/form.md +97 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/grids.md +69 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/list.md +99 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/scrollview.md +147 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-liquid-glass/SKILL.md +325 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-liquid-glass/references/liquid-glass.md +387 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/SKILL.md +262 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/deeplinks.md +207 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/navigationstack.md +177 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/sheets.md +169 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/tabview.md +178 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/SKILL.md +381 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/architecture-patterns.md +486 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/deprecated-migration.md +1097 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/design-polish.md +780 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/platform-and-sharing.md +696 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/SKILL.md +491 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +46 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +29 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/understanding-hangs-in-your-app.md +33 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/understanding-improving-swiftui-performance.md +52 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-uikit-interop/SKILL.md +428 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-uikit-interop/references/hosting-migration.md +534 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-uikit-interop/references/representable-recipes.md +1133 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/tipkit/SKILL.md +494 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/tipkit/references/tipkit-patterns.md +782 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/SKILL.md +475 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/references/vision-requests.md +736 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/references/visionkit-scanner.md +738 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/weatherkit/SKILL.md +410 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/weatherkit/references/weatherkit-patterns.md +567 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/widgetkit/SKILL.md +497 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/widgetkit/references/widgetkit-advanced.md +871 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/typography.csv +58 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/ui-reasoning.csv +101 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/ux-guidelines.csv +100 -0
- package/src/.agents/skills/ui-ux-pro-custom/data/web-interface.csv +31 -0
- package/src/.agents/skills/ui-ux-pro-custom/scripts/core.py +253 -0
- package/src/.agents/skills/ui-ux-pro-custom/scripts/design_system.py +1067 -0
- package/src/.agents/skills/ui-ux-pro-custom/scripts/search.py +114 -0
- package/src/.agents/skills/ux-audit/SKILL.md +151 -0
- package/src/.agents/skills/websocket-engineer/SKILL.md +168 -0
- package/src/.agents/skills/websocket-engineer/references/alternatives.md +391 -0
- package/src/.agents/skills/websocket-engineer/references/patterns.md +400 -0
- package/src/.agents/skills/websocket-engineer/references/protocol.md +195 -0
- package/src/.agents/skills/websocket-engineer/references/scaling.md +333 -0
- package/src/.agents/skills/websocket-engineer/references/security.md +474 -0
- package/src/.agents/skills/writing-skills/SKILL.md +655 -0
- package/src/.agents/skills/writing-skills/anthropic-best-practices.md +1150 -0
- package/src/.agents/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/src/.agents/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/src/.agents/skills/writing-skills/persuasion-principles.md +187 -0
- package/src/.agents/skills/writing-skills/render-graphs.js +168 -0
- package/src/.agents/skills/writing-skills/testing-skills-with-subagents.md +384 -0
- package/src/.claude/commands/bmad-track-compact.md +19 -0
- package/src/.claude/commands/bmad-track-extended.md +19 -0
- package/src/.claude/commands/bmad-track-large.md +19 -0
- package/src/.claude/commands/bmad-track-medium.md +19 -0
- package/src/.claude/commands/bmad-track-nano.md +19 -0
- package/src/.claude/commands/bmad-track-rv.md +18 -0
- package/src/.claude/commands/bmad-track-small.md +19 -0
- package/src/_memory/config.yaml +11 -0
- package/src/_memory/master-orchestrator-sidecar/docs-index.md +3 -0
- package/src/_memory/master-orchestrator-sidecar/instructions.md +2566 -0
- package/src/_memory/master-orchestrator-sidecar/memories.md +8 -0
- package/src/_memory/master-orchestrator-sidecar/session-state.md +15 -0
- package/src/_memory/master-orchestrator-sidecar/triage-history.md +3 -0
- package/src/_memory/master-orchestrator-sidecar/workflows-overview.html +1230 -0
- package/src/_memory/skills/excalidraw/SKILL.md +78 -0
- package/src/_memory/skills/excalidraw/diagram-patterns.md +53 -0
- package/src/_memory/skills/nimbalyst-tracking/SKILL.md +103 -0
- package/src/_memory/skills/writing-skills/SKILL.md +655 -0
- package/src/bmb/agents/agent-builder.md +59 -0
- package/src/bmb/agents/module-builder.md +60 -0
- package/src/bmb/agents/workflow-builder.md +61 -0
- package/src/bmb/config.yaml +12 -0
- package/src/bmb/module-help.csv +13 -0
- package/src/bmb/workflows/agent/data/agent-architecture.md +258 -0
- package/src/bmb/workflows/agent/data/agent-compilation.md +185 -0
- package/src/bmb/workflows/agent/data/agent-menu-patterns.md +189 -0
- package/src/bmb/workflows/agent/data/agent-metadata.md +133 -0
- package/src/bmb/workflows/agent/data/agent-validation.md +111 -0
- package/src/bmb/workflows/agent/data/brainstorm-context.md +96 -0
- package/src/bmb/workflows/agent/data/communication-presets.csv +61 -0
- package/src/bmb/workflows/agent/data/critical-actions.md +75 -0
- package/src/bmb/workflows/agent/data/persona-properties.md +252 -0
- package/src/bmb/workflows/agent/data/principles-crafting.md +142 -0
- package/src/bmb/workflows/agent/data/reference/module-examples/architect.md +68 -0
- package/src/bmb/workflows/agent/data/reference/with-sidecar/journal-keeper/journal-keeper-sidecar/entries/yy-mm-dd-entry-template.md +17 -0
- package/src/bmb/workflows/agent/data/understanding-agent-types.md +126 -0
- package/src/bmb/workflows/agent/steps-c/step-01-brainstorm.md +129 -0
- package/src/bmb/workflows/agent/steps-c/step-02-discovery.md +170 -0
- package/src/bmb/workflows/agent/steps-c/step-03-sidecar-metadata.md +309 -0
- package/src/bmb/workflows/agent/steps-c/step-04-persona.md +213 -0
- package/src/bmb/workflows/agent/steps-c/step-05-commands-menu.md +179 -0
- package/src/bmb/workflows/agent/steps-c/step-06-activation.md +278 -0
- package/src/bmb/workflows/agent/steps-c/step-07-build-agent.md +316 -0
- package/src/bmb/workflows/agent/steps-c/step-08-celebrate.md +247 -0
- package/src/bmb/workflows/agent/steps-e/e-01-load-existing.md +221 -0
- package/src/bmb/workflows/agent/steps-e/e-02-discover-edits.md +195 -0
- package/src/bmb/workflows/agent/steps-e/e-03-placeholder.md +1 -0
- package/src/bmb/workflows/agent/steps-e/e-04-sidecar-metadata.md +126 -0
- package/src/bmb/workflows/agent/steps-e/e-05-persona.md +135 -0
- package/src/bmb/workflows/agent/steps-e/e-06-commands-menu.md +123 -0
- package/src/bmb/workflows/agent/steps-e/e-07-activation.md +124 -0
- package/src/bmb/workflows/agent/steps-e/e-08-edit-agent.md +197 -0
- package/src/bmb/workflows/agent/steps-e/e-09-celebrate.md +155 -0
- package/src/bmb/workflows/agent/steps-v/v-01-load-review.md +137 -0
- package/src/bmb/workflows/agent/steps-v/v-02a-validate-metadata.md +116 -0
- package/src/bmb/workflows/agent/steps-v/v-02b-validate-persona.md +124 -0
- package/src/bmb/workflows/agent/steps-v/v-02c-validate-menu.md +127 -0
- package/src/bmb/workflows/agent/steps-v/v-02d-validate-structure.md +134 -0
- package/src/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md +134 -0
- package/src/bmb/workflows/agent/steps-v/v-03-summary.md +104 -0
- package/src/bmb/workflows/agent/templates/agent-plan.template.md +5 -0
- package/src/bmb/workflows/agent/templates/agent-template.md +89 -0
- package/src/bmb/workflows/agent/workflow-create-agent.md +72 -0
- package/src/bmb/workflows/agent/workflow-edit-agent.md +75 -0
- package/src/bmb/workflows/agent/workflow-validate-agent.md +73 -0
- package/src/bmb/workflows/module/data/agent-architecture.md +179 -0
- package/src/bmb/workflows/module/data/agent-spec-template.md +79 -0
- package/src/bmb/workflows/module/data/module-standards.md +263 -0
- package/src/bmb/workflows/module/data/module-yaml-conventions.md +392 -0
- package/src/bmb/workflows/module/module-help-generate.md +254 -0
- package/src/bmb/workflows/module/steps-b/step-01-welcome.md +148 -0
- package/src/bmb/workflows/module/steps-b/step-02-spark.md +141 -0
- package/src/bmb/workflows/module/steps-b/step-03-module-type.md +149 -0
- package/src/bmb/workflows/module/steps-b/step-04-vision.md +83 -0
- package/src/bmb/workflows/module/steps-b/step-05-identity.md +97 -0
- package/src/bmb/workflows/module/steps-b/step-06-users.md +86 -0
- package/src/bmb/workflows/module/steps-b/step-07-value.md +76 -0
- package/src/bmb/workflows/module/steps-b/step-08-agents.md +97 -0
- package/src/bmb/workflows/module/steps-b/step-09-workflows.md +83 -0
- package/src/bmb/workflows/module/steps-b/step-10-tools.md +91 -0
- package/src/bmb/workflows/module/steps-b/step-11-scenarios.md +84 -0
- package/src/bmb/workflows/module/steps-b/step-12-creative.md +95 -0
- package/src/bmb/workflows/module/steps-b/step-13-review.md +105 -0
- package/src/bmb/workflows/module/steps-b/step-14-finalize.md +117 -0
- package/src/bmb/workflows/module/steps-c/step-01-load-brief.md +179 -0
- package/src/bmb/workflows/module/steps-c/step-01b-continue.md +82 -0
- package/src/bmb/workflows/module/steps-c/step-02-structure.md +105 -0
- package/src/bmb/workflows/module/steps-c/step-03-config.md +119 -0
- package/src/bmb/workflows/module/steps-c/step-04-agents.md +168 -0
- package/src/bmb/workflows/module/steps-c/step-05-workflows.md +184 -0
- package/src/bmb/workflows/module/steps-c/step-06-docs.md +401 -0
- package/src/bmb/workflows/module/steps-c/step-07-complete.md +152 -0
- package/src/bmb/workflows/module/steps-e/step-01-load-target.md +81 -0
- package/src/bmb/workflows/module/steps-e/step-02-select-edit.md +77 -0
- package/src/bmb/workflows/module/steps-e/step-03-apply-edit.md +77 -0
- package/src/bmb/workflows/module/steps-e/step-04-review.md +80 -0
- package/src/bmb/workflows/module/steps-e/step-05-confirm.md +75 -0
- package/src/bmb/workflows/module/steps-v/step-01-load-target.md +96 -0
- package/src/bmb/workflows/module/steps-v/step-02-file-structure.md +93 -0
- package/src/bmb/workflows/module/steps-v/step-03-module-yaml.md +99 -0
- package/src/bmb/workflows/module/steps-v/step-04-agent-specs.md +152 -0
- package/src/bmb/workflows/module/steps-v/step-05-workflow-specs.md +152 -0
- package/src/bmb/workflows/module/steps-v/step-06-documentation.md +143 -0
- package/src/bmb/workflows/module/steps-v/step-07-installation.md +102 -0
- package/src/bmb/workflows/module/steps-v/step-08-report.md +197 -0
- package/src/bmb/workflows/module/templates/brief-template.md +154 -0
- package/src/bmb/workflows/module/templates/workflow-spec-template.md +96 -0
- package/src/bmb/workflows/module/workflow-create-module-brief.md +71 -0
- package/src/bmb/workflows/module/workflow-create-module.md +86 -0
- package/src/bmb/workflows/module/workflow-edit-module.md +66 -0
- package/src/bmb/workflows/module/workflow-validate-module.md +66 -0
- package/src/bmb/workflows/workflow/data/architecture.md +150 -0
- package/src/bmb/workflows/workflow/data/common-workflow-tools.csv +19 -0
- package/src/bmb/workflows/workflow/data/csv-data-file-standards.md +53 -0
- package/src/bmb/workflows/workflow/data/frontmatter-standards.md +184 -0
- package/src/bmb/workflows/workflow/data/input-discovery-standards.md +191 -0
- package/src/bmb/workflows/workflow/data/intent-vs-prescriptive-spectrum.md +44 -0
- package/src/bmb/workflows/workflow/data/menu-handling-standards.md +133 -0
- package/src/bmb/workflows/workflow/data/output-format-standards.md +135 -0
- package/src/bmb/workflows/workflow/data/step-file-rules.md +235 -0
- package/src/bmb/workflows/workflow/data/step-type-patterns.md +257 -0
- package/src/bmb/workflows/workflow/data/subprocess-optimization-patterns.md +188 -0
- package/src/bmb/workflows/workflow/data/trimodal-workflow-structure.md +164 -0
- package/src/bmb/workflows/workflow/data/workflow-chaining-standards.md +222 -0
- package/src/bmb/workflows/workflow/data/workflow-examples.md +232 -0
- package/src/bmb/workflows/workflow/data/workflow-type-criteria.md +134 -0
- package/src/bmb/workflows/workflow/steps-c/step-00-conversion.md +263 -0
- package/src/bmb/workflows/workflow/steps-c/step-01-discovery.md +194 -0
- package/src/bmb/workflows/workflow/steps-c/step-01b-continuation.md +3 -0
- package/src/bmb/workflows/workflow/steps-c/step-02-classification.md +270 -0
- package/src/bmb/workflows/workflow/steps-c/step-03-requirements.md +283 -0
- package/src/bmb/workflows/workflow/steps-c/step-04-tools.md +282 -0
- package/src/bmb/workflows/workflow/steps-c/step-05-plan-review.md +243 -0
- package/src/bmb/workflows/workflow/steps-c/step-06-design.md +330 -0
- package/src/bmb/workflows/workflow/steps-c/step-07-foundation.md +239 -0
- package/src/bmb/workflows/workflow/steps-c/step-08-build-step-01.md +379 -0
- package/src/bmb/workflows/workflow/steps-c/step-09-build-next-step.md +350 -0
- package/src/bmb/workflows/workflow/steps-c/step-10-confirmation.md +322 -0
- package/src/bmb/workflows/workflow/steps-c/step-11-completion.md +191 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-01-assess-workflow.md +237 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-02-discover-edits.md +251 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-03-fix-validation.md +254 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-04-direct-edit.md +277 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-05-apply-edit.md +154 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-06-validate-after.md +190 -0
- package/src/bmb/workflows/workflow/steps-e/step-e-07-complete.md +206 -0
- package/src/bmb/workflows/workflow/steps-v/step-01-validate-max-mode.md +109 -0
- package/src/bmb/workflows/workflow/steps-v/step-01-validate.md +221 -0
- package/src/bmb/workflows/workflow/steps-v/step-01b-structure.md +152 -0
- package/src/bmb/workflows/workflow/steps-v/step-02-frontmatter-validation.md +199 -0
- package/src/bmb/workflows/workflow/steps-v/step-02b-path-violations.md +265 -0
- package/src/bmb/workflows/workflow/steps-v/step-03-menu-validation.md +164 -0
- package/src/bmb/workflows/workflow/steps-v/step-04-step-type-validation.md +211 -0
- package/src/bmb/workflows/workflow/steps-v/step-05-output-format-validation.md +200 -0
- package/src/bmb/workflows/workflow/steps-v/step-06-validation-design-check.md +195 -0
- package/src/bmb/workflows/workflow/steps-v/step-07-instruction-style-check.md +209 -0
- package/src/bmb/workflows/workflow/steps-v/step-08-collaborative-experience-check.md +199 -0
- package/src/bmb/workflows/workflow/steps-v/step-08b-subprocess-optimization.md +179 -0
- package/src/bmb/workflows/workflow/steps-v/step-09-cohesive-review.md +186 -0
- package/src/bmb/workflows/workflow/steps-v/step-10-report-complete.md +154 -0
- package/src/bmb/workflows/workflow/steps-v/step-11-plan-validation.md +237 -0
- package/src/bmb/workflows/workflow/templates/minimal-output-template.md +11 -0
- package/src/bmb/workflows/workflow/templates/step-01-init-continuable-template.md +241 -0
- package/src/bmb/workflows/workflow/templates/step-1b-template.md +224 -0
- package/src/bmb/workflows/workflow/templates/step-template.md +294 -0
- package/src/bmb/workflows/workflow/templates/workflow-template.md +102 -0
- package/src/bmb/workflows/workflow/workflow-create-workflow.md +79 -0
- package/src/bmb/workflows/workflow/workflow-edit-workflow.md +65 -0
- package/src/bmb/workflows/workflow/workflow-rework-workflow.md +65 -0
- package/src/bmb/workflows/workflow/workflow-validate-max-parallel-workflow.md +66 -0
- package/src/bmb/workflows/workflow/workflow-validate-workflow.md +65 -0
- package/src/bmm/agents/analyst.md +104 -0
- package/src/bmm/agents/architect.md +85 -0
- package/src/bmm/agents/dev.md +100 -0
- package/src/bmm/agents/pm.md +98 -0
- package/src/bmm/agents/qa.md +90 -0
- package/src/bmm/agents/quick-flow-solo-dev.md +92 -0
- package/src/bmm/agents/review-agent.md +129 -0
- package/src/bmm/agents/sm.md +90 -0
- package/src/bmm/agents/tech-writer/tech-writer.md +94 -0
- package/src/bmm/agents/ux-designer.md +124 -0
- package/src/bmm/data/project-context-template.md +26 -0
- package/src/bmm/module-help.csv +31 -0
- package/src/bmm/teams/default-party.csv +20 -0
- package/src/bmm/teams/team-fullstack.yaml +12 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +115 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +107 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +141 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +144 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +147 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +161 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +99 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +57 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +87 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +156 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +165 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +140 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +152 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +345 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +92 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +164 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +174 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +184 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +105 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +360 -0
- package/src/bmm/workflows/1-analysis/research/research.template.md +29 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +87 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +165 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +174 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +141 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +159 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +387 -0
- package/src/bmm/workflows/1-analysis/research/workflow-domain-research.md +54 -0
- package/src/bmm/workflows/1-analysis/research/workflow-market-research.md +54 -0
- package/src/bmm/workflows/1-analysis/research/workflow-technical-research.md +54 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +15 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01-init.md +139 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +100 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +160 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +88 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +99 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +169 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +156 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +136 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +176 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +184 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +174 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +175 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +189 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +162 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +79 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +183 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +149 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +187 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +192 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +108 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +166 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +131 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +150 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +118 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +155 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +170 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +158 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +147 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +182 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +202 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +148 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +201 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +179 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +164 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md +65 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md +65 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +63 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +63 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +63 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +106 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +111 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +115 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +127 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +167 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +143 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +118 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +154 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +136 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +165 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +135 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +192 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +101 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +45 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +185 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +129 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +130 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +93 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +196 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +129 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +54 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +13 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +89 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +82 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +106 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +138 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +129 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +166 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +186 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +163 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +38 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +49 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +129 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +124 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +122 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +84 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -0
- package/src/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
- package/src/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
- package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +43 -0
- package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
- package/src/bmm/workflows/4-implementation/correct-course/instructions.md +207 -0
- package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +53 -0
- package/src/bmm/workflows/4-implementation/create-story/checklist.md +159 -0
- package/src/bmm/workflows/4-implementation/create-story/instructions.xml +574 -0
- package/src/bmm/workflows/4-implementation/create-story/template.md +79 -0
- package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +52 -0
- package/src/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
- package/src/bmm/workflows/4-implementation/dev-story/instructions.xml +493 -0
- package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +20 -0
- package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1444 -0
- package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +52 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/instructions.md +232 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +52 -0
- package/src/bmm/workflows/4-implementation/sprint-status/instructions.md +230 -0
- package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +25 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +158 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +122 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +93 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +93 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +87 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +146 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +204 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +152 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +123 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +201 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -0
- package/src/bmm/workflows/document-project/checklist.md +245 -0
- package/src/bmm/workflows/document-project/documentation-requirements.csv +12 -0
- package/src/bmm/workflows/document-project/instructions.md +130 -0
- package/src/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
- package/src/bmm/workflows/document-project/templates/index-template.md +169 -0
- package/src/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
- package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
- package/src/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
- package/src/bmm/workflows/document-project/workflow.yaml +22 -0
- package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
- package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
- package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
- package/src/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
- package/src/bmm/workflows/generate-project-context/project-context-template.md +21 -0
- package/src/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -0
- package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +322 -0
- package/src/bmm/workflows/generate-project-context/steps/step-03-complete.md +235 -0
- package/src/bmm/workflows/generate-project-context/workflow.md +49 -0
- package/src/bmm/workflows/qa/automate/workflow.yaml +233 -0
- package/src/bmm/workflows/qa-generate-e2e-tests/checklist.md +33 -0
- package/src/bmm/workflows/qa-generate-e2e-tests/instructions.md +110 -0
- package/src/bmm/workflows/qa-generate-e2e-tests/workflow.yaml +42 -0
- package/src/core/agents/bmad-master.md +56 -0
- package/src/core/agents/master-orchestrator.md +54 -0
- package/src/core/config.yaml +9 -0
- package/src/core/module-help.csv +10 -0
- package/src/core/scripts/generate-loop-report.py +72 -0
- package/src/core/skills/prepare-to-merge/SKILL.md +77 -0
- package/src/core/tasks/editorial-review-prose.xml +102 -0
- package/src/core/tasks/editorial-review-structure.xml +208 -0
- package/src/core/tasks/help.md +86 -0
- package/src/core/tasks/index-docs.xml +65 -0
- package/src/core/tasks/review-adversarial-general.xml +66 -0
- package/src/core/tasks/review-adversarial-loop.xml +46 -0
- package/src/core/tasks/review-edge-case-hunter.xml +63 -0
- package/src/core/tasks/review-party-loop.xml +46 -0
- package/src/core/tasks/shard-doc.xml +108 -0
- package/src/core/tasks/workflow.xml +236 -0
- package/src/core/templates/review-loop-report.html +88 -0
- package/src/core/templates/review-loop-report.md +5 -0
- package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
- package/src/core/workflows/advanced-elicitation/workflow.xml +118 -0
- package/src/core/workflows/brainstorming/brain-methods.csv +62 -0
- package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +212 -0
- package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
- package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
- package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
- package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
- package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
- package/src/core/workflows/brainstorming/steps/step-02e-deep-dive.md +68 -0
- package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +403 -0
- package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
- package/src/core/workflows/brainstorming/template.md +15 -0
- package/src/core/workflows/brainstorming/workflow.md +60 -0
- package/src/core/workflows/extract-trackers/workflow.md +45 -0
- package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +142 -0
- package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
- package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +168 -0
- package/src/core/workflows/party-mode/workflow.md +194 -0
- package/src/docs/dev/tmux/actions_popup.py +291 -0
- package/src/docs/dev/tmux/actions_popup.sh +110 -0
- package/src/docs/dev/tmux/claude_usage.sh +15 -0
- package/src/docs/dev/tmux/colors.conf +34 -0
- package/src/docs/dev/tmux/cpu_usage.sh +7 -0
- package/src/docs/dev/tmux/dispatch.sh +10 -0
- package/src/docs/dev/tmux/float_init.sh +13 -0
- package/src/docs/dev/tmux/float_term.sh +23 -0
- package/src/docs/dev/tmux/open_clip.sh +14 -0
- package/src/docs/dev/tmux/paste_clipboard.sh +13 -0
- package/src/docs/dev/tmux/paste_image_wrapper.sh +83 -0
- package/src/docs/dev/tmux/ram_usage.sh +3 -0
- package/src/docs/dev/tmux/title_sync.sh +54 -0
- package/src/docs/dev/tmux/tmux-setup.md +806 -0
- package/src/docs/dev/tmux/tmux.conf +127 -0
- package/src/docs/dev/tmux/xclip +18 -0
|
@@ -0,0 +1,1076 @@
|
|
|
1
|
+
# App Intents Advanced Reference
|
|
2
|
+
|
|
3
|
+
Extended App Intents patterns beyond the basics covered in the main skill.
|
|
4
|
+
Covers @Parameter variants, EntityPropertyQuery, assistant schemas, focus
|
|
5
|
+
filters, SiriKit migration, error handling, confirmation flows, authentication,
|
|
6
|
+
URL-representable types, and Spotlight indexing.
|
|
7
|
+
|
|
8
|
+
## Contents
|
|
9
|
+
|
|
10
|
+
- [@Parameter Initializer Variants](#parameter-initializer-variants)
|
|
11
|
+
- [EntityPropertyQuery (Filter and Sort)](#entitypropertyquery-filter-and-sort)
|
|
12
|
+
- [Assistant Schemas (iOS 18+)](#assistant-schemas-ios-18)
|
|
13
|
+
- [Focus Filter Intents](#focus-filter-intents)
|
|
14
|
+
- [SiriKit Migration (CustomIntentMigratedAppIntent)](#sirikit-migration-customintentmigratedappintent)
|
|
15
|
+
- [Error Handling and Dialog](#error-handling-and-dialog)
|
|
16
|
+
- [Confirmation Flows](#confirmation-flows)
|
|
17
|
+
- [Authentication Policies](#authentication-policies)
|
|
18
|
+
- [URLRepresentableIntent / Entity / Enum (iOS 18+)](#urlrepresentableintent-entity-enum-ios-18)
|
|
19
|
+
- [IndexedEntity for Spotlight (iOS 18+)](#indexedentity-for-spotlight-ios-18)
|
|
20
|
+
- [@ComputedProperty(indexingKey:) for Spotlight (iOS 26+)](#computedpropertyindexingkey-for-spotlight-ios-26)
|
|
21
|
+
- [Onscreen Content for Siri (iOS 26+)](#onscreen-content-for-siri-ios-26)
|
|
22
|
+
- [Parameter Summary Builder](#parameter-summary-builder)
|
|
23
|
+
- [Core Spotlight Direct Usage](#core-spotlight-direct-usage)
|
|
24
|
+
|
|
25
|
+
## @Parameter Initializer Variants
|
|
26
|
+
|
|
27
|
+
### 1. Basic (String, Bool, URL, Date)
|
|
28
|
+
|
|
29
|
+
```swift
|
|
30
|
+
@Parameter(title: "Name")
|
|
31
|
+
var name: String
|
|
32
|
+
|
|
33
|
+
@Parameter(title: "Name", description: "The user's full name")
|
|
34
|
+
var name: String
|
|
35
|
+
|
|
36
|
+
@Parameter(title: "Enabled", default: true)
|
|
37
|
+
var enabled: Bool
|
|
38
|
+
|
|
39
|
+
@Parameter(title: "Website")
|
|
40
|
+
var url: URL?
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 2. Numeric with Range and Control Style
|
|
44
|
+
|
|
45
|
+
```swift
|
|
46
|
+
@Parameter(title: "Volume", controlStyle: .slider, inclusiveRange: (0, 100))
|
|
47
|
+
var volume: Int
|
|
48
|
+
|
|
49
|
+
@Parameter(title: "Rating", controlStyle: .stepper, inclusiveRange: (1, 5))
|
|
50
|
+
var rating: Int
|
|
51
|
+
|
|
52
|
+
@Parameter(title: "Temperature", default: 72.0, inclusiveRange: (60.0, 90.0))
|
|
53
|
+
var temperature: Double
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Control styles: `.field` (default text field), `.slider`, `.stepper`.
|
|
57
|
+
|
|
58
|
+
### 3. With Options Provider (Dynamic List)
|
|
59
|
+
|
|
60
|
+
Provide a dynamic set of options at runtime:
|
|
61
|
+
|
|
62
|
+
```swift
|
|
63
|
+
struct CategoryOptionsProvider: DynamicOptionsProvider {
|
|
64
|
+
func results() async throws -> [String] {
|
|
65
|
+
await CategoryStore.shared.allNames()
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@Parameter(title: "Category", optionsProvider: CategoryOptionsProvider())
|
|
70
|
+
var category: String
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 4. With Disambiguation Dialog
|
|
74
|
+
|
|
75
|
+
Request clarification when the system cannot resolve a value:
|
|
76
|
+
|
|
77
|
+
```swift
|
|
78
|
+
@Parameter(
|
|
79
|
+
title: "Size",
|
|
80
|
+
requestValueDialog: "What size would you like?",
|
|
81
|
+
requestDisambiguationDialog: "Which size did you mean?"
|
|
82
|
+
)
|
|
83
|
+
var size: CupSize
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 5. With Resolvers
|
|
87
|
+
|
|
88
|
+
Transform raw input into the target type:
|
|
89
|
+
|
|
90
|
+
```swift
|
|
91
|
+
@Parameter(title: "Contact", resolvers: [ContactResolver()])
|
|
92
|
+
var contact: ContactEntity
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 6. Entity Parameter with Query
|
|
96
|
+
|
|
97
|
+
Specify a custom query for entity resolution:
|
|
98
|
+
|
|
99
|
+
```swift
|
|
100
|
+
@Parameter(title: "Trail", query: [TrailStringQuery(), TrailPropertyQuery()])
|
|
101
|
+
var trail: TrailEntity
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 7. Array Parameters with Size Constraints
|
|
105
|
+
|
|
106
|
+
```swift
|
|
107
|
+
// Fixed size
|
|
108
|
+
@Parameter(title: "Items", size: 3)
|
|
109
|
+
var items: [ItemEntity]
|
|
110
|
+
|
|
111
|
+
// Per-widget-family size
|
|
112
|
+
@Parameter(
|
|
113
|
+
title: "Items",
|
|
114
|
+
size: [.systemSmall: 1, .systemMedium: 3, .systemLarge: 6]
|
|
115
|
+
)
|
|
116
|
+
var items: [ItemEntity]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 8. File Parameters
|
|
120
|
+
|
|
121
|
+
```swift
|
|
122
|
+
@Parameter(title: "Document", supportedContentTypes: [.pdf, .plainText])
|
|
123
|
+
var document: IntentFile
|
|
124
|
+
|
|
125
|
+
@Parameter(title: "Image", supportedContentTypes: [.png, .jpeg])
|
|
126
|
+
var image: IntentFile?
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 9. Measurement Parameters
|
|
130
|
+
|
|
131
|
+
```swift
|
|
132
|
+
@Parameter(
|
|
133
|
+
title: "Distance",
|
|
134
|
+
defaultUnit: .miles,
|
|
135
|
+
defaultUnitAdjustForLocale: true,
|
|
136
|
+
supportsNegativeNumbers: false
|
|
137
|
+
)
|
|
138
|
+
var distance: Measurement<UnitLength>
|
|
139
|
+
|
|
140
|
+
@Parameter(title: "Weight", defaultUnit: .kilograms)
|
|
141
|
+
var weight: Measurement<UnitMass>
|
|
142
|
+
|
|
143
|
+
@Parameter(title: "Temperature", defaultUnit: .fahrenheit)
|
|
144
|
+
var temp: Measurement<UnitTemperature>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 10. Input Connection Behavior
|
|
148
|
+
|
|
149
|
+
Control how parameters connect to Shortcuts input:
|
|
150
|
+
|
|
151
|
+
```swift
|
|
152
|
+
@Parameter(title: "Text", inputConnectionBehavior: .connectToPreviousIntentResult)
|
|
153
|
+
var text: String
|
|
154
|
+
|
|
155
|
+
@Parameter(title: "File", inputConnectionBehavior: .optionalIfProvided)
|
|
156
|
+
var file: IntentFile?
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Runtime Parameter Methods
|
|
160
|
+
|
|
161
|
+
Request values, disambiguation, and confirmation at runtime inside `perform()`:
|
|
162
|
+
|
|
163
|
+
```swift
|
|
164
|
+
func perform() async throws -> some IntentResult {
|
|
165
|
+
// Request a missing value
|
|
166
|
+
if quantity == nil {
|
|
167
|
+
throw $quantity.needsValueError("How many would you like?")
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Disambiguate among options
|
|
171
|
+
let resolved = try await $size.requestDisambiguation(
|
|
172
|
+
among: [.small, .medium, .large],
|
|
173
|
+
dialog: "Which size?"
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
// Confirm a value
|
|
177
|
+
try await $amount.requestConfirmation(for: amount, dialog: "Charge \(amount)?")
|
|
178
|
+
|
|
179
|
+
return .result()
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## EntityPropertyQuery (Filter and Sort)
|
|
184
|
+
|
|
185
|
+
The most powerful query variant. Declare filterable properties and sortable
|
|
186
|
+
fields for structured Siri and Shortcuts queries.
|
|
187
|
+
|
|
188
|
+
```swift
|
|
189
|
+
struct TrailPropertyQuery: EntityPropertyQuery {
|
|
190
|
+
static var properties = QueryProperties {
|
|
191
|
+
Property(\TrailEntity.$name) {
|
|
192
|
+
ContainsComparator()
|
|
193
|
+
EqualToComparator()
|
|
194
|
+
}
|
|
195
|
+
Property(\TrailEntity.$trailLength) {
|
|
196
|
+
GreaterThanComparator()
|
|
197
|
+
LessThanComparator()
|
|
198
|
+
EqualToComparator()
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
static var sortingOptions = SortingOptions {
|
|
203
|
+
SortableBy(\TrailEntity.$name)
|
|
204
|
+
SortableBy(\TrailEntity.$trailLength)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
func entities(
|
|
208
|
+
matching comparators: [EntityQueryComparator],
|
|
209
|
+
mode: ComparatorMode,
|
|
210
|
+
sortedBy: [EntityQuerySort<TrailEntity>],
|
|
211
|
+
limit: Int?
|
|
212
|
+
) async throws -> [TrailEntity] {
|
|
213
|
+
var results = TrailStore.shared.allTrails.map { TrailEntity(from: $0) }
|
|
214
|
+
|
|
215
|
+
for comparator in comparators {
|
|
216
|
+
switch comparator {
|
|
217
|
+
case let comparator as ContainsComparator<String>:
|
|
218
|
+
results = results.filter { $0.name.localizedCaseInsensitiveContains(comparator.value) }
|
|
219
|
+
case let comparator as GreaterThanComparator<Measurement<UnitLength>>:
|
|
220
|
+
results = results.filter { $0.trailLength > comparator.value }
|
|
221
|
+
default:
|
|
222
|
+
break
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if let limit {
|
|
227
|
+
results = Array(results.prefix(limit))
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return results
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
func entities(for identifiers: [Trail.ID]) async throws -> [TrailEntity] {
|
|
234
|
+
TrailStore.shared.allTrails
|
|
235
|
+
.filter { identifiers.contains($0.id) }
|
|
236
|
+
.map { TrailEntity(from: $0) }
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
func suggestedEntities() async throws -> [TrailEntity] {
|
|
240
|
+
TrailStore.shared.featured.map { TrailEntity(from: $0) }
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Available comparators
|
|
246
|
+
|
|
247
|
+
| Comparator | Supported Types |
|
|
248
|
+
|---|---|
|
|
249
|
+
| `EqualToComparator` | All comparable types |
|
|
250
|
+
| `NotEqualToComparator` | All comparable types |
|
|
251
|
+
| `ContainsComparator` | `String` |
|
|
252
|
+
| `HasPrefixComparator` | `String` |
|
|
253
|
+
| `HasSuffixComparator` | `String` |
|
|
254
|
+
| `GreaterThanComparator` | Numeric, `Date`, `Measurement` |
|
|
255
|
+
| `LessThanComparator` | Numeric, `Date`, `Measurement` |
|
|
256
|
+
| `GreaterThanOrEqualToComparator` | Numeric, `Date`, `Measurement` |
|
|
257
|
+
| `LessThanOrEqualToComparator` | Numeric, `Date`, `Measurement` |
|
|
258
|
+
| `IsBetweenComparator` | Numeric, `Date`, `Measurement` |
|
|
259
|
+
|
|
260
|
+
## Assistant Schemas (iOS 18+)
|
|
261
|
+
|
|
262
|
+
Assistant schemas define domain-specific intents that Apple Intelligence
|
|
263
|
+
understands natively. Annotate conforming types with schema macros.
|
|
264
|
+
|
|
265
|
+
### Declaration
|
|
266
|
+
|
|
267
|
+
```swift
|
|
268
|
+
// PREFERRED: Newer macro (iOS 18+)
|
|
269
|
+
@AppIntent(schema: .photos.openAsset)
|
|
270
|
+
struct OpenPhotoIntent: AppIntent { ... }
|
|
271
|
+
|
|
272
|
+
// ALSO VALID: @AssistantIntent(schema:) still works but @AppIntent(schema:) is preferred
|
|
273
|
+
@AssistantIntent(schema: .photos.openAsset)
|
|
274
|
+
struct OpenPhotoIntent: AppIntent { ... }
|
|
275
|
+
|
|
276
|
+
// CORRECT: Using preferred macro
|
|
277
|
+
@AppIntent(schema: .photos.openAsset)
|
|
278
|
+
struct OpenPhotoIntent: AppIntent {
|
|
279
|
+
static var title: LocalizedStringResource = "Open Photo"
|
|
280
|
+
|
|
281
|
+
@Parameter(title: "Asset")
|
|
282
|
+
var target: PhotoEntity
|
|
283
|
+
|
|
284
|
+
func perform() async throws -> some IntentResult {
|
|
285
|
+
PhotoViewer.shared.open(target.id)
|
|
286
|
+
return .result()
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
@AppEntity(schema: .photos.asset)
|
|
291
|
+
struct PhotoEntity: AppEntity {
|
|
292
|
+
var id: String
|
|
293
|
+
static let defaultQuery = PhotoQuery()
|
|
294
|
+
static var typeDisplayRepresentation: TypeDisplayRepresentation = "Photo"
|
|
295
|
+
var displayRepresentation: DisplayRepresentation {
|
|
296
|
+
DisplayRepresentation(title: "\(name)")
|
|
297
|
+
}
|
|
298
|
+
var name: String
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
@AppEnum(schema: .photos.assetType)
|
|
302
|
+
enum PhotoType: String, AppEnum {
|
|
303
|
+
case photo, video, livePhoto
|
|
304
|
+
static var typeDisplayRepresentation: TypeDisplayRepresentation = "Photo Type"
|
|
305
|
+
static var caseDisplayRepresentations: [PhotoType: DisplayRepresentation] = [
|
|
306
|
+
.photo: "Photo",
|
|
307
|
+
.video: "Video",
|
|
308
|
+
.livePhoto: "Live Photo"
|
|
309
|
+
]
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Domain catalog (14+ domains)
|
|
314
|
+
|
|
315
|
+
| Domain | Example Intents | Example Entities |
|
|
316
|
+
|---|---|---|
|
|
317
|
+
| `.books` | openBook, createBookmark | book, audiobook |
|
|
318
|
+
| `.browser` | openTab, createBookmark, searchWeb | tab, bookmark, window |
|
|
319
|
+
| `.camera` | capturePhoto, captureVideo | -- |
|
|
320
|
+
| `.reader` | openDocument, goToPage | document, page |
|
|
321
|
+
| `.files` | openFile, createFile | file |
|
|
322
|
+
| `.assistant` | activate | -- |
|
|
323
|
+
| `.journal` | createEntry, openEntry | entry |
|
|
324
|
+
| `.mail` | openMailbox, sendDraft | account, draft, mailbox, message |
|
|
325
|
+
| `.photos` | openAsset, createAlbum, searchAssets | album, asset, recognizedPerson |
|
|
326
|
+
| `.presentation` | openDocument, addSlide | document, slide, template |
|
|
327
|
+
| `.spreadsheet` | openDocument, addSheet | document, sheet, template |
|
|
328
|
+
| `.system` | search | -- |
|
|
329
|
+
| `.whiteboard` | openBoard, createItem | board, item |
|
|
330
|
+
| `.wordProcessor` | openDocument, addPage | document, page, template |
|
|
331
|
+
| `.visualIntelligence` | semanticContentSearch | -- |
|
|
332
|
+
|
|
333
|
+
### isAssistantOnly
|
|
334
|
+
|
|
335
|
+
Control whether a schema-conforming type is exclusive to Apple Intelligence or
|
|
336
|
+
also available through other system surfaces:
|
|
337
|
+
|
|
338
|
+
```swift
|
|
339
|
+
@AppIntent(schema: .photos.openAsset)
|
|
340
|
+
struct OpenPhotoIntent: AppIntent {
|
|
341
|
+
static var isAssistantOnly: Bool { false } // Also available in Shortcuts
|
|
342
|
+
// ...
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
## Focus Filter Intents
|
|
347
|
+
|
|
348
|
+
Customize app behavior when a Focus mode activates.
|
|
349
|
+
|
|
350
|
+
```swift
|
|
351
|
+
struct WorkFocusFilter: SetFocusFilterIntent {
|
|
352
|
+
static var title: LocalizedStringResource = "Work Focus"
|
|
353
|
+
static var description = IntentDescription("Configure app for work mode.")
|
|
354
|
+
|
|
355
|
+
@Parameter(title: "Show Only Work Projects", default: true)
|
|
356
|
+
var workOnly: Bool
|
|
357
|
+
|
|
358
|
+
@Parameter(title: "Mute Notifications", default: false)
|
|
359
|
+
var muteNotifications: Bool
|
|
360
|
+
|
|
361
|
+
var displayRepresentation: DisplayRepresentation {
|
|
362
|
+
"Work Mode"
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
func perform() async throws -> some IntentResult {
|
|
366
|
+
AppSettings.shared.workModeEnabled = workOnly
|
|
367
|
+
AppSettings.shared.notificationsMuted = muteNotifications
|
|
368
|
+
return .result()
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Access current focus filter
|
|
374
|
+
|
|
375
|
+
```swift
|
|
376
|
+
let currentFilter = try? SetFocusFilterIntent.current
|
|
377
|
+
if let workFilter = currentFilter as? WorkFocusFilter {
|
|
378
|
+
// Apply work-mode behavior
|
|
379
|
+
}
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### Suggest filters for a focus context
|
|
383
|
+
|
|
384
|
+
```swift
|
|
385
|
+
extension WorkFocusFilter {
|
|
386
|
+
static func suggestedFocusFilters(
|
|
387
|
+
for context: FocusFilterSuggestionContext
|
|
388
|
+
) async -> [WorkFocusFilter] {
|
|
389
|
+
[WorkFocusFilter(workOnly: true, muteNotifications: true)]
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
## SiriKit Migration (CustomIntentMigratedAppIntent)
|
|
395
|
+
|
|
396
|
+
Replace SiriKit custom intents (`.intentdefinition` files) while preserving
|
|
397
|
+
existing user shortcuts and donations.
|
|
398
|
+
|
|
399
|
+
```swift
|
|
400
|
+
struct OrderSoupIntent: CustomIntentMigratedAppIntent {
|
|
401
|
+
// Map to the old SiriKit intent class name -- must match exactly
|
|
402
|
+
static var intentClassName: String = "OrderSoupIntent"
|
|
403
|
+
|
|
404
|
+
static var title: LocalizedStringResource = "Order Soup"
|
|
405
|
+
|
|
406
|
+
@Parameter(title: "Soup")
|
|
407
|
+
var soup: SoupEntity
|
|
408
|
+
|
|
409
|
+
@Parameter(title: "Quantity", default: 1)
|
|
410
|
+
var quantity: Int
|
|
411
|
+
|
|
412
|
+
func perform() async throws -> some IntentResult {
|
|
413
|
+
let order = try await OrderService.shared.place(
|
|
414
|
+
soup: soup.id,
|
|
415
|
+
quantity: quantity
|
|
416
|
+
)
|
|
417
|
+
return .result(dialog: "Ordered \(quantity) bowls.")
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### Migration steps
|
|
423
|
+
|
|
424
|
+
1. Create a new `AppIntent` struct conforming to `CustomIntentMigratedAppIntent`.
|
|
425
|
+
2. Set `intentClassName` to the old SiriKit intent class name (exact match).
|
|
426
|
+
3. Recreate parameters using `@Parameter` instead of `.intentdefinition` props.
|
|
427
|
+
4. Implement `perform()` with async/await.
|
|
428
|
+
5. Existing user shortcuts and donations continue working via the class name.
|
|
429
|
+
6. Remove the `.intentdefinition` file once migration is verified.
|
|
430
|
+
|
|
431
|
+
### DeprecatedAppIntent (versioning within AppIntents)
|
|
432
|
+
|
|
433
|
+
Replace an old `AppIntent` with a newer version:
|
|
434
|
+
|
|
435
|
+
```swift
|
|
436
|
+
struct OldSearchIntent: DeprecatedAppIntent {
|
|
437
|
+
typealias ReplacementIntent = NewSearchIntent
|
|
438
|
+
static var deprecation: IntentDeprecation {
|
|
439
|
+
.init(message: "Use the new search intent.")
|
|
440
|
+
}
|
|
441
|
+
static var title: LocalizedStringResource = "Search (Deprecated)"
|
|
442
|
+
func perform() async throws -> some IntentResult { .result() }
|
|
443
|
+
}
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
## Error Handling and Dialog
|
|
447
|
+
|
|
448
|
+
### Standard error types (iOS 18+)
|
|
449
|
+
|
|
450
|
+
```swift
|
|
451
|
+
func perform() async throws -> some IntentResult {
|
|
452
|
+
guard await PermissionManager.hasPhotoAccess else {
|
|
453
|
+
throw PermissionRequired(
|
|
454
|
+
"Photo library access is required.",
|
|
455
|
+
recoverySuggestion: "Grant access in Settings > Privacy."
|
|
456
|
+
)
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
guard let item = try await fetchItem() else {
|
|
460
|
+
throw Unrecoverable("The item no longer exists.")
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
guard !requiresManualSetup else {
|
|
464
|
+
throw UserActionRequired("Open the app to complete setup.")
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
return .result()
|
|
468
|
+
}
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
| Error Type | When to Use |
|
|
472
|
+
|---|---|
|
|
473
|
+
| `PermissionRequired` | Missing OS-level permission |
|
|
474
|
+
| `Unrecoverable` | Fatal -- intent cannot proceed |
|
|
475
|
+
| `UserActionRequired` | User must act in the app |
|
|
476
|
+
|
|
477
|
+
### Parameter-level errors
|
|
478
|
+
|
|
479
|
+
```swift
|
|
480
|
+
// Re-prompt for a value
|
|
481
|
+
throw $quantity.needsValueError("How many items?")
|
|
482
|
+
|
|
483
|
+
// Force disambiguation
|
|
484
|
+
throw $size.needsDisambiguation(among: [.small, .medium, .large])
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
### Foreground continuation
|
|
488
|
+
|
|
489
|
+
```swift
|
|
490
|
+
func perform() async throws -> some IntentResult {
|
|
491
|
+
if needsUserInteraction {
|
|
492
|
+
try await continueInForeground("Open the app to finish.")
|
|
493
|
+
}
|
|
494
|
+
// ...
|
|
495
|
+
return .result()
|
|
496
|
+
}
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### Dialog in results
|
|
500
|
+
|
|
501
|
+
```swift
|
|
502
|
+
func perform() async throws -> some IntentResult & ProvidesDialog {
|
|
503
|
+
return .result(dialog: "Your soup order has been placed.")
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
func perform() async throws -> some IntentResult & ProvidesDialog & ReturnsValue<OrderEntity> {
|
|
507
|
+
let order = try await placeOrder()
|
|
508
|
+
return .result(
|
|
509
|
+
value: OrderEntity(from: order),
|
|
510
|
+
dialog: "Order #\(order.number) is confirmed."
|
|
511
|
+
)
|
|
512
|
+
}
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
## Confirmation Flows
|
|
516
|
+
|
|
517
|
+
### Basic confirmation
|
|
518
|
+
|
|
519
|
+
```swift
|
|
520
|
+
func perform() async throws -> some IntentResult {
|
|
521
|
+
try await requestConfirmation(
|
|
522
|
+
actionName: .send,
|
|
523
|
+
dialog: "Send \(quantity) messages?"
|
|
524
|
+
)
|
|
525
|
+
// User confirmed -- proceed
|
|
526
|
+
return .result()
|
|
527
|
+
}
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
### Conditional confirmation
|
|
531
|
+
|
|
532
|
+
```swift
|
|
533
|
+
func perform() async throws -> some IntentResult {
|
|
534
|
+
try await requestConfirmation(
|
|
535
|
+
conditions: .always,
|
|
536
|
+
actionName: .order,
|
|
537
|
+
dialog: "Place order for \(quantity) \(soup.name)?"
|
|
538
|
+
)
|
|
539
|
+
return .result()
|
|
540
|
+
}
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
### Confirmation with SwiftUI content
|
|
544
|
+
|
|
545
|
+
```swift
|
|
546
|
+
func perform() async throws -> some IntentResult {
|
|
547
|
+
try await requestConfirmation(
|
|
548
|
+
actionName: .buy,
|
|
549
|
+
dialog: "Purchase \(item.name) for \(item.price)?",
|
|
550
|
+
view: OrderPreviewView(item: item)
|
|
551
|
+
)
|
|
552
|
+
return .result()
|
|
553
|
+
}
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
### User choice
|
|
557
|
+
|
|
558
|
+
```swift
|
|
559
|
+
func perform() async throws -> some IntentResult {
|
|
560
|
+
let chosen = try await requestChoice(
|
|
561
|
+
between: availableOptions,
|
|
562
|
+
dialog: "Which option would you like?"
|
|
563
|
+
)
|
|
564
|
+
// Use chosen value
|
|
565
|
+
return .result()
|
|
566
|
+
}
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
### ConfirmationActionName options
|
|
570
|
+
|
|
571
|
+
Built-in: `.add`, `.buy`, `.call`, `.create`, `.send`, `.share`, `.start`,
|
|
572
|
+
`.toggle`, `.turnOn`, `.turnOff`, `.open`, `.play`, `.post`, `.search`,
|
|
573
|
+
`.book`, `.download`, `.pay`, `.order`, `.run`, `.get`, `.go`, `.log`,
|
|
574
|
+
`.set`, `.view`, `.find`, `.filter`, `.continue`, `.do`, `.addData`,
|
|
575
|
+
`.checkIn`, `.request`, `.playSound`, `.startNavigation`.
|
|
576
|
+
|
|
577
|
+
Custom:
|
|
578
|
+
|
|
579
|
+
```swift
|
|
580
|
+
.custom(
|
|
581
|
+
acceptLabel: "Confirm Purchase",
|
|
582
|
+
acceptAlternatives: ["Yes", "Buy it"],
|
|
583
|
+
denyLabel: "Cancel",
|
|
584
|
+
denyAlternatives: ["No", "Never mind"],
|
|
585
|
+
destructive: false
|
|
586
|
+
)
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
## Authentication Policies
|
|
590
|
+
|
|
591
|
+
Control when device authentication is required:
|
|
592
|
+
|
|
593
|
+
```swift
|
|
594
|
+
struct TransferMoneyIntent: AppIntent {
|
|
595
|
+
static var authenticationPolicy: IntentAuthenticationPolicy = .requiresAuthentication
|
|
596
|
+
static var title: LocalizedStringResource = "Transfer Money"
|
|
597
|
+
|
|
598
|
+
func perform() async throws -> some IntentResult {
|
|
599
|
+
// Device must be unlocked before this runs
|
|
600
|
+
return .result()
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
| Policy | Behavior |
|
|
606
|
+
|---|---|
|
|
607
|
+
| `.alwaysAllowed` | No authentication required |
|
|
608
|
+
| `.requiresAuthentication` | Device must be unlocked |
|
|
609
|
+
| `.requiresLocalDeviceAuthentication` | Face ID / Touch ID required |
|
|
610
|
+
|
|
611
|
+
```swift
|
|
612
|
+
// WRONG: Sensitive action without authentication
|
|
613
|
+
struct DeleteAccountIntent: AppIntent {
|
|
614
|
+
// Missing authenticationPolicy -- runs on locked device
|
|
615
|
+
func perform() async throws -> some IntentResult { ... }
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// CORRECT: Require authentication for sensitive actions
|
|
619
|
+
struct DeleteAccountIntent: AppIntent {
|
|
620
|
+
static var authenticationPolicy: IntentAuthenticationPolicy = .requiresLocalDeviceAuthentication
|
|
621
|
+
static var title: LocalizedStringResource = "Delete Account"
|
|
622
|
+
func perform() async throws -> some IntentResult { ... }
|
|
623
|
+
}
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
## URLRepresentableIntent / Entity / Enum (iOS 18+)
|
|
627
|
+
|
|
628
|
+
Represent intents, entities, and enums as URLs for deep linking.
|
|
629
|
+
|
|
630
|
+
### URLRepresentableIntent
|
|
631
|
+
|
|
632
|
+
```swift
|
|
633
|
+
struct OpenRecipeIntent: URLRepresentableIntent {
|
|
634
|
+
static var title: LocalizedStringResource = "Open Recipe"
|
|
635
|
+
|
|
636
|
+
@Parameter(title: "Recipe")
|
|
637
|
+
var target: RecipeEntity
|
|
638
|
+
|
|
639
|
+
static var parameterSummary: some ParameterSummary {
|
|
640
|
+
Summary("Open \(\.$target)")
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
func perform() async throws -> some IntentResult & OpensIntent {
|
|
644
|
+
return .result()
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
extension OpenRecipeIntent {
|
|
649
|
+
static var urlRepresentation: some URLRepresentation {
|
|
650
|
+
URLRepresentation {
|
|
651
|
+
"https://myapp.com/recipes/\(\.$target)"
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
### URLRepresentableEntity
|
|
658
|
+
|
|
659
|
+
```swift
|
|
660
|
+
struct RecipeEntity: URLRepresentableEntity {
|
|
661
|
+
// ... standard AppEntity members ...
|
|
662
|
+
|
|
663
|
+
static var urlRepresentation: some URLRepresentation {
|
|
664
|
+
URLRepresentation {
|
|
665
|
+
"https://myapp.com/recipes/\(\.id)"
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
### URLRepresentableEnum
|
|
672
|
+
|
|
673
|
+
```swift
|
|
674
|
+
enum RecipeCategory: String, URLRepresentableEnum {
|
|
675
|
+
case breakfast, lunch, dinner
|
|
676
|
+
|
|
677
|
+
static var urlRepresentation: some URLRepresentation {
|
|
678
|
+
URLRepresentation {
|
|
679
|
+
"https://myapp.com/category/\(\.self)"
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
// ... standard AppEnum members ...
|
|
684
|
+
}
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
## IndexedEntity for Spotlight (iOS 18+)
|
|
688
|
+
|
|
689
|
+
Conform to `IndexedEntity` to make entities searchable in Spotlight.
|
|
690
|
+
|
|
691
|
+
```swift
|
|
692
|
+
struct ArticleEntity: IndexedEntity {
|
|
693
|
+
static let defaultQuery = ArticleQuery()
|
|
694
|
+
static var typeDisplayRepresentation: TypeDisplayRepresentation = "Article"
|
|
695
|
+
|
|
696
|
+
var id: String
|
|
697
|
+
|
|
698
|
+
@Property(title: "Title")
|
|
699
|
+
var title: String
|
|
700
|
+
|
|
701
|
+
@Property(title: "Author")
|
|
702
|
+
var author: String
|
|
703
|
+
|
|
704
|
+
var displayRepresentation: DisplayRepresentation {
|
|
705
|
+
DisplayRepresentation(title: "\(title)", subtitle: "\(author)")
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
// Custom attribute set for improved search accuracy
|
|
709
|
+
var attributeSet: CSSearchableItemAttributeSet? {
|
|
710
|
+
let attrs = CSSearchableItemAttributeSet(contentType: .text)
|
|
711
|
+
attrs.title = title
|
|
712
|
+
attrs.authorNames = [author]
|
|
713
|
+
return attrs
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
### Hide specific entities from Spotlight UI
|
|
719
|
+
|
|
720
|
+
```swift
|
|
721
|
+
extension ArticleEntity {
|
|
722
|
+
var hideInSpotlight: Bool {
|
|
723
|
+
isDraft // Draft articles should not appear in search
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
```
|
|
727
|
+
|
|
728
|
+
## @ComputedProperty(indexingKey:) for Spotlight (iOS 26+)
|
|
729
|
+
|
|
730
|
+
Use indexing keys on `@Property` and `@ComputedProperty` for structured Spotlight
|
|
731
|
+
metadata without manual `CSSearchableItemAttributeSet` configuration.
|
|
732
|
+
|
|
733
|
+
```swift
|
|
734
|
+
struct RecipeEntity: IndexedEntity {
|
|
735
|
+
static let defaultQuery = RecipeQuery()
|
|
736
|
+
static var typeDisplayRepresentation: TypeDisplayRepresentation = "Recipe"
|
|
737
|
+
|
|
738
|
+
var id: String
|
|
739
|
+
|
|
740
|
+
@Property(title: "Name", indexingKey: .title)
|
|
741
|
+
var name: String
|
|
742
|
+
|
|
743
|
+
@Property(title: "Cuisine")
|
|
744
|
+
var cuisine: String
|
|
745
|
+
|
|
746
|
+
@ComputedProperty(indexingKey: .description)
|
|
747
|
+
var summary: String {
|
|
748
|
+
"\(name) -- \(cuisine) cuisine"
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
@ComputedProperty(indexingKey: .thumbnailURL)
|
|
752
|
+
var imageURL: URL? {
|
|
753
|
+
URL(string: "https://myapp.com/images/\(id).jpg")
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
var displayRepresentation: DisplayRepresentation {
|
|
757
|
+
DisplayRepresentation(title: "\(name)", subtitle: "\(cuisine)")
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
```swift
|
|
763
|
+
// WRONG: Manual attributeSet when indexing keys are available (iOS 26+)
|
|
764
|
+
struct RecipeEntity: IndexedEntity {
|
|
765
|
+
@Property(title: "Name")
|
|
766
|
+
var name: String
|
|
767
|
+
|
|
768
|
+
var attributeSet: CSSearchableItemAttributeSet? {
|
|
769
|
+
let attrs = CSSearchableItemAttributeSet(contentType: .text)
|
|
770
|
+
attrs.title = name // Redundant on iOS 26
|
|
771
|
+
return attrs
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
// CORRECT: Use indexingKey for structured metadata (iOS 26+)
|
|
776
|
+
struct RecipeEntity: IndexedEntity {
|
|
777
|
+
@Property(title: "Name", indexingKey: .title)
|
|
778
|
+
var name: String
|
|
779
|
+
}
|
|
780
|
+
```
|
|
781
|
+
|
|
782
|
+
### Available indexing keys
|
|
783
|
+
|
|
784
|
+
| Key | Property Type | Purpose |
|
|
785
|
+
|---|---|---|
|
|
786
|
+
| `.title` | `String` | Primary searchable title |
|
|
787
|
+
| `.description` | `String` | Detailed description |
|
|
788
|
+
| `.thumbnailURL` | `URL?` | Thumbnail image |
|
|
789
|
+
| `.keywords` | `[String]` | Additional search terms |
|
|
790
|
+
| `.contentURL` | `URL?` | Content location |
|
|
791
|
+
|
|
792
|
+
## Onscreen Content for Siri (iOS 26+)
|
|
793
|
+
|
|
794
|
+
Make onscreen content available to Siri and Apple Intelligence without an
|
|
795
|
+
assistant schema:
|
|
796
|
+
|
|
797
|
+
```swift
|
|
798
|
+
struct ArticleEntity: AppEntity, Transferable {
|
|
799
|
+
// Standard AppEntity conformance...
|
|
800
|
+
|
|
801
|
+
static var transferRepresentation: some TransferRepresentation {
|
|
802
|
+
CodableRepresentation(contentType: .article)
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
// In your view controller or SwiftUI view:
|
|
807
|
+
let activity = NSUserActivity(activityType: "com.myapp.article")
|
|
808
|
+
activity.appEntityIdentifier = AppEntityIdentifier(article)
|
|
809
|
+
// Set as current activity
|
|
810
|
+
```
|
|
811
|
+
|
|
812
|
+
## Parameter Summary Builder
|
|
813
|
+
|
|
814
|
+
Use `When`, `Switch`, `Case`, and `DefaultCase` for conditional parameter
|
|
815
|
+
summaries that change based on parameter values:
|
|
816
|
+
|
|
817
|
+
```swift
|
|
818
|
+
struct ConfigureWidgetIntent: WidgetConfigurationIntent {
|
|
819
|
+
static var title: LocalizedStringResource = "Configure Widget"
|
|
820
|
+
|
|
821
|
+
@Parameter(title: "Style")
|
|
822
|
+
var style: WidgetStyle
|
|
823
|
+
|
|
824
|
+
@Parameter(title: "Show Details", default: false)
|
|
825
|
+
var showDetails: Bool
|
|
826
|
+
|
|
827
|
+
@Parameter(title: "Refresh Interval", default: .hourly)
|
|
828
|
+
var interval: RefreshInterval
|
|
829
|
+
|
|
830
|
+
static var parameterSummary: some ParameterSummary {
|
|
831
|
+
When(\.$showDetails, .equalTo, true) {
|
|
832
|
+
Summary("Show \(\.$style) widget") {
|
|
833
|
+
\.$showDetails
|
|
834
|
+
\.$interval
|
|
835
|
+
}
|
|
836
|
+
} otherwise: {
|
|
837
|
+
Summary("Show \(\.$style) widget") {
|
|
838
|
+
\.$showDetails
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
```
|
|
844
|
+
|
|
845
|
+
### Switch/Case for multiple conditions
|
|
846
|
+
|
|
847
|
+
```swift
|
|
848
|
+
static var parameterSummary: some ParameterSummary {
|
|
849
|
+
Switch(\.$style) {
|
|
850
|
+
Case(.compact) {
|
|
851
|
+
Summary("Compact widget")
|
|
852
|
+
}
|
|
853
|
+
Case(.detailed) {
|
|
854
|
+
Summary("Detailed widget") {
|
|
855
|
+
\.$interval
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
DefaultCase {
|
|
859
|
+
Summary("Widget") {
|
|
860
|
+
\.$style
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
```
|
|
866
|
+
|
|
867
|
+
## Core Spotlight Direct Usage
|
|
868
|
+
|
|
869
|
+
Use Core Spotlight directly when you need full control over indexing without
|
|
870
|
+
adopting App Intents, or when targeting iOS versions before IndexedEntity
|
|
871
|
+
(pre-iOS 18). For apps already using App Intents, prefer `IndexedEntity`
|
|
872
|
+
(iOS 18+) or `@ComputedProperty(indexingKey:)` (iOS 26+) instead.
|
|
873
|
+
|
|
874
|
+
### When to Use Core Spotlight Directly vs IndexedEntity
|
|
875
|
+
|
|
876
|
+
| Approach | When to Use |
|
|
877
|
+
|---|---|
|
|
878
|
+
| `IndexedEntity` (iOS 18+) | App already uses App Intents; entities are also Siri/Shortcuts-visible |
|
|
879
|
+
| `@ComputedProperty(indexingKey:)` (iOS 26+) | Cleaner metadata mapping without manual `CSSearchableItemAttributeSet` |
|
|
880
|
+
| Core Spotlight directly | No App Intents adoption; pre-iOS 18 targets; standalone indexing; fine-grained control over expiration, domain grouping, or batch operations |
|
|
881
|
+
|
|
882
|
+
### CSSearchableItem and CSSearchableItemAttributeSet
|
|
883
|
+
|
|
884
|
+
A `CSSearchableItem` uniquely identifies searchable content. Attach a
|
|
885
|
+
`CSSearchableItemAttributeSet` to describe the item's metadata.
|
|
886
|
+
|
|
887
|
+
Docs: [CSSearchableItem](https://sosumi.ai/documentation/corespotlight/cssearchableitem),
|
|
888
|
+
[CSSearchableItemAttributeSet](https://sosumi.ai/documentation/corespotlight/cssearchableitemattributeset)
|
|
889
|
+
|
|
890
|
+
```swift
|
|
891
|
+
import CoreSpotlight
|
|
892
|
+
import UniformTypeIdentifiers
|
|
893
|
+
|
|
894
|
+
func makeSearchableItem(
|
|
895
|
+
id: String,
|
|
896
|
+
title: String,
|
|
897
|
+
description: String,
|
|
898
|
+
thumbnailData: Data? = nil
|
|
899
|
+
) -> CSSearchableItem {
|
|
900
|
+
let attributes = CSSearchableItemAttributeSet(contentType: .text)
|
|
901
|
+
attributes.title = title
|
|
902
|
+
attributes.contentDescription = description
|
|
903
|
+
attributes.thumbnailData = thumbnailData
|
|
904
|
+
|
|
905
|
+
// Optional: improve search ranking and categorization
|
|
906
|
+
attributes.keywords = ["recipe", "cooking"]
|
|
907
|
+
attributes.displayName = title
|
|
908
|
+
attributes.contentURL = URL(string: "myapp://recipes/\(id)")
|
|
909
|
+
|
|
910
|
+
let item = CSSearchableItem(
|
|
911
|
+
uniqueIdentifier: id,
|
|
912
|
+
domainIdentifier: "com.myapp.recipes",
|
|
913
|
+
attributeSet: attributes
|
|
914
|
+
)
|
|
915
|
+
// Items expire after 30 days by default; customize if needed
|
|
916
|
+
item.expirationDate = Date.now.addingTimeInterval(60 * 60 * 24 * 90)
|
|
917
|
+
return item
|
|
918
|
+
}
|
|
919
|
+
```
|
|
920
|
+
|
|
921
|
+
### CSSearchableIndex — Indexing and Deletion
|
|
922
|
+
|
|
923
|
+
Use `CSSearchableIndex` to add, update, and remove items. The `default()`
|
|
924
|
+
index works for most apps. Use a named index with a protection class for
|
|
925
|
+
sensitive content.
|
|
926
|
+
|
|
927
|
+
Docs: [CSSearchableIndex](https://sosumi.ai/documentation/corespotlight/cssearchableindex)
|
|
928
|
+
|
|
929
|
+
```swift
|
|
930
|
+
import CoreSpotlight
|
|
931
|
+
|
|
932
|
+
// Index a single item (add or update)
|
|
933
|
+
func indexItem(_ item: CSSearchableItem) async throws {
|
|
934
|
+
try await CSSearchableIndex.default().indexSearchableItems([item])
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
// Delete specific items by identifier
|
|
938
|
+
func deleteItems(identifiers: [String]) async throws {
|
|
939
|
+
try await CSSearchableIndex.default().deleteSearchableItems(
|
|
940
|
+
withIdentifiers: identifiers
|
|
941
|
+
)
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
// Delete all items in a domain (e.g., after user deletes a category)
|
|
945
|
+
func deleteItemsInDomain(_ domain: String) async throws {
|
|
946
|
+
try await CSSearchableIndex.default().deleteSearchableItems(
|
|
947
|
+
withDomainIdentifiers: [domain]
|
|
948
|
+
)
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
// Delete everything (e.g., on logout)
|
|
952
|
+
func deleteAllItems() async throws {
|
|
953
|
+
try await CSSearchableIndex.default().deleteAllSearchableItems()
|
|
954
|
+
}
|
|
955
|
+
```
|
|
956
|
+
|
|
957
|
+
### Batch Indexing Patterns
|
|
958
|
+
|
|
959
|
+
For large data sets, index in batches to minimize memory pressure and handle
|
|
960
|
+
errors gracefully. Use `beginBatch()` / `endBatch(withClientState:)` to
|
|
961
|
+
track progress and resume after crashes.
|
|
962
|
+
|
|
963
|
+
```swift
|
|
964
|
+
import CoreSpotlight
|
|
965
|
+
|
|
966
|
+
func batchIndexRecipes(_ recipes: [Recipe]) async throws {
|
|
967
|
+
let index = CSSearchableIndex(name: "recipes")
|
|
968
|
+
|
|
969
|
+
// Simple batched approach -- chunk into groups
|
|
970
|
+
let batchSize = 100
|
|
971
|
+
for batch in stride(from: 0, to: recipes.count, by: batchSize) {
|
|
972
|
+
let end = min(batch + batchSize, recipes.count)
|
|
973
|
+
let items = recipes[batch..<end].map { recipe in
|
|
974
|
+
makeSearchableItem(
|
|
975
|
+
id: recipe.id,
|
|
976
|
+
title: recipe.name,
|
|
977
|
+
description: recipe.summary,
|
|
978
|
+
thumbnailData: recipe.thumbnailData
|
|
979
|
+
)
|
|
980
|
+
}
|
|
981
|
+
try await index.indexSearchableItems(items)
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
// Client-state-based batching for crash recovery
|
|
986
|
+
func batchIndexWithState(_ recipes: [Recipe]) async throws {
|
|
987
|
+
let index = CSSearchableIndex(name: "recipes")
|
|
988
|
+
|
|
989
|
+
// Check where we left off
|
|
990
|
+
let lastState = try await index.fetchLastClientState()
|
|
991
|
+
let startOffset = lastState.flatMap { Int(String(data: $0, encoding: .utf8) ?? "") } ?? 0
|
|
992
|
+
|
|
993
|
+
let batchSize = 100
|
|
994
|
+
for batch in stride(from: startOffset, to: recipes.count, by: batchSize) {
|
|
995
|
+
let end = min(batch + batchSize, recipes.count)
|
|
996
|
+
let items = recipes[batch..<end].map { recipe in
|
|
997
|
+
makeSearchableItem(
|
|
998
|
+
id: recipe.id,
|
|
999
|
+
title: recipe.name,
|
|
1000
|
+
description: recipe.summary
|
|
1001
|
+
)
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
index.beginBatch()
|
|
1005
|
+
try await index.indexSearchableItems(items)
|
|
1006
|
+
|
|
1007
|
+
let stateData = "\(end)".data(using: .utf8)!
|
|
1008
|
+
try await index.endBatch(withClientState: stateData)
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
```
|
|
1012
|
+
|
|
1013
|
+
### Protected Index for Sensitive Content
|
|
1014
|
+
|
|
1015
|
+
Use a named index with a data protection class to encrypt indexed content:
|
|
1016
|
+
|
|
1017
|
+
```swift
|
|
1018
|
+
let protectedIndex = CSSearchableIndex(
|
|
1019
|
+
name: "secure-notes",
|
|
1020
|
+
protectionClass: .complete // Only accessible when device is unlocked
|
|
1021
|
+
)
|
|
1022
|
+
|
|
1023
|
+
try await protectedIndex.indexSearchableItems(sensitiveItems)
|
|
1024
|
+
```
|
|
1025
|
+
|
|
1026
|
+
### Handling Search Results (NSUserActivity)
|
|
1027
|
+
|
|
1028
|
+
When a user taps a Spotlight result, the system delivers an `NSUserActivity`
|
|
1029
|
+
with `activityType` set to `CSSearchableItemActionType`. Extract the item
|
|
1030
|
+
identifier from `userInfo` to navigate to the correct content.
|
|
1031
|
+
|
|
1032
|
+
```swift
|
|
1033
|
+
import CoreSpotlight
|
|
1034
|
+
import UIKit
|
|
1035
|
+
|
|
1036
|
+
// UIKit: In AppDelegate or SceneDelegate
|
|
1037
|
+
func application(
|
|
1038
|
+
_ application: UIApplication,
|
|
1039
|
+
continue userActivity: NSUserActivity,
|
|
1040
|
+
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
|
|
1041
|
+
) -> Bool {
|
|
1042
|
+
if userActivity.activityType == CSSearchableItemActionType,
|
|
1043
|
+
let identifier = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String {
|
|
1044
|
+
navigateToItem(withIdentifier: identifier)
|
|
1045
|
+
return true
|
|
1046
|
+
}
|
|
1047
|
+
return false
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
// SwiftUI: Use onContinueUserActivity
|
|
1051
|
+
struct ContentView: View {
|
|
1052
|
+
var body: some View {
|
|
1053
|
+
NavigationStack {
|
|
1054
|
+
RecipeListView()
|
|
1055
|
+
}
|
|
1056
|
+
.onContinueUserActivity(CSSearchableItemActionType) { activity in
|
|
1057
|
+
if let id = activity.userInfo?[CSSearchableItemActivityIdentifier] as? String {
|
|
1058
|
+
navigateToRecipe(id: id)
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
```
|
|
1064
|
+
|
|
1065
|
+
### Query Continuation
|
|
1066
|
+
|
|
1067
|
+
When a user taps "Search in App" from Spotlight, handle the query string:
|
|
1068
|
+
|
|
1069
|
+
```swift
|
|
1070
|
+
// activityType == CSQueryContinuationActionType
|
|
1071
|
+
.onContinueUserActivity(CSQueryContinuationActionType) { activity in
|
|
1072
|
+
if let query = activity.userInfo?[CSSearchQueryString] as? String {
|
|
1073
|
+
searchViewModel.searchText = query
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
```
|