@zoobbe/cli 1.1.1 → 1.2.1

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
@@ -13,11 +13,10 @@ Requires Node.js 18 or later.
13
13
  ## Quick Start
14
14
 
15
15
  ```bash
16
- # Authenticate with your API key
17
- zoobbe auth login --token zb_live_xxxxx
16
+ # Login via browser (recommended)
17
+ zoobbe auth login
18
18
 
19
- # Or point to a self-hosted instance
20
- zoobbe config set apiUrl https://your-instance.com
19
+ # Or authenticate directly with an API key
21
20
  zoobbe auth login --token zb_live_xxxxx
22
21
 
23
22
  # Set your active workspace
@@ -31,18 +30,41 @@ zoobbe card list --board <board-id>
31
30
 
32
31
  ## Authentication
33
32
 
34
- Generate an API key from your workspace settings at **Settings > API Keys**, then:
33
+ ### Browser Login (Recommended)
34
+
35
+ Simply run `zoobbe auth login` — the CLI opens your browser where you authorize access. The token is sent back automatically via a secure localhost callback.
36
+
37
+ ```bash
38
+ $ zoobbe auth login
39
+ Opening browser for authentication...
40
+ ✓ Logged in as Akash M
41
+ ```
42
+
43
+ If the browser doesn't open or the callback times out after 2 minutes, the CLI falls back to a manual paste prompt.
44
+
45
+ ### Direct Token Login
46
+
47
+ You can also pass an API key directly. Generate one from **Settings > API Keys** in your workspace:
35
48
 
36
49
  ```bash
37
50
  zoobbe auth login --token zb_live_your_api_key_here
38
51
  ```
39
52
 
40
- Check your login status:
53
+ ### Self-Hosted Instances
54
+
55
+ For self-hosted Zoobbe instances, set your API URL first:
56
+
57
+ ```bash
58
+ zoobbe auth login --url https://api.your-instance.com
59
+ ```
60
+
61
+ ### Auth Commands
41
62
 
42
63
  ```bash
43
64
  zoobbe auth whoami # Show current user
44
65
  zoobbe auth status # Show auth details
45
66
  zoobbe auth logout # Clear credentials
67
+ zoobbe auth clear # Reset apiUrl and webUrl
46
68
  ```
47
69
 
48
70
  ## Commands
@@ -51,9 +73,18 @@ zoobbe auth logout # Clear credentials
51
73
 
52
74
  ```bash
53
75
  zoobbe workspace list # List your workspaces
54
- zoobbe workspace switch <id> # Set active workspace
55
- zoobbe workspace info [id] # Show workspace details
76
+ zoobbe workspace switch <name> # Set active workspace
77
+ zoobbe workspace create <name> # Create a new workspace
78
+ zoobbe workspace info # Show active workspace details
56
79
  zoobbe workspace members # List workspace members
