@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
@@ -25,6 +25,8 @@ import urllib.error
25
25
  import urllib.parse
26
26
  import urllib.request
27
27
 
28
+ from _shared import slug
29
+
28
30
  API = "https://api.figma.com/v1"
29
31
  SEP = "[:\\-\u2013]"
30
32
  TR_RE = re.compile("^(?:tr|tr[kc]e|t[\u00fcu]rk[\u00e7c]e)\\s*" + SEP + "\\s*(.+)$", re.IGNORECASE)
@@ -40,9 +42,10 @@ RIGHT_MARGIN = 40
40
42
  PINK = "#EC1E91"
41
43
  GRAY = "#9aa0a6"
42
44
  BACKGROUND = "#1e1e1e"
43
- LABEL_CMS = "\u0130\u00e7erik (CMS)"
44
- LABEL_PENDING = "\u00d6neri bekleniyor"
45
- LABEL_UNMATCHED = "(e\u015fle\u015fmedi)"
45
+ LABELS = {
46
+ "en": {"cms": "CMS copy", "pending": "Awaiting copy", "unmatched": "(unmatched)"},
47
+ "tr": {"cms": "\u0130\u00e7erik (CMS)", "pending": "\u00d6neri bekleniyor", "unmatched": "(e\u015fle\u015fmedi)"},
48
+ }
46
49
 
47
50
  PAGE_OPEN = "<!doctype html><html><head>"
48
51
  META_UTF8 = '<meta charset="utf-8">'
@@ -60,13 +63,12 @@ PATH_CHROMES = (
60
63
  )
61
64
 
62
65
 
63
- def canon_id(node_id):
64
- return str(node_id or "").strip().replace("-", ":")
66
+ URL_NODE_ID = re.compile(r"^\d+-\d+$")
65
67
 
66
68
 
67
- def slug(text):
68
- value = re.sub(r"[\W_]+", "-", str(text or "").strip().lower()).strip("-")
69
- return value or "screen"
69
+ def canon_id(node_id):
70
+ text = str(node_id or "").strip()
71
+ return text.replace("-", ":") if URL_NODE_ID.match(text) else text
70
72
 
71
73
 
72
74
  def split_lang(text):
@@ -248,7 +250,7 @@ def page_from_rest(file_key, node_id, scale, token, ca_file):
248
250
  }
249
251
 
250
252
 
251
- def build_cards(page, rows):
253
+ def build_cards(page, rows, labels):
252
254
  index = build_index(rows)
253
255
  cards = []
254
256
  taken = set()
@@ -273,7 +275,7 @@ def build_cards(page, rows):
273
275
  box = {axis: float(node.get(axis, 0)) for axis in ("x", "y", "w", "h")}
