Skip to content
1 change: 1 addition & 0 deletions docs/src/content/docs/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ cli/
│ │ ├── dashboard/ # add, create, delete, edit, list, restore, revisions, view
│ │ ├── debug-files/ # bundle-jvm, bundle-sources, check, find, print-sources, upload
│ │ ├── event/ # list, send, view
│ │ ├── feedback/ # list, view
│ │ ├── issue/ # archive, events, explain, list, merge, plan, resolve, unresolve, view
│ │ ├── local/ # run, serve
│ │ ├── log/ # list, view
Expand Down
62 changes: 62 additions & 0 deletions docs/src/fragments/commands/feedback.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
## Examples

### List User Feedback

Modern User Feedback is stored as Feedback issues. The command always limits
issue searches to `issue.category:feedback`; it does not use the legacy User
Reports API.

```bash
# Auto-detect the organization from the current project
sentry feedback list

# List Feedback for one project
sentry feedback list my-org/frontend

# List Feedback across every project in an organization
sentry feedback list my-org/

# Search for a project across accessible organizations
sentry feedback list frontend
```

The unresolved inbox from the last 14 days is shown by default. Select another
mailbox or expand the time range with flags:

```bash
sentry feedback list my-org/frontend --status resolved
sentry feedback list my-org/frontend --status spam
sentry feedback list my-org/frontend --status all --period 90d
sentry feedback list my-org/frontend --query "message:*checkout*"
```

Use `--json` for the standard paginated envelope. Navigate pages in either
direction with `--cursor next` and `--cursor prev`.

### View User Feedback

```bash
# Most recent unresolved Feedback, with detected or explicit organization
sentry feedback view @latest
sentry feedback view my-org/@latest

# Short ID or numeric ID
sentry feedback view FRONTEND-2SDJ
sentry feedback view 5146636313

# Explicit organization
sentry feedback view my-org/FRONTEND-2SDJ

# `view` is the default command; `show` is an alias
sentry feedback my-org/FRONTEND-2SDJ
sentry feedback show my-org/FRONTEND-2SDJ

# Open the Feedback item in Sentry
sentry feedback view my-org/FRONTEND-2SDJ --web
```

`@latest` selects the most recently active unresolved Feedback.

The detail view includes the complete message and, when available, its latest
event, linked error, Session Replays, and attachment metadata. If the supplied
ID belongs to another issue category, use `sentry issue view` instead.
9 changes: 9 additions & 0 deletions plugins/sentry-cli/skills/sentry-cli/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,15 @@ Query aggregate event data (Explore)

→ Full flags and examples: `references/explore.md`

### Feedback

Search and inspect User Feedback

- `sentry feedback list <org/project>` — List and search User Feedback
- `sentry feedback view <feedback>` — View a User Feedback item

→ Full flags and examples: `references/feedback.md`

### Log

View Sentry logs
Expand Down
137 changes: 137 additions & 0 deletions plugins/sentry-cli/skills/sentry-cli/references/feedback.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
---
name: sentry-cli-feedback
version: 0.39.0-dev.0
description: Search and inspect User Feedback
requires:
bins: ["sentry"]
auth: true
---

# Feedback Commands

Search and inspect User Feedback

### `sentry feedback list <org/project>`

List and search User Feedback

**Flags:**
- `--status <value> - Mailbox: unresolved, resolved, spam, or all - (default: "unresolved")`
- `-n, --limit <value> - Number of feedback items (1-1000) - (default: "25")`
- `-q, --query <value> - Search query (Sentry issue search syntax)`
- `-t, --period <value> - Time range: "7d", "2026-06-01..2026-07-01", ">=2026-06-01" - (default: "14d")`
- `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data`
- `-c, --cursor <value> - Navigate pages: "next", "prev", "first" (or raw cursor string)`

**JSON Fields** (use `--json --fields` to select specific fields):

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Numeric issue ID |
| `shortId` | string | Human-readable short ID (e.g. PROJ-ABC) |
| `title` | string | Issue title |
| `culprit` | string \| null | Culprit string |
| `count` | string | Total event count |
| `userCount` | number | Number of affected users |
| `firstSeen` | string \| null | First occurrence (ISO 8601) |
| `lastSeen` | string \| null | Most recent occurrence (ISO 8601) |
| `level` | string | Severity level |
| `status` | string | Issue status |
| `permalink` | string | URL to the issue in Sentry |
| `project` | object | Project info |
| `metadata` | object | Feedback metadata |
| `assignedTo` | object \| null | Assigned user or team |
| `priority` | string | Triage priority |
| `platform` | string | Platform |
| `substatus` | string \| null | Issue substatus |
| `isUnhandled` | boolean | Whether the issue is unhandled |
| `seerFixabilityScore` | number \| null | Seer AI fixability score (0-1) |
| `issueCategory` | string | Issue category discriminator |
| `issueType` | string | Issue type discriminator |
| `hasSeen` | boolean | Whether the feedback has been read |
| `latestEventHasAttachments` | boolean | Whether the latest event has attachments |

