@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +0 -10
  3. package/docs/facts.json +1 -1
  4. package/manifest.json +266 -267
  5. package/package.json +2 -2
  6. package/pipeline/scripts/_notices.mjs +1 -1
  7. package/pipeline/skills/.skill-manifest.json +68 -68
  8. package/pipeline/skills/shared/README.md +70 -70
  9. package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
  10. package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
  11. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
  12. package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
  13. package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
  14. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
  15. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
  16. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
  17. package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
  18. package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
  19. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
  20. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
  21. package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
  22. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
  23. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
  24. package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
  25. package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
  26. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
  27. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
  28. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
  29. package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
  30. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
  31. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
  32. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
  33. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
  34. package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
  35. package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
  36. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
  37. package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
  38. package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
  39. package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
  40. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
  41. package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
  42. package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
  43. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
  44. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
  45. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
  46. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
  47. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
  48. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
  49. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
  50. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
  51. package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
  52. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
  53. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
  54. package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
  55. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
  56. package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
  57. package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
  58. package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
  59. package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
  60. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
  61. package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
  62. package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
  63. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
  64. package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
  65. package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
  66. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
  67. package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
  68. package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
  69. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
  70. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
  71. package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
  72. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
  73. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
  74. package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
  75. package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
  76. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
  77. package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
  78. package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
  79. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
  80. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
  81. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
  82. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
  83. package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
  84. package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
  85. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
  86. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
  87. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
  88. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
  89. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
  90. package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
  91. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
  92. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
  93. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
  94. package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
  95. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
  96. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
  97. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
  98. package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
  99. package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
  100. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
  101. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
  102. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
  103. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
  104. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
  105. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
  106. package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
  107. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
  108. package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
  109. package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
  110. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
  111. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
  112. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
  113. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
  114. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
  115. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
  116. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
  117. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
  118. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
  119. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
  120. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
  121. package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
  122. package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
  123. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
  124. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
  125. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
  126. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
  127. package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
  128. package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
  129. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
  130. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
  131. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
  132. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
  133. package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
  134. package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
  135. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
  136. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
  137. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
  138. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
  139. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
  140. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
  141. package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
  142. package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
  143. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
  144. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
  145. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
  146. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
  147. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
  148. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
  149. package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
  150. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
  151. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
  152. package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
  153. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
  154. package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
  155. package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
  156. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
  157. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
  158. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
  159. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
  160. package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
  161. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
  162. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
  163. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
  164. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
  165. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
  166. package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
  167. package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
  168. package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
  169. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
  170. package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
  171. package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
  172. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
  173. package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
  174. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
  175. package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
  176. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
  177. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
  178. package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
  179. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
  180. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
  181. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
  182. package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
  183. package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
  184. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
  185. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
  186. package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
  187. package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
  188. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
  189. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
  190. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
  191. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
  192. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
  193. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
  194. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
  195. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
  196. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
  197. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
  198. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
  199. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
  200. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
  201. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
  202. package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
  203. package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
  204. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
  205. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
  206. package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
  207. package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
  208. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
  209. package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
  210. package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
  211. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
  212. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
  213. package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
  214. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
  215. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
  216. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
  217. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
  218. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
  219. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
  220. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
  221. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
  222. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
  223. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
  224. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
  225. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
  226. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
  227. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
  228. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
  229. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
  230. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
  231. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
  232. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
  233. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
  234. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
  235. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
  236. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
  237. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
  238. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
  239. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
  240. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
  241. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
  242. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
  243. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
  244. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
  245. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
  246. package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
  247. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
  248. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
  249. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
  250. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
  251. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
  252. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
  253. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
  254. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
  255. package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
  256. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
  257. package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
  258. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
  259. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
  260. package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
  261. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
  262. package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
  263. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
  264. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
