@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,861 @@
1
+ # Error Monitoring — Sentry Browser SDK
2
+
3
+ > Minimum SDK: `@sentry/browser` ≥7.0.0\
4
+ > `makeBrowserOfflineTransport` requires `@sentry/browser` ≥7.48.0\
5
+ > `linkedErrorsIntegration` `cause` chain requires Error.cause support (Chrome 93+,
6
+ > Firefox 91+)
7
+
8
+ ---
9
+
10
+ ## How Automatic Capture Works
11
+
12
+ The browser SDK hooks into the browser environment and captures errors from multiple
13
+ layers automatically:
14
+
15
+ | Layer | Mechanism | Integration |
16
+ | ------------------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------ |
17
+ | Uncaught synchronous exceptions | `window.onerror` | `globalHandlersIntegration` (default on) |
18
+ | Unhandled promise rejections | `window.onunhandledrejection` | `globalHandlersIntegration` (default on) |
19
+ | Errors in `setTimeout` / `setInterval` / `requestAnimationFrame` / `addEventListener` | Patched browser APIs | `browserApiErrorsIntegration` (default on) |
20
+ | Console errors (optional) | Patched `console.error` | `captureConsoleIntegration` (opt-in) |
21
+
22
+ ### What Requires Manual Instrumentation
23
+
24
+ The global handlers only catch errors that **escape** your code.
25
+ These are silently swallowed without manual calls:
26
+
27
+ - Errors caught by your own `try/catch` blocks
28
+ - Business-logic failures (validation errors, unexpected states)
29
+ - Async errors in `.then()` chains where `.catch()` is attached
30
+ - User-visible conditions that aren’t exceptions (use `captureMessage`)
31
+
32
+ ---
33
+
34
+ ## Core Capture APIs
35
+
36
+ ### `Sentry.captureException(error, captureContext?)`
37
+
38
+ Captures an exception and sends it to Sentry.
39
+ Prefer `Error` objects — they include stack traces.
40
+
41
+ ```javascript
42
+ import * as Sentry from "@sentry/browser";
43
+
44
+ // Basic usage
45
+ try {
46
+ riskyOperation();
47
+ } catch (err) {
48
+ Sentry.captureException(err);
49
+ }
50
+
51
+ // With inline capture context
52
+ try {
53
+ await chargeCard(order);
54
+ } catch (err) {
55
+ Sentry.captureException(err, {
56
+ level: "fatal",
57
+ tags: { module: "checkout", payment_provider: "stripe" },
58
+ extra: { orderId: order.id, amount: order.total },
59
+ user: { id: "u_123", email: "user@example.com" },
60
+ fingerprint: ["checkout-payment-fail"],
61
+ contexts: {
62
+ payment: { provider: "stripe", amount: 9999, currency: "usd" },
63
+ },
64
+ });
65
+ }
66
+
67
+ // Non-Error values are accepted but may lack stack traces
68
+ Sentry.captureException("Something went wrong as a string");
69
+ ```
70
+
71
+ **`CaptureContext` shape:**
72
+
73
+ | Field | Type | Description |
74
+ | ------------- | --------------------------------------------------------------- | ----------------------------------- |
75
+ | `level` | `"fatal" \| "error" \| "warning" \| "log" \| "info" \| "debug"` | Severity override for this event |
76
+ | `tags` | `Record<string, string>` | Indexed, filterable key-value pairs |
77
+ | `extra` | `Record<string, unknown>` | Unindexed supplementary data |
78
+ | `user` | `{ id?, email?, username?, ip_address? }` | User identity |
79
+ | `contexts` | `Record<string, Record<string, unknown>>` | Named structured context blocks |
80
+ | `fingerprint` | `string[]` | Custom issue grouping key |
81
+
82
+ ---
83
+
84
+ ### `Sentry.captureMessage(message, levelOrContext?)`
85
+
86
+ Captures a plain-text message as a Sentry issue.
87
+
88
+ ```javascript
89
+ // With a severity level (shorthand second argument)
90
+ Sentry.captureMessage("Something went wrong", "warning");
91
+ Sentry.captureMessage("Payment gateway timeout", "fatal");
92
+
93
+ // With full CaptureContext
94
+ Sentry.captureMessage("User performed invalid action", {
95
+ level: "warning",
96
+ user: { id: "u_456" },
97
+ tags: { feature: "cart", action: "remove-item" },
98
+ extra: { itemId: "sku_789" },
99
+ });
100
+ ```
101
+
102
+ > Set `attachStacktrace: true` in `Sentry.init()` to automatically attach a stack trace
103
+ > to message events.
104
+
105
+ ---
106
+
107
+ ### `Sentry.captureEvent(event)`
108
+
109
+ Sends a fully constructed Sentry event object.
110
+ Use `captureException` or `captureMessage` in application code; use `captureEvent` for
111
+ custom integrations or forwarding from legacy loggers.
112
+
113
+ ```javascript
114
+ Sentry.captureEvent({
115
+ message: "Legacy logger forwarded event",
116
+ level: "warning",
117
+ tags: { source: "legacy-logger", module: "billing" },
118
+ extra: { rawLog: "something went wrong at line 42" },
119
+ timestamp: Date.now() / 1000, // Unix timestamp in seconds
120
+ fingerprint: ["legacy-billing-error"],
121
+ });
122
+ ```
123
+
124
+ ---
125
+
126
+ ### Utility APIs
127
+
128
+ ```javascript
129
+ // Get the event ID of the last sent error event
130
+ const eventId = Sentry.lastEventId();
131
+
132
+ // Flush all pending events before page unload / shutdown
133
+ await Sentry.flush(2000); // wait up to 2 seconds
134
+
135
+ // Flush and disable the SDK permanently
136
+ await Sentry.close(2000);
137
+
138
+ // Check if SDK is initialized and enabled
139
+ if (Sentry.isEnabled()) {
140
+ /* ... */
141
+ }
142
+ ```
143
+
144
+ ---
145
+
146
+ ## Scope Management
147
+
148
+ Sentry uses three nested scope types.
149
+ Data from all three is merged before each event is sent.
150
+
151
+ | Scope | API | Lifetime | Use Case |
152
+ | ------------- | --------------------- | ----------------------- | ---------------------------------------------------------- |
153
+ | **Global** | `getGlobalScope()` | Entire application | App-wide constants: version, build ID, region |
154
+ | **Isolation** | `getIsolationScope()` | Per page load (browser) | User info, session data, tags set via top-level `setTag()` |
155
+ | **Current** | `withScope()` | Per-event / narrowest | Per-operation data: one API call, one form submit |
156
+
157
+ **Merge priority (later overrides earlier):**
158
+
159
+ ```
160
+ Global Scope → Isolation Scope → Current Scope → Event-level CaptureContext
161
+ ```
162
+
163
+ > **Browser note:** In a browser there is no per-request isolation, so the isolation
164
+ > scope effectively behaves like the global scope.
165
+ > The distinction matters in server-side runtimes (Node.js, Deno, Cloudflare Workers).
166
+
167
+ ---
168
+
169
+ ### `withScope` — Per-Event Scoping (Recommended)
170
+
171
+ Forks the current scope, runs your callback with the fork, and discards it when done.
172
+ This is the preferred way to attach data to a single event without polluting broader
173
+ scope.
174
+
175
+ ```javascript
176
+ Sentry.withScope((scope) => {
177
+ scope.setTag("transaction_id", "txn_abc123");
178
+ scope.setExtra("requestPayload", { amount: 50, currency: "USD" });
179
+ scope.setLevel("warning");
180
+ scope.setUser({ id: "u_789" });
181
+ scope.setFingerprint(["payment-error", "stripe"]);
182
+ Sentry.captureException(new Error("Payment failed"));
183
+ // scope is discarded after this callback
184
+ });
185
+
186
+ // Events captured here are NOT affected by the above scope
187
+ Sentry.captureMessage("This event has no payment tags");
188
+ ```
189
+
190
+ ---
191
+
192
+ ### Scope Methods
193
+
194
+ Every scope instance exposes the same enrichment API:
195
+
196
+ ```javascript
197
+ // Isolation scope — persists for all subsequent events on this page
198
+ Sentry.getIsolationScope().setUser({ id: "u_123", email: "user@example.com" });
199
+ Sentry.getIsolationScope().setTag("app_version", "3.4.1");
200
+
201
+ // Global scope — applied to every event in the app
202
+ Sentry.getGlobalScope().setTag("datacenter", "us-east-1");
203
+ Sentry.getGlobalScope().setContext("build", {
204
+ commit: "abc1234",
205
+ buildDate: "2026-03-03",
206
+ });
207
+
208
+ // Scope method reference
209
+ scope.setUser({ id, email, username, ip_address }); // setUser(null) to clear
210
+ scope.setTag("key", "value");
211
+ scope.setTags({ key1: "v1", key2: "v2" });
212
+ scope.setExtra("key", value);
213
+ scope.setExtras({ key1: v1, key2: v2 });
214
+ scope.setContext("name", { key: value }); // setContext("name", null) to remove
215
+ scope.setLevel("warning");
216
+ scope.setFingerprint(["my-group-key"]);
217
+ scope.addBreadcrumb({ category: "auth", message: "User logged in" });
218
+ scope.addEventProcessor((event) => {
219
+ /* modify or drop */ return event;
220
+ });
221
+ scope.clear(); // reset all scope data
222
+ ```
223
+
224
+ ---
225
+
226
+ ## Event Enrichment
227
+
228
+ ### Tags — Indexed, Searchable Key-Value Pairs
229
+
230
+ Tags power filtering, search, and tag distribution maps in the Sentry UI.
231
+
232
+ **Constraints:** Key ≤32 chars (`a-zA-Z0-9_.:-`, no spaces).
233
+ Value ≤200 chars, no newlines.
234
+
235
+ ```javascript
236
+ // Single tag — applied to all subsequent events (isolation scope)
237
+ Sentry.setTag("page_locale", "de-at");
238
+ Sentry.setTag("subscription_tier", "pro");
239
+ Sentry.setTag("feature_flag", "new_checkout_enabled");
240
+
241
+ // Multiple tags at once
242
+ Sentry.setTags({
243
+ environment: "staging",
244
+ region: "eu-west-1",
245
+ api_version: "v3",
246
+ });
247
+
248
+ // Scoped tag — only on this one event
249
+ Sentry.withScope((scope) => {
250
+ scope.setTag("retry_attempt", "3");
251
+ Sentry.captureException(new Error("Max retries exceeded"));
252
+ });
253
+ ```
254
+
255
+ ---
256
+
257
+ ### Context — Rich Unindexed Structured Data
258
+
259
+ Context is **not indexed or searchable** but displays in full on the event details page.
260
+ Use it for rich structured data you need for debugging but don’t need to filter on.
261
+
262
+ ```javascript
263
+ Sentry.setContext("shopping_cart", {
264
+ itemCount: 3,
265
+ totalAmount: 149.99,
266
+ currency: "USD",
267
+ couponApplied: "SAVE10",
268
+ });
269
+
270
+ Sentry.setContext("device", {
271
+ platform: navigator.platform,
272
+ language: navigator.language,
273
+ screenWidth: screen.width,
274
+ screenHeight: screen.height,
275
+ });
276
+
277
+ // Clear a context by passing null
278
+ Sentry.setContext("shopping_cart", null);
279
+ ```
280
+
281
+ > **Depth limit:** Nested context objects are normalized to **3 levels deep** by
282
+ > default. Use `normalizeDepth` in `init()` to change this.
283
+
284
+ ---
285
+
286
+ ### User Information
287
+
288
+ ```javascript
289
+ // Set user on login
290
+ Sentry.setUser({
291
+ id: "user_abc123",
292
+ email: "alice@example.com",
293
+ username: "alice",
294
+ subscription: "premium", // arbitrary extra field
295
+ org: "acme-corp",
296
+ });
297
+
298
+ // Clear user on logout
299
+ Sentry.setUser(null);
300
+
301
+ // Auto-infer IP address (requires sendDefaultPii: true in init)
302
+ Sentry.setUser({ ip_address: "{{auto}}" });
303
+ ```
304
+
305
+ ---
306
+
307
+ ### `initialScope` — Set Context at Startup
308
+
309
+ ```javascript
310
+ // Object form
311
+ Sentry.init({
312
+ dsn: "___PUBLIC_DSN___",
313
+ initialScope: {
314
+ tags: { "app.version": "1.2.3", region: "us-west" },
315
+ user: { id: 42, email: "john.doe@example.com" },
316
+ },
317
+ });
318
+
319
+ // Callback form (full Scope API access)
320
+ Sentry.init({
321
+ dsn: "___PUBLIC_DSN___",
322
+ initialScope: (scope) => {
323
+ scope.setTags({ a: "b", c: "d" });
324
+ scope.setContext("device", { platform: navigator.platform });
325
+ return scope;
326
+ },
327
+ });
328
+ ```
329
+
330
+ ---
331
+
332
+ ## Breadcrumbs
333
+
334
+ Breadcrumbs create a trail of events leading up to an issue.
335
+ They’re buffered locally and attached to the next event sent to Sentry.
336
+
337
+ ### Automatic Breadcrumbs
338
+
339
+ | Source | What is captured |
340
+ | --------- | -------------------------------------------------------- |
341
+ | `console` | `console.log`, `warn`, `error`, `debug` calls |
342
+ | `dom` | Click and keypress events on DOM elements |
343
+ | `fetch` | All `fetch()` HTTP requests (URL, method, status) |
344
+ | `xhr` | All `XMLHttpRequest` calls |
345
+ | `history` | `history.pushState`, `history.replaceState`, navigations |
346
+ | `sentry` | Internal events when the SDK sends to Sentry |
347
+
348
+ ### Manual Breadcrumbs
349
+
350
+ ```javascript
351
+ // Authentication event
352
+ Sentry.addBreadcrumb({
353
+ category: "auth",
354
+ message: "User authenticated",
355
+ level: "info",
356
+ data: { userId: user.id, method: "oauth2", provider: "google" },
357
+ });
358
+
359
+ // Navigation event
360
+ Sentry.addBreadcrumb({
361
+ type: "navigation",
362
+ category: "navigation",
363
+ data: { from: "/home", to: "/checkout" },
364
+ });
365
+
366
+ // Custom action
367
+ Sentry.addBreadcrumb({
368
+ category: "cart",
369
+ message: "Item added to cart",
370
+ level: "info",
371
+ data: { itemId: "sku_123", quantity: 2, price: 29.99 },
372
+ });
373
+
374
+ // Feature flag
375
+ Sentry.addBreadcrumb({
376
+ type: "debug",
377
+ category: "feature-flag",
378
+ message: "New checkout flow enabled",
379
+ level: "debug",
380
+ data: { flag: "checkout_v2", value: true },
381
+ });
382
+ ```
383
+
384
+ **Breadcrumb schema:**
385
+
386
+ | Field | Type | Description |
387
+ | ----------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
388
+ | `message` | `string` | Human-readable description |
389
+ | `type` | `"default" \| "debug" \| "error" \| "info" \| "navigation" \| "http" \| "query" \| "ui" \| "user"` | Breadcrumb type |
390
+ | `level` | `"fatal" \| "error" \| "warning" \| "log" \| "info" \| "debug"` | Severity |
391
+ | `category` | `string` | Dot-namespaced: `"auth"`, `"ui.click"`, `"api.request"` |
392
+ | `data` | `Record<string, unknown>` | Arbitrary structured payload |
393
+ | `timestamp` | `number` | Unix timestamp; auto-set if omitted |
394
+
395
+ ---
396
+
397
+ ### Breadcrumb Configuration
398
+
399
+ ```javascript
400
+ Sentry.init({
401
+ dsn: "___PUBLIC_DSN___",
402
+ maxBreadcrumbs: 50, // default: 100
403
+
404
+ beforeBreadcrumb(breadcrumb, hint) {
405
+ // Drop UI click breadcrumbs
406
+ if (breadcrumb.category === "ui.click") return null;
407
+
408
+ // Enrich XHR breadcrumbs with request body size
409
+ if (breadcrumb.type === "http" && hint?.xhr) {
410
+ breadcrumb.data = {
411
+ ...breadcrumb.data,
412
+ requestBodySize: hint.xhr.requestBody?.length ?? 0,
413
+ };
414
+ }
415
+
416
+ // Drop console.debug noise in production
417
+ if (breadcrumb.category === "console" && breadcrumb.level === "debug") {
418
+ return null;
419
+ }
420
+
421
+ return breadcrumb;
422
+ },
423
+
424
+ integrations: [
425
+ Sentry.breadcrumbsIntegration({
426
+ console: true,
427
+ dom: { serializeAttribute: ["data-testid", "aria-label"] },
428
+ fetch: true,
429
+ history: true,
430
+ xhr: true,
431
+ sentry: true,
432
+ }),
433
+ ],
434
+ });
435
+ ```
436
+
437
+ ---
438
+
439
+ ## Hooks — `beforeSend`, `beforeSendTransaction`, `beforeBreadcrumb`
440
+
441
+ ### `beforeSend` — Modify or Drop Error Events
442
+
443
+ Called last, just before an error event is sent.
444
+ All scope data has already been applied.
445
+ Return the event to send it, or `null` to drop it.
446
+
447
+ ```javascript
448
+ Sentry.init({
449
+ dsn: "___PUBLIC_DSN___",
450
+
451
+ beforeSend(event, hint) {
452
+ const err = hint.originalException;
453
+
454
+ // --- Drop known noisy errors ---
455
+ if (event.exception?.values?.[0]?.value?.includes("ResizeObserver")) {
456
+ return null;
457
+ }
458
+
459
+ // --- Drop browser extension errors ---
460
+ if (
461
+ event.exception?.values?.[0]?.stacktrace?.frames?.some((frame) =>
462
+ frame.filename?.includes("extension://"),
463
+ )
464
+ ) {
465
+ return null;
466
+ }
467
+
468
+ // --- PII scrubbing ---
469
+ if (event.user?.email) {
470
+ delete event.user.email;
471
+ }
472
+
473
+ // --- Custom fingerprinting based on original exception ---
474
+ if (err instanceof NetworkError) {
475
+ event.fingerprint = ["network-error", err.statusCode?.toString() ?? "unknown"];
476
+ }
477
+
478
+ // --- Add extra context from the original exception ---
479
+ if (err instanceof ApiError) {
480
+ event.extra = {
481
+ ...event.extra,
482
+ requestId: err.requestId,
483
+ endpoint: err.endpoint,
484
+ };
485
+ }
486
+
487
+ return event;
488
+ },
489
+ });
490
+ ```
491
+
492
+ **`hint` object properties:**
493
+
494
+ | Property | Type | Description |
495
+ | -------------------- | ------------------------- | ------------------------------------------------------- |
496
+ | `originalException` | `unknown` | The original exception that triggered the event |
497
+ | `syntheticException` | `Error \| null` | Synthetic Error generated for string/non-Error captures |
498
+ | `event_id` | `string` | The generated event ID |
499
+ | `data` | `Record<string, unknown>` | Arbitrary extra data |
500
+
501
+ ---
502
+
503
+ ### `beforeSendTransaction` — Modify or Drop Transaction Events
504
+
505
+ Same as `beforeSend` but for performance transaction events.
506
+
507
+ ```javascript
508
+ Sentry.init({
509
+ beforeSendTransaction(event) {
510
+ // Drop health check transactions
511
+ if (event.transaction === "/health" || event.transaction === "/ping") {
512
+ return null;
513
+ }
514
+
515
+ // Scrub PII from transaction name
516
+ event.transaction = event.transaction?.replace(/\/users\/\d+/, "/users/:id");
517
+
518
+ return event;
519
+ },
520
+ });
521
+ ```
522
+
523
+ ---
524
+
525
+ ## Event Processors
526
+
527
+ Event processors intercept every event before it’s sent.
528
+ Unlike `beforeSend`, multiple processors can be registered and run in series.
529
+
530
+ ```javascript
531
+ // Global event processor — runs on ALL events
532
+ Sentry.addEventProcessor((event, hint) => {
533
+ // Add build metadata to every event
534
+ event.tags = {
535
+ ...event.tags,
536
+ build_sha: BUILD_SHA,
537
+ deploy_env: DEPLOY_ENV,
538
+ };
539
+
540
+ // Drop events with no stack trace in production
541
+ if (IS_PRODUCTION && !event.exception?.values?.[0]?.stacktrace?.frames?.length) {
542
+ return null;
543
+ }
544
+
545
+ return event;
546
+ });
547
+
548
+ // Scope-level processor — only applies within withScope
549
+ Sentry.withScope((scope) => {
550
+ scope.addEventProcessor((event) => {
551
+ event.tags = { ...event.tags, source: "checkout-flow" };
552
+ return event;
553
+ });
554
+ Sentry.captureException(new Error("Checkout failed"));
555
+ });
556
+ ```
557
+
558
+ **Key differences vs.
559
+ `beforeSend`:**
560
+
561
+ | Feature | `addEventProcessor` | `beforeSend` |
562
+ | ------------------- | ---------------------------- | -------------------------------------- |
563
+ | Execution order | Unspecified among processors | **Always last** (after all processors) |
564
+ | Multiple allowed | ✅ Unlimited | ❌ Only one |
565
+ | Scope-level support | ✅ Yes | ❌ Global init only |
566
+ | Async support | ✅ (slower) | ✅ |
567
+
568
+ ---
569
+
570
+ ## Fingerprinting
571
+
572
+ Every event has a fingerprint array.
573
+ Events with the same fingerprint are grouped into the same issue.
574
+
575
+ ### Extending Default Grouping
576
+
577
+ Use `{{ default }}` to keep Sentry’s default grouping and add extra discriminators:
578
+
579
+ ```javascript
580
+ Sentry.init({
581
+ beforeSend(event, hint) {
582
+ const err = hint.originalException;
583
+
584
+ if (err instanceof ApiError) {
585
+ // Keep default grouping but split further by RPC function + error code
586
+ event.fingerprint = ["{{ default }}", err.functionName, String(err.errorCode)];
587
+ }
588
+
589
+ return event;
590
+ },
591
+ });
592
+ ```
593
+
594
+ ### Overriding Default Grouping
595
+
596
+ Omit `{{ default }}` to completely replace the auto-generated fingerprint (collapses all
597
+ matching errors into one issue):
598
+
599
+ ```javascript
600
+ Sentry.init({
601
+ beforeSend(event, hint) {
602
+ const err = hint.originalException;
603
+
604
+ if (err?.message?.includes("timeout")) {
605
+ event.fingerprint = ["network-timeout"];
606
+ }
607
+
608
+ if (err?.name === "ChunkLoadError") {
609
+ event.fingerprint = ["chunk-load-failure"];
610
+ }
611
+
612
+ return event;
613
+ },
614
+ });
615
+ ```
616
+
617
+ ### Inline Fingerprint on Capture
618
+
619
+ ```javascript
620
+ Sentry.captureException(err, {
621
+ fingerprint: ["payment-gateway", "stripe", err.code],
622
+ });
623
+
624
+ Sentry.captureMessage("Rate limit exceeded", {
625
+ fingerprint: ["rate-limit", endpoint],
626
+ });
627
+
628
+ // Group by HTTP method + path + status code
629
+ Sentry.withScope((scope) => {
630
+ scope.setFingerprint([method, path, String(err.statusCode)]);
631
+ Sentry.captureException(err);
632
+ });
633
+ ```
634
+
635
+ **Fingerprint variables:**
636
+
637
+ | Variable | Resolves to |
638
+ | ------------------- | ------------------------------------- |
639
+ | `{{ default }}` | The auto-generated Sentry fingerprint |
640
+ | `{{ transaction }}` | The transaction name |
641
+ | `{{ function }}` | The function name in the stack trace |
642
+ | `{{ type }}` | The exception type |
643
+ | `{{ module }}` | The module name |
644
+ | `{{ value }}` | The exception value/message |
645
+
646
+ ---
647
+
648
+ ## Event Filtering
649
+
650
+ ### `ignoreErrors` — Pattern-Based Filtering
651
+
652
+ ```javascript
653
+ Sentry.init({
654
+ ignoreErrors: [
655
+ // String (partial match):
656
+ "ResizeObserver loop limit exceeded",
657
+ "fb_xd_fragment",
658
+ "Non-Error exception captured",
659
+
660
+ // Regex (full control):
661
+ /^Network Error$/,
662
+ /ChunkLoadError/,
663
+ /Loading chunk \d+ failed/,
664
+ /^Script error\.?$/,
665
+ ],
666
+ });
667
+ ```
668
+
669
+ ### `allowUrls` / `denyUrls` — Filter by Script Origin
670
+
671
+ These filter based on **stack frame URLs** (where the code lives), not the page URL.
672
+
673
+ ```javascript
674
+ Sentry.init({
675
+ // Only capture errors from your own scripts
676
+ allowUrls: [/https?:\/\/((cdn|www)\.)?myapp\.com/],
677
+
678
+ // Never capture errors from these script origins
679
+ denyUrls: [
680
+ /extensions\//i,
681
+ /^chrome:\/\//i,
682
+ /^moz-extension:\/\//i,
683
+ /^safari-extension:\/\//i,
684
+ /ads\.doubleclick\.net/,
685
+ ],
686
+ });
687
+ ```
688
+
689
+ ### `sampleRate` — Error Volume Reduction
690
+
691
+ ```javascript
692
+ Sentry.init({
693
+ sampleRate: 0.25, // Capture 25% of errors (randomly sampled)
694
+ });
695
+ ```
696
+
697
+ ---
698
+
699
+ ## Default Integrations
700
+
701
+ ### Auto-Enabled Browser Integrations (9 total)
702
+
703
+ | Integration | Purpose | Key Config |
704
+ | ----------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
705
+ | `breadcrumbsIntegration` | Records breadcrumbs from console, DOM, fetch, XHR, history | `console`, `dom`, `fetch`, `history`, `xhr` |
706
+ | `browserApiErrorsIntegration` | Wraps `setTimeout`, `setInterval`, `requestAnimationFrame`, `addEventListener` in try/catch | `setTimeout`, `setInterval`, `requestAnimationFrame`, `eventTarget` |
707
+ | `browserSessionIntegration` | Tracks release health (session per page load / route change) | `lifecycle: "route" \| "page"` |
708
+ | `dedupeIntegration` | Prevents duplicate events from rapid-succession throws | None |
709
+ | `functionToStringIntegration` | Preserves original function names in wrapped stack traces | None |
710
+ | `globalHandlersIntegration` | Attaches `window.onerror` and `window.onunhandledrejection` | `onerror`, `onunhandledrejection` |
711
+ | `httpContextIntegration` | Attaches page URL, User-Agent, Referer to every event | None |
712
+ | `inboundFiltersIntegration` | Client-side filtering via `ignoreErrors`, `denyUrls`, `allowUrls` | Configured via top-level init options |
713
+ | `linkedErrorsIntegration` | Follows `error.cause` chain and attaches linked errors | `key: "cause"`, `limit: 5` |
714
+
715
+ ### Modifying Default Integrations
716
+
717
+ ```javascript
718
+ // Disable a single default integration by name
719
+ Sentry.init({
720
+ integrations: (defaults) => defaults.filter((i) => i.name !== "Breadcrumbs"),
721
+ });
722
+
723
+ // Reconfigure a default integration
724
+ Sentry.init({
725
+ integrations: [
726
+ Sentry.breadcrumbsIntegration({ console: false }),
727
+ Sentry.linkedErrorsIntegration({ limit: 10 }),
728
+ Sentry.globalHandlersIntegration({ onunhandledrejection: false }),
729
+ Sentry.browserSessionIntegration({ lifecycle: "page" }),
730
+ ],
731
+ });
732
+
733
+ // Disable ALL defaults (start from scratch)
734
+ Sentry.init({
735
+ defaultIntegrations: false,
736
+ integrations: [Sentry.globalHandlersIntegration(), Sentry.linkedErrorsIntegration()],
737
+ });
738
+ ```
739
+
740
+ ### Adding Integrations After `init()`
741
+
742
+ ```javascript
743
+ // Lazy-add after init
744
+ Sentry.addIntegration(Sentry.reportingObserverIntegration());
745
+
746
+ // Dynamic import from npm (recommended with bundlers)
747
+ const { captureConsoleIntegration } = await import("@sentry/browser");
748
+ Sentry.addIntegration(captureConsoleIntegration({ levels: ["error", "warn"] }));
749
+ ```
750
+
751
+ ---
752
+
753
+ ## Transport
754
+
755
+ ### Default Transport
756
+
757
+ The browser SDK uses a `fetch`-based transport.
758
+ Events are sent as POST requests to the Sentry ingestion endpoint.
759
+
760
+ ### Offline Transport — IndexedDB Queue
761
+
762
+ Stores events when offline and replays them when the browser reconnects:
763
+
764
+ ```javascript
765
+ import { makeBrowserOfflineTransport, makeFetchTransport } from "@sentry/browser";
766
+ import * as Sentry from "@sentry/browser";
767
+
768
+ Sentry.init({
769
+ dsn: "___PUBLIC_DSN___",
770
+ transport: makeBrowserOfflineTransport(makeFetchTransport),
771
+ });
772
+ ```
773
+
774
+ ### Tunneling — Bypass Ad-Blockers
775
+
776
+ Route all Sentry traffic through your own server endpoint:
777
+
778
+ ```javascript
779
+ Sentry.init({
780
+ dsn: "___PUBLIC_DSN___", // Still required for header generation
781
+ tunnel: "https://myapp.com/sentry-tunnel",
782
+ });
783
+ ```
784
+
785
+ Your server endpoint forwards the payload to Sentry’s ingestion URL. See
786
+ [Dealing with Ad-Blockers](https://docs.sentry.io/platforms/javascript/troubleshooting/#dealing-with-ad-blockers)
787
+ for a full tunneling server implementation.
788
+
789
+ ### Custom Transport
790
+
791
+ ```javascript
792
+ import { createTransport } from "@sentry/core";
793
+ import * as Sentry from "@sentry/browser";
794
+
795
+ function makeCustomFetchTransport(options) {
796
+ function makeRequest(request) {
797
+ return fetch(options.url, {
798
+ body: request.body,
799
+ method: "POST",
800
+ referrerPolicy: "origin",
801
+ headers: {
802
+ ...options.headers,
803
+ "X-Custom-Header": "my-value",
804
+ },
805
+ }).then((response) => ({
806
+ statusCode: response.status,
807
+ headers: {
808
+ "x-sentry-rate-limits": response.headers.get("X-Sentry-Rate-Limits"),
809
+ "retry-after": response.headers.get("Retry-After"),
810
+ },
811
+ }));
812
+ }
813
+
814
+ return createTransport(options, makeRequest);
815
+ }
816
+
817
+ Sentry.init({
818
+ dsn: "___PUBLIC_DSN___",
819
+ transport: makeCustomFetchTransport,
820
+ });
821
+ ```
822
+
823
+ ---
824
+
825
+ ## Best Practices
826
+
827
+ - **Set user context after authentication** — call `Sentry.setUser()` after login
828
+ completes, not in `Sentry.init`.
829
+ - **Clear user on logout** — always call `Sentry.setUser(null)` when the user signs out.
830
+ - **Use `withScope` for per-event context** — avoid mutating the isolation scope for
831
+ temporary data.
832
+ - **Use tags for filterable data, context for debugging data** — tags are indexed;
833
+ context is not.
834
+ - **Filter noise early** — use `ignoreErrors` and `denyUrls` to drop known-bad events
835
+ before `beforeSend`.
836
+ - **Avoid capturing in render paths** — wrap Sentry calls in event handlers or
837
+ `try/catch` blocks.
838
+ - **Set `release` and `environment`** — required for source map resolution and
839
+ environment-aware alerting.
840
+ - **Use `beforeSend` for PII scrubbing** — never send emails, credit card numbers, or
841
+ passwords as tags/extra.
842
+ - **Use `{{ default }}` in fingerprints** to extend, not replace, Sentry’s grouping when
843
+ appropriate.
844
+
845
+ ---
846
+
847
+ ## Troubleshooting
848
+
849
+ | Issue | Solution |
850
+ | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
851
+ | Errors from browser extensions captured | Add `/extensions\//i`, `/^chrome:\/\//i`, `/^safari-extension:\/\//i` to `denyUrls` |
852
+ | `ResizeObserver loop` flooding issues | Add `"ResizeObserver loop limit exceeded"` to `ignoreErrors` |
853
+ | Script errors with no details | Cross-origin scripts without CORS headers appear as `"Script error."` — add CORS headers or use `allowUrls` |
854
+ | Events sent twice | If using multiple `Sentry.init()` calls, only the first takes effect. Check for duplicate SDK instances. |
855
+ | `beforeSend` returning `null` but events still sent | Check `beforeSendTransaction` — it’s a separate hook for performance events |
856
+ | User context missing on events | Call `Sentry.setUser()` after authentication completes; verify it’s not being called before auth |
857
+ | `configureScope is not a function` | Deprecated in SDK v8. Replace with `getIsolationScope()` or `withScope()` |
858
+ | Tags not appearing on events | Verify the tag isn’t being overwritten by a built-in Sentry tag (`browser`, `os`, `url`, `environment`, `release`) |
859
+ | High event volume from known errors | Add patterns to `ignoreErrors` or use `sampleRate` to reduce volume |
860
+ | Unhandled rejections not captured | Verify `globalHandlersIntegration({ onunhandledrejection: true })` is active (it is by default) |
861
+ | `linkedErrorsIntegration` not showing cause chain | Requires `Error.cause` support — Chrome 93+, Firefox 91+. Ensure the SDK version is ≥7.0.0. |