@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 +232 -34
- package/package.json +1 -1
- package/src/commands/activity.js +102 -0
- package/src/commands/analytics.js +281 -0
- package/src/commands/api-key.js +140 -0
- package/src/commands/auth.js +199 -30
- package/src/commands/automation.js +255 -0
- package/src/commands/board.js +296 -2
- package/src/commands/card.js +367 -0
- package/src/commands/checklist.js +173 -0
- package/src/commands/import.js +101 -0
- package/src/commands/list.js +213 -0
- package/src/commands/notification.js +92 -0
- package/src/commands/page.js +254 -2
- package/src/commands/timer.js +234 -0
- package/src/commands/webhook.js +141 -0
- package/src/commands/workspace.js +177 -2
- package/src/index.js +10 -0
- package/src/lib/client.js +45 -4
- package/src/lib/config.js +21 -0
- package/src/utils/format.js +39 -0
- package/src/utils/prompts.js +40 -0
- package/src/utils/resolve.js +67 -0
package/README.md
CHANGED
|
@@ -13,11 +13,10 @@ Requires Node.js 18 or later.
|
|
|
13
13
|
## Quick Start
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
#
|
|
17
|
-
zoobbe auth login
|
|
16
|
+
# Login via browser (recommended)
|
|
17
|
+
zoobbe auth login
|
|
18
18
|
|
|
19
|
-
# Or
|
|
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
|
-
|
|
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
|
-
|
|
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 <
|
|
55
|
-
zoobbe workspace
|
|
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
|
|
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 <
|
|
76
|
-
zoobbe card create <title> -b <id> -l <
|
|
77
|
-
zoobbe card
|
|
78
|
-
zoobbe card
|
|
79
|
-
zoobbe card move <
|
|
80
|
-
zoobbe card
|
|
81
|
-
zoobbe card
|
|
82
|
-
zoobbe card
|
|
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 <
|
|
91
|
-
zoobbe page open <
|
|
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
|
|
150
|
-
|
|
151
|
-
| `
|
|
152
|
-
| `
|
|
153
|
-
| `
|
|
154
|
-
| `list`
|
|
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
|
-
|
|
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
|
@@ -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;
|