@mmerterden/multi-agent-pipeline 20.6.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 (326) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +0 -10
  3. package/docs/facts.json +1 -1
  4. package/manifest.json +328 -329
  5. package/package.json +2 -2
  6. package/pipeline/multi-agent-refs/features/design-conformance.md +62 -64
  7. package/pipeline/scripts/_notices.mjs +12 -1
  8. package/pipeline/scripts/gen-skills-index.mjs +1 -1
  9. package/pipeline/skills/.skill-manifest.json +106 -106
  10. package/pipeline/skills/shared/README.md +71 -71
  11. package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +1 -0
  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/android-architecture/SKILL.md +2 -0
  16. package/pipeline/skills/shared/external/android-performance/SKILL.md +2 -0
  17. package/pipeline/skills/shared/external/android-security/SKILL.md +2 -0
  18. package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
  19. package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
  20. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
  21. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
  22. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
  23. package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
  24. package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
  25. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
  26. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
  27. package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
  28. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
  29. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
  30. package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
  31. package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
  32. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
  33. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
  34. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
  35. package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
  36. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
  37. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
  38. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
  39. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
  40. package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
  41. package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
  42. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
  43. package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
  44. package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
  45. package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
  46. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
  47. package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
  48. package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
  49. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
  50. package/pipeline/skills/shared/external/backlog/BACKLOG.md +1 -1
  51. package/pipeline/skills/shared/external/backlog/SKILL.md +56 -33
  52. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
  53. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
  54. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
  55. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +1 -0
  56. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
  57. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
  58. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
  59. package/pipeline/skills/shared/external/compose-components/SKILL.md +2 -0
  60. package/pipeline/skills/shared/external/compose-navigation/SKILL.md +3 -2
  61. package/pipeline/skills/shared/external/compose-testing/SKILL.md +2 -0
  62. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
  63. package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
  64. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
  65. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
  66. package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
  67. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
  68. package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
  69. package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
  70. package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
  71. package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
  72. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
  73. package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
  74. package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
  75. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
  76. package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
  77. package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
  78. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
  79. package/pipeline/skills/shared/external/council/SKILL.md +1 -0
  80. package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
  81. package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
  82. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
  83. package/pipeline/skills/shared/external/css-modern/SKILL.md +1 -0
  84. package/pipeline/skills/shared/external/database-patterns/SKILL.md +1 -0
  85. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
  86. package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
  87. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
  88. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
  89. package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
  90. package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
  91. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
  92. package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
  93. package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
  94. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
  95. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
  96. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
  97. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
  98. package/pipeline/skills/shared/external/evidence-github/SKILL.md +2 -0
  99. package/pipeline/skills/shared/external/evidence-registry/SKILL.md +2 -0
  100. package/pipeline/skills/shared/external/gradle-kotlin-dsl/SKILL.md +2 -0
  101. package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
  102. package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
  103. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
  104. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
  105. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
  106. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
  107. package/pipeline/skills/shared/external/html-semantic/SKILL.md +1 -0
  108. package/pipeline/skills/shared/external/humanizer/SKILL.md +1 -0
  109. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
  110. package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
  111. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
  112. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
  113. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
  114. package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +1 -0
  115. package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
  116. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
  117. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
  118. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
  119. package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +1 -0
  120. package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
  121. package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
  122. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
  123. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
  124. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
  125. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
  126. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
  127. package/pipeline/skills/shared/external/ios-security/SKILL.md +2 -0
  128. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
  129. package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
  130. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
  131. package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
  132. package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
  133. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
  134. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +91 -283
  135. package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +119 -151
  136. package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +60 -90
  137. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +119 -156
  138. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +726 -787
  139. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +253 -288
  140. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +243 -304
  141. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +88 -104
  142. package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +181 -235
  143. package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-key-shots.py +198 -263
  144. package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +461 -466
  145. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +145 -151
  146. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +123 -141
  147. package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +146 -157
  148. package/pipeline/skills/shared/external/localization-reuse-map/scripts/snapshot-resources.sh +22 -19
  149. package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +156 -140
  150. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
  151. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
  152. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
  153. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
  154. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
  155. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
  156. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
  157. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
  158. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
  159. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
  160. package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
  161. package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
  162. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
  163. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +1 -0
  164. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
  165. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
  166. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
  167. package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
  168. package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
  169. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
  170. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
  171. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
  172. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
  173. package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
  174. package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
  175. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
  176. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
  177. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
  178. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
  179. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
  180. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
  181. package/pipeline/skills/shared/external/play-store-review/SKILL.md +2 -0
  182. package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
  183. package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
  184. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
  185. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
  186. package/pipeline/skills/shared/external/python-patterns/SKILL.md +1 -0
  187. package/pipeline/skills/shared/external/react-best-practices/SKILL.md +1 -0
  188. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
  189. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
  190. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
  191. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +1 -0
  192. package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +2 -0
  193. package/pipeline/skills/shared/external/room-database/SKILL.md +2 -0
  194. package/pipeline/skills/shared/external/search-first/SKILL.md +1 -0
  195. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
  196. package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
  197. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
  198. package/pipeline/skills/shared/external/signal-community/SKILL.md +2 -0
  199. package/pipeline/skills/shared/external/skill-creator/SKILL.md +80 -41
  200. package/pipeline/skills/shared/external/skill-creator/audit.md +63 -59
  201. package/pipeline/skills/shared/external/skill-creator/checklist.md +28 -20
  202. package/pipeline/skills/shared/external/skill-creator/examples.md +40 -40
  203. package/pipeline/skills/shared/external/skill-creator/label-check.md +48 -36
  204. package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +91 -100
  205. package/pipeline/skills/shared/external/skill-creator/template.md +51 -39
  206. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
  207. package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
  208. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
  209. package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
  210. package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
  211. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
  212. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
  213. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
  214. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
  215. package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
  216. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
  217. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
  218. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
  219. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
  220. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
  221. package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
  222. package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
  223. package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
  224. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
  225. package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
  226. package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
  227. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
  228. package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
  229. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
  230. package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
  231. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
  232. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
  233. package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
  234. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
  235. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
  236. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
  237. package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
  238. package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
  239. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
  240. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
  241. package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
  242. package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
  243. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
  244. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
  245. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
  246. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
  247. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
  248. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
  249. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
  250. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
  251. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
  252. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
  253. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
  254. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
  255. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
  256. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
  257. package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
  258. package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
  259. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
  260. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
  261. package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
  262. package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
  263. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
  264. package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
  265. package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
  266. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
  267. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
  268. package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
  269. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
  270. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
  271. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
  272. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
  273. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
  274. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
  275. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
  276. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
  277. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
  278. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
  279. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
  280. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
  281. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
  282. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
  283. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
  284. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
  285. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
  286. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
  287. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
  288. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
  289. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
  290. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
  291. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
  292. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
  293. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
  294. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
  295. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
  296. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
  297. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
  298. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
  299. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
  300. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
  301. package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
  302. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
  303. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
  304. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
  305. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
  306. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
  307. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
  308. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
  309. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
  310. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +1 -0
  311. package/pipeline/skills/shared/external/testing-backend/SKILL.md +1 -0
  312. package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
  313. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
  314. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +1 -0
  315. package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
  316. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
  317. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
  318. package/pipeline/skills/shared/external/vue-composition/SKILL.md +1 -0
  319. package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
  320. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
  321. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +1 -0
  322. package/pipeline/skills/shared/external/web-performance/SKILL.md +1 -0
  323. package/pipeline/skills/shared/external/web-testing/SKILL.md +1 -0
  324. package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
  325. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
  326. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
