buildanything 1.7.1 → 2.0.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 (633) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/.claude-plugin/plugin.json +9 -3
  3. package/CHANGELOG.md +112 -0
  4. package/README.md +2 -2
  5. package/agents/a11y-architect.md +166 -0
  6. package/agents/business-model.md +80 -29
  7. package/agents/code-architect.md +75 -0
  8. package/agents/code-reviewer.md +255 -0
  9. package/agents/code-simplifier.md +64 -0
  10. package/agents/design-brand-guardian.md +293 -53
  11. package/agents/design-critic.md +139 -0
  12. package/agents/design-inclusive-visuals-specialist.md +6 -19
  13. package/agents/design-ui-designer.md +335 -56
  14. package/agents/design-ux-architect.md +403 -55
  15. package/agents/design-ux-researcher.md +264 -49
  16. package/agents/engineering-ai-engineer.md +26 -36
  17. package/agents/engineering-backend-architect.md +185 -36
  18. package/agents/engineering-data-engineer.md +225 -43
  19. package/agents/engineering-devops-automator.md +227 -74
  20. package/agents/engineering-frontend-developer.md +210 -34
  21. package/agents/engineering-mobile-app-builder.md +6 -1
  22. package/agents/engineering-rapid-prototyper.md +30 -9
  23. package/agents/engineering-security-engineer.md +263 -61
  24. package/agents/engineering-senior-developer.md +128 -19
  25. package/agents/engineering-sre.md +84 -0
  26. package/agents/engineering-technical-writer.md +285 -41
  27. package/agents/feature-intel.md +110 -0
  28. package/agents/ios-app-review-guardian.md +66 -0
  29. package/agents/ios-foundation-models-specialist.md +64 -0
  30. package/agents/ios-storekit-specialist.md +59 -0
  31. package/agents/ios-swift-architect.md +129 -0
  32. package/agents/ios-swift-search.md +137 -0
  33. package/agents/ios-swift-ui-design.md +136 -0
  34. package/agents/marketing-app-store-optimizer.md +246 -64
  35. package/agents/planner.md +216 -0
  36. package/agents/pr-test-analyzer.md +63 -0
  37. package/agents/product-feedback-synthesizer.md +8 -2
  38. package/agents/refactor-cleaner.md +102 -0
  39. package/agents/security-reviewer.md +128 -0
  40. package/agents/silent-failure-hunter.md +54 -0
  41. package/agents/swift-build-resolver.md +119 -0
  42. package/agents/swift-reviewer.md +112 -0
  43. package/agents/tech-feasibility.md +21 -1
  44. package/agents/testing-api-tester.md +236 -59
  45. package/agents/testing-evidence-collector.md +26 -1
  46. package/agents/testing-performance-benchmarker.md +21 -1
  47. package/agents/testing-reality-checker.md +6 -1
  48. package/agents/visual-research.md +116 -0
  49. package/bin/adapters/cycle-counter-tool.ts +155 -0
  50. package/bin/adapters/scribe-tool.ts +71 -0
  51. package/bin/adapters/state-save-tool.ts +130 -0
  52. package/bin/adapters/write-lease-tool.ts +127 -0
  53. package/bin/buildanything-runtime.js +15 -0
  54. package/bin/buildanything-runtime.ts +328 -0
  55. package/bin/setup.js +83 -8
  56. package/commands/add-feature.md +2 -0
  57. package/commands/build.md +752 -332
  58. package/commands/fix.md +65 -0
  59. package/commands/self-check.md +121 -0
  60. package/commands/setup.md +114 -0
  61. package/commands/ux-review.md +63 -0
  62. package/commands/verify.md +69 -0
  63. package/docs/migration/agents.yaml +729 -0
  64. package/docs/migration/phase-graph.yaml +1088 -0
  65. package/docs/migration/sdk-host-compat.md +18 -0
  66. package/hooks/compile-writer-owner-cache.ts +171 -0
  67. package/hooks/hooks.json +36 -0
  68. package/hooks/pre-tool-use +19 -0
  69. package/hooks/pre-tool-use.ts +776 -0
  70. package/hooks/record-mode-transitions.ts +178 -0
  71. package/hooks/session-start +89 -2
  72. package/hooks/subagent-start +17 -0
  73. package/hooks/subagent-start.ts +471 -0
  74. package/hooks/subagent-stop +17 -0
  75. package/hooks/subagent-stop.ts +153 -0
  76. package/package.json +28 -5
  77. package/protocols/architecture-schema.md +171 -0
  78. package/protocols/build-fix.md +52 -0
  79. package/protocols/cleanup.md +54 -0
  80. package/protocols/decision-log.md +131 -0
  81. package/protocols/eval-harness.md +61 -0
  82. package/protocols/fake-data-detector.md +64 -0
  83. package/protocols/ios-context.md +234 -0
  84. package/protocols/ios-frameworks-map.md +323 -0
  85. package/protocols/ios-phase-branches.md +337 -0
  86. package/protocols/ios-preflight.md +27 -0
  87. package/protocols/launch-readiness.md +258 -0
  88. package/protocols/metric-loop.md +153 -0
  89. package/protocols/smoke-test.md +118 -0
  90. package/protocols/state-schema.json +388 -0
  91. package/protocols/state-schema.md +172 -0
  92. package/protocols/verify.md +127 -0
  93. package/protocols/visual-dna.md +185 -0
  94. package/protocols/web-phase-branches.md +351 -0
  95. package/skills/ios/_VENDORED.md +62 -0
  96. package/skills/ios/activitykit/LICENSE +131 -0
  97. package/skills/ios/activitykit/SKILL.md +505 -0
  98. package/skills/ios/activitykit/references/activitykit-patterns.md +868 -0
  99. package/skills/ios/app-intents/LICENSE +131 -0
  100. package/skills/ios/app-intents/SKILL.md +494 -0
  101. package/skills/ios/app-intents/references/appintents-advanced.md +1076 -0
  102. package/skills/ios/app-store-connect-metadata/SKILL.md +148 -0
  103. package/skills/ios/apple-on-device-ai/LICENSE +131 -0
  104. package/skills/ios/apple-on-device-ai/SKILL.md +505 -0
  105. package/skills/ios/apple-on-device-ai/references/coreml-conversion.md +425 -0
  106. package/skills/ios/apple-on-device-ai/references/coreml-optimization.md +344 -0
  107. package/skills/ios/apple-on-device-ai/references/foundation-models.md +508 -0
  108. package/skills/ios/apple-on-device-ai/references/mlx-swift.md +285 -0
  109. package/skills/ios/asc-privacy-manifest/SKILL.md +350 -0
  110. package/skills/ios/hig-components-content/SKILL.md +86 -0
  111. package/skills/ios/hig-components-content/references/activity-views.md +79 -0
  112. package/skills/ios/hig-components-content/references/charts.md +180 -0
  113. package/skills/ios/hig-components-content/references/collections.md +48 -0
  114. package/skills/ios/hig-components-content/references/color-wells.md +42 -0
  115. package/skills/ios/hig-components-content/references/image-views.md +82 -0
  116. package/skills/ios/hig-components-content/references/image-wells.md +34 -0
  117. package/skills/ios/hig-components-content/references/lockups.md +78 -0
  118. package/skills/ios/hig-components-content/references/web-views.md +36 -0
  119. package/skills/ios/hig-components-controls/SKILL.md +88 -0
  120. package/skills/ios/hig-components-controls/references/combo-boxes.md +40 -0
  121. package/skills/ios/hig-components-controls/references/controls.md +112 -0
  122. package/skills/ios/hig-components-controls/references/gauges.md +74 -0
  123. package/skills/ios/hig-components-controls/references/labels.md +92 -0
  124. package/skills/ios/hig-components-controls/references/pickers.md +128 -0
  125. package/skills/ios/hig-components-controls/references/rating-indicators.md +38 -0
  126. package/skills/ios/hig-components-controls/references/segmented-controls.md +94 -0
  127. package/skills/ios/hig-components-controls/references/sliders.md +92 -0
  128. package/skills/ios/hig-components-controls/references/steppers.md +40 -0
  129. package/skills/ios/hig-components-controls/references/text-fields.md +88 -0
  130. package/skills/ios/hig-components-controls/references/text-views.md +56 -0
  131. package/skills/ios/hig-components-controls/references/toggles.md +127 -0
  132. package/skills/ios/hig-components-controls/references/token-fields.md +48 -0
  133. package/skills/ios/hig-components-controls/references/virtual-keyboards.md +156 -0
  134. package/skills/ios/hig-components-dialogs/SKILL.md +76 -0
  135. package/skills/ios/hig-components-dialogs/references/action-sheets.md +74 -0
  136. package/skills/ios/hig-components-dialogs/references/alerts.md +158 -0
  137. package/skills/ios/hig-components-dialogs/references/digit-entry-views.md +32 -0
  138. package/skills/ios/hig-components-dialogs/references/popovers.md +81 -0
  139. package/skills/ios/hig-components-dialogs/references/sheets.md +157 -0
  140. package/skills/ios/hig-components-layout/SKILL.md +99 -0
  141. package/skills/ios/hig-components-layout/references/boxes.md +48 -0
  142. package/skills/ios/hig-components-layout/references/column-views.md +44 -0
  143. package/skills/ios/hig-components-layout/references/lists-and-tables.md +99 -0
  144. package/skills/ios/hig-components-layout/references/ornaments.md +56 -0
  145. package/skills/ios/hig-components-layout/references/outline-views.md +64 -0
  146. package/skills/ios/hig-components-layout/references/panels.md +75 -0
  147. package/skills/ios/hig-components-layout/references/scroll-views.md +123 -0
  148. package/skills/ios/hig-components-layout/references/sidebars.md +109 -0
  149. package/skills/ios/hig-components-layout/references/split-views.md +110 -0
  150. package/skills/ios/hig-components-layout/references/tab-bars.md +173 -0
  151. package/skills/ios/hig-components-layout/references/tab-views.md +68 -0
  152. package/skills/ios/hig-components-layout/references/windows.md +188 -0
  153. package/skills/ios/hig-components-menus/SKILL.md +81 -0
  154. package/skills/ios/hig-components-menus/references/action-button.md +61 -0
  155. package/skills/ios/hig-components-menus/references/buttons.md +261 -0
  156. package/skills/ios/hig-components-menus/references/context-menus.md +105 -0
  157. package/skills/ios/hig-components-menus/references/disclosure-controls.md +84 -0
  158. package/skills/ios/hig-components-menus/references/dock-menus.md +40 -0
  159. package/skills/ios/hig-components-menus/references/edit-menus.md +88 -0
  160. package/skills/ios/hig-components-menus/references/menus.md +171 -0
  161. package/skills/ios/hig-components-menus/references/pop-up-buttons.md +70 -0
  162. package/skills/ios/hig-components-menus/references/pull-down-buttons.md +77 -0
  163. package/skills/ios/hig-components-menus/references/the-menu-bar.md +303 -0
  164. package/skills/ios/hig-components-menus/references/toolbars.md +256 -0
  165. package/skills/ios/hig-components-search/SKILL.md +68 -0
  166. package/skills/ios/hig-components-search/references/page-controls.md +120 -0
  167. package/skills/ios/hig-components-search/references/path-controls.md +40 -0
  168. package/skills/ios/hig-components-search/references/search-fields.md +189 -0
  169. package/skills/ios/hig-components-status/SKILL.md +80 -0
  170. package/skills/ios/hig-components-status/references/activity-rings.md +105 -0
  171. package/skills/ios/hig-components-status/references/progress-indicators.md +116 -0
  172. package/skills/ios/hig-components-status/references/status-bars.md +38 -0
  173. package/skills/ios/hig-components-system/SKILL.md +88 -0
  174. package/skills/ios/hig-components-system/references/app-clips.md +387 -0
  175. package/skills/ios/hig-components-system/references/app-shortcuts.md +114 -0
  176. package/skills/ios/hig-components-system/references/complications.md +425 -0
  177. package/skills/ios/hig-components-system/references/home-screen-quick-actions.md +42 -0
  178. package/skills/ios/hig-components-system/references/live-activities.md +442 -0
  179. package/skills/ios/hig-components-system/references/notifications.md +153 -0
  180. package/skills/ios/hig-components-system/references/top-shelf.md +135 -0
  181. package/skills/ios/hig-components-system/references/watch-faces.md +40 -0
  182. package/skills/ios/hig-components-system/references/widgets.md +517 -0
  183. package/skills/ios/hig-foundations/SKILL.md +98 -0
  184. package/skills/ios/hig-foundations/references/accessibility.md +291 -0
  185. package/skills/ios/hig-foundations/references/app-icons.md +210 -0
  186. package/skills/ios/hig-foundations/references/branding.md +44 -0
  187. package/skills/ios/hig-foundations/references/color.md +274 -0
  188. package/skills/ios/hig-foundations/references/dark-mode.md +116 -0
  189. package/skills/ios/hig-foundations/references/icons.md +263 -0
  190. package/skills/ios/hig-foundations/references/images.md +176 -0
  191. package/skills/ios/hig-foundations/references/immersive-experiences.md +174 -0
  192. package/skills/ios/hig-foundations/references/inclusion.md +189 -0
  193. package/skills/ios/hig-foundations/references/layout.md +425 -0
  194. package/skills/ios/hig-foundations/references/materials.md +238 -0
  195. package/skills/ios/hig-foundations/references/motion.md +103 -0
  196. package/skills/ios/hig-foundations/references/privacy.md +231 -0
  197. package/skills/ios/hig-foundations/references/right-to-left.md +206 -0
  198. package/skills/ios/hig-foundations/references/sf-symbols.md +310 -0
  199. package/skills/ios/hig-foundations/references/spatial-layout.md +142 -0
  200. package/skills/ios/hig-foundations/references/typography.md +1146 -0
  201. package/skills/ios/hig-foundations/references/writing.md +91 -0
  202. package/skills/ios/hig-inputs/SKILL.md +94 -0
  203. package/skills/ios/hig-inputs/references/apple-pencil-and-scribble.md +148 -0
  204. package/skills/ios/hig-inputs/references/camera-control.md +107 -0
  205. package/skills/ios/hig-inputs/references/digital-crown.md +83 -0
  206. package/skills/ios/hig-inputs/references/eyes.md +120 -0
  207. package/skills/ios/hig-inputs/references/focus-and-selection.md +120 -0
  208. package/skills/ios/hig-inputs/references/game-controls.md +156 -0
  209. package/skills/ios/hig-inputs/references/gestures.md +208 -0
  210. package/skills/ios/hig-inputs/references/gyro-and-accelerometer.md +40 -0
  211. package/skills/ios/hig-inputs/references/keyboards.md +234 -0
  212. package/skills/ios/hig-inputs/references/nearby-interactions.md +70 -0
  213. package/skills/ios/hig-inputs/references/pointing-devices.md +237 -0
  214. package/skills/ios/hig-inputs/references/remotes.md +67 -0
  215. package/skills/ios/hig-inputs/references/spatial-interactions.md +70 -0
  216. package/skills/ios/hig-patterns/SKILL.md +104 -0
  217. package/skills/ios/hig-patterns/references/charting-data.md +81 -0
  218. package/skills/ios/hig-patterns/references/collaboration-and-sharing.md +86 -0
  219. package/skills/ios/hig-patterns/references/drag-and-drop.md +134 -0
  220. package/skills/ios/hig-patterns/references/entering-data.md +69 -0
  221. package/skills/ios/hig-patterns/references/feedback.md +67 -0
  222. package/skills/ios/hig-patterns/references/file-management.md +135 -0
  223. package/skills/ios/hig-patterns/references/going-full-screen.md +79 -0
  224. package/skills/ios/hig-patterns/references/launching.md +81 -0
  225. package/skills/ios/hig-patterns/references/live-viewing-apps.md +79 -0
  226. package/skills/ios/hig-patterns/references/loading.md +59 -0
  227. package/skills/ios/hig-patterns/references/managing-accounts.md +107 -0
  228. package/skills/ios/hig-patterns/references/managing-notifications.md +99 -0
  229. package/skills/ios/hig-patterns/references/modality.md +82 -0
  230. package/skills/ios/hig-patterns/references/multitasking.md +131 -0
  231. package/skills/ios/hig-patterns/references/offering-help.md +117 -0
  232. package/skills/ios/hig-patterns/references/onboarding.md +69 -0
  233. package/skills/ios/hig-patterns/references/playing-audio.md +124 -0
  234. package/skills/ios/hig-patterns/references/playing-haptics.md +280 -0
  235. package/skills/ios/hig-patterns/references/playing-video.md +180 -0
  236. package/skills/ios/hig-patterns/references/printing.md +50 -0
  237. package/skills/ios/hig-patterns/references/ratings-and-reviews.md +48 -0
  238. package/skills/ios/hig-patterns/references/searching.md +70 -0
  239. package/skills/ios/hig-patterns/references/settings.md +84 -0
  240. package/skills/ios/hig-patterns/references/undo-and-redo.md +58 -0
  241. package/skills/ios/hig-patterns/references/workouts.md +76 -0
  242. package/skills/ios/hig-platforms/SKILL.md +84 -0
  243. package/skills/ios/hig-platforms/references/designing-for-games.md +159 -0
  244. package/skills/ios/hig-platforms/references/designing-for-ios.md +66 -0
  245. package/skills/ios/hig-platforms/references/designing-for-ipados.md +64 -0
  246. package/skills/ios/hig-platforms/references/designing-for-macos.md +70 -0
  247. package/skills/ios/hig-platforms/references/designing-for-tvos.md +68 -0
  248. package/skills/ios/hig-platforms/references/designing-for-visionos.md +85 -0
  249. package/skills/ios/hig-platforms/references/designing-for-watchos.md +74 -0
  250. package/skills/ios/hig-project-context/SKILL.md +133 -0
  251. package/skills/ios/hig-technologies/SKILL.md +107 -0
  252. package/skills/ios/hig-technologies/references/airplay.md +125 -0
  253. package/skills/ios/hig-technologies/references/always-on.md +62 -0
  254. package/skills/ios/hig-technologies/references/apple-pay.md +441 -0
  255. package/skills/ios/hig-technologies/references/augmented-reality.md +247 -0
  256. package/skills/ios/hig-technologies/references/carekit.md +224 -0
  257. package/skills/ios/hig-technologies/references/carplay.md +119 -0
  258. package/skills/ios/hig-technologies/references/game-center.md +343 -0
  259. package/skills/ios/hig-technologies/references/generative-ai.md +110 -0
  260. package/skills/ios/hig-technologies/references/healthkit.md +120 -0
  261. package/skills/ios/hig-technologies/references/homekit.md +343 -0
  262. package/skills/ios/hig-technologies/references/icloud.md +52 -0
  263. package/skills/ios/hig-technologies/references/id-verifier.md +73 -0
  264. package/skills/ios/hig-technologies/references/imessage-apps-and-stickers.md +105 -0
  265. package/skills/ios/hig-technologies/references/in-app-purchase.md +263 -0
  266. package/skills/ios/hig-technologies/references/live-photos.md +54 -0
  267. package/skills/ios/hig-technologies/references/mac-catalyst.md +216 -0
  268. package/skills/ios/hig-technologies/references/machine-learning.md +394 -0
  269. package/skills/ios/hig-technologies/references/maps.md +221 -0
  270. package/skills/ios/hig-technologies/references/nfc.md +51 -0
  271. package/skills/ios/hig-technologies/references/photo-editing.md +40 -0
  272. package/skills/ios/hig-technologies/references/researchkit.md +134 -0
  273. package/skills/ios/hig-technologies/references/shareplay.md +142 -0
  274. package/skills/ios/hig-technologies/references/shazamkit.md +47 -0
  275. package/skills/ios/hig-technologies/references/sign-in-with-apple.md +288 -0
  276. package/skills/ios/hig-technologies/references/siri.md +523 -0
  277. package/skills/ios/hig-technologies/references/tap-to-pay-on-iphone.md +208 -0
  278. package/skills/ios/hig-technologies/references/voiceover.md +90 -0
  279. package/skills/ios/hig-technologies/references/wallet.md +420 -0
  280. package/skills/ios/ios-26-platform/SKILL.md +53 -0
  281. package/skills/ios/ios-26-platform/references/automatic-adoption.md +161 -0
  282. package/skills/ios/ios-26-platform/references/backward-compat.md +238 -0
  283. package/skills/ios/ios-26-platform/references/liquid-glass.md +255 -0
  284. package/skills/ios/ios-26-platform/references/swiftui-apis.md +277 -0
  285. package/skills/ios/ios-26-platform/references/toolbar-navigation.md +250 -0
  286. package/skills/ios/ios-bootstrap/SKILL.md +107 -0
  287. package/skills/ios/ios-bootstrap/references/apple-docs-mcp-config.md +28 -0
  288. package/skills/ios/ios-bootstrap/references/new-project-dialog.md +41 -0
  289. package/skills/ios/ios-bootstrap/references/xcode-mcp-config.md +29 -0
  290. package/skills/ios/ios-debugger-agent/LICENSE +21 -0
  291. package/skills/ios/ios-debugger-agent/SKILL.md +58 -0
  292. package/skills/ios/ios-debugger-agent/agents/openai.yaml +4 -0
  293. package/skills/ios/ios-entitlements-generator/SKILL.md +47 -0
  294. package/skills/ios/ios-info-plist-hardening/SKILL.md +130 -0
  295. package/skills/ios/ios-maestro-flow-author/SKILL.md +68 -0
  296. package/skills/ios/ios-maestro-flow-author/references/input-and-scroll.yaml +17 -0
  297. package/skills/ios/ios-maestro-flow-author/references/modal-and-dismiss.yaml +14 -0
  298. package/skills/ios/ios-maestro-flow-author/references/onboarding-flow.yaml +16 -0
  299. package/skills/ios/ios-maestro-flow-author/references/tab-navigation.yaml +13 -0
  300. package/skills/ios/ios-maestro-flow-author/references/tap-and-assert.yaml +9 -0
  301. package/skills/ios/swift-accessibility/LICENSE +21 -0
  302. package/skills/ios/swift-accessibility/SKILL.md +371 -0
  303. package/skills/ios/swift-accessibility/examples/before-after-appkit.md +446 -0
  304. package/skills/ios/swift-accessibility/examples/before-after-swiftui.md +441 -0
  305. package/skills/ios/swift-accessibility/examples/before-after-uikit.md +464 -0
  306. package/skills/ios/swift-accessibility/references/assistive-access.md +441 -0
  307. package/skills/ios/swift-accessibility/references/display-settings.md +491 -0
  308. package/skills/ios/swift-accessibility/references/dynamic-type.md +420 -0
  309. package/skills/ios/swift-accessibility/references/media-accessibility.md +421 -0
  310. package/skills/ios/swift-accessibility/references/motor-input.md +393 -0
  311. package/skills/ios/swift-accessibility/references/nutrition-labels.md +362 -0
  312. package/skills/ios/swift-accessibility/references/platform-specifics.md +515 -0
  313. package/skills/ios/swift-accessibility/references/semantic-structure.md +585 -0
  314. package/skills/ios/swift-accessibility/references/testing-auditing.md +507 -0
  315. package/skills/ios/swift-accessibility/references/voice-control.md +317 -0
  316. package/skills/ios/swift-accessibility/references/voiceover-swiftui.md +584 -0
  317. package/skills/ios/swift-accessibility/references/voiceover-uikit.md +519 -0
  318. package/skills/ios/swift-accessibility/references/wcag-mapping.md +167 -0
  319. package/skills/ios/swift-accessibility/resources/audit-template.swift +128 -0
  320. package/skills/ios/swift-accessibility/resources/qa-checklist.md +258 -0
  321. package/skills/ios/swift-actor-persistence/SKILL.md +143 -0
  322. package/skills/ios/swift-concurrency/LICENSE +21 -0
  323. package/skills/ios/swift-concurrency/SKILL.md +171 -0
  324. package/skills/ios/swift-concurrency/references/_index.md +50 -0
  325. package/skills/ios/swift-concurrency/references/actors.md +660 -0
  326. package/skills/ios/swift-concurrency/references/async-algorithms.md +847 -0
  327. package/skills/ios/swift-concurrency/references/async-await-basics.md +266 -0
  328. package/skills/ios/swift-concurrency/references/async-sequences.md +710 -0
  329. package/skills/ios/swift-concurrency/references/core-data.md +560 -0
  330. package/skills/ios/swift-concurrency/references/glossary.md +135 -0
  331. package/skills/ios/swift-concurrency/references/linting.md +155 -0
  332. package/skills/ios/swift-concurrency/references/memory-management.md +569 -0
  333. package/skills/ios/swift-concurrency/references/migration.md +1104 -0
  334. package/skills/ios/swift-concurrency/references/performance.md +593 -0
  335. package/skills/ios/swift-concurrency/references/sendable.md +598 -0
  336. package/skills/ios/swift-concurrency/references/tasks.md +636 -0
  337. package/skills/ios/swift-concurrency/references/testing.md +592 -0
  338. package/skills/ios/swift-concurrency/references/threading.md +495 -0
  339. package/skills/ios/swift-concurrency-6-2/SKILL.md +216 -0
  340. package/skills/ios/swift-protocol-di-testing/SKILL.md +190 -0
  341. package/skills/ios/swift-security-expert/LICENSE +21 -0
  342. package/skills/ios/swift-security-expert/SKILL.md +470 -0
  343. package/skills/ios/swift-security-expert/references/biometric-authentication.md +565 -0
  344. package/skills/ios/swift-security-expert/references/certificate-trust.md +592 -0
  345. package/skills/ios/swift-security-expert/references/common-anti-patterns.md +690 -0
  346. package/skills/ios/swift-security-expert/references/compliance-owasp-mapping.md +537 -0
  347. package/skills/ios/swift-security-expert/references/credential-storage-patterns.md +721 -0
  348. package/skills/ios/swift-security-expert/references/cryptokit-public-key.md +505 -0
  349. package/skills/ios/swift-security-expert/references/cryptokit-symmetric.md +497 -0
  350. package/skills/ios/swift-security-expert/references/keychain-access-control.md +508 -0
  351. package/skills/ios/swift-security-expert/references/keychain-fundamentals.md +596 -0
  352. package/skills/ios/swift-security-expert/references/keychain-item-classes.md +476 -0
  353. package/skills/ios/swift-security-expert/references/keychain-sharing.md +458 -0
  354. package/skills/ios/swift-security-expert/references/migration-legacy-stores.md +727 -0
  355. package/skills/ios/swift-security-expert/references/secure-enclave.md +539 -0
  356. package/skills/ios/swift-security-expert/references/testing-security-code.md +781 -0
  357. package/skills/ios/swift-testing-expert/LICENSE +21 -0
  358. package/skills/ios/swift-testing-expert/SKILL.md +79 -0
  359. package/skills/ios/swift-testing-expert/references/_index.md +12 -0
  360. package/skills/ios/swift-testing-expert/references/async-testing-and-waiting.md +127 -0
  361. package/skills/ios/swift-testing-expert/references/expectations.md +145 -0
  362. package/skills/ios/swift-testing-expert/references/fundamentals.md +141 -0
  363. package/skills/ios/swift-testing-expert/references/migration-from-xctest.md +127 -0
  364. package/skills/ios/swift-testing-expert/references/parallelization-and-isolation.md +95 -0
  365. package/skills/ios/swift-testing-expert/references/parameterized-testing.md +284 -0
  366. package/skills/ios/swift-testing-expert/references/performance-and-best-practices.md +187 -0
  367. package/skills/ios/swift-testing-expert/references/traits-and-tags.md +114 -0
  368. package/skills/ios/swift-testing-expert/references/xcode-workflows.md +70 -0
  369. package/skills/ios/swiftdata-pro/LICENSE +21 -0
  370. package/skills/ios/swiftdata-pro/SKILL.md +102 -0
  371. package/skills/ios/swiftdata-pro/agents/openai.yaml +10 -0
  372. package/skills/ios/swiftdata-pro/assets/swiftdata-pro-icon.png +0 -0
  373. package/skills/ios/swiftdata-pro/assets/swiftdata-pro-icon.svg +29 -0
  374. package/skills/ios/swiftdata-pro/references/class-inheritance.md +104 -0
  375. package/skills/ios/swiftdata-pro/references/cloudkit.md +10 -0
  376. package/skills/ios/swiftdata-pro/references/core-rules.md +20 -0
  377. package/skills/ios/swiftdata-pro/references/indexing.md +27 -0
  378. package/skills/ios/swiftdata-pro/references/predicates.md +73 -0
  379. package/skills/ios/swiftui-design-principles/AGENTS.md +21 -0
  380. package/skills/ios/swiftui-design-principles/LICENSE +21 -0
  381. package/skills/ios/swiftui-design-principles/README.md +41 -0
  382. package/skills/ios/swiftui-design-principles/SKILL.md +605 -0
  383. package/skills/ios/swiftui-design-principles/metadata.json +10 -0
  384. package/skills/ios/swiftui-design-tokens/SKILL.md +475 -0
  385. package/skills/ios/swiftui-liquid-glass/LICENSE +21 -0
  386. package/skills/ios/swiftui-liquid-glass/SKILL.md +95 -0
  387. package/skills/ios/swiftui-liquid-glass/agents/openai.yaml +4 -0
  388. package/skills/ios/swiftui-liquid-glass/references/liquid-glass.md +280 -0
  389. package/skills/ios/swiftui-performance-audit/LICENSE +21 -0
  390. package/skills/ios/swiftui-performance-audit/SKILL.md +111 -0
  391. package/skills/ios/swiftui-performance-audit/agents/openai.yaml +4 -0
  392. package/skills/ios/swiftui-performance-audit/references/code-smells.md +150 -0
  393. package/skills/ios/swiftui-performance-audit/references/demystify-swiftui-performance-wwdc23.md +46 -0
  394. package/skills/ios/swiftui-performance-audit/references/optimizing-swiftui-performance-instruments.md +29 -0
  395. package/skills/ios/swiftui-performance-audit/references/profiling-intake.md +44 -0
  396. package/skills/ios/swiftui-performance-audit/references/report-template.md +47 -0
  397. package/skills/ios/swiftui-performance-audit/references/understanding-hangs-in-your-app.md +33 -0
  398. package/skills/ios/swiftui-performance-audit/references/understanding-improving-swiftui-performance.md +52 -0
  399. package/skills/ios/swiftui-pro/LICENSE +21 -0
  400. package/skills/ios/swiftui-pro/SKILL.md +108 -0
  401. package/skills/ios/swiftui-pro/agents/openai.yaml +10 -0
  402. package/skills/ios/swiftui-pro/assets/swiftui-pro-icon.png +0 -0
  403. package/skills/ios/swiftui-pro/assets/swiftui-pro-icon.svg +29 -0
  404. package/skills/ios/swiftui-pro/references/accessibility.md +13 -0
  405. package/skills/ios/swiftui-pro/references/api.md +39 -0
  406. package/skills/ios/swiftui-pro/references/data.md +43 -0
  407. package/skills/ios/swiftui-pro/references/design.md +31 -0
  408. package/skills/ios/swiftui-pro/references/hygiene.md +9 -0
  409. package/skills/ios/swiftui-pro/references/navigation.md +14 -0
  410. package/skills/ios/swiftui-pro/references/performance.md +46 -0
  411. package/skills/ios/swiftui-pro/references/swift.md +56 -0
  412. package/skills/ios/swiftui-pro/references/views.md +35 -0
  413. package/skills/ios/swiftui-ui-patterns/LICENSE +21 -0
  414. package/skills/ios/swiftui-ui-patterns/SKILL.md +100 -0
  415. package/skills/ios/swiftui-ui-patterns/agents/openai.yaml +4 -0
  416. package/skills/ios/swiftui-ui-patterns/references/app-wiring.md +201 -0
  417. package/skills/ios/swiftui-ui-patterns/references/async-state.md +96 -0
  418. package/skills/ios/swiftui-ui-patterns/references/components-index.md +50 -0
  419. package/skills/ios/swiftui-ui-patterns/references/controls.md +57 -0
  420. package/skills/ios/swiftui-ui-patterns/references/deeplinks.md +66 -0
  421. package/skills/ios/swiftui-ui-patterns/references/focus.md +90 -0
  422. package/skills/ios/swiftui-ui-patterns/references/form.md +97 -0
  423. package/skills/ios/swiftui-ui-patterns/references/grids.md +71 -0
  424. package/skills/ios/swiftui-ui-patterns/references/haptics.md +71 -0
  425. package/skills/ios/swiftui-ui-patterns/references/input-toolbar.md +51 -0
  426. package/skills/ios/swiftui-ui-patterns/references/lightweight-clients.md +93 -0
  427. package/skills/ios/swiftui-ui-patterns/references/list.md +86 -0
  428. package/skills/ios/swiftui-ui-patterns/references/loading-placeholders.md +38 -0
  429. package/skills/ios/swiftui-ui-patterns/references/macos-settings.md +71 -0
  430. package/skills/ios/swiftui-ui-patterns/references/matched-transitions.md +59 -0
  431. package/skills/ios/swiftui-ui-patterns/references/media.md +73 -0
  432. package/skills/ios/swiftui-ui-patterns/references/menu-bar.md +101 -0
  433. package/skills/ios/swiftui-ui-patterns/references/navigationstack.md +159 -0
  434. package/skills/ios/swiftui-ui-patterns/references/overlay.md +45 -0
  435. package/skills/ios/swiftui-ui-patterns/references/performance.md +62 -0
  436. package/skills/ios/swiftui-ui-patterns/references/previews.md +48 -0
  437. package/skills/ios/swiftui-ui-patterns/references/scroll-reveal.md +133 -0
  438. package/skills/ios/swiftui-ui-patterns/references/scrollview.md +87 -0
  439. package/skills/ios/swiftui-ui-patterns/references/searchable.md +71 -0
  440. package/skills/ios/swiftui-ui-patterns/references/sheets.md +155 -0
  441. package/skills/ios/swiftui-ui-patterns/references/split-views.md +72 -0
  442. package/skills/ios/swiftui-ui-patterns/references/tabview.md +114 -0
  443. package/skills/ios/swiftui-ui-patterns/references/theming.md +71 -0
  444. package/skills/ios/swiftui-ui-patterns/references/title-menus.md +93 -0
  445. package/skills/ios/swiftui-ui-patterns/references/top-bar.md +49 -0
  446. package/skills/ios/swiftui-view-refactor/LICENSE +21 -0
  447. package/skills/ios/swiftui-view-refactor/SKILL.md +207 -0
  448. package/skills/ios/swiftui-view-refactor/agents/openai.yaml +4 -0
  449. package/skills/ios/swiftui-view-refactor/references/mv-patterns.md +161 -0
  450. package/skills/ios/widgetkit/LICENSE +131 -0
  451. package/skills/ios/widgetkit/SKILL.md +502 -0
  452. package/skills/ios/widgetkit/references/widgetkit-advanced.md +871 -0
  453. package/skills/ios/writing-for-interfaces/SKILL.md +75 -0
  454. package/skills/web/accessibility/SKILL.md +146 -0
  455. package/skills/web/aceternity-ui/SKILL.md +719 -0
  456. package/skills/web/aceternity-ui/metadata.json +10 -0
  457. package/skills/web/api-design/SKILL.md +523 -0
  458. package/skills/web/chart-accessibility/SKILL.md +332 -0
  459. package/skills/web/composition-patterns/AGENTS.md +946 -0
  460. package/skills/web/composition-patterns/README.md +60 -0
  461. package/skills/web/composition-patterns/SKILL.md +89 -0
  462. package/skills/web/composition-patterns/metadata.json +11 -0
  463. package/skills/web/composition-patterns/rules/_sections.md +29 -0
  464. package/skills/web/composition-patterns/rules/_template.md +24 -0
  465. package/skills/web/composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  466. package/skills/web/composition-patterns/rules/architecture-compound-components.md +112 -0
  467. package/skills/web/composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  468. package/skills/web/composition-patterns/rules/patterns-explicit-variants.md +100 -0
  469. package/skills/web/composition-patterns/rules/react19-no-forwardref.md +42 -0
  470. package/skills/web/composition-patterns/rules/state-context-interface.md +191 -0
  471. package/skills/web/composition-patterns/rules/state-decouple-implementation.md +113 -0
  472. package/skills/web/composition-patterns/rules/state-lift-state.md +125 -0
  473. package/skills/web/cost-aware-llm-pipeline/SKILL.md +183 -0
  474. package/skills/web/database-migrations/SKILL.md +429 -0
  475. package/skills/web/deployment-patterns/SKILL.md +427 -0
  476. package/skills/web/docker-patterns/SKILL.md +364 -0
  477. package/skills/web/e2e-testing/SKILL.md +326 -0
  478. package/skills/web/lighthouse-ci/SKILL.md +361 -0
  479. package/skills/web/mcp-server-patterns/SKILL.md +69 -0
  480. package/skills/web/next-best-practices/SKILL.md +153 -0
  481. package/skills/web/next-best-practices/async-patterns.md +87 -0
  482. package/skills/web/next-best-practices/bundling.md +180 -0
  483. package/skills/web/next-best-practices/data-patterns.md +297 -0
  484. package/skills/web/next-best-practices/debug-tricks.md +105 -0
  485. package/skills/web/next-best-practices/directives.md +73 -0
  486. package/skills/web/next-best-practices/error-handling.md +227 -0
  487. package/skills/web/next-best-practices/file-conventions.md +140 -0
  488. package/skills/web/next-best-practices/font.md +245 -0
  489. package/skills/web/next-best-practices/functions.md +108 -0
  490. package/skills/web/next-best-practices/hydration-error.md +91 -0
  491. package/skills/web/next-best-practices/image.md +173 -0
  492. package/skills/web/next-best-practices/metadata.md +301 -0
  493. package/skills/web/next-best-practices/parallel-routes.md +287 -0
  494. package/skills/web/next-best-practices/route-handlers.md +146 -0
  495. package/skills/web/next-best-practices/rsc-boundaries.md +159 -0
  496. package/skills/web/next-best-practices/runtime-selection.md +39 -0
  497. package/skills/web/next-best-practices/scripts.md +141 -0
  498. package/skills/web/next-best-practices/self-hosting.md +371 -0
  499. package/skills/web/next-best-practices/suspense-boundaries.md +67 -0
  500. package/skills/web/next-cache-components/SKILL.md +411 -0
  501. package/skills/web/postgres-best-practices/SKILL.md +14 -0
  502. package/skills/web/postgres-best-practices/references/schema-design.md +9 -0
  503. package/skills/web/react-best-practices/AGENTS.md +3810 -0
  504. package/skills/web/react-best-practices/README.md +123 -0
  505. package/skills/web/react-best-practices/SKILL.md +149 -0
  506. package/skills/web/react-best-practices/metadata.json +15 -0
  507. package/skills/web/react-best-practices/rules/_sections.md +46 -0
  508. package/skills/web/react-best-practices/rules/_template.md +28 -0
  509. package/skills/web/react-best-practices/rules/advanced-effect-event-deps.md +56 -0
  510. package/skills/web/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  511. package/skills/web/react-best-practices/rules/advanced-init-once.md +42 -0
  512. package/skills/web/react-best-practices/rules/advanced-use-latest.md +39 -0
  513. package/skills/web/react-best-practices/rules/async-api-routes.md +38 -0
  514. package/skills/web/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  515. package/skills/web/react-best-practices/rules/async-defer-await.md +82 -0
  516. package/skills/web/react-best-practices/rules/async-dependencies.md +51 -0
  517. package/skills/web/react-best-practices/rules/async-parallel.md +28 -0
  518. package/skills/web/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  519. package/skills/web/react-best-practices/rules/bundle-analyzable-paths.md +63 -0
  520. package/skills/web/react-best-practices/rules/bundle-barrel-imports.md +60 -0
  521. package/skills/web/react-best-practices/rules/bundle-conditional.md +31 -0
  522. package/skills/web/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  523. package/skills/web/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  524. package/skills/web/react-best-practices/rules/bundle-preload.md +50 -0
  525. package/skills/web/react-best-practices/rules/client-event-listeners.md +74 -0
  526. package/skills/web/react-best-practices/rules/client-localstorage-schema.md +71 -0
  527. package/skills/web/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  528. package/skills/web/react-best-practices/rules/client-swr-dedup.md +56 -0
  529. package/skills/web/react-best-practices/rules/js-batch-dom-css.md +107 -0
  530. package/skills/web/react-best-practices/rules/js-cache-function-results.md +80 -0
  531. package/skills/web/react-best-practices/rules/js-cache-property-access.md +28 -0
  532. package/skills/web/react-best-practices/rules/js-cache-storage.md +70 -0
  533. package/skills/web/react-best-practices/rules/js-combine-iterations.md +32 -0
  534. package/skills/web/react-best-practices/rules/js-early-exit.md +50 -0
  535. package/skills/web/react-best-practices/rules/js-flatmap-filter.md +60 -0
  536. package/skills/web/react-best-practices/rules/js-hoist-regexp.md +45 -0
  537. package/skills/web/react-best-practices/rules/js-index-maps.md +37 -0
  538. package/skills/web/react-best-practices/rules/js-length-check-first.md +49 -0
  539. package/skills/web/react-best-practices/rules/js-min-max-loop.md +82 -0
  540. package/skills/web/react-best-practices/rules/js-request-idle-callback.md +105 -0
  541. package/skills/web/react-best-practices/rules/js-set-map-lookups.md +24 -0
  542. package/skills/web/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  543. package/skills/web/react-best-practices/rules/rendering-activity.md +26 -0
  544. package/skills/web/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  545. package/skills/web/react-best-practices/rules/rendering-conditional-render.md +40 -0
  546. package/skills/web/react-best-practices/rules/rendering-content-visibility.md +38 -0
  547. package/skills/web/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  548. package/skills/web/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  549. package/skills/web/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  550. package/skills/web/react-best-practices/rules/rendering-resource-hints.md +85 -0
  551. package/skills/web/react-best-practices/rules/rendering-script-defer-async.md +68 -0
  552. package/skills/web/react-best-practices/rules/rendering-svg-precision.md +28 -0
  553. package/skills/web/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  554. package/skills/web/react-best-practices/rules/rerender-defer-reads.md +39 -0
  555. package/skills/web/react-best-practices/rules/rerender-dependencies.md +45 -0
  556. package/skills/web/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  557. package/skills/web/react-best-practices/rules/rerender-derived-state.md +29 -0
  558. package/skills/web/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  559. package/skills/web/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  560. package/skills/web/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  561. package/skills/web/react-best-practices/rules/rerender-memo.md +44 -0
  562. package/skills/web/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  563. package/skills/web/react-best-practices/rules/rerender-no-inline-components.md +82 -0
  564. package/skills/web/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  565. package/skills/web/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  566. package/skills/web/react-best-practices/rules/rerender-transitions.md +40 -0
  567. package/skills/web/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  568. package/skills/web/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  569. package/skills/web/react-best-practices/rules/server-after-nonblocking.md +73 -0
  570. package/skills/web/react-best-practices/rules/server-auth-actions.md +96 -0
  571. package/skills/web/react-best-practices/rules/server-cache-lru.md +41 -0
  572. package/skills/web/react-best-practices/rules/server-cache-react.md +76 -0
  573. package/skills/web/react-best-practices/rules/server-dedup-props.md +65 -0
  574. package/skills/web/react-best-practices/rules/server-hoist-static-io.md +149 -0
  575. package/skills/web/react-best-practices/rules/server-no-shared-module-state.md +50 -0
  576. package/skills/web/react-best-practices/rules/server-parallel-fetching.md +83 -0
  577. package/skills/web/react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
  578. package/skills/web/react-best-practices/rules/server-serialization.md +38 -0
  579. package/skills/web/seo/SKILL.md +154 -0
  580. package/skills/web/web-design-guidelines/SKILL.md +39 -0
  581. package/skills/web/zap-scan-config/SKILL.md +444 -0
  582. package/skills/web/zap-scan-config/assets/.gitkeep +9 -0
  583. package/skills/web/zap-scan-config/assets/github_action.yml +207 -0
  584. package/skills/web/zap-scan-config/assets/gitlab_ci.yml +226 -0
  585. package/skills/web/zap-scan-config/assets/zap_automation.yaml +196 -0
  586. package/skills/web/zap-scan-config/assets/zap_context.xml +192 -0
  587. package/skills/web/zap-scan-config/references/EXAMPLE.md +40 -0
  588. package/skills/web/zap-scan-config/references/api_testing_guide.md +475 -0
  589. package/skills/web/zap-scan-config/references/authentication_guide.md +431 -0
  590. package/skills/web/zap-scan-config/references/false_positive_handling.md +427 -0
  591. package/skills/web/zap-scan-config/references/owasp_mapping.md +255 -0
  592. package/src/lrr/aggregator.ts +80 -0
  593. package/src/orchestrator/hooks/context-header.ts +95 -0
  594. package/src/orchestrator/hooks/token-accounting-emitter.ts +77 -0
  595. package/src/orchestrator/hooks/token-accounting.ts +101 -0
  596. package/src/orchestrator/mcp/cycle-counter.ts +129 -0
  597. package/src/orchestrator/mcp/scribe.ts +283 -0
  598. package/src/orchestrator/mcp/state-save.ts +149 -0
  599. package/src/orchestrator/mcp/write-lease.ts +167 -0
  600. package/src/orchestrator/phase4-shared-context.ts +41 -0
  601. package/src/orchestrator/schemas/backward-edge.ts +46 -0
  602. package/agents/agentic-identity-trust.md +0 -121
  603. package/agents/data-consolidation-agent.md +0 -39
  604. package/agents/design-image-prompt-engineer.md +0 -105
  605. package/agents/design-visual-storyteller.md +0 -147
  606. package/agents/design-whimsy-injector.md +0 -89
  607. package/agents/engineering-autonomous-optimization-architect.md +0 -105
  608. package/agents/market-intel.md +0 -35
  609. package/agents/marketing-instagram-curator.md +0 -111
  610. package/agents/marketing-reddit-community-builder.md +0 -121
  611. package/agents/marketing-social-media-strategist.md +0 -74
  612. package/agents/marketing-tiktok-strategist.md +0 -123
  613. package/agents/marketing-twitter-engager.md +0 -124
  614. package/agents/marketing-wechat-official-account.md +0 -143
  615. package/agents/marketing-xiaohongshu-specialist.md +0 -136
  616. package/agents/marketing-zhihu-strategist.md +0 -160
  617. package/agents/product-behavioral-nudge-engine.md +0 -78
  618. package/agents/project-management-experiment-tracker.md +0 -102
  619. package/agents/report-distribution-agent.md +0 -43
  620. package/agents/risk-analysis.md +0 -45
  621. package/agents/sales-data-extraction-agent.md +0 -46
  622. package/agents/specialized-cultural-intelligence-strategist.md +0 -65
  623. package/agents/specialized-developer-advocate.md +0 -146
  624. package/agents/support-analytics-reporter.md +0 -133
  625. package/agents/support-executive-summary-generator.md +0 -64
  626. package/agents/support-finance-tracker.md +0 -145
  627. package/agents/support-legal-compliance-checker.md +0 -129
  628. package/agents/support-support-responder.md +0 -91
  629. package/agents/testing-accessibility-auditor.md +0 -110
  630. package/agents/testing-test-results-analyzer.md +0 -97
  631. package/agents/testing-tool-evaluator.md +0 -76
  632. package/agents/testing-workflow-optimizer.md +0 -99
  633. package/agents/user-research.md +0 -40
