@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.1
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/CHANGELOG.md +21 -0
- package/LICENSE +0 -10
- package/docs/facts.json +1 -1
- package/manifest.json +285 -285
- package/package.json +3 -3
- package/pipeline/lib/redact.mjs +3 -2
- package/pipeline/scripts/_notices.mjs +1 -1
- package/pipeline/scripts/gen-skills-index.mjs +13 -1
- package/pipeline/scripts/pre-commit-check.sh +4 -0
- package/pipeline/skills/.skill-manifest.json +69 -69
- package/pipeline/skills/shared/README.md +70 -70
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
- package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
- package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
- package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
- package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
- package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +345 -277
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +107 -121
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +145 -165
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +306 -326
- package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +335 -360
- package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
- package/pipeline/skills/shared/external/authentication/SKILL.md +277 -381
- package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +135 -178
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
- package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
- package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
- package/pipeline/skills/shared/external/background-processing/SKILL.md +274 -384
- package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +173 -321
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
- package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +228 -376
- package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
- package/pipeline/skills/shared/external/core-data/SKILL.md +302 -368
- package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
- package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
- package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
- package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
- package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
- package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
- package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
- package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +236 -353
- package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
- package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
- package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
- package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
- package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
- package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
- package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
- package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
- package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +3 -3
- package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +1 -1
- package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +8 -7
- package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +2 -2
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +5 -2
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/_shared.py +100 -0
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +45 -26
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +14 -16
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +12 -5
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +2 -1
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +6 -5
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +44 -18
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +5 -2
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +10 -11
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +4 -33
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +12 -59
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +297 -267
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
- package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
- package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
- package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
- package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
- package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
- package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
- package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
- package/pipeline/skills/shared/external/skill-creator/template.md +7 -1
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
- package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
- package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
- package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
- package/pipeline/skills/shared/external/storekit/references/core-patterns.md +302 -241
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
- package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
- package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
- package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
- package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +304 -351
- package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
- package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
- package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
- package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
- package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
- package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
- package/pipeline/skills/shared/external/swift-security/SKILL.md +183 -162
- package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +411 -476
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +375 -491
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +397 -457
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +191 -175
- package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +81 -84
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +394 -256
- package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
- package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
- package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +201 -168
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +134 -133
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +111 -138
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
- package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
- package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
- package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +160 -315
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +224 -288
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +416 -719
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
|
@@ -1,264 +1,297 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: swiftui-navigation
|
|
3
|
-
description: "
|
|
3
|
+
description: "SwiftUI navigation: NavigationStack typed paths, routers, NavigationSplitView, sheets, TabView and Tab API, universal links, URL schemes, Handoff. Use when implementing or reviewing push or programmatic navigation, multi-column layouts, modal sheets, tab bars or deep linking."
|
|
4
4
|
metadata:
|
|
5
|
-
source:
|
|
5
|
+
source: multi-agent-pipeline
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# SwiftUI Navigation
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Examples target iOS 26 and Swift 6.3. Unless a line says otherwise, each
|
|
11
|
+
pattern also runs on iOS 17.
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
Other skills own the neighbours: app architecture and state management are in
|
|
14
|
+
`swiftui-patterns`, stacks, grids and components in
|
|
15
|
+
`swiftui-layout-components`.
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
- [NavigationSplitView (Multi-Column)](#navigationsplitview-multi-column)
|
|
16
|
-
- [Sheet Presentation](#sheet-presentation)
|
|
17
|
-
- [Tab-Based Navigation](#tab-based-navigation)
|
|
18
|
-
- [Deep Links](#deep-links)
|
|
19
|
-
- [Common Mistakes](#common-mistakes)
|
|
20
|
-
- [Review Checklist](#review-checklist)
|
|
21
|
-
- [References](#references)
|
|
17
|
+
## NavigationStack
|
|
22
18
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
Bind `NavigationStack(path:)` to a `NavigationPath` (or a typed array) in state,
|
|
20
|
+
describe destinations with a `Hashable` enum or value type, and map each type
|
|
21
|
+
once with `.navigationDestination(for:)`.
|
|
26
22
|
|
|
27
23
|
```swift
|
|
28
|
-
struct
|
|
24
|
+
struct TrailListView: View {
|
|
29
25
|
@State private var path = NavigationPath()
|
|
26
|
+
let trails: [Trail]
|
|
30
27
|
|
|
31
28
|
var body: some View {
|
|
32
29
|
NavigationStack(path: $path) {
|
|
33
|
-
List(
|
|
34
|
-
NavigationLink(value:
|
|
35
|
-
|
|
30
|
+
List(trails) { trail in
|
|
31
|
+
NavigationLink(value: trail) {
|
|
32
|
+
TrailRow(trail: trail)
|
|
36
33
|
}
|
|
37
34
|
}
|
|
38
|
-
.navigationDestination(for:
|
|
39
|
-
|
|
35
|
+
.navigationDestination(for: Trail.self) { trail in
|
|
36
|
+
TrailDetailView(trail: trail)
|
|
40
37
|
}
|
|
41
|
-
.navigationTitle("
|
|
38
|
+
.navigationTitle("Trails")
|
|
42
39
|
}
|
|
43
40
|
}
|
|
44
41
|
}
|
|
45
42
|
```
|
|
46
43
|
|
|
47
|
-
|
|
44
|
+
Driving the stack from code:
|
|
48
45
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
path.
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
| Goal | Code |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| Push | `path.append(trail)` |
|
|
49
|
+
| Back one level | `path.removeLast()` |
|
|
50
|
+
| Back to root | `path = NavigationPath()` |
|
|
54
51
|
|
|
55
|
-
|
|
52
|
+
For anything bigger than one screen, move path and sheet state into a router
|
|
53
|
+
object. Give each tab its own router instance and hand it down with
|
|
54
|
+
`.environment()`. Keep the destination switch in one place: a single
|
|
55
|
+
`.navigationDestination(for:)` block or a shared modifier such as
|
|
56
|
+
`withAppRouter()`. The router, per-tab and centralised-mapping patterns are in
|
|
57
|
+
[references/navigationstack.md](references/navigationstack.md).
|
|
56
58
|
|
|
57
|
-
|
|
59
|
+
## NavigationSplitView
|
|
58
60
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
Use `NavigationSplitView` for sidebar-detail layouts on iPad and Mac. Falls back to stack navigation on iPhone.
|
|
61
|
+
`NavigationSplitView` gives a sidebar and detail on iPad and Mac and collapses
|
|
62
|
+
into a push stack on iPhone.
|
|
62
63
|
|
|
63
64
|
```swift
|
|
64
|
-
struct
|
|
65
|
-
@State private var
|
|
65
|
+
struct LibraryView: View {
|
|
66
|
+
@State private var chosen: Album?
|
|
67
|
+
let albums: [Album]
|
|
66
68
|
|
|
67
69
|
var body: some View {
|
|
68
70
|
NavigationSplitView {
|
|
69
|
-
List(
|
|
70
|
-
NavigationLink(value:
|
|
71
|
+
List(albums, selection: $chosen) { album in
|
|
72
|
+
NavigationLink(album.title, value: album)
|
|
71
73
|
}
|
|
72
|
-
.navigationTitle("
|
|
74
|
+
.navigationTitle("Albums")
|
|
73
75
|
} detail: {
|
|
74
|
-
if let
|
|
75
|
-
|
|
76
|
+
if let chosen {
|
|
77
|
+
AlbumDetailView(album: chosen)
|
|
76
78
|
} else {
|
|
77
|
-
ContentUnavailableView("
|
|
79
|
+
ContentUnavailableView("No album selected", systemImage: "sidebar.leading")
|
|
78
80
|
}
|
|
79
81
|
}
|
|
80
82
|
}
|
|
81
83
|
}
|
|
82
84
|
```
|
|
83
85
|
|
|
84
|
-
###
|
|
86
|
+
### A hand-built second column
|
|
85
87
|
|
|
86
|
-
|
|
88
|
+
When the extra column does not follow the selection, for example an activity
|
|
89
|
+
feed that should sit beside whatever the main area shows, build the split
|
|
90
|
+
yourself with an `HStack(spacing: 0)`.
|
|
87
91
|
|
|
88
92
|
```swift
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
93
|
+
struct WorkspaceView: View {
|
|
94
|
+
@Environment(\.horizontalSizeClass) private var sizeClass
|
|
95
|
+
@AppStorage("showsActivityColumn") private var showsActivity = true
|
|
96
|
+
|
|
97
|
+
var body: some View {
|
|
98
|
+
HStack(spacing: 0) {
|
|
99
|
+
MainContentView()
|
|
100
|
+
if sizeClass == .regular && showsActivity {
|
|
101
|
+
Divider().ignoresSafeArea()
|
|
102
|
+
ActivityColumnView()
|
|
103
|
+
.environment(\.isSecondaryColumn, true)
|
|
104
|
+
.frame(maxWidth: 360)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
101
107
|
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
private var shouldShowSecondaryColumn: Bool {
|
|
105
|
-
horizontalSizeClass == .regular
|
|
106
|
-
&& showSecondaryColumn
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
private var primaryColumn: some View {
|
|
110
|
-
TabView { /* tabs */ }
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
private var secondaryColumn: some View {
|
|
114
|
-
NotificationsTab()
|
|
115
|
-
.environment(\.isSecondaryColumn, true)
|
|
116
|
-
.frame(maxWidth: .secondaryColumnWidth)
|
|
117
|
-
}
|
|
118
108
|
}
|
|
119
|
-
```
|
|
120
109
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
## Sheet Presentation
|
|
124
|
-
|
|
125
|
-
Prefer `.sheet(item:)` over `.sheet(isPresented:)` when state represents a selected model. Sheets should own their actions and call `dismiss()` internally.
|
|
126
|
-
|
|
127
|
-
```swift
|
|
128
|
-
@State private var selectedItem: Item?
|
|
129
|
-
|
|
130
|
-
.sheet(item: $selectedItem) { item in
|
|
131
|
-
EditItemSheet(item: item)
|
|
110
|
+
extension EnvironmentValues {
|
|
111
|
+
@Entry var isSecondaryColumn = false
|
|
132
112
|
}
|
|
133
113
|
```
|
|
134
114
|
|
|
135
|
-
|
|
115
|
+
The column only appears in a regular horizontal size class and when the user
|
|
116
|
+
has left the toggle on. Choose the manual layout when you need full control or
|
|
117
|
+
a column the system split view has no slot for; choose `NavigationSplitView`
|
|
118
|
+
when the standard sidebar-content-detail shape fits with small tweaks.
|
|
136
119
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
120
|
+
## Sheets
|
|
121
|
+
|
|
122
|
+
- When a sheet shows a particular model, use `.sheet(item:)`; keep
|
|
123
|
+
`.sheet(isPresented:)` for pure on/off states.
|
|
124
|
+
- A sheet owns its buttons and closes itself with `dismiss()`.
|
|
125
|
+
- `.presentationSizing(_:)` (iOS 18+) sets the size instead of fixed frames.
|
|
143
126
|
|
|
144
|
-
`PresentationSizing`
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
127
|
+
| `PresentationSizing` | Result |
|
|
128
|
+
| --- | --- |
|
|
129
|
+
| `.automatic` | Platform default |
|
|
130
|
+
| `.page` | Roughly paper-sized, for reading material |
|
|
131
|
+
| `.form` | Slightly narrower than `.page`, for data entry |
|
|
132
|
+
| `.fitted` | The content's ideal size |
|
|
149
133
|
|
|
150
|
-
|
|
134
|
+
`.fitted(horizontal:vertical:)` restricts fitting to the axes you pass, and
|
|
135
|
+
`.sticky(horizontal:vertical:)` lets a sheet grow along those axes but never
|
|
136
|
+
shrink back.
|
|
151
137
|
|
|
152
|
-
|
|
138
|
+
To stop a sheet with unsaved edits from being swiped away on iOS, use
|
|
139
|
+
`.interactiveDismissDisabled(hasEdits)` and confirm from your own Close button.
|
|
140
|
+
`.dismissalConfirmationDialog(_:shouldPresent:)` does this on macOS 15+ only;
|
|
141
|
+
the SDK marks it unavailable on iOS.
|
|
153
142
|
|
|
154
|
-
|
|
143
|
+
For larger apps, describe every modal as a case of an `Identifiable` enum held
|
|
144
|
+
on the router, and map the cases to views in one shared modifier. Any child can
|
|
145
|
+
then open a sheet by setting router state, with no bindings passed down. See
|
|
146
|
+
[references/sheets.md](references/sheets.md).
|
|
155
147
|
|
|
156
|
-
##
|
|
148
|
+
## Tabs
|
|
157
149
|
|
|
158
|
-
Use the `Tab`
|
|
150
|
+
Use the `Tab` type with a typed selection, and give every tab its own
|
|
151
|
+
`NavigationStack`.
|
|
159
152
|
|
|
160
153
|
```swift
|
|
161
|
-
|
|
162
|
-
|
|
154
|
+
enum HomeTab: Hashable { case today, explore, compose, profile }
|
|
155
|
+
|
|
156
|
+
struct RootTabs: View {
|
|
157
|
+
@State private var current: HomeTab = .today
|
|
158
|
+
@State private var composing = false
|
|
163
159
|
|
|
164
160
|
var body: some View {
|
|
165
|
-
TabView(selection:
|
|
166
|
-
Tab("
|
|
167
|
-
NavigationStack {
|
|
161
|
+
TabView(selection: Binding(get: { current }, set: select)) {
|
|
162
|
+
Tab("Today", systemImage: "sun.max", value: .today) {
|
|
163
|
+
NavigationStack { TodayView() }
|
|
164
|
+
}
|
|
165
|
+
Tab("Explore", systemImage: "map", value: .explore) {
|
|
166
|
+
NavigationStack { ExploreView() }
|
|
168
167
|
}
|
|
169
|
-
Tab("
|
|
170
|
-
|
|
168
|
+
Tab("New", systemImage: "plus.circle", value: .compose) {
|
|
169
|
+
Color.clear
|
|
171
170
|
}
|
|
172
|
-
Tab("
|
|
171
|
+
Tab("Me", systemImage: "person", value: .profile) {
|
|
173
172
|
NavigationStack { ProfileView() }
|
|
174
173
|
}
|
|
175
174
|
}
|
|
175
|
+
.sheet(isPresented: $composing) { ComposerView() }
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private func select(_ next: HomeTab) {
|
|
179
|
+
if next == .compose {
|
|
180
|
+
composing = true
|
|
181
|
+
} else {
|
|
182
|
+
current = next
|
|
183
|
+
}
|
|
176
184
|
}
|
|
177
185
|
}
|
|
178
186
|
```
|
|
179
187
|
|
|
180
|
-
|
|
188
|
+
The custom binding sends every change through `select`, so a tab like
|
|
189
|
+
"New" can run an action instead of becoming the selected tab.
|
|
190
|
+
|
|
191
|
+
### Tab APIs from iOS 18 and iOS 26
|
|
192
|
+
|
|
193
|
+
From iOS 18 (macOS 15):
|
|
194
|
+
|
|
195
|
+
- `Tab(role: .search)` marks the search tab; the iOS 26 tab bar shows it as a
|
|
196
|
+
search field while that tab is active.
|
|
197
|
+
- `.tabViewSidebarHeader { }` and `.tabViewSidebarFooter { }` customise the
|
|
198
|
+
sidebar on iPadOS and macOS.
|
|
199
|
+
- `TabSection` collects tabs under a sidebar heading; mark it with
|
|
200
|
+
`.tabPlacement(.sidebarOnly)` to keep it out of the compact bar.
|
|
201
|
+
|
|
202
|
+
From iOS 26 only:
|
|
181
203
|
|
|
182
|
-
|
|
204
|
+
- `.tabBarMinimizeBehavior(_:)` with `.onScrollDown`, `.onScrollUp` or `.never`.
|
|
205
|
+
iPhone only.
|
|
206
|
+
- `.tabViewBottomAccessory { }` pins a view just above the tab bar, such as a
|
|
207
|
+
mini player.
|
|
183
208
|
|
|
184
|
-
|
|
185
|
-
- **`.tabBarMinimizeBehavior(_:)`** -- `.onScrollDown`, `.onScrollUp`, `.never` (iPhone only)
|
|
186
|
-
- **`.tabViewSidebarHeader/Footer`** -- customize sidebar sections on iPadOS/macOS
|
|
187
|
-
- **`.tabViewBottomAccessory { }`** -- attach content below the tab bar (e.g., Now Playing bar)
|
|
188
|
-
- **`TabSection`** -- group tabs into sidebar sections with `.tabPlacement(.sidebarOnly)`
|
|
209
|
+
More in [references/tabview.md](references/tabview.md).
|
|
189
210
|
|
|
190
|
-
|
|
211
|
+
## Deep links
|
|
191
212
|
|
|
192
|
-
|
|
213
|
+
### Universal links
|
|
193
214
|
|
|
194
|
-
|
|
215
|
+
A universal link is an ordinary HTTPS URL that opens the app when installed.
|
|
216
|
+
It needs two things:
|
|
195
217
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
2.
|
|
218
|
+
1. An `apple-app-site-association` file served from
|
|
219
|
+
`/.well-known/apple-app-site-association` on the domain.
|
|
220
|
+
2. The Associated Domains entitlement listing `applinks:example.com`.
|
|
199
221
|
|
|
200
|
-
Handle
|
|
222
|
+
Handle both entry points on the root content of the `WindowGroup`:
|
|
201
223
|
|
|
202
224
|
```swift
|
|
203
225
|
@main
|
|
204
|
-
struct
|
|
226
|
+
struct HikerApp: App {
|
|
205
227
|
@State private var router = Router()
|
|
206
228
|
|
|
207
229
|
var body: some Scene {
|
|
208
230
|
WindowGroup {
|
|
209
|
-
|
|
231
|
+
RootTabs()
|
|
210
232
|
.environment(router)
|
|
211
|
-
.onOpenURL {
|
|
233
|
+
.onOpenURL { link in _ = router.handle(url: link) }
|
|
212
234
|
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { activity in
|
|
213
|
-
|
|
214
|
-
|
|
235
|
+
if let link = activity.webpageURL {
|
|
236
|
+
_ = router.handle(url: link)
|
|
237
|
+
}
|
|
215
238
|
}
|
|
216
239
|
}
|
|
217
240
|
}
|
|
218
241
|
}
|
|
219
242
|
```
|
|
220
243
|
|
|
221
|
-
### Custom URL
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
-
|
|
249
|
-
|
|
250
|
-
-
|
|
251
|
-
-
|
|
252
|
-
-
|
|
253
|
-
-
|
|
254
|
-
|
|
255
|
-
|
|
244
|
+
### Custom URL schemes
|
|
245
|
+
|
|
246
|
+
List the scheme under `CFBundleURLTypes` in Info.plist and handle it in
|
|
247
|
+
`.onOpenURL`. For links people share publicly, prefer universal links: they
|
|
248
|
+
have a web fallback and the domain is verified.
|
|
249
|
+
|
|
250
|
+
### Handoff
|
|
251
|
+
|
|
252
|
+
Publish the current activity with `.userActivity()` and pick it up with
|
|
253
|
+
`.onContinueUserActivity()`. Every activity type must appear in the Info.plist
|
|
254
|
+
`NSUserActivityTypes` array. Set `isEligibleForHandoff = true` and supply a
|
|
255
|
+
`webpageURL` for devices without the app.
|
|
256
|
+
|
|
257
|
+
Details, AASA format and scheme parsing: [references/deeplinks.md](references/deeplinks.md).
|
|
258
|
+
|
|
259
|
+
## Common mistakes
|
|
260
|
+
|
|
261
|
+
- Reaching for `NavigationView`. It is deprecated; use `NavigationStack` or
|
|
262
|
+
`NavigationSplitView`.
|
|
263
|
+
- Letting every tab share one `NavigationPath`. Each tab keeps its own history.
|
|
264
|
+
- Driving a model-backed sheet with `.sheet(isPresented:)` instead of
|
|
265
|
+
`.sheet(item:)`.
|
|
266
|
+
- Putting views in the path. The path holds small `Hashable` route values.
|
|
267
|
+
- Writing `NavigationStack(path: $router.path)` where `router` is a plain `let`
|
|
268
|
+
or comes from `@Environment`. That gives no binding and does not compile;
|
|
269
|
+
declare the property `@Bindable var router: Router`, or add
|
|
270
|
+
`@Bindable var router = router` inside `body`.
|
|
271
|
+
- Building tabs with the older `.tabItem { }` instead of `Tab(value:)` with
|
|
272
|
+
`TabView(selection:)`.
|
|
273
|
+
- Expecting `tabBarMinimizeBehavior` to do anything on iPad. It is iPhone only.
|
|
274
|
+
- Parsing URLs in several views. The router is the one place that parses them.
|
|
275
|
+
- Giving sheets fixed frame sizes instead of `.presentationSizing(.form)`.
|
|
276
|
+
- Leaving `@MainActor` off the router class, which Swift 6 concurrency checking
|
|
277
|
+
needs.
|
|
278
|
+
|
|
279
|
+
## Review checklist
|
|
280
|
+
|
|
281
|
+
- [ ] `NavigationStack` everywhere, no `NavigationView`
|
|
282
|
+
- [ ] Each tab has its own `NavigationStack` and its own path
|
|
283
|
+
- [ ] The route enum is `Hashable` and its identifiers are stable
|
|
284
|
+
- [ ] `.navigationDestination(for:)` handles every route type that can be pushed
|
|
285
|
+
- [ ] `.sheet(item:)` is used for model-backed sheets
|
|
286
|
+
- [ ] Sheets handle their own dismissal
|
|
287
|
+
- [ ] The router is `@MainActor` and `@Observable`
|
|
288
|
+
- [ ] Incoming URLs are parsed and validated before any navigation happens
|
|
289
|
+
- [ ] Universal links have the AASA file and Associated Domains in place
|
|
290
|
+
- [ ] Tab selection uses `Tab(value:)` with a selection binding
|
|
256
291
|
|
|
257
292
|
## References
|
|
258
293
|
|
|
259
|
-
-
|
|
260
|
-
-
|
|
261
|
-
-
|
|
262
|
-
-
|
|
263
|
-
- Architecture and state management: see `swiftui-patterns` skill
|
|
264
|
-
- Layout and components: see `swiftui-layout-components` skill
|
|
294
|
+
- [references/navigationstack.md](references/navigationstack.md): routers, per-tab stacks, centralised destinations, data-driven tabs
|
|
295
|
+
- [references/sheets.md](references/sheets.md): enum sheet routing, sizing, dismissal confirmation
|
|
296
|
+
- [references/tabview.md](references/tabview.md): tab architecture, custom selection binding, dynamic tabs, the iOS 18 and iOS 26 tab APIs
|
|
297
|
+
- [references/deeplinks.md](references/deeplinks.md): router URL handling, universal links and AASA, custom schemes, Handoff
|