@@ -1,444 +1,292 @@
1
1
  ---
2
2
  name: natural-language
3
- description: "Tokenize, tag, and analyze natural language text using Apple's NaturalLanguage framework and translate between languages with the Translation framework. Use when adding language identification, sentiment analysis, named entity recognition, part-of-speech tagging, text embeddings, or in-app translation to iOS/macOS/visionOS apps."
3
+ description: "NaturalLanguage and Translation frameworks: tokenizing, language identification, part-of-speech tagging, named entities, sentiment, word and sentence embeddings, custom NLModel classifiers, translation sheet, TranslationSession, batch translation. Use when analyzing or translating text in-app on iOS, macOS or visionOS."
4
4
  metadata:
5
- source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
5
+ source: multi-agent-pipeline
6
6
  ---
7
7
 
8
- # NaturalLanguage + Translation
9
-
10
- Analyze natural language text for tokenization, part-of-speech tagging, named
11
- entity recognition, sentiment analysis, language identification, and word/sentence
12
- embeddings. Translate text between languages with the Translation framework.
13
- Targets Swift 6.3 / iOS 26+.
14
-
15
- > This skill covers two related frameworks: **NaturalLanguage** (`NLTokenizer`, `NLTagger`, `NLEmbedding`) for on-device text analysis, and **Translation** (`TranslationSession`, `LanguageAvailability`) for language translation.
16
-
17
- **Scope boundary:** Use this skill after you already have text. It owns
18
- tokenization, language identification, POS/NER tagging, sentiment, embeddings,
19
- custom `NLModel` classifiers/taggers, and in-app translation. Hand off OCR to
20
- `vision-framework`, speech-to-text to `speech-recognition`, UI strings and
21
- locale formatting to `ios-localization`, and generative summarization or Apple
22
- Intelligence workflows to `apple-on-device-ai`.
23
-
24
- ## Contents
25
-
26
- - [Setup](#setup)
27
- - [Tokenization](#tokenization)
28
- - [Language Identification](#language-identification)
29
- - [Part-of-Speech Tagging](#part-of-speech-tagging)
30
- - [Named Entity Recognition](#named-entity-recognition)
31
- - [Sentiment Analysis](#sentiment-analysis)
32
- - [Text Embeddings](#text-embeddings)
33
- - [Translation](#translation)
34
- - [Common Mistakes](#common-mistakes)
35
- - [Review Checklist](#review-checklist)
36
- - [References](#references)
37
-
38
- ## Setup
39
-
40
- Import `NaturalLanguage` for text analysis and `Translation` for language
41
- translation. No special entitlements or capabilities are required for
42
- NaturalLanguage. Translation has split availability: system translation
43
- presentation is iOS 17.4+ / macOS 14.4+, while `TranslationSession`,
44
- `.translationTask()`, `LanguageAvailability`, and batch translation require
45
- iOS 18+ / macOS 15+.
46
- Direct `TranslationSession(installedSource:target:)` is the non-UI option, but
47
- only when the source and target languages are already installed on device.
8
+ # NaturalLanguage and Translation
48
9
 
49
- ```swift
50
- import NaturalLanguage
51
- import Translation
52
- ```
10
+ Two frameworks, one job each. NaturalLanguage analyses text on the device:
11
+ tokens, languages, word classes, entities, sentiment, embeddings and custom
12
+ Create ML models. Translation turns text from one language into another,
13
+ either through a system sheet or through a session you drive. Code assumes
14
+ Swift 6.3 and an iOS 26 deployment target.
15
+
16
+ ## Scope
53
17
 
54
- NaturalLanguage classes (`NLTokenizer`, `NLTagger`) are **not thread-safe**.
55
- Use each instance from one thread or dispatch queue at a time.
18
+ This skill starts once you already have text. Hand off elsewhere for:
56
19
 
57
- ## Tokenization
20
+ | Need | Skill |
21
+ |---|---|
22
+ | Reading text out of images (OCR) | `vision-framework` |
23
+ | Turning speech into text | `speech-recognition` |
24
+ | UI strings, String Catalogs, plurals, right-to-left layout, locale formatting | `ios-localization` |
25
+ | Generative summaries and other Apple Intelligence features | `apple-on-device-ai` |
58
26
 
59
- Segment text into words, sentences, or paragraphs with `NLTokenizer`.
27
+ ## Setup and availability
60
28
 
61
29
  ```swift
62
30
  import NaturalLanguage
63
-
64
- func tokenizeWords(in text: String) -> [String] {
65
- let tokenizer = NLTokenizer(unit: .word)
66
- tokenizer.string = text
67
-
68
- let range = text.startIndex..<text.endIndex
69
- return tokenizer.tokens(for: range).map { String(text[$0]) }
70
- }
31
+ import Translation
71
32
  ```
72
33
 
73
- ### Token Units
34
+ NaturalLanguage needs no capability or entitlement. For Translation:
74
35
 
75
- | Unit | Description |
36
+ | API | Minimum |
76
37
  |---|---|
77
- | `.word` | Individual words |
78
- | `.sentence` | Sentences |
79
- | `.paragraph` | Paragraphs |
80
- | `.document` | Entire document |
38
+ | `.translationPresentation(isPresented:text:)` system sheet | iOS 17.4, macOS 14.4 |
39
+ | `TranslationSession`, `.translationTask`, `LanguageAvailability`, batch requests | iOS 18, macOS 15 |
40
+ | `TranslationSession(installedSource:target:)` without any UI | iOS 26, macOS 26 |
41
+ | `TranslationSession.Strategy` selection | iOS 26.4, macOS 26.4 |
81
42
 
82
- ### Enumerating with Attributes
43
+ The Translation APIs are marked unavailable on visionOS, tvOS and watchOS
44
+ in the 26 SDKs; NaturalLanguage itself works on every Apple platform.
45
+ Use the UI-free `installedSource` initializer only when both languages are
46
+ already downloaded.
83
47
 
84
- Use `enumerateTokens(in:using:)` to detect numeric or emoji tokens.
48
+ `NLTokenizer` and `NLTagger` are not thread-safe. Keep each instance on a
49
+ single thread or queue at a time.
85
50
 
86
- ```swift
87
- let tokenizer = NLTokenizer(unit: .word)
88
- tokenizer.string = text
51
+ ## Tokenizing
89
52
 
90
- tokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, attributes in
91
- if attributes.contains(.numeric) {
92
- print("Number: \(text[range])")
93
- }
94
- return true // continue enumeration
95
- }
53
+ ```swift
54
+ let splitter = NLTokenizer(unit: .sentence)
55
+ splitter.string = review
56
+ let sentences = splitter.tokens(for: review.startIndex..<review.endIndex).map { review[$0] }
96
57
  ```
97
58
 
98
- ## Language Identification
99
-
100
- Detect the dominant language of a string with `NLLanguageRecognizer`.
59
+ Units are `.word`, `.sentence`, `.paragraph` and `.document`. Enumeration
60
+ also reports token attributes such as numbers and emoji:
101
61
 
102
62
  ```swift
103
- func detectLanguage(for text: String) -> NLLanguage? {
104
- NLLanguageRecognizer.dominantLanguage(for: text)
105
- }
106
-
107
- // Multiple hypotheses with confidence scores
108
- func languageHypotheses(for text: String, max: Int = 5) -> [NLLanguage: Double] {
109
- let recognizer = NLLanguageRecognizer()
110
- recognizer.processString(text)
111
- return recognizer.languageHypotheses(withMaximum: max)
63
+ let words = NLTokenizer(unit: .word)
64
+ words.string = receipt
65
+ words.enumerateTokens(in: receipt.startIndex..<receipt.endIndex) { span, traits in
66
+ if traits.contains(.numeric) { amounts.append(String(receipt[span])) }
67
+ return true // keep going
112
68
  }
113
69
  ```
114
70
 
115
- Constrain the recognizer to expected languages for better accuracy on short text.
71
+ ## Identifying the language
116
72
 
117
73
  ```swift
74
+ let guess = NLLanguageRecognizer.dominantLanguage(for: "Hvor er togstationen?")
75
+
118
76
  let recognizer = NLLanguageRecognizer()
119
- recognizer.languageConstraints = [.english, .french, .spanish]
120
- recognizer.processString(text)
121
- let detected = recognizer.dominantLanguage
77
+ recognizer.processString(snippet)
78
+ let ranked = recognizer.languageHypotheses(withMaximum: 3) // [NLLanguage: Double]
79
+
80
+ recognizer.reset()
81
+ recognizer.languageConstraints = [.danish, .norwegian, .swedish]
82
+ recognizer.processString(snippet)
83
+ let bestNordic = recognizer.dominantLanguage
122
84
  ```
123
85
 
124
- ## Part-of-Speech Tagging
86
+ Constraining the candidate set helps a lot with short input.
125
87
 
126
- Identify nouns, verbs, adjectives, and other lexical classes with `NLTagger`.
88
+ ## Part-of-speech tagging
127
89
 
128
90
  ```swift
129
- func tagPartsOfSpeech(in text: String) -> [(String, NLTag)] {
130
- let tagger = NLTagger(tagSchemes: [.lexicalClass])
131
- tagger.string = text
132
-
133
- var results: [(String, NLTag)] = []
134
- let range = text.startIndex..<text.endIndex
135
- let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace]
136
-
137
- tagger.enumerateTags(in: range, unit: .word, scheme: .lexicalClass, options: options) { tag, tokenRange in
138
- if let tag {
139
- results.append((String(text[tokenRange]), tag))
140
- }
141
- return true
142
- }
143
- return results
91
+ let tagger = NLTagger(tagSchemes: [.lexicalClass])
92
+ tagger.string = sentence
93
+ tagger.enumerateTags(in: sentence.startIndex..<sentence.endIndex,
94
+ unit: .word,
95
+ scheme: .lexicalClass,
96
+ options: [.omitPunctuation, .omitWhitespace]) { tag, span in
97
+ if tag == .verb { verbs.append(String(sentence[span])) }
98
+ return true
144
99
  }
145
100
  ```
146
101
 
147
- ### Common Tag Schemes
148
-
149
- | Scheme | Output |
102
+ | Scheme | Produces |
150
103
  |---|---|
151
- | `.lexicalClass` | Part of speech (noun, verb, adjective) |
152
- | `.nameType` | Named entity type (person, place, organization) |
153
- | `.nameTypeOrLexicalClass` | Combined NER + POS |
154
- | `.lemma` | Base form of a word |
155
- | `.language` | Per-token language |
156
- | `.sentimentScore` | Sentiment polarity score |
157
-
158
- ## Named Entity Recognition
104
+ | `.lexicalClass` | Word class: noun, verb, adjective and so on |
105
+ | `.nameType` | Entity type |
106
+ | `.nameTypeOrLexicalClass` | Entity type where there is one, word class otherwise |
107
+ | `.lemma` | Dictionary form of the word |
108
+ | `.language` | Language of each token |
109
+ | `.sentimentScore` | Polarity score |
159
110
 
160
- Extract people, places, and organizations.
111
+ ## Named entities
161
112
 
162
113
  ```swift
163
- func extractEntities(from text: String) -> [(String, NLTag)] {
164
- let tagger = NLTagger(tagSchemes: [.nameType])
165
- tagger.string = text
166
-
167
- var entities: [(String, NLTag)] = []
168
- let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace, .joinNames]
169
-
170
- tagger.enumerateTags(
171
- in: text.startIndex..<text.endIndex,
172
- unit: .word,
173
- scheme: .nameType,
174
- options: options
175
- ) { tag, tokenRange in
176
- if let tag, tag != .other {
177
- entities.append((String(text[tokenRange]), tag))
178
- }
179
- return true
114
+ let finder = NLTagger(tagSchemes: [.nameType])
115
+ finder.string = article
116
+ finder.enumerateTags(in: article.startIndex..<article.endIndex,
117
+ unit: .word,
118
+ scheme: .nameType,
119
+ options: [.omitPunctuation, .omitWhitespace, .joinNames]) { tag, span in
120
+ guard let tag, tag != .other else { return true }
121
+ switch tag {
122
+ case .personalName: people.insert(String(article[span]))
123
+ case .placeName: places.insert(String(article[span]))
124
+ case .organizationName: companies.insert(String(article[span]))
125
+ default: break
180
126
  }
181
- return entities
127
+ return true
182
128
  }
183
- // NLTag values: .personalName, .placeName, .organizationName
184
129
  ```
185
130
 
186
- ## Sentiment Analysis
131
+ `.joinNames` keeps "Ada Lovelace" together as one entity.
132
+
133
+ ## Sentiment
187
134
 
188
- Score text sentiment from -1.0 (negative) to +1.0 (positive).
135
+ Scores run from -1.0 (negative) to +1.0 (positive). Some languages have no
136
+ model, so the result is optional.
189
137
 
190
138
  ```swift
191
- func sentimentScore(for text: String) -> Double? {
192
- let tagger = NLTagger(tagSchemes: [.sentimentScore])
193
- tagger.string = text
194
-
195
- let (tag, _) = tagger.tag(
196
- at: text.startIndex,
197
- unit: .paragraph,
198
- scheme: .sentimentScore
199
- )
139
+ func mood(of paragraph: String) -> Double? {
140
+ let scorer = NLTagger(tagSchemes: [.sentimentScore])
141
+ scorer.string = paragraph
142
+ let (tag, _) = scorer.tag(at: paragraph.startIndex, unit: .paragraph, scheme: .sentimentScore)
200
143
  return tag.flatMap { Double($0.rawValue) }
201
144
  }
202
145
  ```
203
146
 
204
- ## Text Embeddings
205
-
206
- Measure semantic similarity between words or sentences with `NLEmbedding`.
147
+ ## Embeddings
207
148
 
208
149
  ```swift
209
- func wordSimilarity(_ word1: String, _ word2: String) -> Double? {
210
- guard let embedding = NLEmbedding.wordEmbedding(for: .english) else { return nil }
211
- return embedding.distance(between: word1, and: word2, distanceType: .cosine)
150
+ func wordNeighbors() -> (gap: NLDistance, similar: [(String, NLDistance)])? {
151
+ guard let vectors = NLEmbedding.wordEmbedding(for: .english) else { return nil }
152
+ let gap = vectors.distance(between: "harbor", and: "port", distanceType: .cosine)
153
+ let similar = vectors.neighbors(for: "harbor", maximumCount: 5, distanceType: .cosine)
154
+ return (gap, similar)
212
155
  }
213
156
 
214
- func findSimilarWords(to word: String, count: Int = 5) -> [(String, Double)] {
215
- guard let embedding = NLEmbedding.wordEmbedding(for: .english) else { return [] }
216
- return embedding.neighbors(for: word, maximumCount: count, distanceType: .cosine)
157
+ func sentenceGap() -> NLDistance? {
158
+ NLEmbedding.sentenceEmbedding(for: .english)?.distance(between: "The ferry is late.",
159
+ and: "Our boat has been delayed.",
160
+ distanceType: .cosine)
217
161
  }
218
162
  ```
219
163
 
220
- Sentence embeddings compare entire sentences.
221
-
222
- ```swift
223
- func sentenceSimilarity(_ s1: String, _ s2: String) -> Double? {
224
- guard let embedding = NLEmbedding.sentenceEmbedding(for: .english) else { return nil }
225
- return embedding.distance(between: s1, and: s2, distanceType: .cosine)
226
- }
227
- ```
164
+ Not every language ships embeddings; both factories can return `nil`.
165
+ `NLDistance` is a `Double`; smaller means closer.
228
166
 
229
167
  ## Translation
230
168
 
231
- ### System Translation Overlay
232
-
233
- Show the built-in translation UI with `.translationPresentation()`.
169
+ ### The system sheet
234
170
 
235
171
  ```swift
236
- import SwiftUI
237
- import Translation
238
-
239
- struct TranslatableView: View {
240
- @State private var showTranslation = false
241
- let text = "Hello, how are you?"
172
+ struct PhraseCard: View {
173
+ let phrase: String
174
+ @State private var showsTranslation = false
242
175
 
243
176
  var body: some View {
244
- Button { showTranslation = true } label: {
245
- Text(text)
246
- }
247
- .buttonStyle(.plain)
248
- .translationPresentation(
249
- isPresented: $showTranslation,
250
- text: text
251
- )
177
+ Button(phrase) { showsTranslation = true }
178
+ .buttonStyle(.plain)
179
+ .translationPresentation(isPresented: $showsTranslation, text: phrase)
252
180
  }
253
181
  }
254
182
  ```
255
183
 
256
- ### Programmatic Translation
184
+ ### Translating in code
257
185
 
258
- Use `.translationTask()` for programmatic translations within a view context.
186
+ `.translationTask` hands you a session whenever its configuration becomes
187
+ non-nil or changes, so assigning a configuration is what starts the work.
188
+ Written inside `body`, the action closure is main-actor isolated, and
189
+ `TranslationSession` is not `Sendable`: Swift 6 rejects calling
190
+ `translate(_:)` from there. Mark the closure `@concurrent` and hop back to the
191
+ main actor to store the result.
259
192
 
260
193
  ```swift
261
- struct TranslatingView: View {
262
- @State private var translatedText = ""
263
- @State private var translationErrorMessage: String?
264
- @State private var configuration: TranslationSession.Configuration?
194
+ struct MenuTranslator: View {
195
+ let dish: String
196
+ @State private var request: TranslationSession.Configuration?
197
+ @State private var output = ""
265
198
 
266
199
  var body: some View {
267
200
  VStack {
268
- Text(translatedText)
269
- Button("Translate") {
270
- configuration = .init(source: Locale.Language(identifier: "en"),
271
- target: Locale.Language(identifier: "es"))
201
+ Text(output)
202
+ Button("Translate to Japanese") {
203
+ request = .init(source: Locale.Language(identifier: "it"),
204
+ target: Locale.Language(identifier: "ja"))
272
205
  }
273
206
  }
274
- .translationTask(configuration) { session in
207
+ .translationTask(request) { @concurrent session in
275
208
  do {
276
- let response = try await session.translate("Hello, world!")
277
- await MainActor.run {
278
- translatedText = response.targetText
279
- translationErrorMessage = nil
280
- }
209
+ let reply = try await session.translate(dish)
210
+ await MainActor.run { output = reply.targetText }
281
211
  } catch {
282
- let message = error.localizedDescription
283
- await MainActor.run {
284
- translationErrorMessage = message
285
- }
212
+ await MainActor.run { output = "Translation failed: \(error.localizedDescription)" }
286
213
  }
287
214
  }
288
215
  }
289
216
  }
290
217
  ```
291
218
 
292
- ### Batch Translation
219
+ ### Several strings at once
293
220
 
294
- Translate multiple strings in a single session.
221
+ Give each request a `clientIdentifier` so you can match answers to inputs.
295
222
 
296
223
  ```swift
297
- .translationTask(configuration) { session in
298
- do {
299
- let requests = texts.enumerated().map { index, text in
300
- TranslationSession.Request(sourceText: text,
301
- clientIdentifier: "\(index)")
302
- }
303
- let responses = try await session.translations(from: requests)
304
- for response in responses {
305
- print("\(response.sourceText) -> \(response.targetText)")
306
- }
307
- } catch {
308
- // Handle cancellation, unsupported languages, or download refusal.
309
- }
224
+ let requests = menuItems.map {
225
+ TranslationSession.Request(sourceText: $0.name, clientIdentifier: $0.id)
310
226
  }
311
- ```
312
-
313
- ### Checking Language Availability
314
-
315
- ```swift
316
- let availability = LanguageAvailability()
317
- let status = await availability.status(
318
- from: Locale.Language(identifier: "en"),
319
- to: Locale.Language(identifier: "ja")
320
- )
321
- switch status {
322
- case .installed: break // Ready to translate offline
323
- case .supported: break // Needs download
324
- case .unsupported: break // Language pair not available
325
- }
326
- ```
327
-
328
- ## Common Mistakes
329
-
330
- ### DON'T: Share NLTagger/NLTokenizer across threads
331
-
332
- These classes are not thread-safe and will produce incorrect results or crash.
333
-
334
- ```swift
335
- // WRONG
336
- let sharedTagger = NLTagger(tagSchemes: [.lexicalClass])
337
- DispatchQueue.concurrentPerform(iterations: 10) { _ in
338
- sharedTagger.string = someText // Data race
339
- }
340
-
341
- // CORRECT
342
- await withTaskGroup(of: Void.self) { group in
343
- for _ in 0..<10 {
344
- group.addTask {
345
- let tagger = NLTagger(tagSchemes: [.lexicalClass])
346
- tagger.string = someText
347
- // process...
348
- }
227
+ do {
228
+ let answers = try await session.translations(from: requests)
229
+ for answer in answers {
230
+ translated[answer.clientIdentifier ?? ""] = answer.targetText
349
231
  }
232
+ } catch {
233
+ // cancelled, unsupported pair, or the user declined the download
350
234
  }
351
235
  ```
352
236
 
353
- ### DON'T: Confuse NaturalLanguage with Core ML
354
-
355
- NaturalLanguage provides built-in linguistic analysis. Use Core ML for custom
356
- trained models. They complement each other via `NLModel`.
357
-
358
- ```swift
359
- // WRONG: Trying to do NER with raw Core ML
360
- let coreMLModel = try MLModel(contentsOf: modelURL)
361
-
362
- // CORRECT: Use NLTagger for built-in NER
363
- let tagger = NLTagger(tagSchemes: [.nameType])
364
-
365
- // Or load a custom Core ML model via NLModel
366
- let nlModel = try NLModel(mlModel: coreMLModel)
367
- tagger.setModels([nlModel], forTagScheme: .nameType)
368
- ```
369
-
370
- ### DON'T: Assume embeddings exist for all languages
371
-
372
- Not all languages have word or sentence embeddings available on device.
373
-
374
- ```swift
375
- // WRONG: Force unwrap
376
- let embedding = NLEmbedding.wordEmbedding(for: .japanese)!
377
-
378
- // CORRECT: Handle nil
379
- guard let embedding = NLEmbedding.wordEmbedding(for: .japanese) else {
380
- // Embedding not available for this language
381
- return
382
- }
383
- ```
384
-
385
- ### DON'T: Create a new tagger per token
386
-
387
- Creating and configuring a tagger is expensive. Reuse it for the same text.
237
+ ### Checking a language pair first
388
238
 
389
239
  ```swift
390
- // WRONG: New tagger per word
391
- for word in words {
392
- let tagger = NLTagger(tagSchemes: [.lexicalClass])
393
- tagger.string = word
394
- }
395
-
396
- // CORRECT: Set string once, enumerate
397
- let tagger = NLTagger(tagSchemes: [.lexicalClass])
398
- tagger.string = fullText
399
- tagger.enumerateTags(in: fullText.startIndex..<fullText.endIndex,
400
- unit: .word, scheme: .lexicalClass, options: []) { tag, range in
401
- return true
240
+ let pairState = await LanguageAvailability().status(
241
+ from: Locale.Language(identifier: "pt"),
242
+ to: Locale.Language(identifier: "de")
243
+ )
244
+ switch pairState {
245
+ case .installed: break // ready offline
246
+ case .supported: break // works after a download
247
+ case .unsupported: break // cannot translate this pair
248
+ @unknown default: break
402
249
  }
403
250
  ```
404
251
 
405
- ### DON'T: Ignore language hints for short text
406
-
407
- Language detection on short strings (under ~20 characters) is unreliable.
408
- Set constraints or hints to improve accuracy.
409
-
410
- ```swift
411
- // WRONG: Detect language of a single word
412
- let lang = NLLanguageRecognizer.dominantLanguage(for: "chat") // French or English?
413
-
414
- // CORRECT: Provide context
415
- let recognizer = NLLanguageRecognizer()
416
- recognizer.languageHints = [.english: 0.8, .french: 0.2]
417
- recognizer.processString("chat")
418
- ```
419
-
420
- ## Review Checklist
421
-
422
- - [ ] `NLTokenizer` and `NLTagger` instances used from a single thread
252
+ ## Common mistakes
253
+
254
+ - **Sharing a tagger between threads.** Driving one `NLTagger` from
255
+ `concurrentPerform` is a data race. Give each task its own instance, for
256
+ example one per child task in a task group.
257
+ - **Confusing NaturalLanguage with Core ML.** NaturalLanguage covers the
258
+ built-in analyses. A custom model trained in Create ML comes in through
259
+ `NLModel(mlModel:)` and `tagger.setModels(_:forTagScheme:)`, not as a raw
260
+ `MLModel` wired up by hand.
261
+ - **Force-unwrapping `wordEmbedding(for:)`.** Many languages have none.
262
+ - **A tagger per token.** Create the tagger once, set the whole string, then
263
+ enumerate.
264
+ - **Trusting detection on tiny strings.** Under about 20 characters it is
265
+ guesswork; add `languageHints` such as `[.english: 0.8, .french: 0.2]` or
266
+ `languageConstraints`.
267
+
268
+ ## Review checklist
269
+
270
+ - [ ] Each tokenizer and tagger used from one thread at a time
423
271
  - [ ] Tagger created once per text, not per token
424
- - [ ] Language detection uses constraints/hints for short text
425
- - [ ] `NLEmbedding` availability checked before use (returns nil if unavailable)
426
- - [ ] Translation `LanguageAvailability` checked before attempting translation
427
- - [ ] `.translationTask()` used within a SwiftUI view hierarchy
428
- - [ ] Batch translation uses `clientIdentifier` to match responses to requests
429
- - [ ] Sentiment scores handled as optional (may return nil for unsupported languages)
430
- - [ ] `.joinNames` option used with NER to keep multi-word names together
431
- - [ ] Custom ML models loaded via `NLModel`, not raw Core ML
272
+ - [ ] Short text gets constraints or hints
273
+ - [ ] `NLEmbedding` results checked for `nil`
274
+ - [ ] `LanguageAvailability` consulted before translating
275
+ - [ ] `.translationTask` attached inside the SwiftUI view hierarchy
276
+ - [ ] Batch requests carry a `clientIdentifier`
277
+ - [ ] Sentiment handled as optional (unsupported languages give `nil`)
278
+ - [ ] Entity extraction uses `.joinNames`
279
+ - [ ] Custom models loaded through `NLModel`
432
280
 
433
281
  ## References
434
282
 
435
- - Extended patterns (custom models, contextual embeddings, gazetteers): [references/translation-patterns.md](references/translation-patterns.md)
436
- - [Natural Language framework](https://sosumi.ai/documentation/naturallanguage)
437
- - [NLTokenizer](https://sosumi.ai/documentation/naturallanguage/nltokenizer)
438
- - [NLTagger](https://sosumi.ai/documentation/naturallanguage/nltagger)
439
- - [NLEmbedding](https://sosumi.ai/documentation/naturallanguage/nlembedding)
440
- - [NLLanguageRecognizer](https://sosumi.ai/documentation/naturallanguage/nllanguagerecognizer)
441
- - [Translation framework](https://sosumi.ai/documentation/translation)
442
- - [TranslationSession](https://sosumi.ai/documentation/translation/translationsession)
443
- - [TranslationSession.Strategy](https://sosumi.ai/documentation/translation/translationsession/strategy)
444
- - [LanguageAvailability](https://sosumi.ai/documentation/translation/languageavailability)
283
+ - [translation and analysis patterns](references/translation-patterns.md): custom models, contextual embeddings, gazetteers, multi-scheme tagging, in-place translation, strategies, session preparation, SwiftUI analyzer, tagger assets, lemmas
284
+ - https://developer.apple.com/documentation/naturallanguage
285
+ - https://developer.apple.com/documentation/naturallanguage/nltokenizer
286
+ - https://developer.apple.com/documentation/naturallanguage/nltagger
287
+ - https://developer.apple.com/documentation/naturallanguage/nlembedding
288
+ - https://developer.apple.com/documentation/naturallanguage/nllanguagerecognizer
289
+ - https://developer.apple.com/documentation/translation
290
+ - https://developer.apple.com/documentation/translation/translationsession
291
+ - https://developer.apple.com/documentation/translation/translationsession/strategy
292
+ - https://developer.apple.com/documentation/translation/languageavailability