feedbackbasket-cli 0.11.0 → 0.12.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 CHANGED
@@ -1,330 +1,336 @@
1
- # FeedbackBasket CLI
2
-
3
- Command-line interface for [FeedbackBasket](https://feedbackbasket.com) — manage feedback, bug reports, projects, and widgets from your terminal or through AI agents.
4
-
5
- Inspired by the [Basecamp CLI](https://github.com/basecamp/basecamp-cli). Everything you can do in the dashboard, you can do from the CLI.
6
-
7
- ## Quick Start
8
-
9
- ```bash
10
- # Install
11
- npm install -g feedbackbasket-cli
12
-
13
- # Authenticate (opens browser, full access by default)
14
- feedbackbasket login
15
-
16
- # Or use a token directly (for CI/headless)
17
- feedbackbasket login --token fb_cli_your_token_here
18
-
19
- # Remote server flow: use when localhost browser callbacks cannot reach the CLI
20
- feedbackbasket login --manual
21
-
22
- # Start exploring
23
- feedbackbasket projects list
24
- feedbackbasket feedback list
25
- feedbackbasket feedback create "Login button is broken" --project myapp --type bug
26
- feedbackbasket bugs list --severity high
27
- ```
28
-
29
- The first time you log in, a setup wizard walks you through selecting a default project and installing the Claude Code skill.
30
-
31
- ## Agent Usage
32
-
33
- Any AI agent with shell access (Claude Code, Codex, Cursor, OpenCode) can use the CLI directly:
34
-
35
- ```bash
36
- # Agents should use --agent flag for raw JSON output
37
- feedbackbasket projects list --agent
38
- feedbackbasket feedback list --category BUG --agent
39
- feedbackbasket feedback create "Login button is broken" --content "Clicking Log in does nothing in Safari." --project myapp --type bug --agent
40
- feedbackbasket feedback update <id> --status PLANNED --agent
41
- feedbackbasket widget script myproject --agent
42
- feedbackbasket mobile setup myproject --bundle-id com.example.app --include-publishable-key --agent
43
- ```
44
-
45
- When installing or configuring a widget for the current app, agents should not rely on the CLI default project. First run `feedbackbasket projects list --agent`, match the current app by its real website URL or clearly matching project name, and only create a new project after confirming no existing project belongs to this app. If the only known URL is `localhost`, ask for the production, staging, preview, or intended public URL before creating the project.
46
-
47
- ### Install Claude Code Skill
48
-
49
- ```bash
50
- feedbackbasket setup claude
51
- ```
52
-
53
- ## Commands
54
-
55
- ### Authentication
56
-
57
- ```bash
58
- feedbackbasket login # Browser OAuth flow (alias for auth login)
59
- feedbackbasket login --manual # No localhost browser callback (remote servers)
60
- feedbackbasket login --token <token> # Use an existing CLI token (CI / scripts)
61
- feedbackbasket logout # Clear credentials (alias for auth logout)
62
- feedbackbasket auth status # Show auth state, scope, default project
63
- feedbackbasket auth token # Print raw token (for scripting/piping)
64
- ```
65
-
66
- CLI tokens start with `fb_cli_`. MCP API keys start with `fb_key_` and are only for MCP server configuration.
67
-
68
- ### Projects
69
-
70
- All project commands accept **name or ID** (e.g. `feedbackbasket` or `cmn3c7sgv...`).
71
-
72
- ```bash
73
- feedbackbasket projects list # List all projects with stats
74
- feedbackbasket projects show <name-or-id> # Project details
75
- feedbackbasket projects create "My App" --url https://... # Create project
76
- feedbackbasket projects create "Local Test" --url http://localhost:3000 --allow-local-url
77
- feedbackbasket projects update myapp --name "New Name" # Update project
78
- feedbackbasket projects update myapp --reply-to vlad@example.com # Set default reply-to email
79
- feedbackbasket projects delete myapp # Delete (with confirmation)
80
- ```
81
-
82
- Use the production, staging, preview, or intended public website URL for projects. The CLI blocks accidental `localhost`/loopback URLs in agent and non-interactive mode unless you pass `--allow-local-url` for an explicitly local-only test project.
83
-
84
- ### Feedback
85
-
86
- ```bash
87
- # Read
88
- feedbackbasket feedback list # List recent feedback
89
- feedbackbasket feedback list --project myapp # Filter by project
90
- feedbackbasket feedback list --category BUG # Filter by category
91
- feedbackbasket feedback list --status OPEN # Filter by status
92
- feedbackbasket feedback list --sentiment NEGATIVE # Filter by sentiment
93
- feedbackbasket feedback list --search "login issue" # Text search
94
- feedbackbasket feedback show <id> # View detail, including attachment links
95
- feedbackbasket feedback search "crash on mobile" # Search shortcut
96
-
97
- # Write
98
- feedbackbasket feedback create "Title" --content "Body" --project myapp
99
- feedbackbasket feedback create "Login bug" --content "Clicking Log in does nothing" --project myapp --type bug --page-url https://example.com/login
100
- feedbackbasket feedback update <id> --status PLANNED # Update status
101
- feedbackbasket feedback update <id> --category BUG # Update category
102
- feedbackbasket feedback reply <id> "Thanks!" --delivery email --reply-to support@example.com
103
- feedbackbasket feedback reply <id> "Thanks!" --delivery widget
104
- feedbackbasket feedback reply <id> "Thanks!" --delivery in-app
105
- feedbackbasket feedback reply <id> "Thanks!" --delivery both --reply-to support@example.com
106
- feedbackbasket feedback replies <id> # List sent replies
107
- feedbackbasket feedback note <id> "Investigating this..." # Add internal note
108
- feedbackbasket feedback delete <id> # Delete feedback
109
- feedbackbasket feedback bulk-update --status CLOSED --ids id1,id2,id3
110
-
111
- # Export
112
- feedbackbasket feedback export myapp --format csv # Export to CSV
113
- feedbackbasket feedback export myapp --format md # Export to Markdown
114
- feedbackbasket feedback export myapp --format json # Export to JSON
115
- ```
116
-
117
- ### Bug Reports
118
-
119
- ```bash
120
- feedbackbasket bugs list # All bugs
121
- feedbackbasket bugs list --severity high # High severity only
122
- feedbackbasket bugs list --status OPEN # Open bugs
123
- feedbackbasket bugs stats # Bug statistics summary
124
- feedbackbasket bugs stats --project myapp # Per-project stats
125
- ```
126
-
127
- ### Widget
128
-
129
- ```bash
130
- # View current settings
131
- feedbackbasket widget settings myapp
132
-
133
- # Update widget configuration
134
- feedbackbasket widget settings myapp --capture-mode waitlist
135
- feedbackbasket widget settings myapp --capture-mode feedback
136
- feedbackbasket widget settings myapp --color "#22c55e" --label "Send Feedback"
137
- feedbackbasket widget settings myapp --position bottom-left --display modal
138
- feedbackbasket widget settings myapp --email-required --intro "How can we improve?"
139
- feedbackbasket widget settings myapp --button-radius 10 --button-size regular
140
- feedbackbasket widget settings myapp --show-email --allow-attachments
141
- feedbackbasket widget settings myapp --email-read-only --hide-email-when-prefilled
142
- feedbackbasket widget settings myapp --error-tracking --allow-console-errors
143
-
144
- # Configure guided feedback types and follow-up questions
145
- feedbackbasket widget flow myapp
146
- feedbackbasket widget flow myapp --enable # guided only when requested
147
- feedbackbasket widget flow myapp --reset-default --enable # guided only when requested
148
- feedbackbasket widget flow myapp --config ./feedback-flow.json
149
-
150
- # Get embed code (ready to paste into your HTML)
151
- feedbackbasket widget script myapp
152
- ```
153
-
154
- Waitlist mode uses the same project script. Add `data-feedbackbasket-waitlist` to your own form, with a required `email` field and optional `name` field. The CLI's `widget script` output shows a starter form when waitlist mode is active.
155
-
156
- ### Waitlist
157
-
158
- ```bash
159
- feedbackbasket waitlist list myapp
160
- feedbackbasket waitlist list myapp --search "@example.com" --limit 50 --offset 0
161
- feedbackbasket waitlist list myapp --agent
162
- feedbackbasket waitlist export myapp
163
- ```
164
-
165
- Waitlist listing returns emails, optional names, source pages, total counts, the active capture mode, and pagination. Export prints the dashboard-compatible CSV to stdout.
166
-
167
- For inline trigger mode, load the widget once and call the public API from your own button:
168
-
169
- ```html
170
- <button onclick="window.FeedbackWidget.openFeedbackForm({ trigger: event.currentTarget })">
171
- Feedback
172
- </button>
173
- ```
174
-
175
- Passing the trigger element lets popup mode open beside your custom button. Calling `window.FeedbackWidget.openFeedbackForm()` with no arguments still uses the configured widget position.
176
-
177
- Use only the public `openFeedbackForm()` API from the snippet. Do not call internal or undocumented methods such as `open()` or `openModal()`.
178
-
179
- Use `--email-read-only` and `--hide-email-when-prefilled` with runtime `userEmail` values from your app. These settings do not store visitor emails in FeedbackBasket widget settings.
180
-
181
- The default widget experience is a basic modal. Only switch to popup mode or enable guided feedback when you intentionally want that flow.
182
-
183
- `widget flow --config` accepts either a `feedbackFlow` object or a JSON object with a `feedbackFlow` key. V1 supports guided mode with `text`, `textarea`, and `single_choice` follow-up questions.
184
-
185
- ```json
186
- {
187
- "enabled": true,
188
- "mode": "guided",
189
- "types": [
190
- {
191
- "id": "bug",
192
- "emoji": "🐞",
193
- "label": "Bug report",
194
- "description": "Something is broken or not working",
195
- "questions": [
196
- {
197
- "id": "steps",
198
- "label": "What steps can reproduce it?",
199
- "type": "textarea"
200
- }
201
- ]
202
- }
203
- ]
204
- }
205
- ```
206
-
207
- ### Mobile Apps
208
-
209
- Mobile setup is additive and does not change the website widget. The `fb_mobile_` value is a publishable, write-only project identifier designed to ship in an app; it is not a CLI token or private API key. Mobile commands mask it unless `--include-publishable-key` is explicitly supplied.
210
-
211
- ```bash
212
- # Enable mobile feedback and add allowed iOS bundle IDs
213
- feedbackbasket mobile setup myapp --bundle-id com.example.app
214
-
215
- # Return the publishable key and hosted form URL for an authorized app setup
216
- feedbackbasket mobile setup myapp --bundle-id com.example.app --include-publishable-key --agent
217
-
218
- # Inspect and verify the SDK heartbeat
219
- feedbackbasket mobile status myapp
220
- feedbackbasket mobile verify myapp --bundle-id com.example.app --wait 120
221
-
222
- # Add or remove bundle IDs without replacing the others
223
- feedbackbasket mobile bundle-ids myapp --add com.example.app.beta
224
- feedbackbasket mobile bundle-ids myapp --remove com.example.app.beta
225
-
226
- # Actions that can interrupt installed apps require explicit confirmation
227
- feedbackbasket mobile disable myapp --yes
228
- feedbackbasket mobile rotate-key myapp --yes --include-publishable-key
229
- ```
230
-
231
- Agents should never repeat the full publishable key in their final response. They must never place `fb_cli_` or `fb_key_` credentials in a mobile app. Key rotation invalidates the previous key and therefore requires explicit user authorization.
232
-
233
- The native Swift SDK securely stores reply-thread credentials in the app Keychain and shows team replies in the same feedback sheet. Host apps do not need to build an inbox or manage reply tokens. Hosted-form integrations remain email-only.
234
-
235
- ### Team
236
-
237
- ```bash
238
- feedbackbasket team list # List organization members
239
- feedbackbasket team role <memberId> --role admin # Update member role
240
- feedbackbasket team remove <memberId> # Remove member
241
- ```
242
-
243
- ### Utilities
244
-
245
- ```bash
246
- feedbackbasket doctor # Run diagnostics (auth, connectivity, integrations)
247
- feedbackbasket setup claude # Install Claude Code skill
248
- ```
249
-
250
- ## Output Modes
251
-
252
- The CLI automatically detects your environment:
253
-
254
- | Context | Behavior |
255
- |---------|----------|
256
- | **Terminal (TTY)** | Styled, human-readable output with FeedbackBasket brand colors |
257
- | **Piped** | JSON output automatically |
258
- | `--json` | Full JSON envelope with breadcrumbs |
259
- | `--quiet` / `--agent` | Raw JSON data only (no envelope) |
260
- | `--md` | Markdown formatted |
261
-
262
- ### JSON Envelope
263
-
264
- ```json
265
- {
266
- "ok": true,
267
- "data": [...],
268
- "summary": "12 open bugs, 3 high severity",
269
- "breadcrumbs": [
270
- { "action": "View high severity", "cmd": "feedbackbasket bugs list --severity high" }
271
- ]
272
- }
273
- ```
274
-
275
- Breadcrumbs suggest the next logical command — useful for both humans and agents navigating without a full command catalog.
276
-
277
- ## Configuration
278
-
279
- Credentials stored in `~/.config/feedbackbasket/credentials.json`. Config in `~/.config/feedbackbasket/config.json`.
280
-
281
- ### Default Project
282
-
283
- Set during the login wizard, or manually:
284
-
285
- ```bash
286
- # Commands auto-scope to your default project
287
- feedbackbasket feedback list # uses default project
288
- feedbackbasket feedback list --project other-app # override
289
- ```
290
-
291
- ### Environment Variables
292
-
293
- | Variable | Description |
294
- |----------|-------------|
295
- | `FEEDBACKBASKET_TOKEN` | CLI token (bypasses stored credentials) |
296
- | `FEEDBACKBASKET_BASE_URL` | API base URL override |
297
-
298
- ### Global Flags
299
-
300
- | Flag | Description |
301
- |------|-------------|
302
- | `--json` | Full JSON envelope output |
303
- | `--quiet` / `--agent` | Raw JSON data only |
304
- | `--md` | Markdown output |
305
- | `--base-url <url>` | Override API base URL |
306
-
307
- ## Filter Options
308
-
309
- | Type | Values |
310
- |------|--------|
311
- | **Categories** | `BUG`, `FEATURE_REQUEST`, `IMPROVEMENT`, `QUESTION` |
312
- | **Statuses** | `OPEN`, `UNDER_REVIEW`, `PLANNED`, `IN_PROGRESS`, `COMPLETE`, `CLOSED` |
313
- | **Sentiments** | `POSITIVE`, `NEGATIVE`, `NEUTRAL` |
314
- | **Bug Severity** | `high`, `medium`, `low` |
315
-
316
- ## Development
317
-
318
- ```bash
319
- git clone https://github.com/deifos/feedbackbasket-cli.git
320
- cd feedbackbasket-cli
321
- npm install
322
- npm run dev -- --help # Run in development
323
- npm run build # Build for production
324
- npm run dev -- login # Test login flow
325
- npm run dev -- doctor # Test diagnostics
326
- ```
327
-
328
- ## License
329
-
330
- MIT
1
+ # FeedbackBasket CLI
2
+
3
+ Command-line interface for [FeedbackBasket](https://feedbackbasket.com) — manage feedback, bug reports, projects, and widgets from your terminal or through AI agents.
4
+
5
+ Inspired by the [Basecamp CLI](https://github.com/basecamp/basecamp-cli). Everything you can do in the dashboard, you can do from the CLI.
6
+
7
+ ## Quick Start
8
+
9
+ ```bash
10
+ # Install
11
+ npm install -g feedbackbasket-cli
12
+
13
+ # Authenticate (opens browser, full access by default)
14
+ feedbackbasket login
15
+
16
+ # Or use a token directly (for CI/headless)
17
+ feedbackbasket login --token fb_cli_your_token_here
18
+
19
+ # Remote server flow: use when localhost browser callbacks cannot reach the CLI
20
+ feedbackbasket login --manual
21
+
22
+ # Start exploring
23
+ feedbackbasket projects list
24
+ feedbackbasket feedback list
25
+ feedbackbasket feedback create "Login button is broken" --project myapp --type bug
26
+ feedbackbasket bugs list --severity high
27
+ ```
28
+
29
+ The first time you log in, a setup wizard walks you through selecting a default project and installing the Claude Code skill.
30
+
31
+ ## Agent Usage
32
+
33
+ Any AI agent with shell access (Claude Code, Codex, Cursor, OpenCode) can use the CLI directly:
34
+
35
+ ```bash
36
+ # Agents should use --agent flag for raw JSON output
37
+ feedbackbasket projects list --agent
38
+ feedbackbasket feedback list --category BUG --agent
39
+ feedbackbasket feedback create "Login button is broken" --content "Clicking Log in does nothing in Safari." --project myapp --type bug --agent
40
+ feedbackbasket feedback update <id> --status PLANNED --agent
41
+ feedbackbasket widget script myproject --agent
42
+ feedbackbasket mobile setup myproject --bundle-id com.example.app --include-publishable-key --agent
43
+ ```
44
+
45
+ When installing or configuring a widget for the current app, agents should not rely on the CLI default project. First run `feedbackbasket projects list --agent`, match the current app by its real website URL or clearly matching project name, and only create a new project after confirming no existing project belongs to this app. If the only known URL is `localhost`, ask for the production, staging, preview, or intended public URL before creating the project.
46
+
47
+ ### Install Claude Code Skill
48
+
49
+ ```bash
50
+ feedbackbasket setup claude
51
+ ```
52
+
53
+ ## Commands
54
+
55
+ ### Authentication
56
+
57
+ ```bash
58
+ feedbackbasket login # Browser OAuth flow (alias for auth login)
59
+ feedbackbasket login --manual # No localhost browser callback (remote servers)
60
+ feedbackbasket login --token <token> # Use an existing CLI token (CI / scripts)
61
+ feedbackbasket logout # Clear credentials (alias for auth logout)
62
+ feedbackbasket auth status # Show auth state, scope, default project
63
+ feedbackbasket auth token # Print raw token (for scripting/piping)
64
+ ```
65
+
66
+ CLI tokens start with `fb_cli_`. MCP API keys start with `fb_key_` and are only for MCP server configuration.
67
+
68
+ ### Projects
69
+
70
+ All project commands accept **name or ID** (e.g. `feedbackbasket` or `cmn3c7sgv...`).
71
+
72
+ ```bash
73
+ feedbackbasket projects list # List all projects with stats
74
+ feedbackbasket projects show <name-or-id> # Project details
75
+ feedbackbasket projects create "My App" --url https://... # Create project
76
+ feedbackbasket projects create "Local Test" --url http://localhost:3000 --allow-local-url
77
+ feedbackbasket projects update myapp --name "New Name" # Update project
78
+ feedbackbasket projects update myapp --reply-to vlad@example.com # Set default reply-to email
79
+ feedbackbasket projects delete myapp # Delete (with confirmation)
80
+ ```
81
+
82
+ Use the production, staging, preview, or intended public website URL for projects. The CLI blocks accidental `localhost`/loopback URLs in agent and non-interactive mode unless you pass `--allow-local-url` for an explicitly local-only test project.
83
+
84
+ ### Feedback
85
+
86
+ ```bash
87
+ # Read
88
+ feedbackbasket feedback list # List recent feedback
89
+ feedbackbasket feedback list --project myapp # Filter by project
90
+ feedbackbasket feedback list --category BUG # Filter by category
91
+ feedbackbasket feedback list --status OPEN # Filter by status
92
+ feedbackbasket feedback list --sentiment NEGATIVE # Filter by sentiment
93
+ feedbackbasket feedback list --search "login issue" # Text search
94
+ feedbackbasket feedback show <id> # View detail, including attachment links
95
+ feedbackbasket feedback search "crash on mobile" # Search shortcut
96
+
97
+ # Write
98
+ feedbackbasket feedback create "Title" --content "Body" --project myapp
99
+ feedbackbasket feedback create "Login bug" --content "Clicking Log in does nothing" --project myapp --type bug --page-url https://example.com/login
100
+ feedbackbasket feedback update <id> --status PLANNED # Update status
101
+ feedbackbasket feedback update <id> --category BUG # Update category
102
+ feedbackbasket feedback reply <id> "Thanks!" --delivery email --reply-to support@example.com
103
+ feedbackbasket feedback reply <id> "Thanks!" --delivery widget
104
+ feedbackbasket feedback reply <id> "Thanks!" --delivery in-app
105
+ feedbackbasket feedback reply <id> "Thanks!" --delivery both --reply-to support@example.com
106
+ feedbackbasket feedback replies <id> # Show the complete conversation
107
+ feedbackbasket feedback note <id> "Investigating this..." # Add internal note
108
+ feedbackbasket feedback delete <id> # Delete feedback
109
+ feedbackbasket feedback bulk-update --status CLOSED --ids id1,id2,id3
110
+
111
+ # Export
112
+ feedbackbasket feedback export myapp --format csv # Export to CSV
113
+ feedbackbasket feedback export myapp --format md # Export to Markdown
114
+ feedbackbasket feedback export myapp --format json # Export to JSON
115
+ ```
116
+
117
+ ### Bug Reports
118
+
119
+ ```bash
120
+ feedbackbasket bugs list # All bugs
121
+ feedbackbasket bugs list --severity high # High severity only
122
+ feedbackbasket bugs list --status OPEN # Open bugs
123
+ feedbackbasket bugs stats # Bug statistics summary
124
+ feedbackbasket bugs stats --project myapp # Per-project stats
125
+ ```
126
+
127
+ ### Widget
128
+
129
+ ```bash
130
+ # View current settings
131
+ feedbackbasket widget settings myapp
132
+
133
+ # Update widget configuration
134
+ feedbackbasket widget settings myapp --capture-mode waitlist
135
+ feedbackbasket widget settings myapp --capture-mode feedback
136
+ feedbackbasket widget settings myapp --color "#22c55e" --label "Send Feedback"
137
+ feedbackbasket widget settings myapp --position bottom-left --display modal
138
+ feedbackbasket widget settings myapp --email-required --intro "How can we improve?"
139
+ feedbackbasket widget settings myapp --button-radius 10 --button-size regular
140
+ feedbackbasket widget settings myapp --show-email --allow-attachments
141
+ feedbackbasket widget settings myapp --allow-visitor-replies
142
+ feedbackbasket widget settings myapp --no-allow-visitor-replies
143
+ feedbackbasket widget settings myapp --email-read-only --hide-email-when-prefilled
144
+ feedbackbasket widget settings myapp --error-tracking --allow-console-errors
145
+
146
+ # Configure guided feedback types and follow-up questions
147
+ feedbackbasket widget flow myapp
148
+ feedbackbasket widget flow myapp --enable # guided only when requested
149
+ feedbackbasket widget flow myapp --reset-default --enable # guided only when requested
150
+ feedbackbasket widget flow myapp --config ./feedback-flow.json
151
+
152
+ # Get embed code (ready to paste into your HTML)
153
+ feedbackbasket widget script myapp
154
+ ```
155
+
156
+ Waitlist mode uses the same project script. Add `data-feedbackbasket-waitlist` to your own form, with a required `email` field and optional `name` field. The CLI's `widget script` output shows a starter form when waitlist mode is active.
157
+
158
+ ### Waitlist
159
+
160
+ ```bash
161
+ feedbackbasket waitlist list myapp
162
+ feedbackbasket waitlist list myapp --search "@example.com" --limit 50 --offset 0
163
+ feedbackbasket waitlist list myapp --agent
164
+ feedbackbasket waitlist export myapp
165
+ ```
166
+
167
+ Waitlist listing returns emails, optional names, source pages, total counts, the active capture mode, and pagination. Export prints the dashboard-compatible CSV to stdout.
168
+
169
+ For inline trigger mode, load the widget once and call the public API from your own button:
170
+
171
+ ```html
172
+ <button onclick="window.FeedbackWidget.openFeedbackForm({ trigger: event.currentTarget })">
173
+ Feedback
174
+ </button>
175
+ ```
176
+
177
+ Passing the trigger element lets popup mode open beside your custom button. Calling `window.FeedbackWidget.openFeedbackForm()` with no arguments still uses the configured widget position.
178
+
179
+ Use only the public `openFeedbackForm()` API from the snippet. Do not call internal or undocumented methods such as `open()` or `openModal()`.
180
+
181
+ Use `--email-read-only` and `--hide-email-when-prefilled` with runtime `userEmail` values from your app. These settings do not store visitor emails in FeedbackBasket widget settings.
182
+
183
+ The default widget experience is a basic modal. Only switch to popup mode or enable guided feedback when you intentionally want that flow.
184
+
185
+ `widget flow --config` accepts either a `feedbackFlow` object or a JSON object with a `feedbackFlow` key. V1 supports guided mode with `text`, `textarea`, and `single_choice` follow-up questions.
186
+
187
+ ```json
188
+ {
189
+ "enabled": true,
190
+ "mode": "guided",
191
+ "types": [
192
+ {
193
+ "id": "bug",
194
+ "emoji": "🐞",
195
+ "label": "Bug report",
196
+ "description": "Something is broken or not working",
197
+ "questions": [
198
+ {
199
+ "id": "steps",
200
+ "label": "What steps can reproduce it?",
201
+ "type": "textarea"
202
+ }
203
+ ]
204
+ }
205
+ ]
206
+ }
207
+ ```
208
+
209
+ ### Mobile Apps
210
+
211
+ Mobile setup is additive and does not change the website widget. The `fb_mobile_` value is a publishable, write-only project identifier designed to ship in an app; it is not a CLI token or private API key. Mobile commands mask it unless `--include-publishable-key` is explicitly supplied.
212
+
213
+ ```bash
214
+ # Enable mobile feedback and add allowed iOS bundle IDs
215
+ feedbackbasket mobile setup myapp --bundle-id com.example.app
216
+
217
+ # Return the publishable key and hosted form URL for an authorized app setup
218
+ feedbackbasket mobile setup myapp --bundle-id com.example.app --include-publishable-key --agent
219
+
220
+ # Inspect and verify the SDK heartbeat
221
+ feedbackbasket mobile status myapp
222
+ feedbackbasket mobile verify myapp --bundle-id com.example.app --wait 120
223
+
224
+ # Let users answer team replies in the original in-app conversation
225
+ feedbackbasket mobile conversations myapp --enable
226
+ feedbackbasket mobile conversations myapp --disable
227
+
228
+ # Add or remove bundle IDs without replacing the others
229
+ feedbackbasket mobile bundle-ids myapp --add com.example.app.beta
230
+ feedbackbasket mobile bundle-ids myapp --remove com.example.app.beta
231
+
232
+ # Actions that can interrupt installed apps require explicit confirmation
233
+ feedbackbasket mobile disable myapp --yes
234
+ feedbackbasket mobile rotate-key myapp --yes --include-publishable-key
235
+ ```
236
+
237
+ Agents should never repeat the full publishable key in their final response. They must never place `fb_cli_` or `fb_key_` credentials in a mobile app. Key rotation invalidates the previous key and therefore requires explicit user authorization.
238
+
239
+ The native Swift SDK securely stores conversation credentials in the app Keychain, shows an unread badge when the team replies, and lets users answer inside the same thread when mobile conversations are enabled. Host apps do not need to build an inbox or manage reply tokens. Hosted-form integrations remain email-only. Website widget follow-up replies are configured independently with `widget settings`.
240
+
241
+ ### Team
242
+
243
+ ```bash
244
+ feedbackbasket team list # List organization members
245
+ feedbackbasket team role <memberId> --role admin # Update member role
246
+ feedbackbasket team remove <memberId> # Remove member
247
+ ```
248
+
249
+ ### Utilities
250
+
251
+ ```bash
252
+ feedbackbasket doctor # Run diagnostics (auth, connectivity, integrations)
253
+ feedbackbasket setup claude # Install Claude Code skill
254
+ ```
255
+
256
+ ## Output Modes
257
+
258
+ The CLI automatically detects your environment:
259
+
260
+ | Context | Behavior |
261
+ |---------|----------|
262
+ | **Terminal (TTY)** | Styled, human-readable output with FeedbackBasket brand colors |
263
+ | **Piped** | JSON output automatically |
264
+ | `--json` | Full JSON envelope with breadcrumbs |
265
+ | `--quiet` / `--agent` | Raw JSON data only (no envelope) |
266
+ | `--md` | Markdown formatted |
267
+
268
+ ### JSON Envelope
269
+
270
+ ```json
271
+ {
272
+ "ok": true,
273
+ "data": [...],
274
+ "summary": "12 open bugs, 3 high severity",
275
+ "breadcrumbs": [
276
+ { "action": "View high severity", "cmd": "feedbackbasket bugs list --severity high" }
277
+ ]
278
+ }
279
+ ```
280
+
281
+ Breadcrumbs suggest the next logical command — useful for both humans and agents navigating without a full command catalog.
282
+
283
+ ## Configuration
284
+
285
+ Credentials stored in `~/.config/feedbackbasket/credentials.json`. Config in `~/.config/feedbackbasket/config.json`.
286
+
287
+ ### Default Project
288
+
289
+ Set during the login wizard, or manually:
290
+
291
+ ```bash
292
+ # Commands auto-scope to your default project
293
+ feedbackbasket feedback list # uses default project
294
+ feedbackbasket feedback list --project other-app # override
295
+ ```
296
+
297
+ ### Environment Variables
298
+
299
+ | Variable | Description |
300
+ |----------|-------------|
301
+ | `FEEDBACKBASKET_TOKEN` | CLI token (bypasses stored credentials) |
302
+ | `FEEDBACKBASKET_BASE_URL` | API base URL override |
303
+
304
+ ### Global Flags
305
+
306
+ | Flag | Description |
307
+ |------|-------------|
308
+ | `--json` | Full JSON envelope output |
309
+ | `--quiet` / `--agent` | Raw JSON data only |
310
+ | `--md` | Markdown output |
311
+ | `--base-url <url>` | Override API base URL |
312
+
313
+ ## Filter Options
314
+
315
+ | Type | Values |
316
+ |------|--------|
317
+ | **Categories** | `BUG`, `FEATURE_REQUEST`, `IMPROVEMENT`, `QUESTION` |
318
+ | **Statuses** | `OPEN`, `UNDER_REVIEW`, `PLANNED`, `IN_PROGRESS`, `COMPLETE`, `CLOSED` |
319
+ | **Sentiments** | `POSITIVE`, `NEGATIVE`, `NEUTRAL` |
320
+ | **Bug Severity** | `high`, `medium`, `low` |
321
+
322
+ ## Development
323
+
324
+ ```bash
325
+ git clone https://github.com/deifos/feedbackbasket-cli.git
326
+ cd feedbackbasket-cli
327
+ npm install
328
+ npm run dev -- --help # Run in development
329
+ npm run build # Build for production
330
+ npm run dev -- login # Test login flow
331
+ npm run dev -- doctor # Test diagnostics
332
+ ```
333
+
334
+ ## License
335
+
336
+ MIT