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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "feedbackbasket-cli",
3
- "version": "0.9.3",
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.0.0",
38
+ "tsx": "^4.23.0",
39
39
  "typescript": "^5.7.0"
40
40
  },
41
41
  "engines": {
@@ -1,21 +1,11 @@
1
1
  ---
2
- name: FeedbackBasket
3
- description: Manage FeedbackBasket projects, feedback, bugs, widgets, and team from the command line
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 team in FeedbackBasket. Works with any AI agent that can run shell commands.
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, hasWidgetAccess, project.replyToEmail
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: `email`, `widget`, or `both`, unless the human already specified it in the current conversation.
247
- - If `feedback show` returns `email: null`, do not use `--delivery email` or `--delivery both`. If `hasWidgetAccess: true`, use `--delivery widget`; otherwise ask the human how they want to respond.
248
- - If `hasWidgetAccess: false`, do not use `--delivery widget` or `--delivery both`.
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