@@ -3,49 +3,50 @@
3
3
  "evals": [
4
4
  {
5
5
  "id": 1,
6
- "prompt": "I'm adding Apple Pay checkout to a SwiftUI store for physical products. Show the capability setup, availability check, Apple Pay button, PKPaymentRequest with shipping, payment presentation, and authorization delegate shape. Include App Review boundary notes for StoreKit.",
7
- "expected_output": "A source-grounded PassKit checkout plan that uses Apple Pay for physical goods, builds a valid payment request, handles authorization through a retained controller/delegate, and keeps StoreKit for digital goods.",
6
+ "name": "apple-pay-checkout-setup",
7
+ "prompt": "We sell bicycle parts and want Apple Pay in our SwiftUI app. Right now we draw our own black button with the Apple logo, compute prices as Double, present PKPaymentAuthorizationController from a local variable, and dismiss it inside didAuthorizePayment. A teammate also suggests using StoreKit instead. Walk us through a correct setup.",
8
+ "expected_output": "Lists the capability, Merchant ID, Payment Processing Certificate and entitlement; checks canMakePayments and canMakePayments(usingNetworks:capabilities:); uses PayWithApplePayButton or PKPaymentButton; uses NSDecimalNumber for items and shipping with the business-name total last; retains the controller and clears it after dismissing in didFinish; sends the token to the server and replies with PKPaymentAuthorizationResult; keeps physical goods on Apple Pay rather than StoreKit.",
8
9
  "files": [],
9
10
  "assertions": [
10
- "States that Apple Pay capability, Merchant ID, payment processing certificate, and merchant entitlement must be configured.",
11
- "Checks `PKPaymentAuthorizationController.canMakePayments()` and `canMakePayments(usingNetworks:capabilities:)` before presenting Apple Pay UI.",
12
- "Uses system-provided `PayWithApplePayButton` or `PKPaymentButton` rather than a custom Apple Pay button.",
13
- "Constructs payment summary items and shipping methods with `NSDecimalNumber`, not `Double` money literals.",
14
- "Keeps the final `paymentSummaryItems` entry as the total Pay-line item with the merchant/business name.",
15
- "Retains `PKPaymentAuthorizationController` while presented, assigns its weak delegate, and clears the retained controller after dismissal.",
16
- "Sends `payment.token` or `payment.token.paymentData` to a payment processor/server and returns `PKPaymentAuthorizationResult` through the delegate handler.",
17
- "Explains that StoreKit is for virtual goods, app features, and digital-content subscriptions while PassKit covers physical goods, real-world services, donations, and eligible recurring payments."
11
+ "Covers the Apple Pay capability, a Merchant ID, the Payment Processing Certificate and the merchant entitlement",
12
+ "Performs both canMakePayments checks before showing the button",
13
+ "Replaces the custom button with PayWithApplePayButton or PKPaymentButton",
14
+ "Uses NSDecimalNumber for summary items and shipping, with a final total labelled with the business name",
15
+ "Stores the controller (its delegate is weak), dismisses only in paymentAuthorizationControllerDidFinish and then releases it",
16
+ "Sends payment.token to the server and completes with a PKPaymentAuthorizationResult carrying errors on failure",
17
+ "Explains that physical goods use Apple Pay and StoreKit is for digital goods"
18
18
  ]
19
19
  },
20
20
  {
21
21
  "id": 2,
22
- "prompt": "Review this Wallet pass plan: load a pkpass, show a normal SwiftUI Button that says Add to Wallet, use PKPassLibrary.isPassLibraryAvailable to decide if the device can add it, list all Wallet passes with passes(), and update the pass later with a new serial number. Fix it.",
23
- "expected_output": "A correction-focused Wallet pass answer that uses system Add to Wallet UI, signed-pass checks, correct add-pass availability, pass-library access limits, and stable pass identifiers for updates.",
22
+ "name": "wallet-pass-add-and-update",
23
+ "prompt": "Our concert app downloads a .pkpass from the server and shows a custom 'Save to Wallet' button. We gate it with PKPassLibrary.isPassLibraryAvailable(), parse with try? PKPass(data:), and when a ticket changes we create a new serial number. Sometimes replacePass seems to do nothing. What should we fix?",
24
+ "expected_output": "Uses AddPassToWalletButton or PKAddPassButton/PKAddPassesViewController, gates adding on canAddPasses and library work on isPassLibraryAvailable, surfaces invalid-data and invalid-signature errors from signed data, notes passes() is limited by entitlements, keeps the same pass type and serial number for updates, and checks the Bool from replacePass(with:).",
24
25
  "files": [],
25
26
  "assertions": [
26
- "Replaces the custom SwiftUI button with `AddPassToWalletButton` or routes review flows through `PKAddPassesViewController`/`PKAddPassButton`.",
27
- "Uses `PKAddPassesViewController.canAddPasses()` to decide whether the device can add passes.",
28
- "Uses `PKPassLibrary.isPassLibraryAvailable()` only for pass-library operations, not add-pass capability.",
29
- "Mentions that `PKPass(data:)` expects signed `.pkpass` data and can throw invalid-data or invalid-signature errors.",
30
- "Explains that `PKPassLibrary.passes()` returns only passes the app can access through entitlements.",
31
- "Preserves the same `passTypeIdentifier` and `serialNumber` when updating an existing pass.",
32
- "Checks the Boolean result from `PKPassLibrary.replacePass(with:)` and handles failure."
27
+ "Replaces the custom button with AddPassToWalletButton, PKAddPassButton or PKAddPassesViewController",
28
+ "Uses canAddPasses() to decide whether adding is possible and keeps isPassLibraryAvailable() for library operations",
29
+ "Requires signed pass data and reports invalid-data and invalid-signature errors instead of a bare try?",
30
+ "Notes that passes() only returns passes the app's entitlements allow",
31
+ "Keeps passTypeIdentifier and serialNumber unchanged when updating a pass",
32
+ "Checks the Bool returned by replacePass(with:) and handles false"
33
33
  ]
34
34
  },
35
35
  {
36
36
  "id": 3,
37
- "prompt": "I need advanced Apple Pay support for a home-goods marketplace: recurring service membership, coupon entry in the payment sheet, two end merchants that need separate tokens, and a furniture pre-order charged later. Outline the PassKit APIs and gotchas without drifting into FinanceKit or StoreKit implementation.",
38
- "expected_output": "An advanced PassKit outline using the optional request types and update callbacks correctly, with decimal amounts, management URLs, coupon update details, multi-token contexts, and sibling-skill boundaries.",
37
+ "name": "advanced-payment-requests",
38
+ "prompt": "For our furniture marketplace we need: a monthly protection plan, promo codes at checkout, separate payouts to each workshop in a basket, and pay-on-delivery for custom pieces. Can one PKPaymentRequest do all of that? We are also wondering whether FinanceKit or StoreKit should be involved.",
39
+ "expected_output": "Explains that only one advanced type fits per request; shows a PKRecurringPaymentRequest with a recurring item, interval, billing agreement and management URL; enables coupon codes with the delegate reply including shipping methods; uses PKPaymentTokenContext entries with merchant ids, name, domain and decimal amounts; builds a PKDeferredPaymentRequest with deferred date, free cancellation details and management URL; keeps FinanceKit and StoreKit out.",
39
40
  "files": [],
40
41
  "assertions": [
41
- "Uses `PKRecurringPaymentRequest` with `PKRecurringPaymentSummaryItem`, interval unit/count, billing agreement or management URL, and `request.recurringPaymentRequest`.",
42
- "Notes that a `PKPaymentRequest` can set only one optional payment request type such as recurring, automatic reload, deferred, Apple Pay Later availability, or multi-token contexts.",
43
- "Enables coupon entry with `supportsCouponCode` and handles `paymentAuthorizationController(_:didChangeCouponCode:handler:)`.",
44
- "Creates `PKPaymentRequestCouponCodeUpdate(errors:paymentSummaryItems:shippingMethods:)`, including shipping methods.",
45
- "Uses `PKPaymentTokenContext` entries with merchant identifier, external identifier, merchant name/domain, and `NSDecimalNumber` amounts for multi-merchant tokens.",
46
- "Uses `PKDeferredPaymentRequest` with `PKDeferredPaymentSummaryItem`, deferred date or cancellation date details, and a management URL.",
47
- "Keeps FinanceKit financial-data access and StoreKit digital purchase implementation outside the PassKit answer."
42
+ "Builds a PKRecurringPaymentRequest with a PKRecurringPaymentSummaryItem, interval, billing agreement and management URL",
43
+ "States the one-advanced-type-per-request rule and splits the checkout into several requests",
44
+ "Sets supportsCouponCode and implements didChangeCouponCode",
45
+ "Replies with PKPaymentRequestCouponCodeUpdate including shippingMethods",
46
+ "Uses PKPaymentTokenContext with merchant identifier, external identifier, name, domain and NSDecimalNumber amounts",
47
+ "Uses PKDeferredPaymentRequest with a deferred date, free cancellation date and time zone, and a management URL",
48
+ "Does not implement FinanceKit or StoreKit for this flow"
48
49
  ]
49
50
  }
50
51
  ]
