diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3ee57bd..7114509 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,6 +26,36 @@ jobs: - name: Delete latest tag run: git push origin :refs/tags/latest || true + - name: Generate release body + id: release-body + run: | + SKILL_LIST=$(./scripts/generate-skill-list.sh) + # Use heredoc to handle multiline output + { + echo 'BODY<> "$GITHUB_OUTPUT" + - name: Create latest release uses: softprops/action-gh-release@v2 with: @@ -34,35 +64,4 @@ jobs: files: sentry-agent-skills.tar.gz prerelease: false make_latest: true - body: | - Automatically updated Sentry agent skills package. - - ## Installation - - Download and extract to your editor's skills directory: - - ```bash - # Example for Claude Code (project-level) - mkdir -p .claude/skills - curl -L https://github.com/getsentry/sentry-agent-skills/releases/download/latest/sentry-agent-skills.tar.gz | tar -xz -C .claude/skills - - # Or use sentry-wizard - npx @sentry/wizard@latest --skills - ``` - - ## Included Skills - - **Setup:** - - `sentry-nextjs-setup` - Setup Sentry in Next.js projects - - `sentry-react-setup` - Setup Sentry in React apps - - `sentry-react-native-setup` - Setup Sentry in React Native/Expo apps - - `sentry-python-setup` - Setup Sentry in Python apps (Django, Flask, FastAPI) - - `sentry-ruby-setup` - Setup Sentry in Ruby/Rails apps - - `sentry-setup-tracing` - Setup Sentry Tracing and Performance Monitoring - - `sentry-setup-logging` - Setup Sentry Logging - - `sentry-setup-metrics` - Setup Sentry Metrics - - `sentry-setup-ai-monitoring` - Setup Sentry AI Agent Monitoring - - **Workflow:** - - `sentry-fix-issues` - Find and fix production issues using Sentry MCP - - `sentry-pr-code-review` - Analyze and resolve Sentry comments on GitHub PRs + body: ${{ steps.release-body.outputs.BODY }} diff --git a/README.md b/README.md index 9aed92f..f3f0bef 100644 --- a/README.md +++ b/README.md @@ -20,11 +20,6 @@ Official agent skills for integrating Sentry into your projects. These skills pr | Skill | Description | Platforms | Docs | |-------|-------------|-----------|------| | `sentry-react-setup` | Setup Sentry in React apps | React | [React Guide](https://docs.sentry.io/platforms/javascript/guides/react/) | -| `sentry-react-native-setup` | Setup Sentry in React Native using the wizard CLI | React Native, Expo | [React Native Guide](https://docs.sentry.io/platforms/react-native/) | -| `sentry-ios-swift-setup` | Setup Sentry in iOS/Swift apps (superseded by `sentry-cocoa-sdk`) | iOS (Swift, UIKit, SwiftUI) | [Apple Guide](https://docs.sentry.io/platforms/apple/guides/ios/) | -| `sentry-setup-tracing` | Setup Sentry Tracing (Performance Monitoring) | JS, Python, Ruby | [Tracing](https://docs.sentry.io/platforms/javascript/tracing/) | -| `sentry-setup-logging` | Setup Sentry Logging | JS, Python, Ruby | [Logs](https://docs.sentry.io/platforms/javascript/logs/) | -| `sentry-setup-metrics` | Setup Sentry Metrics | JS, Python | [Metrics](https://docs.sentry.io/platforms/javascript/metrics/) | | `sentry-setup-ai-monitoring` | Setup Sentry AI Agent Monitoring | JS, Python | [AI Monitoring](https://docs.sentry.io/product/ai-monitoring/) | ### Workflow Skills @@ -93,7 +88,7 @@ git clone https://github.com/getsentry/sentry-agent-skills.git /tmp/sentry-skill .claude/skills/ # Project-level # Each skill: -sentry-setup-tracing/ +sentry-fix-issues/ SKILL.md ``` @@ -126,7 +121,7 @@ git clone https://github.com/getsentry/sentry-agent-skills.git /tmp/sentry-skill .codex/skills/ # Project-level # Each skill: -sentry-setup-tracing/ +sentry-fix-issues/ SKILL.md ``` @@ -159,7 +154,7 @@ git clone https://github.com/getsentry/sentry-agent-skills.git /tmp/sentry-skill .github/skills/ # Project-level # Each skill: -sentry-setup-tracing/ +sentry-fix-issues/ SKILL.md ``` @@ -194,7 +189,7 @@ git clone https://github.com/getsentry/sentry-agent-skills.git /tmp/sentry-skill .cursor/skills/ # Project-level # Each skill: -sentry-setup-tracing/ +sentry-fix-issues/ SKILL.md ``` @@ -231,7 +226,7 @@ git clone https://github.com/getsentry/sentry-agent-skills.git /tmp/sentry-skill .claude/skills/ # Project-level (alternative) # Each skill: -sentry-setup-tracing/ +sentry-fix-issues/ SKILL.md ``` @@ -268,7 +263,7 @@ git clone https://github.com/getsentry/sentry-agent-skills.git /tmp/sentry-skill .claude/skills/ # Project-level (alternative) # Each skill: -sentry-setup-tracing/ +sentry-fix-issues/ SKILL.md ``` @@ -320,10 +315,6 @@ Once installed, your AI assistant will automatically discover the skills. Simply |-------------|------------| | "Add Sentry to my React app" | `sentry-react-setup` | | "Add Sentry to my iOS/Swift app" | `sentry-cocoa-sdk` | -| "Set up Sentry in React Native" | `sentry-react-native-setup` | -| "Add performance monitoring to my app" | `sentry-setup-tracing` | -| "Enable Sentry logging" | `sentry-setup-logging` | -| "Track custom metrics with Sentry" | `sentry-setup-metrics` | | "Monitor my OpenAI/LangChain calls" | `sentry-setup-ai-monitoring` | ### Debugging & Workflow diff --git a/scripts/generate-skill-list.sh b/scripts/generate-skill-list.sh new file mode 100755 index 0000000..f92280a --- /dev/null +++ b/scripts/generate-skill-list.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# Generates a markdown list of skills from skills/*/SKILL.md frontmatter. +# Used by the release workflow to keep the "Included Skills" section current. + +set -euo pipefail + +SKILLS_DIR="${1:-skills}" + +for skill_file in "$SKILLS_DIR"/*/SKILL.md; do + [ -f "$skill_file" ] || continue + + name="" + desc="" + in_frontmatter=false + + while IFS= read -r line; do + if [[ "$line" == "---" ]]; then + if $in_frontmatter; then + break + else + in_frontmatter=true + continue + fi + fi + if $in_frontmatter; then + if [[ "$line" =~ ^name:\ *(.*) ]]; then + name="${BASH_REMATCH[1]}" + elif [[ "$line" =~ ^description:\ *(.*) ]]; then + # Take only the first sentence (up to first period followed by space or end) + raw="${BASH_REMATCH[1]}" + desc=$(echo "$raw" | sed 's/\. .*/\./') + fi + fi + done < "$skill_file" + + if [[ -n "$name" && -n "$desc" ]]; then + echo "- \`$name\` - $desc" + fi +done diff --git a/skills/sentry-ios-swift-setup/SKILL.md b/skills/sentry-ios-swift-setup/SKILL.md deleted file mode 100644 index 493b838..0000000 --- a/skills/sentry-ios-swift-setup/SKILL.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -name: sentry-ios-swift-setup -description: Setup Sentry in iOS/Swift apps. Use when asked to add Sentry to iOS, install sentry-cocoa SDK, or configure error monitoring for iOS applications using Swift and SwiftUI. -license: Apache-2.0 ---- - -# Sentry iOS Swift Setup - -Install and configure Sentry in iOS projects using Swift and SwiftUI. - -## Invoke This Skill When - -- User asks to "add Sentry to iOS" or "install Sentry" in a Swift app -- User wants error monitoring, tracing, or session replay in iOS -- User mentions "sentry-cocoa" or iOS crash reporting - -**Important:** The configuration options and code samples below are examples. Always verify against [docs.sentry.io](https://docs.sentry.io) before implementing, as APIs and defaults may have changed. - -## Requirements - -- iOS 15.0+, macOS 12.0+, tvOS 15.0+, watchOS 8.0+ - -## Install - -### Swift Package Manager (Recommended) - -1. File > Add Package Dependencies -2. Enter: `https://github.com/getsentry/sentry-cocoa.git` -3. Select version rule: "Up to Next Major" from `9.5.0` - -**SPM Products:** Choose based on your needs: - -| Product | Use Case | -|---------|----------| -| `Sentry` | Default (static linking) | -| `Sentry-Dynamic` | Dynamic framework | -| `SentrySwiftUI` | SwiftUI view performance tracking | -| `Sentry-WithoutUIKitOrAppKit` | App extensions or CLI tools | - -### CocoaPods - -```ruby -# Podfile -pod 'Sentry', :git => 'https://github.com/getsentry/sentry-cocoa.git', :tag => '9.5.0' -``` - -Then run `pod install`. - -## Configure - -### SwiftUI App - -```swift -import SwiftUI -import Sentry - -@main -struct YourApp: App { - init() { - SentrySDK.start { options in - options.dsn = "YOUR_SENTRY_DSN" - options.debug = true - - // Tracing - options.tracesSampleRate = 1.0 - - // Profiling - options.configureProfiling = { - $0.sessionSampleRate = 1.0 - $0.lifecycle = .trace - } - - // Session Replay - options.sessionReplay.sessionSampleRate = 1.0 - options.sessionReplay.onErrorSampleRate = 1.0 - - // Logs (SDK 9.0.0+; for 8.55.0-8.x use options.experimental.enableLogs) - options.enableLogs = true - - // Error context - options.attachScreenshot = true - options.attachViewHierarchy = true - } - } - - var body: some Scene { - WindowGroup { ContentView() } - } -} -``` - -### UIKit App - -```swift -import UIKit -import Sentry - -@main -class AppDelegate: UIResponder, UIApplicationDelegate { - func application(_ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - SentrySDK.start { options in - options.dsn = "YOUR_SENTRY_DSN" - options.debug = true - options.tracesSampleRate = 1.0 - options.enableLogs = true - } - return true - } -} -``` - -## Configuration Options - -| Option | Description | Default | -|--------|-------------|---------| -| `dsn` | Sentry DSN | Required | -| `tracesSampleRate` | % of transactions traced | `0` | -| `sessionReplay.sessionSampleRate` | % of sessions replayed | `0` | -| `sessionReplay.onErrorSampleRate` | % of error sessions replayed | `0` | -| `enableLogs` | Send logs to Sentry | `false` | -| `attachScreenshot` | Attach screenshot on error | `false` | -| `attachViewHierarchy` | Attach view hierarchy on error | `false` | - -## Auto-Instrumented Features - -| Feature | What's Captured | -|---------|-----------------| -| App Launches | Cold/warm start times | -| Network | URLSession requests | -| UI | UIViewController loads, user interactions | -| File I/O | Read/write operations | -| Core Data | Fetch/save operations | -| Frames | Slow and frozen frame detection | - -## Logging - -```swift -let logger = SentrySDK.logger - -logger.info("User action", attributes: [ - "userId": "123", - "action": "checkout" -]) - -// Log levels: trace, debug, info, warn, error, fatal -``` - -## Session Replay - -**iOS 26+ / Xcode 26+ caveat:** SDK 8.57.0+ automatically disables Session Replay on iOS 26.0+ when built with Xcode 26.0+ due to Apple's Liquid Glass rendering breaking masking reliability. Replay still works on iOS < 26 or Xcode < 26. To force-enable (use with caution): `options.experimental.enableSessionReplayInUnreliableEnvironment = true`. - -### Masking - -```swift -// SwiftUI modifiers -Text("Safe content").sentryReplayUnmask() -Text(user.email).sentryReplayMask() -``` - -## User Context - -```swift -let user = User() -user.userId = "user_123" -user.email = "user@example.com" -SentrySDK.setUser(user) - -// Clear on logout -SentrySDK.setUser(nil) -``` - -## Verification - -```swift -// Test error capture -SentrySDK.capture(message: "Test from iOS") - -// Or trigger a test error -do { - try someFailingFunction() -} catch { - SentrySDK.capture(error: error) -} -``` - -## Production Settings - -```swift -SentrySDK.start { options in - options.dsn = "YOUR_SENTRY_DSN" - options.debug = false - options.tracesSampleRate = 0.2 // 20% - options.sessionReplay.sessionSampleRate = 0.1 // 10% - options.sessionReplay.onErrorSampleRate = 1.0 // 100% on error - options.enableLogs = true -} -``` - -## Size Analysis (Fastlane) - -Track app bundle size with Sentry using the Fastlane plugin. - -### Install Plugin - -```bash -bundle exec fastlane add_plugin fastlane-plugin-sentry -``` - -### Configure Authentication - -```bash -# Environment variable (recommended for CI) -export SENTRY_AUTH_TOKEN=your_token_here -``` - -Or create `.sentryclirc` (add to `.gitignore`): - -```ini -[auth] -token=YOUR_SENTRY_AUTH_TOKEN -``` - -### Fastfile Lane - -```ruby -lane :sentry_size do - build_app( - scheme: "YourApp", - configuration: "Release", - export_method: "app-store" - ) - - sentry_upload_build( - org_slug: "your-org", - project_slug: "your-project", - build_configuration: "Release" - ) -end -``` - -### Run Size Analysis - -```bash -bundle exec fastlane sentry_size -``` - -View results in the Sentry UI after the upload completes. - -## Troubleshooting - -| Issue | Solution | -|-------|----------| -| Events not appearing | Check DSN, enable `debug = true` | -| No traces | Set `tracesSampleRate` > 0 | -| No replays | Set `sessionSampleRate` > 0, check SDK 8.31.1+. On iOS 26+/Xcode 26+ see Liquid Glass caveat above | -| No logs | Set `enableLogs = true` (SDK 9.0.0+) or `experimental.enableLogs = true` (SDK 8.55.0-8.x) | -| CocoaPods fails | Run `pod repo update`, check iOS 15+ target | -| Size upload fails | Check `SENTRY_AUTH_TOKEN`, verify org/project slugs | diff --git a/skills/sentry-react-native-setup/SKILL.md b/skills/sentry-react-native-setup/SKILL.md deleted file mode 100644 index f0a3201..0000000 --- a/skills/sentry-react-native-setup/SKILL.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -name: sentry-react-native-setup -description: Setup Sentry in React Native using the wizard CLI. Use when asked to add Sentry to React Native, install @sentry/react-native, or configure error monitoring for React Native or Expo apps. -license: Apache-2.0 ---- - -# Sentry React Native Setup - -Install and configure Sentry in React Native projects using the official wizard CLI. - -## Invoke This Skill When - -- User asks to "add Sentry to React Native" or "install Sentry" in a React Native app -- User wants error monitoring, logging, or tracing in React Native or Expo -- User mentions "@sentry/react-native" or mobile error tracking - -**Important:** The configuration options and code samples below are examples. Always verify against [docs.sentry.io](https://docs.sentry.io) before implementing, as APIs and defaults may have changed. - -## Wizard Setup (Recommended) - -```bash -npx @sentry/wizard@latest -i reactNative -``` - -### What the Wizard Does - -| Task | Description | -|------|-------------| -| Install SDK | Adds `@sentry/react-native` package | -| Metro config | Adds `@sentry/react-native/metro` to `metro.config.js` | -| Expo config | Adds `@sentry/react-native/expo` to `app.json` | -| Android setup | Enables Gradle build step for source maps | -| iOS setup | Wraps Xcode build phase, adds debug symbol upload | -| Pod install | Runs `pod install` for iOS | -| Credentials | Stores in `ios/sentry.properties`, `android/sentry.properties`, `env.local` | -| Init code | Configures Sentry in `App.tsx` or `_layout.tsx` | - -## Manual Configuration - -If not using wizard, add to your app entry point: - -```javascript -import * as Sentry from "@sentry/react-native"; - -Sentry.init({ - dsn: "YOUR_SENTRY_DSN", - sendDefaultPii: true, - - // Tracing - tracesSampleRate: 1.0, - - // Logs - enableLogs: true, - - // Profiling - profilesSampleRate: 1.0, - - // Session Replay - replaysOnErrorSampleRate: 1.0, - replaysSessionSampleRate: 0.1, - integrations: [Sentry.mobileReplayIntegration()], -}); -``` - -### Wrap Your App - -```javascript -export default Sentry.wrap(App); -``` - -## Expo Projects - -For Expo, follow the [Expo-specific setup](https://docs.sentry.io/platforms/react-native/manual-setup/expo/): - -```bash -npx @sentry/wizard@latest -i reactNative -``` - -Works for both managed and bare Expo projects. - -## Configuration Options - -| Option | Description | Default | -|--------|-------------|---------| -| `dsn` | Sentry DSN | Required | -| `sendDefaultPii` | Include user data | `false` | -| `tracesSampleRate` | % of transactions traced | `0` | -| `profilesSampleRate` | % of traces profiled | `0` | -| `enableLogs` | Send logs to Sentry | `false` | -| `replaysOnErrorSampleRate` | % of error sessions replayed | `0` | -| `replaysSessionSampleRate` | % of all sessions replayed | `0` | - -## Files Created/Modified - -| File | Purpose | -|------|---------| -| `App.js` / `_layout.tsx` | Sentry initialization | -| `metro.config.js` | Metro bundler config | -| `app.json` | Expo config (if Expo) | -| `ios/sentry.properties` | iOS build credentials | -| `android/sentry.properties` | Android build credentials | -| `env.local` | Environment variables | - -## Environment Variables - -```bash -SENTRY_DSN=https://xxx@o123.ingest.sentry.io/456 -SENTRY_AUTH_TOKEN=sntrys_xxx -SENTRY_ORG=my-org -SENTRY_PROJECT=my-project -``` - -## Verification - -Add test error: - -```javascript -throw new Error("My first Sentry error!"); -``` - -Or use a test button: - -```javascript -