feedbackbasket-cli 0.9.3 → 0.11.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/README.md +48 -0
- package/dist/src/cli.js +4 -0
- package/dist/src/client.d.ts +17 -3
- package/dist/src/client.js +73 -35
- package/dist/src/commands/feedback-reply.d.ts +2 -0
- package/dist/src/commands/feedback-reply.js +23 -13
- package/dist/src/commands/feedback.js +1 -1
- package/dist/src/commands/mobile.d.ts +7 -0
- package/dist/src/commands/mobile.js +292 -0
- package/dist/src/commands/waitlist.d.ts +3 -0
- package/dist/src/commands/waitlist.js +99 -0
- package/dist/src/commands/widget.js +55 -3
- package/dist/src/help.js +8 -1
- package/dist/src/types.d.ts +50 -1
- package/dist/src/version.d.ts +2 -2
- package/dist/src/version.js +1 -1
- package/package.json +4 -4
- package/skills/feedbackbasket/SKILL.md +95 -18
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "feedbackbasket-cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Command-line interface for FeedbackBasket — manage feedback from your terminal",
|
|
3
|
+
"version": "0.11.0",
|
|
4
|
+
"description": "Command-line interface for FeedbackBasket — manage feedback and waitlists from your terminal",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/cli.js",
|
|
7
7
|
"bin": {
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"build": "tsc",
|
|
12
|
+
"test": "tsx --test tests/*.test.ts",
|
|
12
13
|
"dev": "tsx bin/feedbackbasket.ts",
|
|
13
14
|
"start": "node dist/bin/feedbackbasket.js",
|
|
14
15
|
"prepublishOnly": "npm run build"
|
|
@@ -28,14 +29,13 @@
|
|
|
28
29
|
},
|
|
29
30
|
"homepage": "https://feedbackbasket.com",
|
|
30
31
|
"dependencies": {
|
|
31
|
-
"axios": "1.7.0",
|
|
32
32
|
"chalk": "^5.3.0",
|
|
33
33
|
"commander": "^13.1.0",
|
|
34
34
|
"open": "^10.1.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "^22.0.0",
|
|
38
|
-
"tsx": "^4.
|
|
38
|
+
"tsx": "^4.23.0",
|
|
39
39
|
"typescript": "^5.7.0"
|
|
40
40
|
},
|
|
41
41
|
"engines": {
|
|
@@ -1,21 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
3
|
-
description: Manage FeedbackBasket projects, feedback, bugs, widgets, and
|
|
4
|
-
triggers:
|
|
5
|
-
- feedbackbasket
|
|
6
|
-
- feedback
|
|
7
|
-
- bugs
|
|
8
|
-
- bug reports
|
|
9
|
-
- user feedback
|
|
10
|
-
- widget
|
|
11
|
-
- feedback widget
|
|
12
|
-
invocable: true
|
|
13
|
-
argument-hint: "<command> [options]"
|
|
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.
|
|
14
4
|
---
|
|
15
5
|
|
|
16
6
|
# FeedbackBasket CLI
|
|
17
7
|
|
|
18
|
-
Full command-line interface for managing feedback, bug reports, projects, widgets, and
|
|
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.
|
|
19
9
|
|
|
20
10
|
## Authentication
|
|
21
11
|
|
|
@@ -63,6 +53,61 @@ All project commands accept **name or ID**. Names are matched case-insensitively
|
|
|
63
53
|
|
|
64
54
|
**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`.
|
|
65
55
|
|
|
56
|
+
**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.
|
|
57
|
+
|
|
58
|
+
**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.
|
|
59
|
+
|
|
60
|
+
### Mobile App Feedback
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
feedbackbasket mobile status <project> --agent
|
|
64
|
+
feedbackbasket mobile setup <project> --bundle-id com.example.app --agent
|
|
65
|
+
feedbackbasket mobile setup <project> --bundle-id com.example.app --include-publishable-key --agent
|
|
66
|
+
feedbackbasket mobile bundle-ids <project> --add com.example.app.beta --agent
|
|
67
|
+
feedbackbasket mobile bundle-ids <project> --remove com.example.app.beta --agent
|
|
68
|
+
feedbackbasket mobile verify <project> --bundle-id com.example.app --wait 120 --agent
|
|
69
|
+
feedbackbasket mobile disable <project> --yes --agent
|
|
70
|
+
feedbackbasket mobile rotate-key <project> --yes --include-publishable-key --agent
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
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.
|
|
74
|
+
|
|
75
|
+
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.
|
|
76
|
+
|
|
77
|
+
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.
|
|
78
|
+
|
|
79
|
+
Configure the Swift package once at app startup with the returned publishable key:
|
|
80
|
+
|
|
81
|
+
```swift
|
|
82
|
+
import FeedbackBasket
|
|
83
|
+
|
|
84
|
+
FeedbackBasket.configure(
|
|
85
|
+
projectKey: "fb_mobile_returned_by_mobile_setup"
|
|
86
|
+
)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Present its standard SwiftUI sheet from the selected Settings, Help, or Support view:
|
|
90
|
+
|
|
91
|
+
```swift
|
|
92
|
+
@State private var showingFeedback = false
|
|
93
|
+
|
|
94
|
+
Button("Send feedback") {
|
|
95
|
+
showingFeedback = true
|
|
96
|
+
}
|
|
97
|
+
.feedbackBasketSheet(
|
|
98
|
+
isPresented: $showingFeedback,
|
|
99
|
+
context: ["screen": "Settings"]
|
|
100
|
+
)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
The native SDK stores each submission's reply-thread credential in the app Keychain and shows team replies in the same feedback sheet when it is opened again. Do not build a separate inbox, polling client, or token store in the host app. Hosted-form integrations remain email-only.
|
|
104
|
+
|
|
105
|
+
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.
|
|
106
|
+
|
|
107
|
+
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.
|
|
108
|
+
|
|
109
|
+
`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.
|
|
110
|
+
|
|
66
111
|
### Feedback
|
|
67
112
|
```bash
|
|
68
113
|
# Read
|
|
@@ -79,9 +124,10 @@ feedbackbasket feedback note <id> "Investigating — appears related to auth flo
|
|
|
79
124
|
feedbackbasket feedback delete <id> --yes
|
|
80
125
|
feedbackbasket feedback bulk-update --status CLOSED --ids id1,id2,id3
|
|
81
126
|
|
|
82
|
-
# Reply to submitter by email, widget thread, or both
|
|
127
|
+
# Reply to submitter by email, widget/in-app thread, or both
|
|
83
128
|
feedbackbasket feedback reply <id> "Thanks for reporting — we pushed a fix!" --delivery email --reply-to support@example.com
|
|
84
129
|
feedbackbasket feedback reply <id> "<content>" --delivery widget
|
|
130
|
+
feedbackbasket feedback reply <id> "<content>" --delivery in-app
|
|
85
131
|
feedbackbasket feedback reply <id> "<content>" --delivery both --reply-to support@example.com
|
|
86
132
|
feedbackbasket feedback replies <id> # list past replies
|
|
87
133
|
|
|
@@ -104,6 +150,8 @@ feedbackbasket widget script <project>
|
|
|
104
150
|
|
|
105
151
|
# View settings
|
|
106
152
|
feedbackbasket widget settings <project>
|
|
153
|
+
feedbackbasket widget settings <project> --capture-mode waitlist
|
|
154
|
+
feedbackbasket widget settings <project> --capture-mode feedback
|
|
107
155
|
|
|
108
156
|
# Customize
|
|
109
157
|
feedbackbasket widget settings <project> --color "#22c55e" --label "Send Feedback"
|
|
@@ -111,6 +159,7 @@ feedbackbasket widget settings <project> --position bottom-left --display modal
|
|
|
111
159
|
feedbackbasket widget settings <project> --email-required --intro "How can we improve?"
|
|
112
160
|
feedbackbasket widget settings <project> --show-email --allow-attachments
|
|
113
161
|
feedbackbasket widget settings <project> --email-read-only --hide-email-when-prefilled
|
|
162
|
+
feedbackbasket widget settings <project> --error-tracking --allow-console-errors
|
|
114
163
|
|
|
115
164
|
# Guided feedback types and follow-up questions
|
|
116
165
|
feedbackbasket widget flow <project>
|
|
@@ -119,6 +168,29 @@ feedbackbasket widget flow <project> --reset-default --enable # only when the u
|
|
|
119
168
|
feedbackbasket widget flow <project> --config ./feedback-flow.json
|
|
120
169
|
```
|
|
121
170
|
|
|
171
|
+
Waitlist mode keeps the same project script and binds to the host app's own annotated form:
|
|
172
|
+
|
|
173
|
+
```html
|
|
174
|
+
<form data-feedbackbasket-waitlist>
|
|
175
|
+
<input name="name" autocomplete="name">
|
|
176
|
+
<input name="email" type="email" autocomplete="email" required>
|
|
177
|
+
<button type="submit">Join the waitlist</button>
|
|
178
|
+
</form>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Email is required and name is optional. Use `data-feedbackbasket-state="loading|success|error"` for custom UI, or listen for the bubbling `feedbackbasket:waitlist:success` and `feedbackbasket:waitlist:error` events. Do not add a competing submit handler.
|
|
182
|
+
|
|
183
|
+
### Waitlist Signups
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
feedbackbasket waitlist list <project>
|
|
187
|
+
feedbackbasket waitlist list <project> --search "@example.com" --limit 50 --offset 0
|
|
188
|
+
feedbackbasket waitlist list <project> --agent
|
|
189
|
+
feedbackbasket waitlist export <project>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
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.
|
|
193
|
+
|
|
122
194
|
For inline trigger mode, load the widget once and call the public API from the host app's custom button:
|
|
123
195
|
|
|
124
196
|
```html
|
|
@@ -137,6 +209,8 @@ In React:
|
|
|
137
209
|
|
|
138
210
|
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.
|
|
139
211
|
|
|
212
|
+
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.
|
|
213
|
+
|
|
140
214
|
`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.
|
|
141
215
|
|
|
142
216
|
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.
|
|
@@ -168,6 +242,8 @@ feedbackbasket projects create "My App" --url https://myapp.com --agent
|
|
|
168
242
|
feedbackbasket widget script "My App" --agent
|
|
169
243
|
# Agent gets the embed code, adds it to the HTML
|
|
170
244
|
feedbackbasket widget settings "My App" --color "#22c55e" --label "Feedback" --agent
|
|
245
|
+
# Optional, when the user wants a waitlist instead of feedback capture
|
|
246
|
+
# feedbackbasket widget settings "My App" --capture-mode waitlist --agent
|
|
171
247
|
# Optional, only when requested: enable the guided wizard with Bug, Feature, and General templates
|
|
172
248
|
# feedbackbasket widget flow "My App" --reset-default --enable --agent
|
|
173
249
|
```
|
|
@@ -235,17 +311,18 @@ feedbackbasket feedback show <id> --agent
|
|
|
235
311
|
### Close the loop — reply to the submitter
|
|
236
312
|
```bash
|
|
237
313
|
# Agent reads context, asks which delivery method to use, then sends it
|
|
238
|
-
feedbackbasket feedback show <id> --agent # read email,
|
|
314
|
+
feedbackbasket feedback show <id> --agent # read email, replyChannel, project.replyToEmail
|
|
239
315
|
feedbackbasket feedback reply <id> "<drafted response>" --delivery widget --agent
|
|
316
|
+
feedbackbasket feedback reply <id> "<drafted response>" --delivery in-app --agent
|
|
240
317
|
feedbackbasket feedback reply <id> "<drafted response>" --delivery email --reply-to support@example.com --agent
|
|
241
318
|
feedbackbasket feedback reply <id> "<drafted response>" --delivery both --reply-to support@example.com --agent
|
|
242
319
|
feedbackbasket feedback update <id> --status COMPLETE --agent
|
|
243
320
|
feedbackbasket feedback note <id> "Replied via CLI" --agent
|
|
244
321
|
```
|
|
245
322
|
**Important reply safety rules:**
|
|
246
|
-
- Before replying, the agent MUST inspect `feedback show --agent`, then ask the human which delivery method to use
|
|
247
|
-
- If `
|
|
248
|
-
- If `
|
|
323
|
+
- Before replying, the agent MUST inspect `feedback show --agent`, including `replyChannel`, then ask the human which available delivery method to use unless the human already specified it in the current conversation.
|
|
324
|
+
- 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.
|
|
325
|
+
- If `feedback show` returns `email: null`, do not use `--delivery email` or `--delivery both`. If `replyChannel: null`, do not use thread delivery.
|
|
249
326
|
- 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.
|
|
250
327
|
- 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>`.
|
|
251
328
|
|