80
+ zoobbe workspace update --name <n> # Rename active workspace
81
+ zoobbe workspace delete # Delete active workspace
82
+ zoobbe workspace invite -e <email> # Invite a user by email
83
+ zoobbe workspace join-link # Generate a join link
84
+ zoobbe workspace join-link --delete
85
+ zoobbe workspace add-member -u <id>
86
+ zoobbe workspace remove-member -u <id>
87
+ zoobbe workspace member-role -u <id> --role admin
57
88
  ```
58
89
 
59
90
  ### Boards
@@ -62,24 +93,98 @@ zoobbe workspace members # List workspace members
62
93
  zoobbe board list # List boards in active workspace
63
94
  zoobbe board list --all # Include archived boards
64
95
  zoobbe board create <name> # Create a new board
65
- zoobbe board create <name> -v Public # Create with visibility
96
+ zoobbe board create <name> -v Public
66
97
  zoobbe board info <id> # Show board details
67
98
  zoobbe board open <id> # Open board in browser
99
+ zoobbe board update <id> -t <title> -d <desc>
68
100
  zoobbe board archive <id> # Archive a board
101
+ zoobbe board restore <id> # Restore an archived board
102
+ zoobbe board delete <id> # Permanently delete a board
103
+ zoobbe board members <id> # List board members
104
+ zoobbe board add-member <id> -u <userId> --role admin
105
+ zoobbe board remove-member <id> -u <userId>
106
+ zoobbe board invite <id> -e <email>
107
+ zoobbe board join-link <id> # Generate join link
108
+ zoobbe board labels <id> # List board labels
109
+ zoobbe board label-create <id> --text "Bug" --color red
110
+ zoobbe board label-delete <id> --label <labelId>
111
+ zoobbe board visibility <id> Public
112
+ zoobbe board activities <id> # Show board activity log
113
+ ```
114
+
115
+ ### Lists
116
+
117
+ ```bash
118
+ zoobbe list ls -b <boardId> # List all lists on a board
119
+ zoobbe list create <title> -b <boardId>
120
+ zoobbe list update <listId> -t <title> --color "#ff0000"
121
+ zoobbe list delete <listId> # Delete list and all cards
122
+ zoobbe list archive <listId> # Archive a list
123
+ zoobbe list archive --unarchive # Unarchive a list
124
+ zoobbe list archive-cards <listId> # Archive all cards in a list
125
+ zoobbe list copy <listId> # Copy list with all cards
126
+ zoobbe list watch <listId> # Toggle watch
127
+ zoobbe list archived -b <boardId> # Show archived lists
69
128
  ```
70
129
 
71
130
  ### Cards
72
131
 
73
132
  ```bash
74
133
  zoobbe card list --board <id> # List cards on a board
75
- zoobbe card create <title> -b <board-id> # Create card in first list
76
- zoobbe card create <title> -b <id> -l <list-id> # Create card in specific list
77
- zoobbe card create <title> -b <id> --due 2026-04-01 --priority high
78
- zoobbe card info <card-id> # Show card details
79
- zoobbe card move <card-id> -l <list-name> # Move card to another list
80
- zoobbe card assign <card-id> -u <user-id> # Assign a user
81
- zoobbe card comment <card-id> "your message" # Add a comment
82
- zoobbe card done <card-id> # Mark card as complete
134
+ zoobbe card create <title> -b <id> # Create card in first list
135
+ zoobbe card create <title> -b <id> -l <listId> --due 2026-04-01 --priority high
136
+ zoobbe card info <cardId> # Show card details
137
+ zoobbe card update <cardId> -t <title> -d <desc>
138
+ zoobbe card move <cardId> -l <listName>
139
+ zoobbe card copy <cardId> -l <listId>
140
+ zoobbe card assign <cardId> -u <userId>
141
+ zoobbe card unassign <cardId> -u <userId>
142
+ zoobbe card members <cardId> # List card members
143
+ zoobbe card comment <cardId> "message"
144
+ zoobbe card comments <cardId> # List comments
145
+ zoobbe card label <cardId> # Add/remove labels (interactive)
146
+ zoobbe card done <cardId> # Mark as complete
147
+ zoobbe card undone <cardId> # Mark as incomplete
148
+ zoobbe card archive <cardId>
149
+ zoobbe card delete <cardId> # Permanently delete
150
+ zoobbe card due <cardId> 2026-05-01
151
+ zoobbe card due <cardId> --remove
152
+ zoobbe card priority <cardId> high
153
+ zoobbe card watch <cardId>
154
+ zoobbe card attachments <cardId> # List attachments
155
+ zoobbe card attach <cardId> ./file.pdf
156
+ zoobbe card activities <cardId> # Show activity log
157
+ ```
158
+
159
+ ### Checklists
160
+
161
+ ```bash
162
+ zoobbe checklist list <cardId> # List checklists
163
+ zoobbe checklist add <cardId> "QA Tasks" # Add a checklist
164
+ zoobbe checklist rename <cardId> <clId> -t "New" # Rename
165
+ zoobbe checklist delete <cardId> <clId> # Delete checklist
166
+ zoobbe checklist add-item <cardId> <clId> "Test login flow"
167
+ zoobbe checklist check <cardId> <clId> <itemId> # Toggle complete
168
+ zoobbe checklist update-item <cardId> <clId> <itemId> -t "Updated"
169
+ zoobbe checklist delete-item <cardId> <clId> <itemId>
170
+ ```
171
+
172
+ ### Timers
173
+
174
+ ```bash
175
+ zoobbe timer start <cardId> # Start stopwatch
176
+ zoobbe timer start <cardId> --mode pomodoro
177
+ zoobbe timer pause <cardId>
178
+ zoobbe timer resume <cardId>
179
+ zoobbe timer stop <cardId> # Stop and save session
180
+ zoobbe timer reset <cardId>
181
+ zoobbe timer mode <cardId> pomodoro # Switch mode
182
+ zoobbe timer get <cardId> # Get current state
183
+ zoobbe timer sessions <cardId> # List sessions
184
+ zoobbe timer status # Overall timer status
185
+ zoobbe timer running # All running timers
186
+ zoobbe timer stats # Timer statistics
187
+ zoobbe timer delete <cardId> # Delete timer data
83
188
  ```
