@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,272 +1,296 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: storekit
|
|
3
|
-
description: "
|
|
3
|
+
description: "StoreKit 2 in-app purchases and subscriptions: SubscriptionStoreView, StoreView and ProductView paywalls, consumable, non-consumable and auto-renewable purchase flows, Product and Transaction APIs, entitlement verification, subscription status and renewal, offer codes, introductory, promotional and win-back offers, configuration file testing, Family Sharing, Ask to Buy, refunds, billing retry. Use when building or reviewing purchase, paywall, entitlement or subscription code. Not for App Store review (app-store-review) or ASO (app-store-optimization)."
|
|
4
4
|
metadata:
|
|
5
|
-
source:
|
|
5
|
+
source: multi-agent-pipeline
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# StoreKit 2
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
`PurchaseAction`, `StoreView`, and `SubscriptionStoreView`
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
- [Common Mistakes](#common-mistakes)
|
|
40
|
-
- [Review Checklist](#review-checklist)
|
|
41
|
-
- [References](#references)
|
|
8
|
+
# StoreKit 2
|
|
9
|
+
|
|
10
|
+
StoreKit 2 is the Swift-native purchase API: `Product` describes what you
|
|
11
|
+
sell, `Transaction` records what the user owns, and SwiftUI supplies
|
|
12
|
+
`PurchaseAction`, `StoreView`, `ProductView` and `SubscriptionStoreView` to
|
|
13
|
+
sell it. This skill targets iOS 26 and names the release where each API
|
|
14
|
+
appeared, because older deployment targets change what you may call.
|
|
15
|
+
|
|
16
|
+
The original In-App Purchase API (`SKProduct`, `SKPaymentQueue`,
|
|
17
|
+
`SKProductsRequest`) stays out of new code. Use it only when an old OS
|
|
18
|
+
version forces you to.
|
|
19
|
+
|
|
20
|
+
Two review rules shape everything below:
|
|
21
|
+
|
|
22
|
+
- Separate "the preferred SwiftUI path" from "an invalid API". For a custom
|
|
23
|
+
SwiftUI buy button, `PurchaseAction` is preferred; calling
|
|
24
|
+
`product.purchase(options:)` directly is still correct for flows that need
|
|
25
|
+
low-level control. Never call the direct call wrong in itself.
|
|
26
|
+
- This file carries the rules and short snippets. Complete code for each core
|
|
27
|
+
flow is in [references/core-patterns.md](references/core-patterns.md).
|
|
28
|
+
|
|
29
|
+
Where neighbouring work goes:
|
|
30
|
+
|
|
31
|
+
| Topic | Skill |
|
|
32
|
+
|-------|-------|
|
|
33
|
+
| Submission readiness, privacy manifests, ATT, metadata, screenshots, rejection audits | `app-store-review` |
|
|
34
|
+
| Keywords, ranking, screenshot captions, conversion strategy | `app-store-optimization` |
|
|
35
|
+
|
|
36
|
+
In a file that imports SwiftUI, the bare name `Transaction` clashes with
|
|
37
|
+
SwiftUI's animation transaction when used as a type. Write
|
|
38
|
+
`StoreKit.Transaction` there.
|
|
42
39
|
|
|
43
40
|
## Implementation Review Minimums
|
|
44
41
|
|
|
45
|
-
When
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
42
|
+
When you review a paywall, a purchase manager or an entitlement gate, say each
|
|
43
|
+
of these out loud, even when the code already gets it right:
|
|
44
|
+
|
|
45
|
+
1. Standard SwiftUI paywalls use `StoreView`, `ProductView` or
|
|
46
|
+
`SubscriptionStoreView`; custom SwiftUI buy buttons use `PurchaseAction`.
|
|
47
|
+
2. `Transaction.updates` is iterated from app launch. That is the only place
|
|
48
|
+
the app hears about purchases made on another device, Family Sharing
|
|
49
|
+
changes, renewals, Ask to Buy approvals, refunds, revocations and
|
|
50
|
+
transactions left unfinished last time.
|
|
51
|
+
3. When `Transaction.currentEntitlements` comes up, include this sentence
|
|
52
|
+
verbatim: "`Transaction.currentEntitlements` covers non-consumables, active
|
|
53
|
+
or grace-period auto-renewable subscriptions, and non-renewing
|
|
54
|
+
subscriptions; it does not include consumable purchase or delivery
|
|
55
|
+
history."
|
|
56
|
+
4. Every `VerificationResult` is checked before access is granted.
|
|
57
|
+
5. Content is delivered or the entitlement persisted first, and only then is
|
|
58
|
+
`transaction.finish()` called.
|
|
59
|
+
6. A pending purchase or a cancelled one never unlocks anything. A pending Ask
|
|
60
|
+
to Buy purchase unlocks when the approved, verified transaction arrives on
|
|
61
|
+
the launch-time listener.
|
|
62
|
+
7. Refunded or revoked transactions are excluded from entitlement state, and
|
|
63
|
+
entitlements are recomputed when a refund or revocation arrives on
|
|
64
|
+
`Transaction.updates`.
|
|
65
|
+
8. A subscription paywall shows a restore path and links to Terms of Service
|
|
66
|
+
and the Privacy Policy.
|
|
69
67
|
|
|
70
68
|
## Product Types
|
|
71
69
|
|
|
72
|
-
|
|
|
73
|
-
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
|
|
|
77
|
-
|
|
|
70
|
+
| Kind | `Product.ProductType` | Behaviour | Example |
|
|
71
|
+
|------|----------------------|-----------|---------|
|
|
72
|
+
| Consumable | `.consumable` | used up, can be bought again | hint packs, credits |
|
|
73
|
+
| Non-consumable | `.nonConsumable` | bought once, kept forever | pro unlock |
|
|
74
|
+
| Auto-renewable | `.autoRenewable` | billed on a schedule until cancelled | monthly plan |
|
|
75
|
+
| Non-renewing | `.nonRenewing` | access for a fixed period, no renewal | season pass |
|
|
78
76
|
|
|
79
77
|
## Loading Products
|
|
80
78
|
|
|
81
|
-
|
|
79
|
+
Keep identifiers in one place and fetch them together:
|
|
82
80
|
|
|
83
81
|
```swift
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
static let
|
|
82
|
+
import StoreKit
|
|
83
|
+
|
|
84
|
+
enum StoreItem {
|
|
85
|
+
static let proUnlock = "com.example.recipes.pro"
|
|
86
|
+
static let monthly = "com.example.recipes.monthly"
|
|
87
|
+
static let annual = "com.example.recipes.annual"
|
|
88
|
+
static let everything = [proUnlock, monthly, annual]
|
|
88
89
|
}
|
|
89
90
|
|
|
90
|
-
|
|
91
|
+
func loadCatalog() async throws -> [Product] {
|
|
92
|
+
try await Product.products(for: StoreItem.everything)
|
|
93
|
+
}
|
|
91
94
|
```
|
|
92
95
|
|
|
93
96
|
## Purchase Flow
|
|
94
97
|
|
|
95
|
-
|
|
96
|
-
restore purchases, and display policy controls. For custom SwiftUI purchase
|
|
97
|
-
buttons, prefer `PurchaseAction` from the environment. Use direct
|
|
98
|
-
`product.purchase(options:)` only for lower-level custom flows, and use
|
|
99
|
-
`purchase(confirmIn:options:)` for UIKit or AppKit confirmation. Always handle
|
|
100
|
-
every `PurchaseResult`, verify before access, deliver durably, then finish.
|
|
98
|
+
Pick the entry point by how much control you need:
|
|
101
99
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
100
|
+
| Need | Use | Since |
|
|
101
|
+
|------|-----|-------|
|
|
102
|
+
| Standard paywall | `StoreView`, `ProductView`, `SubscriptionStoreView`; they buy, restore and show policy links | iOS 17 |
|
|
103
|
+
| Custom SwiftUI button | `@Environment(\.purchase)` (`PurchaseAction`) | iOS 17 |
|
|
104
|
+
| Low-level custom flow | `product.purchase(options:)` | iOS 15 |
|
|
105
|
+
| UIKit or AppKit confirmation sheet | `product.purchase(confirmIn:options:)` | iOS 17 |
|
|
105
106
|
|
|
106
|
-
|
|
107
|
-
|
|
107
|
+
Whatever the entry point, handle every `PurchaseResult` case, verify before
|
|
108
|
+
granting, persist the delivery, then finish. In a review, recommend
|
|
109
|
+
`PurchaseAction` for SwiftUI buttons and leave direct `purchase(options:)` in
|
|
110
|
+
place where the flow genuinely needs it; do not flag it as a bug. The full
|
|
111
|
+
flow with the `verified(_:)` helper and `.pending` handling is at
|
|
112
|
+
[core-patterns.md#buying-with-purchaseaction](references/core-patterns.md#buying-with-purchaseaction).
|
|
108
113
|
|
|
109
114
|
## Transaction.updates Listener
|
|
110
115
|
|
|
111
|
-
Start
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
launch
|
|
116
|
+
- Start it when the app launches, never when a paywall appears.
|
|
117
|
+
- It delivers other-device purchases, Family Sharing changes, renewals, Ask
|
|
118
|
+
to Buy approvals, refunds and revocations.
|
|
119
|
+
- Right after launch it also delivers, once, every transaction that was never
|
|
120
|
+
finished.
|
|
121
|
+
- Keep the task alive for the whole life of the app.
|
|
115
122
|
|
|
116
|
-
In
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
Full launch-time listener wired into `App.init`:
|
|
121
|
-
references/core-patterns.md#transactionupdates-listener
|
|
123
|
+
In a review, list those event kinds by name. The listener wired into
|
|
124
|
+
`App.init` is at
|
|
125
|
+
[core-patterns.md#launch-time-transaction-listener](references/core-patterns.md#launch-time-transaction-listener).
|
|
122
126
|
|
|
123
127
|
## Entitlement Checking
|
|
124
128
|
|
|
125
|
-
|
|
126
|
-
period auto-renewable subscriptions, and non-renewing subscriptions.
|
|
127
|
-
consumables
|
|
128
|
-
your own
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
129
|
+
- `Transaction.currentEntitlements` covers non-consumables, active or
|
|
130
|
+
grace-period auto-renewable subscriptions, and non-renewing subscriptions.
|
|
131
|
+
- It does not contain consumables or their delivery history; record consumable
|
|
132
|
+
fulfilment in your own ledger, on device or on a server.
|
|
133
|
+
- It leaves out refunded and revoked transactions, but still check
|
|
134
|
+
`revocationDate` whenever you process a transaction.
|
|
135
|
+
- `Transaction.unfinished` is the sweep for unfinished consumables and
|
|
136
|
+
recovery.
|
|
137
|
+
- For one product, `Transaction.currentEntitlements(for:)` (iOS 18.4) replaces
|
|
138
|
+
`Transaction.currentEntitlement(for:)`, deprecated in iOS 18.4.
|
|
139
|
+
|
|
140
|
+
In a review the verbatim scope sentence from the minimums is required; a code
|
|
141
|
+
sample or a revocation check alone does not replace it. The full
|
|
142
|
+
`refresh()` and the `.currentEntitlementTask` gate are at
|
|
143
|
+
[core-patterns.md#computing-entitlements](references/core-patterns.md#computing-entitlements).
|
|
144
|
+
|
|
145
|
+
## Store Views
|
|
146
|
+
|
|
147
|
+
`SubscriptionStoreView(groupID:)` is a complete subscription paywall: it
|
|
148
|
+
loads products, runs the purchase sheet and can show restore and policy
|
|
149
|
+
controls. `StoreView(ids:)` sells several products; `ProductView(id:)` shows
|
|
150
|
+
one. All three are iOS 17 and all accept `.onInAppPurchaseCompletion` and
|
|
146
151
|
`.storeButton(.visible, for: .restorePurchases)`.
|
|
147
152
|
|
|
148
153
|
```swift
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
154
|
+
import StoreKit
|
|
155
|
+
import SwiftUI
|
|
156
|
+
|
|
157
|
+
struct PlanPicker: View {
|
|
158
|
+
let group: String
|
|
159
|
+
let terms: URL
|
|
160
|
+
let privacy: URL
|
|
161
|
+
|
|
162
|
+
var body: some View {
|
|
163
|
+
SubscriptionStoreView(groupID: group)
|
|
164
|
+
.storeButton(.visible, for: .restorePurchases)
|
|
165
|
+
.subscriptionStorePolicyDestination(url: terms, for: .termsOfService)
|
|
166
|
+
.subscriptionStorePolicyDestination(url: privacy, for: .privacyPolicy)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
153
169
|
```
|
|
154
170
|
|
|
155
|
-
|
|
156
|
-
references/core-patterns.md#
|
|
157
|
-
references/core-patterns.md#storeview-and-productview
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
backgrounds see [references/storekit-advanced.md](references/storekit-advanced.md).
|
|
171
|
+
Complete examples are at
|
|
172
|
+
[core-patterns.md#subscription-paywall](references/core-patterns.md#subscription-paywall)
|
|
173
|
+
and [core-patterns.md#product-shelves-storeview-and-productview](references/core-patterns.md#product-shelves-storeview-and-productview).
|
|
174
|
+
Control styles, grouped layouts, offers and backgrounds are in
|
|
175
|
+
[references/storekit-advanced.md](references/storekit-advanced.md).
|
|
161
176
|
|
|
162
177
|
## Subscription Status Checking
|
|
163
178
|
|
|
164
|
-
Read status with `Product.SubscriptionInfo.status(for: groupID)
|
|
179
|
+
Read status with `Product.SubscriptionInfo.status(for: groupID)`. Count
|
|
165
180
|
`.subscribed` and `.inGracePeriod` as active.
|
|
166
181
|
|
|
167
|
-
|
|
|
168
|
-
|
|
169
|
-
| `.subscribed` |
|
|
170
|
-
| `.expired` |
|
|
171
|
-
| `.inBillingRetryPeriod` |
|
|
172
|
-
| `.inGracePeriod` |
|
|
173
|
-
| `.revoked` |
|
|
182
|
+
| `RenewalState` | Meaning |
|
|
183
|
+
|----------------|---------|
|
|
184
|
+
| `.subscribed` | active |
|
|
185
|
+
| `.expired` | ended |
|
|
186
|
+
| `.inBillingRetryPeriod` | a charge failed and Apple keeps retrying |
|
|
187
|
+
| `.inGracePeriod` | a charge failed, but access continues for the grace window |
|
|
188
|
+
| `.revoked` | refunded or revoked by Apple |
|
|
174
189
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
190
|
+
The helper is at
|
|
191
|
+
[core-patterns.md#is-a-plan-active](references/core-patterns.md#is-a-plan-active);
|
|
192
|
+
what to grant in each state, expiration reasons, grace period and billing retry
|
|
193
|
+
are in [references/storekit-advanced.md](references/storekit-advanced.md).
|
|
178
194
|
|
|
179
195
|
## Restore Purchases
|
|
180
196
|
|
|
181
|
-
StoreKit 2
|
|
182
|
-
|
|
197
|
+
In StoreKit 2 there is no separate restore step for data: whatever the user
|
|
198
|
+
owns shows up in `Transaction.currentEntitlements`. Still offer a restore
|
|
199
|
+
control. On a store view use `.storeButton(.visible, for: .restorePurchases)`;
|
|
200
|
+
in custom UI call `AppStore.sync()` and recompute:
|
|
183
201
|
|
|
184
202
|
```swift
|
|
185
|
-
func
|
|
203
|
+
func restoreTapped(using store: EntitlementStore) async throws {
|
|
186
204
|
try await AppStore.sync()
|
|
187
|
-
await
|
|
205
|
+
await store.refresh()
|
|
188
206
|
}
|
|
189
207
|
```
|
|
190
208
|
|
|
191
|
-
On store views: `.storeButton(.visible, for: .restorePurchases)`
|
|
192
|
-
|
|
193
209
|
## App Transaction
|
|
194
210
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
211
|
+
`AppTransaction.shared` (iOS 16) proves the app install itself is genuine.
|
|
212
|
+
Use it when the business model changes, such as moving from a paid app to a
|
|
213
|
+
subscription while honouring earlier buyers, and to spot tampered installs.
|
|
214
|
+
From the verified value read `originalAppVersion` and `originalPurchaseDate`;
|
|
215
|
+
on `.unverified`, limit features. Full code at
|
|
216
|
+
[core-patterns.md#verifying-the-install-with-apptransaction](references/core-patterns.md#verifying-the-install-with-apptransaction).
|
|
201
217
|
|
|
202
218
|
## Purchase Options
|
|
203
219
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
220
|
+
| Option | Purpose |
|
|
221
|
+
|--------|---------|
|
|
222
|
+
| `.appAccountToken(uuid)` | ties the purchase to your account ID for server reconciliation |
|
|
223
|
+
| `.quantity(n)` | buys several of a consumable |
|
|
224
|
+
| `.simulatesAskToBuyInSandbox(true)` | forces the Ask to Buy flow in sandbox |
|
|
209
225
|
|
|
210
226
|
## SwiftUI Purchase Callbacks
|
|
211
227
|
|
|
212
|
-
Store views
|
|
213
|
-
`.inAppPurchaseOptions`. In the completion handler
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
Full callback example: references/core-patterns.md#swiftui-purchase-callbacks
|
|
228
|
+
Store views take `.onInAppPurchaseStart`, `.onInAppPurchaseCompletion` and
|
|
229
|
+
`.inAppPurchaseOptions`. In the completion handler: verify, deliver, finish.
|
|
230
|
+
Example at
|
|
231
|
+
[core-patterns.md#store-view-callbacks](references/core-patterns.md#store-view-callbacks).
|
|
217
232
|
|
|
218
233
|
## Common Mistakes
|
|
219
234
|
|
|
220
|
-
|
|
221
|
-
references/core-patterns.md#
|
|
222
|
-
|
|
223
|
-
1.
|
|
224
|
-
2.
|
|
225
|
-
3. Ignoring the verification result
|
|
226
|
-
4.
|
|
227
|
-
5. Not checking `revocationDate
|
|
228
|
-
6.
|
|
229
|
-
7.
|
|
230
|
-
8. Checking entitlements
|
|
231
|
-
9.
|
|
232
|
-
10. Subscription
|
|
235
|
+
Each has a wrong and a right version in
|
|
236
|
+
[core-patterns.md#ten-mistakes-fixed](references/core-patterns.md#ten-mistakes-fixed).
|
|
237
|
+
|
|
238
|
+
1. No `Transaction.updates` listener at launch.
|
|
239
|
+
2. Never calling `transaction.finish()`.
|
|
240
|
+
3. Ignoring the verification result.
|
|
241
|
+
4. `SKProduct` or `SKPaymentQueue` in new StoreKit 2 code.
|
|
242
|
+
5. Not checking `revocationDate`.
|
|
243
|
+
6. Prices typed into strings instead of `product.displayPrice`.
|
|
244
|
+
7. No handling for `.pending`.
|
|
245
|
+
8. Checking entitlements once at launch and never again.
|
|
246
|
+
9. No restore purchases control.
|
|
247
|
+
10. Subscription screens without Terms and Privacy links.
|
|
248
|
+
|
|
249
|
+
## Old API to Current API
|
|
250
|
+
|
|
251
|
+
These replacements are regression facts; flag the left column in review.
|
|
252
|
+
|
|
253
|
+
| Stale code | Current code | Why |
|
|
254
|
+
|------------|--------------|-----|
|
|
255
|
+
| `Product.SubscriptionInfo.Status.status(for:)` | `Product.SubscriptionInfo.status(for:)` | the former does not exist |
|
|
256
|
+
| `transaction.offerType`, `transaction.offerID` | `transaction.offer?.type`, `transaction.offer?.id` | deprecated in iOS 17.2 |
|
|
257
|
+
| `.promotionalOffer(offerID:signature:)` and `.promotionalOffer(offerID:keyID:nonce:signature:timestamp:)` | `Product.PurchaseOption.promotionalOffer(_:compactJWS:)` | deprecated in iOS 26; the new call returns an array of options |
|
|
258
|
+
| `.subscriptionPromotionalOffer(offer:signature:)` on store views | `.subscriptionPromotionalOffer(offer:compactJWS:)` (iOS 26) | deprecated in iOS 26 |
|
|
259
|
+
| `Transaction.currentEntitlement(for:)` | `Transaction.currentEntitlements(for:)` | deprecated in iOS 18.4 |
|
|
260
|
+
| Showing every `winBackOffers` entry | only entries whose IDs are in the verified `renewalInfo.eligibleWinBackOfferIDs` | the raw list is not per user |
|
|
261
|
+
| `.purchaseDate(_:renewalBehavior: .default)` | `.purchaseDate(_:renewalBehavior:)` with `.renewUntilNow` or `.cancelImmediately`, from `StoreKitTest` | there is no `.default`; the option is test-only |
|
|
233
262
|
|
|
234
263
|
## Review Checklist
|
|
235
264
|
|
|
236
|
-
- [ ] `Transaction.updates` listener starts
|
|
237
|
-
- [ ]
|
|
238
|
-
- [ ] `transaction.finish()`
|
|
239
|
-
- [ ] Revoked
|
|
240
|
-
- [ ] `.pending`
|
|
241
|
-
- [ ] Restore purchases
|
|
242
|
-
- [ ] Terms of Service and Privacy Policy
|
|
243
|
-
- [ ] Prices
|
|
244
|
-
- [ ]
|
|
245
|
-
- [ ] Free
|
|
246
|
-
- [ ] No
|
|
247
|
-
- [ ] Product IDs
|
|
248
|
-
- [ ] StoreKit tests cover promotional
|
|
249
|
-
- [ ] Entitlements
|
|
250
|
-
- [ ] Server
|
|
251
|
-
- [ ] Consumables delivered and finished promptly
|
|
252
|
-
- [ ]
|
|
265
|
+
- [ ] `Transaction.updates` listener starts in the `App` initializer
|
|
266
|
+
- [ ] Every transaction is verified before access
|
|
267
|
+
- [ ] `transaction.finish()` runs only after durable delivery
|
|
268
|
+
- [ ] Revoked and refunded transactions are excluded and entitlements refreshed
|
|
269
|
+
- [ ] `.pending` shows Ask to Buy or deferred-approval feedback
|
|
270
|
+
- [ ] Restore purchases is visible on the paywall and store views
|
|
271
|
+
- [ ] Subscription screens link to Terms of Service and the Privacy Policy
|
|
272
|
+
- [ ] Prices come from `product.displayPrice`
|
|
273
|
+
- [ ] Price, period and renewal terms are clear before purchase
|
|
274
|
+
- [ ] Free-trial copy states what is charged after the trial
|
|
275
|
+
- [ ] No `SKProduct` or `SKPaymentQueue` unless an old OS needs them
|
|
276
|
+
- [ ] Product IDs live in constants
|
|
277
|
+
- [ ] StoreKit tests cover promotional, win-back and code offers, Ask to Buy, renewals, refunds and revocations
|
|
278
|
+
- [ ] Entitlements are recomputed on `Transaction.updates` and when the app returns to the foreground
|
|
279
|
+
- [ ] Server validation, where used, receives `jwsRepresentation`
|
|
280
|
+
- [ ] Consumables are delivered and finished promptly
|
|
281
|
+
- [ ] Types that cross concurrency domains (observers, product models) are `Sendable`
|
|
253
282
|
|
|
254
283
|
## References
|
|
255
284
|
|
|
256
|
-
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
rejection.
|
|
269
|
-
- For submission, privacy, metadata, screenshots, and rejection-risk audits use `app-store-review`.
|
|
270
|
-
- For keyword, screenshot-caption, ranking, and conversion strategy use `app-store-optimization`.
|
|
271
|
-
- Official Apple docs: [Choosing a StoreKit API](https://sosumi.ai/documentation/storekit/choosing-a-storekit-api-for-in-app-purchases), [Transaction.updates](https://sosumi.ai/documentation/storekit/transaction/updates), [Transaction.currentEntitlements](https://sosumi.ai/documentation/storekit/transaction/currententitlements),
|
|
272
|
-
[SubscriptionStoreView](https://sosumi.ai/documentation/storekit/subscriptionstoreview), and [PurchaseAction](https://sosumi.ai/documentation/storekit/purchaseaction).
|
|
285
|
+
- [references/core-patterns.md](references/core-patterns.md): load when writing
|
|
286
|
+
or reviewing a core flow.
|
|
287
|
+
- [references/storekit-advanced.md](references/storekit-advanced.md): offers,
|
|
288
|
+
test setup, subscription edge cases.
|
|
289
|
+
- [references/app-review-guidelines.md](references/app-review-guidelines.md):
|
|
290
|
+
before submission or when a payment rejection needs diagnosing (Guideline
|
|
291
|
+
3.1.1, subscription disclosure, avoiding rejections).
|
|
292
|
+
- Apple: [Choosing a StoreKit API](https://developer.apple.com/documentation/storekit/choosing-a-storekit-api-for-in-app-purchases),
|
|
293
|
+
[Transaction.updates](https://developer.apple.com/documentation/storekit/transaction/updates),
|
|
294
|
+
[Transaction.currentEntitlements](https://developer.apple.com/documentation/storekit/transaction/currententitlements),
|
|
295
|
+
[SubscriptionStoreView](https://developer.apple.com/documentation/storekit/subscriptionstoreview),
|
|
296
|
+
[PurchaseAction](https://developer.apple.com/documentation/storekit/purchaseaction).
|
|
@@ -3,41 +3,44 @@
|
|
|
3
3
|
"evals": [
|
|
4
4
|
{
|
|
5
5
|
"id": 1,
|
|
6
|
-
"
|
|
7
|
-
"
|
|
6
|
+
"name": "ios26-subscription-paywall",
|
|
7
|
+
"prompt": "Write the StoreKit 2 side of an iOS 26 SwiftUI meditation app that sells a monthly and a yearly plan. I need product loading, buying, entitlement checks, restore, reacting to changes made outside the app, Ask to Buy, and refunds.",
|
|
8
|
+
"expected_output": "Sells through SubscriptionStoreView, StoreView or a PurchaseAction button as the preferred path instead of only calling product.purchase(options:). Iterates Transaction.updates from app launch in a task that cannot throw, and names what it brings in: renewals, refunds, approvals of Ask to Buy requests, and transactions a previous run never finished. Checks every VerificationResult before granting and finishes only after delivery. Explains the reach of Transaction.currentEntitlements: it lists permanent unlocks, auto-renewing plans that are active or in their grace period, and non-renewing passes, and it keeps no record of consumables. Handles .pending and .userCancelled, removes refunded or revoked access, offers restore, and links Terms of Service and the Privacy Policy on the paywall.",
|
|
8
9
|
"files": [],
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"Starts
|
|
12
|
-
"
|
|
13
|
-
"Explains that
|
|
14
|
-
"
|
|
10
|
+
"expectations": [
|
|
11
|
+
"Prefers SubscriptionStoreView, StoreView or PurchaseAction over a bare product.purchase(options:) call",
|
|
12
|
+
"Starts Transaction.updates at launch in a non-throwing task and says it carries renewals, refunds, Ask to Buy approvals and leftovers from earlier runs",
|
|
13
|
+
"Checks VerificationResult before granting and calls finish() after delivery",
|
|
14
|
+
"Explains that currentEntitlements holds permanent unlocks, live or grace-period auto-renewing plans and non-renewing passes, and nothing about consumables",
|
|
15
|
+
"Covers .pending, .userCancelled, refunds and revocations, restore, and the subscription policy links"
|
|
15
16
|
]
|
|
16
17
|
},
|
|
17
18
|
{
|
|
18
19
|
"id": 2,
|
|
19
|
-
"
|
|
20
|
-
"
|
|
20
|
+
"name": "stale-offer-apis",
|
|
21
|
+
"prompt": "Review this offer code from an older branch: it reads Product.SubscriptionInfo.Status.status(for:) to find the plan state, shows every entry of winBackOffers to anyone who cancelled, applies .subscriptionPromotionalOffer(offer:signature:) on the store view, and logs transaction.offerType and transaction.offerID after purchase. Bring it up to date for iOS 26 and say how to test it.",
|
|
22
|
+
"expected_output": "Changes Product.SubscriptionInfo.Status.status(for:), which does not exist, to the static Product.SubscriptionInfo.status(for:). Explains that winBackOffers is an unfiltered list and must be narrowed to the IDs in the verified renewalInfo.eligibleWinBackOfferIDs before anything is shown or bought. Moves the store view to the iOS 26 .subscriptionPromotionalOffer(offer:compactJWS:) closures, or keeps signed promotional offers separate as purchase options built with promotionalOffer(_:compactJWS:). Swaps the deprecated offerType and offerID properties for the optional offer property and its type and id. Suggests exercising promotional, win-back and code redemptions, Ask to Buy and renewal states in a StoreKit configuration file or the sandbox.",
|
|
21
23
|
"files": [],
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"Uses the iOS 26
|
|
26
|
-
"
|
|
27
|
-
"
|
|
24
|
+
"expectations": [
|
|
25
|
+
"Uses the static Product.SubscriptionInfo.status(for:) in place of Product.SubscriptionInfo.Status.status(for:)",
|
|
26
|
+
"Filters winBackOffers through verified renewalInfo.eligibleWinBackOfferIDs and calls showing all of them to every lapsed user wrong",
|
|
27
|
+
"Uses the iOS 26 subscriptionPromotionalOffer closures with compactJWS, or keeps the signed purchase option path visibly apart",
|
|
28
|
+
"Replaces offerType and offerID with the offer property (offer?.type, offer?.id)",
|
|
29
|
+
"Suggests a StoreKit configuration file or the sandbox to exercise promotional, win-back and code offers, Ask to Buy and renewal states"
|
|
28
30
|
]
|
|
29
31
|
},
|
|
30
32
|
{
|
|
31
33
|
"id": 3,
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
+
"name": "scope-boundaries",
|
|
35
|
+
"prompt": "Before launch our subscription app needs a privacy manifest, an ATT prompt, new screenshots after a metadata rejection, a keyword refresh for search ranking, and a check that the paywall is compliant. We also link to our website for cheaper annual plans. Which parts are StoreKit work?",
|
|
36
|
+
"expected_output": "Keeps StoreKit to products, paywalls, purchase flows, verification, restore and entitlements, including the paywall compliance points. Hands the privacy manifest, ATT, the new screenshots, the metadata rejection and overall launch readiness to app-store-review, and keywords, search ranking, captions and conversion to app-store-optimization. Explains that digital features are normally sold through in-app purchase, with room for a present-day exception, a storefront-specific rule or an entitlement Apple has granted. Rejects the idea that any link to the website is an automatic rejection, and notes that reader-app provisions and the storefront decide whether the cheaper-plans link may stay.",
|
|
34
37
|
"files": [],
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
38
|
+
"expectations": [
|
|
39
|
+
"Limits StoreKit to products, paywalls, purchase flows, verification, restore and entitlements",
|
|
40
|
+
"Hands privacy manifests, ATT, screenshots, metadata rejections and launch readiness to app-store-review",
|
|
41
|
+
"Hands keywords, ranking, screenshot captions and conversion to app-store-optimization",
|
|
42
|
+
"Says digital features are normally sold through in-app purchase, with room for a current exception, a storefront rule or a granted entitlement",
|
|
43
|
+
"Does not treat every external link as an automatic rejection; mentions reader-app and storefront-dependent rules"
|
|
41
44
|
]
|
|
42
45
|
}
|
|
43
46
|
]
|