@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
@@ -1,169 +1,269 @@
1
1
  ---
2
2
  name: app-clips
3
- description: "Build iOS App Clips with invocation URLs, App Clip Codes, NFC, QR codes, Safari banners, Maps, Messages, target setup, App Store Connect experiences, size/capability constraints, NSUserActivity routing, SKOverlay promotion, App Group/keychain handoff, ephemeral notifications, location confirmation, and full-app migration. Use when creating App Clips or wiring App Clip invocation, experience configuration, or full-app handoff."
3
+ description: "iOS App Clips: target setup, invocation from NFC, App Clip Codes, QR, Messages, Maps and Safari banners, App Store Connect experiences, size limits and capability constraints, NSUserActivity routing, SKOverlay promotion, App Group or keychain handoff, ephemeral notifications, location confirmation, migration to the full app. Use when building a clip, wiring invocation, configuring experiences or handing off to the full app."
4
4
  metadata:
5
- source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
5
+ source: multi-agent-pipeline
6
6
  ---
7
7
 
8
8
  # App Clips
9
9
 
10
- Lightweight, instantly available versions of your iOS app for in-the-moment experiences or demos. Targets iOS 26+ / Swift 6.3 unless noted.
11
-
12
- ## Contents
13
-
14
- - [App Clip Target Setup](#app-clip-target-setup)
15
- - [Invocation and Experience Routing](#invocation-and-experience-routing)
16
- - [Size and Capability Decisions](#size-and-capability-decisions)
17
- - [Data, Notifications, and Location](#data-notifications-and-location)
18
- - [Common Mistakes](#common-mistakes)
19
- - [Review Checklist](#review-checklist)
20
- - [References](#references)
21
-
22
- ## App Clip Target Setup
23
-
24
- An App Clip is a **separate target** in the same Xcode project as your full app:
25
-
26
- 1. **File → New → Target → App Clip** - Xcode creates the App Clip target, adds the **Embed App Clip** build phase to the full app target, and wires the association entitlements.
27
- 2. The App Clip bundle ID **must** be prefixed by the full app's bundle ID: `com.example.MyApp.Clip`.
28
- 3. Verify raw entitlement keys when diagnosing archive, signing, or App Store Connect failures:
29
- - App Clip target: `com.apple.developer.on-demand-install-capable`
30
- - App Clip target parent app link: `com.apple.developer.parent-application-identifiers`
31
- - Full app target associated App Clip link: `com.apple.developer.associated-appclip-app-identifiers`
32
-
33
- Use Swift packages or shared source files for code needed by both targets. Add App Clip-specific compile branches with the `APPCLIP` active compilation condition, and avoid linking full-app-only frameworks into the App Clip target.
34
-
35
- ## Invocation and Experience Routing
36
-
37
- Read [`references/routing-and-experiences.md`](references/routing-and-experiences.md) when implementing invocation URL routing, App Store Connect experiences, Local Experiences, Safari Smart App Banners, QR/NFC/App Clip Codes, AASA, or associated domains.
38
-
39
- App Clips receive `NSUserActivityTypeBrowsingWeb` activities. Keep the invocation router shared with the full app because, after installation, the full app replaces the App Clip and receives future invocations.
40
-
41
- - SwiftUI: use `.onContinueUserActivity(NSUserActivityTypeBrowsingWeb)`.
42
- - UIKit cold launch: inspect `connectionOptions.userActivities` in `scene(_:willConnectTo:options:)`.
43
- - UIKit continuation: handle the actual `NSUserActivity` in `scene(_:continue:)`.
44
- - `scene(_:willContinueUserActivityWithType:)` is only advance notice and does not provide the URL.
45
-
46
- Configure the required default App Clip experience in App Store Connect. Use advanced experiences for Maps integration, location association, production App Clip Codes, per-location cards, and precise physical-place routing; demo App Clip Codes can use the short demo App Clip link.
47
-
48
- For custom URLs, add `appclips:example.com` to Associated Domains on both the full app and App Clip targets, and host an AASA file with the App Clip app identifier. For Safari banners, use `app-id`, `app-clip-bundle-id`, and optional `app-clip-display=card`; do not rely on `app-argument` for App Clip launches.
49
-
50
- ## Size and Capability Decisions
51
-
52
- Read [`references/size-capabilities-and-promotion.md`](references/size-capabilities-and-promotion.md) before feasibility reviews or capability audits, and when checking size budgets, measurement, Background Assets, SKOverlay, Live Activities App Clip extension constraints, CloudKit limits, or unsupported capabilities.
53
-
54
- Always measure App Clip size with the App Thinning Size Report. In feasibility reviews, explicitly choose the size limit from deployment target, invocation support, and connectivity: the larger iOS 17+ limit applies to digital-only App Clips where reliable internet is likely; physical invocation or iOS 16 support uses a smaller budget; demo links can use the current 100 MB limit while supporting NFC/QR test invocations, and demo App Clip Codes require the short demo link. Apple has changed App Clip size policy over time, so re-check current App Store Connect and App Clip documentation before release-blocking size decisions.
55
-
56
- Use Background Assets only for content that can arrive after launch without blocking the in-the-moment task, and do not mark App Clip background asset downloads as essential. Large bundled media, ML models, catalogs, or downloads that must finish before useful work are poor App Clip fits; state that required pre-task downloads are not acceptable for in-the-moment App Clips, and check download size plus whether any required download blocks useful work. Move those flows to streaming/server-backed content, post-task assets, or the full app. Show `SKOverlay.AppClipConfiguration` or SwiftUI `appStoreOverlay` only after task completion, never as a gate.
57
-
58
- App Clips can use CloudKit public database reads on iOS 16+ with `CloudKit-Anonymous`, but cannot write the public database or use iCloud Documents, key-value storage, private containers, or shared containers. App Clips can offer Live Activities through an App Clip-only widget extension starting in iOS 16. That extension can include only Live Activities and needs the App Clip Extension capability; always include the raw entitlement key `com.apple.developer.on-demand-install-capable` when reviewing this boundary.
59
-
60
- In feasibility reviews, explicitly name unsupported App Clip runtime features instead of summarizing them generically. Always list `SKAdNetwork`, `App Tracking Transparency`, and custom URL schemes when discussing excluded runtime features, alongside App Intents, Background Tasks, background URL sessions, in-app purchases, durable persistent local state, and background/persistent assumptions. Route detailed ActivityKit/WidgetKit Live Activity work, StoreKit purchase/full-app monetization, BackgroundTasks processing, CloudKit schema or sync beyond public reads, durable credentials, and long-term state to sibling or full-app domains without implementation detail. For product/PM feasibility reviews, stay at the App Clip boundary level: capability fit, size basis, invocation constraints, and handoff destinations. Describe location confirmation, install promotion, App Group/keychain handoff, and Live Activities conceptually. Do not add Swift package decomposition, API symbols such as `APActivationPayload`, `CLCircularRegion`, or `SKOverlay.AppClipConfiguration`, App Group/keychain implementation recipes, or other API-level implementation guidance unless the user asks for implementation.
61
-
62
- ## Data, Notifications, and Location
63
-
64
- Read [`references/data-handoff-notifications-location.md`](references/data-handoff-notifications-location.md) when implementing App Group/full-app migration, keychain or Sign in with Apple handoff, ephemeral notifications, notification relaunch routing, or physical location confirmation.
65
-
66
- Use App Groups/shared containers for non-secret handoff data only. Any target provisioned with the App Group entitlement can read and write the shared container/defaults suite, so it is not a trust boundary. Do not put passwords, refresh tokens, payment credentials, or other secrets there.
67
-
68
- Starting in iOS 15.4, the full app can access keychain items created by its corresponding App Clip only when the App Clip and full app have the correct association entitlements, including the full app's `com.apple.developer.associated-appclip-app-identifiers`. The App Clip cannot read keychain items created by the full app.
69
-
70
- For Sign in with Apple handoff, store the `ASAuthorizationAppleIDCredential.user` identifier and have the full app verify `ASAuthorizationAppleIDProvider.getCredentialState(forUserID:) == .authorized`.
71
-
72
- For ephemeral notifications, set `NSAppClipRequestEphemeralUserNotification` under the App Clip target's `NSAppClip` `Info.plist` dictionary. Authorization can last up to 8 hours after each launch, but users can disable it on the App Clip card, so check notification settings for `.ephemeral` before scheduling. Notification taps relaunch without the original invocation URL, so route multi-experience notifications with APNs `target-content-id` for remote notifications or `UNNotificationContent.targetContentIdentifier` for local notifications. Use a URL matching the relevant App Store Connect advanced App Clip experience, not an arbitrary opaque ID.
73
-
74
- For physical-location confirmation, use `NSUserActivity.appClipActivationPayload` / `APActivationPayload.confirmAcquired(in:)` with a `CLCircularRegion` radius up to 500 meters, and set `NSAppClipRequestLocationConfirmation` under the App Clip target's `NSAppClip` `Info.plist` dictionary, not the full app's. This confirms eligible physical invocations without granting continuous location access.
75
-
76
- ## Common Mistakes
77
-
78
- ### Exceeding the applicable App Clip size limit
79
-
80
- Choose the limit based on deployment target and invocation support. A physically invoked App Clip that supports iOS 16 has a much smaller budget than an iOS 17+ digital-only App Clip. Measure with the App Thinning Size Report after meaningful target changes.
81
-
82
- ### Mixing up App Clip entitlement names
83
-
84
- ```text
85
- App Clip target:
86
- com.apple.developer.on-demand-install-capable
87
- com.apple.developer.parent-application-identifiers
88
-
89
- Full app target:
90
- com.apple.developer.associated-appclip-app-identifiers
10
+ A clip is a tiny, instantly launched piece of an app. Someone scans a code,
11
+ taps a tag or follows a link, finishes one job, and leaves without installing
12
+ anything. This skill is about building one, sending people to the right
13
+ screen, staying under its limits, and passing them on to the full app.
14
+ Baseline: iOS 26 and Swift 6.3; lower floors are noted where they apply.
15
+
16
+ Deeper material:
17
+
18
+ - `references/routing-and-experiences.md`: URL handling in SwiftUI and UIKit,
19
+ the three kinds of App Store Connect experience, every launch source, Smart
20
+ App Banners, and testing locally.
21
+ - `references/data-handoff-notifications-location.md`: shared containers,
22
+ keychain direction, Sign in with Apple, the 8-hour notification window, and
23
+ proving a physical visit.
24
+ - `references/size-capabilities-and-promotion.md`: an outline for feasibility
25
+ answers, the size tiers, Background Assets, `SKOverlay`, and what the
26
+ platform switches off.
27
+
28
+ ## Setting up the target
29
+
30
+ Add the clip through File > New > Target > App Clip, inside the project that
31
+ already holds the full app. Xcode creates the target, gives the full app an
32
+ "Embed App Clip" build phase, and fills in the entitlements that link the two.
33
+
34
+ The clip's bundle identifier must extend the parent's: `org.example.Tickets`
35
+ pairs with `org.example.Tickets.Clip`.
36
+
37
+ When archiving, signing or App Store Connect validation fails, look at the raw
38
+ keys rather than Xcode's display names:
39
+
40
+ | Holder | Raw entitlement |
41
+ |---|---|
42
+ | Clip | `com.apple.developer.on-demand-install-capable` |
43
+ | Clip | `com.apple.developer.parent-application-identifiers` |
44
+ | Full app | `com.apple.developer.associated-appclip-app-identifiers` |
45
+
46
+ Share logic through Swift packages or source files that both targets compile,
47
+ and fence clip-only code with `#if APPCLIP`. Frameworks that only the full app
48
+ uses stay out of the clip's link phase.
49
+
50
+ ## Routing an invocation
51
+
52
+ Launches arrive as an `NSUserActivity` whose type is
53
+ `NSUserActivityTypeBrowsingWeb`; its `webpageURL` identifies what to show.
54
+ Keep that parsing in shared code. After installation the full app takes the
55
+ clip's place, and the very same links then open the full app.
56
+
57
+ | UI stack | Where the URL shows up |
58
+ |---|---|
59
+ | SwiftUI | `.onContinueUserActivity(NSUserActivityTypeBrowsingWeb)` |
60
+ | UIKit, first launch | `connectionOptions.userActivities`, read in `scene(_:willConnectTo:options:)` |
61
+ | UIKit, already running | the activity passed to `scene(_:continue:)` |
62
+
63
+ The callback `scene(_:willContinueUserActivityWithType:)` is merely a heads-up that an
64
+ activity is on its way; it has no URL, so nothing should route from it.
65
+
66
+ ```swift
67
+ import SwiftUI
68
+
69
+ @main
70
+ struct TicketsClip: App {
71
+ @State private var router = VisitRouter()
72
+
73
+ var body: some Scene {
74
+ WindowGroup {
75
+ VisitScreen(router: router)
76
+ .onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { launch in
77
+ if let link = launch.webpageURL {
78
+ router.open(link)
79
+ }
80
+ }
81
+ }
82
+ }
83
+ }
91
84
  ```
92
85
 
93
- Display names in Xcode differ from raw entitlement keys; use raw keys when debugging signing output or archived entitlements.
94
-
95
- ### Treating UIKit continuation notification as URL handling
96
-
97
- `scene(_:willContinueUserActivityWithType:)` does not include the `NSUserActivity`. Handle the URL in `scene(_:willConnectTo:options:)` for cold launch and `scene(_:continue:)` for activity continuation.
98
-
99
- ### Not testing invocation URLs locally
100
-
101
- A direct Xcode launch can skip the invocation path and hide routing bugs. Use the `_XCAppClipURL` scheme environment variable or register a Local Experience in Settings → Developer → Local Experiences.
102
-
103
- ### Not handling the full app replacing the App Clip
104
-
105
- Share invocation routing with the full app. After install, all future invocations go to the full app.
106
-
107
- ### Storing secrets in App Group storage
108
-
109
- Use App Groups for non-secret handoff state only. Use keychain or server-side verification for credentials.
110
-
111
- ### Designing a marketing-only or web-view-heavy App Clip
112
-
113
- App Clips should let people complete a focused task or full demo without installing the app. Avoid marketing-only clips, ad-heavy flows, splash screens, launch-blocking downloads, repeated install prompts, and web-view-heavy experiences that would work better as a website.
114
-
115
- ### Missing associated domains configuration
116
-
117
- Add `appclips:example.com` to Associated Domains on both the full app and App Clip targets, and host `/.well-known/apple-app-site-association` with the App Clip app identifier for custom URL invocations and advanced experiences.
118
-
119
- ## Review Checklist
120
-
121
- - [ ] App Clip target bundle ID is prefixed by the full app's bundle ID.
122
- - [ ] App Clip target has `com.apple.developer.on-demand-install-capable`.
123
- - [ ] App Clip target has `com.apple.developer.parent-application-identifiers`.
124
- - [ ] Full app target has `com.apple.developer.associated-appclip-app-identifiers`.
125
- - [ ] Shared code uses Swift packages or compilation conditions (`APPCLIP`).
126
- - [ ] SwiftUI uses `.onContinueUserActivity(NSUserActivityTypeBrowsingWeb)` for invocation routing.
127
- - [ ] UIKit cold launch checks `connectionOptions.userActivities` and continuation handles `scene(_:continue:)`.
128
- - [ ] Full app handles every invocation URL the App Clip supports.
129
- - [ ] App Thinning Size Report confirms the binary is within the limit for deployment target and invocation support; size reviews name the 10 MB, 15 MB, and current 100 MB tiers when size is at issue.
130
- - [ ] Associated Domains entitlement includes `appclips:yourdomain.com` on both full app and App Clip targets when using custom URLs.
131
- - [ ] AASA file is hosted at `/.well-known/apple-app-site-association` when using custom URLs.
132
- - [ ] Default App Clip experience is configured in App Store Connect.
133
- - [ ] Production App Clip Codes, Maps, or per-location cards use advanced experiences; demo App Clip Codes use the short demo link.
134
- - [ ] Live Activities, when mentioned, are limited to an App Clip-only widget extension with only Live Activities and the raw `com.apple.developer.on-demand-install-capable` entitlement.
135
- - [ ] Shared App Group storage contains only non-secret data the full app needs, never credentials or payment secrets.
136
- - [ ] Keychain handoff states the one-way rule: the full app can read App Clip-created items on iOS 15.4+ with correct association entitlements, but the App Clip cannot read full-app keychain items.
137
- - [ ] Sign in with Apple migration verifies credential state in the full app.
138
- - [ ] `SKOverlay` / `appStoreOverlay` appears after task completion, never as a gate.
139
- - [ ] `NSAppClipRequestLocationConfirmation` is set only in the App Clip target if using location confirmation.
140
- - [ ] Ephemeral notification code checks for `.ephemeral` authorization before scheduling because the card permission can be disabled.
141
- - [ ] Ephemeral notification routing handles relaunch without an invocation URL.
142
- - [ ] HIG review rejects marketing-only, ad-heavy, web-view-heavy, install-gated, or launch-blocking App Clip designs.
143
- - [ ] Unsupported runtime features are named explicitly, including durable persistent local state and background/persistent assumptions, not just unavailable frameworks.
144
- - [ ] No reliance on background processing, restricted frameworks, custom URL schemes, in-app purchases, or persistent local storage.
145
- - [ ] Sibling handoff is boundary-only, with no ActivityKit, StoreKit, BackgroundTasks, CloudKit, Swift package, App Group/keychain recipe, location-confirmation API symbol, `SKOverlay`, or framework-snippet implementation detail in App Clip feasibility answers.
146
- - [ ] Tested with Local Experiences and `_XCAppClipURL`.
147
-
148
- ## References
149
-
150
- - [Routing and experiences](references/routing-and-experiences.md)
151
- - [Data handoff, notifications, and location](references/data-handoff-notifications-location.md)
152
- - [Size, capabilities, and promotion](references/size-capabilities-and-promotion.md)
153
- - [App Clips framework](https://sosumi.ai/documentation/appclip/)
154
- - [Creating an App Clip with Xcode](https://sosumi.ai/documentation/appclip/creating-an-app-clip-with-xcode/)
155
- - [Configuring App Clip experiences](https://sosumi.ai/documentation/appclip/configuring-the-launch-experience-of-your-app-clip/)
156
- - [Responding to invocations](https://sosumi.ai/documentation/appclip/responding-to-invocations/)
157
- - [Choosing the right functionality](https://sosumi.ai/documentation/appclip/choosing-the-right-functionality-for-your-app-clip/)
158
- - [Confirming a person's physical location](https://sosumi.ai/documentation/appclip/confirming-a-person-s-physical-location/)
159
- - [Sharing data between App Clip and full app](https://sosumi.ai/documentation/appclip/sharing-data-between-your-app-clip-and-your-full-app/)
160
- - [Enabling notifications in App Clips](https://sosumi.ai/documentation/appclip/enabling-notifications-in-app-clips/)
161
- - [Supporting invocations from your website and the Messages app](https://sosumi.ai/documentation/appclip/supporting-invocations-from-your-website-and-the-messages-app/)
162
- - [Offering Live Activities with your App Clip](https://sosumi.ai/documentation/appclip/offering-live-activities-with-your-app-clip/)
163
- - [Recommending your app to App Clip users](https://sosumi.ai/documentation/appclip/recommending-your-app-to-app-clip-users/)
164
- - [APActivationPayload](https://sosumi.ai/documentation/appclip/apactivationpayload/)
165
- - [SKOverlay.AppClipConfiguration](https://sosumi.ai/documentation/storekit/skoverlay/appclipconfiguration/)
166
- - [NSUserActivityTypeBrowsingWeb](https://sosumi.ai/documentation/foundation/nsuseractivitytypebrowsingweb/)
167
- - [Creating App Clip Codes](https://sosumi.ai/documentation/appclip/creating-app-clip-codes/)
168
- - [Distributing your App Clip](https://sosumi.ai/documentation/appclip/distributing-your-app-clip/)
169
- - [App Clips HIG](https://sosumi.ai/design/human-interface-guidelines/app-clips/)
86
+ `VisitRouter` and `VisitScreen` are shared types; see the routing reference.
87
+
88
+ App Store Connect side:
89
+
90
+ - Every clip needs a default experience.
91
+ - Advanced experiences exist for Maps placement, tying the clip to a place,
92
+ App Clip Codes used in production, a card per location, and precise routing
93
+ at a venue.
94
+ - Demo App Clip Codes are generated from the short variant of the demo link.
95
+ - For your own domain, list `appclips:example.com` under Associated Domains in
96
+ the clip and in the full app, and publish an `apple-app-site-association`
97
+ file there that names the clip.
98
+ - A Safari banner's meta tag names the app through `app-id`, the clip through
99
+ `app-clip-bundle-id`, and asks for the card with `app-clip-display=card`.
100
+ `app-argument` is defined for full-app banners, so clip routing cannot
101
+ depend on it.
102
+
103
+ ## Size and capability decisions
104
+
105
+ Size:
106
+
107
+ - Read the number from the App Thinning Size Report; never estimate.
108
+ - In a feasibility answer, say which limit applies and why, based on the
109
+ oldest supported iOS version, the launch sources, and whether the setting
110
+ offers dependable internet.
111
+ - 100 MB is available only on iOS 17 and later, for clips launched digitally
112
+ where a good connection is expected. Physical launch sources or iOS 16
113
+ support shrink the budget, and iOS 15 support shrinks it further.
114
+ - Through the demo link, a clip may still use 100 MB and accept NFC and QR
115
+ tests; demo codes must be generated from the short demo link.
116
+ - These figures have moved before. Re-read the current App Clip and App Store
117
+ Connect pages before a size ruling holds up a release.
118
+
119
+ Downloads:
120
+
121
+ - Background Assets are for material that can land after launch while the
122
+ task proceeds, and the clip may not flag any of it as essential.
123
+ - Big bundled media, ML models, product catalogs, and anything required before
124
+ the task can begin are a bad match. State plainly that a mandatory download
125
+ in front of the task is not acceptable, and check both how large downloads
126
+ are and whether one blocks the task. Serve that content from a server or
127
+ stream, fetch it after the task, or leave it to the full app.
128
+
129
+ Promotion: show `SKOverlay.AppClipConfiguration` (UIKit) or `appStoreOverlay`
130
+ (SwiftUI) once the task has succeeded. It must never stand between the person
131
+ and the task.
132
+
133
+ Platform boundaries:
134
+
135
+ - CloudKit: from iOS 16 the clip may read the public database using the
136
+ `CloudKit-Anonymous` service. Writing to it, document storage in iCloud,
137
+ the iCloud key-value store, and private or shared containers are all
138
+ unavailable.
139
+ - Live Activities: supported from iOS 16 (ActivityKit's own APIs start at
140
+ 16.1) through a widget extension embedded only in the clip. That extension
141
+ holds Live Activities and nothing else, and it must carry the App Clip
142
+ Extension capability; in a review, name its raw key,
143
+ `com.apple.developer.on-demand-install-capable`.
144
+ - In any feasibility answer, list as unavailable: App Intents,
145
+ `SKAdNetwork`, custom URL schemes, `App Tracking Transparency`, Background
146
+ Tasks, in-app purchase, background URL sessions, state that must persist
147
+ locally, and anything that assumes background or long-lived execution.
148
+
149
+ Depth for product reviews:
150
+
151
+ - Send these elsewhere without implementation detail: Live Activity code
152
+ (ActivityKit, WidgetKit), purchasing and monetization (StoreKit), background
153
+ work (BackgroundTasks), CloudKit schema or sync past public reads, long-lived
154
+ credentials and long-term state (the full app).
155
+ - A PM feasibility answer covers capability fit, which size tier and why,
156
+ invocation limits, and who owns each handoff. Confirming location, promoting
157
+ the install, App Group or keychain handoff and Live Activities are explained
158
+ as concepts.
159
+ - Such an answer leaves out package structure, type names like
160
+ `APActivationPayload`, `CLCircularRegion` and
161
+ `SKOverlay.AppClipConfiguration`, App Group or keychain code, and other
162
+ API-level material, unless someone asks for the implementation.
163
+
164
+ ## Data, notifications, location
165
+
166
+ - **Shared container.** App Groups carry only data that may be read by anyone
167
+ holding the group entitlement, because every such target can read and write
168
+ both the container and the shared defaults suite. It is a convenience, not a
169
+ security boundary: no passwords, refresh tokens, payment data or other
170
+ secrets.
171
+ - **Keychain.** Items the clip wrote become readable by the full app on iOS
172
+ 15.4 and later, as long as the linking entitlements are in place (on the
173
+ full app's side that means `com.apple.developer.associated-appclip-app-identifiers`). The reverse
174
+ never works: the clip cannot see the full app's items.
175
+ - **Sign in with Apple.** Keep the credential's `user` identifier
176
+ (`ASAuthorizationAppleIDCredential.user`) in the shared container; the full
177
+ app asks `ASAuthorizationAppleIDProvider.getCredentialState(forUserID:)` and
178
+ proceeds only on `.authorized`.
179
+ - **Ephemeral notifications.** Put `NSAppClipRequestEphemeralUserNotification`
180
+ inside the `NSAppClip` dictionary of the clip's Info.plist. The permission
181
+ covers a window of up to 8 hours following every launch, and the person may
182
+ disable it from the card, so read the settings and require `.ephemeral`
183
+ before scheduling anything.
184
+ - **Relaunch from a notification.** The clip comes back with no invocation
185
+ URL. To steer to the correct experience, give remote pushes a
186
+ `target-content-id` and local ones a
187
+ `UNNotificationContent.targetContentIdentifier` whose value is a URL
188
+ matching an advanced experience, never a made-up identifier.
189
+ - **Location confirmation.** Read `NSUserActivity.appClipActivationPayload`,
190
+ build a `CLCircularRegion`, and pass it to
191
+ `APActivationPayload.confirmAcquired(in:)`; the region's radius is 500 m or less. The flag
192
+ `NSAppClipRequestLocationConfirmation` belongs in the clip target's
193
+ `NSAppClip` dictionary, never the full app's. The check verifies that an
194
+ eligible physical launch happened at the place; it does not grant ongoing
195
+ location access.
196
+
197
+ ## Common mistakes
198
+
199
+ 1. **Exceeding the budget.** A clip launched from physical codes that still
200
+ runs on iOS 16 has a fraction of the room of an iOS 17+, link-only clip.
201
+ Measure again after every substantial change.
202
+ 2. **Confusing entitlements.** Xcode's labels hide the raw keys. Two belong on
203
+ the clip (install-capable, parent identifiers) and one on the full app
204
+ (associated clip identifiers); see the table above.
205
+ 3. **Routing from the advance notice.**
206
+ `scene(_:willContinueUserActivityWithType:)` has no activity to read.
207
+ 4. **Never testing a real invocation.** Running the scheme straight from
208
+ Xcode may bypass the launch path and mask routing faults. Use the
209
+ `_XCAppClipURL` scheme variable or a Local Experience (Settings > Developer
210
+ > Local Experiences).
211
+ 5. **Ignoring the replacement.** Once installed, the full app answers the
212
+ clip's links; give it the same router.
213
+ 6. **Secrets in the group container.** Credentials go to the keychain or are
214
+ verified on the server.
215
+ 7. **A clip that only advertises.** People should complete a focused task, or
216
+ try a complete demo, without installing. Skip ads, splash screens,
217
+ downloads that hold up launch, repeated install nags, and flows that are
218
+ really a website in a web view.
219
+ 8. **No associated domains.** Custom URLs and advanced experiences fail
220
+ without an `appclips:` entry in each target and a published association
221
+ file (path `/.well-known/apple-app-site-association`) naming the clip.
222
+
223
+ ## Review checklist
224
+
225
+ - [ ] Clip bundle ID extends the parent app's bundle ID
226
+ - [ ] Both clip entitlements and the full app's association entitlement present (table above)
227
+ - [ ] Shared logic lives in packages or behind `APPCLIP`
228
+ - [ ] SwiftUI uses `.onContinueUserActivity(NSUserActivityTypeBrowsingWeb)`
229
+ - [ ] UIKit covers cold launch via `connectionOptions.userActivities` and warm launch via `scene(_:continue:)`
230
+ - [ ] Every clip URL also opens correctly in the full app
231
+ - [ ] Size confirmed in the thinning report for the chosen OS floor and launch sources; the answer names all three tiers (10, 15 and 100 MB)
232
+ - [ ] `appclips:` domain entry in both targets when custom URLs are used
233
+ - [ ] Association file served from `/.well-known/apple-app-site-association`
234
+ - [ ] Default experience set up in App Store Connect
235
+ - [ ] Advanced experiences behind production codes, Maps and per-place cards; demo codes built from the short demo link
236
+ - [ ] Any Live Activity lives in a clip-only widget extension containing only Live Activities, with the install-capable key
237
+ - [ ] Group container holds nothing secret
238
+ - [ ] Keychain direction spelled out (full app reads clip items from iOS 15.4 with the entitlements; never the other way)
239
+ - [ ] Full app checks the Apple ID credential state before trusting a clip sign-in
240
+ - [ ] Install overlay shown only after success, never as a gate
241
+ - [ ] Location-confirmation flag only in the clip's Info.plist
242
+ - [ ] Notification code requires `.ephemeral` before scheduling
243
+ - [ ] Notification relaunches without a URL are routed correctly
244
+ - [ ] Design review turns down marketing-only, ad-filled, web-view, install-first and launch-blocking flows
245
+ - [ ] Unavailable runtime features listed, including local persistence and background or long-running assumptions
246
+ - [ ] Nothing relies on background execution, restricted frameworks, custom schemes, IAP or durable local storage
247
+ - [ ] Feasibility answers keep sibling work at the boundary (no code for ActivityKit, StoreKit, BackgroundTasks, CloudKit, packages, App Groups, keychain, location checks or overlays)
248
+ - [ ] Verified with a Local Experience and with `_XCAppClipURL`
249
+
250
+ ## Apple documentation
251
+
252
+ All under https://developer.apple.com/documentation/appclip unless noted:
253
+
254
+ - `creating-an-app-clip-with-xcode` (target setup)
255
+ - `configuring-the-launch-experience-of-your-app-clip` (experiences)
256
+ - `responding-to-invocations` (URL handling)
257
+ - `choosing-the-right-functionality-for-your-app-clip` (limits and frameworks)
258
+ - `confirming-a-person-s-physical-location` (activation payload)
259
+ - `sharing-data-between-your-app-clip-and-your-full-app` (containers, keychain)
260
+ - `enabling-notifications-in-app-clips` (8-hour window)
261
+ - `supporting-invocations-from-your-website-and-the-messages-app` (banners)
262
+ - `offering-live-activities-with-your-app-clip` (widget extension)
263
+ - `recommending-your-app-to-app-clip-users` (overlay)
264
+ - `apactivationpayload` (API)
265
+ - `creating-app-clip-codes` (codes)
266
+ - `distributing-your-app-clip` (release)
267
+ - https://developer.apple.com/documentation/storekit/skoverlay/appclipconfiguration
268
+ - https://developer.apple.com/documentation/foundation/nsuseractivitytypebrowsingweb
269
+ - HIG: https://developer.apple.com/design/human-interface-guidelines/app-clips
@@ -3,47 +3,47 @@
3
3
  "evals": [
4
4
  {
5
5
  "id": 0,
6
- "name": "invocation-entitlements-review",
7
- "prompt": "Review this App Clip setup plan before my team implements it. The full app bundle ID is com.example.cafe and the App Clip is com.example.cafe.Clip. We want a default App Clip experience plus per-store advanced experiences, SwiftUI for the App Clip UI, UIKit scene delegates in an older shared module, and we need the full app to handle the same QR/NFC URLs after install. What target setup, entitlements, associated domains, and invocation routing should we require?",
8
- "expected_output": "A review that gives App Clip-specific setup and routing guidance without drifting into unrelated full-app implementation detail.",
6
+ "name": "entitlements-and-routing",
7
+ "prompt": "Check our App Clip setup before we build it. Parent app: com.example.bakery; clip: com.example.bakery.Clip. Experiences: the default one, plus an advanced one for each shop. Clip screens are SwiftUI; the URL routing sits in a UIKit module shared with the parent app. Which entitlements, domain settings and URL entry points do we need?",
8
+ "expected_output": "Lists the three raw entitlements and which target holds each, confirms the bundle ID prefix rule, shows SwiftUI and UIKit routing entry points correctly, requires the full app to handle every clip URL, and covers associated domains on both targets plus the association file.",
9
9
  "files": [],
10
10
  "expectations": [
11
- "Names the App Clip target entitlement `com.apple.developer.on-demand-install-capable` and the parent/full-app association entitlements `com.apple.developer.parent-application-identifiers` and `com.apple.developer.associated-appclip-app-identifiers`.",
12
- "Explains that the App Clip bundle ID must be prefixed by the full app bundle ID.",
13
- "Recommends SwiftUI `.onContinueUserActivity(NSUserActivityTypeBrowsingWeb)` for App Clip URL handling.",
14
- "Distinguishes UIKit cold launch via `scene(_:willConnectTo:options:)` connection options from URL handling in `scene(_:continue:)`, and does not treat `scene(_:willContinueUserActivityWithType:)` as the handler that provides the URL.",
15
- "States that the full app must handle every App Clip invocation URL after installation.",
16
- "Mentions `appclips:` associated domains on both full app and App Clip targets plus AASA hosting for custom URLs or advanced experiences."
11
+ "Assigns two raw keys to the clip (on-demand-install-capable and parent-application-identifiers, with their com.apple.developer. prefix) and associated-appclip-app-identifiers to the parent app",
12
+ "Says the clip identifier has to begin with the parent's identifier, which com.example.bakery.Clip does",
13
+ "Names .onContinueUserActivity(NSUserActivityTypeBrowsingWeb) as the SwiftUI hook",
14
+ "For the UIKit module, takes the cold-launch URL from connectionOptions.userActivities and the warm-launch URL from scene(_:continue:), and explains that the willContinueUserActivityWithType callback carries no URL",
15
+ "Requires the parent app to open every clip link, since it takes the clip's place once installed",
16
+ "Adds appclips: to Associated Domains in both targets and hosts the association file on the domain with the clip listed"
17
17
  ]
18
18
  },
19
19
  {
20
20
  "id": 1,
21
- "name": "data-notifications-location",
22
- "prompt": "We're designing a parking-meter App Clip. It should remember a pending session when the user installs the full app, use Sign in with Apple if available, remind the user by notification shortly after launch, and confirm they're physically near the meter without asking for continuous location. What should we put in the App Clip skill-level implementation checklist?",
23
- "expected_output": "A checklist that covers secure handoff, Sign in with Apple verification, ephemeral notifications, and App Clip location confirmation with correct plist/API boundaries.",
21
+ "name": "handoff-notify-locate",
22
+ "prompt": "We are building a parking-meter App Clip. People pay at a meter by tapping an NFC tag, we want to remind them before the meter runs out, sign-in is via Sign in with Apple, and when they install the full app their account and active session should carry over. We also want to be sure they are really at the meter. How should this work?",
23
+ "expected_output": "Uses App Groups only for non-secret data, migrates Sign in with Apple via the stored user ID and a credential-state check, explains the one-way keychain rule, configures ephemeral notifications correctly, handles relaunch without a URL, and uses location confirmation rather than continuous tracking.",
24
24
  "files": [],
25
25
  "expectations": [
26
- "Recommends App Groups/shared container or shared UserDefaults only for non-secret handoff data, and explicitly says not to store passwords, refresh tokens, or credential secrets there.",
27
- "Explains Sign in with Apple handoff using the shared user identifier plus full-app `ASAuthorizationAppleIDProvider.getCredentialState(forUserID:)` verification for `.authorized`.",
28
- "States that full-app keychain access to App Clip-created items is available only with the right association entitlements on iOS 15.4+ and that the App Clip cannot read full-app keychain items.",
29
- "Names `NSAppClipRequestEphemeralUserNotification` under the App Clip target's `NSAppClip` Info.plist dictionary, notes the up-to-8-hour ephemeral authorization window, and checks for `.ephemeral` authorization before scheduling.",
30
- "Explains that notification relaunch does not include the original invocation URL and should use APNs `target-content-id` or `UNNotificationContent.targetContentIdentifier` for multi-experience routing.",
31
- "Names `NSAppClipRequestLocationConfirmation` under the App Clip target's `NSAppClip` Info.plist dictionary and uses `APActivationPayload`/`appClipActivationPayload` location confirmation rather than continuous location tracking."
26
+ "Keeps only non-sensitive values in the App Group and rules out credentials or secrets there in so many words",
27
+ "Saves the Apple ID user identifier for the parent app, which calls getCredentialState(forUserID:) and proceeds only when the result is .authorized",
28
+ "Explains the keychain is one-directional: the parent app reads items the clip wrote (iOS 15.4 and later, with the linking entitlements), never the reverse",
29
+ "Configures NSAppClipRequestEphemeralUserNotification in the clip's NSAppClip dictionary, notes the permission lasts at most 8 hours from each launch, and tests for .ephemeral status first",
30
+ "Handles relaunches from a notification, which carry no URL, using target-content-id for pushes or targetContentIdentifier for local notifications",
31
+ "Verifies presence at the meter with NSAppClipRequestLocationConfirmation plus the activation payload (appClipActivationPayload, APActivationPayload) rather than tracking location continuously"
32
32
  ]
33
33
  },
34
34
  {
35
35
  "id": 2,
36
- "name": "size-capability-boundary",
37
- "prompt": "A product manager wants an App Clip for venue check-in that includes Live Activities, CloudKit, App Intents, in-app purchases, BackgroundTasks, big bundled media, and maybe a demo link. Write a concise feasibility review that says what belongs in the App Clip, what belongs in sibling/full-app work, and what size/invocation constraints matter.",
38
- "expected_output": "A feasibility review that applies App Clip size and capability limits while preserving sibling-skill boundaries.",
36
+ "name": "feasibility-boundaries",
37
+ "prompt": "PM question about an event check-in App Clip: people scan a QR code on a poster, view the day's schedule and check in. We'd like a Live Activity for the event and some cloud-hosted data; a few people also want in-app upgrade purchases and background refresh. Can this work? Please stay non-technical.",
38
+ "expected_output": "A boundary-level feasibility answer: size tier by iOS version and invocation type, measurement and download warnings, CloudKit read-only scope, Live Activities via a clip-only extension, the excluded capabilities named, and sibling work routed elsewhere without implementation detail.",
39
39
  "files": [],
40
40
  "expectations": [
41
- "States the current App Clip size limits by iOS generation and distinguishes the larger iOS 17+ reliable-internet/digital-only limit from physical invocation and demo-link constraints.",
42
- "Recommends measuring with the App Thinning Size Report and warns against large bundled media or large pre-task downloads.",
43
- "Says CloudKit is limited to public database reads with `CloudKit-Anonymous` on iOS 16+ for App Clips, with no public writes, iCloud Documents, key-value storage, private containers, or shared containers.",
44
- "Explains that App Clip Live Activities require an App Clip-only widget extension that can include only Live Activities and needs the App Clip Extension capability / `com.apple.developer.on-demand-install-capable`.",
45
- "Identifies App Intents, BackgroundTasks, in-app purchases, SKAdNetwork, App Tracking Transparency, custom URL schemes, and persistent/background assumptions as not App Clip runtime features.",
46
- "Routes detailed ActivityKit, WidgetKit, BackgroundTasks, StoreKit purchase, CloudKit schema, and full-app implementation work to sibling/full-app skills instead of expanding App Clip guidance into implementation-level Swift package, App Group/keychain, location-confirmation API symbol, SKOverlay, or framework API details."
41
+ "Walks through the size tiers by iOS version and explains that a QR launch counts as physical, so the 100 MB tier (iOS 17+, digital launches only) does not apply unless the demo link is used",
42
+ "Asks for a thinning-report measurement and cautions against bundling heavy media or requiring downloads before check-in",
43
+ "Keeps CloudKit to reading the public database (iOS 16+, CloudKit-Anonymous) and rules out writes, document or key-value iCloud storage, and private or shared containers",
44
+ "Permits a Live Activity only via a clip-owned widget extension that holds nothing else and has the App Clip Extension capability, naming the on-demand-install-capable key",
45
+ "Lists as unavailable: in-app purchases, Background Tasks, App Intents, custom URL schemes, SKAdNetwork, App Tracking Transparency, and any persistent or background behavior",
46
+ "Hands ActivityKit, WidgetKit, StoreKit, BackgroundTasks, CloudKit and full-app work to their owners with no API names or code"
47
47
  ]
48
48
  }
49
49
  ]