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.
@@ -23,8 +23,7 @@ import { createFeedbackBulkUpdateCommand } from './feedback-bulk-update.js';
23
23
  import { createFeedbackExportCommand } from './feedback-export.js';
24
24
  import { createFeedbackReplyCommand, createFeedbackRepliesCommand } from './feedback-reply.js';
25
25
  export function createFeedbackCommand(getWriter) {
26
- const feedback = new Command('feedback')
27
- .description('View and manage feedback');
26
+ const feedback = new Command('feedback').description('View and manage feedback');
28
27
  // Write subcommands
29
28
  feedback.addCommand(createFeedbackCreateCommand(getWriter));
30
29
  feedback.addCommand(createFeedbackUpdateCommand(getWriter));
@@ -42,6 +41,7 @@ export function createFeedbackCommand(getWriter) {
42
41
  .option('--all', 'Show feedback across all projects (ignore default project)')
43
42
  .option('--category <category>', 'Filter by category (BUG, FEATURE_REQUEST, IMPROVEMENT, QUESTION)')
44
43
  .option('--status <status>', 'Filter by status (OPEN, UNDER_REVIEW, PLANNED, IN_PROGRESS, COMPLETE, CLOSED)')
44
+ .option('--close-reason <reason>', 'Filter by close reason')
45
45
  .option('--sentiment <sentiment>', 'Filter by sentiment (POSITIVE, NEGATIVE, NEUTRAL)')
46
46
  .option('--search <query>', 'Search feedback content')
47
47
  .option('--limit <n>', 'Max results (1-100)', '20')
@@ -54,6 +54,7 @@ export function createFeedbackCommand(getWriter) {
54
54
  projectId: await resolveProjectId(client, opts.project, opts.all),
55
55
  category: opts.category,
56
56
  status: opts.status,
57
+ closeReason: opts.closeReason,
57
58
  sentiment: opts.sentiment,
58
59
  search: opts.search,
59
60
  limit: parseInt(opts.limit, 10),
@@ -65,13 +66,22 @@ export function createFeedbackCommand(getWriter) {
65
66
  }
66
67
  const breadcrumbs = [];
67
68
  if (opts.project) {
68
- breadcrumbs.push({ action: 'View bugs for this project', cmd: `feedbackbasket bugs list --project ${opts.project}` });
69
+ breadcrumbs.push({
70
+ action: 'View bugs for this project',
71
+ cmd: `feedbackbasket bugs list --project ${opts.project}`,
72
+ });
69
73
  }
70
74
  if (result.pagination.hasMore) {
71
75
  const nextOffset = parseInt(opts.offset, 10) + parseInt(opts.limit, 10);
72
- breadcrumbs.push({ action: 'Next page', cmd: `feedbackbasket feedback list --offset ${nextOffset} --limit ${opts.limit}${opts.project ? ` --project ${opts.project}` : ''}` });
76
+ breadcrumbs.push({
77
+ action: 'Next page',
78
+ cmd: `feedbackbasket feedback list --offset ${nextOffset} --limit ${opts.limit}${opts.project ? ` --project ${opts.project}` : ''}`,
79
+ });
73
80
  }
74
- breadcrumbs.push({ action: 'Search', cmd: 'feedbackbasket feedback search "<query>"' });
81
+ breadcrumbs.push({
82
+ action: 'Search',
83
+ cmd: 'feedbackbasket feedback search "<query>"',
84
+ });
75
85
  writer.ok(result.feedback, {
76
86
  summary: `Showing ${result.feedback.length} of ${result.pagination.totalCount} feedback items`,
77
87
  notice: result.pagination.hasMore ? `Use --offset ${parseInt(opts.offset, 10) + parseInt(opts.limit, 10)} to see more` : undefined,
@@ -92,8 +102,14 @@ export function createFeedbackCommand(getWriter) {
92
102
  writer.ok(item, {
93
103
  summary: `Feedback ${item.id}`,
94
104
  breadcrumbs: [
95
- { action: 'Update status', cmd: `feedbackbasket feedback update ${item.id} --status <STATUS>` },
96
- { action: 'Add note', cmd: `feedbackbasket feedback note ${item.id} "<note>"` },
105
+ {
106
+ action: 'Update status',
107
+ cmd: `feedbackbasket feedback update ${item.id} --status <STATUS>`,
108
+ },
109
+ {
110
+ action: 'Add note',
111
+ cmd: `feedbackbasket feedback note ${item.id} "<note>"`,
112
+ },
97
113
  { action: 'Back to list', cmd: 'feedbackbasket feedback list' },
98
114
  ],
99
115
  });
@@ -120,7 +136,10 @@ export function createFeedbackCommand(getWriter) {
120
136
  summary: `${result.pagination.totalCount} result${result.pagination.totalCount === 1 ? '' : 's'} for "${query}"`,
121
137
  breadcrumbs: [
122
138
  { action: 'List all feedback', cmd: 'feedbackbasket feedback list' },
123
- { action: 'Search bugs', cmd: `feedbackbasket bugs list --search "${query}"` },
139
+ {
140
+ action: 'Search bugs',
141
+ cmd: `feedbackbasket bugs list --search "${query}"`,
142
+ },
124
143
  ],
125
144
  });
126
145
  });
@@ -156,7 +175,7 @@ function renderFeedbackList(items) {
156
175
  const cat = categoryEmoji[item.category ?? ''] ?? brand.muted('[?]');
157
176
  const priority = priorityLabel(item.aiPriorityScore);
158
177
  const content = item.content.length > 80 ? item.content.slice(0, 77) + '...' : item.content;
159
- const status = brand.muted(`[${item.status}]`);
178
+ const status = brand.muted(`[${item.status}${item.closeReason ? ` · ${item.closeReason}` : ''}]`);
160
179
  const proj = item.project ? brand.primary(item.project.name) : '';
161
180
  console.log(`${cat} ${priority} ${status} ${proj} ${brand.muted(item.id)}`);
162
181
  console.log(` ${content}`);
@@ -175,6 +194,8 @@ function renderFeedbackDetail(item) {
175
194
  console.log();
176
195
  const fields = [
177
196
  ['Status', item.status],
197
+ ['Close Reason', item.closeReason],
198
+ ['Close Note', item.closeNote],
178
199
  ['Category', item.category],
179
200
  ['Feedback Type', formatFeedbackType(item)],
180
201
  ['Sentiment', item.sentiment],
@@ -1,4 +1,5 @@
1
1
  export type FeedbackStatus = 'OPEN' | 'UNDER_REVIEW' | 'PLANNED' | 'IN_PROGRESS' | 'COMPLETE' | 'CLOSED';
2
+ export type FeedbackCloseReason = 'DUPLICATE' | 'NOT_PLANNED' | 'COULD_NOT_REPRODUCE' | 'NOT_ACTIONABLE' | 'NO_LONGER_RELEVANT' | 'SPAM' | 'OTHER';
2
3
  export type FeedbackCategory = 'BUG' | 'FEATURE_REQUEST' | 'IMPROVEMENT' | 'QUESTION';
3
4
  export type Sentiment = 'POSITIVE' | 'NEGATIVE' | 'NEUTRAL';
4
5
  export type Severity = 'high' | 'medium' | 'low';
@@ -93,6 +94,9 @@ export interface Feedback {
93
94
  content: string;
94
95
  email?: string | null;
95
96
  status: FeedbackStatus;
97
+ closeReason?: FeedbackCloseReason | null;
98
+ closeNote?: string | null;
99
+ closedAt?: string | null;
96
100
  category?: FeedbackCategory | null;
97
101
  sentiment?: Sentiment | null;
98
102
  aiSummary?: string | null;
@@ -186,6 +190,8 @@ export interface FeedbackCreateInput {
186
190
  type?: 'bug' | 'feature' | 'general';
187
191
  category?: FeedbackCategory;
188
192
  status?: FeedbackStatus;
193
+ closeReason?: FeedbackCloseReason;
194
+ closeNote?: string;
189
195
  email?: string;
190
196
  pageUrl?: string;
191
197
  metadata?: Record<string, unknown>;
@@ -232,6 +238,7 @@ export interface FeedbackParams {
232
238
  projectId?: string;
233
239
  category?: FeedbackCategory;
234
240
  status?: FeedbackStatus;
241
+ closeReason?: FeedbackCloseReason;
235
242
  sentiment?: Sentiment;
236
243
  search?: string;
237
244
  limit?: number;
@@ -1,2 +1,2 @@
1
- export declare const VERSION: "3.0.0";
1
+ export declare const VERSION: "3.2.0";
2
2
  export declare const USER_AGENT: string;
package/package.json CHANGED
@@ -1,54 +1,54 @@
1
- {
2
- "name": "feedbackbasket-cli",
3
- "version": "3.0.0",
4
- "description": "Command-line interface for FeedbackBasket — manage feedback and waitlists from your terminal",
5
- "type": "module",
6
- "main": "dist/src/cli.js",
7
- "bin": {
8
- "feedbackbasket": "dist/bin/feedbackbasket.js"
9
- },
10
- "scripts": {
11
- "build": "tsc",
12
- "test": "tsx --test tests/*.test.ts",
13
- "dev": "tsx bin/feedbackbasket.ts",
14
- "start": "node dist/bin/feedbackbasket.js",
15
- "check:parity": "tsx scripts/check-parity.ts",
16
- "docs:generate": "tsx scripts/generate-capabilities.ts",
17
- "docs:check": "tsx scripts/generate-capabilities.ts --check",
18
- "prepublishOnly": "npm run check:parity && npm run docs:check && npm test && npm run build"
19
- },
20
- "keywords": [
21
- "feedbackbasket",
22
- "feedback",
23
- "cli",
24
- "ai-agent",
25
- "developer-tools"
26
- ],
27
- "author": "deifosv",
28
- "license": "MIT",
29
- "repository": {
30
- "type": "git",
31
- "url": "https://github.com/deifos/feedbackbasket-cli.git"
32
- },
33
- "homepage": "https://feedbackbasket.com",
34
- "dependencies": {
35
- "chalk": "^5.3.0",
36
- "commander": "^13.1.0",
37
- "feedbackbasket-agent-contract": "3.0.0",
38
- "open": "^10.1.0"
39
- },
40
- "devDependencies": {
41
- "@types/node": "^22.0.0",
42
- "tsx": "^4.23.0",
43
- "typescript": "^5.7.0"
44
- },
45
- "engines": {
46
- "node": ">=18"
47
- },
48
- "files": [
49
- "dist/**/*",
50
- "skills/**/*",
51
- "README.md",
52
- "CHANGELOG.md"
53
- ]
54
- }
1
+ {
2
+ "name": "feedbackbasket-cli",
3
+ "version": "3.2.0",
4
+ "description": "Command-line interface for FeedbackBasket — manage feedback and waitlists from your terminal",
5
+ "type": "module",
6
+ "main": "dist/src/cli.js",
7
+ "bin": {
8
+ "feedbackbasket": "dist/bin/feedbackbasket.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "test": "tsx --test tests/*.test.ts",
13
+ "dev": "tsx bin/feedbackbasket.ts",
14
+ "start": "node dist/bin/feedbackbasket.js",
15
+ "check:parity": "tsx scripts/check-parity.ts",
16
+ "docs:generate": "tsx scripts/generate-capabilities.ts",
17
+ "docs:check": "tsx scripts/generate-capabilities.ts --check",
18
+ "prepublishOnly": "npm run check:parity && npm run docs:check && npm test && npm run build"
19
+ },
20
+ "keywords": [
21
+ "feedbackbasket",
22
+ "feedback",
23
+ "cli",
24
+ "ai-agent",
25
+ "developer-tools"
26
+ ],
27
+ "author": "deifosv",
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/deifos/feedbackbasket-cli.git"
32
+ },
33
+ "homepage": "https://feedbackbasket.com",
34
+ "dependencies": {
35
+ "chalk": "^5.3.0",
36
+ "commander": "^13.1.0",
37
+ "feedbackbasket-agent-contract": "3.2.0",
38
+ "open": "^10.1.0"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^22.0.0",
42
+ "tsx": "^4.23.0",
43
+ "typescript": "^5.7.0"
44
+ },
45
+ "engines": {
46
+ "node": ">=18"
47
+ },
48
+ "files": [
49
+ "dist/**/*",
50
+ "skills/**/*",
51
+ "README.md",
52
+ "CHANGELOG.md"
53
+ ]
54
+ }