[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C6KPMZ0E3K8CVRMEPCQY4Z":3,"skill-same:01M6C6KPMZ0E3K8CVRMEPCQY4Z":84},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":48,"linkOnly":49,"markdownContent":50,"markdownBody":51,"frontMatter":52,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":6,"ownerHtmlUrl":61,"ownerBlogUrl":6,"ownerDescription":62,"updatedAt":63,"install":64,"resources":77},"01M6C6KPMZ0E3K8CVRMEPCQY4Z","typescript-sentry",null,"Error monitoring and performance with Sentry SDK for Bun\u002FNode.js\u002FNext.js — error capture, breadcrumbs, spans, cron monitoring, source maps, structured logging, profiling. Use when adding Sentry, instrumenting cron, or uploading sourcemaps.","laurigates\u002Fclaude-plugins","laurigates","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13014001?v=4","01M6C59YHWS9C7KMXKSRX1YXNP","Lauri Gates","01M6C59YP2APG9YAM4DWYQYGFJ",60,"MIT","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftypescript-plugin\u002Fskills\u002Ftypescript-sentry\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"sentry","typescript sentry","typescript","write","2026","when","source","structured logging","error monitoring","error","false","next","maps","sourcemaps","bun","use","edit","read","capture","node","grep","profiling","js","Bash","Next.js","cron","monitoring","performance","sdk","2026-11-10 10:12:30",false,"---\nname: typescript-sentry\ndescription: Error monitoring and performance with Sentry SDK for Bun\u002FNode.js\u002FNext.js — error capture, breadcrumbs, spans, cron monitoring, source maps, structured logging, profiling. Use when adding Sentry, instrumenting cron, or uploading sourcemaps.\nuser-invocable: false\nallowed-tools: Bash, Read, Write, Edit, Grep, Glob, TodoWrite\ncreated: 2026-01-22\nmodified: 2026-09-28\nreviewed: 2026-01-22\n---\n\n# TypeScript Sentry\n\nThis skill covers the **SDK-side** work: capture, spans, cron monitors, source maps, profiling, filtering. For project-level Sentry compliance (DSN hygiene, sourcemap-upload wiring in CI) use `\u002Fconfigure:sentry`; for local step-through debugging use `typescript-debugging`.\n\n## Core Expertise\n\nSentry provides error monitoring and performance tracking:\n- Automatic error capture with stack traces\n- Performance monitoring with distributed tracing\n- Cron job monitoring for scheduled tasks\n- Source map integration for readable TypeScript traces\n- Rich context with tags, breadcrumbs, and user data\n- Structured logging forwarded to Sentry (`enableLogs`)\n- CPU\u002FJS profiling (Node.js + browser)\n- Session replay with privacy controls\n- User feedback widget\n- Enrichment helpers (custom contexts, breadcrumb categories, fingerprinting)\n\n## Installation\n\n### Bun\n\n```bash\nbun add @sentry\u002Fbun\n```\n\n### Node.js\n\n```bash\nbun add @sentry\u002Fnode\n```\n\n### Next.js\n\n```bash\nbun add @sentry\u002Fnextjs @sentry\u002Fprofiling-node\n```\n\n### React\u002FBrowser\n\n```bash\nbun add @sentry\u002Freact\n# or\nbun add @sentry\u002Fbrowser\n```\n\n## Error Capturing\n\n### captureException\n\n```typescript\ntry {\n  await riskyOperation();\n} catch (error) {\n  Sentry.captureException(error);\n  throw error; \u002F\u002F Re-throw if needed\n}\n```\n\n### With Context\n\n```typescript\nSentry.captureException(error, {\n  tags: {\n    feature: \"checkout\",\n    paymentProvider: \"stripe\",\n  },\n  extra: {\n    orderId: order.id,\n    userId: user.id,\n    cartItems: cart.items.length,\n  },\n  level: \"error\", \u002F\u002F fatal, error, warning, info, debug\n});\n```\n\n### captureMessage\n\n```typescript\n\u002F\u002F Simple message\nSentry.captureMessage(\"User completed onboarding\");\n\n\u002F\u002F With level\nSentry.captureMessage(\"Rate limit approaching\", \"warning\");\n\n\u002F\u002F With context\nSentry.captureMessage(\"Payment failed\", {\n  level: \"error\",\n  tags: { gateway: \"stripe\" },\n  extra: { errorCode: \"card_declined\" },\n});\n```\n\n## Agentic Optimizations\n\n| Context | Command |\n|---------|---------|\n| Install Bun | `bun add @sentry\u002Fbun` |\n| Install Node | `bun add @sentry\u002Fnode` |\n| Install Next.js | `bun add @sentry\u002Fnextjs @sentry\u002Fprofiling-node` |\n| Install React | `bun add @sentry\u002Freact` |\n| Install CLI | `bun add -D @sentry\u002Fcli` |\n| Upload maps | `npx sentry-cli sourcemaps inject .\u002Fdist && npx sentry-cli sourcemaps upload .\u002Fdist` |\n| Setup wizard | `npx @sentry\u002Fwizard@latest -i sourcemaps` |\n| Test capture | `Sentry.captureMessage(\"Test from dev\")` |\n\n## Quick Reference\n\n### Capture Methods\n\n| Method | Purpose |\n|--------|---------|\n| `captureException(error)` | Capture error with stack trace |\n| `captureMessage(msg)` | Capture text message |\n| `captureCheckIn(opts)` | Cron job check-in |\n| `addBreadcrumb(crumb)` | Add navigation\u002Faction trail |\n\n### Context Methods\n\n| Method | Purpose |\n|--------|---------|\n| `setTag(key, value)` | Add filterable tag |\n| `setExtra(key, value)` | Add debug data |\n| `setUser(user)` | Set user context |\n| `withScope(callback)` | Scoped context |\n\n### Performance Methods\n\n| Method | Purpose |\n|--------|---------|\n| `startSpan(opts, callback)` | Create performance span |\n| `withMonitor(slug, callback)` | Monitor cron job |\n\n### Severity Levels\n\n| Level | Use Case |\n|-------|----------|\n| `fatal` | App crash, unrecoverable |\n| `error` | Error requiring attention |\n| `warning` | Potential issue |\n| `info` | Informational |\n| `debug` | Debugging only |\n\n### Configuration Options\n\n| Option | Description |\n|--------|-------------|\n| `dsn` | Project data source name |\n| `environment` | Environment name (production, staging) |\n| `release` | Application version |\n| `tracesSampleRate` | Transaction sample rate (0.0-1.0) |\n| `tracesSampler` | Dynamic sampling function |\n| `sendDefaultPii` | Capture IP\u002Fheaders |\n| `integrations` | SDK integrations array |\n| `enableLogs` | Forward structured logs to Sentry |\n| `profileSessionSampleRate` | Profiling sample rate (0.0-1.0) |\n| `profileLifecycle` | `\"trace\"` profiles every traced request |\n| `replaysSessionSampleRate` | Session replay sample rate |\n| `replaysOnErrorSampleRate` | Replay capture rate on errors |\n| `ignoreErrors` | Error patterns to suppress; strings match as **substrings** (see REFERENCE.md) |\n| `beforeSend` | Filter\u002Fmodify events before sending |\n| `beforeSendTransaction` | Filter transactions before sending |\n| `beforeSendLog` | Filter structured logs before sending |\n\nFor detailed examples, advanced patterns, and best practices, see [REFERENCE.md](REFERENCE.md).\n","# TypeScript Sentry\n\nThis skill covers the **SDK-side** work: capture, spans, cron monitors, source maps, profiling, filtering. For project-level Sentry compliance (DSN hygiene, sourcemap-upload wiring in CI) use `\u002Fconfigure:sentry`; for local step-through debugging use `typescript-debugging`.\n\n## Core Expertise\n\nSentry provides error monitoring and performance tracking:\n- Automatic error capture with stack traces\n- Performance monitoring with distributed tracing\n- Cron job monitoring for scheduled tasks\n- Source map integration for readable TypeScript traces\n- Rich context with tags, breadcrumbs, and user data\n- Structured logging forwarded to Sentry (`enableLogs`)\n- CPU\u002FJS profiling (Node.js + browser)\n- Session replay with privacy controls\n- User feedback widget\n- Enrichment helpers (custom contexts, breadcrumb categories, fingerprinting)\n\n## Installation\n\n### Bun\n\n```bash\nbun add @sentry\u002Fbun\n```\n\n### Node.js\n\n```bash\nbun add @sentry\u002Fnode\n```\n\n### Next.js\n\n```bash\nbun add @sentry\u002Fnextjs @sentry\u002Fprofiling-node\n```\n\n### React\u002FBrowser\n\n```bash\nbun add @sentry\u002Freact\n# or\nbun add @sentry\u002Fbrowser\n```\n\n## Error Capturing\n\n### captureException\n\n```typescript\ntry {\n  await riskyOperation();\n} catch (error) {\n  Sentry.captureException(error);\n  throw error; \u002F\u002F Re-throw if needed\n}\n```\n\n### With Context\n\n```typescript\nSentry.captureException(error, {\n  tags: {\n    feature: \"checkout\",\n    paymentProvider: \"stripe\",\n  },\n  extra: {\n    orderId: order.id,\n    userId: user.id,\n    cartItems: cart.items.length,\n  },\n  level: \"error\", \u002F\u002F fatal, error, warning, info, debug\n});\n```\n\n### captureMessage\n\n```typescript\n\u002F\u002F Simple message\nSentry.captureMessage(\"User completed onboarding\");\n\n\u002F\u002F With level\nSentry.captureMessage(\"Rate limit approaching\", \"warning\");\n\n\u002F\u002F With context\nSentry.captureMessage(\"Payment failed\", {\n  level: \"error\",\n  tags: { gateway: \"stripe\" },\n  extra: { errorCode: \"card_declined\" },\n});\n```\n\n## Agentic Optimizations\n\n| Context | Command |\n|---------|---------|\n| Install Bun | `bun add @sentry\u002Fbun` |\n| Install Node | `bun add @sentry\u002Fnode` |\n| Install Next.js | `bun add @sentry\u002Fnextjs @sentry\u002Fprofiling-node` |\n| Install React | `bun add @sentry\u002Freact` |\n| Install CLI | `bun add -D @sentry\u002Fcli` |\n| Upload maps | `npx sentry-cli sourcemaps inject .\u002Fdist && npx sentry-cli sourcemaps upload .\u002Fdist` |\n| Setup wizard | `npx @sentry\u002Fwizard@latest -i sourcemaps` |\n| Test capture | `Sentry.captureMessage(\"Test from dev\")` |\n\n## Quick Reference\n\n### Capture Methods\n\n| Method | Purpose |\n|--------|---------|\n| `captureException(error)` | Capture error with stack trace |\n| `captureMessage(msg)` | Capture text message |\n| `captureCheckIn(opts)` | Cron job check-in |\n| `addBreadcrumb(crumb)` | Add navigation\u002Faction trail |\n\n### Context Methods\n\n| Method | Purpose |\n|--------|---------|\n| `setTag(key, value)` | Add filterable tag |\n| `setExtra(key, value)` | Add debug data |\n| `setUser(user)` | Set user context |\n| `withScope(callback)` | Scoped context |\n\n### Performance Methods\n\n| Method | Purpose |\n|--------|---------|\n| `startSpan(opts, callback)` | Create performance span |\n| `withMonitor(slug, callback)` | Monitor cron job |\n\n### Severity Levels\n\n| Level | Use Case |\n|-------|----------|\n| `fatal` | App crash, unrecoverable |\n| `error` | Error requiring attention |\n| `warning` | Potential issue |\n| `info` | Informational |\n| `debug` | Debugging only |\n\n### Configuration Options\n\n| Option | Description |\n|--------|-------------|\n| `dsn` | Project data source name |\n| `environment` | Environment name (production, staging) |\n| `release` | Application version |\n| `tracesSampleRate` | Transaction sample rate (0.0-1.0) |\n| `tracesSampler` | Dynamic sampling function |\n| `sendDefaultPii` | Capture IP\u002Fheaders |\n| `integrations` | SDK integrations array |\n| `enableLogs` | Forward structured logs to Sentry |\n| `profileSessionSampleRate` | Profiling sample rate (0.0-1.0) |\n| `profileLifecycle` | `\"trace\"` profiles every traced request |\n| `replaysSessionSampleRate` | Session replay sample rate |\n| `replaysOnErrorSampleRate` | Replay capture rate on errors |\n| `ignoreErrors` | Error patterns to suppress; strings match as **substrings** (see REFERENCE.md) |\n| `beforeSend` | Filter\u002Fmodify events before sending |\n| `beforeSendTransaction` | Filter transactions before sending |\n| `beforeSendLog` | Filter structured logs before sending |\n\nFor detailed examples, advanced patterns, and best practices, see [REFERENCE.md](REFERENCE.md).\n",{"name":5,"created":53,"modified":54,"reviewed":53,"description":7,"allowed-tools":55,"user-invocable":49},1769040000000,1790553600000,"Bash, Read, Write, Edit, Grep, Glob, TodoWrite","main","bdd0582f1a2ba53d21061835bfd72d45f2f954f4","typescript-plugin\u002Fskills\u002Ftypescript-sentry",6,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Flaurigates","Linux enthusiast, cloud engineer, neovim addict, electronics hobbyist.","2026-11-15 03:36:11",{"source":8,"skillName":5,"commands":65,"prompt":75,"zipAvailable":76},[66,69,72],{"tool":67,"command":68},"npx","npx skills add laurigates\u002Fclaude-plugins --skill typescript-sentry",{"tool":70,"command":71},"bunx","bunx skills add laurigates\u002Fclaude-plugins --skill typescript-sentry",{"tool":73,"command":74},"pnpm","pnpm dlx skills add laurigates\u002Fclaude-plugins --skill typescript-sentry","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftypescript-plugin\u002Fskills\u002Ftypescript-sentry\u002FSKILL.md",true,[78],{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"REFERENCE.md","REFERENCE","参考文档",17132,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Ftypescript-plugin\u002Fskills\u002Ftypescript-sentry\u002FREFERENCE.md",[85,112,130,146,169,199],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":96,"publishedAt":48},"01M70PFHMH9ADY0CRE6047Y4B2","kitty-show-image","Show the user an image with a note on what to judge, via a file send or a labelled kitty tab. Use when the user must see an image, or icat fails with no \u002Fdev\u002Ftty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-show-image\u002FSKILL.md",[91],{"categoryNo":92,"categoryName":93,"taxonomyType":94,"taxonomyTypeDesc":95},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[97,98,99,100,101,102,103,104,105,106,34,24,42,107,108,109,110,111,23,36],"show","kitty show image","image","kitty","show image","ls","get","send","open","dev","file","text","with","xdg","via",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":48},"01M70PFEN18HKQ4RCQ1VPGMPTB","kitty-session-persistence","Snapshot and restore kitty terminal sessions on macOS. Use when surviving WindowServer hangs without losing tabs, configuring snapshots, or restoring after a force-reboot.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-session-persistence\u002FSKILL.md",[],[100,119,120,121,29,122,24,42,123,124,125,23,36,22,35,126,127,128,129,34],"kitty session persistence","session","persistence","snapshots","uname","reboot","terminal","snapshot","macos","sessions","restore",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":48},"01M70PFC77XGXCVQ1543VGZHYR","kitty-remote-control","Safe kitty remote control from an agent — read panes with kitty @ ls\u002Fget-text, notify, and never mutate the live terminal unasked. Use when running inside kitty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-remote-control\u002FSKILL.md",[],[137,138,100,139,140,102,141,142,103,143,144,34,24,145,42,108,109,125,23,36],"kitty remote control","remote","control","remote control","running","never","panes","notify","query",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":48},"01M70P6WVMCT5JG4SACTM69AF9","docs-reference-check","Dangling doc-reference gate: flag markdown naming repo paths or relative links that no longer exist. Use when docs cite moved\u002Fdeleted files, or wiring a doc-drift lint.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fdocumentation-plugin\u002Fskills\u002Fdocs-reference-check\u002FSKILL.md",[],[153,154,155,156,157,158,159,160,161,162,34,24,42,163,107,164,165,166,167,168],"docs reference check","check","reference check","reference","docs","links","python3","repo","files","auto","drift","lint","wiring","chezmoi","references","cp",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":184,"publishedAt":48},"01M6C6NDE7DAQGNWSF22J5CJ0Z","youtube-upload","Upload a video to YouTube via the Data API v3 and edit its title, description, tags or thumbnail afterwards. Use when publishing or retitling a YouTube video.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-upload\u002FSKILL.md",[175,178,179],{"categoryNo":176,"categoryName":177,"taxonomyType":94,"taxonomyTypeDesc":95},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":92,"categoryName":93,"taxonomyType":94,"taxonomyTypeDesc":95},{"categoryNo":180,"categoryName":181,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[185,186,187,188,159,189,36,190,35,191,192,193,34,42,107,194,195,24,196,197,198,111,23],"youtube upload","upload","youtube","Video","run","uv run","publishing","data","uv","api","v3","tags","id","title",{"skillNo":200,"name":201,"nameZh":6,"description":202,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":203,"categories":204,"keywords":208,"publishedAt":48},"01M6C6NABWW1X58KJJM4F6GQMQ","youtube-studio-share","Share a private YouTube video with a whole Google Workspace organization by scripting YouTube Studio in the browser. Use when a video must be org-only.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-studio-share\u002FSKILL.md",[205],{"categoryNo":206,"categoryName":207,"taxonomyType":94,"taxonomyTypeDesc":95},"01JBSEEDCAT000000000000023","Skill与智能体开发",[209,210,211,212,187,188,213,214,215,216,217,36,218,219,220,221,34,222,24,109,223,23],"youtube studio share","share","youtube studio","studio","browser","javascript","scripting","google workspace","workspace","tool","google","only","MCP","chrome","organization"]