@devo-bmad-custom/agent-orchestration 1.0.2 → 1.0.3
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/lib/installer.js +33 -0
- package/package.json +1 -1
- package/src/.agents/skills/audit-website/README.md +20 -20
- package/src/.agents/skills/audit-website/SKILL.md +470 -470
- package/src/.agents/skills/audit-website/agents/openai.yaml +6 -6
- package/src/.agents/skills/audit-website/assets/icon-small.svg +41 -41
- package/src/.agents/skills/audit-website/references/OUTPUT-FORMAT.md +250 -250
- package/src/.agents/skills/clean-code-standards/SKILL.md +104 -104
- package/src/.agents/skills/excalidraw-dark-standard/SKILL.md +281 -281
- package/src/.agents/skills/frontend-responsive-design-standards/SKILL.md +434 -434
- package/src/.agents/skills/java-fundamentals/SKILL.md +116 -116
- package/src/.agents/skills/java-performance/SKILL.md +119 -119
- package/src/.agents/skills/next-best-practices/SKILL.md +153 -153
- package/src/.agents/skills/next-best-practices/async-patterns.md +87 -87
- package/src/.agents/skills/next-best-practices/bundling.md +180 -180
- package/src/.agents/skills/next-best-practices/data-patterns.md +297 -297
- package/src/.agents/skills/next-best-practices/debug-tricks.md +105 -105
- package/src/.agents/skills/next-best-practices/directives.md +73 -73
- package/src/.agents/skills/next-best-practices/error-handling.md +227 -227
- package/src/.agents/skills/next-best-practices/file-conventions.md +140 -140
- package/src/.agents/skills/next-best-practices/font.md +245 -245
- package/src/.agents/skills/next-best-practices/functions.md +108 -108
- package/src/.agents/skills/next-best-practices/hydration-error.md +91 -91
- package/src/.agents/skills/next-best-practices/image.md +173 -173
- package/src/.agents/skills/next-best-practices/metadata.md +301 -301
- package/src/.agents/skills/next-best-practices/parallel-routes.md +287 -287
- package/src/.agents/skills/next-best-practices/route-handlers.md +146 -146
- package/src/.agents/skills/next-best-practices/rsc-boundaries.md +159 -159
- package/src/.agents/skills/next-best-practices/runtime-selection.md +39 -39
- package/src/.agents/skills/next-best-practices/scripts.md +141 -141
- package/src/.agents/skills/next-best-practices/self-hosting.md +371 -371
- package/src/.agents/skills/next-best-practices/suspense-boundaries.md +67 -67
- package/src/.agents/skills/nextjs-app-router-patterns/SKILL.md +537 -537
- package/src/.agents/skills/postgresql-optimization/SKILL.md +404 -404
- package/src/.agents/skills/python-backend/SKILL.md +153 -153
- package/src/.agents/skills/python-fundamentals/SKILL.md +234 -234
- package/src/.agents/skills/python-performance/SKILL.md +404 -404
- package/src/.agents/skills/react-expert/SKILL.md +335 -335
- package/src/.agents/skills/redis-best-practices/SKILL.md +438 -438
- package/src/.agents/skills/security-best-practices/SKILL.md +288 -288
- package/src/.agents/skills/security-review/LICENSE +22 -22
- package/src/.agents/skills/security-review/SKILL.md +312 -312
- package/src/.agents/skills/security-review/infrastructure/docker.md +432 -432
- package/src/.agents/skills/security-review/languages/javascript.md +388 -388
- package/src/.agents/skills/security-review/languages/python.md +363 -363
- package/src/.agents/skills/security-review/references/api-security.md +519 -519
- package/src/.agents/skills/security-review/references/authentication.md +353 -353
- package/src/.agents/skills/security-review/references/authorization.md +372 -372
- package/src/.agents/skills/security-review/references/business-logic.md +443 -443
- package/src/.agents/skills/security-review/references/cryptography.md +329 -329
- package/src/.agents/skills/security-review/references/csrf.md +398 -398
- package/src/.agents/skills/security-review/references/data-protection.md +378 -378
- package/src/.agents/skills/security-review/references/deserialization.md +410 -410
- package/src/.agents/skills/security-review/references/error-handling.md +436 -436
- package/src/.agents/skills/security-review/references/file-security.md +457 -457
- package/src/.agents/skills/security-review/references/injection.md +259 -259
- package/src/.agents/skills/security-review/references/logging.md +433 -433
- package/src/.agents/skills/security-review/references/misconfiguration.md +435 -435
- package/src/.agents/skills/security-review/references/modern-threats.md +475 -475
- package/src/.agents/skills/security-review/references/ssrf.md +415 -415
- package/src/.agents/skills/security-review/references/supply-chain.md +405 -405
- package/src/.agents/skills/security-review/references/xss.md +336 -336
- package/src/.agents/skills/subagent-driven-development/SKILL.md +275 -275
- package/src/.agents/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -26
- package/src/.agents/skills/subagent-driven-development/implementer-prompt.md +113 -113
- package/src/.agents/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -61
- package/src/.agents/skills/systematic-debugging/CREATION-LOG.md +119 -119
- package/src/.agents/skills/systematic-debugging/SKILL.md +296 -296
- package/src/.agents/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
- package/src/.agents/skills/systematic-debugging/condition-based-waiting.md +115 -115
- package/src/.agents/skills/systematic-debugging/defense-in-depth.md +122 -122
- package/src/.agents/skills/systematic-debugging/root-cause-tracing.md +169 -169
- package/src/.agents/skills/systematic-debugging/test-academic.md +14 -14
- package/src/.agents/skills/systematic-debugging/test-pressure-1.md +58 -58
- package/src/.agents/skills/systematic-debugging/test-pressure-2.md +68 -68
- package/src/.agents/skills/systematic-debugging/test-pressure-3.md +69 -69
- package/src/.agents/skills/typescript-best-practices/SKILL.md +373 -373
- package/src/.agents/skills/ui-ux-pro-custom/SKILL.md +348 -348
- package/src/.agents/skills/ui-ux-pro-custom/data/charts.csv +26 -26
- package/src/.agents/skills/ui-ux-pro-custom/data/colors.csv +97 -97
- package/src/.agents/skills/ui-ux-pro-custom/data/icons.csv +101 -101
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/SKILL.md +106 -106
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/accessibility.md +475 -475
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/animation.md +466 -466
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/composition-locals.md +231 -231
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/deprecated-patterns.md +323 -323
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/lists-scrolling.md +400 -400
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/modifiers.md +331 -331
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/navigation.md +416 -416
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/performance.md +446 -446
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/side-effects.md +516 -516
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/foundation-source.md +13327 -13327
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/material3-source.md +19097 -19097
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/navigation-source.md +2947 -2947
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/runtime-source.md +11316 -11316
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/source-code/ui-source.md +7896 -7896
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/state-management.md +377 -377
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/styles-experimental.md +470 -470
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/theming-material3.md +349 -349
- package/src/.agents/skills/ui-ux-pro-custom/data/jetpack-compose-expert-skill/references/view-composition.md +595 -595
- package/src/.agents/skills/ui-ux-pro-custom/data/landing.csv +31 -31
- package/src/.agents/skills/ui-ux-pro-custom/data/mobile-ui-layout.md +654 -654
- package/src/.agents/skills/ui-ux-pro-custom/data/products.csv +96 -96
- package/src/.agents/skills/ui-ux-pro-custom/data/react-performance.csv +45 -45
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/astro.csv +54 -54
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/flutter.csv +53 -53
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/html-tailwind.csv +56 -56
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/jetpack-compose.csv +53 -53
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/nextjs.csv +53 -53
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/nuxt-ui.csv +51 -51
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/nuxtjs.csv +59 -59
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/react-native.csv +56 -56
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/react.csv +54 -54
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/shadcn.csv +61 -61
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/svelte.csv +54 -54
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/swiftui.csv +51 -51
- package/src/.agents/skills/ui-ux-pro-custom/data/stacks/vue.csv +50 -50
- package/src/.agents/skills/ui-ux-pro-custom/data/styles.csv +68 -68
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/alarmkit/SKILL.md +438 -438
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/alarmkit/references/alarmkit-patterns.md +584 -584
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-clips/SKILL.md +436 -436
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-intents/SKILL.md +489 -489
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-intents/references/appintents-advanced.md +1076 -1076
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-store-review/SKILL.md +340 -340
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-store-review/references/privacy-manifest.md +90 -90
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/app-store-review/references/review-checklists.md +106 -106
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/SKILL.md +500 -500
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/coreml-conversion.md +425 -425
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/coreml-optimization.md +344 -344
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/foundation-models.md +508 -508
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/apple-on-device-ai/references/mlx-swift.md +285 -285
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/authentication/SKILL.md +496 -496
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/authentication/references/keychain-biometric.md +211 -211
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/background-processing/SKILL.md +499 -499
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/background-processing/references/background-task-patterns.md +390 -390
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/callkit-voip/SKILL.md +461 -461
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/callkit-voip/references/callkit-patterns.md +425 -425
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/cloudkit-sync/SKILL.md +492 -492
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/cloudkit-sync/references/cloudkit-patterns.md +461 -461
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/codable-patterns/SKILL.md +467 -467
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/contacts-framework/SKILL.md +425 -425
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/contacts-framework/references/contacts-patterns.md +409 -409
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-bluetooth/SKILL.md +491 -491
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-bluetooth/references/ble-patterns.md +435 -435
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-motion/SKILL.md +388 -388
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-motion/references/motion-patterns.md +405 -405
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-nfc/SKILL.md +495 -495
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/core-nfc/references/nfc-patterns.md +420 -420
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/coreml/SKILL.md +459 -459
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/coreml/references/coreml-swift-integration.md +765 -765
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/debugging-instruments/SKILL.md +422 -422
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/debugging-instruments/references/instruments-guide.md +387 -387
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/debugging-instruments/references/lldb-patterns.md +298 -298
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/device-integrity/SKILL.md +477 -477
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/energykit/SKILL.md +460 -460
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/energykit/references/energykit-patterns.md +541 -541
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/eventkit-calendar/SKILL.md +483 -483
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/eventkit-calendar/references/eventkit-patterns.md +326 -326
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/healthkit/SKILL.md +498 -498
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/healthkit/references/healthkit-patterns.md +602 -602
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/homekit-matter/SKILL.md +496 -496
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/homekit-matter/references/matter-commissioning.md +455 -455
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-accessibility/SKILL.md +301 -301
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-accessibility/references/a11y-patterns.md +140 -140
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-localization/SKILL.md +418 -418
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-localization/references/formatstyle-locale.md +627 -627
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-localization/references/string-catalogs.md +462 -462
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/SKILL.md +441 -441
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/background-websocket.md +862 -862
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/lightweight-clients.md +93 -93
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/network-framework.md +563 -563
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-networking/references/urlsession-patterns.md +1116 -1116
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/SKILL.md +496 -496
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/app-review-guidelines.md +174 -174
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/cryptokit-advanced.md +296 -296
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/file-storage-patterns.md +354 -354
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/ios-security/references/privacy-manifest.md +117 -117
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/live-activities/SKILL.md +500 -500
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/live-activities/references/live-activity-patterns.md +868 -868
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/mapkit-location/SKILL.md +485 -485
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/mapkit-location/references/corelocation-patterns.md +730 -730
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/mapkit-location/references/mapkit-patterns.md +748 -748
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/metrickit-diagnostics/SKILL.md +479 -479
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/musickit-audio/SKILL.md +395 -395
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/musickit-audio/references/musickit-patterns.md +363 -363
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/natural-language/SKILL.md +412 -412
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/natural-language/references/translation-patterns.md +311 -311
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/passkit-wallet/SKILL.md +398 -398
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/passkit-wallet/references/wallet-passes.md +254 -254
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/pencilkit-drawing/SKILL.md +387 -387
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/pencilkit-drawing/references/paperkit-integration.md +376 -376
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/pencilkit-drawing/references/pencilkit-patterns.md +302 -302
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/permissionkit/SKILL.md +446 -446
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/permissionkit/references/permissionkit-patterns.md +435 -435
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/SKILL.md +500 -500
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/av-playback.md +701 -701
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/camera-capture.md +774 -774
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/image-loading-caching.md +869 -869
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/photos-camera-media/references/photospicker-patterns.md +597 -597
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/push-notifications/SKILL.md +500 -500
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/push-notifications/references/notification-patterns.md +677 -677
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/push-notifications/references/rich-notifications.md +745 -745
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/realitykit-ar/SKILL.md +479 -479
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/realitykit-ar/references/realitykit-patterns.md +480 -480
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/shareplay-activities/SKILL.md +483 -483
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/shareplay-activities/references/shareplay-patterns.md +544 -544
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/speech-recognition/SKILL.md +485 -485
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/storekit/SKILL.md +478 -478
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/storekit/references/app-review-guidelines.md +58 -58
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/storekit/references/storekit-advanced.md +755 -755
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-charts/SKILL.md +487 -487
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-charts/references/charts-patterns.md +895 -895
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/SKILL.md +408 -408
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/approachable-concurrency.md +80 -80
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/swift-6-2-concurrency.md +233 -233
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/swiftui-concurrency.md +187 -187
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-concurrency/references/synchronization-primitives.md +341 -341
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-language/SKILL.md +498 -498
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-language/references/swift-patterns-extended.md +505 -505
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-testing/SKILL.md +467 -467
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swift-testing/references/testing-patterns.md +504 -504
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/SKILL.md +334 -334
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/references/core-data-coexistence.md +504 -504
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/references/swiftdata-advanced.md +975 -975
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftdata/references/swiftdata-queries.md +675 -675
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-animation/SKILL.md +481 -481
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-animation/references/animation-advanced.md +804 -804
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-animation/references/core-animation-bridge.md +553 -553
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-gestures/SKILL.md +450 -450
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-gestures/references/gesture-patterns.md +425 -425
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/SKILL.md +336 -336
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/form.md +97 -97
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/grids.md +69 -69
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/list.md +99 -99
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-layout-components/references/scrollview.md +147 -147
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-liquid-glass/SKILL.md +325 -325
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-liquid-glass/references/liquid-glass.md +387 -387
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/SKILL.md +262 -262
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/deeplinks.md +207 -207
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/navigationstack.md +177 -177
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/sheets.md +169 -169
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-navigation/references/tabview.md +178 -178
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/SKILL.md +381 -381
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/architecture-patterns.md +486 -486
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/deprecated-migration.md +1097 -1097
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/design-polish.md +780 -780
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-patterns/references/platform-and-sharing.md +696 -696
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/SKILL.md +491 -491
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +46 -46
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +29 -29
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/understanding-hangs-in-your-app.md +33 -33
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-performance/references/understanding-improving-swiftui-performance.md +52 -52
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-uikit-interop/SKILL.md +428 -428
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-uikit-interop/references/hosting-migration.md +534 -534
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/swiftui-uikit-interop/references/representable-recipes.md +1133 -1133
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/tipkit/SKILL.md +494 -494
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/tipkit/references/tipkit-patterns.md +782 -782
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/SKILL.md +475 -475
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/references/vision-requests.md +736 -736
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/references/visionkit-scanner.md +738 -738
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/weatherkit/SKILL.md +410 -410
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/weatherkit/references/weatherkit-patterns.md +567 -567
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/widgetkit/SKILL.md +497 -497
- package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/widgetkit/references/widgetkit-advanced.md +871 -871
- package/src/.agents/skills/ui-ux-pro-custom/data/typography.csv +57 -57
- package/src/.agents/skills/ui-ux-pro-custom/data/ui-reasoning.csv +101 -101
- package/src/.agents/skills/ui-ux-pro-custom/data/ux-guidelines.csv +99 -99
- package/src/.agents/skills/ui-ux-pro-custom/data/web-interface.csv +31 -31
- package/src/.agents/skills/ui-ux-pro-custom/scripts/core.py +253 -253
- package/src/.agents/skills/ui-ux-pro-custom/scripts/design_system.py +1067 -1067
- package/src/.agents/skills/ui-ux-pro-custom/scripts/search.py +114 -114
- package/src/.agents/skills/ux-audit/SKILL.md +150 -150
- package/src/.agents/skills/websocket-engineer/SKILL.md +168 -168
- package/src/.agents/skills/websocket-engineer/references/alternatives.md +391 -391
- package/src/.agents/skills/websocket-engineer/references/patterns.md +400 -400
- package/src/.agents/skills/websocket-engineer/references/protocol.md +195 -195
- package/src/.agents/skills/websocket-engineer/references/scaling.md +333 -333
- package/src/.agents/skills/websocket-engineer/references/security.md +474 -474
- package/src/.agents/skills/writing-skills/SKILL.md +655 -655
- package/src/.agents/skills/writing-skills/anthropic-best-practices.md +1150 -1150
- package/src/.agents/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -189
- package/src/.agents/skills/writing-skills/graphviz-conventions.dot +171 -171
- package/src/.agents/skills/writing-skills/persuasion-principles.md +187 -187
- package/src/.agents/skills/writing-skills/render-graphs.js +168 -168
- package/src/.agents/skills/writing-skills/testing-skills-with-subagents.md +384 -384
- package/src/.claude/commands/master-orchestrator.md +15 -0
- package/src/_memory/config.yaml +11 -11
- package/src/_memory/master-orchestrator-sidecar/instructions.md +85 -32
- package/src/_memory/skills/nimbalyst-tracking/SKILL.md +103 -103
- package/src/_memory/skills/writing-skills/SKILL.md +655 -655
- package/src/bmb/agents/agent-builder.md +59 -59
- package/src/bmb/agents/module-builder.md +60 -60
- package/src/bmb/agents/workflow-builder.md +61 -61
- package/src/bmb/config.yaml +12 -12
- package/src/bmb/module-help.csv +13 -13
- package/src/bmb/workflows/agent/data/agent-architecture.md +258 -258
- package/src/bmb/workflows/agent/data/agent-compilation.md +185 -185
- package/src/bmb/workflows/agent/data/agent-menu-patterns.md +189 -189
- package/src/bmb/workflows/agent/data/agent-metadata.md +133 -133
- package/src/bmb/workflows/agent/data/agent-validation.md +111 -111
- package/src/bmb/workflows/agent/data/brainstorm-context.md +96 -96
- package/src/bmb/workflows/agent/data/communication-presets.csv +61 -61
- package/src/bmb/workflows/agent/data/critical-actions.md +75 -75
- package/src/bmb/workflows/agent/data/persona-properties.md +252 -252
- package/src/bmb/workflows/agent/data/principles-crafting.md +142 -142
- package/src/bmb/workflows/agent/data/reference/module-examples/architect.md +68 -68
- package/src/bmb/workflows/agent/data/reference/with-sidecar/journal-keeper/journal-keeper-sidecar/entries/yy-mm-dd-entry-template.md +16 -16
- package/src/bmb/workflows/agent/data/understanding-agent-types.md +126 -126
- package/src/bmb/workflows/agent/steps-c/step-01-brainstorm.md +129 -129
- package/src/bmb/workflows/agent/steps-c/step-02-discovery.md +170 -170
- package/src/bmb/workflows/agent/steps-c/step-03-sidecar-metadata.md +309 -309
- package/src/bmb/workflows/agent/steps-c/step-04-persona.md +213 -213
- package/src/bmb/workflows/agent/steps-c/step-05-commands-menu.md +179 -179
- package/src/bmb/workflows/agent/steps-c/step-06-activation.md +278 -278
- package/src/bmb/workflows/agent/steps-c/step-07-build-agent.md +316 -316
- package/src/bmb/workflows/agent/steps-c/step-08-celebrate.md +247 -247
- package/src/bmb/workflows/agent/steps-e/e-01-load-existing.md +221 -221
- package/src/bmb/workflows/agent/steps-e/e-02-discover-edits.md +195 -195
- package/src/bmb/workflows/agent/steps-e/e-04-sidecar-metadata.md +126 -126
- package/src/bmb/workflows/agent/steps-e/e-05-persona.md +135 -135
- package/src/bmb/workflows/agent/steps-e/e-06-commands-menu.md +123 -123
- package/src/bmb/workflows/agent/steps-e/e-07-activation.md +124 -124
- package/src/bmb/workflows/agent/steps-e/e-08-edit-agent.md +197 -197
- package/src/bmb/workflows/agent/steps-e/e-09-celebrate.md +155 -155
- package/src/bmb/workflows/agent/steps-v/v-01-load-review.md +137 -137
- package/src/bmb/workflows/agent/steps-v/v-02a-validate-metadata.md +116 -116
- package/src/bmb/workflows/agent/steps-v/v-02b-validate-persona.md +124 -124
- package/src/bmb/workflows/agent/steps-v/v-02c-validate-menu.md +127 -127
- package/src/bmb/workflows/agent/steps-v/v-02d-validate-structure.md +134 -134
- package/src/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md +134 -134
- package/src/bmb/workflows/agent/steps-v/v-03-summary.md +104 -104
- package/src/bmb/workflows/agent/templates/agent-plan.template.md +5 -5
- package/src/bmb/workflows/agent/templates/agent-template.md +89 -89
- package/src/bmb/workflows/agent/workflow-create-agent.md +72 -72
- package/src/bmb/workflows/agent/workflow-edit-agent.md +75 -75
- package/src/bmb/workflows/agent/workflow-validate-agent.md +73 -73
- package/src/bmb/workflows/module/data/agent-architecture.md +179 -179
- package/src/bmb/workflows/module/data/agent-spec-template.md +79 -79
- package/src/bmb/workflows/module/data/module-standards.md +263 -263
- package/src/bmb/workflows/module/data/module-yaml-conventions.md +392 -392
- package/src/bmb/workflows/module/module-help-generate.md +254 -254
- package/src/bmb/workflows/module/steps-b/step-01-welcome.md +148 -148
- package/src/bmb/workflows/module/steps-b/step-02-spark.md +141 -141
- package/src/bmb/workflows/module/steps-b/step-03-module-type.md +149 -149
- package/src/bmb/workflows/module/steps-b/step-04-vision.md +83 -83
- package/src/bmb/workflows/module/steps-b/step-05-identity.md +97 -97
- package/src/bmb/workflows/module/steps-b/step-06-users.md +86 -86
- package/src/bmb/workflows/module/steps-b/step-07-value.md +76 -76
- package/src/bmb/workflows/module/steps-b/step-08-agents.md +97 -97
- package/src/bmb/workflows/module/steps-b/step-09-workflows.md +83 -83
- package/src/bmb/workflows/module/steps-b/step-10-tools.md +91 -91
- package/src/bmb/workflows/module/steps-b/step-11-scenarios.md +84 -84
- package/src/bmb/workflows/module/steps-b/step-12-creative.md +95 -95
- package/src/bmb/workflows/module/steps-b/step-13-review.md +105 -105
- package/src/bmb/workflows/module/steps-b/step-14-finalize.md +117 -117
- package/src/bmb/workflows/module/steps-c/step-01-load-brief.md +179 -179
- package/src/bmb/workflows/module/steps-c/step-01b-continue.md +82 -82
- package/src/bmb/workflows/module/steps-c/step-02-structure.md +105 -105
- package/src/bmb/workflows/module/steps-c/step-03-config.md +119 -119
- package/src/bmb/workflows/module/steps-c/step-04-agents.md +168 -168
- package/src/bmb/workflows/module/steps-c/step-05-workflows.md +184 -184
- package/src/bmb/workflows/module/steps-c/step-06-docs.md +401 -401
- package/src/bmb/workflows/module/steps-c/step-07-complete.md +152 -152
- package/src/bmb/workflows/module/steps-e/step-01-load-target.md +81 -81
- package/src/bmb/workflows/module/steps-e/step-02-select-edit.md +77 -77
- package/src/bmb/workflows/module/steps-e/step-03-apply-edit.md +77 -77
- package/src/bmb/workflows/module/steps-e/step-04-review.md +80 -80
- package/src/bmb/workflows/module/steps-e/step-05-confirm.md +75 -75
- package/src/bmb/workflows/module/steps-v/step-01-load-target.md +96 -96
- package/src/bmb/workflows/module/steps-v/step-02-file-structure.md +93 -93
- package/src/bmb/workflows/module/steps-v/step-03-module-yaml.md +99 -99
- package/src/bmb/workflows/module/steps-v/step-04-agent-specs.md +152 -152
- package/src/bmb/workflows/module/steps-v/step-05-workflow-specs.md +152 -152
- package/src/bmb/workflows/module/steps-v/step-06-documentation.md +143 -143
- package/src/bmb/workflows/module/steps-v/step-07-installation.md +102 -102
- package/src/bmb/workflows/module/steps-v/step-08-report.md +197 -197
- package/src/bmb/workflows/module/templates/brief-template.md +154 -154
- package/src/bmb/workflows/module/templates/workflow-spec-template.md +96 -96
- package/src/bmb/workflows/module/workflow-create-module-brief.md +71 -71
- package/src/bmb/workflows/module/workflow-create-module.md +86 -86
- package/src/bmb/workflows/module/workflow-edit-module.md +66 -66
- package/src/bmb/workflows/module/workflow-validate-module.md +66 -66
- package/src/bmb/workflows/workflow/data/architecture.md +150 -150
- package/src/bmb/workflows/workflow/data/common-workflow-tools.csv +19 -19
- package/src/bmb/workflows/workflow/data/csv-data-file-standards.md +53 -53
- package/src/bmb/workflows/workflow/data/frontmatter-standards.md +184 -184
- package/src/bmb/workflows/workflow/data/input-discovery-standards.md +191 -191
- package/src/bmb/workflows/workflow/data/intent-vs-prescriptive-spectrum.md +44 -44
- package/src/bmb/workflows/workflow/data/menu-handling-standards.md +133 -133
- package/src/bmb/workflows/workflow/data/output-format-standards.md +135 -135
- package/src/bmb/workflows/workflow/data/step-file-rules.md +235 -235
- package/src/bmb/workflows/workflow/data/step-type-patterns.md +257 -257
- package/src/bmb/workflows/workflow/data/subprocess-optimization-patterns.md +188 -188
- package/src/bmb/workflows/workflow/data/trimodal-workflow-structure.md +164 -164
- package/src/bmb/workflows/workflow/data/workflow-chaining-standards.md +222 -222
- package/src/bmb/workflows/workflow/data/workflow-examples.md +232 -232
- package/src/bmb/workflows/workflow/data/workflow-type-criteria.md +134 -134
- package/src/bmb/workflows/workflow/steps-c/step-00-conversion.md +263 -263
- package/src/bmb/workflows/workflow/steps-c/step-01-discovery.md +194 -194
- package/src/bmb/workflows/workflow/steps-c/step-01b-continuation.md +3 -3
- package/src/bmb/workflows/workflow/steps-c/step-02-classification.md +270 -270
- package/src/bmb/workflows/workflow/steps-c/step-03-requirements.md +283 -283
- package/src/bmb/workflows/workflow/steps-c/step-04-tools.md +282 -282
- package/src/bmb/workflows/workflow/steps-c/step-05-plan-review.md +243 -243
- package/src/bmb/workflows/workflow/steps-c/step-06-design.md +330 -330
- package/src/bmb/workflows/workflow/steps-c/step-07-foundation.md +239 -239
- package/src/bmb/workflows/workflow/steps-c/step-08-build-step-01.md +379 -379
- package/src/bmb/workflows/workflow/steps-c/step-09-build-next-step.md +350 -350
- package/src/bmb/workflows/workflow/steps-c/step-10-confirmation.md +322 -322
- package/src/bmb/workflows/workflow/steps-c/step-11-completion.md +191 -191
- package/src/bmb/workflows/workflow/steps-e/step-e-01-assess-workflow.md +237 -237
- package/src/bmb/workflows/workflow/steps-e/step-e-02-discover-edits.md +251 -251
- package/src/bmb/workflows/workflow/steps-e/step-e-03-fix-validation.md +254 -254
- package/src/bmb/workflows/workflow/steps-e/step-e-04-direct-edit.md +277 -277
- package/src/bmb/workflows/workflow/steps-e/step-e-05-apply-edit.md +154 -154
- package/src/bmb/workflows/workflow/steps-e/step-e-06-validate-after.md +190 -190
- package/src/bmb/workflows/workflow/steps-e/step-e-07-complete.md +206 -206
- package/src/bmb/workflows/workflow/steps-v/step-01-validate-max-mode.md +109 -109
- package/src/bmb/workflows/workflow/steps-v/step-01-validate.md +221 -221
- package/src/bmb/workflows/workflow/steps-v/step-01b-structure.md +152 -152
- package/src/bmb/workflows/workflow/steps-v/step-02-frontmatter-validation.md +199 -199
- package/src/bmb/workflows/workflow/steps-v/step-02b-path-violations.md +265 -265
- package/src/bmb/workflows/workflow/steps-v/step-03-menu-validation.md +164 -164
- package/src/bmb/workflows/workflow/steps-v/step-04-step-type-validation.md +211 -211
- package/src/bmb/workflows/workflow/steps-v/step-05-output-format-validation.md +200 -200
- package/src/bmb/workflows/workflow/steps-v/step-06-validation-design-check.md +195 -195
- package/src/bmb/workflows/workflow/steps-v/step-07-instruction-style-check.md +209 -209
- package/src/bmb/workflows/workflow/steps-v/step-08-collaborative-experience-check.md +199 -199
- package/src/bmb/workflows/workflow/steps-v/step-08b-subprocess-optimization.md +179 -179
- package/src/bmb/workflows/workflow/steps-v/step-09-cohesive-review.md +186 -186
- package/src/bmb/workflows/workflow/steps-v/step-10-report-complete.md +154 -154
- package/src/bmb/workflows/workflow/steps-v/step-11-plan-validation.md +237 -237
- package/src/bmb/workflows/workflow/templates/minimal-output-template.md +11 -11
- package/src/bmb/workflows/workflow/templates/step-01-init-continuable-template.md +241 -241
- package/src/bmb/workflows/workflow/templates/step-1b-template.md +224 -224
- package/src/bmb/workflows/workflow/templates/step-template.md +294 -294
- package/src/bmb/workflows/workflow/templates/workflow-template.md +102 -102
- package/src/bmb/workflows/workflow/workflow-create-workflow.md +79 -79
- package/src/bmb/workflows/workflow/workflow-edit-workflow.md +65 -65
- package/src/bmb/workflows/workflow/workflow-rework-workflow.md +65 -65
- package/src/bmb/workflows/workflow/workflow-validate-max-parallel-workflow.md +66 -66
- package/src/bmb/workflows/workflow/workflow-validate-workflow.md +65 -65
- package/src/bmm/agents/analyst.md +104 -104
- package/src/bmm/agents/dev.md +100 -100
- package/src/bmm/agents/qa.md +100 -90
- package/src/bmm/agents/tech-writer/tech-writer.md +94 -94
- package/src/bmm/module-help.csv +31 -31
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +115 -115
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +107 -107
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +141 -141
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +144 -144
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +147 -147
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +161 -161
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +99 -99
- package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +57 -57
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +87 -87
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +156 -156
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +165 -165
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +140 -140
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +152 -152
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +345 -345
- package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +92 -92
- package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +164 -164
- package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +174 -174
- package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +184 -184
- package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +105 -105
- package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +360 -360
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +87 -87
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +165 -165
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +174 -174
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +141 -141
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +159 -159
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +387 -387
- package/src/bmm/workflows/1-analysis/research/workflow-domain-research.md +54 -54
- package/src/bmm/workflows/1-analysis/research/workflow-market-research.md +54 -54
- package/src/bmm/workflows/1-analysis/research/workflow-technical-research.md +54 -54
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +100 -100
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +160 -160
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +88 -88
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +99 -99
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +169 -169
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +156 -156
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +136 -136
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +176 -176
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +184 -184
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +174 -174
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +175 -175
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +189 -189
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +162 -162
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +79 -79
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +183 -183
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +149 -149
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +187 -187
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +192 -192
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +108 -108
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +166 -166
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +131 -131
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +150 -150
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +118 -118
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +155 -155
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +170 -170
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +158 -158
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +147 -147
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +182 -182
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +202 -202
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +148 -148
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +201 -201
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +179 -179
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +164 -164
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md +65 -65
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md +65 -65
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +63 -63
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +63 -63
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +106 -106
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +111 -111
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +115 -115
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +127 -127
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +167 -167
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +143 -143
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +118 -118
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +154 -154
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +136 -136
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +165 -165
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +135 -135
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +192 -192
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +101 -101
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +45 -45
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +185 -185
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +129 -129
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +130 -130
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +93 -93
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +196 -196
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +129 -129
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +54 -54
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +82 -82
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +106 -106
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +138 -138
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +129 -129
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +166 -166
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +186 -186
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +163 -163
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +38 -38
- package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +49 -49
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +124 -124
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +122 -122
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +84 -84
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -58
- package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +43 -43
- package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +53 -53
- package/src/bmm/workflows/4-implementation/create-story/checklist.md +159 -159
- package/src/bmm/workflows/4-implementation/create-story/template.md +79 -79
- package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +52 -52
- package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +20 -20
- package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +52 -52
- package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +52 -52
- package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +25 -25
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +158 -158
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +122 -122
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +93 -93
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +93 -93
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +87 -87
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +146 -146
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -50
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +152 -152
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +123 -123
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +201 -201
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -79
- package/src/bmm/workflows/document-project/workflow.yaml +22 -22
- package/src/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -184
- package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +322 -322
- package/src/bmm/workflows/generate-project-context/steps/step-03-complete.md +235 -235
- package/src/bmm/workflows/generate-project-context/workflow.md +49 -49
- package/src/bmm/workflows/qa/automate/workflow.yaml +233 -233
- package/src/bmm/workflows/qa-generate-e2e-tests/workflow.yaml +42 -42
- package/src/core/config.yaml +9 -9
- package/src/core/module-help.csv +10 -10
- package/src/core/scripts/generate-loop-report.py +72 -72
- package/src/core/tasks/editorial-review-prose.xml +101 -101
- package/src/core/tasks/editorial-review-structure.xml +207 -207
- package/src/core/tasks/help.md +86 -86
- package/src/core/tasks/index-docs.xml +64 -64
- package/src/core/tasks/review-adversarial-general.xml +66 -66
- package/src/core/tasks/review-adversarial-loop.xml +46 -46
- package/src/core/tasks/review-edge-case-hunter.xml +63 -63
- package/src/core/tasks/review-party-loop.xml +46 -46
- package/src/core/tasks/shard-doc.xml +107 -107
- package/src/core/tasks/workflow.xml +235 -235
- package/src/core/templates/review-loop-report.html +88 -88
- package/src/core/templates/review-loop-report.md +5 -5
- package/src/core/workflows/advanced-elicitation/workflow.xml +117 -117
- package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +212 -212
- package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -122
- package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -225
- package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -237
- package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -209
- package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -264
- package/src/core/workflows/brainstorming/steps/step-02e-deep-dive.md +68 -68
- package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +403 -403
- package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -303
- package/src/core/workflows/brainstorming/workflow.md +60 -60
- package/src/core/workflows/extract-trackers/workflow.md +45 -45
- package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +142 -142
- package/src/core/workflows/party-mode/workflow.md +194 -194
- package/src/docs/dev/tmux/actions_popup.py +291 -291
- package/src/docs/dev/tmux/tmux-setup.md +62 -1
|
@@ -1,446 +1,446 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: permissionkit
|
|
3
|
-
description: "Create child communication safety experiences using PermissionKit to request parental permission for children. Use when building apps that involve child-to-contact communication, need to check communication limits, request parent/guardian approval, or handle permission responses for minors."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# PermissionKit
|
|
7
|
-
|
|
8
|
-
> **Note:** PermissionKit is new in iOS 26. Method signatures should be verified against the latest Xcode 26 beta SDK.
|
|
9
|
-
|
|
10
|
-
Request permission from a parent or guardian to modify a child's communication
|
|
11
|
-
rules. PermissionKit creates communication safety experiences that let children
|
|
12
|
-
ask for exceptions to communication limits set by their parents. Targets
|
|
13
|
-
Swift 6.2 / iOS 26+.
|
|
14
|
-
|
|
15
|
-
## Contents
|
|
16
|
-
|
|
17
|
-
- [Setup](#setup)
|
|
18
|
-
- [Core Concepts](#core-concepts)
|
|
19
|
-
- [Checking Communication Limits](#checking-communication-limits)
|
|
20
|
-
- [Creating Permission Questions](#creating-permission-questions)
|
|
21
|
-
- [Requesting Permission with AskCenter](#requesting-permission-with-askcenter)
|
|
22
|
-
- [SwiftUI Integration with PermissionButton](#swiftui-integration-with-permissionbutton)
|
|
23
|
-
- [Handling Responses](#handling-responses)
|
|
24
|
-
- [Significant App Update Topic](#significant-app-update-topic)
|
|
25
|
-
- [Common Mistakes](#common-mistakes)
|
|
26
|
-
- [Review Checklist](#review-checklist)
|
|
27
|
-
- [References](#references)
|
|
28
|
-
|
|
29
|
-
## Setup
|
|
30
|
-
|
|
31
|
-
Import `PermissionKit`. No special entitlements are required.
|
|
32
|
-
|
|
33
|
-
```swift
|
|
34
|
-
import PermissionKit
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
**Platform availability:** iOS 26+, iPadOS 26+, macOS 26+.
|
|
38
|
-
|
|
39
|
-
## Core Concepts
|
|
40
|
-
|
|
41
|
-
PermissionKit manages a flow where:
|
|
42
|
-
|
|
43
|
-
1. A child encounters a communication limit in your app
|
|
44
|
-
2. Your app creates a `PermissionQuestion` describing the request
|
|
45
|
-
3. The system presents the question to the child for them to send to their parent
|
|
46
|
-
4. The parent reviews and approves or denies the request
|
|
47
|
-
5. Your app receives a `PermissionResponse` with the parent's decision
|
|
48
|
-
|
|
49
|
-
### Key Types
|
|
50
|
-
|
|
51
|
-
| Type | Role |
|
|
52
|
-
|---|---|
|
|
53
|
-
| `AskCenter` | Singleton that manages permission requests and responses |
|
|
54
|
-
| `PermissionQuestion` | Describes the permission being requested |
|
|
55
|
-
| `PermissionResponse` | The parent's decision (approval or denial) |
|
|
56
|
-
| `PermissionChoice` | The specific answer (approve/decline) |
|
|
57
|
-
| `PermissionButton` | SwiftUI button that triggers the permission flow |
|
|
58
|
-
| `CommunicationTopic` | Topic for communication-related permission requests |
|
|
59
|
-
| `CommunicationHandle` | A phone number, email, or custom identifier |
|
|
60
|
-
| `CommunicationLimits` | Checks whether communication limits apply |
|
|
61
|
-
| `SignificantAppUpdateTopic` | Topic for significant app update permission requests |
|
|
62
|
-
|
|
63
|
-
## Checking Communication Limits
|
|
64
|
-
|
|
65
|
-
Before presenting a permission request, check if communication limits are
|
|
66
|
-
enabled and whether the handle is known.
|
|
67
|
-
|
|
68
|
-
```swift
|
|
69
|
-
import PermissionKit
|
|
70
|
-
|
|
71
|
-
func checkCommunicationStatus(for handle: CommunicationHandle) async -> Bool {
|
|
72
|
-
let limits = CommunicationLimits.current
|
|
73
|
-
let isKnown = await limits.isKnownHandle(handle)
|
|
74
|
-
return isKnown
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Check multiple handles at once
|
|
78
|
-
func filterKnownHandles(_ handles: Set<CommunicationHandle>) async -> Set<CommunicationHandle> {
|
|
79
|
-
let limits = CommunicationLimits.current
|
|
80
|
-
return await limits.knownHandles(in: handles)
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### Creating Communication Handles
|
|
85
|
-
|
|
86
|
-
```swift
|
|
87
|
-
let phoneHandle = CommunicationHandle(
|
|
88
|
-
value: "+1234567890",
|
|
89
|
-
kind: .phoneNumber
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
let emailHandle = CommunicationHandle(
|
|
93
|
-
value: "friend@example.com",
|
|
94
|
-
kind: .emailAddress
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
let customHandle = CommunicationHandle(
|
|
98
|
-
value: "user123",
|
|
99
|
-
kind: .custom
|
|
100
|
-
)
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Creating Permission Questions
|
|
104
|
-
|
|
105
|
-
Build a `PermissionQuestion` with the contact information and communication
|
|
106
|
-
action type.
|
|
107
|
-
|
|
108
|
-
```swift
|
|
109
|
-
// Question for a single contact
|
|
110
|
-
let handle = CommunicationHandle(value: "+1234567890", kind: .phoneNumber)
|
|
111
|
-
let question = PermissionQuestion<CommunicationTopic>(handle: handle)
|
|
112
|
-
|
|
113
|
-
// Question for multiple contacts
|
|
114
|
-
let handles = [
|
|
115
|
-
CommunicationHandle(value: "+1234567890", kind: .phoneNumber),
|
|
116
|
-
CommunicationHandle(value: "friend@example.com", kind: .emailAddress)
|
|
117
|
-
]
|
|
118
|
-
let multiQuestion = PermissionQuestion<CommunicationTopic>(handles: handles)
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### Using CommunicationTopic with Person Information
|
|
122
|
-
|
|
123
|
-
Provide display names and avatars for a richer permission prompt.
|
|
124
|
-
|
|
125
|
-
```swift
|
|
126
|
-
let personInfo = CommunicationTopic.PersonInformation(
|
|
127
|
-
handle: CommunicationHandle(value: "+1234567890", kind: .phoneNumber),
|
|
128
|
-
nameComponents: {
|
|
129
|
-
var name = PersonNameComponents()
|
|
130
|
-
name.givenName = "Alex"
|
|
131
|
-
name.familyName = "Smith"
|
|
132
|
-
return name
|
|
133
|
-
}(),
|
|
134
|
-
avatarImage: nil
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
let topic = CommunicationTopic(
|
|
138
|
-
personInformation: [personInfo],
|
|
139
|
-
actions: [.message, .audioCall]
|
|
140
|
-
)
|
|
141
|
-
|
|
142
|
-
let question = PermissionQuestion<CommunicationTopic>(communicationTopic: topic)
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### Communication Actions
|
|
146
|
-
|
|
147
|
-
| Action | Description |
|
|
148
|
-
|---|---|
|
|
149
|
-
| `.message` | Text messaging |
|
|
150
|
-
| `.audioCall` | Voice call |
|
|
151
|
-
| `.videoCall` | Video call |
|
|
152
|
-
| `.call` | Generic call |
|
|
153
|
-
| `.chat` | Chat communication |
|
|
154
|
-
| `.follow` | Follow a user |
|
|
155
|
-
| `.beFollowed` | Allow being followed |
|
|
156
|
-
| `.friend` | Friend request |
|
|
157
|
-
| `.connect` | Connection request |
|
|
158
|
-
| `.communicate` | Generic communication |
|
|
159
|
-
|
|
160
|
-
## Requesting Permission with AskCenter
|
|
161
|
-
|
|
162
|
-
Use `AskCenter.shared` to present the permission request to the child.
|
|
163
|
-
|
|
164
|
-
```swift
|
|
165
|
-
import PermissionKit
|
|
166
|
-
|
|
167
|
-
func requestPermission(
|
|
168
|
-
for question: PermissionQuestion<CommunicationTopic>,
|
|
169
|
-
in viewController: UIViewController
|
|
170
|
-
) async {
|
|
171
|
-
do {
|
|
172
|
-
try await AskCenter.shared.ask(question, in: viewController)
|
|
173
|
-
// Question was presented to the child
|
|
174
|
-
} catch let error as AskError {
|
|
175
|
-
switch error {
|
|
176
|
-
case .communicationLimitsNotEnabled:
|
|
177
|
-
// Communication limits not active -- no permission needed
|
|
178
|
-
break
|
|
179
|
-
case .contactSyncNotSetup:
|
|
180
|
-
// Contact sync not configured
|
|
181
|
-
break
|
|
182
|
-
case .invalidQuestion:
|
|
183
|
-
// Question is malformed
|
|
184
|
-
break
|
|
185
|
-
case .notAvailable:
|
|
186
|
-
// PermissionKit not available on this device
|
|
187
|
-
break
|
|
188
|
-
case .systemError(let underlying):
|
|
189
|
-
print("System error: \(underlying)")
|
|
190
|
-
case .unknown:
|
|
191
|
-
break
|
|
192
|
-
@unknown default:
|
|
193
|
-
break
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
## SwiftUI Integration with PermissionButton
|
|
200
|
-
|
|
201
|
-
`PermissionButton` is a SwiftUI view that triggers the permission flow
|
|
202
|
-
when tapped.
|
|
203
|
-
|
|
204
|
-
```swift
|
|
205
|
-
import SwiftUI
|
|
206
|
-
import PermissionKit
|
|
207
|
-
|
|
208
|
-
struct ContactPermissionView: View {
|
|
209
|
-
let handle = CommunicationHandle(value: "+1234567890", kind: .phoneNumber)
|
|
210
|
-
|
|
211
|
-
var body: some View {
|
|
212
|
-
let question = PermissionQuestion<CommunicationTopic>(handle: handle)
|
|
213
|
-
|
|
214
|
-
PermissionButton(question: question) {
|
|
215
|
-
Label("Ask to Message", systemImage: "message")
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
### PermissionButton with Custom Topic
|
|
222
|
-
|
|
223
|
-
```swift
|
|
224
|
-
struct CustomPermissionView: View {
|
|
225
|
-
var body: some View {
|
|
226
|
-
let personInfo = CommunicationTopic.PersonInformation(
|
|
227
|
-
handle: CommunicationHandle(value: "user456", kind: .custom),
|
|
228
|
-
nameComponents: nil,
|
|
229
|
-
avatarImage: nil
|
|
230
|
-
)
|
|
231
|
-
let topic = CommunicationTopic(
|
|
232
|
-
personInformation: [personInfo],
|
|
233
|
-
actions: [.follow]
|
|
234
|
-
)
|
|
235
|
-
let question = PermissionQuestion<CommunicationTopic>(
|
|
236
|
-
communicationTopic: topic
|
|
237
|
-
)
|
|
238
|
-
|
|
239
|
-
PermissionButton(question: question) {
|
|
240
|
-
Text("Ask to Follow")
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
## Handling Responses
|
|
247
|
-
|
|
248
|
-
Listen for permission responses asynchronously.
|
|
249
|
-
|
|
250
|
-
```swift
|
|
251
|
-
func observeResponses() async {
|
|
252
|
-
let responses = AskCenter.shared.responses(for: CommunicationTopic.self)
|
|
253
|
-
|
|
254
|
-
for await response in responses {
|
|
255
|
-
let choice = response.choice
|
|
256
|
-
let question = response.question
|
|
257
|
-
|
|
258
|
-
switch choice.answer {
|
|
259
|
-
case .approval:
|
|
260
|
-
// Parent approved -- enable communication
|
|
261
|
-
print("Approved for topic: \(question.topic)")
|
|
262
|
-
case .denial:
|
|
263
|
-
// Parent denied -- keep restriction
|
|
264
|
-
print("Denied")
|
|
265
|
-
@unknown default:
|
|
266
|
-
break
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
### PermissionChoice Properties
|
|
273
|
-
|
|
274
|
-
```swift
|
|
275
|
-
let choice: PermissionChoice = response.choice
|
|
276
|
-
print("Answer: \(choice.answer)") // .approval or .denial
|
|
277
|
-
print("Choice ID: \(choice.id)")
|
|
278
|
-
print("Title: \(choice.title)")
|
|
279
|
-
|
|
280
|
-
// Convenience statics
|
|
281
|
-
let approved = PermissionChoice.approve
|
|
282
|
-
let declined = PermissionChoice.decline
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
## Significant App Update Topic
|
|
286
|
-
|
|
287
|
-
Request permission for significant app updates that require parental approval.
|
|
288
|
-
|
|
289
|
-
```swift
|
|
290
|
-
let updateTopic = SignificantAppUpdateTopic(
|
|
291
|
-
description: "This update adds multiplayer chat features"
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
let question = PermissionQuestion<SignificantAppUpdateTopic>(
|
|
295
|
-
significantAppUpdateTopic: updateTopic
|
|
296
|
-
)
|
|
297
|
-
|
|
298
|
-
// Present the question
|
|
299
|
-
try await AskCenter.shared.ask(question, in: viewController)
|
|
300
|
-
|
|
301
|
-
// Listen for responses
|
|
302
|
-
for await response in AskCenter.shared.responses(for: SignificantAppUpdateTopic.self) {
|
|
303
|
-
switch response.choice.answer {
|
|
304
|
-
case .approval:
|
|
305
|
-
// Proceed with update
|
|
306
|
-
break
|
|
307
|
-
case .denial:
|
|
308
|
-
// Skip update
|
|
309
|
-
break
|
|
310
|
-
@unknown default:
|
|
311
|
-
break
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
## Common Mistakes
|
|
317
|
-
|
|
318
|
-
### DON'T: Skip checking if communication limits are enabled
|
|
319
|
-
|
|
320
|
-
If communication limits are not enabled, calling `ask` throws
|
|
321
|
-
`.communicationLimitsNotEnabled`. Check first or handle the error.
|
|
322
|
-
|
|
323
|
-
```swift
|
|
324
|
-
// WRONG: Assuming limits are always active
|
|
325
|
-
try await AskCenter.shared.ask(question, in: viewController)
|
|
326
|
-
|
|
327
|
-
// CORRECT: Handle the case where limits are not enabled
|
|
328
|
-
do {
|
|
329
|
-
try await AskCenter.shared.ask(question, in: viewController)
|
|
330
|
-
} catch AskError.communicationLimitsNotEnabled {
|
|
331
|
-
// Communication limits not active -- allow communication directly
|
|
332
|
-
allowCommunication()
|
|
333
|
-
} catch {
|
|
334
|
-
handleError(error)
|
|
335
|
-
}
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
### DON'T: Ignore AskError cases
|
|
339
|
-
|
|
340
|
-
Each error case requires different handling.
|
|
341
|
-
|
|
342
|
-
```swift
|
|
343
|
-
// WRONG: Catch-all with no user feedback
|
|
344
|
-
do {
|
|
345
|
-
try await AskCenter.shared.ask(question, in: viewController)
|
|
346
|
-
} catch {
|
|
347
|
-
print(error)
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
// CORRECT: Handle each case
|
|
351
|
-
do {
|
|
352
|
-
try await AskCenter.shared.ask(question, in: viewController)
|
|
353
|
-
} catch let error as AskError {
|
|
354
|
-
switch error {
|
|
355
|
-
case .communicationLimitsNotEnabled:
|
|
356
|
-
allowCommunication()
|
|
357
|
-
case .contactSyncNotSetup:
|
|
358
|
-
showContactSyncPrompt()
|
|
359
|
-
case .invalidQuestion:
|
|
360
|
-
showInvalidQuestionAlert()
|
|
361
|
-
case .notAvailable:
|
|
362
|
-
showUnavailableMessage()
|
|
363
|
-
case .systemError(let underlying):
|
|
364
|
-
showSystemError(underlying)
|
|
365
|
-
case .unknown:
|
|
366
|
-
showGenericError()
|
|
367
|
-
@unknown default:
|
|
368
|
-
break
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
### DON'T: Create questions with empty handles
|
|
374
|
-
|
|
375
|
-
A question with no handles or person information is invalid.
|
|
376
|
-
|
|
377
|
-
```swift
|
|
378
|
-
// WRONG: Empty handles array
|
|
379
|
-
let question = PermissionQuestion<CommunicationTopic>(handles: []) // Invalid
|
|
380
|
-
|
|
381
|
-
// CORRECT: Provide at least one handle
|
|
382
|
-
let handle = CommunicationHandle(value: "+1234567890", kind: .phoneNumber)
|
|
383
|
-
let question = PermissionQuestion<CommunicationTopic>(handle: handle)
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
### DON'T: Forget to observe responses
|
|
387
|
-
|
|
388
|
-
Presenting a question without listening for the response means you never
|
|
389
|
-
know if the parent approved.
|
|
390
|
-
|
|
391
|
-
```swift
|
|
392
|
-
// WRONG: Fire and forget
|
|
393
|
-
try await AskCenter.shared.ask(question, in: viewController)
|
|
394
|
-
|
|
395
|
-
// CORRECT: Observe responses
|
|
396
|
-
Task {
|
|
397
|
-
for await response in AskCenter.shared.responses(for: CommunicationTopic.self) {
|
|
398
|
-
handleResponse(response)
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
try await AskCenter.shared.ask(question, in: viewController)
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
### DON'T: Use deprecated CommunicationLimitsButton
|
|
405
|
-
|
|
406
|
-
Use `PermissionButton` instead of the deprecated `CommunicationLimitsButton`.
|
|
407
|
-
|
|
408
|
-
```swift
|
|
409
|
-
// WRONG: Deprecated
|
|
410
|
-
CommunicationLimitsButton(question: question) {
|
|
411
|
-
Text("Ask Permission")
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
// CORRECT: Use PermissionButton
|
|
415
|
-
PermissionButton(question: question) {
|
|
416
|
-
Text("Ask Permission")
|
|
417
|
-
}
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
## Review Checklist
|
|
421
|
-
|
|
422
|
-
- [ ] `AskError.communicationLimitsNotEnabled` handled to allow fallback
|
|
423
|
-
- [ ] `AskError` cases handled individually with appropriate user feedback
|
|
424
|
-
- [ ] `CommunicationHandle` created with correct `Kind` (phone, email, custom)
|
|
425
|
-
- [ ] `PermissionQuestion` includes at least one handle or person information
|
|
426
|
-
- [ ] `AskCenter.shared.responses(for:)` observed to receive parent decisions
|
|
427
|
-
- [ ] `PermissionButton` used instead of deprecated `CommunicationLimitsButton`
|
|
428
|
-
- [ ] Person information includes name components for a clear permission prompt
|
|
429
|
-
- [ ] Communication actions match the app's actual communication capabilities
|
|
430
|
-
- [ ] Response handling updates UI on the main actor
|
|
431
|
-
- [ ] Error states provide clear guidance to the user
|
|
432
|
-
|
|
433
|
-
## References
|
|
434
|
-
|
|
435
|
-
- Extended patterns (response handling, multi-topic, UIKit): `references/permissionkit-patterns.md`
|
|
436
|
-
- [PermissionKit framework](https://sosumi.ai/documentation/permissionkit)
|
|
437
|
-
- [AskCenter](https://sosumi.ai/documentation/permissionkit/askcenter)
|
|
438
|
-
- [PermissionQuestion](https://sosumi.ai/documentation/permissionkit/permissionquestion)
|
|
439
|
-
- [PermissionButton](https://sosumi.ai/documentation/permissionkit/permissionbutton)
|
|
440
|
-
- [PermissionResponse](https://sosumi.ai/documentation/permissionkit/permissionresponse)
|
|
441
|
-
- [CommunicationTopic](https://sosumi.ai/documentation/permissionkit/communicationtopic)
|
|
442
|
-
- [CommunicationHandle](https://sosumi.ai/documentation/permissionkit/communicationhandle)
|
|
443
|
-
- [CommunicationLimits](https://sosumi.ai/documentation/permissionkit/communicationlimits)
|
|
444
|
-
- [SignificantAppUpdateTopic](https://sosumi.ai/documentation/permissionkit/significantappupdatetopic)
|
|
445
|
-
- [AskError](https://sosumi.ai/documentation/permissionkit/askerror)
|
|
446
|
-
- [Creating a communication experience](https://sosumi.ai/documentation/permissionkit/creating-a-communication-experience)
|
|
1
|
+
---
|
|
2
|
+
name: permissionkit
|
|
3
|
+
description: "Create child communication safety experiences using PermissionKit to request parental permission for children. Use when building apps that involve child-to-contact communication, need to check communication limits, request parent/guardian approval, or handle permission responses for minors."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PermissionKit
|
|
7
|
+
|
|
8
|
+
> **Note:** PermissionKit is new in iOS 26. Method signatures should be verified against the latest Xcode 26 beta SDK.
|
|
9
|
+
|
|
10
|
+
Request permission from a parent or guardian to modify a child's communication
|
|
11
|
+
rules. PermissionKit creates communication safety experiences that let children
|
|
12
|
+
ask for exceptions to communication limits set by their parents. Targets
|
|
13
|
+
Swift 6.2 / iOS 26+.
|
|
14
|
+
|
|
15
|
+
## Contents
|
|
16
|
+
|
|
17
|
+
- [Setup](#setup)
|
|
18
|
+
- [Core Concepts](#core-concepts)
|
|
19
|
+
- [Checking Communication Limits](#checking-communication-limits)
|
|
20
|
+
- [Creating Permission Questions](#creating-permission-questions)
|
|
21
|
+
- [Requesting Permission with AskCenter](#requesting-permission-with-askcenter)
|
|
22
|
+
- [SwiftUI Integration with PermissionButton](#swiftui-integration-with-permissionbutton)
|
|
23
|
+
- [Handling Responses](#handling-responses)
|
|
24
|
+
- [Significant App Update Topic](#significant-app-update-topic)
|
|
25
|
+
- [Common Mistakes](#common-mistakes)
|
|
26
|
+
- [Review Checklist](#review-checklist)
|
|
27
|
+
- [References](#references)
|
|
28
|
+
|
|
29
|
+
## Setup
|
|
30
|
+
|
|
31
|
+
Import `PermissionKit`. No special entitlements are required.
|
|
32
|
+
|
|
33
|
+
```swift
|
|
34
|
+
import PermissionKit
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Platform availability:** iOS 26+, iPadOS 26+, macOS 26+.
|
|
38
|
+
|
|
39
|
+
## Core Concepts
|
|
40
|
+
|
|
41
|
+
PermissionKit manages a flow where:
|
|
42
|
+
|
|
43
|
+
1. A child encounters a communication limit in your app
|
|
44
|
+
2. Your app creates a `PermissionQuestion` describing the request
|
|
45
|
+
3. The system presents the question to the child for them to send to their parent
|
|
46
|
+
4. The parent reviews and approves or denies the request
|
|
47
|
+
5. Your app receives a `PermissionResponse` with the parent's decision
|
|
48
|
+
|
|
49
|
+
### Key Types
|
|
50
|
+
|
|
51
|
+
| Type | Role |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `AskCenter` | Singleton that manages permission requests and responses |
|
|
54
|
+
| `PermissionQuestion` | Describes the permission being requested |
|
|
55
|
+
| `PermissionResponse` | The parent's decision (approval or denial) |
|
|
56
|
+
| `PermissionChoice` | The specific answer (approve/decline) |
|
|
57
|
+
| `PermissionButton` | SwiftUI button that triggers the permission flow |
|
|
58
|
+
| `CommunicationTopic` | Topic for communication-related permission requests |
|
|
59
|
+
| `CommunicationHandle` | A phone number, email, or custom identifier |
|
|
60
|
+
| `CommunicationLimits` | Checks whether communication limits apply |
|
|
61
|
+
| `SignificantAppUpdateTopic` | Topic for significant app update permission requests |
|
|
62
|
+
|
|
63
|
+
## Checking Communication Limits
|
|
64
|
+
|
|
65
|
+
Before presenting a permission request, check if communication limits are
|
|
66
|
+
enabled and whether the handle is known.
|
|
67
|
+
|
|
68
|
+
```swift
|
|
69
|
+
import PermissionKit
|
|
70
|
+
|
|
71
|
+
func checkCommunicationStatus(for handle: CommunicationHandle) async -> Bool {
|
|
72
|
+
let limits = CommunicationLimits.current
|
|
73
|
+
let isKnown = await limits.isKnownHandle(handle)
|
|
74
|
+
return isKnown
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Check multiple handles at once
|
|
78
|
+
func filterKnownHandles(_ handles: Set<CommunicationHandle>) async -> Set<CommunicationHandle> {
|
|
79
|
+
let limits = CommunicationLimits.current
|
|
80
|
+
return await limits.knownHandles(in: handles)
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Creating Communication Handles
|
|
85
|
+
|
|
86
|
+
```swift
|
|
87
|
+
let phoneHandle = CommunicationHandle(
|
|
88
|
+
value: "+1234567890",
|
|
89
|
+
kind: .phoneNumber
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
let emailHandle = CommunicationHandle(
|
|
93
|
+
value: "friend@example.com",
|
|
94
|
+
kind: .emailAddress
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
let customHandle = CommunicationHandle(
|
|
98
|
+
value: "user123",
|
|
99
|
+
kind: .custom
|
|
100
|
+
)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Creating Permission Questions
|
|
104
|
+
|
|
105
|
+
Build a `PermissionQuestion` with the contact information and communication
|
|
106
|
+
action type.
|
|
107
|
+
|
|
108
|
+
```swift
|
|
109
|
+
// Question for a single contact
|
|
110
|
+
let handle = CommunicationHandle(value: "+1234567890", kind: .phoneNumber)
|
|
111
|
+
let question = PermissionQuestion<CommunicationTopic>(handle: handle)
|
|
112
|
+
|
|
113
|
+
// Question for multiple contacts
|
|
114
|
+
let handles = [
|
|
115
|
+
CommunicationHandle(value: "+1234567890", kind: .phoneNumber),
|
|
116
|
+
CommunicationHandle(value: "friend@example.com", kind: .emailAddress)
|
|
117
|
+
]
|
|
118
|
+
let multiQuestion = PermissionQuestion<CommunicationTopic>(handles: handles)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Using CommunicationTopic with Person Information
|
|
122
|
+
|
|
123
|
+
Provide display names and avatars for a richer permission prompt.
|
|
124
|
+
|
|
125
|
+
```swift
|
|
126
|
+
let personInfo = CommunicationTopic.PersonInformation(
|
|
127
|
+
handle: CommunicationHandle(value: "+1234567890", kind: .phoneNumber),
|
|
128
|
+
nameComponents: {
|
|
129
|
+
var name = PersonNameComponents()
|
|
130
|
+
name.givenName = "Alex"
|
|
131
|
+
name.familyName = "Smith"
|
|
132
|
+
return name
|
|
133
|
+
}(),
|
|
134
|
+
avatarImage: nil
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
let topic = CommunicationTopic(
|
|
138
|
+
personInformation: [personInfo],
|
|
139
|
+
actions: [.message, .audioCall]
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
let question = PermissionQuestion<CommunicationTopic>(communicationTopic: topic)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Communication Actions
|
|
146
|
+
|
|
147
|
+
| Action | Description |
|
|
148
|
+
|---|---|
|
|
149
|
+
| `.message` | Text messaging |
|
|
150
|
+
| `.audioCall` | Voice call |
|
|
151
|
+
| `.videoCall` | Video call |
|
|
152
|
+
| `.call` | Generic call |
|
|
153
|
+
| `.chat` | Chat communication |
|
|
154
|
+
| `.follow` | Follow a user |
|
|
155
|
+
| `.beFollowed` | Allow being followed |
|
|
156
|
+
| `.friend` | Friend request |
|
|
157
|
+
| `.connect` | Connection request |
|
|
158
|
+
| `.communicate` | Generic communication |
|
|
159
|
+
|
|
160
|
+
## Requesting Permission with AskCenter
|
|
161
|
+
|
|
162
|
+
Use `AskCenter.shared` to present the permission request to the child.
|
|
163
|
+
|
|
164
|
+
```swift
|
|
165
|
+
import PermissionKit
|
|
166
|
+
|
|
167
|
+
func requestPermission(
|
|
168
|
+
for question: PermissionQuestion<CommunicationTopic>,
|
|
169
|
+
in viewController: UIViewController
|
|
170
|
+
) async {
|
|
171
|
+
do {
|
|
172
|
+
try await AskCenter.shared.ask(question, in: viewController)
|
|
173
|
+
// Question was presented to the child
|
|
174
|
+
} catch let error as AskError {
|
|
175
|
+
switch error {
|
|
176
|
+
case .communicationLimitsNotEnabled:
|
|
177
|
+
// Communication limits not active -- no permission needed
|
|
178
|
+
break
|
|
179
|
+
case .contactSyncNotSetup:
|
|
180
|
+
// Contact sync not configured
|
|
181
|
+
break
|
|
182
|
+
case .invalidQuestion:
|
|
183
|
+
// Question is malformed
|
|
184
|
+
break
|
|
185
|
+
case .notAvailable:
|
|
186
|
+
// PermissionKit not available on this device
|
|
187
|
+
break
|
|
188
|
+
case .systemError(let underlying):
|
|
189
|
+
print("System error: \(underlying)")
|
|
190
|
+
case .unknown:
|
|
191
|
+
break
|
|
192
|
+
@unknown default:
|
|
193
|
+
break
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## SwiftUI Integration with PermissionButton
|
|
200
|
+
|
|
201
|
+
`PermissionButton` is a SwiftUI view that triggers the permission flow
|
|
202
|
+
when tapped.
|
|
203
|
+
|
|
204
|
+
```swift
|
|
205
|
+
import SwiftUI
|
|
206
|
+
import PermissionKit
|
|
207
|
+
|
|
208
|
+
struct ContactPermissionView: View {
|
|
209
|
+
let handle = CommunicationHandle(value: "+1234567890", kind: .phoneNumber)
|
|
210
|
+
|
|
211
|
+
var body: some View {
|
|
212
|
+
let question = PermissionQuestion<CommunicationTopic>(handle: handle)
|
|
213
|
+
|
|
214
|
+
PermissionButton(question: question) {
|
|
215
|
+
Label("Ask to Message", systemImage: "message")
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### PermissionButton with Custom Topic
|
|
222
|
+
|
|
223
|
+
```swift
|
|
224
|
+
struct CustomPermissionView: View {
|
|
225
|
+
var body: some View {
|
|
226
|
+
let personInfo = CommunicationTopic.PersonInformation(
|
|
227
|
+
handle: CommunicationHandle(value: "user456", kind: .custom),
|
|
228
|
+
nameComponents: nil,
|
|
229
|
+
avatarImage: nil
|
|
230
|
+
)
|
|
231
|
+
let topic = CommunicationTopic(
|
|
232
|
+
personInformation: [personInfo],
|
|
233
|
+
actions: [.follow]
|
|
234
|
+
)
|
|
235
|
+
let question = PermissionQuestion<CommunicationTopic>(
|
|
236
|
+
communicationTopic: topic
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
PermissionButton(question: question) {
|
|
240
|
+
Text("Ask to Follow")
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## Handling Responses
|
|
247
|
+
|
|
248
|
+
Listen for permission responses asynchronously.
|
|
249
|
+
|
|
250
|
+
```swift
|
|
251
|
+
func observeResponses() async {
|
|
252
|
+
let responses = AskCenter.shared.responses(for: CommunicationTopic.self)
|
|
253
|
+
|
|
254
|
+
for await response in responses {
|
|
255
|
+
let choice = response.choice
|
|
256
|
+
let question = response.question
|
|
257
|
+
|
|
258
|
+
switch choice.answer {
|
|
259
|
+
case .approval:
|
|
260
|
+
// Parent approved -- enable communication
|
|
261
|
+
print("Approved for topic: \(question.topic)")
|
|
262
|
+
case .denial:
|
|
263
|
+
// Parent denied -- keep restriction
|
|
264
|
+
print("Denied")
|
|
265
|
+
@unknown default:
|
|
266
|
+
break
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### PermissionChoice Properties
|
|
273
|
+
|
|
274
|
+
```swift
|
|
275
|
+
let choice: PermissionChoice = response.choice
|
|
276
|
+
print("Answer: \(choice.answer)") // .approval or .denial
|
|
277
|
+
print("Choice ID: \(choice.id)")
|
|
278
|
+
print("Title: \(choice.title)")
|
|
279
|
+
|
|
280
|
+
// Convenience statics
|
|
281
|
+
let approved = PermissionChoice.approve
|
|
282
|
+
let declined = PermissionChoice.decline
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
## Significant App Update Topic
|
|
286
|
+
|
|
287
|
+
Request permission for significant app updates that require parental approval.
|
|
288
|
+
|
|
289
|
+
```swift
|
|
290
|
+
let updateTopic = SignificantAppUpdateTopic(
|
|
291
|
+
description: "This update adds multiplayer chat features"
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
let question = PermissionQuestion<SignificantAppUpdateTopic>(
|
|
295
|
+
significantAppUpdateTopic: updateTopic
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
// Present the question
|
|
299
|
+
try await AskCenter.shared.ask(question, in: viewController)
|
|
300
|
+
|
|
301
|
+
// Listen for responses
|
|
302
|
+
for await response in AskCenter.shared.responses(for: SignificantAppUpdateTopic.self) {
|
|
303
|
+
switch response.choice.answer {
|
|
304
|
+
case .approval:
|
|
305
|
+
// Proceed with update
|
|
306
|
+
break
|
|
307
|
+
case .denial:
|
|
308
|
+
// Skip update
|
|
309
|
+
break
|
|
310
|
+
@unknown default:
|
|
311
|
+
break
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## Common Mistakes
|
|
317
|
+
|
|
318
|
+
### DON'T: Skip checking if communication limits are enabled
|
|
319
|
+
|
|
320
|
+
If communication limits are not enabled, calling `ask` throws
|
|
321
|
+
`.communicationLimitsNotEnabled`. Check first or handle the error.
|
|
322
|
+
|
|
323
|
+
```swift
|
|
324
|
+
// WRONG: Assuming limits are always active
|
|
325
|
+
try await AskCenter.shared.ask(question, in: viewController)
|
|
326
|
+
|
|
327
|
+
// CORRECT: Handle the case where limits are not enabled
|
|
328
|
+
do {
|
|
329
|
+
try await AskCenter.shared.ask(question, in: viewController)
|
|
330
|
+
} catch AskError.communicationLimitsNotEnabled {
|
|
331
|
+
// Communication limits not active -- allow communication directly
|
|
332
|
+
allowCommunication()
|
|
333
|
+
} catch {
|
|
334
|
+
handleError(error)
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### DON'T: Ignore AskError cases
|
|
339
|
+
|
|
340
|
+
Each error case requires different handling.
|
|
341
|
+
|
|
342
|
+
```swift
|
|
343
|
+
// WRONG: Catch-all with no user feedback
|
|
344
|
+
do {
|
|
345
|
+
try await AskCenter.shared.ask(question, in: viewController)
|
|
346
|
+
} catch {
|
|
347
|
+
print(error)
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// CORRECT: Handle each case
|
|
351
|
+
do {
|
|
352
|
+
try await AskCenter.shared.ask(question, in: viewController)
|
|
353
|
+
} catch let error as AskError {
|
|
354
|
+
switch error {
|
|
355
|
+
case .communicationLimitsNotEnabled:
|
|
356
|
+
allowCommunication()
|
|
357
|
+
case .contactSyncNotSetup:
|
|
358
|
+
showContactSyncPrompt()
|
|
359
|
+
case .invalidQuestion:
|
|
360
|
+
showInvalidQuestionAlert()
|
|
361
|
+
case .notAvailable:
|
|
362
|
+
showUnavailableMessage()
|
|
363
|
+
case .systemError(let underlying):
|
|
364
|
+
showSystemError(underlying)
|
|
365
|
+
case .unknown:
|
|
366
|
+
showGenericError()
|
|
367
|
+
@unknown default:
|
|
368
|
+
break
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### DON'T: Create questions with empty handles
|
|
374
|
+
|
|
375
|
+
A question with no handles or person information is invalid.
|
|
376
|
+
|
|
377
|
+
```swift
|
|
378
|
+
// WRONG: Empty handles array
|
|
379
|
+
let question = PermissionQuestion<CommunicationTopic>(handles: []) // Invalid
|
|
380
|
+
|
|
381
|
+
// CORRECT: Provide at least one handle
|
|
382
|
+
let handle = CommunicationHandle(value: "+1234567890", kind: .phoneNumber)
|
|
383
|
+
let question = PermissionQuestion<CommunicationTopic>(handle: handle)
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### DON'T: Forget to observe responses
|
|
387
|
+
|
|
388
|
+
Presenting a question without listening for the response means you never
|
|
389
|
+
know if the parent approved.
|
|
390
|
+
|
|
391
|
+
```swift
|
|
392
|
+
// WRONG: Fire and forget
|
|
393
|
+
try await AskCenter.shared.ask(question, in: viewController)
|
|
394
|
+
|
|
395
|
+
// CORRECT: Observe responses
|
|
396
|
+
Task {
|
|
397
|
+
for await response in AskCenter.shared.responses(for: CommunicationTopic.self) {
|
|
398
|
+
handleResponse(response)
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
try await AskCenter.shared.ask(question, in: viewController)
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### DON'T: Use deprecated CommunicationLimitsButton
|
|
405
|
+
|
|
406
|
+
Use `PermissionButton` instead of the deprecated `CommunicationLimitsButton`.
|
|
407
|
+
|
|
408
|
+
```swift
|
|
409
|
+
// WRONG: Deprecated
|
|
410
|
+
CommunicationLimitsButton(question: question) {
|
|
411
|
+
Text("Ask Permission")
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// CORRECT: Use PermissionButton
|
|
415
|
+
PermissionButton(question: question) {
|
|
416
|
+
Text("Ask Permission")
|
|
417
|
+
}
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
## Review Checklist
|
|
421
|
+
|
|
422
|
+
- [ ] `AskError.communicationLimitsNotEnabled` handled to allow fallback
|
|
423
|
+
- [ ] `AskError` cases handled individually with appropriate user feedback
|
|
424
|
+
- [ ] `CommunicationHandle` created with correct `Kind` (phone, email, custom)
|
|
425
|
+
- [ ] `PermissionQuestion` includes at least one handle or person information
|
|
426
|
+
- [ ] `AskCenter.shared.responses(for:)` observed to receive parent decisions
|
|
427
|
+
- [ ] `PermissionButton` used instead of deprecated `CommunicationLimitsButton`
|
|
428
|
+
- [ ] Person information includes name components for a clear permission prompt
|
|
429
|
+
- [ ] Communication actions match the app's actual communication capabilities
|
|
430
|
+
- [ ] Response handling updates UI on the main actor
|
|
431
|
+
- [ ] Error states provide clear guidance to the user
|
|
432
|
+
|
|
433
|
+
## References
|
|
434
|
+
|
|
435
|
+
- Extended patterns (response handling, multi-topic, UIKit): `references/permissionkit-patterns.md`
|
|
436
|
+
- [PermissionKit framework](https://sosumi.ai/documentation/permissionkit)
|
|
437
|
+
- [AskCenter](https://sosumi.ai/documentation/permissionkit/askcenter)
|
|
438
|
+
- [PermissionQuestion](https://sosumi.ai/documentation/permissionkit/permissionquestion)
|
|
439
|
+
- [PermissionButton](https://sosumi.ai/documentation/permissionkit/permissionbutton)
|
|
440
|
+
- [PermissionResponse](https://sosumi.ai/documentation/permissionkit/permissionresponse)
|
|
441
|
+
- [CommunicationTopic](https://sosumi.ai/documentation/permissionkit/communicationtopic)
|
|
442
|
+
- [CommunicationHandle](https://sosumi.ai/documentation/permissionkit/communicationhandle)
|
|
443
|
+
- [CommunicationLimits](https://sosumi.ai/documentation/permissionkit/communicationlimits)
|
|
444
|
+
- [SignificantAppUpdateTopic](https://sosumi.ai/documentation/permissionkit/significantappupdatetopic)
|
|
445
|
+
- [AskError](https://sosumi.ai/documentation/permissionkit/askerror)
|
|
446
|
+
- [Creating a communication experience](https://sosumi.ai/documentation/permissionkit/creating-a-communication-experience)
|