274
276
  cards.append({
275
277
  "num": number,
276
- "key": new_key or LABEL_UNMATCHED,
278
+ "key": new_key or labels["unmatched"],
277
279
  "tr": tr,
278
280
  "en": en,
279
281
  "text": node.get("characters") or "",
@@ -302,9 +304,9 @@ def chip(kind, colour, content):
302
304
  return f'<span class="{kind}" style="background:{colour}">{content}</span>'
303
305
 
304
306
 
305
- def card_html(card, left):
307
+ def card_html(card, left, labels):
306
308
  colour = PINK if card["annotated"] else GRAY
307
- pill = LABEL_CMS if card["annotated"] else LABEL_PENDING
309
+ pill = labels["cms"] if card["annotated"] else labels["pending"]
308
310
  if card["annotated"]:
309
311
  body = "".join(
310
312
  f'<div class="line"><b>{label}</b> {html.escape(card[lang] or "-")}</div>'
@@ -336,7 +338,7 @@ def connector(card, lane, lane_count, start_x, target_x, from_left):
336
338
  )
337
339
 
338
340
 
339
- def build_html(page, cards):
341
+ def build_html(page, cards, labels):
340
342
  fw, fh = page["frame"]["w"], page["frame"]["h"]
341
343
  sides = {"left": [], "right": []}
342
344
  for card in cards:
@@ -350,7 +352,7 @@ def build_html(page, cards):
350
352
  for card_x, group in ((COLUMN_X, sides["left"]), (right_x, sides["right"])):
351
353
  from_left = card_x == COLUMN_X
352
354
  for lane, card in enumerate(group):
353
- boxes.append(card_html(card, card_x))
355
+ boxes.append(card_html(card, card_x, labels))
354
356
  if from_left:
355
357
  wire = connector(card, lane, len(group), COLUMN_X + CARD_W, screen_x + card["x"], True)
356
358
  else:
@@ -430,12 +432,26 @@ def chrome_screenshot(chrome, html_text, out_png, width, height, scale):
430
432
  raise RuntimeError((log.read() or "no output").strip()[-300:])
431
433
 
432
434
 
435
+ def is_number(value):
436
+ try:
437
+ float(value)
438
+ except (TypeError, ValueError):
439
+ return False
440
+ return True
441
+
442
+
433
443
  def load_spec_pages(path):
434
444
  with open(path, encoding="utf-8") as stream:
435
445
  spec = json.load(stream)
436
446
  folder = os.path.dirname(os.path.abspath(path))
437
447
  pages = spec.get("pages") or []
438
- for page in pages:
448
+ for number, page in enumerate(pages, 1):
449
+ frame = page.get("frame") if isinstance(page, dict) else None
450
+ if not (isinstance(frame, dict) and all(is_number(frame.get(side)) for side in ("w", "h"))):
451
+ sys.exit(f"{path}: page {number} needs \"frame\": {{\"w\": <width>, \"h\": <height>}} in px")
452
+ for side in ("w", "h"):
453
+ if not isinstance(frame[side], (int, float)):
454
+ frame[side] = float(frame[side])
439
455
  page["image"] = image_source(page.get("image"), folder)
440
456
  return spec, pages
441
457
 
@@ -445,7 +461,7 @@ def split_nodes(flag, mapping):
445
461
  return given or list(mapping.get("figmaNodes") or [])
446
462
 
447
463
 
448
- def main():
464
+ def build_cli():
449
465
  cli = argparse.ArgumentParser(description=__doc__.splitlines()[0])
450
466
  cli.add_argument("--mapping", required=True, help="the reuse-map JSON")
451
467
  cli.add_argument("--spec", help="geometry from MCP or measured by hand: {fileKey, pages:[{nodeId, image, frame, nodes}]}")
@@ -456,7 +472,14 @@ def main():
456
472
  cli.add_argument("--ca-file", help="PEM roots to trust when a proxy intercepts TLS")
457
473
  cli.add_argument("--out", dest="target_dir", default=".", help="folder that receives the generated files")
458
474
  cli.add_argument("--slug", help="stem for the file names; derived from the screen name when omitted")
475
+ cli.add_argument("--ui-lang", choices=sorted(LABELS), default="en", help="language of the card labels")
476
+ return cli
477
+
478
+
479
+ def main():
480
+ cli = build_cli()
459
481
  opts = cli.parse_args()
482
+ labels = LABELS[opts.ui_lang]
460
483
 
461
484
  with open(opts.mapping, encoding="utf-8") as stream:
462
485
  mapping = json.load(stream)
@@ -467,6 +490,9 @@ def main():
467
490
  if not pages:
468
491
  sys.exit("--spec lists no pages")
469
492
  page = pages[0]
493
+ if len(pages) > 1:
494
+ print(f"# warning: {len(pages) - 1} extra page(s) in --spec ignored; the overlay draws the first page only "
495
+ "(render-key-shots.py reads every page)", file=sys.stderr)
470
496
  file_key = spec.get("fileKey") or mapping.get("figmaFileKey")
471
497
  else:
472
498
  file_key = opts.file or mapping.get("figmaFileKey")
@@ -479,8 +505,8 @@ def main():
479
505
  "Without one, measure the boxes on the screenshot and hand them over with --spec.")
480
506
  page = page_from_rest(file_key, canon_id(nodes[0]), opts.scale, token, opts.ca_file)
481
507
 
482
- cards = build_cards(page, mapping.get("rows") or [])
483
- document, width, height = build_html(page, cards)
508
+ cards = build_cards(page, mapping.get("rows") or [], labels)
509
+ document, width, height = build_html(page, cards, labels)
484
510
  os.makedirs(opts.target_dir, exist_ok=True)
485
511
 
486
512
  def output(suffix):
@@ -13,7 +13,8 @@ import plistlib
13
13
  import sys
14
14
  import urllib.request
15
15
 
16
- ALL_LANGS = ["en", "tr", "ar", "de", "es", "fr", "it", "ru"]
16
+ from _shared import LANGS as ALL_LANGS
17
+
17
18
 
18
19
 
19
20
  def split_csv(value):
@@ -149,6 +150,8 @@ def main():
149
150
 
150
151
  keys = split_csv(args.keys)
151
152
  langs = parse_langs(args.langs)
153
+ if not (args.snapshot_root or args.plist_root or args.endpoint):
154
+ sys.exit("no source given: pass --snapshot-root, --plist-root, or --live with --endpoint")
152
155
 
153
156
  if args.snapshot_root and not args.live:
154
157
  result = from_snapshot(args.snapshot_root, keys, langs, args.prefix)
@@ -165,7 +168,7 @@ def main():
165
168
  elif args.plist_root:
166
169
  result = from_plist(args.plist_root, keys, langs, args.prefix)
167
170
  else:
168
- raise
171
+ sys.exit("no --snapshot-root or --plist-root to fall back on")
169
172
 
170
173
  json.dump(result, sys.stdout, indent=2, ensure_ascii=False)
171
174
  sys.stdout.write("\n")
@@ -11,7 +11,8 @@ import json
11
11
  import os
12
12
  import sys
13
13
 
14
- ALL_LANGS = ["en", "tr", "ar"] + sorted(["ru", "it", "fr", "es", "de"])
14
+ from _shared import LANGS as ALL_LANGS, normalize_key
15
+
15
16
 
16
17
  DOMAIN_DIRS = {
17
18
  "localization": ("Suggested", "LocalizationStrings"),
@@ -25,10 +26,6 @@ def parse_langs(value):
25
26
  return [part.strip() for part in value.split(",") if part.strip()]
26
27
 
27
28
 
28
- def normalize_key(key):
29
- return ".".join(seg[:1].upper() + seg[1:] for seg in key.split("."))
30
-
31
-
32
29
  def read_keys(opts):
33
30
  raw = [piece.strip() for piece in opts.keys.split(",")] if opts.keys else []
34
31
  if opts.keys_file:
@@ -85,12 +82,14 @@ def read_suggested(path, langs):
85
82
 
86
83
 
87
84
  def from_catalog(catalog, key, langs):
88
- entry = catalog.get(key)
89
- if entry is None:
90
- entry = catalog.get(normalize_key(key))
91
- if not isinstance(entry, dict):
92
- return None
93
- return {lang: entry.get(lang) for lang in langs}
85
+ for candidate in dict.fromkeys((key, normalize_key(key))):
86
+ entry = catalog.get(candidate)
87
+ if not isinstance(entry, dict):
88
+ continue
89
+ values = {lang: entry.get(lang) for lang in langs}
90
+ if any(value is not None for value in values.values()):
91
+ return values
92
+ return None
94
93
 
95
94
 
96
95
  def main():
@@ -13,22 +13,17 @@ import os
13
13
  import re
14
14
  import sys
15
15
 
16
- EXTENSIONS = {".swift", ".kt", ".kts", ".xml", ".ts", ".tsx", ".js", ".jsx", ".vue"}
16
+ from _shared import IDENT, WEB_DOLLAR_T, WEB_T, WORD, is_interpolated, lsk_keys, source_files
17
+
17
18
  ANDROID = {".kt", ".kts", ".xml"}
18
19
  WEB = {".ts", ".tsx", ".js", ".jsx", ".vue"}
19
- SKIP_PARTS = ("/.git", "/Generated/")
20
20
 
21
21
  ERROR_WORDS = ("toast", "snackbar", "alert", "warning", "failure", "exception", "showerror", "errormessage", "error", "validat")
22
22
  ERROR_CONTEXT = re.compile("|".join(ERROR_WORDS), re.IGNORECASE)
23
23
 
24
- WORD = "A-Za-z0-9_"
25
- IDENT = rf"[A-Za-z_][{WORD}]*"
26
- LSK = re.compile(rf"LocalizationStringKey((?:\.{IDENT}){{2,}})")
27
24
  LITERAL_LOCALIZED = re.compile(r"\"([^\"\\\n]+)\"\.localized\b")
28
25
  R_STRING = re.compile(rf"\bR\.string\.([{WORD}]+)")
29
26
  XML_STRING = re.compile(rf"@string/([{WORD}.]+)")
30
- WEB_T = re.compile(r"(?<![\w$])t\(\s*(['\"])([A-Za-z0-9_.\-]+)\1")
31
- WEB_DOLLAR_T = re.compile(r"\$t\(\s*(['\"])([A-Za-z0-9_.\-]+)\1")
32
27
  WEB_T_DYNAMIC = re.compile(r"(?<![\w$])t\(\s*[`$A-Za-z_]")
33
28
  WEB_DOLLAR_T_DYNAMIC = re.compile(r"\$t\(\s*[`$A-Za-z_]")
34
29
  LSK_DYNAMIC = re.compile(r"LocalizationStringKey\(")
@@ -38,13 +33,6 @@ INTERPOLATED_LOCALIZED = re.compile(r"\"([^\"\n]*(?:\\\(|\$\{|\$[A-Za-z_])[^\"\n
38
33
  RECEIVER_LOCALIZED = re.compile(rf"(?<![\w.\"])({IDENT}(?:\.{IDENT})*)\.localized\b")
39
34
 
40
35
 
41
- def strip_accessor(chain):
42
- segments = chain.strip(".").split(".")
43
- while segments and segments[-1].startswith("localized"):
44
- segments.pop()
45
- return ".".join(segments)
46
-
47
-
48
36
  def platform_of(path):
49
37
  ext = os.path.splitext(path)[1]
50
38
  if ext in ANDROID:
@@ -54,20 +42,6 @@ def platform_of(path):
54
42
  return "ios"
55
43
 
56
44
 
57
- def source_files(root):
58
- if os.path.isfile(root):
59
- yield root
60
- return
61
- for current, dirs, files in os.walk(root):
62
- probe = current.replace(os.sep, "/") + "/"
63
- if any(part in probe for part in SKIP_PARTS):
64
- dirs[:] = []
65
- continue
66
- for name in sorted(files):
67
- if os.path.splitext(name)[1] in EXTENSIONS:
68
- yield os.path.join(current, name)
69
-
70
-
71
45
  def hits_in_line(line, ext):
72
46
  static, dynamic = [], []
73
47
  if ext == ".xml":
@@ -81,11 +55,8 @@ def hits_in_line(line, ext):
81
55
  if WEB_DOLLAR_T_DYNAMIC.search(line):
82
56
  dynamic.append("(dynamic: $t(...))")
83
57
  return static, dynamic
84
- for match in LSK.finditer(line):
85
- key = strip_accessor(match.group(1))
86
- if key.count(".") >= 1:
87
- static.append(key)
88
- static.extend(m.group(1) for m in LITERAL_LOCALIZED.finditer(line))
58
+ static.extend(lsk_keys(line))
59
+ static.extend(m.group(1) for m in LITERAL_LOCALIZED.finditer(line) if not is_interpolated(m.group(1)))
89
60
  static.extend(m.group(1) for m in R_STRING.finditer(line))
90
61
  if LSK_DYNAMIC.search(line):
91
62
  dynamic.append("(dynamic: LocalizationStringKey(...))")
@@ -11,42 +11,10 @@ import os
11
11
  import re
12
12
  import sys
13
13
 
14
- EXTENSIONS = {".swift", ".kt", ".kts", ".xml", ".ts", ".tsx", ".js", ".jsx", ".vue"}
15
- SKIP_PARTS = ("/.git", "/Generated/")
16
-
17
- WORD = "A-Za-z0-9_"
18
- LSK = re.compile(rf"LocalizationStringKey((?:\.[A-Za-z_][{WORD}]*)+)")
19
- LITERAL_LOCALIZED = re.compile(rf"\"([{WORD}.]+)\"\.localized\b")
20
- WEB_T = re.compile(r"(?<![\w$])t\(\s*(['\"])([A-Za-z0-9_.\-]+)\1")
21
- WEB_DOLLAR_T = re.compile(r"\$t\(\s*(['\"])([A-Za-z0-9_.\-]+)\1")
22
- TRAILING_MARKER = re.compile(r"\s*\([^()]*\)\s*$")
23
- COMPONENT_MARKER = re.compile(r"\([^)]*(owned by|bile\u015fen|component)[^)]*\)", re.IGNORECASE)
24
- PLACEHOLDER = re.compile(r"<[^<>]+>")
25
-
26
-
27
- def strip_accessor(chain):
28
- segments = chain.strip(".").split(".")
29
- while segments and segments[-1].startswith("localized"):
30
- segments.pop()
31
- return ".".join(segments)
32
-
33
-
34
- def normalize_key(key):
35
- return ".".join(seg[:1].upper() + seg[1:] for seg in key.split("."))
36
-
37
-
38
- def source_files(root):
39
- if os.path.isfile(root):
40
- yield root
41
- return
42
- for current, dirs, files in os.walk(root):
43
- probe = current.replace(os.sep, "/") + "/"
44
- if any(part in probe for part in SKIP_PARTS):
45
- dirs[:] = []
46
- continue
47
- for name in sorted(files):
48
- if os.path.splitext(name)[1] in EXTENSIONS:
49
- yield os.path.join(current, name)
14
+ from _shared import (
15
+ LITERAL_KEY, WEB_DOLLAR_T, WEB_T, clean_key, is_component, is_dynamic, lsk_keys, normalize_key, raw_key,
16
+ source_files,
17
+ )
50
18
 
51
19
 
52
20
  def scan_code(root):
@@ -61,28 +29,14 @@ def scan_code(root):
61
29
  continue
62
30
  scanned += 1
63
31
  corpus.append(text.lower())
64
- chains = (strip_accessor(hit.group(1)) for hit in LSK.finditer(text))
65
- keys.update(chain.lower() for chain in chains if chain)
66
- for pattern, group in ((LITERAL_LOCALIZED, 1), (WEB_T, 2), (WEB_DOLLAR_T, 2)):
32
+ keys.update(key.lower() for key in lsk_keys(text))
33
+ for pattern, group in ((LITERAL_KEY, 1), (WEB_T, 2), (WEB_DOLLAR_T, 2)):
67
34
  keys.update(hit.group(group).lower() for hit in pattern.finditer(text))
68
35
  return keys, "\n".join(corpus), scanned
69
36
 
70
37
 
71
- def is_component(row):
72
- text = " ".join(str(row.get(f) or "") for f in ("newKey", "element", "note"))
73
- return bool(COMPONENT_MARKER.search(text))
74
-
75
-
76
- def is_dynamic(row, key):
77
- element = str(row.get("element") or "").lower()
78
- note = str(row.get("note") or "").lower()
79
- return (
80
- key.startswith("(dynamic")
81
- or bool(PLACEHOLDER.search(key))
82
- or "dinamik" in element
83
- or "dynamic" in element
84
- or "enumerate at runtime" in note
85
- )
38
+ def filled(value):
39
+ return bool(str(value or "").strip())
86
40
 
87
41
 
88
42
  def suggested_exists(root, key):
@@ -114,8 +68,7 @@ def main():
114
68
  map_keys = set()
115
69
 
116
70
  for row in rows:
117
- raw_key = str(row.get("newKey") or "").strip()
118
- key = raw_key if raw_key.startswith("(dynamic") else TRAILING_MARKER.sub("", raw_key)
71
+ key = clean_key(raw_key(row))
119
72
  component = is_component(row)
120
73
  dynamic = is_dynamic(row, key)
121
74
  if key:
@@ -136,11 +89,11 @@ def main():
136
89
  verdict = row.get("verdict")
137
90
  new = row.get("new") or {}
138
91
  legacy = row.get("legacy") or {}
139
- if verdict != "new" and not new.get("tr") and not dynamic:
92
+ if verdict != "new" and not filled(new.get("tr")) and not dynamic:
140
93
  gaps.append({"key": key, "issue": "new.tr empty"})
141
- if verdict in ("reuse", "review") and not (legacy.get("en") or legacy.get("tr")):
94
+ if verdict in ("reuse", "review") and not (filled(legacy.get("en")) or filled(legacy.get("tr"))):
142
95
  gaps.append({"key": key, "issue": f"verdict={verdict} but no legacy value"})
143
- if new.get("tr") and new.get("tr") == new.get("en"):
96
+ if filled(new.get("tr")) and new.get("tr") == new.get("en"):
144
97
  untranslated.append(key)
145
98
  if args.resources_root and not component and not dynamic and key and not suggested_exists(args.resources_root, key):
146
99
  gaps.append({"key": key, "issue": f"no Suggested/{normalize_key(key)}.json"})