84
189
 
85
190
  ### Pages
@@ -87,8 +192,99 @@ zoobbe card done <card-id> # Mark card as complete
87
192
  ```bash
88
193
  zoobbe page list # List pages
89
194
  zoobbe page create <title> # Create a new page
90
- zoobbe page info <page-id> # Show page details
91
- zoobbe page open <page-id> # Open page in browser
195
+ zoobbe page info <pageId> # Show page details
196
+ zoobbe page open <pageId> # Open page in browser
197
+ zoobbe page update <pageId> -t <title> --icon "📝"
198
+ zoobbe page delete <pageId> # Soft delete
199
+ zoobbe page delete <pageId> --permanent
200
+ zoobbe page archive <pageId>
201
+ zoobbe page restore <pageId>
202
+ zoobbe page duplicate <pageId>
203
+ zoobbe page favorite <pageId> # Toggle favorite
204
+ zoobbe page share <pageId> --public
205
+ zoobbe page share <pageId> --revoke
206
+ zoobbe page share <pageId> -u <userId> --role editor
207
+ zoobbe page members <pageId>
208
+ zoobbe page add-member <pageId> -u <userId> --role editor
209
+ zoobbe page remove-member <pageId> -u <userId>
210
+ zoobbe page comments <pageId> # List comments
211
+ zoobbe page comment <pageId> "Great doc!"
212
+ ```
213
+
214
+ ### Notifications
215
+
216
+ ```bash
217
+ zoobbe notification list # List notifications
218
+ zoobbe notification list --unread # Only unread
219
+ zoobbe notification count # Unread count
220
+ zoobbe notification read <id> # Mark as read
221
+ zoobbe notification read-all # Mark all as read
222
+ ```
223
+
224
+ ### Activity
225
+
226
+ ```bash
227
+ zoobbe activity board <boardId> # Board activity log
228
+ zoobbe activity card <cardId> # Card activity log
229
+ zoobbe activity me # Your recent activity
230
+ ```
231
+
232
+ ### Analytics
233
+
234
+ ```bash
235
+ zoobbe analytics board <boardId> # Board overview
236
+ zoobbe analytics metrics <boardId> --range 30d
237
+ zoobbe analytics time <boardId> # Time analytics
238
+ zoobbe analytics timeline <boardId> # Full timeline
239
+ zoobbe analytics productivity <boardId> # User productivity
240
+ zoobbe analytics workflow <boardId> # Workflow analytics
241
+ zoobbe analytics workspace # Workspace analytics
242
+ zoobbe analytics user # Your personal analytics
243
+ zoobbe analytics trends # Trends
244
+ zoobbe analytics export <boardId> -o report.json
245
+ ```
246
+
247
+ ### Automations
248
+
249
+ ```bash
250
+ zoobbe automation list -b <boardId>
251
+ zoobbe automation create -b <boardId> # Interactive creation
252
+ zoobbe automation update <id> -b <boardId> --name "New name"
253
+ zoobbe automation delete <id> -b <boardId>
254
+ zoobbe automation toggle <id> -b <boardId> # Enable/disable
255
+ zoobbe automation logs <id> -b <boardId> # Execution logs
256
+ zoobbe automation options -b <boardId> # Available triggers/actions
257
+ zoobbe automation info <id> -b <boardId>
258
+ ```
259
+
260
+ ### Webhooks
261
+
262
+ ```bash
263
+ zoobbe webhook list # List webhooks
264
+ zoobbe webhook create --url <url> --events card.created,card.moved --name "My Hook"
265
+ zoobbe webhook update <id> --url <newUrl>
266
+ zoobbe webhook delete <id>
267
+ zoobbe webhook logs <id> # Delivery logs
268
+ ```
269
+
270
+ ### API Keys
271
+
272
+ ```bash
273
+ zoobbe api-key list # List your API keys
274
+ zoobbe api-key create --name "CI" # Create a new key
275
+ zoobbe api-key delete <id>
276
+ zoobbe api-key rename <id> --name "Production"
277
+ zoobbe api-key regenerate <id> # Regenerate key
278
+ ```
279
+
280
+ > Note: Some API key operations may require session auth (browser login) rather than API key auth.
281
+
282
+ ### Import
283
+
284
+ ```bash
285
+ zoobbe import trello --key <trelloKey> --token <trelloToken>
286
+ zoobbe import status <jobId> # Check import progress
287
+ zoobbe import jobs # List all import jobs
92
288
  ```