**Examples:**

```bash
# Auto-detect the organization from the current project
sentry feedback list

# List Feedback for one project
sentry feedback list my-org/frontend

# List Feedback across every project in an organization
sentry feedback list my-org/

# Search for a project across accessible organizations
sentry feedback list frontend

sentry feedback list my-org/frontend --status resolved
sentry feedback list my-org/frontend --status spam
sentry feedback list my-org/frontend --status all --period 90d
sentry feedback list my-org/frontend --query "message:*checkout*"
```

### `sentry feedback view <feedback>`

View a User Feedback item

**Flags:**
- `-w, --web - Open in browser`
- `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data`

**JSON Fields** (use `--json --fields` to select specific fields):

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Numeric issue ID |
| `shortId` | string | Human-readable short ID (e.g. PROJ-ABC) |
| `title` | string | Issue title |
| `culprit` | string \| null | Culprit string |
| `count` | string | Total event count |
| `userCount` | number | Number of affected users |
| `firstSeen` | string \| null | First occurrence (ISO 8601) |
| `lastSeen` | string \| null | Most recent occurrence (ISO 8601) |
| `level` | string | Severity level |
| `status` | string | Issue status |
| `permalink` | string | URL to the issue in Sentry |
| `project` | object | Project info |
| `metadata` | object | Feedback metadata |
| `assignedTo` | object \| null | Assigned user or team |
| `priority` | string | Triage priority |
| `platform` | string | Platform |
| `substatus` | string \| null | Issue substatus |
| `isUnhandled` | boolean | Whether the issue is unhandled |
| `seerFixabilityScore` | number \| null | Seer AI fixability score (0-1) |
| `issueCategory` | string | Issue category discriminator |
| `issueType` | string | Issue type discriminator |
| `hasSeen` | boolean | Whether the feedback has been read |
| `latestEventHasAttachments` | boolean | Whether the latest event has attachments |
| `org` | string \| null | Organization slug |
| `event` | unknown \| null | Latest feedback event |
| `replayIds` | array | Related Session Replay IDs |
| `attachments` | array | Attachments on the latest feedback event |

**Examples:**

```bash
# Most recent unresolved Feedback, with detected or explicit organization
sentry feedback view @latest
sentry feedback view my-org/@latest

# Short ID or numeric ID
sentry feedback view FRONTEND-2SDJ
sentry feedback view 5146636313

# Explicit organization
sentry feedback view my-org/FRONTEND-2SDJ

# `view` is the default command; `show` is an alias
sentry feedback my-org/FRONTEND-2SDJ
sentry feedback show my-org/FRONTEND-2SDJ

# Open the Feedback item in Sentry
sentry feedback view my-org/FRONTEND-2SDJ --web
```

All commands also support `--json`, `--fields`, `--help`, `--log-level`, and `--verbose` flags.
2 changes: 2 additions & 0 deletions src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { debugFilesRoute } from "./commands/debug-files/index.js";
import { eventRoute } from "./commands/event/index.js";
import { listCommand as eventListCommand } from "./commands/event/list.js";
import { exploreCommand } from "./commands/explore.js";
import { feedbackRoute } from "./commands/feedback/index.js";
import { helpCommand } from "./commands/help.js";
import { infoCommand } from "./commands/info.js";
import { initCommand } from "./commands/init.js";
Expand Down Expand Up @@ -119,6 +120,7 @@ export const routes = buildRouteMap({
event: eventRoute,
events: eventListCommand,
explore: exploreCommand,
feedback: feedbackRoute,
log: logRoute,
monitor: monitorRoute,
snapshots: snapshotsRoute,
Expand Down
26 changes: 26 additions & 0 deletions src/commands/feedback/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* sentry feedback
*
* Search and inspect modern Sentry User Feedback.
*/

import { buildRouteMap } from "../../lib/route-map.js";
import { listCommand } from "./list.js";
import { viewCommand } from "./view.js";

export const feedbackRoute = buildRouteMap({
routes: {
list: listCommand,
view: viewCommand,
},
defaultCommand: "view",
docs: {
brief: "Search and inspect User Feedback",
fullDescription:
"Search and inspect modern User Feedback from your Sentry organization.\n\n" +
"Commands:\n" +
" list List and search feedback\n" +
" view View feedback with its latest event context",
hideRoute: {},
},
});
Loading
Loading