51
- }
52
+ }
@@ -1,304 +1,237 @@
1
- # PassKit Extended Patterns
1
+ # Wallet Passes and Advanced Apple Pay
2
2
 
3
- Overflow reference for the `passkit` skill. Contains advanced patterns that exceed the main skill file's scope.
3
+ Reference for the `passkit-wallet` skill: advanced payment request types,
4
+ pass bundles, pass updates and a complete SwiftUI checkout.
4
5
 
5
- A single `PKPaymentRequest` can set only one optional advanced payment request
6
- type, such as `recurringPaymentRequest`, `automaticReloadPaymentRequest`,
7
- `deferredPaymentRequest`, Apple Pay Later availability, or
8
- `multiTokenContexts`.
6
+ ## One advanced type per request
9
7
 
10
- ## Contents
8
+ Each `PKPaymentRequest` may set only one of these:
11
9
 
12
- - [Recurring Payment Requests](#recurring-payment-requests)
13
- - [Coupon Code Support](#coupon-code-support)
14
- - [Multi-Merchant Payments](#multi-merchant-payments)
15
- - [Deferred Payments](#deferred-payments)
16
- - [Building Pass Bundles](#building-pass-bundles)
17
- - [Updating Passes with Push Notifications](#updating-passes-with-push-notifications)
18
- - [SwiftUI Payment Flow](#swiftui-payment-flow)
10
+ - `recurringPaymentRequest`
11
+ - `automaticReloadPaymentRequest`
12
+ - `deferredPaymentRequest`
13
+ - the Apple Pay Later availability setting
14
+ - `multiTokenContexts`
19
15
 
20
- ## Recurring Payment Requests
16
+ If a checkout needs two, split it into two requests.
21
17
 
22
- Set up subscription-style recurring payments with `PKRecurringPaymentRequest`.
18
+ ## Recurring payments
23
19
 
24
20
  ```swift
25
- import PassKit
26
-
27
- func createSubscriptionRequest() -> PKPaymentRequest {
28
- let request = PKPaymentRequest()
29
- request.merchantIdentifier = "merchant.com.example.app"
30
- request.countryCode = "US"
31
- request.currencyCode = "USD"
32
- request.supportedNetworks = [.visa, .masterCard, .amex]
33
- request.merchantCapabilities = .threeDSecure
34
-
35
- let monthlyItem = PKRecurringPaymentSummaryItem(
36
- label: "Monthly Subscription",
37
- amount: NSDecimalNumber(string: "9.99")
21
+ func membershipRequest() -> PKPaymentRequest {
22
+ let order = baseRequest()
23
+ let monthly = PKRecurringPaymentSummaryItem(label: "Studio Membership", amount: NSDecimalNumber(string: "29.00"))
24
+ monthly.intervalUnit = .month
25
+ monthly.intervalCount = 1
26
+
27
+ let plan = PKRecurringPaymentRequest(
28
+ paymentDescription: "Monthly studio membership",
29
+ regularBilling: monthly,
30
+ managementURL: URL(string: "https://studio.example.com/account/membership")!
38
31
  )
39
- monthlyItem.intervalUnit = .month
40
- monthlyItem.intervalCount = 1
41
-
42
- request.paymentSummaryItems = [
43
- monthlyItem,
44
- PKPaymentSummaryItem(
45
- label: "My Service",
46
- amount: NSDecimalNumber(string: "9.99")
47
- )
48
- ]
49
-
50
- let recurringRequest = PKRecurringPaymentRequest(
51
- paymentDescription: "Monthly Premium",
52
- regularBilling: monthlyItem,
53
- managementURL: URL(string: "https://example.com/manage")!
54
- )
55
- recurringRequest.billingAgreement = "You will be charged $9.99/month."
56
- request.recurringPaymentRequest = recurringRequest
32
+ plan.billingAgreement = "Billed monthly until you cancel. Cancel any time from your account page."
33
+ order.recurringPaymentRequest = plan
57
34
 
58
- return request
35
+ let total = PKPaymentSummaryItem(label: "Clayworks Studio", amount: monthly.amount)
36
+ order.paymentSummaryItems = [monthly, total]
37
+ return order
59
38
  }
60
39
  ```
61
40
 
62
- ## Coupon Code Support
41
+ The recurring item appears in the summary list and the total follows it. The
42
+ management URL is where the customer changes or cancels the plan. The literal
43
+ URL is force-unwrapped only to keep the sample short.
63
44
 
64
- Enable coupon codes on the payment sheet and handle validation.
65
- `PKPaymentRequestCouponCodeUpdate` requires a `[PKShippingMethod]`; pass current
66
- or updated methods, or `[]` when unchanged.
45
+ ## Coupon codes
67
46
 
68
47
  ```swift
69
- func createRequestWithCoupons() -> PKPaymentRequest {
70
- let request = createPaymentRequest()
71
- request.supportsCouponCode = true
72
- request.couponCode = "" // pre-fill if known
73
- return request
74
- }
75
-
76
- // Handle coupon code entry in the delegate
77
- extension PaymentCoordinator: PKPaymentAuthorizationControllerDelegate {
78
- func paymentAuthorizationController(
79
- _ controller: PKPaymentAuthorizationController,
80
- didChangeCouponCode couponCode: String,
81
- handler completion: @escaping (PKPaymentRequestCouponCodeUpdate) -> Void
82
- ) {
83
- Task {
84
- do {
85
- let discount = try await validateCoupon(couponCode)
86
- let updatedItems = applyDiscount(discount)
87
- completion(PKPaymentRequestCouponCodeUpdate(
88
- errors: nil,
89
- paymentSummaryItems: updatedItems,
90
- shippingMethods: currentShippingMethods
91
- ))
92
- } catch {
93
- let couponError = PKPaymentRequest.paymentCouponCodeInvalidError(
94
- localizedDescription: "Invalid coupon code."
95
- )
96
- completion(PKPaymentRequestCouponCodeUpdate(
97
- errors: [couponError],
98
- paymentSummaryItems: originalItems,
99
- shippingMethods: currentShippingMethods
100
- ))
101
- }
102
- }
103
- }
104
- }
48
+ order.supportsCouponCode = true
49
+ order.couponCode = savedPromo
105
50
  ```
106
51
 
107
- ## Multi-Merchant Payments
108
-
109
- Request separate payment tokens for multiple merchants in one transaction using `PKPaymentTokenContext`.
52
+ `couponCode` is optional and pre-fills the field. Validate changes in the
53
+ delegate. Like the other delegate callbacks it runs on the main actor, so the
54
+ `Task` it starts stays there and can call `reply` and touch `basket`:
110
55
 
111
56
  ```swift
112
- func createMultiMerchantRequest() -> PKPaymentRequest {
113
- let request = PKPaymentRequest()
114
- request.merchantIdentifier = "merchant.com.example.platform"
115
- request.countryCode = "US"
116
- request.currencyCode = "USD"
117
- request.supportedNetworks = [.visa, .masterCard, .amex]
118
- request.merchantCapabilities = .threeDSecure
119
-
120
- request.paymentSummaryItems = [
121
- PKPaymentSummaryItem(
122
- label: "Furniture",
123
- amount: NSDecimalNumber(string: "299.00")
124
- ),
125
- PKPaymentSummaryItem(
126
- label: "Lighting",
127
- amount: NSDecimalNumber(string: "89.00")
128
- ),
129
- PKPaymentSummaryItem(
130
- label: "Home Goods Marketplace",
131
- amount: NSDecimalNumber(string: "388.00")
132
- )
133
- ]
134
-
135
- let furnitureContext = PKPaymentTokenContext(
136
- merchantIdentifier: "merchant.com.example.furniture",
137
- externalIdentifier: "furniture-order-123",
138
- merchantName: "Example Furniture",
139
- merchantDomain: "furniture.example.com",
140
- amount: NSDecimalNumber(string: "299.00")
141
- )
142
-
143
- let lightingContext = PKPaymentTokenContext(
144
- merchantIdentifier: "merchant.com.example.lighting",
145
- externalIdentifier: "lighting-order-456",
146
- merchantName: "Example Lighting",
147
- merchantDomain: "lighting.example.com",
148
- amount: NSDecimalNumber(string: "89.00")
149
- )
150
-
151
- request.multiTokenContexts = [furnitureContext, lightingContext]
152
- return request
57
+ func paymentAuthorizationController(
58
+ _ sheet: PKPaymentAuthorizationController,
59
+ didChangeCouponCode code: String,
60
+ handler reply: @escaping (PKPaymentRequestCouponCodeUpdate) -> Void
61
+ ) {
62
+ Task {
63
+ guard let discount = await Promotions.lookUp(code) else {
64
+ let problem = PKPaymentRequest.paymentCouponCodeInvalidError(localizedDescription: "That code is not valid.")
65
+ reply(PKPaymentRequestCouponCodeUpdate(
66
+ errors: [problem],
67
+ paymentSummaryItems: basket.summaryItems(),
68
+ shippingMethods: basket.shippingMethods
69
+ ))
70
+ return
71
+ }
72
+ basket.apply(discount)
73
+ reply(PKPaymentRequestCouponCodeUpdate(
74
+ errors: nil,
75
+ paymentSummaryItems: basket.summaryItems(),
76
+ shippingMethods: basket.shippingMethods
77
+ ))
78
+ }
153
79
  }
154
80
  ```
155
81
 
156
- ## Deferred Payments
82
+ `shippingMethods` is a required `[PKShippingMethod]` argument. Pass the
83
+ current or recalculated methods, or `[]` when shipping is unchanged. On an
84
+ invalid code, send the original items back with the coupon error.
85
+
86
+ ## Several merchants in one checkout
157
87
 
158
- Set up payments that charge later, such as pre-orders or made-to-order goods.
88
+ A marketplace or booking platform can collect a separate token for each
89
+ merchant it sells for:
159
90
 
160
91
  ```swift
161
- func createDeferredPaymentRequest() -> PKPaymentRequest {
162
- let request = createPaymentRequest()
92
+ let hotel = PKPaymentTokenContext(
93
+ merchantIdentifier: "merchant.com.harborhotel",
94
+ externalIdentifier: "harbor-hotel",
95
+ merchantName: "Harbor Hotel",
96
+ merchantDomain: "harborhotel.example",
97
+ amount: NSDecimalNumber(string: "240.00")
98
+ )
99
+ let tour = PKPaymentTokenContext(
100
+ merchantIdentifier: "merchant.com.baytours",
101
+ externalIdentifier: "bay-tours",
102
+ merchantName: "Bay Tours",
103
+ merchantDomain: "baytours.example",
104
+ amount: NSDecimalNumber(string: "65.00")
105
+ )
106
+ order.multiTokenContexts = [hotel, tour]
107
+ ```
163
108
 
164
- let deferredDate = Calendar.current.date(
165
- byAdding: .day, value: 14, to: Date()
166
- )!
109
+ The request itself keeps the platform's own merchant identifier; each context
110
+ names the merchant that actually receives that part of the payment.
167
111
 
168
- let deferredBilling = PKDeferredPaymentSummaryItem(
169
- label: "Sofa (charged at shipment)",
170
- amount: NSDecimalNumber(string: "299.00")
171
- )
172
- deferredBilling.deferredDate = deferredDate
112
+ ## Deferred payments
173
113
 
174
- let deferredRequest = PKDeferredPaymentRequest(
175
- paymentDescription: "Made-to-order Sofa - Shipment",
176
- deferredBilling: deferredBilling,
177
- managementURL: URL(string: "https://example.com/orders")!
178
- )
179
- deferredRequest.freeCancellationDate = deferredDate
180
- deferredRequest.freeCancellationDateTimeZone = .current
114
+ For charges taken later, such as pre-orders or made-to-order goods:
181
115
 
182
- request.deferredPaymentRequest = deferredRequest
183
- return request
184
- }
116
+ ```swift
117
+ let balance = PKDeferredPaymentSummaryItem(label: "Custom Table (due at delivery)", amount: NSDecimalNumber(string: "480.00"))
118
+ balance.deferredDate = deliveryDate
119
+
120
+ let deferred = PKDeferredPaymentRequest(
121
+ paymentDescription: "Handmade oak table",
122
+ deferredBilling: balance,
123
+ managementURL: URL(string: "https://workshop.example.com/orders")!
124
+ )
125
+ deferred.freeCancellationDate = deliveryDate.addingTimeInterval(-7 * 24 * 60 * 60)
126
+ deferred.freeCancellationDateTimeZone = TimeZone(identifier: "America/Chicago")
127
+ order.deferredPaymentRequest = deferred
185
128
  ```
186
129
 
187
- ## Building Pass Bundles
130
+ State when the charge happens, until when the order can be cancelled for
131
+ free, and where the customer manages it.
188
132
 
189
- A distributable pass is a signed `.pkpass` bundle. Keep the app-side PassKit
190
- code separate from server-side pass generation, but check these fields when a
191
- pass fails to add:
133
+ ## Pass bundles
192
134
 
193
- - `passTypeIdentifier` matches the Pass Type ID certificate.
194
- - `teamIdentifier` matches the Apple Developer team that owns the certificate.
195
- - `serialNumber` is unique for that pass type; updating a pass uses the same
196
- `passTypeIdentifier` and `serialNumber`.
197
- - `manifest.json` includes SHA-1 hashes for every source file, and `signature`
198
- is a PKCS #7 detached signature over the manifest.
199
- - `.pkpasses` bundles contain up to 10 `.pkpass` files and use the
200
- `application/vnd.apple.pkpasses` MIME type.
135
+ A pass that can be distributed is a signed `.pkpass` bundle. Generating and
136
+ signing it is server work; keep that code out of the app.
201
137
 
202
- ## Updating Passes with Push Notifications
138
+ | Field or file | Rule |
139
+ |---------------|------|
140
+ | `passTypeIdentifier` | Must match the Pass Type ID certificate used to sign |
141
+ | `teamIdentifier` | Must match the developer team that owns that Pass Type ID |
142
+ | `serialNumber` | Unique within the pass type; an update keeps both the pass type and the serial |
143
+ | `manifest.json` | SHA-1 hash of every file in the bundle |
144
+ | `signature` | Detached PKCS #7 signature over the manifest |
203
145
 
204
- Passes in Wallet can receive push notifications to trigger an update. The flow:
146
+ A `.pkpasses` bundle groups up to 10 `.pkpass` files and is served as
147
+ `application/vnd.apple.pkpasses`.
205
148
 
206
- 1. The pass JSON includes a `webServiceURL` and `authenticationToken`
207
- 2. When the pass is added to Wallet, the device registers with your server
208
- 3. To update, send a production APNs pass-update push with an empty JSON payload
209
- 4. The device calls your `webServiceURL` to fetch the updated `.pkpass` bundle
149
+ ## Keeping passes current
210
150
 
211
- The pass-update web service authenticates registration, unregister, and pass
212
- download requests with `authenticationToken`; use the device library identifier
213
- when returning the serial numbers of updated passes. You can update any pass
214
- contents except the authentication token and serial number.
151
+ 1. The pass JSON includes `webServiceURL` and `authenticationToken`.
152
+ 2. When the user adds the pass, the device registers with your web service.
153
+ 3. When the pass changes, your server sends a pass-update push through
154
+ production APNs with an empty JSON payload.
155
+ 4. The device asks the web service which passes changed and downloads the new
156
+ `.pkpass` from `webServiceURL`.
215
157
 
216
- ### Server Endpoints (your web service must implement)
158
+ The web service checks `authenticationToken` on register, unregister and
159
+ download calls, and uses the device library identifier to answer which serial
160
+ numbers changed. Everything in a pass may change except its authentication
161
+ token and serial number.
217
162
 
218
- | Method | Path | Purpose |
219
- |---|---|---|
220
- | POST | `/v1/devices/{deviceId}/registrations/{passTypeId}/{serialNumber}` | Register device for updates |
221
- | DELETE | `/v1/devices/{deviceId}/registrations/{passTypeId}/{serialNumber}` | Unregister device |
222
- | GET | `/v1/devices/{deviceId}/registrations/{passTypeId}` | Get serial numbers of updated passes |
223
- | GET | `/v1/passes/{passTypeId}/{serialNumber}` | Download the latest pass |
163
+ | Method and path | Purpose |
164
+ |-----------------|---------|
165
+ | `POST /v1/devices/{deviceId}/registrations/{passTypeId}/{serialNumber}` | Register a device for a pass |
166
+ | `DELETE /v1/devices/{deviceId}/registrations/{passTypeId}/{serialNumber}` | Unregister |
167
+ | `GET /v1/devices/{deviceId}/registrations/{passTypeId}` | Serial numbers that changed |
168
+ | `GET /v1/passes/{passTypeId}/{serialNumber}` | The latest version of a pass |
224
169
 
225
- ### Checking for Updates In-App
170
+ ### Updating from inside the app
226
171
 
227
172
  ```swift
228
- import PassKit
229
-
230
- let library = PKPassLibrary()
231
-
232
- // Replace an existing pass with updated data
233
- func updatePass(newPassData: Data) {
234
- guard let updatedPass = try? PKPass(data: newPassData) else { return }
235
- if library.containsPass(updatedPass) {
236
- let replaced = library.replacePass(with: updatedPass)
237
- if !replaced {
238
- // Fall back to add-pass UI or report a recoverable update failure.
173
+ @MainActor
174
+ func install(_ fresh: PKPass, presenter: UIViewController) {
175
+ let library = PKPassLibrary()
176
+ if library.containsPass(fresh) {
177
+ guard library.replacePass(with: fresh) else {
178
+ showRetryableWalletError()
179
+ return
239
180
  }
181
+ } else if let sheet = PKAddPassesViewController(pass: fresh) {
182
+ presenter.present(sheet, animated: true)
240
183
  }
241
184
  }
242
185
  ```
243
186
 
244
- ## SwiftUI Payment Flow
187
+ When `replacePass(with:)` returns `false`, fall back to the add-pass sheet or
188
+ tell the user the update can be retried.
245
189
 
246
- A complete SwiftUI payment view with availability check, button, and processing.
190
+ ## SwiftUI checkout screen
247
191
 
248
192
  ```swift
249
- import SwiftUI
250
- import PassKit
193
+ enum PaymentState: Equatable {
194
+ case idle, processing, paid
195
+ case failed(String)
196
+ }
251
197
 
252
- struct PaymentView: View {
253
- @State private var paymentStatus: PaymentStatus = .idle
254
- @State private var coordinator: PaymentCoordinator?
198
+ struct CheckoutScreen: View {
199
+ @State private var coordinator = PaymentCoordinator()
200
+ @State private var state: PaymentState = .idle
255
201
 
256
202
  private var canPay: Bool {
257
203
  PKPaymentAuthorizationController.canMakePayments(
258
- usingNetworks: [.visa, .masterCard, .amex],
204
+ usingNetworks: Checkout.networks,
259
205
  capabilities: .threeDSecure
260
206
  )
261
207
  }
262
208
 
263
209
  var body: some View {
264
- VStack {
265
- OrderSummaryView()
266
-
210
+ VStack(spacing: 16) {
267
211
  if canPay {
268
- PayWithApplePayButton(.buy) {
269
- processPayment()
270
- }
271
- .payWithApplePayButtonStyle(.black)
272
- .frame(height: 48)
212
+ PayWithApplePayButton(.checkout) { startApplePay() }
213
+ .frame(height: 50)
273
214
  } else {
274
- Button("Checkout with Card") {
275
- // Fallback payment flow
276
- }
277
- .buttonStyle(.borderedProminent)
215
+ Button("Pay with Card") { showCardForm() }
216
+ .buttonStyle(.borderedProminent)
278
217
  }
279
-
280
- if case .error(let message) = paymentStatus {
281
- Text(message)
282
- .foregroundStyle(.red)
283
- .font(.caption)
218
+ if case .failed(let reason) = state {
219
+ Text(reason).foregroundStyle(.red)
284
220
  }
285
221
  }
286
222
  .padding()
287
223
  }
288
224
 
289
225
  @MainActor
290
- private func processPayment() {
291
- coordinator = PaymentCoordinator { result in
292
- paymentStatus = result
293
- }
294
- coordinator?.startPayment()
226
+ private func startApplePay() {
227
+ state = .processing
228
+ coordinator.pay()
295
229
  }
296
- }
297
230
 
298
- enum PaymentStatus {
299
- case idle
300
- case processing
301
- case success
302
- case error(String)
231
+ private func showCardForm() {}
303
232
  }
304
233
  ```
234
+
235
+ The coordinator lives in `@State` so it, and the controller it retains, stay
236
+ alive while the sheet is shown. `PaymentState` covers idle, processing, paid
237
+ and a failure with a message.