93
289
 
94
290
  ### Search
@@ -146,25 +342,27 @@ zoobbe board list --format table # Table (default)
146
342
 
147
343
  Most commands have short aliases:
148
344
 
149
- | Command | Alias |
150
- |-------------|-------|
151
- | `board` | `b` |
152
- | `card` | `c` |
153
- | `page` | `p` |
154
- | `list` | `ls` |
345
+ | Command | Alias |
346
+ |----------------|--------|
347
+ | `workspace` | `ws` |
348
+ | `board` | `b` |
349
+ | `card` | `c` |
350
+ | `list` | `l` |
351
+ | `checklist` | `cl` |
352
+ | `page` | `p` |
353
+ | `timer` | `t` |
354
+ | `notification` | `n` |
355
+ | `analytics` | `an` |
356
+ | `automation` | `auto` |
357
+ | `webhook` | `wh` |
358
+ | `api-key` | `ak` |
155
359
 
156
360
  ```bash
157
361
  zoobbe b ls # Same as: zoobbe board list
158
362
  zoobbe c ls -b <id> # Same as: zoobbe card list --board <id>
159
- ```
160
-
161
- ## Self-Hosted
162
-
163
- For self-hosted Zoobbe instances, set your API URL before logging in:
164
-
165
- ```bash
166
- zoobbe config set apiUrl https://your-instance.com
167
- zoobbe auth login --token zb_live_xxxxx
363
+ zoobbe cl ls <cardId> # Same as: zoobbe checklist list <cardId>
364
+ zoobbe t start <cardId> # Same as: zoobbe timer start <cardId>
365
+ zoobbe n ls --unread # Same as: zoobbe notification list --unread
168
366
  ```
169
367
 
170
368
  ## License
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zoobbe/cli",
3
- "version": "1.1.1",
3
+ "version": "1.2.1",
4
4
  "description": "Zoobbe CLI - Manage boards, cards, and projects from the terminal",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -0,0 +1,102 @@
