@danieljvdm/dev-kit 1.0.2 → 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 (329) hide show
  1. package/README.md +6 -6
  2. package/package.json +1 -1
  3. package/skill-sources.jsonc +2 -33
  4. package/skill-sources.lock.json +15 -117
  5. package/skills/animate/LICENSE +21 -0
  6. package/skills/animate/NOTICE +10 -0
  7. package/skills/animate/SKILL.md +34 -0
  8. package/skills/animate/references/gestures.md +27 -0
  9. package/skills/animate/references/glossary.md +136 -0
  10. package/skills/animate/references/implementation.md +22 -0
  11. package/skills/animate/references/opportunities.md +18 -0
  12. package/skills/animate/references/principles.md +48 -0
  13. package/skills/animate/references/review.md +19 -0
  14. package/skills/cloudflare-workers/LICENSE +202 -0
  15. package/skills/cloudflare-workers/NOTICE +9 -0
  16. package/skills/cloudflare-workers/SKILL.md +26 -0
  17. package/skills/cloudflare-workers/references/durable-objects.md +68 -0
  18. package/skills/cloudflare-workers/references/sandbox.md +48 -0
  19. package/skills/cloudflare-workers/references/workers.md +63 -0
  20. package/skills/cloudflare-workers/references/wrangler.md +56 -0
  21. package/skills/design-ui/LICENSE +21 -0
  22. package/skills/design-ui/NOTICE +8 -0
  23. package/skills/design-ui/SKILL.md +29 -0
  24. package/skills/design-ui/references/appearance.md +22 -0
  25. package/skills/design-ui/references/components.md +33 -0
  26. package/skills/design-ui/references/exploration.md +50 -0
  27. package/skills/design-ui/references/libraries.md +39 -0
  28. package/skills/design-ui/references/themes.md +23 -0
  29. package/skills/dev-kit/SKILL.md +19 -38
  30. package/skills/dev-kit/references/cloudflare-worker-api.md +1 -1
  31. package/skills/dev-kit/references/skills.md +2 -2
  32. package/skills/effect-development/SKILL.md +27 -0
  33. package/skills/effect-development/agents/openai.yaml +4 -0
  34. package/skills/effect-development/references/api/index.md +32 -0
  35. package/skills/effect-development/references/api/schema-codecs.md +15 -0
  36. package/skills/{build-effect-apis/references → effect-development/references/api}/verification.md +10 -5
  37. package/skills/{effect-architecture-audit/SKILL.md → effect-development/references/architecture/index.md} +1 -6
  38. package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-client.md +8 -6
  39. package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-testing.md +7 -2
  40. package/skills/effect-development/references/atom/index.md +40 -0
  41. package/skills/{build-effect-clis/references → effect-development/references/cli}/entrypoints-and-testing.md +6 -2
  42. package/skills/effect-development/references/cli/index.md +39 -0
  43. package/skills/effect-development/references/setup.md +15 -0
  44. package/skills/open-pull-request/SKILL.md +10 -70
  45. package/skills/open-pull-request/references/evidence.md +22 -0
  46. package/skills/open-pull-request/references/explanation.md +21 -0
  47. package/skills/open-pull-request/references/publication.md +21 -0
  48. package/skills/sentry/LICENSE +202 -0
  49. package/skills/sentry/LICENSE-UPSTREAM +21 -0
  50. package/skills/sentry/NOTICE +14 -0
  51. package/skills/sentry/SKILL.md +33 -0
  52. package/skills/sentry/references/alert-payloads.md +105 -0
  53. package/skills/sentry/references/alerts.md +17 -0
  54. package/skills/sentry/references/artifacts.md +25 -0
  55. package/skills/sentry/references/auth-token.md +65 -0
  56. package/skills/sentry/references/concepts/ai-monitoring.md +131 -0
  57. package/skills/sentry/references/concepts/choosing-a-signal.md +78 -0
  58. package/skills/sentry/references/concepts/crons.md +50 -0
  59. package/skills/sentry/references/concepts/data-scrubbing.md +43 -0
  60. package/skills/sentry/references/concepts/errors.md +40 -0
  61. package/skills/sentry/references/concepts/logging.md +85 -0
  62. package/skills/sentry/references/concepts/metrics.md +49 -0
  63. package/skills/sentry/references/concepts/monitors.md +78 -0
  64. package/skills/sentry/references/concepts/profiling.md +38 -0
  65. package/skills/sentry/references/concepts/reduce-volume.md +49 -0
  66. package/skills/sentry/references/concepts/releases.md +43 -0
  67. package/skills/sentry/references/concepts/session-replay.md +35 -0
  68. package/skills/sentry/references/concepts/tracing.md +54 -0
  69. package/skills/sentry/references/concepts/user-feedback.md +36 -0
  70. package/skills/sentry/references/debug-artifacts/android.md +68 -0
  71. package/skills/sentry/references/debug-artifacts/apple.md +96 -0
  72. package/skills/sentry/references/debug-artifacts/dotnet.md +70 -0
  73. package/skills/sentry/references/debug-artifacts/flutter.md +65 -0
  74. package/skills/sentry/references/debug-artifacts/index.md +75 -0
  75. package/skills/sentry/references/debug-artifacts/javascript.md +94 -0
  76. package/skills/sentry/references/debug-artifacts/matching.md +73 -0
  77. package/skills/sentry/references/debug-artifacts/react-native.md +75 -0
  78. package/skills/sentry/references/first-error-setup.md +25 -0
  79. package/skills/sentry/references/instrumentation.md +30 -0
  80. package/skills/sentry/references/issues.md +32 -0
  81. package/skills/sentry/references/new-project.md +17 -0
  82. package/skills/sentry/references/otel-exporter.md +30 -0
  83. package/skills/sentry/references/release-workflow.md +31 -0
  84. package/skills/sentry/references/releases/ci-pipeline.md +214 -0
  85. package/skills/sentry/references/releases/index.md +93 -0
  86. package/skills/sentry/references/releases/suspect-commits.md +155 -0
  87. package/skills/sentry/references/releases/tagging.md +131 -0
  88. package/skills/sentry/references/releases/troubleshooting.md +67 -0
  89. package/skills/sentry/references/sdks/android/crons.md +305 -0
  90. package/skills/sentry/references/sdks/android/error-monitoring.md +800 -0
  91. package/skills/sentry/references/sdks/android/index.md +748 -0
  92. package/skills/sentry/references/sdks/android/integrations.md +48 -0
  93. package/skills/sentry/references/sdks/android/logging.md +374 -0
  94. package/skills/sentry/references/sdks/android/metrics.md +288 -0
  95. package/skills/sentry/references/sdks/android/profiling.md +397 -0
  96. package/skills/sentry/references/sdks/android/session-replay.md +406 -0
  97. package/skills/sentry/references/sdks/android/tracing.md +861 -0
  98. package/skills/sentry/references/sdks/browser/error-monitoring.md +861 -0
  99. package/skills/sentry/references/sdks/browser/index.md +714 -0
  100. package/skills/sentry/references/sdks/browser/logging.md +315 -0
  101. package/skills/sentry/references/sdks/browser/profiling.md +236 -0
  102. package/skills/sentry/references/sdks/browser/session-replay.md +586 -0
  103. package/skills/sentry/references/sdks/browser/tracing.md +561 -0
  104. package/skills/sentry/references/sdks/browser/user-feedback.md +354 -0
  105. package/skills/sentry/references/sdks/cloudflare/ai-monitoring.md +661 -0
  106. package/skills/sentry/references/sdks/cloudflare/crons.md +231 -0
  107. package/skills/sentry/references/sdks/cloudflare/durable-objects.md +381 -0
  108. package/skills/sentry/references/sdks/cloudflare/error-monitoring.md +329 -0
  109. package/skills/sentry/references/sdks/cloudflare/index.md +698 -0
  110. package/skills/sentry/references/sdks/cloudflare/logging.md +169 -0
  111. package/skills/sentry/references/sdks/cloudflare/nodejs-compat.md +134 -0
  112. package/skills/sentry/references/sdks/cloudflare/tracing.md +475 -0
  113. package/skills/sentry/references/sdks/cocoa/error-monitoring.md +394 -0
  114. package/skills/sentry/references/sdks/cocoa/index.md +497 -0
  115. package/skills/sentry/references/sdks/cocoa/logging.md +209 -0
  116. package/skills/sentry/references/sdks/cocoa/metrics.md +136 -0
  117. package/skills/sentry/references/sdks/cocoa/profiling.md +223 -0
  118. package/skills/sentry/references/sdks/cocoa/session-replay.md +257 -0
  119. package/skills/sentry/references/sdks/cocoa/tracing.md +524 -0
  120. package/skills/sentry/references/sdks/cocoa/user-feedback.md +310 -0
  121. package/skills/sentry/references/sdks/dotnet/crons.md +465 -0
  122. package/skills/sentry/references/sdks/dotnet/error-monitoring.md +1100 -0
  123. package/skills/sentry/references/sdks/dotnet/index.md +614 -0
  124. package/skills/sentry/references/sdks/dotnet/logging.md +556 -0
  125. package/skills/sentry/references/sdks/dotnet/metrics.md +229 -0
  126. package/skills/sentry/references/sdks/dotnet/profiling.md +296 -0
  127. package/skills/sentry/references/sdks/dotnet/tracing.md +897 -0
  128. package/skills/sentry/references/sdks/elixir/crons.md +371 -0
  129. package/skills/sentry/references/sdks/elixir/error-monitoring.md +335 -0
  130. package/skills/sentry/references/sdks/elixir/index.md +383 -0
  131. package/skills/sentry/references/sdks/elixir/logging.md +239 -0
  132. package/skills/sentry/references/sdks/elixir/tracing.md +233 -0
  133. package/skills/sentry/references/sdks/flutter/ecosystem-integrations.md +70 -0
  134. package/skills/sentry/references/sdks/flutter/error-monitoring.md +312 -0
  135. package/skills/sentry/references/sdks/flutter/index.md +728 -0
  136. package/skills/sentry/references/sdks/flutter/logging.md +387 -0
  137. package/skills/sentry/references/sdks/flutter/metrics.md +310 -0
  138. package/skills/sentry/references/sdks/flutter/profiling.md +214 -0
  139. package/skills/sentry/references/sdks/flutter/session-replay.md +308 -0
  140. package/skills/sentry/references/sdks/flutter/tracing.md +502 -0
  141. package/skills/sentry/references/sdks/go/crons.md +270 -0
  142. package/skills/sentry/references/sdks/go/error-monitoring.md +361 -0
  143. package/skills/sentry/references/sdks/go/index.md +324 -0
  144. package/skills/sentry/references/sdks/go/logging.md +354 -0
  145. package/skills/sentry/references/sdks/go/metrics.md +273 -0
  146. package/skills/sentry/references/sdks/go/profiling.md +46 -0
  147. package/skills/sentry/references/sdks/go/tracing.md +366 -0
  148. package/skills/sentry/references/sdks/index.md +41 -0
  149. package/skills/sentry/references/sdks/nestjs/ai-monitoring.md +410 -0
  150. package/skills/sentry/references/sdks/nestjs/crons.md +268 -0
  151. package/skills/sentry/references/sdks/nestjs/error-monitoring.md +729 -0
  152. package/skills/sentry/references/sdks/nestjs/index.md +699 -0
  153. package/skills/sentry/references/sdks/nestjs/logging.md +174 -0
  154. package/skills/sentry/references/sdks/nestjs/metrics.md +243 -0
  155. package/skills/sentry/references/sdks/nestjs/profiling.md +127 -0
  156. package/skills/sentry/references/sdks/nestjs/tracing.md +762 -0
  157. package/skills/sentry/references/sdks/nextjs/ai-monitoring.md +494 -0
  158. package/skills/sentry/references/sdks/nextjs/crons.md +383 -0
  159. package/skills/sentry/references/sdks/nextjs/error-monitoring.md +974 -0
  160. package/skills/sentry/references/sdks/nextjs/index.md +491 -0
  161. package/skills/sentry/references/sdks/nextjs/logging.md +381 -0
  162. package/skills/sentry/references/sdks/nextjs/metrics.md +411 -0
  163. package/skills/sentry/references/sdks/nextjs/profiling.md +403 -0
  164. package/skills/sentry/references/sdks/nextjs/session-replay.md +462 -0
  165. package/skills/sentry/references/sdks/nextjs/tracing.md +628 -0
  166. package/skills/sentry/references/sdks/node/ai-monitoring.md +303 -0
  167. package/skills/sentry/references/sdks/node/crons.md +432 -0
  168. package/skills/sentry/references/sdks/node/error-monitoring.md +1125 -0
  169. package/skills/sentry/references/sdks/node/index.md +942 -0
  170. package/skills/sentry/references/sdks/node/logging.md +380 -0
  171. package/skills/sentry/references/sdks/node/metrics.md +278 -0
  172. package/skills/sentry/references/sdks/node/profiling.md +373 -0
  173. package/skills/sentry/references/sdks/node/tracing.md +878 -0
  174. package/skills/sentry/references/sdks/php/ai-monitoring.md +310 -0
  175. package/skills/sentry/references/sdks/php/crons.md +265 -0
  176. package/skills/sentry/references/sdks/php/error-monitoring.md +626 -0
  177. package/skills/sentry/references/sdks/php/index.md +362 -0
  178. package/skills/sentry/references/sdks/php/laravel.md +542 -0
  179. package/skills/sentry/references/sdks/php/logging.md +242 -0
  180. package/skills/sentry/references/sdks/php/metrics.md +193 -0
  181. package/skills/sentry/references/sdks/php/profiling.md +115 -0
  182. package/skills/sentry/references/sdks/php/symfony.md +552 -0
  183. package/skills/sentry/references/sdks/php/tracing.md +516 -0
  184. package/skills/sentry/references/sdks/python/ai-monitoring.md +351 -0
  185. package/skills/sentry/references/sdks/python/crons.md +218 -0
  186. package/skills/sentry/references/sdks/python/error-monitoring.md +292 -0
  187. package/skills/sentry/references/sdks/python/index.md +361 -0
  188. package/skills/sentry/references/sdks/python/logging.md +234 -0
  189. package/skills/sentry/references/sdks/python/metrics.md +154 -0
  190. package/skills/sentry/references/sdks/python/profiling.md +120 -0
  191. package/skills/sentry/references/sdks/python/tracing.md +364 -0
  192. package/skills/sentry/references/sdks/react/error-monitoring.md +1607 -0
  193. package/skills/sentry/references/sdks/react/index.md +492 -0
  194. package/skills/sentry/references/sdks/react/logging.md +364 -0
  195. package/skills/sentry/references/sdks/react/profiling.md +322 -0
  196. package/skills/sentry/references/sdks/react/react-features.md +1272 -0
  197. package/skills/sentry/references/sdks/react/session-replay.md +1193 -0
  198. package/skills/sentry/references/sdks/react/tracing.md +1415 -0
  199. package/skills/sentry/references/sdks/react-native/error-monitoring.md +1481 -0
  200. package/skills/sentry/references/sdks/react-native/expo-config-plugin.md +45 -0
  201. package/skills/sentry/references/sdks/react-native/index.md +1030 -0
  202. package/skills/sentry/references/sdks/react-native/logging.md +444 -0
  203. package/skills/sentry/references/sdks/react-native/profiling.md +386 -0
  204. package/skills/sentry/references/sdks/react-native/session-replay.md +704 -0
  205. package/skills/sentry/references/sdks/react-native/tracing.md +1086 -0
  206. package/skills/sentry/references/sdks/react-native/user-feedback.md +815 -0
  207. package/skills/sentry/references/sdks/react-router-framework/error-monitoring.md +127 -0
  208. package/skills/sentry/references/sdks/react-router-framework/index.md +411 -0
  209. package/skills/sentry/references/sdks/react-router-framework/logging.md +66 -0
  210. package/skills/sentry/references/sdks/react-router-framework/profiling.md +57 -0
  211. package/skills/sentry/references/sdks/react-router-framework/react-router-framework-features.md +110 -0
  212. package/skills/sentry/references/sdks/react-router-framework/session-replay.md +67 -0
  213. package/skills/sentry/references/sdks/react-router-framework/tracing.md +96 -0
  214. package/skills/sentry/references/sdks/react-router-framework/user-feedback.md +71 -0
  215. package/skills/sentry/references/sdks/ruby/crons.md +184 -0
  216. package/skills/sentry/references/sdks/ruby/error-monitoring.md +248 -0
  217. package/skills/sentry/references/sdks/ruby/index.md +297 -0
  218. package/skills/sentry/references/sdks/ruby/logging.md +168 -0
  219. package/skills/sentry/references/sdks/ruby/metrics.md +196 -0
  220. package/skills/sentry/references/sdks/ruby/migration.md +321 -0
  221. package/skills/sentry/references/sdks/ruby/profiling.md +107 -0
  222. package/skills/sentry/references/sdks/ruby/tracing.md +388 -0
  223. package/skills/sentry/references/sdks/svelte/error-monitoring.md +456 -0
  224. package/skills/sentry/references/sdks/svelte/index.md +467 -0
  225. package/skills/sentry/references/sdks/svelte/logging.md +344 -0
  226. package/skills/sentry/references/sdks/svelte/session-replay.md +369 -0
  227. package/skills/sentry/references/sdks/svelte/tracing.md +406 -0
  228. package/skills/sentry/references/sdks/tanstack-start/error-monitoring.md +149 -0
  229. package/skills/sentry/references/sdks/tanstack-start/index.md +381 -0
  230. package/skills/sentry/references/sdks/tanstack-start/logging.md +74 -0
  231. package/skills/sentry/references/sdks/tanstack-start/session-replay.md +76 -0
  232. package/skills/sentry/references/sdks/tanstack-start/tanstackstart-features.md +128 -0
  233. package/skills/sentry/references/sdks/tanstack-start/tracing.md +123 -0
  234. package/skills/sentry/references/sdks/tanstack-start/user-feedback.md +81 -0
  235. package/skills/sentry/references/search-query-language.md +226 -0
  236. package/skills/sentry/references/semantics/angular.md +7 -0
  237. package/skills/sentry/references/semantics/app.md +28 -0
  238. package/skills/sentry/references/semantics/art.md +17 -0
  239. package/skills/sentry/references/semantics/aws.md +43 -0
  240. package/skills/sentry/references/semantics/browser.md +34 -0
  241. package/skills/sentry/references/semantics/cache.md +12 -0
  242. package/skills/sentry/references/semantics/client.md +8 -0
  243. package/skills/sentry/references/semantics/cloud.md +12 -0
  244. package/skills/sentry/references/semantics/cloudflare.md +23 -0
  245. package/skills/sentry/references/semantics/code.md +11 -0
  246. package/skills/sentry/references/semantics/culture.md +11 -0
  247. package/skills/sentry/references/semantics/db.md +21 -0
  248. package/skills/sentry/references/semantics/device.md +43 -0
  249. package/skills/sentry/references/semantics/error.md +7 -0
  250. package/skills/sentry/references/semantics/event.md +8 -0
  251. package/skills/sentry/references/semantics/exception.md +10 -0
  252. package/skills/sentry/references/semantics/faas.md +19 -0
  253. package/skills/sentry/references/semantics/file.md +8 -0
  254. package/skills/sentry/references/semantics/flag.md +7 -0
  255. package/skills/sentry/references/semantics/gcp.md +16 -0
  256. package/skills/sentry/references/semantics/gen_ai.md +53 -0
  257. package/skills/sentry/references/semantics/general.md +11 -0
  258. package/skills/sentry/references/semantics/graphql.md +9 -0
  259. package/skills/sentry/references/semantics/grpc.md +19 -0
  260. package/skills/sentry/references/semantics/http.md +34 -0
  261. package/skills/sentry/references/semantics/index.md +63 -0
  262. package/skills/sentry/references/semantics/jsonrpc.md +8 -0
  263. package/skills/sentry/references/semantics/jvm.md +12 -0
  264. package/skills/sentry/references/semantics/koa.md +7 -0
  265. package/skills/sentry/references/semantics/logger.md +7 -0
  266. package/skills/sentry/references/semantics/mcp.md +37 -0
  267. package/skills/sentry/references/semantics/mdc.md +7 -0
  268. package/skills/sentry/references/semantics/messaging.md +23 -0
  269. package/skills/sentry/references/semantics/middleware.md +7 -0
  270. package/skills/sentry/references/semantics/navigation.md +9 -0
  271. package/skills/sentry/references/semantics/nel.md +11 -0
  272. package/skills/sentry/references/semantics/network.md +17 -0
  273. package/skills/sentry/references/semantics/os.md +15 -0
  274. package/skills/sentry/references/semantics/otel.md +10 -0
  275. package/skills/sentry/references/semantics/params.md +7 -0
  276. package/skills/sentry/references/semantics/process.md +14 -0
  277. package/skills/sentry/references/semantics/react.md +7 -0
  278. package/skills/sentry/references/semantics/remix.md +7 -0
  279. package/skills/sentry/references/semantics/resource.md +7 -0
  280. package/skills/sentry/references/semantics/rpc.md +10 -0
  281. package/skills/sentry/references/semantics/score.md +10 -0
  282. package/skills/sentry/references/semantics/sentry.md +69 -0
  283. package/skills/sentry/references/semantics/server.md +8 -0
  284. package/skills/sentry/references/semantics/service.md +8 -0
  285. package/skills/sentry/references/semantics/session.md +7 -0
  286. package/skills/sentry/references/semantics/state.md +7 -0
  287. package/skills/sentry/references/semantics/thread.md +8 -0
  288. package/skills/sentry/references/semantics/timber.md +7 -0
  289. package/skills/sentry/references/semantics/trpc.md +8 -0
  290. package/skills/sentry/references/semantics/ui.md +18 -0
  291. package/skills/sentry/references/semantics/url.md +15 -0
  292. package/skills/sentry/references/semantics/user.md +17 -0
  293. package/skills/sentry/references/semantics/user_agent.md +7 -0
  294. package/skills/sentry/references/semantics/vercel.md +42 -0
  295. package/skills/sentry/references/setup-verification.md +39 -0
  296. package/skills/sentry/references/snapshots/github-actions-fanout.md +206 -0
  297. package/skills/sentry/references/snapshots/github-actions-simple.md +102 -0
  298. package/skills/sentry/references/snapshots/github-actions-swift-snapshot-testing.md +118 -0
  299. package/skills/sentry/references/snapshots/index.md +19 -0
  300. package/skills/sentry/references/snapshots/snapshot-previews.md +100 -0
  301. package/skills/sentry/references/snapshots/snapshots.md +123 -0
  302. package/skills/sentry/references/snapshots/wizard-setup.md +134 -0
  303. package/skills/testing/LICENSE +21 -0
  304. package/skills/testing/NOTICE +7 -0
  305. package/skills/testing/SKILL.md +13 -19
  306. package/skills/testing/agents/openai.yaml +1 -2
  307. package/skills/testing/references/selection.md +23 -0
  308. package/skills/testing/references/tdd.md +19 -0
  309. package/skills/testing/references/test-design.md +17 -0
  310. package/src/catalog.ts +1 -7
  311. package/skills/build-effect-apis/SKILL.md +0 -81
  312. package/skills/build-effect-apis/agents/openai.yaml +0 -4
  313. package/skills/build-effect-clis/SKILL.md +0 -92
  314. package/skills/build-effect-clis/agents/openai.yaml +0 -4
  315. package/skills/effect-architecture-audit/agents/openai.yaml +0 -4
  316. package/skills/effect-atom-state/SKILL.md +0 -97
  317. package/skills/effect-atom-state/agents/openai.yaml +0 -4
  318. package/skills/effect-ts/SKILL.md +0 -35
  319. package/skills/effect-ts/agents/openai.yaml +0 -4
  320. /package/skills/{build-effect-apis/references → effect-development/references/api}/cloudflare-workers.md +0 -0
  321. /package/skills/{build-effect-apis/references → effect-development/references/api}/runtime-assembly.md +0 -0
  322. /package/skills/{build-effect-apis/references → effect-development/references/api}/server-and-middleware.md +0 -0
  323. /package/skills/{build-effect-apis/references → effect-development/references/api}/shared-contracts.md +0 -0
  324. /package/skills/{effect-architecture-audit/references → effect-development/references/architecture}/service-and-boundary-audit.md +0 -0
  325. /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-lifecycle.md +0 -0
  326. /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-workflows.md +0 -0
  327. /package/skills/{effect-atom-state/references → effect-development/references/atom}/tanstack-start.md +0 -0
  328. /package/skills/{build-effect-clis/references → effect-development/references/cli}/command-design.md +0 -0
  329. /package/skills/{build-effect-clis/references → effect-development/references/cli}/processes-and-platform.md +0 -0
