diff --git a/packages/cli/package.json b/packages/cli/package.json index 6380881c9..c0a15169b 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -103,6 +103,7 @@ "@sentry/node-core": "10.63.0", "@sentry/sqlish": "^1.0.1", "@sentry/symbolic": "13.7.0", + "@sentry/toolkit-core": "workspace:*", "@spotlightjs/spotlight": "^4.11.7", "@stricli/auto-complete": "^1.2.8", "@stricli/core": "1.2.8", diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md index 771c666c2..7a3a17757 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md @@ -1,6 +1,6 @@ --- name: sentry-cli -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Guide for using the Sentry CLI to interact with Sentry from the command line. Use when the user asks about viewing issues, events, projects, organizations, making API calls, or authenticating with Sentry via CLI. requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/agent-conversation.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/agent-conversation.md index ca7e7bb2a..0ba3bdab8 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/agent-conversation.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/agent-conversation.md @@ -1,6 +1,6 @@ --- name: sentry-cli-agent-conversation -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: List and view agent conversations requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/alert.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/alert.md index 7ce0e7ef7..e742f6276 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/alert.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/alert.md @@ -1,6 +1,6 @@ --- name: sentry-cli-alert -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Manage Sentry alert rules requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/api.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/api.md index 9cee33e99..6fe3ff6e3 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/api.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/api.md @@ -1,6 +1,6 @@ --- name: sentry-cli-api -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Make an authenticated API request requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/auth.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/auth.md index 4d930876f..43fbe9eee 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/auth.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/auth.md @@ -1,6 +1,6 @@ --- name: sentry-cli-auth -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Authenticate with Sentry requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/build.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/build.md index 7ad9177be..4064f1e2a 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/build.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/build.md @@ -1,6 +1,6 @@ --- name: sentry-cli-build -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Manage mobile build artifacts requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/cli.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/cli.md index 0f67cf10f..8798683ce 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/cli.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/cli.md @@ -1,6 +1,6 @@ --- name: sentry-cli-cli -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: CLI-related commands requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/code-mappings.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/code-mappings.md index 220d58afe..dd8b92ed6 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/code-mappings.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/code-mappings.md @@ -1,6 +1,6 @@ --- name: sentry-cli-code-mappings -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Manage code mappings for stack trace linking requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dart-symbol-map.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dart-symbol-map.md index 12e3a2025..5179747fa 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dart-symbol-map.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dart-symbol-map.md @@ -1,6 +1,6 @@ --- name: sentry-cli-dart-symbol-map -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Work with Dart/Flutter symbol maps requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dashboard.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dashboard.md index a750cc782..64660543a 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dashboard.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dashboard.md @@ -1,6 +1,6 @@ --- name: sentry-cli-dashboard -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Manage Sentry dashboards requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/debug-files.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/debug-files.md index 7fa5f931f..06ad6b1dd 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/debug-files.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/debug-files.md @@ -1,6 +1,6 @@ --- name: sentry-cli-debug-files -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Work with debug information files requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/docs.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/docs.md index 28ef7d857..0c523242d 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/docs.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/docs.md @@ -1,6 +1,6 @@ --- name: sentry-cli-docs -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Search and query current Sentry documentation requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dsn.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dsn.md index 840f93395..042f65e72 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dsn.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dsn.md @@ -1,6 +1,6 @@ --- name: sentry-cli-dsn -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Find Sentry DSNs requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/event.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/event.md index 9150610c0..0c5da357d 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/event.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/event.md @@ -1,6 +1,6 @@ --- name: sentry-cli-event -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: View, list, and send Sentry events requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/explore.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/explore.md index 4644b453b..745ab082f 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/explore.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/explore.md @@ -1,6 +1,6 @@ --- name: sentry-cli-explore -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Query aggregate event data (Explore) requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/feedback.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/feedback.md index 4b5715ed1..f6822c432 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/feedback.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/feedback.md @@ -1,6 +1,6 @@ --- name: sentry-cli-feedback -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Manage User Feedback requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/info.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/info.md index 62a6f7771..3d81d9d71 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/info.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/info.md @@ -1,6 +1,6 @@ --- name: sentry-cli-info -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Print configuration and verify authentication requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/init.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/init.md index c2e487800..491f3c1c3 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/init.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/init.md @@ -1,6 +1,6 @@ --- name: sentry-cli-init -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Initialize Sentry in your project (experimental) requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/issue.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/issue.md index ccda75288..643e67778 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/issue.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/issue.md @@ -1,6 +1,6 @@ --- name: sentry-cli-issue -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Manage Sentry issues requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/local.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/local.md index 9e173e55c..df92efaab 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/local.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/local.md @@ -1,6 +1,6 @@ --- name: sentry-cli-local -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Sentry for local development requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/log.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/log.md index aeb34e043..c49af07c6 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/log.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/log.md @@ -1,6 +1,6 @@ --- name: sentry-cli-log -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: View Sentry logs requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/monitor.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/monitor.md index 4b13cbcc1..5288bd644 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/monitor.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/monitor.md @@ -1,6 +1,6 @@ --- name: sentry-cli-monitor -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Work with Sentry cron monitors requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/org.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/org.md index c6f52b78c..285a19849 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/org.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/org.md @@ -1,6 +1,6 @@ --- name: sentry-cli-org -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Work with Sentry organizations requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/platform.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/platform.md index 461689158..c684a5a08 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/platform.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/platform.md @@ -1,6 +1,6 @@ --- name: sentry-cli-platform -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: List valid Sentry platform identifiers requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/proguard.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/proguard.md index 8e8e08a0b..98d82f876 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/proguard.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/proguard.md @@ -1,6 +1,6 @@ --- name: sentry-cli-proguard -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Work with ProGuard/R8 mapping files requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/project.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/project.md index d0d83dc54..4609b61ec 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/project.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/project.md @@ -1,6 +1,6 @@ --- name: sentry-cli-project -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Work with Sentry projects requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/react-native.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/react-native.md index e3d808e24..3ab79f766 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/react-native.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/react-native.md @@ -1,6 +1,6 @@ --- name: sentry-cli-react-native -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Upload React Native sourcemaps from build steps requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/release.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/release.md index 244b27a20..51b33b3d3 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/release.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/release.md @@ -1,6 +1,6 @@ --- name: sentry-cli-release -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Work with Sentry releases requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/replay.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/replay.md index 39bf76aa7..ebb72a753 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/replay.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/replay.md @@ -1,6 +1,6 @@ --- name: sentry-cli-replay -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Search and inspect Session Replays requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/repo.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/repo.md index 6621aaeba..03ff3b504 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/repo.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/repo.md @@ -1,6 +1,6 @@ --- name: sentry-cli-repo -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Work with Sentry repositories requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/schema.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/schema.md index c56b69d73..4d4f4abb8 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/schema.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/schema.md @@ -1,6 +1,6 @@ --- name: sentry-cli-schema -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Browse the Sentry API schema requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/snapshots.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/snapshots.md index 43f584ec1..332f5b68a 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/snapshots.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/snapshots.md @@ -1,6 +1,6 @@ --- name: sentry-cli-snapshots -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Manage and compare snapshots requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/sourcemap.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/sourcemap.md index 749e45d3d..0998bdd9a 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/sourcemap.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/sourcemap.md @@ -1,6 +1,6 @@ --- name: sentry-cli-sourcemap -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Manage sourcemaps requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/span.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/span.md index b204a11c1..3e9b03334 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/span.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/span.md @@ -1,6 +1,6 @@ --- name: sentry-cli-span -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: List and view spans in projects or traces requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/status.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/status.md index 452742129..86ce11bcd 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/status.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/status.md @@ -1,6 +1,6 @@ --- name: sentry-cli-status -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Check Sentry service status requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/team.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/team.md index dac91fe16..a074f709b 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/team.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/team.md @@ -1,6 +1,6 @@ --- name: sentry-cli-team -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Work with Sentry teams requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/trace.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/trace.md index 65d392b5d..67112896a 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/trace.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/trace.md @@ -1,6 +1,6 @@ --- name: sentry-cli-trace -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: View distributed traces requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/trial.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/trial.md index 333cafd7c..3b857dddc 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/trial.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/trial.md @@ -1,6 +1,6 @@ --- name: sentry-cli-trial -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Manage product trials requires: bins: ["sentry"] diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/wasm-split.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/wasm-split.md index 3ed78dca8..33179e2cb 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/wasm-split.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/wasm-split.md @@ -1,6 +1,6 @@ --- name: sentry-cli-wasm-split -version: 0.47.0-dev.0 +version: 0.48.0-dev.0 description: Add build ids to WebAssembly modules and split out debug data requires: bins: ["sentry"] diff --git a/packages/cli/script/bump-version.ts b/packages/cli/script/bump-version.ts index 89179b702..2e386415f 100644 --- a/packages/cli/script/bump-version.ts +++ b/packages/cli/script/bump-version.ts @@ -20,9 +20,12 @@ */ import { execSync, spawnSync } from "node:child_process"; -import { readFileSync, writeFileSync } from "node:fs"; +import { readdirSync, readFileSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; const PLUGIN_PATH = "plugins/sentry-cli/.claude-plugin/plugin.json"; +const SKILL_PATH = "plugins/sentry-cli/skills/sentry-cli"; +const SKILL_VERSION_LINE = /^version: [^\r\n]+$/gm; /** Regex to match prerelease suffix (e.g., -dev.0, -alpha.1) */ const PRERELEASE_SUFFIX_REGEX = /-.*$/; @@ -55,6 +58,39 @@ function stripPrerelease(version: string): string { return version.replace(PRERELEASE_SUFFIX_REGEX, ""); } +/** Update the tracked skill frontmatter without requiring a network-backed schema build. */ +function syncSkillVersions(version: string): void { + const references = readdirSync(join(SKILL_PATH, "references")) + .filter((name) => name.endsWith(".md")) + .map((name) => join(SKILL_PATH, "references", name)); + if (references.length === 0) { + throw new Error("Generated CLI skill references are missing"); + } + + const files = [join(SKILL_PATH, "SKILL.md"), ...references].map((path) => { + const content = readFileSync(path, "utf-8"); + const end = content.indexOf("\n---\n", 4); + if (!content.startsWith("---\n") || end === -1) { + throw new Error(`Invalid CLI skill frontmatter: ${path}`); + } + const frontmatter = content.slice(0, end); + const versions = frontmatter.match(SKILL_VERSION_LINE); + if (versions?.length !== 1) { + throw new Error(`Expected one CLI skill version: ${path}`); + } + return { + path, + content: + frontmatter.replace(SKILL_VERSION_LINE, `version: ${version}`) + + content.slice(end), + }; + }); + + for (const { path, content } of files) { + writeFileSync(path, content); + } +} + /** * Execute a shell command with output inherited to stdout/stderr */ @@ -106,6 +142,11 @@ function postRelease(): void { writePluginJson(plugin); console.log(`Updated plugin.json to ${plugin.version}`); + // The generator embeds package.json's version in every tracked skill file. + // Sync only its frontmatter here: the full generator needs an API schema that + // is gitignored and may not exist in Craft's post-release checkout. + syncSkillVersions(pkg.version); + // Commit and push if there are changes // Use spawnSync to check exit code without throwing const diffResult = spawnSync("git", ["diff", "--quiet"], { diff --git a/packages/cli/src/lib/auth-header.ts b/packages/cli/src/lib/auth-header.ts index 0a3af0a38..ddfaaba81 100644 --- a/packages/cli/src/lib/auth-header.ts +++ b/packages/cli/src/lib/auth-header.ts @@ -1,31 +1,20 @@ /** Validated Authorization values for the selected Sentry credential. */ +import { + normalizeAuthToken as parseAuthToken, + trimAuthToken as trimSharedAuthToken, +} from "@sentry/toolkit-core/auth-token"; import { MalformedAuthTokenError } from "./errors.js"; -/** Bearer tokens are opaque, but cannot contain whitespace or non-ASCII bytes. */ -const INVALID_TOKEN_CHARACTER_PATTERN = /[^\x21-\x7e]/; - -// biome-ignore lint/suspicious/noControlCharactersInRegex: pasted ASCII controls are the padding this rule removes. -const TOKEN_PADDING_PATTERN = /[\s\x00-\x1f\x7f]/; - -/** Remove surrounding whitespace and ASCII controls without validating a candidate. */ +/** Preserve the CLI's existing public API while sharing the token rules. */ export function trimAuthToken(token: string): string { - // Scan only the edges; a trailing regex can backtrack over long internal runs. - let start = 0; - let end = token.length; - while (start < end && TOKEN_PADDING_PATTERN.test(token.charAt(start))) { - start += 1; - } - while (end > start && TOKEN_PADDING_PATTERN.test(token.charAt(end - 1))) { - end -= 1; - } - return token.slice(start, end); + return trimSharedAuthToken(token); } /** Trim padding and validate the credential selected for storage or a request. */ export function normalizeAuthToken(token: string): string { - const normalized = trimAuthToken(token); - if (!normalized || INVALID_TOKEN_CHARACTER_PATTERN.test(normalized)) { + const normalized = parseAuthToken(token); + if (normalized === null) { throw new MalformedAuthTokenError(); } return normalized; diff --git a/packages/cli/src/lib/oauth.ts b/packages/cli/src/lib/oauth.ts index a5ccd798f..b5eee0707 100644 --- a/packages/cli/src/lib/oauth.ts +++ b/packages/cli/src/lib/oauth.ts @@ -5,6 +5,10 @@ * https://datatracker.ietf.org/doc/html/rfc8628 */ +import { + deviceCodeRequestBody, + deviceTokenRequestBody, +} from "@sentry/toolkit-core/oauth-device"; import { safeParse } from "valibot"; import type { TokenResponse } from "../types/index.js"; import { @@ -270,10 +274,7 @@ function requestDeviceCode(scope: string = SCOPES) { { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, - body: new URLSearchParams({ - client_id: clientId, - scope, - }), + body: deviceCodeRequestBody(clientId, scope), } ); @@ -324,11 +325,7 @@ function pollForToken(deviceCode: string): Promise { { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, - body: new URLSearchParams({ - client_id: getClientId(), - device_code: deviceCode, - grant_type: "urn:ietf:params:oauth:grant-type:device_code", - }), + body: deviceTokenRequestBody(getClientId(), deviceCode), } ); diff --git a/packages/cli/test/script/bump-version.test.ts b/packages/cli/test/script/bump-version.test.ts new file mode 100644 index 000000000..296a232d7 --- /dev/null +++ b/packages/cli/test/script/bump-version.test.ts @@ -0,0 +1,93 @@ +import { spawnSync } from "node:child_process"; +import { + chmodSync, + mkdirSync, + mkdtempSync, + readFileSync, + rmSync, + writeFileSync, +} from "node:fs"; +import { tmpdir } from "node:os"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { afterEach, expect, test } from "vitest"; + +const script = resolve( + dirname(fileURLToPath(import.meta.url)), + "../../script/bump-version.ts" +); +const fixtures: string[] = []; + +afterEach(() => { + for (const fixture of fixtures.splice(0)) + rmSync(fixture, { recursive: true, force: true }); +}); + +test("post-release bump updates tracked skill versions before committing", () => { + const cwd = mkdtempSync(join(tmpdir(), "cli-bump-version-")); + fixtures.push(cwd); + const bin = join(cwd, "bin"); + const skill = "plugins/sentry-cli/skills/sentry-cli"; + mkdirSync(bin); + mkdirSync(join(cwd, skill, "references"), { recursive: true }); + mkdirSync(join(cwd, "plugins/sentry-cli/.claude-plugin"), { + recursive: true, + }); + writeFileSync(join(cwd, "package.json"), '{"version":"0.47.0"}\n'); + writeFileSync( + join(cwd, "plugins/sentry-cli/.claude-plugin/plugin.json"), + '{"version":"0.47.0"}\n' + ); + for (const path of ["SKILL.md", "references/auth.md"]) { + writeFileSync( + join(cwd, skill, path), + "---\nname: sentry-cli\nversion: 0.47.0-dev.0\n---\n\nContent\n" + ); + } + + writeFileSync( + join(bin, "npm"), + '#!/usr/bin/env node\nrequire("node:fs").writeFileSync("package.json", JSON.stringify({ version: "0.48.0-dev.0" }) + "\\n");\n' + ); + writeFileSync( + join(bin, "git"), + `#!/usr/bin/env node +const fs = require("node:fs"); +if (process.argv[2] === "diff") process.exit(1); +if (process.argv[2] === "commit") { + for (const path of ["SKILL.md", "references/auth.md"]) { + const content = fs.readFileSync(${JSON.stringify(skill)} + "/" + path, "utf8"); + if (!content.includes("version: 0.48.0-dev.0")) process.exit(2); + } +} +fs.appendFileSync("git-commands", process.argv[2] + "\\n"); +` + ); + chmodSync(join(bin, "npm"), 0o755); + chmodSync(join(bin, "git"), 0o755); + + const result = spawnSync( + process.execPath, + ["--experimental-strip-types", script, "--post"], + { + cwd, + encoding: "utf8", + env: { + HOME: cwd, + PATH: `${bin}:${process.env.PATH ?? ""}`, + XDG_CONFIG_HOME: cwd, + }, + timeout: 15_000, + } + ); + + expect(result.status, result.stderr).toBe(0); + for (const path of ["SKILL.md", "references/auth.md"]) { + expect(readFileSync(join(cwd, skill, path), "utf8")).toContain( + "version: 0.48.0-dev.0" + ); + } + expect(readFileSync(join(cwd, "git-commands"), "utf8")).toBe( + "commit\npull\npush\n" + ); +}); diff --git a/packages/mcp-core/package.json b/packages/mcp-core/package.json index 8bbff8828..fbaf8d976 100644 --- a/packages/mcp-core/package.json +++ b/packages/mcp-core/package.json @@ -174,6 +174,7 @@ "@modelcontextprotocol/sdk": "catalog:", "@modelcontextprotocol/server": "catalog:", "@sentry/core": "catalog:", + "@sentry/toolkit-core": "workspace:*", "ai": "catalog:", "dotenv": "catalog:", "fast-png": "^8.0.0", diff --git a/packages/mcp-core/src/api-client/client.test.ts b/packages/mcp-core/src/api-client/client.test.ts index 18be73abf..3587bc0d2 100644 --- a/packages/mcp-core/src/api-client/client.test.ts +++ b/packages/mcp-core/src/api-client/client.test.ts @@ -10,6 +10,55 @@ import { parseSentryUrl } from "../internal/url-helpers"; import { SentryApiService } from "./client"; import { ApiNotFoundError, ApiServerError } from "./errors"; +describe("API bearer token validation", () => { + it("removes edge padding before sending a request", async () => { + let authorization: string | null = null; + mswServer.use( + http.get( + "https://sentry.example.com/api/0/organizations/", + ({ request }) => { + authorization = request.headers.get("Authorization"); + return HttpResponse.json([]); + }, + ), + ); + + const api = new SentryApiService({ + host: "sentry.example.com", + accessToken: " \tvalid-token\x7f ", + }); + await api.listOrganizations(); + expect(authorization).toBe("Bearer valid-token"); + }); + + it("rejects a malformed credential before sending it or disclosing its value", async () => { + let requests = 0; + mswServer.use( + http.get("https://sentry.example.com/api/0/organizations/", () => { + requests += 1; + return HttpResponse.json([]); + }), + ); + const api = new SentryApiService({ + host: "sentry.example.com", + accessToken: "valid\nsecret", + }); + + const error = await api.listOrganizations().catch((cause: unknown) => cause); + expect(error).toBeInstanceOf(ConfigurationError); + expect(String(error)).toContain("Malformed authentication token"); + expect(String(error)).not.toContain("valid\nsecret"); + expect(requests).toBe(0); + + const emptyTokenApi = new SentryApiService({ + host: "sentry.example.com", + accessToken: "", + }); + await expect(emptyTokenApi.listOrganizations()).rejects.toThrow(ConfigurationError); + expect(requests).toBe(0); + }); +}); + describe("single-tenant web URLs", () => { const api = new SentryApiService({ host: "tenant.my.sentry.io" }); const baseUrl = "https://tenant.my.sentry.io/organizations/product-org"; diff --git a/packages/mcp-core/src/api-client/client.ts b/packages/mcp-core/src/api-client/client.ts index 115a3687c..4533b7a76 100644 --- a/packages/mcp-core/src/api-client/client.ts +++ b/packages/mcp-core/src/api-client/client.ts @@ -1,3 +1,4 @@ +import { normalizeAuthToken } from "@sentry/toolkit-core/auth-token"; import { z } from "zod"; import { DEFAULT_SEARCH_ISSUES_PERIOD } from "../constants"; import { ConfigurationError } from "../errors"; @@ -126,8 +127,6 @@ import type { AlertRuleUpdate, AutofixRun, AutofixRunState, - SearchAgentStart, - SearchAgentState, ClientKey, ClientKeyList, CommitList, @@ -170,6 +169,8 @@ import type { ReplayDetails, ReplayList, ReplayRecordingSegments, + SearchAgentStart, + SearchAgentState, SentryAppComponentList, SentryAppExternalRequestOptions, SentryAppInstallationList, @@ -794,8 +795,12 @@ export class SentryApiService { "Content-Type": "application/json", "User-Agent": USER_AGENT, }; - if (this.accessToken) { - headers.Authorization = `Bearer ${this.accessToken}`; + if (this.accessToken !== null) { + const token = normalizeAuthToken(this.accessToken); + if (token === null) { + throw new ConfigurationError("Malformed authentication token"); + } + headers.Authorization = `Bearer ${token}`; } if (this.clientId) { headers["X-Sentry-MCP-Client-Id"] = this.clientId; diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json index c28e2ec99..a54ee8bed 100644 --- a/packages/mcp-server/package.json +++ b/packages/mcp-server/package.json @@ -61,6 +61,7 @@ "@sentry/mcp-core": "workspace:*", "@sentry/mcp-server-mocks": "workspace:*", "@sentry/mcp-server-tsconfig": "workspace:*", + "@sentry/toolkit-core": "workspace:*", "@types/node": "catalog:", "tsdown": "catalog:", "tsx": "catalog:", diff --git a/packages/mcp-server/src/auth/device-code-flow.ts b/packages/mcp-server/src/auth/device-code-flow.ts index bdaa2b8c1..f01e0b97e 100644 --- a/packages/mcp-server/src/auth/device-code-flow.ts +++ b/packages/mcp-server/src/auth/device-code-flow.ts @@ -1,6 +1,10 @@ import { exec } from "node:child_process"; import * as fs from "node:fs"; import { LIB_VERSION } from "@sentry/mcp-core/version"; +import { + deviceCodeRequestBody, + deviceTokenRequestBody, +} from "@sentry/toolkit-core/oauth-device"; import { DEVICE_CODE_ENDPOINT, DEVICE_CODE_SCOPES, @@ -8,12 +12,12 @@ import { TOKEN_ENDPOINT, } from "./constants"; import { - DeviceCodeResponseSchema, DeviceCodeErrorSchema, - TokenResponseSchema, - getTokenUserLabel, type DeviceCodeResponse, + DeviceCodeResponseSchema, + getTokenUserLabel, type TokenResponse, + TokenResponseSchema, } from "./types"; const USER_AGENT = `sentry-mcp-server/${LIB_VERSION}`; @@ -40,10 +44,7 @@ export async function requestDeviceCode( "Content-Type": "application/x-www-form-urlencoded", "User-Agent": USER_AGENT, }, - body: new URLSearchParams({ - client_id: clientId, - scope: scopes, - }), + body: deviceCodeRequestBody(clientId, scopes), }); if (!resp.ok) { @@ -87,11 +88,7 @@ export async function pollForToken({ "Content-Type": "application/x-www-form-urlencoded", "User-Agent": USER_AGENT, }, - body: new URLSearchParams({ - grant_type: "urn:ietf:params:oauth:grant-type:device_code", - device_code: deviceCode, - client_id: clientId, - }), + body: deviceTokenRequestBody(clientId, deviceCode), }); if (resp.ok) { diff --git a/packages/toolkit-core/.gitignore b/packages/toolkit-core/.gitignore new file mode 100644 index 000000000..2edb758fe --- /dev/null +++ b/packages/toolkit-core/.gitignore @@ -0,0 +1 @@ +tests.junit.xml diff --git a/packages/toolkit-core/README.md b/packages/toolkit-core/README.md new file mode 100644 index 000000000..c51929d85 --- /dev/null +++ b/packages/toolkit-core/README.md @@ -0,0 +1,8 @@ +# Toolkit core + +Pure authentication protocol helpers shared by the CLI and MCP. Both product +builds bundle this private workspace package into their artifacts. + +The shared code validates opaque bearer tokens and constructs OAuth device-flow +form bodies. Each product retains its own credential storage, host trust checks, +HTTP transport, response validation, and user-facing error types. diff --git a/packages/toolkit-core/package.json b/packages/toolkit-core/package.json new file mode 100644 index 000000000..1963a8b5e --- /dev/null +++ b/packages/toolkit-core/package.json @@ -0,0 +1,28 @@ +{ + "name": "@sentry/toolkit-core", + "version": "0.1.0", + "private": true, + "type": "module", + "engines": { + "node": ">=22.13" + }, + "exports": { + "./auth-token": { + "types": "./src/auth-token.ts", + "default": "./src/auth-token.ts" + }, + "./oauth-device": { + "types": "./src/oauth-device.ts", + "default": "./src/oauth-device.ts" + } + }, + "scripts": { + "test": "vitest run", + "test:ci": "vitest run --reporter=default --reporter=junit --outputFile=tests.junit.xml", + "tsc": "tsc --noEmit" + }, + "devDependencies": { + "typescript": "catalog:", + "vitest": "catalog:" + } +} diff --git a/packages/toolkit-core/src/auth-token.test.ts b/packages/toolkit-core/src/auth-token.test.ts new file mode 100644 index 000000000..05d905e41 --- /dev/null +++ b/packages/toolkit-core/src/auth-token.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from "vitest"; +import { normalizeAuthToken, trimAuthToken } from "./auth-token"; + +describe("Sentry bearer credentials", () => { + it("preserves every visible ASCII byte through edge normalization", () => { + const visible = Array.from({ length: 94 }, (_, index) => + String.fromCharCode(index + 0x21), + ).join(""); + expect(normalizeAuthToken(`\x00 \u00a0${visible}\t\x7f`)).toBe(visible); + expect(normalizeAuthToken(visible)).toBe(visible); + }); + + it("never removes invalid bytes from inside a credential", () => { + for (const code of [0, 9, 10, 32, 127, 128, 255]) { + const value = `before${String.fromCharCode(code)}after`; + expect(trimAuthToken(value)).toBe(value); + expect(normalizeAuthToken(value)).toBeNull(); + } + expect(normalizeAuthToken(" \t\x00 ")).toBeNull(); + expect(normalizeAuthToken("é")).toBeNull(); + }); +}); diff --git a/packages/toolkit-core/src/auth-token.ts b/packages/toolkit-core/src/auth-token.ts new file mode 100644 index 000000000..59f6c24b1 --- /dev/null +++ b/packages/toolkit-core/src/auth-token.ts @@ -0,0 +1,25 @@ +/** A valid bearer credential contains only visible ASCII bytes. */ +const INVALID_TOKEN_CHARACTER_PATTERN = /[^\x21-\x7e]/; +// biome-ignore lint/suspicious/noControlCharactersInRegex: copied ASCII controls are removable edge padding. +const TOKEN_PADDING_PATTERN = /[\s\x00-\x1f\x7f]/; + +/** Strip padding at the edges without changing bytes within the token. */ +export function trimAuthToken(token: string): string { + let start = 0; + let end = token.length; + while (start < end && TOKEN_PADDING_PATTERN.test(token.charAt(start))) { + start += 1; + } + while (end > start && TOKEN_PADDING_PATTERN.test(token.charAt(end - 1))) { + end -= 1; + } + return token.slice(start, end); +} + +/** Return null for invalid input so each caller can preserve its own error type. */ +export function normalizeAuthToken(token: string): string | null { + const normalized = trimAuthToken(token); + return normalized && !INVALID_TOKEN_CHARACTER_PATTERN.test(normalized) + ? normalized + : null; +} diff --git a/packages/toolkit-core/src/oauth-device.test.ts b/packages/toolkit-core/src/oauth-device.test.ts new file mode 100644 index 000000000..768763001 --- /dev/null +++ b/packages/toolkit-core/src/oauth-device.test.ts @@ -0,0 +1,20 @@ +import { expect, it } from "vitest"; +import { deviceCodeRequestBody, deviceTokenRequestBody } from "./oauth-device"; + +it("encodes the client, scope, and device code as form fields", () => { + const clientId = "client & id"; + const scope = "project:read org:read"; + const deviceCode = "device + / code"; + const code = deviceCodeRequestBody(clientId, scope); + const token = deviceTokenRequestBody(clientId, deviceCode); + + expect([...code]).toEqual([ + ["client_id", clientId], + ["scope", scope], + ]); + expect([...token]).toEqual([ + ["client_id", clientId], + ["device_code", deviceCode], + ["grant_type", "urn:ietf:params:oauth:grant-type:device_code"], + ]); +}); diff --git a/packages/toolkit-core/src/oauth-device.ts b/packages/toolkit-core/src/oauth-device.ts new file mode 100644 index 000000000..70b825fa2 --- /dev/null +++ b/packages/toolkit-core/src/oauth-device.ts @@ -0,0 +1,18 @@ +/** RFC 8628 device-authorization request bodies shared by CLI and MCP. */ +export function deviceCodeRequestBody( + clientId: string, + scope: string, +): URLSearchParams { + return new URLSearchParams({ client_id: clientId, scope }); +} + +export function deviceTokenRequestBody( + clientId: string, + deviceCode: string, +): URLSearchParams { + return new URLSearchParams({ + client_id: clientId, + device_code: deviceCode, + grant_type: "urn:ietf:params:oauth:grant-type:device_code", + }); +} diff --git a/packages/toolkit-core/tsconfig.json b/packages/toolkit-core/tsconfig.json new file mode 100644 index 000000000..741fa77f1 --- /dev/null +++ b/packages/toolkit-core/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "noEmit": true, + "skipLibCheck": true + }, + "include": ["src/**/*.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8c5e4f64..cfe75f253 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -301,6 +301,9 @@ importers: '@sentry/symbolic': specifier: 13.7.0 version: 13.7.0 + '@sentry/toolkit-core': + specifier: workspace:* + version: link:../toolkit-core '@spotlightjs/spotlight': specifier: ^4.11.7 version: 4.11.8(@cfworker/json-schema@4.1.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(hono-rate-limiter@0.4.2(hono@4.13.8)) @@ -608,6 +611,9 @@ importers: '@sentry/core': specifier: 'catalog:' version: 11.1.0 + '@sentry/toolkit-core': + specifier: workspace:* + version: link:../toolkit-core ai: specifier: 'catalog:' version: 6.0.64(zod@4.4.3) @@ -673,6 +679,9 @@ importers: '@sentry/mcp-server-tsconfig': specifier: workspace:* version: link:../mcp-server-tsconfig + '@sentry/toolkit-core': + specifier: workspace:* + version: link:../toolkit-core '@types/node': specifier: 'catalog:' version: 22.16.0 @@ -810,6 +819,15 @@ importers: specifier: 'catalog:' version: 4.1.11(@opentelemetry/api@1.9.1)(@types/node@22.16.0)(@vitest/coverage-v8@4.1.11)(msw@2.10.2(@types/node@22.16.0)(typescript@5.9.3))(vite@8.3.0(@types/node@22.16.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0)) + packages/toolkit-core: + devDependencies: + typescript: + specifier: 'catalog:' + version: 5.8.3 + vitest: + specifier: 'catalog:' + version: 4.1.11(@opentelemetry/api@1.9.1)(@types/node@24.13.5)(@vitest/coverage-v8@4.1.11)(msw@2.10.2(@types/node@24.13.5)(typescript@5.8.3))(vite@8.3.0(@types/node@24.13.5)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0)) + packages: '@a2a-js/sdk@0.3.14':