1
+ const { Command } = require('commander');
2
+ const client = require('../lib/client');
3
+ const { output, error } = require('../lib/output');
4
+ const { withSpinner } = require('../utils/spinner');
5
+ const { formatRelativeTime } = require('../utils/format');
6
+
7
+ const activity = new Command('activity')
8
+ .description('Activity log commands');
9
+
10
+ activity
11
+ .command('board <boardId>')
12
+ .description('Show activity log for a board')
13
+ .option('--limit <n>', 'Number of activities', '20')
14
+ .option('-f, --format <format>', 'Output format')
15
+ .action(async (boardId, options) => {
16
+ try {
17
+ const data = await withSpinner('Fetching activities...', () =>
18
+ client.get(`/boards/${boardId}/activities`)
19
+ );
20
+
21
+ const activities = data.activities || data.data || data;
22
+ const actArr = Array.isArray(activities) ? activities : [];
23
+ const limited = actArr.slice(0, parseInt(options.limit));
24
+
25
+ const rows = limited.map(a => ({
26
+ action: a.action || a.type || 'unknown',
27
+ user: a.user?.userName || a.user?.name || 'N/A',
28
+ target: a.target || a.card?.title || '',
29
+ time: formatRelativeTime(a.createdAt),
30
+ }));
31
+
32
+ output(rows, {
33
+ headers: ['Action', 'User', 'Target', 'Time'],
34
+ format: options.format,
35
+ });
36
+ } catch (err) {
37
+ error(`Failed to fetch activities: ${err.message}`);
38
+ }
39
+ });
40
+
41
+ activity
42
+ .command('card <cardId>')
43
+ .description('Show activity log for a card')
44
+ .option('--limit <n>', 'Number of activities', '20')
45
+ .option('-f, --format <format>', 'Output format')
46
+ .action(async (cardId, options) => {
47
+ try {
48
+ const data = await withSpinner('Fetching activities...', () =>
49
+ client.get(`/cards/${cardId}/activities`)
50
+ );
51
+
52
+ const activities = data.activities || data.data || data;
53
+ const actArr = Array.isArray(activities) ? activities : [];
54
+ const limited = actArr.slice(0, parseInt(options.limit));
55
+
56
+ const rows = limited.map(a => ({
57
+ action: a.action || a.type || 'unknown',
58
+ user: a.user?.userName || a.user?.name || 'N/A',
59
+ detail: (a.detail || a.description || '').substring(0, 60),
60
+ time: formatRelativeTime(a.createdAt),
61
+ }));
62
+
63
+ output(rows, {
64
+ headers: ['Action', 'User', 'Detail', 'Time'],
65
+ format: options.format,
66
+ });
67
+ } catch (err) {
68
+ error(`Failed to fetch activities: ${err.message}`);
69
+ }
70
+ });
71
+
72
+ activity
73
+ .command('me')
74
+ .description('Show your recent activity')
75
+ .option('--limit <n>', 'Number of activities', '20')
76
+ .option('-f, --format <format>', 'Output format')
77
+ .action(async (options) => {
78
+ try {
79
+ const data = await withSpinner('Fetching activities...', () =>
80
+ client.get('/users/me/activities')
81
+ );
82
+
83
+ const activities = data.activities || data.data || data;
84
+ const actArr = Array.isArray(activities) ? activities : [];
85
+ const limited = actArr.slice(0, parseInt(options.limit));
86
+
87
+ const rows = limited.map(a => ({
88
+ action: a.action || a.type || 'unknown',
89
+ target: a.target || a.card?.title || a.board?.name || '',
90
+ time: formatRelativeTime(a.createdAt),
91
+ }));
92
+
93
+ output(rows, {
94
+ headers: ['Action', 'Target', 'Time'],
95
+ format: options.format,
96
+ });
97
+ } catch (err) {
98
+ error(`Failed to fetch activities: ${err.message}`);
99
+ }
100
+ });
101
+
102
+ module.exports = activity;