@@ -0,0 +1,1104 @@
1
+ # Migration to Swift 6 and Strict Concurrency
2
+
3
+ Use this when:
4
+
5
+ - You are moving an existing codebase toward Swift 6 or stricter concurrency checking.
6
+ - Compiler diagnostics depend on language mode, default isolation, or upcoming features.
7
+ - You need the smallest safe migration sequence instead of a full architectural rewrite.
8
+
9
+ Skip this file if:
10
+
11
+ - You already know the exact diagnostic and only need a local fix. Start from `actors.md`, `sendable.md`, or `threading.md`.
12
+ - You are looking for debounce, stream composition, or FRP operator replacements. Use `async-algorithms.md`.
13
+
14
+ Jump to:
15
+
16
+ - Project Settings
17
+ - Six Migration Habits
18
+ - Step-by-Step Migration
19
+ - Migration Tooling
20
+ - Rewriting Closures to Async/Await
21
+ - Migrating from Combine/RxSwift
22
+ - Concurrency-Safe Notifications (iOS 26+)
23
+ - Anti-Patterns
24
+
25
+ ---
26
+
27
+ ## Why Migrate to Swift 6?
28
+
29
+ Swift 6 doesn't fundamentally change how Swift Concurrency works—it **enforces existing rules more strictly**:
30
+
31
+ - **Compile-time safety**: Catches data races and threading issues at compile time instead of runtime
32
+ - **Warnings become errors**: Many Swift 5 warnings become hard errors in Swift 6 language mode
33
+ - **Future-proofing**: New concurrency features will build on this stricter foundation
34
+ - **Better maintainability**: Code becomes safer and easier to reason about
35
+
36
+ > **Important**: You can adopt strict concurrency checking gradually while still compiling under Swift 5. You don't need to flip the Swift 6 switch immediately.
37
+
38
+ > **Course Deep Dive**: This topic is covered in detail in [Lesson 12.2: The impact of Swift 6 on Swift Concurrency](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
39
+
40
+ ---
41
+
42
+ ## Project Settings That Change Concurrency Behavior
43
+
44
+ Before interpreting diagnostics or choosing a fix, confirm the target/module settings. These settings can materially change how code executes and what the compiler enforces.
45
+
46
+ ### Quick matrix
47
+
48
+ | Setting / feature | Where to check | Why it matters |
49
+ |---|---|---|
50
+ | Swift language mode (Swift 5.x vs Swift 6) | Xcode build settings (`SWIFT_VERSION`) / SwiftPM `// swift-tools-version:` | Swift 6 turns many warnings into errors and enables stricter defaults. |
51
+ | Strict concurrency checking | Xcode: Strict Concurrency Checking (`SWIFT_STRICT_CONCURRENCY`) / SwiftPM: strict concurrency flags | Controls how aggressively Sendable + isolation rules are enforced. |
52
+ | Default actor isolation | Xcode: Default Actor Isolation (`SWIFT_DEFAULT_ACTOR_ISOLATION`) / SwiftPM: `.defaultIsolation(MainActor.self)` | Changes the default isolation of declarations; can reduce migration noise but changes behavior and requirements. |
53
+ | `NonisolatedNonsendingByDefault` | Xcode upcoming feature / SwiftPM `.enableUpcomingFeature("NonisolatedNonsendingByDefault")` | Changes how nonisolated async functions execute (can inherit the caller’s actor unless explicitly marked `@concurrent`). |
54
+ | Approachable Concurrency | Xcode build setting / SwiftPM enables the underlying upcoming features | Bundles multiple upcoming features; recommended to migrate feature-by-feature first. |
55
+
56
+ ## The Concurrency Rabbit Hole
57
+
58
+ A common migration experience:
59
+
60
+ 1. Enable strict concurrency checking
61
+ 2. See 50+ errors and warnings
62
+ 3. Fix a bunch of them
63
+ 4. Rebuild and see 80+ new errors appear
64
+
65
+ **Why this happens**: Fixing isolation in one place often exposes issues elsewhere. This is normal and manageable with the right strategy.
66
+
67
+ > **Course Deep Dive**: This topic is covered in detail in [Lesson 12.1: Challenges in migrating to Swift Concurrency](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
68
+
69
+ ---
70
+
71
+ ## Six Migration Habits for Success
72
+
73
+ ### 1. Don't Panic—It's All About Iterations
74
+
75
+ Break migration into small, manageable chunks:
76
+
77
+ ```swift
78
+ // Day 1: Enable strict concurrency, fix a few warnings
79
+ // Build Settings → Strict Concurrency Checking = Complete
80
+
81
+ // Day 2: Fix more warnings
82
+
83
+ // Day 3: Revert to minimal checking if needed
84
+ // Build Settings → Strict Concurrency Checking = Minimal
85
+ ```
86
+
87
+ Allow yourself 30 minutes per day to migrate gradually. Don't expect completion in a few days for large projects.
88
+
89
+ ### 2. Sendable by Default for New Code
90
+
91
+ When writing new types, make them `Sendable` from the start:
92
+
93
+ ```swift
94
+ // ✅ Good: New code prepared for Swift 6
95
+ struct UserProfile: Sendable {
96
+ let id: UUID
97
+ let name: String
98
+ }
99
+
100
+ // ❌ Avoid: Creating technical debt
101
+ class UserProfile { // Will need migration later
102
+ var id: UUID
103
+ var name: String
104
+ }
105
+ ```
106
+
107
+ It's easier to design for concurrency upfront than to retrofit it later.
108
+
109
+ ### 3. Use Swift 6 for New Projects and Packages
110
+
111
+ For new projects, packages, or files:
112
+ - Enable Swift 6 language mode from the start
113
+ - Use Swift Concurrency features (async/await, actors)
114
+ - Reduce technical debt before it accumulates
115
+
116
+ You can enable Swift 6 for individual files in a Swift 5 project to prevent scope creep.
117
+
118
+ ### 4. Resist the Urge to Refactor
119
+
120
+ **Focus solely on concurrency changes**. Don't combine migration with:
121
+ - Architecture refactors
122
+ - API modernization
123
+ - Code style improvements
124
+
125
+ Create separate tickets for non-concurrency refactors and address them later.
126
+
127
+ ### 5. Focus on Minimal Changes
128
+
129
+ - Make small, focused pull requests
130
+ - Migrate one class or module at a time
131
+ - Get changes merged quickly to create checkpoints
132
+ - Avoid large PRs that are hard to review
133
+
134
+ ### 6. Don't Just @MainActor All the Things
135
+
136
+ Don't blindly add `@MainActor` to fix warnings. Consider:
137
+ - Should this actually run on the main actor?
138
+ - Would a custom actor be more appropriate?
139
+ - Is `nonisolated` the right choice?
140
+
141
+ **Exception**: For app projects (not frameworks), consider enabling **Default Actor Isolation** to `@MainActor`, since most app code needs main thread access.
142
+
143
+ > **Course Deep Dive**: This topic is covered in detail in [Lesson 12.3: The six migration habits for a successful migration](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
144
+
145
+ ---
146
+
147
+ ## Step-by-Step Migration Process
148
+
149
+ ### 1. Find an Isolated Piece of Code
150
+
151
+ Start with:
152
+ - Standalone packages with minimal dependencies
153
+ - Individual Swift files within a package
154
+ - Code that's not heavily used throughout the project
155
+
156
+ **Why**: Fewer dependencies = less risk of falling into the concurrency rabbit hole.
157
+
158
+ ### 2. Update Related Dependencies
159
+
160
+ Before enabling strict concurrency:
161
+
162
+ ```swift
163
+ // Update third-party packages to latest versions
164
+ // Example: Vapor, Alamofire, etc.
165
+ ```
166
+
167
+ Apply these updates in a separate PR before proceeding with concurrency changes.
168
+
169
+ ### 3. Add Async Alternatives
170
+
171
+ Provide async/await wrappers for existing closure-based APIs:
172
+
173
+ ```swift
174
+ // Original closure-based API
175
+ @available(*, deprecated, renamed: "fetchImage(urlRequest:)",
176
+ message: "Consider using the async/await alternative.")
177
+ func fetchImage(urlRequest: URLRequest,
178
+ completion: @escaping @Sendable (Result<UIImage, Error>) -> Void) {
179
+ // ... existing implementation
180
+ }
181
+
182
+ // New async wrapper
183
+ func fetchImage(urlRequest: URLRequest) async throws -> UIImage {
184
+ return try await withCheckedThrowingContinuation { continuation in
185
+ fetchImage(urlRequest: urlRequest) { result in
186
+ continuation.resume(with: result)
187
+ }
188
+ }
189
+ }
190
+ ```
191
+
192
+ **Benefits**:
193
+ - Colleagues can start using async/await immediately
194
+ - You can migrate callers before rewriting implementation
195
+ - Tests can be updated to async/await first
196
+
197
+ **Tip**: Use Xcode's **Refactor → Add Async Wrapper** to generate these automatically.
198
+
199
+ ### 4. Change Default Actor Isolation (Swift 6.2+)
200
+
201
+ For app projects, set default isolation to `@MainActor`:
202
+
203
+ **Xcode Build Settings**:
204
+ ```
205
+ Swift Concurrency → Default Actor Isolation = MainActor
206
+ ```
207
+
208
+ **Swift Package Manager**:
209
+ ```swift
210
+ .target(
211
+ name: "MyTarget",
212
+ swiftSettings: [
213
+ .defaultIsolation(MainActor.self)
214
+ ]
215
+ )
216
+ ```
217
+
218
+ This drastically reduces warnings in app code where most types need main thread access.
219
+
220
+ ### 5. Enable Strict Concurrency Checking
221
+
222
+ **Xcode Build Settings**: Search for "Strict Concurrency Checking"
223
+
224
+ Three levels available:
225
+
226
+ - **Minimal**: Only checks code that explicitly adopts concurrency (`@Sendable`, `@MainActor`)
227
+ - **Targeted**: Checks all code that adopts concurrency, including `Sendable` conformances
228
+ - **Complete**: Checks entire codebase (matches Swift 6 behavior)
229
+
230
+ **Swift Package Manager**:
231
+ ```swift
232
+ .target(
233
+ name: "MyTarget",
234
+ swiftSettings: [
235
+ .enableExperimentalFeature("StrictConcurrency=targeted")
236
+ ]
237
+ )
238
+ ```
239
+
240
+ **Strategy**: Start with Minimal → Targeted → Complete, fixing errors at each level.
241
+
242
+ ### 6. Add Sendable Conformances
243
+
244
+ Even if the compiler doesn't complain, add `Sendable` to types that will cross isolation domains:
245
+
246
+ ```swift
247
+ // ✅ Prepare for future use
248
+ struct Configuration: Sendable {
249
+ let apiKey: String
250
+ let timeout: TimeInterval
251
+ }
252
+ ```
253
+
254
+ This prevents warnings when the type is used in concurrent contexts later.
255
+
256
+ ### 7. Enable Approachable Concurrency (Swift 6.2+)
257
+
258
+ **Xcode Build Settings**: Search for "Approachable Concurrency"
259
+
260
+ Enables multiple upcoming features at once:
261
+ - `DisableOutwardActorInference`
262
+ - `GlobalActorIsolatedTypesUsability`
263
+ - `InferIsolatedConformances`
264
+ - `InferSendableFromCaptures`
265
+ - `NonisolatedNonsendingByDefault`
266
+
267
+ **⚠️ Warning**: Don't just flip this switch for existing projects. Use migration tooling (see below) to migrate to each feature individually first.
268
+
269
+ > **Course Deep Dive**: This topic is covered in detail in [Lesson 12.5: The Approachable Concurrency build setting (Updated for Swift 6.2)](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
270
+
271
+ ### 8. Enable Upcoming Features
272
+
273
+ **Xcode Build Settings**: Search for "Upcoming Feature"
274
+
275
+ Enable features individually:
276
+
277
+ **Swift Package Manager**:
278
+ ```swift
279
+ .target(
280
+ name: "MyTarget",
281
+ swiftSettings: [
282
+ .enableUpcomingFeature("ExistentialAny"),
283
+ .enableUpcomingFeature("InferIsolatedConformances")
284
+ ]
285
+ )
286
+ ```
287
+
288
+ Find feature keys in Swift Evolution proposals (e.g., SE-335 for `ExistentialAny`).
289
+
290
+ ### 9. Change to Swift 6 Language Mode
291
+
292
+ **Xcode Build Settings**:
293
+ ```
294
+ Swift Language Version = Swift 6
295
+ ```
296
+
297
+ **Swift Package Manager**:
298
+ ```swift
299
+ // swift-tools-version: 6.0
300
+ ```
301
+
302
+ If you've completed all previous steps, you should have minimal new errors.
303
+
304
+ > **Course Deep Dive**: This topic is covered in detail in [Lesson 12.4: Steps to migrate existing code to Swift 6 and Strict Concurrency Checking](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
305
+
306
+ ---
307
+
308
+ ## Migration Tooling for Upcoming Features
309
+
310
+ Swift 6.2+ includes **semi-automatic migration** for upcoming features.
311
+
312
+ ### Xcode Migration
313
+
314
+ 1. Go to Build Settings → Find the upcoming feature (e.g., "Require Existential any")
315
+ 2. Set to **Migrate** (temporary setting)
316
+ 3. Build the project
317
+ 4. Warnings appear with **Apply** buttons
318
+ 5. Click Apply for each warning
319
+
320
+ **Example warning**:
321
+ ```swift
322
+ // ⚠️ Use of protocol 'Error' as a type must be written 'any Error'
323
+ func fetchData() throws -> Data // Before
324
+ func fetchData() throws -> any Data // After applying fix
325
+ ```
326
+
327
+ ### Package Migration
328
+
329
+ Use the `swift package migrate` command:
330
+
331
+ ```bash
332
+ # Migrate all targets
333
+ swift package migrate --to-feature ExistentialAny
334
+
335
+ # Migrate specific target
336
+ swift package migrate --target MyTarget --to-feature ExistentialAny
337
+ ```
338
+
339
+ **Output**:
340
+ ```
341
+ > Applied 24 fix-its in 11 files (0.016s)
342
+ > Updating manifest
343
+ ```
344
+
345
+ The tool automatically:
346
+ - Applies all fix-its
347
+ - Updates `Package.swift` to enable the feature
348
+
349
+ **Available migrations** (as of Swift 6.2):
350
+ - `ExistentialAny` (SE-335)
351
+ - `InferIsolatedConformances` (SE-470)
352
+ - More features will add migration support over time
353
+
354
+ > **Course Deep Dive**: This topic is covered in detail in [Lesson 12.6: Migration tooling for upcoming Swift features](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
355
+
356
+ **Additional resource**: [Migration Tooling Video](https://youtu.be/FK9XFxSWZPg?si=2z_ybn1t1YCJow5k)
357
+
358
+ ---
359
+
360
+ ## Rewriting Closures to Async/Await
361
+
362
+ ### Using Xcode Refactoring
363
+
364
+ Three refactoring options available:
365
+
366
+ 1. **Add Async Wrapper**: Wraps existing closure-based method (recommended first step)
367
+ 2. **Add Async Alternative**: Rewrites method as async, keeps original
368
+ 3. **Convert Function to Async**: Replaces method entirely
369
+
370
+ **⚠️ Known Issue**: Refactoring can be unstable in Xcode. If you get "Connection interrupted" errors:
371
+ - Clean build folder
372
+ - Clear derived data
373
+ - Restart Xcode
374
+ - Simplify complex methods (shorthand if statements can cause failures)
375
+
376
+ ### Manual Rewriting Example
377
+
378
+ **Before** (closure-based):
379
+ ```swift
380
+ func fetchImage(urlRequest: URLRequest,
381
+ completion: @escaping @Sendable (Result<UIImage, Error>) -> Void) {
382
+ URLSession.shared.dataTask(with: urlRequest) { data, _, error in
383
+ do {
384
+ if let error = error { throw error }
385
+ guard let data = data, let image = UIImage(data: data) else {
386
+ throw ImageError.conversionFailed
387
+ }
388
+ completion(.success(image))
389
+ } catch {
390
+ completion(.failure(error))
391
+ }
392
+ }.resume()
393
+ }
394
+ ```
395
+
396
+ **After** (async/await):
397
+ ```swift
398
+ func fetchImage(urlRequest: URLRequest) async throws -> UIImage {
399
+ let (data, _) = try await URLSession.shared.data(for: urlRequest)
400
+ guard let image = UIImage(data: data) else {
401
+ throw ImageError.conversionFailed
402
+ }
403
+ return image
404
+ }
405
+ ```
406
+
407
+ **Benefits**:
408
+ - Less code to maintain
409
+ - Easier to reason about
410
+ - No nested closures
411
+ - Automatic error propagation
412
+
413
+ > **Course Deep Dive**: This topic is covered in detail in [Lesson 12.7: Techniques for rewriting closures to async/await syntax](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
414
+
415
+ ---
416
+
417
+ ## Using @preconcurrency
418
+
419
+ Suppresses `Sendable` warnings from modules you don't control.
420
+
421
+ ### When to Use
422
+
423
+ ```swift
424
+ // ⚠️ Third-party library doesn't support Swift Concurrency yet
425
+ @preconcurrency import SomeThirdPartyLibrary
426
+
427
+ actor DataProcessor {
428
+ func process(_ data: LibraryType) { // No Sendable warning
429
+ // ...
430
+ }
431
+ }
432
+ ```
433
+
434
+ ### Risks
435
+
436
+ - **No compile-time safety**: You're responsible for ensuring thread safety
437
+ - **Hides real issues**: Library might not be thread-safe at all
438
+ - **Technical debt**: Easy to forget to revisit later
439
+
440
+ ### Best Practices
441
+
442
+ 1. **Don't use by default**: Only add when compiler suggests it
443
+ 2. **Check for updates first**: Library might have a newer version with concurrency support
444
+ 3. **Document why**: Add a comment explaining why it's needed
445
+ 4. **Revisit regularly**: Set reminders to check if library has been updated
446
+
447
+ ```swift
448
+ // TODO: Remove @preconcurrency when SomeLibrary adds Sendable support
449
+ // Last checked: 2026-01-07 (version 2.3.0)
450
+ @preconcurrency import SomeLibrary
451
+ ```
452
+
453
+ The compiler will warn if `@preconcurrency` is unused:
454
+ ```
455
+ '@preconcurrency' attribute on module 'SomeModule' is unused
456
+ ```
457
+
458
+ > **Course Deep Dive**: This topic is covered in detail in [Lesson 12.8: How and when to use @preconcurrency](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
459
+
460
+ ---
461
+
462
+ ## Migrating from Combine/RxSwift
463
+
464
+ ### Observation Alternative
465
+
466
+ Swift 6 will include **Transactional Observation** (SE-475):
467
+
468
+ ```swift
469
+ // Future API (not yet implemented)
470
+ let names = Observations { person.name }
471
+
472
+ Task.detached {
473
+ for await name in names {
474
+ print("Name updated to: \(name)")
475
+ }
476
+ }
477
+ ```
478
+
479
+ **Current alternatives**:
480
+ - Use `@Observable` macro for SwiftUI
481
+ - Use `AsyncStream` for custom observation
482
+ - Consider [AsyncExtensions](https://github.com/sideeffect-io/AsyncExtensions) package
483
+
484
+ ### Debouncing Example
485
+
486
+ **Combine**:
487
+ ```swift
488
+ $searchQuery
489
+ .debounce(for: .milliseconds(500), scheduler: DispatchQueue.main)
490
+ .sink { [weak self] query in
491
+ self?.performSearch(query)
492
+ }
493
+ .store(in: &cancellables)
494
+ ```
495
+
496
+ **Swift Concurrency**:
497
+ ```swift
498
+ func search(_ query: String) {
499
+ currentSearchTask?.cancel()
500
+
501
+ currentSearchTask = Task {
502
+ do {
503
+ try await Task.sleep(for: .milliseconds(500))
504
+ performSearch(query)
505
+ } catch {
506
+ // Search was cancelled
507
+ }
508
+ }
509
+ }
510
+ ```
511
+
512
+ **SwiftUI Integration**:
513
+ ```swift
514
+ struct SearchView: View {
515
+ @State private var searchQuery = ""
516
+ @State private var searcher = ArticleSearcher()
517
+
518
+ var body: some View {
519
+ List(searcher.results) { result in
520
+ Text(result.title)
521
+ }
522
+ .searchable(text: $searchQuery)
523
+ .onChange(of: searchQuery) { _, newValue in
524
+ searcher.search(newValue)
525
+ }
526
+ }
527
+ }
528
+ ```
529
+
530
+ ### Mindset Shift
531
+
532
+ **Don't think in Combine pipelines**. Many problems are simpler without FRP:
533
+
534
+ ```swift
535
+ // ❌ Looking for AsyncSequence equivalent of complex Combine pipeline
536
+ somePublisher
537
+ .debounce(for: .seconds(0.5))
538
+ .removeDuplicates()
539
+ .flatMap { ... }
540
+ .sink { ... }
541
+
542
+ // ✅ Rethink the problem with Swift Concurrency
543
+ Task {
544
+ var lastValue: String?
545
+ for await value in stream {
546
+ guard value != lastValue else { continue }
547
+ lastValue = value
548
+ try await Task.sleep(for: .seconds(0.5))
549
+ await process(value)
550
+ }
551
+ }
552
+ ```
553
+
554
+ **For complex operators**: Check [Swift Async Algorithms](https://github.com/apple/swift-async-algorithms) package.
555
+
556
+ ### ⚠️ Critical: Actor Isolation with Combine
557
+
558
+ **Problem**: `sink` closures don't respect actor isolation at compile time.
559
+
560
+ ```swift
561
+ @MainActor
562
+ final class NotificationObserver {
563
+ private var cancellables: [AnyCancellable] = []
564
+
565
+ init() {
566
+ NotificationCenter.default.publisher(for: .someNotification)
567
+ .sink { [weak self] _ in
568
+ self?.handleNotification() // ⚠️ May crash if posted from background
569
+ }
570
+ .store(in: &cancellables)
571
+ }
572
+
573
+ private func handleNotification() {
574
+ // Expects to run on main actor
575
+ }
576
+ }
577
+ ```
578
+
579
+ **Why it crashes**: Notification observers run on the same thread as the poster. If posted from a background thread, the `@MainActor` method is called off the main actor.
580
+
581
+ **Solutions**:
582
+
583
+ 1. **Migrate to Swift Concurrency** (recommended):
584
+ ```swift
585
+ Task { [weak self] in
586
+ for await _ in NotificationCenter.default.notifications(named: .someNotification) {
587
+ await self?.handleNotification() // ✅ Compile-time safe
588
+ }
589
+ }
590
+ ```
591
+
592
+ 2. **Use Task wrapper** (temporary):
593
+ ```swift
594
+ .sink { [weak self] _ in
595
+ Task { @MainActor in
596
+ self?.handleNotification()
597
+ }
598
+ }
599
+ ```
600
+
601
+ > **Course Deep Dive**: This topic is covered in detail in [Lesson 12.9: Migrating away from Functional Reactive Programming like RxSwift or Combine](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
602
+
603
+ ---
604
+
605
+ ## When to Use AsyncAlgorithms
606
+
607
+ When migrating from Combine or RxSwift, you have multiple options for handling asynchronous patterns:
608
+
609
+ ### Use AsyncAlgorithms for:
610
+
611
+ - **Time-based operations**: debounce, throttle, timers
612
+ - **Combining multiple async sequences**: merge, combineLatest, zip
613
+ - **Multi-consumer scenarios**: AsyncChannel for backpressure
614
+ - **Complex operator chains**: FRP-like patterns in Swift Concurrency
615
+ - **Specific operators**: removeDuplicates, chunks, adjacentPairs, compacted
616
+
617
+ ### Use Standard Library for:
618
+
619
+ - **Bridging callbacks**: AsyncStream is sufficient
620
+ - **Simple iteration**: for await in sequence
621
+ - **Single-value operations**: async/await
622
+ - **Basic transformations**: map, filter, contains
623
+
624
+ ### Use SwiftUI for:
625
+
626
+ - **UI observation**: @Observable macro
627
+ - **State management**: @State, @Published properties
628
+ - **User interactions**: onChange, onReceive modifiers
629
+
630
+ > **See**: [async-algorithms.md](async-algorithms.md) for detailed AsyncAlgorithms usage examples.
631
+
632
+ ---
633
+
634
+ ## Real-World Migration Examples
635
+
636
+ ### Example: ArticleSearcher with AsyncAlgorithms
637
+
638
+ **Before: Manual Debouncing**
639
+
640
+ ```swift
641
+ final class ArticleSearcher {
642
+ @MainActor private(set) var results: [Article] = []
643
+ private var currentSearchTask: Task<Void, Never>?
644
+
645
+ func search(_ query: String) {
646
+ currentSearchTask?.cancel()
647
+
648
+ currentSearchTask = Task {
649
+ do {
650
+ try await Task.sleep(for: .milliseconds(500))
651
+ await MainActor.run {
652
+ self.results = []
653
+ }
654
+ self.results = await APIClient.searchArticles(query)
655
+ } catch {
656
+ // Search was cancelled
657
+ }
658
+ }
659
+ }
660
+ }
661
+
662
+ // SwiftUI integration
663
+ struct SearchView: View {
664
+ @State private var searchQuery = ""
665
+ @State private var searcher = ArticleSearcher()
666
+
667
+ var body: some View {
668
+ List(searcher.results) { result in
669
+ Text(result.title)
670
+ }
671
+ .searchable(text: $searchQuery)
672
+ .onChange(of: searchQuery) { _, newValue in
673
+ searcher.search(newValue)
674
+ }
675
+ }
676
+ }
677
+ ```
678
+
679
+ **After: AsyncAlgorithms Debounce**
680
+
681
+ ```swift
682
+ import AsyncAlgorithms
683
+
684
+ @Observable
685
+ final class ArticleSearcher {
686
+ @MainActor private(set) var results: [Article] = []
687
+ private var searchQueryContinuation: AsyncStream<String>.Continuation?
688
+
689
+ private lazy var searchQueryStream: AsyncStream<String> = {
690
+ AsyncStream { continuation in
691
+ searchQueryContinuation = continuation
692
+ }
693
+ }()
694
+
695
+ func search(_ query: String) {
696
+ searchQueryContinuation?.yield(query)
697
+ }
698
+
699
+ func startDebouncedSearch() {
700
+ Task { @MainActor in
701
+ for await query in searchQueryStream.debounce(for: .milliseconds(500)) {
702
+ self.results = []
703
+ self.results = await APIClient.searchArticles(query)
704
+ }
705
+ }
706
+ }
707
+ }
708
+
709
+ // SwiftUI integration
710
+ struct SearchView: View {
711
+ @State private var searchQuery = ""
712
+ @State private var searcher = ArticleSearcher()
713
+
714
+ var body: some View {
715
+ List(searcher.results) { result in
716
+ Text(result.title)
717
+ }
718
+ .searchable(text: $searchQuery)
719
+ .onChange(of: searchQuery) { _, newValue in
720
+ searcher.search(newValue)
721
+ }
722
+ .onAppear {
723
+ searcher.startDebouncedSearch()
724
+ }
725
+ }
726
+ }
727
+ ```
728
+
729
+ **Benefits of using AsyncAlgorithms**:
730
+ - Automatic cancellation when new values arrive
731
+ - Backpressure handling (producer respects consumer pace)
732
+ - Cleaner code than manual Task.sleep management
733
+ - No need to track and cancel tasks manually
734
+
735
+ ### Example: Notification Stream Migration
736
+
737
+ **Before: Combine Publisher**
738
+
739
+ ```swift
740
+ import Combine
741
+
742
+ final class NotificationObserver: ObservableObject {
743
+ @Published private(set) var notifications: [AppNotification] = []
744
+ private var cancellables = Set<AnyCancellable>()
745
+
746
+ init() {
747
+ NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)
748
+ .compactMap { notification in
749
+ notification.object as? AppNotification
750
+ }
751
+ .receive(on: DispatchQueue.main)
752
+ .assign(to: &$notifications)
753
+ }
754
+ }
755
+ ```
756
+
757
+ **After: Standard Library Notifications**
758
+
759
+ ```swift
760
+ @Observable
761
+ final class NotificationObserver {
762
+ @MainActor private(set) var notifications: [AppNotification] = []
763
+
764
+ func startObserving() {
765
+ Task {
766
+ for await notification in NotificationCenter.default.notifications(named: UIApplication.didBecomeActiveNotification) {
767
+ if let appNotification = notification.object as? AppNotification {
768
+ notifications.append(appNotification)
769
+ }
770
+ }
771
+ }
772
+ }
773
+ }
774
+ ```
775
+
776
+ **When to use each approach**:
777
+ - Use `notifications(named:)` for standard system notifications
778
+ - Use `AsyncChannel` for custom multi-consumer notification scenarios
779
+ - Use `@Observable` + SwiftUI for UI state updates
780
+
781
+ ### Example: Multi-Source Data Loading
782
+
783
+ **Before: Combine Merge**
784
+
785
+ ```swift
786
+ import Combine
787
+
788
+ final class MultiSourceLoader: ObservableObject {
789
+ @Published private(set) var items: [Item] = []
790
+ private var cancellables = Set<AnyCancellable>()
791
+
792
+ func loadFromAllSources() {
793
+ let source1 = APIClient.fetchItems(from: .source1)
794
+ let source2 = APIClient.fetchItems(from: .source2)
795
+ let source3 = APIClient.fetchItems(from: .source3)
796
+
797
+ Publishers.Merge3(source1, source2, source3)
798
+ .flatMap { items in
799
+ Just(items)
800
+ .delay(for: .seconds(0.1), scheduler: DispatchQueue.main)
801
+ }
802
+ .scan([]) { accumulated, new in
803
+ accumulated + new
804
+ }
805
+ .receive(on: DispatchQueue.main)
806
+ .assign(to: &$items)
807
+ .store(in: &cancellables)
808
+ }
809
+ }
810
+ ```
811
+
812
+ **After: AsyncAlgorithms Merge + TaskGroup**
813
+
814
+ ```swift
815
+ import AsyncAlgorithms
816
+
817
+ @Observable
818
+ final class MultiSourceLoader {
819
+ @MainActor private(set) var items: [Item] = []
820
+
821
+ func loadFromAllSources() async {
822
+ let sources = [
823
+ APIClient.fetchItems(from: .source1),
824
+ APIClient.fetchItems(from: .source2),
825
+ APIClient.fetchItems(from: .source3)
826
+ ]
827
+
828
+ Task { @MainActor in
829
+ for await stream in sources.map { $0.values }.merge() {
830
+ for await newItems in stream {
831
+ self.items.append(contentsOf: newItems)
832
+ }
833
+ }
834
+ }
835
+ }
836
+
837
+ // Alternative: Using TaskGroup for parallel execution
838
+ func loadFromAllSourcesParallel() async {
839
+ await withTaskGroup(of: [Item].self) { group in
840
+ group.addTask {
841
+ await APIClient.fetchItems(from: .source1)
842
+ }
843
+ group.addTask {
844
+ await APIClient.fetchItems(from: .source2)
845
+ }
846
+ group.addTask {
847
+ await APIClient.fetchItems(from: .source3)
848
+ }
849
+
850
+ for await newItems in group {
851
+ await MainActor.run {
852
+ self.items.append(contentsOf: newItems)
853
+ }
854
+ }
855
+ }
856
+ }
857
+ }
858
+ ```
859
+
860
+ **Key differences**:
861
+ - Combine `merge()` combines publishers; AsyncAlgorithms `merge()` combines sequences
862
+ - For parallel execution, use `TaskGroup` instead of `flatMap`
863
+ - State updates can use `@MainActor` instead of `.receive(on:)`
864
+
865
+ ---
866
+
867
+ ## Anti-Patterns to Avoid
868
+
869
+ ### ❌ Don't Use Task.sleep for Debouncing
870
+
871
+ ```swift
872
+ // ❌ Bad: Manual debouncing without backpressure
873
+ func search(_ query: String) {
874
+ Task {
875
+ try? await Task.sleep(for: .milliseconds(500))
876
+ await performSearch(query)
877
+ }
878
+ }
879
+ ```
880
+
881
+ **Problem**: Every keystroke spawns a new task. If user types fast, multiple tasks execute simultaneously after 500ms, causing out-of-order results and wasted API calls.
882
+
883
+ **Solution**: Use `debounce()` from AsyncAlgorithms for automatic backpressure and cancellation.
884
+
885
+ ### ❌ Don't Manually Combine Values
886
+
887
+ ```swift
888
+ // ❌ Bad: Manual combination without operator
889
+ actor FormValidator {
890
+ private var currentUsername: String = ""
891
+ private var currentEmail: String = ""
892
+ private var currentPassword: String = ""
893
+
894
+ func updateUsername(_ username: String) {
895
+ currentUsername = username
896
+ checkForm()
897
+ }
898
+
899
+ func updateEmail(_ email: String) {
900
+ currentEmail = email
901
+ checkForm()
902
+ }
903
+
904
+ func updatePassword(_ password: String) {
905
+ currentPassword = password
906
+ checkForm()
907
+ }
908
+
909
+ private func checkForm() {
910
+ let state = validate(
911
+ username: currentUsername,
912
+ email: currentEmail,
913
+ password: currentPassword
914
+ )
915
+ // Update UI or emit validation state
916
+ }
917
+ }
918
+ ```
919
+
920
+ **Problems**:
921
+ - More state management
922
+ - Boilerplate code for each field
923
+ - Harder to add new fields
924
+ - No stream composition benefits
925
+
926
+ **Solution**: Use `combineLatest()` for cleaner, composable validation.
927
+
928
+ ### ❌ Don't Share Streams Without AsyncChannel
929
+
930
+ ```swift
931
+ // ❌ Bad: Multiple consumers sharing same stream
932
+ let stream = AsyncStream<Int> { continuation in
933
+ for i in 1...10 {
934
+ continuation.yield(i)
935
+ }
936
+ continuation.finish()
937
+ }
938
+
939
+ Task {
940
+ for await value in stream {
941
+ print("Consumer 1: \(value)")
942
+ }
943
+ }
944
+
945
+ Task {
946
+ for await value in stream {
947
+ print("Consumer 2: \(value)")
948
+ }
949
+ }
950
+ ```
951
+
952
+ **Problem**: Values are split between consumers unpredictably. Each value goes to only one consumer.
953
+
954
+ **Solution**: Use `AsyncChannel` for true multi-consumer scenarios with backpressure.
955
+
956
+ ---
957
+
958
+ ---
959
+
960
+ ## Concurrency-Safe Notifications (iOS 26+)
961
+
962
+ Swift 6.2 introduces **typed, thread-safe notifications**.
963
+
964
+ ### MainActorMessage
965
+
966
+ For notifications that should be delivered on the main actor:
967
+
968
+ ```swift
969
+ // Old way
970
+ NotificationCenter.default.addObserver(
971
+ forName: UIApplication.didBecomeActiveNotification,
972
+ object: nil,
973
+ queue: .main
974
+ ) { [weak self] _ in
975
+ self?.handleDidBecomeActive() // ⚠️ Concurrency warning
976
+ }
977
+
978
+ // New way (iOS 26+)
979
+ token = NotificationCenter.default.addObserver(
980
+ of: UIApplication.self,
981
+ for: .didBecomeActive
982
+ ) { [weak self] message in
983
+ self?.handleDidBecomeActive() // ✅ No warning, guaranteed main actor
984
+ }
985
+ ```
986
+
987
+ **Key difference**: Observer closure is guaranteed to run on `@MainActor`.
988
+
989
+ ### AsyncMessage
990
+
991
+ For notifications delivered asynchronously on arbitrary isolation:
992
+
993
+ ```swift
994
+ struct RecentBuildsChangedMessage: NotificationCenter.AsyncMessage {
995
+ typealias Subject = [RecentBuild]
996
+ let recentBuilds: Subject
997
+ }
998
+
999
+ // Enable static member lookup
1000
+ extension NotificationCenter.MessageIdentifier
1001
+ where Self == NotificationCenter.BaseMessageIdentifier<RecentBuildsChangedMessage> {
1002
+ static var recentBuildsChanged: NotificationCenter.BaseMessageIdentifier<RecentBuildsChangedMessage> {
1003
+ .init()
1004
+ }
1005
+ }
1006
+ ```
1007
+
1008
+ **Posting**:
1009
+ ```swift
1010
+ let builds = [RecentBuild(appName: "Stock Analyzer")]
1011
+ let message = RecentBuildsChangedMessage(recentBuilds: builds)
1012
+ NotificationCenter.default.post(message)
1013
+ ```
1014
+
1015
+ **Observing**:
1016
+ ```swift
1017
+ // Old way: Unsafe casting
1018
+ NotificationCenter.default.addObserver(forName: .recentBuildsChanged, object: nil, queue: nil) { notification in
1019
+ guard let builds = notification.object as? [RecentBuild] else { return }
1020
+ handleBuilds(builds)
1021
+ }
1022
+
1023
+ // New way: Strongly typed, thread-safe
1024
+ token = NotificationCenter.default.addObserver(
1025
+ of: [RecentBuild].self,
1026
+ for: .recentBuildsChanged
1027
+ ) { message in
1028
+ handleBuilds(message.recentBuilds) // ✅ Direct access, no casting
1029
+ }
1030
+ ```
1031
+
1032
+ **Benefits**:
1033
+ - Strongly typed (no `Any` casting)
1034
+ - Compile-time thread safety
1035
+ - Clear isolation guarantees
1036
+
1037
+ > **Course Deep Dive**: This topic is covered in detail in [Lesson 12.10: Migrating to concurrency-safe notifications](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
1038
+
1039
+ ---
1040
+
1041
+ ## Common Challenges
1042
+
1043
+ ### "It's Too Much Work"
1044
+
1045
+ Break it down:
1046
+ - Migrate one package at a time
1047
+ - Use 30-minute daily sessions
1048
+ - Create checkpoints with small PRs
1049
+ - Celebrate incremental progress
1050
+
1051
+ ### "My Team Isn't Ready"
1052
+
1053
+ Start small:
1054
+ - Enable Swift 6 for new files only
1055
+ - Make new types `Sendable` by default
1056
+ - Share learnings in team meetings
1057
+ - Pair program on tricky migrations
1058
+
1059
+ ### "Dependencies Aren't Ready"
1060
+
1061
+ Options:
1062
+ - Update to latest versions first
1063
+ - Use `@preconcurrency` temporarily
1064
+ - Contribute fixes to open-source dependencies
1065
+ - Wrap third-party APIs in your own concurrency-safe layer
1066
+
1067
+ ### "I Keep Going in Circles"
1068
+
1069
+ This is the "concurrency rabbit hole":
1070
+ - Take breaks and revisit later
1071
+ - Temporarily disable strict checking to make progress elsewhere
1072
+ - Focus on one module at a time
1073
+ - Don't try to fix everything at once
1074
+
1075
+ > **Course Deep Dive**: This topic is covered in detail in [Lesson 12.11: Frequently Asked Questions (FAQ) around Swift 6 Migrations](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
1076
+
1077
+ ---
1078
+
1079
+ ## Common Mistakes Agents Make
1080
+
1081
+ - **Blanket `@MainActor`**: Do not slap `@MainActor` on everything to silence errors. Ask whether the code truly needs main-actor isolation.
1082
+ - **Mixing migration with unrelated refactors**: Focus solely on concurrency changes. Architectural improvements belong in separate PRs.
1083
+ - **Using `@unchecked Sendable` as a first response**: Prefer immutable value types or actors. Reserve escape hatches for documented, temporary exceptions.
1084
+ - **Giving pre-Swift 6.2 execution advice without checking the active feature set**: `nonisolated async` behavior depends on whether `NonisolatedNonsendingByDefault` is enabled.
1085
+ - **Using Approachable Concurrency without migrating feature-by-feature first**: Enable individual upcoming features before the full bundle to understand each change's impact.
1086
+
1087
+ ## Summary
1088
+
1089
+ Migration to Swift 6 is a journey, not a sprint:
1090
+
1091
+ 1. **Start small**: Find isolated code with minimal dependencies
1092
+ 2. **Be incremental**: Use the three strict concurrency levels (Minimal → Targeted → Complete)
1093
+ 3. **Use tooling**: Leverage Xcode refactoring and `swift package migrate`
1094
+ 4. **Create checkpoints**: Small, focused PRs that can be merged quickly
1095
+ 5. **Stay positive**: The concurrency rabbit hole is real, but manageable with the right habits
1096
+ 6. **Think differently**: Let go of the threading mindset; trust the compiler
1097
+
1098
+ The result is **compile-time thread safety**, more maintainable code, and a future-proof codebase.
1099
+
1100
+ **Additional resources**:
1101
+ - [Approachable Concurrency Video](https://youtu.be/y_Qc8cT-O_g?si=y4C1XQDGtyIOLW81)
1102
+ - [Migration Tooling Video](https://youtu.be/FK9XFxSWZPg?si=2z_ybn1t1YCJow5k)
1103
+ - [Swift Concurrency Course](https://www.swiftconcurrencycourse.com) for in-depth migration strategies
1104
+