feedbackbasket-cli 3.0.0 → 3.2.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.
- package/CHANGELOG.md +301 -274
- package/README.md +342 -336
- package/dist/src/auth/login.d.ts +4 -3
- package/dist/src/auth/login.js +70 -43
- package/dist/src/capabilities.d.ts +4 -0
- package/dist/src/client.d.ts +7 -1
- package/dist/src/client.js +21 -12
- package/dist/src/commands/auth.d.ts +9 -3
- package/dist/src/commands/auth.js +100 -93
- package/dist/src/commands/feedback-bulk-update.js +21 -5
- package/dist/src/commands/feedback-create.js +26 -3
- package/dist/src/commands/feedback-update.js +26 -2
- package/dist/src/commands/feedback.js +30 -9
- package/dist/src/types.d.ts +7 -0
- package/dist/src/version.d.ts +1 -1
- package/package.json +54 -54
- package/skills/feedbackbasket/SKILL.md +413 -378
|
@@ -1,406 +1,441 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: feedbackbasket
|
|
3
|
-
description: Manage FeedbackBasket projects, feedback, bugs, website widgets, mobile app feedback, waitlist capture, and teams from the command line. Use whenever an agent needs to configure FeedbackBasket in a web or mobile app, install its Swift SDK or hosted mobile form, collect feedback or waitlist signups, query feedback, or manage a FeedbackBasket project.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# FeedbackBasket CLI
|
|
7
|
-
|
|
1
|
+
---
|
|
2
|
+
name: feedbackbasket
|
|
3
|
+
description: Manage FeedbackBasket projects, feedback, bugs, website widgets, mobile app feedback, waitlist capture, and teams from the command line. Use whenever an agent needs to configure FeedbackBasket in a web or mobile app, install its Swift SDK or hosted mobile form, collect feedback or waitlist signups, query feedback, or manage a FeedbackBasket project.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# FeedbackBasket CLI
|
|
7
|
+
|
|
8
8
|
Full command-line interface for managing feedback, waitlist signups, bug reports, projects, widgets, and teams in FeedbackBasket. Works with any AI agent that can run shell commands.
|
|
9
9
|
|
|
10
|
-
The unified agent surface version is `3.
|
|
11
|
-
|
|
12
|
-
## Authentication
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
feedbackbasket login #
|
|
16
|
-
feedbackbasket login --manual # No localhost browser callback (remote servers)
|
|
17
|
-
feedbackbasket login --token <TOKEN> # Manual token (CI/headless)
|
|
18
|
-
feedbackbasket auth status # Check auth state
|
|
19
|
-
feedbackbasket doctor # Full diagnostics
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
| `--
|
|
30
|
-
| `--
|
|
31
|
-
|
|
10
|
+
The unified agent surface version is `3.2.0`. It has 31 product operations. The CLI, stdio MCP package, and live Streamable HTTP MCP server implement the same contract.
|
|
11
|
+
|
|
12
|
+
## Authentication
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
feedbackbasket login # Browser selects Read or Full access
|
|
16
|
+
feedbackbasket login --manual # No localhost browser callback (remote servers)
|
|
17
|
+
feedbackbasket login --token <TOKEN> # Manual token (CI/headless)
|
|
18
|
+
feedbackbasket auth status # Check auth state
|
|
19
|
+
feedbackbasket doctor # Full diagnostics
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The browser selects the organization, Read or Full access, and Selected projects or All projects. Read is the default. Full needs an explicit choice and an owner or administrator role. `--scope read|full` sets the maximum browser access. It does not make the final choice. Selected projects limits the credential to the projects that the user approves. All projects includes current and future projects and is required for project creation and team operations.
|
|
23
|
+
|
|
24
|
+
## Output Modes
|
|
25
|
+
|
|
26
|
+
| Flag | Output | When to Use |
|
|
27
|
+
| --------- | ------------------------------ | ------------------- |
|
|
28
|
+
| (none) | Styled (TTY) or JSON (piped) | Auto-detect |
|
|
29
|
+
| `--json` | JSON envelope with breadcrumbs | Parse full response |
|
|
30
|
+
| `--agent` | Raw JSON data only | Agent automation |
|
|
31
|
+
| `--quiet` | Raw JSON data only | Scripting |
|
|
32
|
+
| `--md` | Markdown | Documentation |
|
|
33
|
+
|
|
32
34
|
**Agent rule**: Always use `--agent` for programmatic access. Parse the JSON output directly.
|
|
33
35
|
|
|
34
36
|
## MCP Workflow Selection
|
|
35
37
|
|
|
36
|
-
Use the CLI when the agent has shell access and an existing CLI login. Use MCP when the host supports MCP tools.
|
|
38
|
+
Use the CLI when the agent has shell access and an existing CLI login. Use MCP when the host supports MCP tools.
|
|
39
|
+
|
|
40
|
+
For remote MCP, add `https://feedbackbasket.com/.well-known/mcp` to the host. Save it, select **Authenticate**, sign in, select an organization, select Read or Full access, select Selected projects or All projects, and select **Allow**. Browser OAuth is the recommended remote setup. Do not ask the user to paste an OAuth token.
|
|
41
|
+
|
|
42
|
+
For local STDIO MCP, CI, servers, or unattended automation, use `feedbackbasket-mcp-server@3.2.0` with an `fb_key_` credential from the host credential store or an environment variable. Browser OAuth is only for Streamable HTTP. STDIO still uses an environment credential. The CLI keeps `feedbackbasket login` and its private `fb_cli_` token flow in this release.
|
|
37
43
|
|
|
38
|
-
CLI
|
|
44
|
+
Access tokens, refresh tokens, CLI tokens, and MCP keys are private and are not interchangeable. Never put a credential in source, command arguments, logs, prompts, snapshots, generated files, or final responses. Use browser OAuth, the host credential store, or an environment variable as applicable.
|
|
39
45
|
|
|
40
|
-
|
|
46
|
+
Read credentials can use read operations only. Full credentials can use writes that their scopes permit. A Selected-projects credential can access only its approved projects. Project creation and team operations need Full access and All projects. Existing unrestricted full keys remain compatible. New browser grants never get All-projects access without an explicit choice. If a write is denied, do not try a different security path. Ask the user for the required access.
|
|
41
47
|
|
|
42
48
|
High-impact operations need explicit approval. MCP calls must include `confirm: true`. CLI agent or machine commands must include `--yes`. These rules apply to project deletion, feedback deletion, bulk feedback updates, note deletion, replies, mobile key rotation, team role changes, and team removal.
|
|
43
|
-
|
|
44
|
-
## Quick Reference
|
|
45
|
-
|
|
46
|
-
### Projects
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
feedbackbasket projects
|
|
50
|
-
feedbackbasket projects
|
|
51
|
-
feedbackbasket projects
|
|
52
|
-
feedbackbasket projects update <name-or-id> --
|
|
53
|
-
feedbackbasket projects
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
feedbackbasket mobile
|
|
77
|
-
feedbackbasket mobile setup <project> --bundle-id com.example.app --
|
|
78
|
-
feedbackbasket mobile
|
|
79
|
-
feedbackbasket mobile bundle-ids <project> --
|
|
80
|
-
feedbackbasket mobile
|
|
81
|
-
feedbackbasket mobile conversations <project> --
|
|
82
|
-
feedbackbasket mobile
|
|
83
|
-
feedbackbasket mobile
|
|
84
|
-
feedbackbasket mobile
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
feedbackbasket feedback
|
|
131
|
-
feedbackbasket feedback search "
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
feedbackbasket feedback
|
|
135
|
-
|
|
49
|
+
|
|
50
|
+
## Quick Reference
|
|
51
|
+
|
|
52
|
+
### Projects
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
feedbackbasket projects list
|
|
56
|
+
feedbackbasket projects show <name-or-id>
|
|
57
|
+
feedbackbasket projects create "My App" --url https://myapp.com --description "..."
|
|
58
|
+
feedbackbasket projects update <name-or-id> --name "New Name" --url <url> --description "..."
|
|
59
|
+
feedbackbasket projects update <name-or-id> --reply-to vlad@example.com # default reply-to for feedback replies
|
|
60
|
+
feedbackbasket projects delete <name-or-id> --yes
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
All project commands accept **name or ID**. Names are matched case-insensitively with fuzzy suggestions on typos.
|
|
64
|
+
|
|
65
|
+
**Project selection rule for widget installs:** when the user asks to add a FeedbackBasket widget, bubble, popup, modal, or feedback button to the current app, first resolve the FeedbackBasket project for this app. Do not use the CLI default project just because one is configured.
|
|
66
|
+
|
|
67
|
+
1. Identify the current app's real website URL or intended public URL from the user, app config, docs, or existing FeedbackBasket embed code.
|
|
68
|
+
2. Run `feedbackbasket projects list --agent` and look for an existing project whose `url` matches that site or whose name clearly matches the current app.
|
|
69
|
+
3. If exactly one project matches, use that project ID/name for `widget settings`, `widget script`, and feedback commands.
|
|
70
|
+
4. If multiple projects could match, ask the user which one to use.
|
|
71
|
+
5. If no project matches, ask whether to create a new project for this app, then create it with the confirmed real URL. Do not create a project from a localhost URL unless the user explicitly wants a local-only test project.
|
|
72
|
+
|
|
73
|
+
**Project URL rule for agents:** confirm the real website URL before creating or updating a project. Never use `localhost`, `127.0.0.1`, `0.0.0.0`, `::1`, or a local dev server URL unless the user explicitly says the project is only for local testing. If the repo only exposes a local URL, ask for the production, staging, preview, or intended public URL. Do not guess a public domain from package names, git remotes, or environment variables. For an explicitly local-only test project, pass `--allow-local-url`.
|
|
74
|
+
|
|
75
|
+
**Capture-mode decision:** if the user asks for feedback, a feedback bubble, bug reports, or feature requests, use `--capture-mode feedback`. If they ask for a waitlist, launch list, early access, or email capture, use `--capture-mode waitlist`. If they ask to set up FeedbackBasket without choosing, explain both options and ask which they want. Do not switch an existing project without confirmation because only one capture mode is active at a time.
|
|
76
|
+
|
|
77
|
+
**Mobile project selection rule:** resolve the FeedbackBasket project for the current app before running mobile commands. Prefer a clearly matching existing project name or product URL. If multiple projects are plausible, ask the user. If none exists, confirm a real product, support, marketing, or App Store URL before creating one; do not invent a URL or use a local development address.
|
|
78
|
+
|
|
79
|
+
### Mobile App Feedback
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
feedbackbasket mobile status <project> --agent
|
|
83
|
+
feedbackbasket mobile setup <project> --bundle-id com.example.app --agent
|
|
84
|
+
feedbackbasket mobile setup <project> --bundle-id com.example.app --include-publishable-key --agent
|
|
85
|
+
feedbackbasket mobile bundle-ids <project> --add com.example.app.beta --agent
|
|
86
|
+
feedbackbasket mobile bundle-ids <project> --remove com.example.app.beta --agent
|
|
87
|
+
feedbackbasket mobile conversations <project> --enable --agent
|
|
88
|
+
feedbackbasket mobile conversations <project> --disable --agent
|
|
89
|
+
feedbackbasket mobile verify <project> --bundle-id com.example.app --wait 120 --agent
|
|
90
|
+
feedbackbasket mobile disable <project> --yes --agent
|
|
91
|
+
feedbackbasket mobile rotate-key <project> --yes --include-publishable-key --agent
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
The `fb_mobile_` project key is a publishable, write-only identifier designed to ship in the app. It cannot read feedback or administer the project. It is still masked by default to reduce accidental disclosure in logs and transcripts. Use `--include-publishable-key` only while performing a mobile setup the user authorized, and never repeat the full value in the final response.
|
|
95
|
+
|
|
96
|
+
Never put an `fb_cli_` CLI token or `fb_key_` MCP/API key in application source, build settings, prompts, logs, or generated configuration. Those are private credentials and are not interchangeable with the publishable mobile key.
|
|
97
|
+
|
|
98
|
+
For SwiftUI apps targeting iOS 16 or later, use the Swift package returned by `mobile setup` and its native feedback sheet. For UIKit, use the package API or host the SwiftUI sheet. For React Native, Flutter, or unsupported stacks, use the returned hosted form URL in the app's existing in-app browser when available.
|
|
99
|
+
|
|
100
|
+
Configure the Swift package once at app startup with the returned publishable key:
|
|
101
|
+
|
|
102
|
+
```swift
|
|
103
|
+
import FeedbackBasket
|
|
104
|
+
|
|
105
|
+
FeedbackBasket.configure(
|
|
106
|
+
projectKey: "fb_mobile_returned_by_mobile_setup"
|
|
107
|
+
)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Present its standard SwiftUI sheet from the selected Settings, Help, or Support view:
|
|
111
|
+
|
|
112
|
+
```swift
|
|
113
|
+
@State private var showingFeedback = false
|
|
114
|
+
|
|
115
|
+
Button("Send feedback") {
|
|
116
|
+
showingFeedback = true
|
|
117
|
+
}
|
|
118
|
+
.feedbackBasketSheet(
|
|
119
|
+
isPresented: $showingFeedback,
|
|
120
|
+
context: ["screen": "Settings"]
|
|
121
|
+
)
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Use FeedbackBasket Swift SDK 0.3.0 or later. The SDK stores each submission's conversation credential in the app Keychain, shows an unread badge when the team replies, and keeps team and user messages in one thread. When mobile conversations are enabled, users answer inside that thread; never create a new feedback submission for a follow-up. Reply state refreshes when the SDK is configured, when the app enters the foreground, and when the sheet opens. This is not an APNs push notification while the app is closed. Do not build a separate inbox, polling client, or token store in the host app. Hosted-form integrations remain email-only.
|
|
125
|
+
|
|
126
|
+
Add an accessible Send feedback action to an appropriate existing Settings, Help, or Support screen. Attach only useful non-sensitive context. Do not send passwords, authentication tokens, payment information, private form contents, crash reports, analytics, session recordings, or automatic logs.
|
|
127
|
+
|
|
128
|
+
Treat a supplied project key as production unless the user explicitly confirms a staging key and base URL. Build and launch the app so the SDK can send its heartbeat, then use `mobile verify`; do not submit test feedback to production. A prior matching heartbeat is a valid connection result because the SDK throttles successful heartbeat attempts.
|
|
129
|
+
|
|
130
|
+
`mobile setup` is idempotent and adds bundle IDs without replacing existing entries. Do not rotate a key or disable mobile feedback unless the user explicitly requested that disruptive action. Rotation stops every released app using the previous key.
|
|
131
|
+
|
|
132
|
+
### Feedback
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# Read
|
|
136
|
+
feedbackbasket feedback list --project <id> --category BUG --status OPEN --sentiment NEGATIVE
|
|
137
|
+
feedbackbasket feedback list --search "login" --limit 50 --offset 0 --notes
|
|
138
|
+
feedbackbasket feedback list --status CLOSED --close-reason NOT_PLANNED
|
|
139
|
+
feedbackbasket feedback show <id>
|
|
140
|
+
feedbackbasket feedback search "crash on mobile" --project <id> --limit 10
|
|
141
|
+
|
|
142
|
+
# Write
|
|
143
|
+
feedbackbasket feedback create "Login button is broken" --content "Clicking Log in does nothing in Safari." --project <id> --type bug
|
|
144
|
+
feedbackbasket feedback create "Feature idea" --content "Let users export saved views." --project <id> --type feature --metadata source=agent
|
|
136
145
|
feedbackbasket feedback update <id> --status PLANNED --category BUG --sentiment NEGATIVE
|
|
137
146
|
feedbackbasket feedback note <id> "Investigating — appears related to auth flow"
|
|
138
147
|
feedbackbasket feedback note update <id> <note-id> --content "Updated internal note"
|
|
139
148
|
feedbackbasket feedback note delete <id> <note-id> --yes
|
|
140
149
|
feedbackbasket feedback delete <id> --yes
|
|
141
|
-
feedbackbasket feedback
|
|
142
|
-
|
|
143
|
-
|
|
150
|
+
feedbackbasket feedback update <id> --status CLOSED --close-reason NOT_PLANNED
|
|
151
|
+
feedbackbasket feedback update <id> --status CLOSED --close-reason OTHER --close-note "Reason for closing"
|
|
152
|
+
feedbackbasket feedback bulk-update --status CLOSED --close-reason NOT_ACTIONABLE --ids id1,id2,id3 --yes
|
|
153
|
+
|
|
154
|
+
# Reply to submitter by email, widget/in-app thread, or both
|
|
144
155
|
feedbackbasket feedback reply <id> "Thanks for reporting — we pushed a fix!" --delivery email --reply-to support@example.com --yes
|
|
145
156
|
feedbackbasket feedback reply <id> "<content>" --delivery widget --yes
|
|
146
157
|
feedbackbasket feedback reply <id> "<content>" --delivery in-app --yes
|
|
147
158
|
feedbackbasket feedback reply <id> "<content>" --delivery both --reply-to support@example.com --yes
|
|
148
|
-
feedbackbasket feedback replies <id> # show the complete conversation
|
|
149
|
-
|
|
150
|
-
# Export
|
|
151
|
-
feedbackbasket feedback export <project> --format csv
|
|
152
|
-
feedbackbasket feedback export <project> --format md
|
|
153
|
-
feedbackbasket feedback export <project> --format json
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### Bug Reports
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
feedbackbasket bugs
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
feedbackbasket widget settings <project>
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
feedbackbasket widget settings <project> --
|
|
176
|
-
feedbackbasket widget settings <project> --
|
|
177
|
-
feedbackbasket widget settings <project> --
|
|
178
|
-
feedbackbasket widget settings <project> --
|
|
179
|
-
feedbackbasket widget settings <project> --
|
|
180
|
-
feedbackbasket widget settings <project> --
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
feedbackbasket widget flow <project>
|
|
186
|
-
feedbackbasket widget flow <project> --
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
<
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
159
|
+
feedbackbasket feedback replies <id> # show the complete conversation
|
|
160
|
+
|
|
161
|
+
# Export
|
|
162
|
+
feedbackbasket feedback export <project> --format csv
|
|
163
|
+
feedbackbasket feedback export <project> --format md
|
|
164
|
+
feedbackbasket feedback export <project> --format json
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Bug Reports
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
feedbackbasket bugs list --severity high --status OPEN --project <id>
|
|
171
|
+
feedbackbasket bugs stats --project <id>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Widget
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# Get embed code (ready to paste into HTML)
|
|
178
|
+
feedbackbasket widget script <project>
|
|
179
|
+
|
|
180
|
+
# View settings
|
|
181
|
+
feedbackbasket widget settings <project>
|
|
182
|
+
feedbackbasket widget settings <project> --capture-mode waitlist
|
|
183
|
+
feedbackbasket widget settings <project> --capture-mode feedback
|
|
184
|
+
|
|
185
|
+
# Customize
|
|
186
|
+
feedbackbasket widget settings <project> --color "#22c55e" --label "Send Feedback"
|
|
187
|
+
feedbackbasket widget settings <project> --position bottom-left --display modal
|
|
188
|
+
feedbackbasket widget settings <project> --email-required --intro "How can we improve?"
|
|
189
|
+
feedbackbasket widget settings <project> --show-email --allow-attachments
|
|
190
|
+
feedbackbasket widget settings <project> --allow-visitor-replies
|
|
191
|
+
feedbackbasket widget settings <project> --no-allow-visitor-replies
|
|
192
|
+
feedbackbasket widget settings <project> --email-read-only --hide-email-when-prefilled
|
|
193
|
+
feedbackbasket widget settings <project> --error-tracking --allow-console-errors
|
|
194
|
+
|
|
195
|
+
# Guided feedback types and follow-up questions
|
|
196
|
+
feedbackbasket widget flow <project>
|
|
197
|
+
feedbackbasket widget flow <project> --enable # only when the user chooses guided feedback
|
|
198
|
+
feedbackbasket widget flow <project> --reset-default --enable # only when the user chooses guided feedback
|
|
199
|
+
feedbackbasket widget flow <project> --config ./feedback-flow.json
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Waitlist mode keeps the same project script and binds to the host app's own annotated form:
|
|
203
|
+
|
|
204
|
+
```html
|
|
205
|
+
<form data-feedbackbasket-waitlist>
|
|
206
|
+
<input name="name" autocomplete="name" />
|
|
207
|
+
<input name="email" type="email" autocomplete="email" required />
|
|
208
|
+
<button type="submit">Join the waitlist</button>
|
|
209
|
+
</form>
|
|
210
|
+
```
|
|
211
|
+
|
|
199
212
|
The form must be served from the website origin saved on the FeedbackBasket project. Email is required and name is optional. The script binds forms already on the page and forms added later, uses native browser validation, disables submit controls during the request, and keeps the host app's styling.
|
|
200
213
|
|
|
201
214
|
Use `data-feedbackbasket-state="loading|success|error"` for custom UI. The bubbling `feedbackbasket:waitlist:success` event includes `detail.email` and `detail.duplicate`; `feedbackbasket:waitlist:error` includes `detail.message` and `detail.status`. Do not add a competing submit handler. Repeat submissions for the same project and email update the existing signup rather than creating a duplicate.
|
|
202
|
-
|
|
203
|
-
### Waitlist Signups
|
|
204
|
-
|
|
205
|
-
```bash
|
|
206
|
-
feedbackbasket waitlist list <project>
|
|
207
|
-
feedbackbasket waitlist list <project> --search "@example.com" --limit 50 --offset 0
|
|
208
|
-
feedbackbasket waitlist list <project> --agent
|
|
209
|
-
feedbackbasket waitlist export <project>
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
Agent output includes signup emails, optional names, captured/referrer pages, total counts, active capture mode, and pagination. Use `waitlist export` for the same CSV export available in the dashboard.
|
|
213
|
-
|
|
214
|
-
For inline trigger mode, load the widget once and call the public API from the host app's custom button:
|
|
215
|
-
|
|
216
|
-
```html
|
|
217
|
-
<button
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
215
|
+
|
|
216
|
+
### Waitlist Signups
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
feedbackbasket waitlist list <project>
|
|
220
|
+
feedbackbasket waitlist list <project> --search "@example.com" --limit 50 --offset 0
|
|
221
|
+
feedbackbasket waitlist list <project> --agent
|
|
222
|
+
feedbackbasket waitlist export <project>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Agent output includes signup emails, optional names, captured/referrer pages, total counts, active capture mode, and pagination. Use `waitlist export` for the same CSV export available in the dashboard.
|
|
226
|
+
|
|
227
|
+
For inline trigger mode, load the widget once and call the public API from the host app's custom button:
|
|
228
|
+
|
|
229
|
+
```html
|
|
230
|
+
<button
|
|
231
|
+
onclick="window.FeedbackWidget.openFeedbackForm({ trigger: event.currentTarget })"
|
|
232
|
+
>
|
|
233
|
+
Feedback
|
|
234
|
+
</button>
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
In React:
|
|
238
|
+
|
|
239
|
+
```tsx
|
|
240
|
+
<button
|
|
241
|
+
onClick={(event) =>
|
|
242
|
+
window.FeedbackWidget.openFeedbackForm({ trigger: event.currentTarget })
|
|
243
|
+
}
|
|
244
|
+
>
|
|
245
|
+
Feedback
|
|
246
|
+
</button>
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Passing the trigger element lets popup mode open beside the custom button. Calling `window.FeedbackWidget.openFeedbackForm()` with no arguments still uses the configured widget position.
|
|
250
|
+
|
|
251
|
+
Use only the public `openFeedbackForm()` API from the snippet. Do not call internal or undocumented methods such as `open()`, `openModal()`, or direct modal element manipulation; those can exist in the widget bundle but are not stable integration points.
|
|
252
|
+
|
|
253
|
+
`email-read-only` and `hide-email-when-prefilled` control behavior only when the host app passes a runtime `userEmail` value. Do not store visitor emails in widget settings.
|
|
254
|
+
|
|
255
|
+
Use the basic widget experience by default: `displayMode` stays `modal`, and guided feedback stays disabled. Ask the user before switching to `popup` or enabling guided feedback. If the user does not care, keep modal + basic feedback.
|
|
256
|
+
|
|
257
|
+
`widget flow --config` accepts either a `feedbackFlow` object or a JSON object with a `feedbackFlow` key. Use it only when the user wants to customize visitor choices such as Bug report, Feature request, and General feedback. Supported v1 question types are `text`, `textarea`, and `single_choice`.
|
|
258
|
+
|
|
259
|
+
### Team
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
feedbackbasket team list
|
|
243
263
|
feedbackbasket team role <memberId> --role admin --yes
|
|
244
|
-
feedbackbasket team remove <memberId> --yes
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
### Utilities
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
feedbackbasket
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
feedbackbasket widget
|
|
265
|
-
#
|
|
266
|
-
|
|
267
|
-
# Optional,
|
|
268
|
-
# feedbackbasket widget
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
feedbackbasket feedback
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
--
|
|
287
|
-
--
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
--
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
264
|
+
feedbackbasket team remove <memberId> --yes
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Utilities
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
feedbackbasket doctor # Health check (auth, connectivity, skill)
|
|
271
|
+
feedbackbasket setup claude # Install this skill for Claude Code
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Common Agent Workflows
|
|
275
|
+
|
|
276
|
+
### Add a widget to the current app
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
# First resolve the project for this app. Do not rely on the CLI default project.
|
|
280
|
+
feedbackbasket projects list --agent
|
|
281
|
+
|
|
282
|
+
# If no existing project matches the current app's real URL/name, create one after confirming the URL.
|
|
283
|
+
feedbackbasket projects create "My App" --url https://myapp.com --agent
|
|
284
|
+
feedbackbasket widget script "My App" --agent
|
|
285
|
+
# Agent gets the embed code, adds it to the HTML
|
|
286
|
+
feedbackbasket widget settings "My App" --color "#22c55e" --label "Feedback" --agent
|
|
287
|
+
# Optional, when the user wants a waitlist instead of feedback capture
|
|
288
|
+
# feedbackbasket widget settings "My App" --capture-mode waitlist --agent
|
|
289
|
+
# Optional, only when requested: enable the guided wizard with Bug, Feature, and General templates
|
|
290
|
+
# feedbackbasket widget flow "My App" --reset-default --enable --agent
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Triage new feedback
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
feedbackbasket feedback list --status OPEN --agent
|
|
297
|
+
# Review items, then update:
|
|
298
|
+
feedbackbasket feedback update <id> --status UNDER_REVIEW --agent
|
|
299
|
+
feedbackbasket feedback note <id> "Reviewing — appears related to auth flow" --agent
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Capture new feedback without leaving the terminal
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
feedbackbasket feedback create "Login button is broken" \
|
|
306
|
+
--content "Clicking Log in does nothing in Safari." \
|
|
307
|
+
--project myapp \
|
|
308
|
+
--type bug \
|
|
309
|
+
--page-url https://example.com/login \
|
|
310
|
+
--metadata source=agent \
|
|
311
|
+
--agent
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
Agent mode returns the created feedback ID, dashboard URL, and feedback object. Created feedback is analyzed by AI and follows the project's notification settings.
|
|
315
|
+
|
|
316
|
+
### File agent-found issues in FeedbackBasket
|
|
317
|
+
|
|
318
|
+
When the user says "file this in FeedbackBasket", "log this bug", "create feedback for this issue", "add this to FeedbackBasket", or similar, create a concise feedback item for the issue the agent found.
|
|
319
|
+
|
|
320
|
+
Before creating the item, resolve the target project:
|
|
321
|
+
|
|
322
|
+
1. If the user explicitly names a FeedbackBasket project, use that project.
|
|
323
|
+
2. If the current repo/app clearly matches exactly one FeedbackBasket project name or project URL from `feedbackbasket projects list --agent`, use that project.
|
|
324
|
+
3. If the CLI default project clearly matches the current repo/app, use it.
|
|
325
|
+
4. If multiple projects are plausible, ask the user which FeedbackBasket project to file it under.
|
|
326
|
+
5. Do not silently guess the project when it is ambiguous.
|
|
327
|
+
|
|
328
|
+
Keep agent-filed feedback short and dashboard-friendly:
|
|
329
|
+
|
|
330
|
+
- Title: under 80 characters, action-oriented, no stack traces.
|
|
331
|
+
- Content: 1 to 3 short paragraphs, ideally under 600 characters, focused on the user-visible problem, expected behavior, and actual behavior.
|
|
332
|
+
- Do not paste long logs, full reasoning chains, or broad investigation notes into the body.
|
|
333
|
+
- Put structured context in metadata: `source=agent`, `found_by=<agent>`, `repo=<name>`, `branch=<branch>`, `route=<path>`, `file=<path>`, `severity=<low|medium|high>`, `test=<command>`.
|
|
334
|
+
|
|
335
|
+
Use:
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
feedbackbasket feedback create "<short title>" \
|
|
339
|
+
--content "<brief user-visible issue description>" \
|
|
340
|
+
--project <project-name-or-id> \
|
|
341
|
+
--type bug \
|
|
342
|
+
--metadata source=agent \
|
|
343
|
+
--metadata found_by=codex \
|
|
344
|
+
--agent
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
After creation, report the feedback ID and dashboard URL to the user.
|
|
348
|
+
|
|
349
|
+
### Investigate high-priority bugs
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
feedbackbasket bugs list --severity high --agent
|
|
353
|
+
feedbackbasket feedback show <id> --agent
|
|
354
|
+
# Response includes browser, OS, page URL, submitted feedback type, follow-up answers, attachment URLs, metadata, AI analysis, priority score
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### Close the loop — reply to the submitter
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
# Agent reads context, asks which delivery method to use, then sends it
|
|
361
|
+
feedbackbasket feedback show <id> --agent # read email, replyChannel, project.replyToEmail
|
|
335
362
|
feedbackbasket feedback reply <id> "<drafted response>" --delivery widget --yes --agent
|
|
336
363
|
feedbackbasket feedback reply <id> "<drafted response>" --delivery in-app --yes --agent
|
|
337
364
|
feedbackbasket feedback reply <id> "<drafted response>" --delivery email --reply-to support@example.com --yes --agent
|
|
338
365
|
feedbackbasket feedback reply <id> "<drafted response>" --delivery both --reply-to support@example.com --yes --agent
|
|
339
|
-
feedbackbasket feedback update <id> --status COMPLETE --agent
|
|
340
|
-
feedbackbasket feedback note <id> "Replied via CLI" --agent
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
-
|
|
346
|
-
- If
|
|
347
|
-
-
|
|
348
|
-
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
|
371
|
-
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
```
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
366
|
+
feedbackbasket feedback update <id> --status COMPLETE --agent
|
|
367
|
+
feedbackbasket feedback note <id> "Replied via CLI" --agent
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
**Important reply safety rules:**
|
|
371
|
+
|
|
372
|
+
- Before replying, the agent MUST inspect `feedback show --agent`, including `replyChannel` and `awaitingOwnerReply`, then ask the human which available delivery method to use unless the human already specified it in the current conversation.
|
|
373
|
+
- If `replyChannel: "in_app"`, use `--delivery in-app`. If `replyChannel: "widget"`, use `--delivery widget`. Use `--delivery both` only when an email address and a reply channel are both available.
|
|
374
|
+
- If `feedback show` returns `email: null`, do not use `--delivery email` or `--delivery both`. If `replyChannel: null`, do not use thread delivery.
|
|
375
|
+
- If the delivery includes email and `project.replyToEmail: null`, the agent MUST ask the human which reply-to email to use before sending. Do not use the account owner's email, token owner's email, or any remembered address without explicit confirmation in the current conversation.
|
|
376
|
+
- After the human confirms a reply-to address, pass it explicitly with `--reply-to <email>`, or set a project default first with `feedbackbasket projects update <project> --reply-to <email>`.
|
|
377
|
+
- Treat `feedback replies <id>` as one chronological conversation containing both team and visitor messages. A visitor follow-up belongs to the original feedback item; never create a replacement feedback item for it.
|
|
378
|
+
|
|
379
|
+
Never silently guess a reply-to address. It becomes the "From" address the customer sees.
|
|
380
|
+
|
|
381
|
+
### Export for analysis
|
|
382
|
+
|
|
383
|
+
```bash
|
|
384
|
+
feedbackbasket feedback export myapp --format json --agent
|
|
385
|
+
# Agent can parse the JSON and generate reports
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### Search for patterns
|
|
389
|
+
|
|
390
|
+
```bash
|
|
391
|
+
feedbackbasket feedback search "login" --agent
|
|
392
|
+
feedbackbasket feedback search "crash" --category BUG --agent
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## Filtering Options
|
|
396
|
+
|
|
397
|
+
| Type | Values |
|
|
398
|
+
| ------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
399
|
+
| Categories | `BUG`, `FEATURE_REQUEST`, `IMPROVEMENT`, `QUESTION` |
|
|
400
|
+
| Statuses | `OPEN`, `UNDER_REVIEW`, `PLANNED`, `IN_PROGRESS`, `COMPLETE`, `CLOSED` |
|
|
401
|
+
| Close reasons | `DUPLICATE`, `NOT_PLANNED`, `COULD_NOT_REPRODUCE`, `NOT_ACTIONABLE`, `NO_LONGER_RELEVANT`, `SPAM`, `OTHER` |
|
|
402
|
+
| Sentiments | `POSITIVE`, `NEGATIVE`, `NEUTRAL` |
|
|
403
|
+
| Bug Severity | `high`, `medium`, `low` |
|
|
404
|
+
|
|
405
|
+
## JSON Envelope
|
|
406
|
+
|
|
407
|
+
When using `--json`, responses include breadcrumbs:
|
|
408
|
+
|
|
409
|
+
```json
|
|
410
|
+
{
|
|
411
|
+
"ok": true,
|
|
412
|
+
"data": [...],
|
|
413
|
+
"summary": "5 projects",
|
|
414
|
+
"breadcrumbs": [
|
|
415
|
+
{ "action": "View feedback", "cmd": "feedbackbasket feedback list --project myapp" }
|
|
416
|
+
]
|
|
417
|
+
}
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
Errors include hints:
|
|
421
|
+
|
|
422
|
+
```json
|
|
423
|
+
{
|
|
424
|
+
"ok": false,
|
|
425
|
+
"error": "Not authenticated",
|
|
426
|
+
"code": "auth_error",
|
|
427
|
+
"hint": "Run: feedbackbasket auth login"
|
|
428
|
+
}
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
## Invariants
|
|
432
|
+
|
|
433
|
+
- Always authenticate before data commands
|
|
400
434
|
- `--agent` suppresses interactive prompts. High-impact operations still need `--yes`.
|
|
401
|
-
- Default project (set during login) is used when `--project` is not specified
|
|
402
|
-
- Project names resolve case-insensitively with fuzzy matching
|
|
403
|
-
- Write operations use full scope (granted by default during login)
|
|
404
|
-
- Feedback IDs are stable CUIDs — safe to reference across commands
|
|
405
|
-
-
|
|
406
|
-
-
|
|
435
|
+
- Default project (set during login) is used when `--project` is not specified
|
|
436
|
+
- Project names resolve case-insensitively with fuzzy matching
|
|
437
|
+
- Write operations use full scope (granted by default during login)
|
|
438
|
+
- Feedback IDs are stable CUIDs — safe to reference across commands
|
|
439
|
+
- Closing feedback requires `--close-reason`. The `OTHER` reason also requires `--close-note`.
|
|
440
|
+
- All timestamps are ISO 8601
|
|
441
|
+
- `--yes` confirms all high-impact CLI operations in agent or machine mode.
|