@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,334 +1,334 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: swiftdata
|
|
3
|
-
description: "Implement, review, or improve data persistence using SwiftData. Use when defining @Model classes with @Attribute, @Relationship, @Transient, @Unique, or @Index; when querying with @Query, #Predicate, FetchDescriptor, or SortDescriptor; when configuring ModelContainer and ModelContext for SwiftUI or background work with @ModelActor; when planning schema migrations with VersionedSchema and SchemaMigrationPlan; when setting up CloudKit sync with ModelConfiguration; or when coexisting with or migrating from Core Data."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# SwiftData
|
|
7
|
-
|
|
8
|
-
Persist, query, and manage structured data in iOS 26+ apps using SwiftData
|
|
9
|
-
with Swift 6.2.
|
|
10
|
-
|
|
11
|
-
## Contents
|
|
12
|
-
|
|
13
|
-
- [Model Definition](#model-definition)
|
|
14
|
-
- [ModelContainer Setup](#modelcontainer-setup)
|
|
15
|
-
- [CRUD Operations](#crud-operations)
|
|
16
|
-
- [@Query in SwiftUI](#query-in-swiftui)
|
|
17
|
-
- [#Predicate](#predicate)
|
|
18
|
-
- [FetchDescriptor](#fetchdescriptor)
|
|
19
|
-
- [Schema Versioning and Migration](#schema-versioning-and-migration)
|
|
20
|
-
- [Concurrency (@ModelActor)](#concurrency-modelactor)
|
|
21
|
-
- [SwiftUI Integration](#swiftui-integration)
|
|
22
|
-
- [Common Mistakes](#common-mistakes)
|
|
23
|
-
- [Review Checklist](#review-checklist)
|
|
24
|
-
- [References](#references)
|
|
25
|
-
|
|
26
|
-
## Model Definition
|
|
27
|
-
|
|
28
|
-
Apply `@Model` to a **class** (not struct). Generates `PersistentModel`, `Observable`, `Sendable`.
|
|
29
|
-
|
|
30
|
-
```swift
|
|
31
|
-
@Model
|
|
32
|
-
class Trip {
|
|
33
|
-
var name: String
|
|
34
|
-
var destination: String
|
|
35
|
-
var startDate: Date
|
|
36
|
-
var endDate: Date
|
|
37
|
-
var isFavorite: Bool = false
|
|
38
|
-
@Attribute(.externalStorage) var imageData: Data?
|
|
39
|
-
@Relationship(deleteRule: .cascade, inverse: \LivingAccommodation.trip)
|
|
40
|
-
var accommodation: LivingAccommodation?
|
|
41
|
-
@Transient var isSelected: Bool = false // Always provide default
|
|
42
|
-
|
|
43
|
-
init(name: String, destination: String, startDate: Date, endDate: Date) {
|
|
44
|
-
self.name = name; self.destination = destination
|
|
45
|
-
self.startDate = startDate; self.endDate = endDate
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
**@Attribute options**: `.externalStorage`, `.unique`, `.spotlight`, `.allowsCloudEncryption`, `.preserveValueOnDeletion` (iOS 18+), `.ephemeral`, `.transformable(by:)`. Rename: `@Attribute(originalName: "old_name")`.
|
|
51
|
-
|
|
52
|
-
**@Relationship**: `deleteRule:` `.cascade`/`.nullify`(default)/`.deny`/`.noAction`. Specify `inverse:` for reliable behavior. Unidirectional (iOS 18+): `inverse: nil`.
|
|
53
|
-
|
|
54
|
-
**#Unique (iOS 18+)**: `#Unique<Person>([\.firstName, \.lastName])` -- compound uniqueness.
|
|
55
|
-
|
|
56
|
-
**Inheritance (iOS 26+)**: `@Model class BusinessTrip: Trip { var company: String }`.
|
|
57
|
-
|
|
58
|
-
Supported types: `Bool`, `Int`/`UInt` variants, `Float`, `Double`, `String`, `Date`, `Data`, `URL`, `UUID`, `Decimal`, `Array`, `Dictionary`, `Set`, `Codable` enums, `Codable` structs (composite, iOS 18+), relationships to `@Model` classes.
|
|
59
|
-
|
|
60
|
-
## ModelContainer Setup
|
|
61
|
-
|
|
62
|
-
```swift
|
|
63
|
-
// Basic
|
|
64
|
-
let container = try ModelContainer(for: Trip.self, LivingAccommodation.self)
|
|
65
|
-
|
|
66
|
-
// Configured
|
|
67
|
-
let config = ModelConfiguration("Store", isStoredInMemoryOnly: false,
|
|
68
|
-
groupContainer: .identifier("group.com.example.app"),
|
|
69
|
-
cloudKitDatabase: .private("iCloud.com.example.app"))
|
|
70
|
-
let container = try ModelContainer(for: Trip.self, configurations: config)
|
|
71
|
-
|
|
72
|
-
// With migration plan
|
|
73
|
-
let container = try ModelContainer(for: SchemaV2.Trip.self,
|
|
74
|
-
migrationPlan: TripMigrationPlan.self)
|
|
75
|
-
|
|
76
|
-
// In-memory (previews/tests)
|
|
77
|
-
let container = try ModelContainer(for: Trip.self,
|
|
78
|
-
configurations: ModelConfiguration(isStoredInMemoryOnly: true))
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
## CRUD Operations
|
|
82
|
-
|
|
83
|
-
```swift
|
|
84
|
-
// CREATE
|
|
85
|
-
let trip = Trip(name: "Summer", destination: "Paris", startDate: .now, endDate: .now + 86400*7)
|
|
86
|
-
modelContext.insert(trip)
|
|
87
|
-
try modelContext.save() // or rely on autosave
|
|
88
|
-
|
|
89
|
-
// READ
|
|
90
|
-
let trips = try modelContext.fetch(FetchDescriptor<Trip>(
|
|
91
|
-
predicate: #Predicate { $0.destination == "Paris" },
|
|
92
|
-
sortBy: [SortDescriptor(\.startDate)]))
|
|
93
|
-
|
|
94
|
-
// UPDATE -- modify properties directly; autosave handles persistence
|
|
95
|
-
trip.destination = "Rome"
|
|
96
|
-
|
|
97
|
-
// DELETE
|
|
98
|
-
modelContext.delete(trip)
|
|
99
|
-
try modelContext.delete(model: Trip.self, where: #Predicate { $0.isFavorite == false })
|
|
100
|
-
|
|
101
|
-
// TRANSACTION (atomic)
|
|
102
|
-
try modelContext.transaction {
|
|
103
|
-
modelContext.insert(trip); trip.isFavorite = true
|
|
104
|
-
}
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## @Query in SwiftUI
|
|
108
|
-
|
|
109
|
-
```swift
|
|
110
|
-
struct TripListView: View {
|
|
111
|
-
@Query(filter: #Predicate<Trip> { $0.isFavorite == true },
|
|
112
|
-
sort: \.startDate, order: .reverse)
|
|
113
|
-
private var favorites: [Trip]
|
|
114
|
-
|
|
115
|
-
var body: some View { List(favorites) { trip in Text(trip.name) } }
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Dynamic query via init
|
|
119
|
-
struct SearchView: View {
|
|
120
|
-
@Query private var trips: [Trip]
|
|
121
|
-
init(search: String) {
|
|
122
|
-
_trips = Query(filter: #Predicate<Trip> { trip in
|
|
123
|
-
search.isEmpty || trip.name.localizedStandardContains(search)
|
|
124
|
-
}, sort: [SortDescriptor(\.name)])
|
|
125
|
-
}
|
|
126
|
-
var body: some View { List(trips) { trip in Text(trip.name) } }
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// FetchDescriptor query
|
|
130
|
-
struct RecentView: View {
|
|
131
|
-
static var desc: FetchDescriptor<Trip> {
|
|
132
|
-
var d = FetchDescriptor<Trip>(sortBy: [SortDescriptor(\.startDate)])
|
|
133
|
-
d.fetchLimit = 5; return d
|
|
134
|
-
}
|
|
135
|
-
@Query(RecentView.desc) private var recent: [Trip]
|
|
136
|
-
var body: some View { List(recent) { trip in Text(trip.name) } }
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
## #Predicate
|
|
141
|
-
|
|
142
|
-
```swift
|
|
143
|
-
#Predicate<Trip> { $0.destination.localizedStandardContains("paris") } // String
|
|
144
|
-
#Predicate<Trip> { $0.startDate > Date.now } // Date
|
|
145
|
-
#Predicate<Trip> { $0.isFavorite && $0.destination != "Unknown" } // Compound
|
|
146
|
-
#Predicate<Trip> { $0.accommodation?.name != nil } // Optional
|
|
147
|
-
#Predicate<Trip> { $0.tags.contains { $0.name == "adventure" } } // Collection
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
Supported: `==`, `!=`, `<`, `<=`, `>`, `>=`, `&&`, `||`, `!`, `contains()`, `allSatisfy()`, `filter()`, `starts(with:)`, `localizedStandardContains()`, `caseInsensitiveCompare()`, arithmetic, ternary, optional chaining, nil coalescing, type casting. **Not supported**: flow control, nested declarations, arbitrary method calls.
|
|
151
|
-
|
|
152
|
-
## FetchDescriptor
|
|
153
|
-
|
|
154
|
-
```swift
|
|
155
|
-
var d = FetchDescriptor<Trip>(predicate: ..., sortBy: [...])
|
|
156
|
-
d.fetchLimit = 20; d.fetchOffset = 0
|
|
157
|
-
d.includePendingChanges = true
|
|
158
|
-
d.propertiesToFetch = [\.name, \.startDate]
|
|
159
|
-
d.relationshipKeyPathsForPrefetching = [\.accommodation]
|
|
160
|
-
let trips = try modelContext.fetch(d)
|
|
161
|
-
let count = try modelContext.fetchCount(d)
|
|
162
|
-
let ids = try modelContext.fetchIdentifiers(d)
|
|
163
|
-
try modelContext.enumerate(d, batchSize: 1000) { trip in trip.isProcessed = true }
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
## Schema Versioning and Migration
|
|
167
|
-
|
|
168
|
-
```swift
|
|
169
|
-
enum SchemaV1: VersionedSchema {
|
|
170
|
-
static var versionIdentifier = Schema.Version(1, 0, 0)
|
|
171
|
-
static var models: [any PersistentModel.Type] { [Trip.self] }
|
|
172
|
-
@Model class Trip { var name: String; init(name: String) { self.name = name } }
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
enum SchemaV2: VersionedSchema {
|
|
176
|
-
static var versionIdentifier = Schema.Version(2, 0, 0)
|
|
177
|
-
static var models: [any PersistentModel.Type] { [Trip.self] }
|
|
178
|
-
@Model class Trip {
|
|
179
|
-
var name: String; var startDate: Date? // New property
|
|
180
|
-
init(name: String) { self.name = name }
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
enum TripMigrationPlan: SchemaMigrationPlan {
|
|
185
|
-
static var schemas: [any VersionedSchema.Type] { [SchemaV1.self, SchemaV2.self] }
|
|
186
|
-
static var stages: [MigrationStage] { [migrateV1toV2] }
|
|
187
|
-
static let migrateV1toV2 = MigrationStage.lightweight(
|
|
188
|
-
fromVersion: SchemaV1.self, toVersion: SchemaV2.self)
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// Custom migration for data transformation
|
|
192
|
-
static let migrateV2toV3 = MigrationStage.custom(
|
|
193
|
-
fromVersion: SchemaV2.self, toVersion: SchemaV3.self,
|
|
194
|
-
willMigrate: nil,
|
|
195
|
-
didMigrate: { context in
|
|
196
|
-
let trips = try context.fetch(FetchDescriptor<SchemaV3.Trip>())
|
|
197
|
-
for trip in trips { trip.displayName = trip.name.capitalized }
|
|
198
|
-
try context.save()
|
|
199
|
-
})
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
Lightweight handles: adding optional/defaulted properties, renaming (`originalName`), removing properties, adding model types.
|
|
203
|
-
|
|
204
|
-
## Concurrency (@ModelActor)
|
|
205
|
-
|
|
206
|
-
```swift
|
|
207
|
-
@ModelActor
|
|
208
|
-
actor DataHandler {
|
|
209
|
-
func importTrips(_ records: [TripRecord]) throws {
|
|
210
|
-
for r in records {
|
|
211
|
-
modelContext.insert(Trip(name: r.name, destination: r.dest,
|
|
212
|
-
startDate: r.start, endDate: r.end))
|
|
213
|
-
}
|
|
214
|
-
try modelContext.save() // Always save explicitly in @ModelActor
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
func process(tripID: PersistentIdentifier) throws {
|
|
218
|
-
guard let trip = self[tripID, as: Trip.self] else { return }
|
|
219
|
-
trip.isProcessed = true; try modelContext.save()
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
let handler = DataHandler(modelContainer: container)
|
|
224
|
-
try await handler.importTrips(records)
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
**Rules**: `ModelContainer` is `Sendable`. `ModelContext` is NOT -- use on its creating actor. Pass `PersistentIdentifier` (Sendable) across boundaries. Never pass `@Model` objects across actors.
|
|
228
|
-
|
|
229
|
-
## SwiftUI Integration
|
|
230
|
-
|
|
231
|
-
```swift
|
|
232
|
-
@main
|
|
233
|
-
struct MyApp: App {
|
|
234
|
-
var body: some Scene {
|
|
235
|
-
WindowGroup { ContentView() }
|
|
236
|
-
.modelContainer(for: [Trip.self, LivingAccommodation.self])
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
struct DetailView: View {
|
|
241
|
-
@Environment(\.modelContext) private var modelContext
|
|
242
|
-
let trip: Trip
|
|
243
|
-
var body: some View {
|
|
244
|
-
Text(trip.name)
|
|
245
|
-
Button("Delete") { modelContext.delete(trip) }
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
#Preview {
|
|
250
|
-
let config = ModelConfiguration(isStoredInMemoryOnly: true)
|
|
251
|
-
let container = try! ModelContainer(for: Trip.self, configurations: config)
|
|
252
|
-
container.mainContext.insert(Trip(name: "Preview", destination: "London",
|
|
253
|
-
startDate: .now, endDate: .now + 86400))
|
|
254
|
-
return TripListView().modelContainer(container)
|
|
255
|
-
}
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
## Common Mistakes
|
|
259
|
-
|
|
260
|
-
**1. @Model on struct** -- Use class. `@Model` requires reference semantics.
|
|
261
|
-
|
|
262
|
-
**2. @Transient without default** -- Always provide default: `@Transient var x: Bool = false`.
|
|
263
|
-
|
|
264
|
-
**3. Missing .modelContainer** -- @Query returns empty without a container on the view hierarchy.
|
|
265
|
-
|
|
266
|
-
**4. Passing model objects across actors:**
|
|
267
|
-
```swift
|
|
268
|
-
// WRONG: await handler.process(trip: trip)
|
|
269
|
-
// CORRECT: await handler.process(tripID: trip.persistentModelID)
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
**5. ModelContext on wrong actor:**
|
|
273
|
-
```swift
|
|
274
|
-
// WRONG: Task.detached { context.fetch(...) }
|
|
275
|
-
// CORRECT: Use @ModelActor for background work
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
**6. Unsupported #Predicate expressions:**
|
|
279
|
-
```swift
|
|
280
|
-
// WRONG: #Predicate<Trip> { $0.name.uppercased() == "PARIS" }
|
|
281
|
-
// CORRECT: #Predicate<Trip> { $0.name.localizedStandardContains("paris") }
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
**7. Flow control in #Predicate:**
|
|
285
|
-
```swift
|
|
286
|
-
// WRONG: #Predicate<Trip> { for tag in $0.tags { ... } }
|
|
287
|
-
// CORRECT: #Predicate<Trip> { $0.tags.contains { $0.name == "x" } }
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
**8. No save in @ModelActor** -- Always call `try modelContext.save()` explicitly.
|
|
291
|
-
|
|
292
|
-
**9. ObservableObject with @Model** -- Never use `ObservableObject`/`@Published`. `@Model` generates `Observable`. Use `@Query` in views.
|
|
293
|
-
|
|
294
|
-
**10. Non-optional relationship without default:**
|
|
295
|
-
```swift
|
|
296
|
-
// WRONG: var accommodation: LivingAccommodation // crashes on reconstitution
|
|
297
|
-
// CORRECT: var accommodation: LivingAccommodation?
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
**11. Cascade without inverse** -- Specify `inverse:` for reliable cascade delete behavior.
|
|
301
|
-
|
|
302
|
-
**12. DispatchQueue for background data work:**
|
|
303
|
-
```swift
|
|
304
|
-
// WRONG: DispatchQueue.global().async { ModelContext(container).fetch(...) }
|
|
305
|
-
// CORRECT: @ModelActor actor Handler { func fetch() throws { ... } }
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
## Review Checklist
|
|
309
|
-
|
|
310
|
-
- [ ] Every `@Model` is a class with a designated initializer
|
|
311
|
-
- [ ] All `@Transient` properties have default values
|
|
312
|
-
- [ ] Relationships specify `deleteRule` and `inverse`
|
|
313
|
-
- [ ] `.modelContainer` attached at scene/root view level
|
|
314
|
-
- [ ] `@Query` used for reactive data display in SwiftUI
|
|
315
|
-
- [ ] `#Predicate` uses only supported operators
|
|
316
|
-
- [ ] Background work uses `@ModelActor`
|
|
317
|
-
- [ ] `PersistentIdentifier` used across actor boundaries
|
|
318
|
-
- [ ] Schema changes have `VersionedSchema` + `SchemaMigrationPlan`
|
|
319
|
-
- [ ] Large data uses `@Attribute(.externalStorage)`
|
|
320
|
-
- [ ] CloudKit models use optionals and avoid unique constraints
|
|
321
|
-
- [ ] Explicit `save()` in `@ModelActor` methods
|
|
322
|
-
- [ ] Previews use `ModelConfiguration(isStoredInMemoryOnly: true)`
|
|
323
|
-
- [ ] `@Model` classes accessed from SwiftUI views are on `@MainActor` via `@ModelActor` or MainActor isolation
|
|
324
|
-
|
|
325
|
-
## References
|
|
326
|
-
|
|
327
|
-
- See `references/swiftdata-advanced.md` for custom data stores, history
|
|
328
|
-
tracking, CloudKit, Core Data coexistence, composite attributes,
|
|
329
|
-
model inheritance, undo/redo, and performance patterns.
|
|
330
|
-
- See `references/swiftdata-queries.md` for @Query variants, FetchDescriptor
|
|
331
|
-
deep dive, sectioned queries, dynamic queries, and background fetch patterns.
|
|
332
|
-
- See `references/core-data-coexistence.md` for standalone Core Data patterns
|
|
333
|
-
and Core Data to SwiftData migration strategies.
|
|
334
|
-
|
|
1
|
+
---
|
|
2
|
+
name: swiftdata
|
|
3
|
+
description: "Implement, review, or improve data persistence using SwiftData. Use when defining @Model classes with @Attribute, @Relationship, @Transient, @Unique, or @Index; when querying with @Query, #Predicate, FetchDescriptor, or SortDescriptor; when configuring ModelContainer and ModelContext for SwiftUI or background work with @ModelActor; when planning schema migrations with VersionedSchema and SchemaMigrationPlan; when setting up CloudKit sync with ModelConfiguration; or when coexisting with or migrating from Core Data."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SwiftData
|
|
7
|
+
|
|
8
|
+
Persist, query, and manage structured data in iOS 26+ apps using SwiftData
|
|
9
|
+
with Swift 6.2.
|
|
10
|
+
|
|
11
|
+
## Contents
|
|
12
|
+
|
|
13
|
+
- [Model Definition](#model-definition)
|
|
14
|
+
- [ModelContainer Setup](#modelcontainer-setup)
|
|
15
|
+
- [CRUD Operations](#crud-operations)
|
|
16
|
+
- [@Query in SwiftUI](#query-in-swiftui)
|
|
17
|
+
- [#Predicate](#predicate)
|
|
18
|
+
- [FetchDescriptor](#fetchdescriptor)
|
|
19
|
+
- [Schema Versioning and Migration](#schema-versioning-and-migration)
|
|
20
|
+
- [Concurrency (@ModelActor)](#concurrency-modelactor)
|
|
21
|
+
- [SwiftUI Integration](#swiftui-integration)
|
|
22
|
+
- [Common Mistakes](#common-mistakes)
|
|
23
|
+
- [Review Checklist](#review-checklist)
|
|
24
|
+
- [References](#references)
|
|
25
|
+
|
|
26
|
+
## Model Definition
|
|
27
|
+
|
|
28
|
+
Apply `@Model` to a **class** (not struct). Generates `PersistentModel`, `Observable`, `Sendable`.
|
|
29
|
+
|
|
30
|
+
```swift
|
|
31
|
+
@Model
|
|
32
|
+
class Trip {
|
|
33
|
+
var name: String
|
|
34
|
+
var destination: String
|
|
35
|
+
var startDate: Date
|
|
36
|
+
var endDate: Date
|
|
37
|
+
var isFavorite: Bool = false
|
|
38
|
+
@Attribute(.externalStorage) var imageData: Data?
|
|
39
|
+
@Relationship(deleteRule: .cascade, inverse: \LivingAccommodation.trip)
|
|
40
|
+
var accommodation: LivingAccommodation?
|
|
41
|
+
@Transient var isSelected: Bool = false // Always provide default
|
|
42
|
+
|
|
43
|
+
init(name: String, destination: String, startDate: Date, endDate: Date) {
|
|
44
|
+
self.name = name; self.destination = destination
|
|
45
|
+
self.startDate = startDate; self.endDate = endDate
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**@Attribute options**: `.externalStorage`, `.unique`, `.spotlight`, `.allowsCloudEncryption`, `.preserveValueOnDeletion` (iOS 18+), `.ephemeral`, `.transformable(by:)`. Rename: `@Attribute(originalName: "old_name")`.
|
|
51
|
+
|
|
52
|
+
**@Relationship**: `deleteRule:` `.cascade`/`.nullify`(default)/`.deny`/`.noAction`. Specify `inverse:` for reliable behavior. Unidirectional (iOS 18+): `inverse: nil`.
|
|
53
|
+
|
|
54
|
+
**#Unique (iOS 18+)**: `#Unique<Person>([\.firstName, \.lastName])` -- compound uniqueness.
|
|
55
|
+
|
|
56
|
+
**Inheritance (iOS 26+)**: `@Model class BusinessTrip: Trip { var company: String }`.
|
|
57
|
+
|
|
58
|
+
Supported types: `Bool`, `Int`/`UInt` variants, `Float`, `Double`, `String`, `Date`, `Data`, `URL`, `UUID`, `Decimal`, `Array`, `Dictionary`, `Set`, `Codable` enums, `Codable` structs (composite, iOS 18+), relationships to `@Model` classes.
|
|
59
|
+
|
|
60
|
+
## ModelContainer Setup
|
|
61
|
+
|
|
62
|
+
```swift
|
|
63
|
+
// Basic
|
|
64
|
+
let container = try ModelContainer(for: Trip.self, LivingAccommodation.self)
|
|
65
|
+
|
|
66
|
+
// Configured
|
|
67
|
+
let config = ModelConfiguration("Store", isStoredInMemoryOnly: false,
|
|
68
|
+
groupContainer: .identifier("group.com.example.app"),
|
|
69
|
+
cloudKitDatabase: .private("iCloud.com.example.app"))
|
|
70
|
+
let container = try ModelContainer(for: Trip.self, configurations: config)
|
|
71
|
+
|
|
72
|
+
// With migration plan
|
|
73
|
+
let container = try ModelContainer(for: SchemaV2.Trip.self,
|
|
74
|
+
migrationPlan: TripMigrationPlan.self)
|
|
75
|
+
|
|
76
|
+
// In-memory (previews/tests)
|
|
77
|
+
let container = try ModelContainer(for: Trip.self,
|
|
78
|
+
configurations: ModelConfiguration(isStoredInMemoryOnly: true))
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## CRUD Operations
|
|
82
|
+
|
|
83
|
+
```swift
|
|
84
|
+
// CREATE
|
|
85
|
+
let trip = Trip(name: "Summer", destination: "Paris", startDate: .now, endDate: .now + 86400*7)
|
|
86
|
+
modelContext.insert(trip)
|
|
87
|
+
try modelContext.save() // or rely on autosave
|
|
88
|
+
|
|
89
|
+
// READ
|
|
90
|
+
let trips = try modelContext.fetch(FetchDescriptor<Trip>(
|
|
91
|
+
predicate: #Predicate { $0.destination == "Paris" },
|
|
92
|
+
sortBy: [SortDescriptor(\.startDate)]))
|
|
93
|
+
|
|
94
|
+
// UPDATE -- modify properties directly; autosave handles persistence
|
|
95
|
+
trip.destination = "Rome"
|
|
96
|
+
|
|
97
|
+
// DELETE
|
|
98
|
+
modelContext.delete(trip)
|
|
99
|
+
try modelContext.delete(model: Trip.self, where: #Predicate { $0.isFavorite == false })
|
|
100
|
+
|
|
101
|
+
// TRANSACTION (atomic)
|
|
102
|
+
try modelContext.transaction {
|
|
103
|
+
modelContext.insert(trip); trip.isFavorite = true
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## @Query in SwiftUI
|
|
108
|
+
|
|
109
|
+
```swift
|
|
110
|
+
struct TripListView: View {
|
|
111
|
+
@Query(filter: #Predicate<Trip> { $0.isFavorite == true },
|
|
112
|
+
sort: \.startDate, order: .reverse)
|
|
113
|
+
private var favorites: [Trip]
|
|
114
|
+
|
|
115
|
+
var body: some View { List(favorites) { trip in Text(trip.name) } }
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Dynamic query via init
|
|
119
|
+
struct SearchView: View {
|
|
120
|
+
@Query private var trips: [Trip]
|
|
121
|
+
init(search: String) {
|
|
122
|
+
_trips = Query(filter: #Predicate<Trip> { trip in
|
|
123
|
+
search.isEmpty || trip.name.localizedStandardContains(search)
|
|
124
|
+
}, sort: [SortDescriptor(\.name)])
|
|
125
|
+
}
|
|
126
|
+
var body: some View { List(trips) { trip in Text(trip.name) } }
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// FetchDescriptor query
|
|
130
|
+
struct RecentView: View {
|
|
131
|
+
static var desc: FetchDescriptor<Trip> {
|
|
132
|
+
var d = FetchDescriptor<Trip>(sortBy: [SortDescriptor(\.startDate)])
|
|
133
|
+
d.fetchLimit = 5; return d
|
|
134
|
+
}
|
|
135
|
+
@Query(RecentView.desc) private var recent: [Trip]
|
|
136
|
+
var body: some View { List(recent) { trip in Text(trip.name) } }
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## #Predicate
|
|
141
|
+
|
|
142
|
+
```swift
|
|
143
|
+
#Predicate<Trip> { $0.destination.localizedStandardContains("paris") } // String
|
|
144
|
+
#Predicate<Trip> { $0.startDate > Date.now } // Date
|
|
145
|
+
#Predicate<Trip> { $0.isFavorite && $0.destination != "Unknown" } // Compound
|
|
146
|
+
#Predicate<Trip> { $0.accommodation?.name != nil } // Optional
|
|
147
|
+
#Predicate<Trip> { $0.tags.contains { $0.name == "adventure" } } // Collection
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Supported: `==`, `!=`, `<`, `<=`, `>`, `>=`, `&&`, `||`, `!`, `contains()`, `allSatisfy()`, `filter()`, `starts(with:)`, `localizedStandardContains()`, `caseInsensitiveCompare()`, arithmetic, ternary, optional chaining, nil coalescing, type casting. **Not supported**: flow control, nested declarations, arbitrary method calls.
|
|
151
|
+
|
|
152
|
+
## FetchDescriptor
|
|
153
|
+
|
|
154
|
+
```swift
|
|
155
|
+
var d = FetchDescriptor<Trip>(predicate: ..., sortBy: [...])
|
|
156
|
+
d.fetchLimit = 20; d.fetchOffset = 0
|
|
157
|
+
d.includePendingChanges = true
|
|
158
|
+
d.propertiesToFetch = [\.name, \.startDate]
|
|
159
|
+
d.relationshipKeyPathsForPrefetching = [\.accommodation]
|
|
160
|
+
let trips = try modelContext.fetch(d)
|
|
161
|
+
let count = try modelContext.fetchCount(d)
|
|
162
|
+
let ids = try modelContext.fetchIdentifiers(d)
|
|
163
|
+
try modelContext.enumerate(d, batchSize: 1000) { trip in trip.isProcessed = true }
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Schema Versioning and Migration
|
|
167
|
+
|
|
168
|
+
```swift
|
|
169
|
+
enum SchemaV1: VersionedSchema {
|
|
170
|
+
static var versionIdentifier = Schema.Version(1, 0, 0)
|
|
171
|
+
static var models: [any PersistentModel.Type] { [Trip.self] }
|
|
172
|
+
@Model class Trip { var name: String; init(name: String) { self.name = name } }
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
enum SchemaV2: VersionedSchema {
|
|
176
|
+
static var versionIdentifier = Schema.Version(2, 0, 0)
|
|
177
|
+
static var models: [any PersistentModel.Type] { [Trip.self] }
|
|
178
|
+
@Model class Trip {
|
|
179
|
+
var name: String; var startDate: Date? // New property
|
|
180
|
+
init(name: String) { self.name = name }
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
enum TripMigrationPlan: SchemaMigrationPlan {
|
|
185
|
+
static var schemas: [any VersionedSchema.Type] { [SchemaV1.self, SchemaV2.self] }
|
|
186
|
+
static var stages: [MigrationStage] { [migrateV1toV2] }
|
|
187
|
+
static let migrateV1toV2 = MigrationStage.lightweight(
|
|
188
|
+
fromVersion: SchemaV1.self, toVersion: SchemaV2.self)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Custom migration for data transformation
|
|
192
|
+
static let migrateV2toV3 = MigrationStage.custom(
|
|
193
|
+
fromVersion: SchemaV2.self, toVersion: SchemaV3.self,
|
|
194
|
+
willMigrate: nil,
|
|
195
|
+
didMigrate: { context in
|
|
196
|
+
let trips = try context.fetch(FetchDescriptor<SchemaV3.Trip>())
|
|
197
|
+
for trip in trips { trip.displayName = trip.name.capitalized }
|
|
198
|
+
try context.save()
|
|
199
|
+
})
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Lightweight handles: adding optional/defaulted properties, renaming (`originalName`), removing properties, adding model types.
|
|
203
|
+
|
|
204
|
+
## Concurrency (@ModelActor)
|
|
205
|
+
|
|
206
|
+
```swift
|
|
207
|
+
@ModelActor
|
|
208
|
+
actor DataHandler {
|
|
209
|
+
func importTrips(_ records: [TripRecord]) throws {
|
|
210
|
+
for r in records {
|
|
211
|
+
modelContext.insert(Trip(name: r.name, destination: r.dest,
|
|
212
|
+
startDate: r.start, endDate: r.end))
|
|
213
|
+
}
|
|
214
|
+
try modelContext.save() // Always save explicitly in @ModelActor
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
func process(tripID: PersistentIdentifier) throws {
|
|
218
|
+
guard let trip = self[tripID, as: Trip.self] else { return }
|
|
219
|
+
trip.isProcessed = true; try modelContext.save()
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
let handler = DataHandler(modelContainer: container)
|
|
224
|
+
try await handler.importTrips(records)
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Rules**: `ModelContainer` is `Sendable`. `ModelContext` is NOT -- use on its creating actor. Pass `PersistentIdentifier` (Sendable) across boundaries. Never pass `@Model` objects across actors.
|
|
228
|
+
|
|
229
|
+
## SwiftUI Integration
|
|
230
|
+
|
|
231
|
+
```swift
|
|
232
|
+
@main
|
|
233
|
+
struct MyApp: App {
|
|
234
|
+
var body: some Scene {
|
|
235
|
+
WindowGroup { ContentView() }
|
|
236
|
+
.modelContainer(for: [Trip.self, LivingAccommodation.self])
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
struct DetailView: View {
|
|
241
|
+
@Environment(\.modelContext) private var modelContext
|
|
242
|
+
let trip: Trip
|
|
243
|
+
var body: some View {
|
|
244
|
+
Text(trip.name)
|
|
245
|
+
Button("Delete") { modelContext.delete(trip) }
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
#Preview {
|
|
250
|
+
let config = ModelConfiguration(isStoredInMemoryOnly: true)
|
|
251
|
+
let container = try! ModelContainer(for: Trip.self, configurations: config)
|
|
252
|
+
container.mainContext.insert(Trip(name: "Preview", destination: "London",
|
|
253
|
+
startDate: .now, endDate: .now + 86400))
|
|
254
|
+
return TripListView().modelContainer(container)
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Common Mistakes
|
|
259
|
+
|
|
260
|
+
**1. @Model on struct** -- Use class. `@Model` requires reference semantics.
|
|
261
|
+
|
|
262
|
+
**2. @Transient without default** -- Always provide default: `@Transient var x: Bool = false`.
|
|
263
|
+
|
|
264
|
+
**3. Missing .modelContainer** -- @Query returns empty without a container on the view hierarchy.
|
|
265
|
+
|
|
266
|
+
**4. Passing model objects across actors:**
|
|
267
|
+
```swift
|
|
268
|
+
// WRONG: await handler.process(trip: trip)
|
|
269
|
+
// CORRECT: await handler.process(tripID: trip.persistentModelID)
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**5. ModelContext on wrong actor:**
|
|
273
|
+
```swift
|
|
274
|
+
// WRONG: Task.detached { context.fetch(...) }
|
|
275
|
+
// CORRECT: Use @ModelActor for background work
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
**6. Unsupported #Predicate expressions:**
|
|
279
|
+
```swift
|
|
280
|
+
// WRONG: #Predicate<Trip> { $0.name.uppercased() == "PARIS" }
|
|
281
|
+
// CORRECT: #Predicate<Trip> { $0.name.localizedStandardContains("paris") }
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
**7. Flow control in #Predicate:**
|
|
285
|
+
```swift
|
|
286
|
+
// WRONG: #Predicate<Trip> { for tag in $0.tags { ... } }
|
|
287
|
+
// CORRECT: #Predicate<Trip> { $0.tags.contains { $0.name == "x" } }
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**8. No save in @ModelActor** -- Always call `try modelContext.save()` explicitly.
|
|
291
|
+
|
|
292
|
+
**9. ObservableObject with @Model** -- Never use `ObservableObject`/`@Published`. `@Model` generates `Observable`. Use `@Query` in views.
|
|
293
|
+
|
|
294
|
+
**10. Non-optional relationship without default:**
|
|
295
|
+
```swift
|
|
296
|
+
// WRONG: var accommodation: LivingAccommodation // crashes on reconstitution
|
|
297
|
+
// CORRECT: var accommodation: LivingAccommodation?
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
**11. Cascade without inverse** -- Specify `inverse:` for reliable cascade delete behavior.
|
|
301
|
+
|
|
302
|
+
**12. DispatchQueue for background data work:**
|
|
303
|
+
```swift
|
|
304
|
+
// WRONG: DispatchQueue.global().async { ModelContext(container).fetch(...) }
|
|
305
|
+
// CORRECT: @ModelActor actor Handler { func fetch() throws { ... } }
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## Review Checklist
|
|
309
|
+
|
|
310
|
+
- [ ] Every `@Model` is a class with a designated initializer
|
|
311
|
+
- [ ] All `@Transient` properties have default values
|
|
312
|
+
- [ ] Relationships specify `deleteRule` and `inverse`
|
|
313
|
+
- [ ] `.modelContainer` attached at scene/root view level
|
|
314
|
+
- [ ] `@Query` used for reactive data display in SwiftUI
|
|
315
|
+
- [ ] `#Predicate` uses only supported operators
|
|
316
|
+
- [ ] Background work uses `@ModelActor`
|
|
317
|
+
- [ ] `PersistentIdentifier` used across actor boundaries
|
|
318
|
+
- [ ] Schema changes have `VersionedSchema` + `SchemaMigrationPlan`
|
|
319
|
+
- [ ] Large data uses `@Attribute(.externalStorage)`
|
|
320
|
+
- [ ] CloudKit models use optionals and avoid unique constraints
|
|
321
|
+
- [ ] Explicit `save()` in `@ModelActor` methods
|
|
322
|
+
- [ ] Previews use `ModelConfiguration(isStoredInMemoryOnly: true)`
|
|
323
|
+
- [ ] `@Model` classes accessed from SwiftUI views are on `@MainActor` via `@ModelActor` or MainActor isolation
|
|
324
|
+
|
|
325
|
+
## References
|
|
326
|
+
|
|
327
|
+
- See `references/swiftdata-advanced.md` for custom data stores, history
|
|
328
|
+
tracking, CloudKit, Core Data coexistence, composite attributes,
|
|
329
|
+
model inheritance, undo/redo, and performance patterns.
|
|
330
|
+
- See `references/swiftdata-queries.md` for @Query variants, FetchDescriptor
|
|
331
|
+
deep dive, sectioned queries, dynamic queries, and background fetch patterns.
|
|
332
|
+
- See `references/core-data-coexistence.md` for standalone Core Data patterns
|
|
333
|
+
and Core Data to SwiftData migration strategies.
|
|
334
|
+
|