@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +0 -10
  3. package/docs/facts.json +1 -1
  4. package/manifest.json +285 -285
  5. package/package.json +3 -3
  6. package/pipeline/lib/redact.mjs +3 -2
  7. package/pipeline/scripts/_notices.mjs +1 -1
  8. package/pipeline/scripts/gen-skills-index.mjs +13 -1
  9. package/pipeline/scripts/pre-commit-check.sh +4 -0
  10. package/pipeline/skills/.skill-manifest.json +69 -69
  11. package/pipeline/skills/shared/README.md +70 -70
  12. package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
  13. package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
  14. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
  15. package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
  16. package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
  17. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
  18. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
  19. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
  20. package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
  21. package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
  22. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
  23. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +345 -277
  24. package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
  25. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +107 -121
  26. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +145 -165
  27. package/pipeline/skills/shared/external/app-store-review/SKILL.md +306 -326
  28. package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
  29. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
  30. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
  31. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +335 -360
  32. package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
  33. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
  34. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
  35. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
  36. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
  37. package/pipeline/skills/shared/external/authentication/SKILL.md +277 -381
  38. package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
  39. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +135 -178
  40. package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
  41. package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
  42. package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
  43. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
  44. package/pipeline/skills/shared/external/background-processing/SKILL.md +274 -384
  45. package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
  46. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +173 -321
  47. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
  48. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
  49. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
  50. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
  51. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
  52. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
  53. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
  54. package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
  55. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
  56. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +228 -376
  57. package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
  58. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
  59. package/pipeline/skills/shared/external/core-data/SKILL.md +302 -368
  60. package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
  61. package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
  62. package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
  63. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
  64. package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
  65. package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
  66. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
  67. package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
  68. package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
  69. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
  70. package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
  71. package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
  72. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
  73. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
  74. package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
  75. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
  76. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
  77. package/pipeline/skills/shared/external/device-integrity/SKILL.md +236 -353
  78. package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
  79. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
  80. package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
  81. package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
  82. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
  83. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
  84. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
  85. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
  86. package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
  87. package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
  88. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
  89. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
  90. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
  91. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
  92. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
  93. package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
  94. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
  95. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
  96. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
  97. package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
  98. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
  99. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
  100. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
  101. package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
  102. package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
  103. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
  104. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
  105. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
  106. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
  107. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
  108. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
  109. package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
  110. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
  111. package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
  112. package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
  113. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
  114. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +3 -3
  115. package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +1 -1
  116. package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +8 -7
  117. package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +2 -2
  118. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +5 -2
  119. package/pipeline/skills/shared/external/localization-reuse-map/scripts/_shared.py +100 -0
  120. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +45 -26
  121. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +14 -16
  122. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +12 -5
  123. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +2 -1
  124. package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +6 -5
  125. package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +44 -18
  126. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +5 -2
  127. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +10 -11
  128. package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +4 -33
  129. package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +12 -59
  130. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +297 -267
  131. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
  132. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
  133. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
  134. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
  135. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
  136. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
  137. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
  138. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
  139. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
  140. package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
  141. package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
  142. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
  143. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
  144. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
  145. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
  146. package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
  147. package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
  148. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
  149. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
  150. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
  151. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
  152. package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
  153. package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
  154. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
  155. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
  156. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
  157. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
  158. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
  159. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
  160. package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
  161. package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
  162. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
  163. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
  164. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
  165. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
  166. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
  167. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
  168. package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
  169. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
  170. package/pipeline/skills/shared/external/skill-creator/template.md +7 -1
  171. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
  172. package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
  173. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
  174. package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
  175. package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
  176. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
  177. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +302 -241
  178. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
  179. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
  180. package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
  181. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
  182. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
  183. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
  184. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
  185. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
  186. package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
  187. package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
  188. package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
  189. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
  190. package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
  191. package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
  192. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +304 -351
  193. package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
  194. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
  195. package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
  196. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
  197. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
  198. package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
  199. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
  200. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
  201. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
  202. package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
  203. package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
  204. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
  205. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
  206. package/pipeline/skills/shared/external/swift-security/SKILL.md +183 -162
  207. package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
  208. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
  209. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +411 -476
  210. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
  211. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
  212. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
  213. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
  214. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
  215. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
  216. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +375 -491
  217. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
  218. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
  219. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
  220. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +397 -457
  221. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
  222. package/pipeline/skills/shared/external/swift-testing/SKILL.md +191 -175
  223. package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
  224. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +81 -84
  225. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
  226. package/pipeline/skills/shared/external/swiftdata/SKILL.md +394 -256
  227. package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
  228. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
  229. package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
  230. package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
  231. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
  232. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
  233. package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
  234. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
  235. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
  236. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
  237. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
  238. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
  239. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
  240. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
  241. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
  242. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
  243. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
  244. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
  245. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
  246. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
  247. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
  248. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
  249. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
  250. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
  251. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +201 -168
  252. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
  253. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +134 -133
  254. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
  255. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +111 -138
  256. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
  257. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
  258. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
  259. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
  260. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
  261. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
  262. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
  263. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
  264. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
  265. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
  266. package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
  267. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
  268. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
  269. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
  270. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
  271. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
  272. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
  273. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
  274. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
  275. package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
  276. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
  277. package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
  278. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
  279. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
  280. package/pipeline/skills/shared/external/weatherkit/SKILL.md +160 -315
  281. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
  282. package/pipeline/skills/shared/external/widgetkit/SKILL.md +224 -288
  283. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +416 -719
  284. 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
  ]