@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.
- package/README.md +6 -6
- package/package.json +1 -1
- package/skill-sources.jsonc +2 -33
- package/skill-sources.lock.json +15 -117
- package/skills/animate/LICENSE +21 -0
- package/skills/animate/NOTICE +10 -0
- package/skills/animate/SKILL.md +34 -0
- package/skills/animate/references/gestures.md +27 -0
- package/skills/animate/references/glossary.md +136 -0
- package/skills/animate/references/implementation.md +22 -0
- package/skills/animate/references/opportunities.md +18 -0
- package/skills/animate/references/principles.md +48 -0
- package/skills/animate/references/review.md +19 -0
- package/skills/cloudflare-workers/LICENSE +202 -0
- package/skills/cloudflare-workers/NOTICE +9 -0
- package/skills/cloudflare-workers/SKILL.md +26 -0
- package/skills/cloudflare-workers/references/durable-objects.md +68 -0
- package/skills/cloudflare-workers/references/sandbox.md +48 -0
- package/skills/cloudflare-workers/references/workers.md +63 -0
- package/skills/cloudflare-workers/references/wrangler.md +56 -0
- package/skills/design-ui/LICENSE +21 -0
- package/skills/design-ui/NOTICE +8 -0
- package/skills/design-ui/SKILL.md +29 -0
- package/skills/design-ui/references/appearance.md +22 -0
- package/skills/design-ui/references/components.md +33 -0
- package/skills/design-ui/references/exploration.md +50 -0
- package/skills/design-ui/references/libraries.md +39 -0
- package/skills/design-ui/references/themes.md +23 -0
- package/skills/dev-kit/SKILL.md +19 -38
- package/skills/dev-kit/references/cloudflare-worker-api.md +1 -1
- package/skills/dev-kit/references/skills.md +2 -2
- package/skills/effect-development/SKILL.md +27 -0
- package/skills/effect-development/agents/openai.yaml +4 -0
- package/skills/effect-development/references/api/index.md +32 -0
- package/skills/effect-development/references/api/schema-codecs.md +15 -0
- package/skills/{build-effect-apis/references → effect-development/references/api}/verification.md +10 -5
- package/skills/{effect-architecture-audit/SKILL.md → effect-development/references/architecture/index.md} +1 -6
- package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-client.md +8 -6
- package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-testing.md +7 -2
- package/skills/effect-development/references/atom/index.md +40 -0
- package/skills/{build-effect-clis/references → effect-development/references/cli}/entrypoints-and-testing.md +6 -2
- package/skills/effect-development/references/cli/index.md +39 -0
- package/skills/effect-development/references/setup.md +15 -0
- package/skills/open-pull-request/SKILL.md +10 -70
- package/skills/open-pull-request/references/evidence.md +22 -0
- package/skills/open-pull-request/references/explanation.md +21 -0
- package/skills/open-pull-request/references/publication.md +21 -0
- package/skills/sentry/LICENSE +202 -0
- package/skills/sentry/LICENSE-UPSTREAM +21 -0
- package/skills/sentry/NOTICE +14 -0
- package/skills/sentry/SKILL.md +33 -0
- package/skills/sentry/references/alert-payloads.md +105 -0
- package/skills/sentry/references/alerts.md +17 -0
- package/skills/sentry/references/artifacts.md +25 -0
- package/skills/sentry/references/auth-token.md +65 -0
- package/skills/sentry/references/concepts/ai-monitoring.md +131 -0
- package/skills/sentry/references/concepts/choosing-a-signal.md +78 -0
- package/skills/sentry/references/concepts/crons.md +50 -0
- package/skills/sentry/references/concepts/data-scrubbing.md +43 -0
- package/skills/sentry/references/concepts/errors.md +40 -0
- package/skills/sentry/references/concepts/logging.md +85 -0
- package/skills/sentry/references/concepts/metrics.md +49 -0
- package/skills/sentry/references/concepts/monitors.md +78 -0
- package/skills/sentry/references/concepts/profiling.md +38 -0
- package/skills/sentry/references/concepts/reduce-volume.md +49 -0
- package/skills/sentry/references/concepts/releases.md +43 -0
- package/skills/sentry/references/concepts/session-replay.md +35 -0
- package/skills/sentry/references/concepts/tracing.md +54 -0
- package/skills/sentry/references/concepts/user-feedback.md +36 -0
- package/skills/sentry/references/debug-artifacts/android.md +68 -0
- package/skills/sentry/references/debug-artifacts/apple.md +96 -0
- package/skills/sentry/references/debug-artifacts/dotnet.md +70 -0
- package/skills/sentry/references/debug-artifacts/flutter.md +65 -0
- package/skills/sentry/references/debug-artifacts/index.md +75 -0
- package/skills/sentry/references/debug-artifacts/javascript.md +94 -0
- package/skills/sentry/references/debug-artifacts/matching.md +73 -0
- package/skills/sentry/references/debug-artifacts/react-native.md +75 -0
- package/skills/sentry/references/first-error-setup.md +25 -0
- package/skills/sentry/references/instrumentation.md +30 -0
- package/skills/sentry/references/issues.md +32 -0
- package/skills/sentry/references/new-project.md +17 -0
- package/skills/sentry/references/otel-exporter.md +30 -0
- package/skills/sentry/references/release-workflow.md +31 -0
- package/skills/sentry/references/releases/ci-pipeline.md +214 -0
- package/skills/sentry/references/releases/index.md +93 -0
- package/skills/sentry/references/releases/suspect-commits.md +155 -0
- package/skills/sentry/references/releases/tagging.md +131 -0
- package/skills/sentry/references/releases/troubleshooting.md +67 -0
- package/skills/sentry/references/sdks/android/crons.md +305 -0
- package/skills/sentry/references/sdks/android/error-monitoring.md +800 -0
- package/skills/sentry/references/sdks/android/index.md +748 -0
- package/skills/sentry/references/sdks/android/integrations.md +48 -0
- package/skills/sentry/references/sdks/android/logging.md +374 -0
- package/skills/sentry/references/sdks/android/metrics.md +288 -0
- package/skills/sentry/references/sdks/android/profiling.md +397 -0
- package/skills/sentry/references/sdks/android/session-replay.md +406 -0
- package/skills/sentry/references/sdks/android/tracing.md +861 -0
- package/skills/sentry/references/sdks/browser/error-monitoring.md +861 -0
- package/skills/sentry/references/sdks/browser/index.md +714 -0
- package/skills/sentry/references/sdks/browser/logging.md +315 -0
- package/skills/sentry/references/sdks/browser/profiling.md +236 -0
- package/skills/sentry/references/sdks/browser/session-replay.md +586 -0
- package/skills/sentry/references/sdks/browser/tracing.md +561 -0
- package/skills/sentry/references/sdks/browser/user-feedback.md +354 -0
- package/skills/sentry/references/sdks/cloudflare/ai-monitoring.md +661 -0
- package/skills/sentry/references/sdks/cloudflare/crons.md +231 -0
- package/skills/sentry/references/sdks/cloudflare/durable-objects.md +381 -0
- package/skills/sentry/references/sdks/cloudflare/error-monitoring.md +329 -0
- package/skills/sentry/references/sdks/cloudflare/index.md +698 -0
- package/skills/sentry/references/sdks/cloudflare/logging.md +169 -0
- package/skills/sentry/references/sdks/cloudflare/nodejs-compat.md +134 -0
- package/skills/sentry/references/sdks/cloudflare/tracing.md +475 -0
- package/skills/sentry/references/sdks/cocoa/error-monitoring.md +394 -0
- package/skills/sentry/references/sdks/cocoa/index.md +497 -0
- package/skills/sentry/references/sdks/cocoa/logging.md +209 -0
- package/skills/sentry/references/sdks/cocoa/metrics.md +136 -0
- package/skills/sentry/references/sdks/cocoa/profiling.md +223 -0
- package/skills/sentry/references/sdks/cocoa/session-replay.md +257 -0
- package/skills/sentry/references/sdks/cocoa/tracing.md +524 -0
- package/skills/sentry/references/sdks/cocoa/user-feedback.md +310 -0
- package/skills/sentry/references/sdks/dotnet/crons.md +465 -0
- package/skills/sentry/references/sdks/dotnet/error-monitoring.md +1100 -0
- package/skills/sentry/references/sdks/dotnet/index.md +614 -0
- package/skills/sentry/references/sdks/dotnet/logging.md +556 -0
- package/skills/sentry/references/sdks/dotnet/metrics.md +229 -0
- package/skills/sentry/references/sdks/dotnet/profiling.md +296 -0
- package/skills/sentry/references/sdks/dotnet/tracing.md +897 -0
- package/skills/sentry/references/sdks/elixir/crons.md +371 -0
- package/skills/sentry/references/sdks/elixir/error-monitoring.md +335 -0
- package/skills/sentry/references/sdks/elixir/index.md +383 -0
- package/skills/sentry/references/sdks/elixir/logging.md +239 -0
- package/skills/sentry/references/sdks/elixir/tracing.md +233 -0
- package/skills/sentry/references/sdks/flutter/ecosystem-integrations.md +70 -0
- package/skills/sentry/references/sdks/flutter/error-monitoring.md +312 -0
- package/skills/sentry/references/sdks/flutter/index.md +728 -0
- package/skills/sentry/references/sdks/flutter/logging.md +387 -0
- package/skills/sentry/references/sdks/flutter/metrics.md +310 -0
- package/skills/sentry/references/sdks/flutter/profiling.md +214 -0
- package/skills/sentry/references/sdks/flutter/session-replay.md +308 -0
- package/skills/sentry/references/sdks/flutter/tracing.md +502 -0
- package/skills/sentry/references/sdks/go/crons.md +270 -0
- package/skills/sentry/references/sdks/go/error-monitoring.md +361 -0
- package/skills/sentry/references/sdks/go/index.md +324 -0
- package/skills/sentry/references/sdks/go/logging.md +354 -0
- package/skills/sentry/references/sdks/go/metrics.md +273 -0
- package/skills/sentry/references/sdks/go/profiling.md +46 -0
- package/skills/sentry/references/sdks/go/tracing.md +366 -0
- package/skills/sentry/references/sdks/index.md +41 -0
- package/skills/sentry/references/sdks/nestjs/ai-monitoring.md +410 -0
- package/skills/sentry/references/sdks/nestjs/crons.md +268 -0
- package/skills/sentry/references/sdks/nestjs/error-monitoring.md +729 -0
- package/skills/sentry/references/sdks/nestjs/index.md +699 -0
- package/skills/sentry/references/sdks/nestjs/logging.md +174 -0
- package/skills/sentry/references/sdks/nestjs/metrics.md +243 -0
- package/skills/sentry/references/sdks/nestjs/profiling.md +127 -0
- package/skills/sentry/references/sdks/nestjs/tracing.md +762 -0
- package/skills/sentry/references/sdks/nextjs/ai-monitoring.md +494 -0
- package/skills/sentry/references/sdks/nextjs/crons.md +383 -0
- package/skills/sentry/references/sdks/nextjs/error-monitoring.md +974 -0
- package/skills/sentry/references/sdks/nextjs/index.md +491 -0
- package/skills/sentry/references/sdks/nextjs/logging.md +381 -0
- package/skills/sentry/references/sdks/nextjs/metrics.md +411 -0
- package/skills/sentry/references/sdks/nextjs/profiling.md +403 -0
- package/skills/sentry/references/sdks/nextjs/session-replay.md +462 -0
- package/skills/sentry/references/sdks/nextjs/tracing.md +628 -0
- package/skills/sentry/references/sdks/node/ai-monitoring.md +303 -0
- package/skills/sentry/references/sdks/node/crons.md +432 -0
- package/skills/sentry/references/sdks/node/error-monitoring.md +1125 -0
- package/skills/sentry/references/sdks/node/index.md +942 -0
- package/skills/sentry/references/sdks/node/logging.md +380 -0
- package/skills/sentry/references/sdks/node/metrics.md +278 -0
- package/skills/sentry/references/sdks/node/profiling.md +373 -0
- package/skills/sentry/references/sdks/node/tracing.md +878 -0
- package/skills/sentry/references/sdks/php/ai-monitoring.md +310 -0
- package/skills/sentry/references/sdks/php/crons.md +265 -0
- package/skills/sentry/references/sdks/php/error-monitoring.md +626 -0
- package/skills/sentry/references/sdks/php/index.md +362 -0
- package/skills/sentry/references/sdks/php/laravel.md +542 -0
- package/skills/sentry/references/sdks/php/logging.md +242 -0
- package/skills/sentry/references/sdks/php/metrics.md +193 -0
- package/skills/sentry/references/sdks/php/profiling.md +115 -0
- package/skills/sentry/references/sdks/php/symfony.md +552 -0
- package/skills/sentry/references/sdks/php/tracing.md +516 -0
- package/skills/sentry/references/sdks/python/ai-monitoring.md +351 -0
- package/skills/sentry/references/sdks/python/crons.md +218 -0
- package/skills/sentry/references/sdks/python/error-monitoring.md +292 -0
- package/skills/sentry/references/sdks/python/index.md +361 -0
- package/skills/sentry/references/sdks/python/logging.md +234 -0
- package/skills/sentry/references/sdks/python/metrics.md +154 -0
- package/skills/sentry/references/sdks/python/profiling.md +120 -0
- package/skills/sentry/references/sdks/python/tracing.md +364 -0
- package/skills/sentry/references/sdks/react/error-monitoring.md +1607 -0
- package/skills/sentry/references/sdks/react/index.md +492 -0
- package/skills/sentry/references/sdks/react/logging.md +364 -0
- package/skills/sentry/references/sdks/react/profiling.md +322 -0
- package/skills/sentry/references/sdks/react/react-features.md +1272 -0
- package/skills/sentry/references/sdks/react/session-replay.md +1193 -0
- package/skills/sentry/references/sdks/react/tracing.md +1415 -0
- package/skills/sentry/references/sdks/react-native/error-monitoring.md +1481 -0
- package/skills/sentry/references/sdks/react-native/expo-config-plugin.md +45 -0
- package/skills/sentry/references/sdks/react-native/index.md +1030 -0
- package/skills/sentry/references/sdks/react-native/logging.md +444 -0
- package/skills/sentry/references/sdks/react-native/profiling.md +386 -0
- package/skills/sentry/references/sdks/react-native/session-replay.md +704 -0
- package/skills/sentry/references/sdks/react-native/tracing.md +1086 -0
- package/skills/sentry/references/sdks/react-native/user-feedback.md +815 -0
- package/skills/sentry/references/sdks/react-router-framework/error-monitoring.md +127 -0
- package/skills/sentry/references/sdks/react-router-framework/index.md +411 -0
- package/skills/sentry/references/sdks/react-router-framework/logging.md +66 -0
- package/skills/sentry/references/sdks/react-router-framework/profiling.md +57 -0
- package/skills/sentry/references/sdks/react-router-framework/react-router-framework-features.md +110 -0
- package/skills/sentry/references/sdks/react-router-framework/session-replay.md +67 -0
- package/skills/sentry/references/sdks/react-router-framework/tracing.md +96 -0
- package/skills/sentry/references/sdks/react-router-framework/user-feedback.md +71 -0
- package/skills/sentry/references/sdks/ruby/crons.md +184 -0
- package/skills/sentry/references/sdks/ruby/error-monitoring.md +248 -0
- package/skills/sentry/references/sdks/ruby/index.md +297 -0
- package/skills/sentry/references/sdks/ruby/logging.md +168 -0
- package/skills/sentry/references/sdks/ruby/metrics.md +196 -0
- package/skills/sentry/references/sdks/ruby/migration.md +321 -0
- package/skills/sentry/references/sdks/ruby/profiling.md +107 -0
- package/skills/sentry/references/sdks/ruby/tracing.md +388 -0
- package/skills/sentry/references/sdks/svelte/error-monitoring.md +456 -0
- package/skills/sentry/references/sdks/svelte/index.md +467 -0
- package/skills/sentry/references/sdks/svelte/logging.md +344 -0
- package/skills/sentry/references/sdks/svelte/session-replay.md +369 -0
- package/skills/sentry/references/sdks/svelte/tracing.md +406 -0
- package/skills/sentry/references/sdks/tanstack-start/error-monitoring.md +149 -0
- package/skills/sentry/references/sdks/tanstack-start/index.md +381 -0
- package/skills/sentry/references/sdks/tanstack-start/logging.md +74 -0
- package/skills/sentry/references/sdks/tanstack-start/session-replay.md +76 -0
- package/skills/sentry/references/sdks/tanstack-start/tanstackstart-features.md +128 -0
- package/skills/sentry/references/sdks/tanstack-start/tracing.md +123 -0
- package/skills/sentry/references/sdks/tanstack-start/user-feedback.md +81 -0
- package/skills/sentry/references/search-query-language.md +226 -0
- package/skills/sentry/references/semantics/angular.md +7 -0
- package/skills/sentry/references/semantics/app.md +28 -0
- package/skills/sentry/references/semantics/art.md +17 -0
- package/skills/sentry/references/semantics/aws.md +43 -0
- package/skills/sentry/references/semantics/browser.md +34 -0
- package/skills/sentry/references/semantics/cache.md +12 -0
- package/skills/sentry/references/semantics/client.md +8 -0
- package/skills/sentry/references/semantics/cloud.md +12 -0
- package/skills/sentry/references/semantics/cloudflare.md +23 -0
- package/skills/sentry/references/semantics/code.md +11 -0
- package/skills/sentry/references/semantics/culture.md +11 -0
- package/skills/sentry/references/semantics/db.md +21 -0
- package/skills/sentry/references/semantics/device.md +43 -0
- package/skills/sentry/references/semantics/error.md +7 -0
- package/skills/sentry/references/semantics/event.md +8 -0
- package/skills/sentry/references/semantics/exception.md +10 -0
- package/skills/sentry/references/semantics/faas.md +19 -0
- package/skills/sentry/references/semantics/file.md +8 -0
- package/skills/sentry/references/semantics/flag.md +7 -0
- package/skills/sentry/references/semantics/gcp.md +16 -0
- package/skills/sentry/references/semantics/gen_ai.md +53 -0
- package/skills/sentry/references/semantics/general.md +11 -0
- package/skills/sentry/references/semantics/graphql.md +9 -0
- package/skills/sentry/references/semantics/grpc.md +19 -0
- package/skills/sentry/references/semantics/http.md +34 -0
- package/skills/sentry/references/semantics/index.md +63 -0
- package/skills/sentry/references/semantics/jsonrpc.md +8 -0
- package/skills/sentry/references/semantics/jvm.md +12 -0
- package/skills/sentry/references/semantics/koa.md +7 -0
- package/skills/sentry/references/semantics/logger.md +7 -0
- package/skills/sentry/references/semantics/mcp.md +37 -0
- package/skills/sentry/references/semantics/mdc.md +7 -0
- package/skills/sentry/references/semantics/messaging.md +23 -0
- package/skills/sentry/references/semantics/middleware.md +7 -0
- package/skills/sentry/references/semantics/navigation.md +9 -0
- package/skills/sentry/references/semantics/nel.md +11 -0
- package/skills/sentry/references/semantics/network.md +17 -0
- package/skills/sentry/references/semantics/os.md +15 -0
- package/skills/sentry/references/semantics/otel.md +10 -0
- package/skills/sentry/references/semantics/params.md +7 -0
- package/skills/sentry/references/semantics/process.md +14 -0
- package/skills/sentry/references/semantics/react.md +7 -0
- package/skills/sentry/references/semantics/remix.md +7 -0
- package/skills/sentry/references/semantics/resource.md +7 -0
- package/skills/sentry/references/semantics/rpc.md +10 -0
- package/skills/sentry/references/semantics/score.md +10 -0
- package/skills/sentry/references/semantics/sentry.md +69 -0
- package/skills/sentry/references/semantics/server.md +8 -0
- package/skills/sentry/references/semantics/service.md +8 -0
- package/skills/sentry/references/semantics/session.md +7 -0
- package/skills/sentry/references/semantics/state.md +7 -0
- package/skills/sentry/references/semantics/thread.md +8 -0
- package/skills/sentry/references/semantics/timber.md +7 -0
- package/skills/sentry/references/semantics/trpc.md +8 -0
- package/skills/sentry/references/semantics/ui.md +18 -0
- package/skills/sentry/references/semantics/url.md +15 -0
- package/skills/sentry/references/semantics/user.md +17 -0
- package/skills/sentry/references/semantics/user_agent.md +7 -0
- package/skills/sentry/references/semantics/vercel.md +42 -0
- package/skills/sentry/references/setup-verification.md +39 -0
- package/skills/sentry/references/snapshots/github-actions-fanout.md +206 -0
- package/skills/sentry/references/snapshots/github-actions-simple.md +102 -0
- package/skills/sentry/references/snapshots/github-actions-swift-snapshot-testing.md +118 -0
- package/skills/sentry/references/snapshots/index.md +19 -0
- package/skills/sentry/references/snapshots/snapshot-previews.md +100 -0
- package/skills/sentry/references/snapshots/snapshots.md +123 -0
- package/skills/sentry/references/snapshots/wizard-setup.md +134 -0
- package/skills/testing/LICENSE +21 -0
- package/skills/testing/NOTICE +7 -0
- package/skills/testing/SKILL.md +13 -19
- package/skills/testing/agents/openai.yaml +1 -2
- package/skills/testing/references/selection.md +23 -0
- package/skills/testing/references/tdd.md +19 -0
- package/skills/testing/references/test-design.md +17 -0
- package/src/catalog.ts +1 -7
- package/skills/build-effect-apis/SKILL.md +0 -81
- package/skills/build-effect-apis/agents/openai.yaml +0 -4
- package/skills/build-effect-clis/SKILL.md +0 -92
- package/skills/build-effect-clis/agents/openai.yaml +0 -4
- package/skills/effect-architecture-audit/agents/openai.yaml +0 -4
- package/skills/effect-atom-state/SKILL.md +0 -97
- package/skills/effect-atom-state/agents/openai.yaml +0 -4
- package/skills/effect-ts/SKILL.md +0 -35
- package/skills/effect-ts/agents/openai.yaml +0 -4
- /package/skills/{build-effect-apis/references → effect-development/references/api}/cloudflare-workers.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/runtime-assembly.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/server-and-middleware.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/shared-contracts.md +0 -0
- /package/skills/{effect-architecture-audit/references → effect-development/references/architecture}/service-and-boundary-audit.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-lifecycle.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-workflows.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/tanstack-start.md +0 -0
- /package/skills/{build-effect-clis/references → effect-development/references/cli}/command-design.md +0 -0
- /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. |
|