@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,626 @@
1
+ # Error Monitoring — Sentry PHP SDK
2
+
3
+ > Minimum SDK: `sentry/sentry` ^4.0 · `sentry/sentry-laravel` ^4.0 ·
4
+ > `sentry/sentry-symfony` ^5.0
5
+
6
+ ## Configuration
7
+
8
+ Key `\Sentry\init()` options for error monitoring:
9
+
10
+ | Option | Type | Default | Purpose |
11
+ | ------------------------- | ----------- | ------------------- | ----------------------------------------------------------- |
12
+ | `dsn` | `string` | env `SENTRY_DSN` | Data Source Name; SDK disabled if empty |
13
+ | `environment` | `string` | `"production"` | Deployment environment tag |
14
+ | `release` | `string` | `null` | App version string |
15
+ | `sample_rate` | `float` | `1.0` | Fraction of error events to send (0.0–1.0) |
16
+ | `send_default_pii` | `bool` | `false` | Include IPs, cookies, request body |
17
+ | `attach_stacktrace` | `bool` | `false` | Add stack traces to `captureMessage()` |
18
+ | `max_breadcrumbs` | `int` | `100` | Max breadcrumbs per event |
19
+ | `context_lines` | `int` | `5` | Source code lines around each stack frame |
20
+ | `ignore_exceptions` | `array` | `[]` | Exception classes (matched by `instanceof`) to never report |
21
+ | `error_types` | `int\|null` | `error_reporting()` | PHP error bitmask — errors to capture |
22
+ | `capture_silenced_errors` | `bool` | `false` | Capture errors suppressed with `@` operator |
23
+ | `before_send` | `callable` | no-op | Mutate or drop error events before sending |
24
+ | `before_breadcrumb` | `callable` | no-op | Mutate or drop breadcrumbs |
25
+ | `in_app_include` | `array` | `[]` | Paths to mark as in-app in stack traces |
26
+ | `in_app_exclude` | `array` | `[]` | Paths to exclude from in-app (e.g., vendor) |
27
+ | `max_request_body_size` | `string` | `"medium"` | `"none"` / `"small"` / `"medium"` / `"always"` |
28
+ | `default_integrations` | `bool` | `true` | Auto-install PHP error/exception/fatal handlers |
29
+
30
+ ## Code Examples
31
+
32
+ ### Basic setup
33
+
34
+ ```php
35
+ // Plain PHP
36
+ \Sentry\init([
37
+ 'dsn' => 'https://<key>@<org>.ingest.sentry.io/<project>',
38
+ 'environment' => 'production',
39
+ 'release' => 'my-app@1.2.3',
40
+ 'sample_rate' => 1.0,
41
+ 'send_default_pii' => false,
42
+ 'max_breadcrumbs' => 100,
43
+ 'in_app_exclude' => ['/var/www/html/vendor'],
44
+ ]);
45
+ ```
46
+
47
+ ```php
48
+ // Laravel — config/sentry.php (published by php artisan vendor:publish)
49
+ return [
50
+ 'dsn' => env('SENTRY_LARAVEL_DSN', env('SENTRY_DSN')),
51
+ 'release' => env('SENTRY_RELEASE'),
52
+ 'environment' => env('SENTRY_ENVIRONMENT'), // defaults to APP_ENV
53
+ 'sample_rate' => (float) env('SENTRY_SAMPLE_RATE', 1.0),
54
+ 'send_default_pii' => env('SENTRY_SEND_DEFAULT_PII', false),
55
+ 'ignore_exceptions' => [],
56
+ ];
57
+ ```
58
+
59
+ ```yaml
60
+ # Symfony — config/packages/sentry.yaml
61
+ sentry:
62
+ dsn: "%env(SENTRY_DSN)%"
63
+ register_error_listener: true # auto-captures on kernel.exception
64
+ register_error_handler: true # registers PHP error/exception handlers
65
+ options:
66
+ environment: "%kernel.environment%"
67
+ release: "%env(default::SENTRY_RELEASE)%"
68
+ sample_rate: 1.0
69
+ send_default_pii: false
70
+ max_breadcrumbs: 100
71
+ in_app_exclude:
72
+ - "%kernel.cache_dir%"
73
+ - "%kernel.project_dir%/vendor"
74
+ ignore_exceptions:
75
+ - Symfony\Component\HttpKernel\Exception\NotFoundHttpException
76
+ ```
77
+
78
+ ### Capture APIs
79
+
80
+ #### `captureException()`
81
+
82
+ ```php
83
+ // Signature: function captureException(\Throwable $exception, ?EventHint $hint = null): ?EventId
84
+
85
+ // Basic
86
+ try {
87
+ riskyOperation();
88
+ } catch (\Throwable $e) {
89
+ \Sentry\captureException($e);
90
+ }
91
+
92
+ // With extra data attached via hint
93
+ \Sentry\captureException($e, \Sentry\EventHint::fromArray([
94
+ 'extra' => ['sql' => $query, 'bindings' => $bindings],
95
+ ]));
96
+
97
+ // Mark as unhandled (higher priority / inbox in Sentry UI)
98
+ \Sentry\captureException($e, \Sentry\EventHint::fromArray([
99
+ 'mechanism' => new \Sentry\ExceptionMechanism(
100
+ \Sentry\ExceptionMechanism::TYPE_GENERIC,
101
+ false // $handled = false
102
+ ),
103
+ ]));
104
+ ```
105
+
106
+ #### `captureMessage()`
107
+
108
+ ```php
109
+ // Signature: function captureMessage(string $message, ?Severity $level = null, ?EventHint $hint = null): ?EventId
110
+
111
+ \Sentry\captureMessage('Payment gateway timeout');
112
+ \Sentry\captureMessage('Low disk space', \Sentry\Severity::warning());
113
+ \Sentry\captureMessage('Critical failure', \Sentry\Severity::fatal());
114
+
115
+ // All Severity factory methods:
116
+ // Severity::debug() Severity::info() Severity::warning()
117
+ // Severity::error() Severity::fatal()
118
+ ```
119
+
120
+ #### `captureEvent()`
121
+
122
+ ```php
123
+ // Signature: function captureEvent(Event $event, ?EventHint $hint = null): ?EventId
124
+
125
+ $event = \Sentry\Event::createEvent();
126
+ $event->setMessage('Custom billing event');
127
+ $event->setLevel(\Sentry\Severity::info());
128
+ $event->setTags(['component' => 'payment', 'provider' => 'stripe']);
129
+ $event->setExtra(['order_id' => 42, 'retries' => 3]);
130
+ $event->setFingerprint(['{{ default }}', 'payment-module']);
131
+ $event->setTransaction('checkout.payment');
132
+
133
+ \Sentry\captureEvent($event);
134
+ ```
135
+
136
+ #### `captureLastError()`
137
+
138
+ ```php
139
+ // Signature: function captureLastError(?EventHint $hint = null): ?EventId
140
+ // Reads the most recent error from error_get_last()
141
+
142
+ register_shutdown_function(function (): void {
143
+ \Sentry\captureLastError();
144
+ \Sentry\flush(); // required in CLI/shutdown contexts
145
+ });
146
+
147
+ // Note: installed automatically by FatalErrorListenerIntegration
148
+ // when default_integrations => true (the default).
149
+ ```
150
+
151
+ ### Automatic capture by framework
152
+
153
+ ```php
154
+ // Plain PHP — default integrations auto-install PHP error handlers
155
+ \Sentry\init(['dsn' => '...']);
156
+ // ErrorListenerIntegration → set_error_handler()
157
+ // ExceptionListenerIntegration → set_exception_handler()
158
+ // FatalErrorListenerIntegration → register_shutdown_function()
159
+
160
+ // Laravel 11+ (bootstrap/app.php)
161
+ use Sentry\Laravel\Integration;
162
+
163
+ return Application::configure(basePath: dirname(__DIR__))
164
+ ->withExceptions(function ($exceptions) {
165
+ Integration::handles($exceptions);
166
+ })
167
+ ->create();
168
+
169
+ // Laravel 10 and below (app/Exceptions/Handler.php)
170
+ public function register(): void
171
+ {
172
+ $this->reportable(function (\Throwable $e) {
173
+ \Sentry\Laravel\Integration::captureUnhandledException($e);
174
+ });
175
+ }
176
+
177
+ // Symfony — register_error_listener: true in sentry.yaml (default)
178
+ // ErrorListener subscribes to kernel.exception and captures automatically
179
+ ```
180
+
181
+ ### Scope management
182
+
183
+ Three scope types control where data persists:
184
+
185
+ | Scope API | Lifetime | Use for |
186
+ | -------------------------- | ------------------------ | --------------------------------------- |
187
+ | `configureScope()` | Current scope (persists) | Per-request user identity, session tags |
188
+ | `withScope()` | Isolated child scope | Data for a single capture call |
189
+ | `pushScope()`/`popScope()` | Manually isolated scope | Long-running processes (Octane, queues) |
190
+
191
+ ```php
192
+ // Persistent — modifies current scope, data appears on all subsequent events
193
+ \Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
194
+ $scope->setTag('tenant', 'acme-corp');
195
+ $scope->setUser(['id' => 42, 'email' => 'user@example.com']);
196
+ });
197
+
198
+ // Isolated — child scope discarded after callback; changes don't leak
199
+ \Sentry\withScope(function (\Sentry\State\Scope $scope): void {
200
+ $scope->setTag('payment_flow', 'checkout');
201
+ $scope->setExtra('cart_id', 'cart-123');
202
+ \Sentry\captureException(new \RuntimeException('Payment failed'));
203
+ });
204
+ // ← tag and extra are gone after this line
205
+
206
+ // Long-running process isolation (prevents cross-request contamination)
207
+ $hub = \Sentry\SentrySdk::getCurrentHub();
208
+ $hub->pushScope();
209
+ try {
210
+ \Sentry\configureScope(function (\Sentry\State\Scope $scope) use ($job): void {
211
+ $scope->setTag('job.class', get_class($job));
212
+ });
213
+ $job->handle();
214
+ } finally {
215
+ $hub->popScope();
216
+ }
217
+
218
+ // Manual push/pop (lower level)
219
+ $hub = \Sentry\SentrySdk::getCurrentHub();
220
+ $hub->pushScope();
221
+ try {
222
+ // ... isolated work ...
223
+ } finally {
224
+ $hub->popScope();
225
+ }
226
+ ```
227
+
228
+ ### Context enrichment
229
+
230
+ #### Tags
231
+
232
+ Tags are **indexed** — searchable and filterable in the Sentry UI. Max key 32 chars,
233
+ value 200 chars.
234
+
235
+ ```php
236
+ \Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
237
+ $scope->setTag('environment', 'production');
238
+ $scope->setTags(['payment_provider' => 'stripe', 'checkout_version' => 'v3']);
239
+ $scope->removeTag('debug_mode');
240
+ });
241
+
242
+ // Per-event only
243
+ \Sentry\withScope(function (\Sentry\State\Scope $scope): void {
244
+ $scope->setTag('retry_attempt', '2');
245
+ \Sentry\captureException(new \RuntimeException('Still failing'));
246
+ });
247
+ ```
248
+
249
+ #### User context — `UserDataBag`
250
+
251
+ ```php
252
+ // Via array (Scope::setUser accepts array OR UserDataBag)
253
+ \Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
254
+ $scope->setUser([
255
+ 'id' => 42,
256
+ 'email' => 'jane@example.com',
257
+ 'username' => 'jane_doe',
258
+ 'ip_address' => '192.168.1.1',
259
+ 'plan' => 'enterprise', // extra keys become metadata
260
+ ]);
261
+ });
262
+
263
+ // Via UserDataBag fluent API
264
+ \Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
265
+ $user = \Sentry\UserDataBag::createFromUserIdentifier(42);
266
+ $user->setEmail('jane@example.com');
267
+ $user->setMetadata('plan', 'enterprise');
268
+ $scope->setUser($user);
269
+ });
270
+
271
+ // Clear user (e.g., on logout)
272
+ \Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
273
+ $scope->removeUser();
274
+ });
275
+ ```
276
+
277
+ #### Breadcrumbs — `Breadcrumb` constants
278
+
279
+ ```php
280
+ // Type constants (Breadcrumb::TYPE_*)
281
+ Breadcrumb::TYPE_DEFAULT // 'default' — generic log entry
282
+ Breadcrumb::TYPE_HTTP // 'http' — outgoing HTTP request
283
+ Breadcrumb::TYPE_USER // 'user' — user interaction
284
+ Breadcrumb::TYPE_NAVIGATION // 'navigation' — URL/route change
285
+ Breadcrumb::TYPE_ERROR // 'error' — captured error
286
+
287
+ // Level constants (Breadcrumb::LEVEL_*)
288
+ Breadcrumb::LEVEL_DEBUG
289
+ Breadcrumb::LEVEL_INFO
290
+ Breadcrumb::LEVEL_WARNING
291
+ Breadcrumb::LEVEL_ERROR
292
+ Breadcrumb::LEVEL_FATAL
293
+
294
+ // Shorthand via global function (PHP 8 named args)
295
+ \Sentry\addBreadcrumb(
296
+ category: 'auth',
297
+ message: 'User authenticated',
298
+ metadata: ['user_id' => 42, 'method' => 'oauth'],
299
+ level: \Sentry\Breadcrumb::LEVEL_INFO,
300
+ type: \Sentry\Breadcrumb::TYPE_DEFAULT,
301
+ );
302
+
303
+ // Explicit Breadcrumb object
304
+ \Sentry\addBreadcrumb(new \Sentry\Breadcrumb(
305
+ \Sentry\Breadcrumb::LEVEL_INFO,
306
+ \Sentry\Breadcrumb::TYPE_HTTP,
307
+ 'http.client',
308
+ 'POST https://api.stripe.com/v1/charges',
309
+ ['status_code' => 200, 'duration_ms' => 243]
310
+ ));
311
+
312
+ // Navigation crumb
313
+ \Sentry\addBreadcrumb(new \Sentry\Breadcrumb(
314
+ \Sentry\Breadcrumb::LEVEL_INFO,
315
+ \Sentry\Breadcrumb::TYPE_NAVIGATION,
316
+ 'navigation',
317
+ null,
318
+ ['from' => '/home', 'to' => '/checkout']
319
+ ));
320
+
321
+ // Breadcrumb is immutable — modify via with*() methods (return clones)
322
+ $crumb = new \Sentry\Breadcrumb(
323
+ \Sentry\Breadcrumb::LEVEL_INFO,
324
+ \Sentry\Breadcrumb::TYPE_DEFAULT,
325
+ 'cache', 'Cache miss', ['key' => 'user:42:profile']
326
+ );
327
+ $crumb = $crumb->withLevel(\Sentry\Breadcrumb::LEVEL_WARNING)
328
+ ->withMetadata('ttl', 300);
329
+ \Sentry\addBreadcrumb($crumb);
330
+ ```
331
+
332
+ #### Structured named context
333
+
334
+ Named context blocks appear as collapsible panels in the Sentry event UI.
335
+
336
+ ```php
337
+ \Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
338
+ $scope->setContext('payment', [
339
+ 'provider' => 'stripe',
340
+ 'amount' => 9900,
341
+ 'currency' => 'USD',
342
+ ]);
343
+ });
344
+
345
+ // Per-event
346
+ \Sentry\withScope(function (\Sentry\State\Scope $scope) use ($exception): void {
347
+ $scope->setContext('order', [
348
+ 'id' => 'ord-999',
349
+ 'items' => 3,
350
+ 'total' => 59.99,
351
+ 'status' => 'pending',
352
+ ]);
353
+ \Sentry\captureException($exception);
354
+ });
355
+
356
+ // Reserved names with special UI rendering: os, runtime, app, browser, device, gpu, culture, trace
357
+ ```
358
+
359
+ ### `before_send` hook — filtering and scrubbing
360
+
361
+ ```php
362
+ // Callback signature:
363
+ // callable(\Sentry\Event $event, ?\Sentry\EventHint $hint): ?\Sentry\Event
364
+ // Return null to DROP the event; return (modified) event to send.
365
+
366
+ \Sentry\init([
367
+ 'before_send' => function (\Sentry\Event $event, ?\Sentry\EventHint $hint): ?\Sentry\Event {
368
+ // Drop health-check routes
369
+ $request = $event->getRequest();
370
+ if ($request?->getUrl() && str_contains($request->getUrl(), '/healthz')) {
371
+ return null;
372
+ }
373
+
374
+ // Scrub sensitive extra data
375
+ $extra = $event->getExtra();
376
+ unset($extra['password'], $extra['credit_card']);
377
+ $event->setExtra($extra);
378
+
379
+ // Add tag based on exception type
380
+ if ($hint?->exception instanceof \PDOException) {
381
+ $event->setTag('db_error', 'true');
382
+ }
383
+
384
+ // Custom fingerprint based on message
385
+ if ($hint?->exception && str_contains($hint->exception->getMessage(), 'timeout')) {
386
+ $event->setFingerprint(['timeout', get_class($hint->exception)]);
387
+ }
388
+
389
+ return $event;
390
+ },
391
+ ]);
392
+ ```
393
+
394
+ ### `before_breadcrumb` hook
395
+
396
+ ```php
397
+ // Callback signature:
398
+ // callable(\Sentry\Breadcrumb $breadcrumb): ?\Sentry\Breadcrumb
399
+ // Return null to DROP; return (modified) Breadcrumb to keep.
400
+
401
+ \Sentry\init([
402
+ 'before_breadcrumb' => function (\Sentry\Breadcrumb $breadcrumb): ?\Sentry\Breadcrumb {
403
+ // Drop SQL queries containing sensitive data
404
+ if ($breadcrumb->getCategory() === 'db.sql.query') {
405
+ if (str_contains(strtolower($breadcrumb->getMessage() ?? ''), 'password')) {
406
+ return null;
407
+ }
408
+ }
409
+
410
+ // Redact API keys from URLs
411
+ $metadata = $breadcrumb->getMetadata();
412
+ if (isset($metadata['url']) && str_contains($metadata['url'], 'api_key=')) {
413
+ return $breadcrumb->withMetadata(
414
+ 'url',
415
+ preg_replace('/api_key=[^&]+/', 'api_key=[Filtered]', $metadata['url'])
416
+ );
417
+ }
418
+
419
+ return $breadcrumb;
420
+ },
421
+ ]);
422
+ ```
423
+
424
+ ### Additional hook variants
425
+
426
+ ```php
427
+ // Filter performance transactions (not error events)
428
+ 'before_send_transaction' => function (\Sentry\Event $tx, ?\Sentry\EventHint $hint): ?\Sentry\Event {
429
+ if (in_array($tx->getTransaction(), ['GET /up', 'GET /ping', 'GET /healthz'])) {
430
+ return null;
431
+ }
432
+ return $tx;
433
+ },
434
+
435
+ // Filter cron monitor check-ins
436
+ 'before_send_check_in' => function (\Sentry\Event $checkIn, ?\Sentry\EventHint $hint): ?\Sentry\Event {
437
+ return $checkIn; // or null to drop
438
+ },
439
+
440
+ // NOTE: Symfony uses service IDs instead of closures:
441
+ // options: { before_send: 'App\Sentry\BeforeSendHandler' }
442
+ ```
443
+
444
+ ### Error context — `EventHint` and `ExceptionMechanism`
445
+
446
+ ```php
447
+ // EventHint public properties:
448
+ // $exception — original \Throwable
449
+ // $mechanism — ExceptionMechanism (how it was caught)
450
+ // $stacktrace — custom Stacktrace override
451
+ // $extra — array<string, mixed> passed to before_send but not in event body
452
+
453
+ // Handled vs unhandled — affects priority and inbox routing in Sentry
454
+ use Sentry\ExceptionMechanism;
455
+
456
+ $hint = \Sentry\EventHint::fromArray([
457
+ 'exception' => $exception,
458
+ 'mechanism' => new ExceptionMechanism(ExceptionMechanism::TYPE_GENERIC, false), // unhandled
459
+ ]);
460
+ \Sentry\captureException($exception, $hint);
461
+
462
+ // Exception chaining — SDK auto-walks $e->getPrevious()
463
+ // All chained exceptions appear as exception.values[] in the event
464
+ try {
465
+ try {
466
+ $pdo->query($sql); // throws PDOException
467
+ } catch (\PDOException $dbEx) {
468
+ throw new \DomainException('Payment failed', 0, $dbEx);
469
+ }
470
+ } catch (\DomainException $e) {
471
+ \Sentry\captureException($e);
472
+ // Sentry event: exception.values[0] = DomainException
473
+ // exception.values[1] = PDOException ($previous)
474
+ }
475
+
476
+ // Pass data through hint to before_send without including it in the event body
477
+ $hint = \Sentry\EventHint::fromArray([
478
+ 'extra' => ['query' => $sql, 'duration_ms' => $ms],
479
+ ]);
480
+ \Sentry\captureException($exception, $hint);
481
+
482
+ // Access in before_send
483
+ 'before_send' => function (\Sentry\Event $event, ?\Sentry\EventHint $hint): ?\Sentry\Event {
484
+ if ($hint !== null && ($hint->extra['duration_ms'] ?? 0) > 5000) {
485
+ $event->setTag('slow_query', 'true');
486
+ }
487
+ return $event;
488
+ },
489
+ ```
490
+
491
+ ### Fingerprinting (custom grouping)
492
+
493
+ Default fingerprint: `['{{ default }}']` — stack trace hash + exception type + message.
494
+
495
+ ```php
496
+ // Via scope — persistent
497
+ \Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
498
+ $scope->setFingerprint(['payment-timeout', 'stripe-api']);
499
+ });
500
+
501
+ // Via withScope — per-event, combined with default
502
+ \Sentry\withScope(function (\Sentry\State\Scope $scope) use ($exception, $provider): void {
503
+ $scope->setFingerprint(['{{ default }}', 'payment', $provider]);
504
+ \Sentry\captureException($exception);
505
+ });
506
+
507
+ // Via before_send — dynamic
508
+ \Sentry\init([
509
+ 'before_send' => function (\Sentry\Event $event, ?\Sentry\EventHint $hint): ?\Sentry\Event {
510
+ if ($hint?->exception instanceof \PDOException) {
511
+ $msg = $hint->exception->getMessage();
512
+ if (str_contains($msg, 'timed out')) {
513
+ $event->setFingerprint(['db-timeout', 'pdo']);
514
+ }
515
+ }
516
+ return $event;
517
+ },
518
+ ]);
519
+
520
+ // Via captureEvent — inline
521
+ $event = \Sentry\Event::createEvent();
522
+ $event->setFingerprint(['my-custom-group', '{{ default }}']);
523
+ $event->setMessage('Grouped event');
524
+ \Sentry\captureEvent($event);
525
+
526
+ // Scope fingerprints are APPENDED to any existing event fingerprints:
527
+ // array_merge($event->getFingerprint(), $scope->getFingerprint())
528
+ ```
529
+
530
+ ## Framework-Specific Notes
531
+
532
+ ### Plain PHP
533
+
534
+ - `default_integrations: true` (default) auto-installs `set_error_handler()`,
535
+ `set_exception_handler()`, and `register_shutdown_function()` — no manual handlers
536
+ needed
537
+ - Always call `\Sentry\flush()` before process exit in CLI scripts
538
+ - In long-running workers (e.g., RoadRunner, Swoole), use `pushScope()`/`popScope()` per
539
+ request to prevent cross-request scope contamination
540
+
541
+ ### Laravel
542
+
543
+ - **Laravel 11+**: use `Integration::handles($exceptions)` in `bootstrap/app.php`
544
+ - **Laravel 10 and below**: use `Integration::captureUnhandledException($e)` in
545
+ `Handler::register()`
546
+ - `Integration::captureUnhandledException()` inspects the call stack to guess whether
547
+ the exception was truly unhandled and sets the `ExceptionMechanism::$handled` flag
548
+ accordingly
549
+ - Laravel auto-sets user context from `Auth::user()` on the `Authenticated` event (reads
550
+ `id`, `email`, `username`)
551
+ - **Octane**: scope is automatically isolated per request via `pushScope()`/`popScope()`
552
+ in the Octane event handlers — no manual action needed
553
+ - `SENTRY_SEND_DEFAULT_PII=true` is required to capture user email and IP
554
+ - Log levels map to breadcrumb levels: `critical`/`alert`/`emergency` → `LEVEL_FATAL`,
555
+ `warning` → `LEVEL_WARNING`, `error` → `LEVEL_ERROR`, `info`/`notice` → `LEVEL_INFO`,
556
+ `debug` → `LEVEL_DEBUG`
557
+
558
+ ### Symfony
559
+
560
+ - Errors are captured by `ErrorListener` on the `kernel.exception` event — controlled by
561
+ `register_error_listener: true` (default)
562
+ - User context requires `send_default_pii: true`; populated by `LoginListener` on
563
+ `LoginSuccessEvent` / `AuthenticationSuccessEvent`
564
+ - Inject `HubInterface` via DI rather than using global `\Sentry\*` functions in
565
+ services
566
+ - `before_send` in Symfony must be a **service ID**, not a closure — closures cannot be
567
+ serialized and break config caching:
568
+
569
+ ```php
570
+ // src/Sentry/BeforeSendHandler.php
571
+ namespace App\Sentry;
572
+
573
+ use Sentry\Event;
574
+ use Sentry\EventHint;
575
+
576
+ class BeforeSendHandler
577
+ {
578
+ public function __invoke(Event $event, ?EventHint $hint): ?Event
579
+ {
580
+ // ... filter / scrub ...
581
+ return $event;
582
+ }
583
+ }
584
+ ```
585
+
586
+ ```yaml
587
+ # config/packages/sentry.yaml
588
+ sentry:
589
+ options:
590
+ before_send: 'App\Sentry\BeforeSendHandler'
591
+ ```
592
+
593
+ - `MessengerListener` captures exceptions from failed Messenger messages — inject it if
594
+ using the Messenger component
595
+
596
+ ## Best Practices
597
+
598
+ - Set `send_default_pii: false` (default) — add explicit scrubbing in `before_send` for
599
+ any sensitive fields
600
+ - Use `configureScope()` for per-request data (user identity) and `withScope()` for
601
+ per-capture isolation
602
+ - Prefer `setContext()` for structured detail data; use `setTag()` only for fields you
603
+ want to filter/search on
604
+ - Use `ignore_exceptions: [...]` for exceptions that should never be reported (e.g.,
605
+ `NotFoundHttpException`)
606
+ - In PHP-FPM (one process per request), global scope is safe.
607
+ In long-running servers (Octane, RoadRunner), always isolate scope per request/task
608
+ - `ignore_exceptions` runs **before** `before_send` — matching classes are silently
609
+ dropped and `before_send` is never called
610
+ - `EventHint` received in `before_send` is the same object passed to
611
+ `captureException()` — use it to access the original `Throwable` and any `extra`
612
+ context
613
+
614
+ ## Troubleshooting
615
+
616
+ | Issue | Solution |
617
+ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
618
+ | Events not appearing in Sentry | Verify DSN, call `\Sentry\init()` before all other code, try `'debug' => true` to log to `error_log()` |
619
+ | User/tag data missing from events | Set scope data **before** the exception occurs; in Laravel, check `SENTRY_SEND_DEFAULT_PII` |
620
+ | PII appearing in events | Ensure `send_default_pii: false` (default), add `before_send` scrubber for headers/cookies |
621
+ | `captureException()` sends no event | Check `ignore_exceptions` — class may match by `instanceof`; verify `before_send` isn’t returning `null` |
622
+ | Duplicate events in Laravel | `Integration::handles()` (L11) already calls `captureUnhandledException()` — don’t also add a manual `reportable()` |
623
+ | Cross-request scope contamination in Octane | Enable Octane breadcrumb events (already in default config); use `pushScope()`/`popScope()` in queue workers |
624
+ | `before_send` option ignored in Symfony | Must be a service ID string, not a closure — closures can’t be serialized for config caching |
625
+ | Breadcrumbs missing | Check `max_breadcrumbs` setting and `before_breadcrumb` hook; in Laravel verify `breadcrumbs.*` config flags |
626
+ | Fatal errors not captured | Ensure `default_integrations: true` (default) or manually call `register_shutdown_function()` with `captureLastError()` + `flush()` |