@@ -0,0 +1,206 @@
1
+ # Fan-out GitHub Actions Workflow for SnapshotPreviews
2
+
3
+ Use this when a SnapshotPreviews project needs multiple simulator destinations or device
4
+ families, parallel rendering, matrix execution, or selective/large-suite CI. This is the
5
+ maintained multi-simulator pattern: build once, render each simulator in parallel with
6
+ `test-without-building`, export each simulator to its own subdirectory, aggregate
7
+ artifacts, then upload once.
8
+
9
+ Do not replace this with a sequential loop of multiple `xcodebuild test` invocations in
10
+ the simple workflow.
11
+ Sequential multi-simulator rendering is slower and not the recommended path.
12
+
13
+ Do not use this template for Point-Free `swift-snapshot-testing` or another existing
14
+ generator. For `swift-snapshot-testing`, use `github-actions-swift-snapshot-testing.md`;
15
+ for other generators, preserve the generator and adapt its existing CI/upload path.
16
+
17
+ This pattern follows the public
18
+ [EmergeTools HackerNews SnapshotPreviews workflow](https://github.com/EmergeTools/hackernews/blob/main/.github/workflows/ios_sentry_upload_snapshots.yml).
19
+
20
+ Adapt target names, paths, Xcode version, simulator list, package setup, and
21
+ Fastlane/CLI upload to the project.
22
+
23
+ ```yaml
24
+ name: Upload iOS snapshots to Sentry
25
+
26
+ on:
27
+ push:
28
+ branches: [main]
29
+ pull_request:
30
+ branches: [main]
31
+
32
+ permissions:
33
+ contents: read
34
+
35
+ env:
36
+ DERIVED_DATA_PATH: ${{ github.workspace }}/DerivedData-snapshot-upload
37
+ SNAPSHOT_UPLOAD_BASE_DIR: ${{ github.workspace }}/snapshot-images
38
+ BUILD_PRODUCTS_ARCHIVE: ${{ github.workspace }}/snapshot-build-products.tar.gz
39
+ XCTESTRUN_FILENAME: MyAppSnapshotTests.xctestrun
40
+ SNAPSHOT_PROJECT: MyApp.xcodeproj
41
+ SNAPSHOT_SCHEME: MyApp
42
+ BUILD_DESTINATION: platform=iOS Simulator,name=iPhone 17 Pro Max,arch=arm64
43
+
44
+ # GitHub Actions does not inherit local sentry-cli config.
45
+ # Define SENTRY_AUTH_TOKEN as a repository secret and SENTRY_ORG/SENTRY_PROJECT as repository variables.
46
+ SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
47
+ SENTRY_ORG: ${{ vars.SENTRY_ORG }}
48
+ SENTRY_PROJECT: ${{ vars.SENTRY_PROJECT }}
49
+ SENTRY_APP_ID: com.example.MyApp
50
+
51
+ jobs:
52
+ build_for_testing:
53
+ runs-on: macos-26
54
+
55
+ steps:
56
+ # On PRs, checkout builds the merge candidate; sentry-cli labels uploads from GitHub event head/base SHAs.
57
+ - name: Checkout
58
+ uses: actions/checkout@v6
59
+ with:
60
+ fetch-depth: 0
61
+
62
+ - name: Select Xcode
63
+ run: sudo xcode-select -s /Applications/Xcode_26.5.app
64
+
65
+ - name: Prepare DerivedData directory
66
+ run: mkdir -p "${DERIVED_DATA_PATH}"
67
+
68
+ - name: Cache Swift Package Manager
69
+ uses: actions/cache@v4
70
+ with:
71
+ path: |
72
+ ~/Library/Caches/org.swift.swiftpm
73
+ ${{ env.DERIVED_DATA_PATH }}/SourcePackages
74
+ key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
75
+ restore-keys: ${{ runner.os }}-spm-
76
+
77
+ - name: Build snapshot tests
78
+ run: |
79
+ xcodebuild build-for-testing \
80
+ -project "${SNAPSHOT_PROJECT}" \
81
+ -scheme "${SNAPSHOT_SCHEME}" \
82
+ -sdk iphonesimulator \
83
+ -destination "${BUILD_DESTINATION}" \
84
+ -derivedDataPath "${DERIVED_DATA_PATH}" \
85
+ -resultBundlePath SnapshotBuildForTesting.xcresult \
86
+ -skipPackagePluginValidation \
87
+ ONLY_ACTIVE_ARCH=YES \
88
+ CODE_SIGNING_ALLOWED=NO
89
+
90
+ - name: Normalize xctestrun path
91
+ run: |
92
+ XCTESTRUN_SOURCE="$(find "${DERIVED_DATA_PATH}/Build/Products" -name '*.xctestrun' -print -quit)"
93
+ if [ -z "${XCTESTRUN_SOURCE}" ]; then
94
+ echo "No .xctestrun file found under ${DERIVED_DATA_PATH}/Build/Products" >&2
95
+ exit 1
96
+ fi
97
+ cp "${XCTESTRUN_SOURCE}" "${DERIVED_DATA_PATH}/Build/Products/${XCTESTRUN_FILENAME}"
98
+
99
+ - name: Archive test products
100
+ run: tar -C "${DERIVED_DATA_PATH}/Build" -czf "${BUILD_PRODUCTS_ARCHIVE}" Products
101
+
102
+ - name: Upload build products artifact
103
+ uses: actions/upload-artifact@v7
104
+ with:
105
+ name: snapshot-build-products
106
+ path: ${{ env.BUILD_PRODUCTS_ARCHIVE }}
107
+ if-no-files-found: error
108
+
109
+ generate_snapshots:
110
+ runs-on: macos-26
111
+ needs: build_for_testing
112
+
113
+ strategy:
114
+ fail-fast: false
115
+ matrix:
116
+ include:
117
+ - simulator_name: iPhone 17 Pro Max
118
+ slug: iphone-17-pro-max
119
+ - simulator_name: iPhone 17e
120
+ slug: iphone-17e
121
+ - simulator_name: iPad Air 11-inch (M4)
122
+ slug: ipad-air-11-inch-m4
123
+
124
+ env:
125
+ # Export each simulator to a separate subdirectory. SnapshotPreviews filenames are preview-based,
126
+ # so the same preview rendered on multiple devices would otherwise collide during aggregation.
127
+ TEST_RUNNER_SNAPSHOTS_EXPORT_DIR: ${{ github.workspace }}/snapshot-images/${{ matrix.slug }}
128
+
129
+ steps:
130
+ # On PRs, checkout builds the merge candidate; sentry-cli labels uploads from GitHub event head/base SHAs.
131
+ - name: Checkout
132
+ uses: actions/checkout@v6
133
+ with:
134
+ fetch-depth: 0
135
+
136
+ - name: Select Xcode
137
+ run: sudo xcode-select -s /Applications/Xcode_26.5.app
138
+
139
+ - name: Download build products artifact
140
+ uses: actions/download-artifact@v5
141
+ with:
142
+ name: snapshot-build-products
143
+ path: ${{ github.workspace }}
144
+
145
+ - name: Extract test products
146
+ run: |
147
+ mkdir -p "${DERIVED_DATA_PATH}/Build"
148
+ tar -C "${DERIVED_DATA_PATH}/Build" -xzf "${BUILD_PRODUCTS_ARCHIVE}"
149
+
150
+ - name: Boot simulator
151
+ run: xcrun simctl boot "${{ matrix.simulator_name }}" || true
152
+
153
+ - name: Prepare snapshot export directory
154
+ run: mkdir -p "${TEST_RUNNER_SNAPSHOTS_EXPORT_DIR}"
155
+
156
+ - name: Generate snapshot images
157
+ run: |
158
+ xcodebuild test-without-building \
159
+ -xctestrun "${DERIVED_DATA_PATH}/Build/Products/${XCTESTRUN_FILENAME}" \
160
+ -destination "platform=iOS Simulator,name=${{ matrix.simulator_name }},arch=arm64" \
161
+ -resultBundlePath "SnapshotResults-${{ matrix.slug }}.xcresult"
162
+
163
+ - name: Upload snapshots artifact
164
+ uses: actions/upload-artifact@v7
165
+ with:
166
+ name: snapshots-${{ matrix.slug }}
167
+ path: ${{ env.TEST_RUNNER_SNAPSHOTS_EXPORT_DIR }}
168
+ if-no-files-found: error
169
+
170
+ upload_snapshots:
171
+ runs-on: macos-26
172
+ needs: generate_snapshots
173
+
174
+ steps:
175
+ # On PRs, checkout builds the merge candidate; sentry-cli labels uploads from GitHub event head/base SHAs.
176
+ - name: Checkout
177
+ uses: actions/checkout@v6
178
+ with:
179
+ fetch-depth: 0
180
+
181
+ - name: Download generated snapshots
182
+ uses: actions/download-artifact@v5
183
+ with:
184
+ path: ${{ env.SNAPSHOT_UPLOAD_BASE_DIR }}
185
+ pattern: snapshots-*
186
+
187
+ - name: List aggregated snapshot files
188
+ run: |
189
+ find "${SNAPSHOT_UPLOAD_BASE_DIR}" -type f | sort
190
+ echo "Total PNG images: $(find "${SNAPSHOT_UPLOAD_BASE_DIR}" -type f -name '*.png' | wc -l | tr -d ' ')"
191
+
192
+ - name: Install sentry-cli
193
+ run: curl -sL https://sentry.io/get-cli/ | bash
194
+
195
+ - name: Upload snapshots to Sentry
196
+ run: |
197
+ sentry-cli snapshots upload "${SNAPSHOT_UPLOAD_BASE_DIR}" \
198
+ --org "${SENTRY_ORG}" \
199
+ --project "${SENTRY_PROJECT}" \
200
+ --app-id "${SENTRY_APP_ID}"
201
+ ```
202
+
203
+ For selective PR rendering, add a separate manifest job with
204
+ `TEST_RUNNER_SNAPSHOTS_ALL_IMAGE_NAMES_FILE`, aggregate all shard manifests with
205
+ `sort -u`, and pass `--all-image-file-names-file` only for pull-request uploads.
206
+ Do not add this complexity unless selective testing is actually required.
@@ -0,0 +1,102 @@
1
+ # Simple GitHub Actions Workflow for SnapshotPreviews
2
+
3
+ Use this when adding Sentry Snapshots CI for a SnapshotPreviews Apple app with one
4
+ simulator destination.
5
+ Start here by default for single-device SnapshotPreviews onboarding.
6
+
7
+ Do not extend this template with sequential loops over multiple simulators.
8
+ If the user asks for multiple simulator destinations or device families, use
9
+ `github-actions-fanout.md` instead.
10
+
11
+ Do not use this template for Point-Free `swift-snapshot-testing` or another existing
12
+ generator. For `swift-snapshot-testing`, use `github-actions-swift-snapshot-testing.md`;
13
+ for other generators, preserve the generator and adapt its existing CI/upload path.
14
+
15
+ For a public production SnapshotPreviews workflow, compare against the
16
+ [EmergeTools HackerNews fan-out workflow](https://github.com/EmergeTools/hackernews/blob/main/.github/workflows/ios_sentry_upload_snapshots.yml).
17
+ This simple template intentionally keeps the same upload model but removes matrix
18
+ fan-out and build-product sharing.
19
+
20
+ Before adapting this template:
21
+
22
+ 1. Verify the runner image has the required Xcode, SDK, and simulator.
23
+ Do not guess from memory.
24
+ 2. Prefer the project’s existing shared scheme and single simulator destination.
25
+ 3. Keep base-branch uploads full.
26
+ Add selective flags only for selective PR uploads.
27
+ 4. Use Fastlane instead of direct `sentry-cli` when the project already has a Sentry
28
+ Fastlane lane.
29
+
30
+ ```yaml
31
+ name: Upload iOS snapshots to Sentry
32
+
33
+ on:
34
+ push:
35
+ branches: [main]
36
+ pull_request:
37
+ branches: [main]
38
+
39
+ permissions:
40
+ contents: read
41
+
42
+ env:
43
+ SNAPSHOT_EXPORT_DIR: ${{ github.workspace }}/snapshot-images
44
+ SNAPSHOT_PROJECT: MyApp.xcodeproj
45
+ SNAPSHOT_SCHEME: MyApp
46
+ SNAPSHOT_DESTINATION: platform=iOS Simulator,name=iPhone 17 Pro Max,arch=arm64
47
+
48
+ # Define SENTRY_AUTH_TOKEN as a repository secret and SENTRY_ORG/SENTRY_PROJECT as repository variables.
49
+ SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
50
+ SENTRY_ORG: ${{ vars.SENTRY_ORG }}
51
+ SENTRY_PROJECT: ${{ vars.SENTRY_PROJECT }}
52
+ SENTRY_APP_ID: com.example.MyApp
53
+ jobs:
54
+ upload_snapshots:
55
+ runs-on: macos-26
56
+
57
+ steps:
58
+ # On PRs, checkout builds the merge candidate; sentry-cli labels uploads from GitHub event head/base SHAs.
59
+ - name: Checkout
60
+ uses: actions/checkout@v6
61
+ with:
62
+ fetch-depth: 0
63
+
64
+ - name: Select Xcode
65
+ run: sudo xcode-select -s /Applications/Xcode_26.5.app
66
+
67
+ - name: Resolve Swift packages
68
+ run: |
69
+ xcodebuild -resolvePackageDependencies \
70
+ -project "${SNAPSHOT_PROJECT}" \
71
+ -scheme "${SNAPSHOT_SCHEME}"
72
+
73
+ - name: Render snapshots
74
+ env:
75
+ TEST_RUNNER_SNAPSHOTS_EXPORT_DIR: ${{ env.SNAPSHOT_EXPORT_DIR }}
76
+ run: |
77
+ xcodebuild test \
78
+ -project "${SNAPSHOT_PROJECT}" \
79
+ -scheme "${SNAPSHOT_SCHEME}" \
80
+ -sdk iphonesimulator \
81
+ -destination "${SNAPSHOT_DESTINATION}" \
82
+ -skipPackagePluginValidation \
83
+ CODE_SIGNING_ALLOWED=NO
84
+
85
+ - name: Install sentry-cli
86
+ run: curl -sL https://sentry.io/get-cli/ | bash
87
+
88
+ - name: Upload snapshots to Sentry
89
+ run: |
90
+ sentry-cli snapshots upload "${SNAPSHOT_EXPORT_DIR}" \
91
+ --org "${SENTRY_ORG}" \
92
+ --project "${SENTRY_PROJECT}" \
93
+ --app-id "${SENTRY_APP_ID}"
94
+ ```
95
+
96
+ If using Fastlane, replace the install/upload steps with the project’s existing Ruby
97
+ setup and lane, for example:
98
+
99
+ ```yaml
100
+ - name: Upload snapshots to Sentry
101
+ run: bundle exec fastlane ios upload_sentry_snapshots path:"${SNAPSHOT_EXPORT_DIR}"
102
+ ```
@@ -0,0 +1,118 @@
1
+ # GitHub Actions Workflow for Point-Free swift-snapshot-testing
2
+
3
+ Use this when a project already uses Point-Free `swift-snapshot-testing` and the user
4
+ wants GitHub Actions/CI upload to Sentry Snapshots.
5
+ Do not run the `appleSnapshots` wizard or use the SnapshotPreviews workflow templates
6
+ for this path.
7
+
8
+ This pattern follows the public
9
+ [EmergeTools HackerNews workflow](https://github.com/EmergeTools/hackernews/blob/main/.github/workflows/ios_sentry_upload_swift_snapshots.yml).
10
+ Run the existing XCTest suite in record mode, allow the recording step to fail because
11
+ `swift-snapshot-testing` treats recording as test failures, then upload the generated
12
+ `__Snapshots__` directory to Sentry.
13
+
14
+ Before adapting this template:
15
+
16
+ 1. Locate the test target/class that owns the `assertSnapshot` calls.
17
+ 2. Confirm the generated `__Snapshots__/<TestClass>/` path.
18
+ 3. Prefer the project’s existing Ruby/Fastlane setup if it already uploads snapshots.
19
+ 4. Keep local test behavior unchanged; set record mode only in CI through the
20
+ environment.
21
+
22
+ ```yaml
23
+ name: Upload iOS swift-snapshot-testing snapshots to Sentry
24
+
25
+ on:
26
+ push:
27
+ branches: [main]
28
+ pull_request:
29
+ branches: [main]
30
+
31
+ permissions:
32
+ contents: read
33
+
34
+ env:
35
+ SNAPSHOT_PROJECT: MyApp.xcodeproj
36
+ SNAPSHOT_SCHEME: MyApp
37
+ SNAPSHOT_DESTINATION: platform=iOS Simulator,name=iPhone 17 Pro Max,arch=arm64
38
+ SNAPSHOT_TEST_IDENTIFIER: MyAppTests/MyAppSnapshotTest
39
+ SNAPSHOT_OUTPUT_DIR: MyAppTests/__Snapshots__/MyAppSnapshotTest
40
+
41
+ # Define SENTRY_AUTH_TOKEN as a repository secret and SENTRY_ORG/SENTRY_PROJECT as repository variables.
42
+ SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
43
+ SENTRY_ORG: ${{ vars.SENTRY_ORG }}
44
+ SENTRY_PROJECT: ${{ vars.SENTRY_PROJECT }}
45
+ SENTRY_APP_ID: com.example.MyApp.swift-snapshot-testing
46
+
47
+ jobs:
48
+ upload_swift_snapshots:
49
+ runs-on: macos-26
50
+
51
+ env:
52
+ # Propagates SNAPSHOT_TESTING_RECORD=all into the iOS test runner.
53
+ TEST_RUNNER_SNAPSHOT_TESTING_RECORD: all
54
+
55
+ steps:
56
+ - name: Checkout
57
+ uses: actions/checkout@v6
58
+ with:
59
+ fetch-depth: 0
60
+
61
+ - name: Select Xcode
62
+ run: sudo xcode-select -s /Applications/Xcode_26.5.app
63
+
64
+ - name: Resolve Swift packages
65
+ run: |
66
+ xcodebuild -resolvePackageDependencies \
67
+ -project "${SNAPSHOT_PROJECT}" \
68
+ -scheme "${SNAPSHOT_SCHEME}"
69
+
70
+ - name: Boot simulator
71
+ run: xcrun simctl boot "iPhone 17 Pro Max" || true
72
+
73
+ - name: Generate snapshot images
74
+ continue-on-error: true
75
+ run: |
76
+ xcodebuild test \
77
+ -project "${SNAPSHOT_PROJECT}" \
78
+ -scheme "${SNAPSHOT_SCHEME}" \
79
+ -sdk iphonesimulator \
80
+ -destination "${SNAPSHOT_DESTINATION}" \
81
+ -only-testing:"${SNAPSHOT_TEST_IDENTIFIER}" \
82
+ -resultBundlePath SnapshotResults-swift-snapshots.xcresult \
83
+ -skipPackagePluginValidation \
84
+ CODE_SIGNING_ALLOWED=NO
85
+
86
+ - name: List generated images
87
+ run: |
88
+ find "${SNAPSHOT_OUTPUT_DIR}" -type f | sort
89
+ echo "Total PNG images: $(find "${SNAPSHOT_OUTPUT_DIR}" -type f -name '*.png' | wc -l | tr -d ' ')"
90
+
91
+ - name: Install sentry-cli
92
+ run: curl -sL https://sentry.io/get-cli/ | bash
93
+
94
+ - name: Upload snapshots to Sentry
95
+ run: |
96
+ sentry-cli snapshots upload "${SNAPSHOT_OUTPUT_DIR}" \
97
+ --org "${SENTRY_ORG}" \
98
+ --project "${SENTRY_PROJECT}" \
99
+ --app-id "${SENTRY_APP_ID}"
100
+ ```
101
+
102
+ If using Fastlane, replace the install/upload steps with the project’s existing lane,
103
+ for example:
104
+
105
+ ```yaml
106
+ - name: Upload snapshots to Sentry
107
+ run: bundle exec fastlane ios upload_sentry_snapshots_swift_snapshot_testing
108
+ ```
109
+
110
+ Rules:
111
+
112
+ - Use `TEST_RUNNER_SNAPSHOT_TESTING_RECORD=all`, not `SNAPSHOT_TESTING_RECORD=all`, so
113
+ the value reaches the iOS test runner.
114
+ - Keep `continue-on-error: true` on the recording test step; otherwise recording
115
+ failures prevent upload.
116
+ - Upload the generated `__Snapshots__` directory that contains PNG images.
117
+ - Use a stable `--app-id`. If the same app also uploads SnapshotPreviews images, give
118
+ this generator a distinct app id to avoid mixing baselines.
@@ -0,0 +1,19 @@
1
+ # Apple snapshots
2
+
3
+ Inspect the existing image generator, Xcode host and test targets, output path,
4
+ and CI. Preserve a named or working generator. SnapshotPreviews requires a host
5
+ app and hosted XCTest target; these requirements do not apply to every generator.
6
+ Resolve missing targets only when they are needed by the selected workflow.
7
+
8
+ - New SnapshotPreviews setup: [wizard setup](wizard-setup.md).
9
+ - Existing SnapshotPreviews or selective rendering: [rendering](snapshot-previews.md).
10
+ - Upload images from any generator: [uploads](snapshots.md).
11
+ - One-destination SnapshotPreviews CI: [simple CI](github-actions-simple.md).
12
+ - Multiple destinations or selective SnapshotPreviews CI: [fanout](github-actions-fanout.md).
13
+ - Point-Free snapshot testing CI: [existing generator](github-actions-swift-snapshot-testing.md).
14
+
15
+ Configure only the requested generation or upload path. Follow repository test
16
+ policy; ordinary telemetry setup does not authorize adding snapshot tests. Inspect
17
+ the produced images and manifest, then verify the authorized upload. Preserve a
18
+ full base manifest when using selective PR uploads. Report an unavailable host,
19
+ credential, or CI run without claiming deployed verification.
@@ -0,0 +1,100 @@
1
+ # SnapshotPreviews Details
2
+
3
+ Use this reference when the project uses Sentry’s first-party SnapshotPreviews library
4
+ and needs SnapshotPreviews-specific metadata, rendering preferences, selective
5
+ rendering, or troubleshooting.
6
+
7
+ Wizard setup, target disambiguation, and manual fallback live in `wizard-setup.md`.
8
+ Shared upload guidance for `sentry-cli`, Fastlane, manifests, and CI lives in
9
+ `snapshots.md`.
10
+
11
+ ## Metadata and Rendering Preferences
12
+
13
+ Add `SnapshotPreferences` to the preview-declaring target only when default
14
+ SnapshotPreviews sidecar metadata is insufficient.
15
+ See Sentry’s SnapshotPreviews metadata docs:
16
+ https://docs.sentry.io/platforms/apple/snapshots/snapshotpreviews-metadata/
17
+
18
+ ```swift
19
+ import SnapshotPreferences
20
+
21
+ #Preview("Map") {
22
+ MapPreview()
23
+ .snapshotTags(["screen": "map"])
24
+ .snapshotAdditionalContext(["fixture": "city-route"])
25
+ }
26
+ ```
27
+
28
+ | Modifier | Use when |
29
+ | ------------------------------------------- | ------------------------------------------------------------------------------- |
30
+ | `.snapshotTags([String: String])` | Sentry needs searchable filters beyond defaults. |
31
+ | `.snapshotAdditionalContext([String: Any])` | Reviewers need extra sidecar context. |
32
+ | `.snapshotDiffThreshold(Float?)` | A deterministic snapshot still has tolerated visual noise. |
33
+ | `.snapshotAccessibility(true)` | Need an accessibility-overlay variant on iOS. |
34
+ | `.snapshotRenderingMode(.coreAnimation)` | Default renderer is wrong for blur, maps, video, or renderer-sensitive content. |
35
+ | `.snapshotExpansion(false)` | Expanded scroll views create unstable or unhelpful images. |
36
+
37
+ Rules:
38
+
39
+ - Prefer deterministic previews over thresholds.
40
+ - Avoid live network, timers, animations, current-clock dates, locale-dependent data,
41
+ and real user data.
42
+ - Use fixed fixtures and mocked dependencies.
43
+
44
+ ## Selective Rendering
45
+
46
+ Use for PRs that should render only changed/high-signal SnapshotPreviews while
47
+ preserving Sentry comparison semantics.
48
+
49
+ 1. Generate the full image-name manifest without rendering:
50
+
51
+ ```bash
52
+ TEST_RUNNER_SNAPSHOTS_ALL_IMAGE_NAMES_FILE="$PWD/all-image-names.txt" \
53
+ xcodebuild test \
54
+ -scheme MyApp \
55
+ -sdk iphonesimulator \
56
+ -destination 'platform=iOS Simulator,name=iPhone 16 Pro'
57
+ ```
58
+
59
+ 2. Render the subset with `snapshotPreviews()`, `snapshotPreviewModules()`,
60
+ `excludedSnapshotPreviews()`, `excludedSnapshotPreviewModules()`, or `-only-testing:`
61
+ while `TEST_RUNNER_SNAPSHOTS_EXPORT_DIR` is set.
62
+
63
+ 3. Upload the rendered subset using the full manifest.
64
+ Read `snapshots.md` for the upload command and manifest flags.
65
+
66
+ Rules:
67
+
68
+ - `TEST_RUNNER_`-prefixed environment variables are forwarded into the app/test process.
69
+ - Sharded simulators export into separate subdirectories.
70
+ - Sharded manifests must be merged and de-duplicated with `sort -u` before upload.
71
+ - Generate the manifest and rendered subset from the same commit.
72
+
73
+ ## GitHub Actions Notes
74
+
75
+ Do not duplicate workflow templates here.
76
+
77
+ | CI shape | Read |
78
+ | --------------------------------------------------------------------- | -------------------------- |
79
+ | One simulator destination | `github-actions-simple.md` |
80
+ | Multiple simulators/device families, parallel rendering, large suites | `github-actions-fanout.md` |
81
+
82
+ Before writing workflows:
83
+
84
+ - Verify current runner image, Xcode path, SDKs, and simulator names from existing CI or
85
+ current runner docs.
86
+ - Use `fetch-depth: 0` so `sentry-cli` can resolve base/head commits.
87
+ - Prefer existing Fastlane upload lanes when present; upload configuration lives in
88
+ `snapshots.md`.
89
+
90
+ ## Troubleshooting
91
+
92
+ | Issue | Fix |
93
+ | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
94
+ | No generated tests/previews | Confirm previews are loaded by the hosted app/test process, build conditions match, and test target depends on `SnapshottingTests`. |
95
+ | Package-only project | Ask for the host app/test target; standalone `swift test` rendering is not supported. |
96
+ | Export directory empty | Set `TEST_RUNNER_SNAPSHOTS_EXPORT_DIR`; ensure `TEST_RUNNER_SNAPSHOTS_ALL_IMAGE_NAMES_FILE` is not also set. |
97
+ | Manifest mismatch | Regenerate manifest and subset from same commit; merge shard manifests. |
98
+ | Image too large | Keep images below 40M pixels; constrain preview layout or use `.snapshotExpansion(false)`. |
99
+ | Flaky snapshots | Remove nondeterminism first; then try rendering mode or per-preview diff threshold. |
100
+ | Duplicate path warnings | Make display names unique and avoid overlapping shard filters. |
@@ -0,0 +1,123 @@
1
+ # Sentry Snapshots Upload
2
+
3
+ Use this reference after an image source has been selected and the project can produce
4
+ PNG or JPEG snapshots.
5
+ The image source can be Sentry’s first-party SnapshotPreviews, Point-Free
6
+ `swift-snapshot-testing`, or a custom generator.
7
+
8
+ This skill integrates generated snapshot images with Sentry’s Snapshot service.
9
+ It does not replace existing third-party generators.
10
+ If the project already has an image generator, preserve it and upload the images it
11
+ already produces.
12
+
13
+ For SnapshotPreviews-specific generation, metadata, and selective rendering mechanics,
14
+ read `snapshot-previews.md`.
15
+
16
+ ## Image Source Rules
17
+
18
+ - Preserve the selected image source.
19
+ - Point `sentry-cli snapshots upload` or Fastlane at the directory containing generated
20
+ `.png` or `.jpg`/`.jpeg` files.
21
+ - For existing generators, do not run the `appleSnapshots` wizard; it configures
22
+ Sentry’s first-party SnapshotPreviews flow.
23
+ - For Point-Free `swift-snapshot-testing`, keep `SnapshotTesting` linked from the XCTest
24
+ target or package test target that owns `assertSnapshot` calls; do not link it into
25
+ the app/library target just to satisfy Sentry upload.
26
+ - For Point-Free `swift-snapshot-testing`, set `TEST_RUNNER_SNAPSHOT_TESTING_RECORD=all`
27
+ so CI pushes `SNAPSHOT_TESTING_RECORD=all` into the iOS test runner without hardcoding
28
+ record mode in tests.
29
+ This keeps local Xcode diffing normal while CI records images for Sentry to diff as a
30
+ service.
31
+ - For Point-Free `swift-snapshot-testing`, upload the relevant
32
+ `__Snapshots__/<TestClass>/` directory, and allow the recording test step to continue
33
+ so upload still runs.
34
+ - Add JSON sidecars only when the project needs Sentry display names, tags, custom
35
+ context, or per-image thresholds.
36
+ SnapshotPreviews can emit sidecars through its own metadata API; other generators
37
+ should use Sentry’s generic sidecar schema:
38
+ https://docs.sentry.io/product/snapshots/uploading-snapshots/#json-metadata
39
+
40
+ ## Fastlane Upload
41
+
42
+ Use when the project already has Fastlane or wants upload logic in `fastlane/Fastfile`.
43
+
44
+ ```ruby
45
+ lane :upload_sentry_snapshots do |options|
46
+ sentry_upload_snapshots(
47
+ auth_token: ENV["SENTRY_AUTH_TOKEN"],
48
+ org_slug: "your-org",
49
+ project_slug: "your-ios-project",
50
+ app_id: "com.example.MyApp",
51
+ path: options[:path]
52
+ )
53
+ end
54
+ ```
55
+
56
+ ```bash
57
+ bundle exec fastlane ios upload_sentry_snapshots path:"$PWD/snapshot-images"
58
+ ```
59
+
60
+ Verify exact `fastlane-plugin-sentry` action parameter names against the installed
61
+ plugin version before finalizing.
62
+
63
+ ## `sentry-cli` Upload Flags
64
+
65
+ ```bash
66
+ sentry-cli snapshots upload "$PWD/snapshot-images" \
67
+ --org your-org \
68
+ --project your-ios-project \
69
+ --app-id com.example.MyApp
70
+ ```
71
+
72
+ | Flag | Purpose |
73
+ | ------------------------------------ | -------------------------------------------------------------------------------- |
74
+ | `--app-id <APP_ID>` | Required stable application identifier; usually bundle id. |
75
+ | `--diff-threshold <0.0-1.0>` | Global changed-pixel threshold; prefer per-image sidecar values when available. |
76
+ | `--selective` | Marks upload as a subset. Use a manifest when removals/renames must be detected. |
77
+ | `--all-image-file-names-file <PATH>` | Full suite image-name manifest; implies `--selective`. |
78
+ | `--all-image-file-names <NAMES>` | Inline comma-separated manifest; conflicts with file variant. |
79
+ | `--base-sha <SHA>` | Base commit when CI cannot expose a merge base. |
80
+
81
+ Rules:
82
+
83
+ - Auth comes from `SENTRY_AUTH_TOKEN` or `--auth-token`.
84
+ - PR number without resolvable base SHA fails upload; pass `--base-sha` or check out
85
+ full history.
86
+ - Images above 40 million pixels are rejected.
87
+ - Base branch uploads the full snapshot set without selective flags.
88
+ - PR subset uploads should include the full image-name manifest so Sentry can detect
89
+ removals and renames.
90
+ - Every uploaded image must appear in the manifest.
91
+ - Generate the manifest and rendered subset from the same commit.
92
+ - Sharded manifests must be merged and de-duplicated with `sort -u` before upload.
93
+ - `--selective` without a manifest cannot detect removals or renames.
94
+
95
+ ## GitHub Actions Notes
96
+
97
+ Do not duplicate workflow templates here.
98
+
99
+ | CI shape | Read |
100
+ | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
101
+ | SnapshotPreviews with one simulator destination | `github-actions-simple.md` |
102
+ | SnapshotPreviews with multiple simulators/device families, parallel rendering, large suites | `github-actions-fanout.md` |
103
+ | Point-Free `swift-snapshot-testing` | `github-actions-swift-snapshot-testing.md` |
104
+ | Other existing generator | Adapt the project’s existing CI and upload the generated image directory. |
105
+
106
+ Before writing workflows:
107
+
108
+ - Verify current runner image, Xcode path, SDKs, and simulator names from existing CI or
109
+ current runner docs.
110
+ - Use `fetch-depth: 0` so `sentry-cli` can resolve base/head commits.
111
+ - Prefer existing Fastlane upload lanes when present.
112
+
113
+ ## Troubleshooting
114
+
115
+ | Issue | Fix |
116
+ | --------------------------- | ----------------------------------------------------------------------------------------------------- |
117
+ | Upload says no images found | Point upload at the directory containing PNGs; hidden files/directories are skipped. |
118
+ | Auth failure | Set `SENTRY_AUTH_TOKEN` or `--auth-token`; confirm `--org` and `--project`. |
119
+ | PR upload needs base SHA | Check out full history or pass `--base-sha`. |
120
+ | Manifest mismatch | Regenerate manifest and subset from same commit; merge shard manifests. |
121
+ | Image too large | Keep images below 40M pixels; constrain snapshot layout or renderer output. |
122
+ | Flaky snapshots | Remove nondeterminism first; then use generator-specific diff tolerance or Sentry sidecar thresholds. |
123
+ | Wrong comparisons in Sentry | Use stable `--app-id`, usually bundle id, not project slug. |