@nocoo/zhe 1.13.0 → 1.15.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.
@@ -0,0 +1,406 @@
1
+ /**
2
+ * zhe idea — Manage ideas (Markdown notes)
3
+ */
4
+ import * as readline from "node:readline";
5
+ import { defineCommand, pc } from "@nocoo/cli-base";
6
+ import { ApiClient, ApiClientError, EXIT_AUTH_REQUIRED, EXIT_ERROR, EXIT_INVALID_ARGS, EXIT_NOT_FOUND, EXIT_RATE_LIMITED, } from "../api/client.js";
7
+ import { getApiKey } from "../config.js";
8
+ // ── Helpers ──
9
+ function requireAuth() {
10
+ const apiKey = getApiKey();
11
+ if (!apiKey) {
12
+ console.log(pc.red("Not authenticated. Run `zhe login` first."));
13
+ process.exit(EXIT_AUTH_REQUIRED);
14
+ }
15
+ return apiKey;
16
+ }
17
+ function handleApiError(error) {
18
+ if (error instanceof ApiClientError) {
19
+ if (error.status === 400) {
20
+ console.log(pc.red(`Error: ${error.message}`));
21
+ }
22
+ else if (error.status === 404) {
23
+ console.log(pc.red("Idea not found."));
24
+ process.exit(EXIT_NOT_FOUND);
25
+ }
26
+ else {
27
+ console.log(pc.red(`Error: ${error.message}`));
28
+ }
29
+ if (error.status === 401) {
30
+ process.exit(EXIT_AUTH_REQUIRED);
31
+ }
32
+ if (error.status === 429) {
33
+ process.exit(EXIT_RATE_LIMITED);
34
+ }
35
+ process.exit(EXIT_ERROR);
36
+ }
37
+ throw error;
38
+ }
39
+ function formatDate(isoDate) {
40
+ const date = new Date(isoDate);
41
+ return new Intl.DateTimeFormat("en-US", {
42
+ month: "short",
43
+ day: "numeric",
44
+ year: "numeric",
45
+ hour: "numeric",
46
+ minute: "2-digit",
47
+ }).format(date);
48
+ }
49
+ function formatTags(tags) {
50
+ if (tags.length === 0)
51
+ return "";
52
+ return tags.map((t) => `[${t.name}]`).join(" ");
53
+ }
54
+ /**
55
+ * Resolve a single tag name to tag ID via API.
56
+ * Returns null if tag is not found or if multiple tags match (with error message printed).
57
+ */
58
+ async function resolveTagName(client, tagName) {
59
+ const { tags } = await client.listTags();
60
+ const matches = tags.filter((t) => t.name.toLowerCase() === tagName.toLowerCase());
61
+ if (matches.length === 0) {
62
+ console.log(pc.red(`Tag not found: ${tagName}. Create it first.`));
63
+ return null;
64
+ }
65
+ if (matches.length > 1) {
66
+ console.log(pc.red(`Multiple tags match "${tagName}". Tag names must be unique. Please rename or delete duplicates via the web UI.`));
67
+ return null;
68
+ }
69
+ return matches[0].id;
70
+ }
71
+ async function confirm(message) {
72
+ return new Promise((resolve) => {
73
+ const rl = readline.createInterface({
74
+ input: process.stdin,
75
+ output: process.stdout,
76
+ });
77
+ rl.question(`${message} [y/N] `, (answer) => {
78
+ rl.close();
79
+ resolve(answer.toLowerCase() === "y");
80
+ });
81
+ });
82
+ }
83
+ // ── Subcommands ──
84
+ const listSubcommand = defineCommand({
85
+ meta: {
86
+ name: "list",
87
+ description: "List all ideas",
88
+ },
89
+ args: {
90
+ limit: {
91
+ type: "string",
92
+ alias: "l",
93
+ description: "Max results (default: 20)",
94
+ },
95
+ tag: {
96
+ type: "string",
97
+ alias: "t",
98
+ description: "Filter by tag name",
99
+ },
100
+ query: {
101
+ type: "string",
102
+ alias: "q",
103
+ description: "Search title and excerpt",
104
+ },
105
+ json: {
106
+ type: "boolean",
107
+ description: "Output as JSON",
108
+ },
109
+ },
110
+ async run({ args }) {
111
+ const apiKey = requireAuth();
112
+ const client = new ApiClient(apiKey);
113
+ try {
114
+ // Resolve tag name to ID if provided
115
+ let tagId;
116
+ if (args.tag) {
117
+ const resolved = await resolveTagName(client, args.tag);
118
+ if (resolved === null) {
119
+ process.exit(EXIT_INVALID_ARGS);
120
+ }
121
+ tagId = resolved;
122
+ }
123
+ const response = await client.listIdeas({
124
+ limit: args.limit ? Number.parseInt(args.limit, 10) : 20,
125
+ tagId,
126
+ q: args.query,
127
+ });
128
+ if (args.json) {
129
+ console.log(JSON.stringify(response, null, 2));
130
+ return;
131
+ }
132
+ if (response.ideas.length === 0) {
133
+ console.log(pc.yellow("No ideas found."));
134
+ return;
135
+ }
136
+ // Table format
137
+ console.log(pc.dim("ID TIME TITLE TAGS"));
138
+ console.log(pc.dim("─".repeat(56)));
139
+ for (const idea of response.ideas) {
140
+ const time = formatDate(idea.createdAt);
141
+ const title = (idea.title || idea.excerpt || "(no content)").slice(0, 24);
142
+ const tags = formatTags(idea.tags);
143
+ console.log(`${pc.cyan(String(idea.id).padEnd(6))}${time.padEnd(17)}${title.padEnd(25)}${pc.yellow(tags)}`);
144
+ }
145
+ }
146
+ catch (error) {
147
+ handleApiError(error);
148
+ }
149
+ },
150
+ });
151
+ const getSubcommand = defineCommand({
152
+ meta: {
153
+ name: "get",
154
+ description: "Get full content of an idea",
155
+ },
156
+ args: {
157
+ id: {
158
+ type: "positional",
159
+ description: "Idea ID",
160
+ required: true,
161
+ },
162
+ json: {
163
+ type: "boolean",
164
+ description: "Output as JSON",
165
+ },
166
+ },
167
+ async run({ args }) {
168
+ const apiKey = requireAuth();
169
+ const client = new ApiClient(apiKey);
170
+ const id = Number.parseInt(args.id, 10);
171
+ if (Number.isNaN(id)) {
172
+ console.log(pc.red("Invalid idea ID."));
173
+ process.exit(EXIT_INVALID_ARGS);
174
+ }
175
+ try {
176
+ const response = await client.getIdea(id);
177
+ if (args.json) {
178
+ console.log(JSON.stringify(response, null, 2));
179
+ return;
180
+ }
181
+ const { idea } = response;
182
+ const tags = formatTags(idea.tags);
183
+ const title = idea.title || formatDate(idea.createdAt);
184
+ console.log(pc.dim("─".repeat(40)));
185
+ console.log(`Idea ${pc.cyan(`#${idea.id}`)} — ${pc.bold(title)}`);
186
+ if (tags)
187
+ console.log(`Tags: ${pc.yellow(tags)}`);
188
+ console.log(pc.dim("─".repeat(40)));
189
+ console.log();
190
+ console.log(idea.content);
191
+ }
192
+ catch (error) {
193
+ handleApiError(error);
194
+ }
195
+ },
196
+ });
197
+ const addSubcommand = defineCommand({
198
+ meta: {
199
+ name: "add",
200
+ description: "Create a new idea",
201
+ },
202
+ args: {
203
+ content: {
204
+ type: "positional",
205
+ description: "Idea content (Markdown)",
206
+ required: true,
207
+ },
208
+ title: {
209
+ type: "string",
210
+ alias: "t",
211
+ description: "Optional title",
212
+ },
213
+ tag: {
214
+ type: "string",
215
+ alias: "T",
216
+ description: "Add tag by name",
217
+ },
218
+ json: {
219
+ type: "boolean",
220
+ description: "Output as JSON",
221
+ },
222
+ },
223
+ async run({ args }) {
224
+ const apiKey = requireAuth();
225
+ const client = new ApiClient(apiKey);
226
+ const content = args.content;
227
+ if (!content.trim()) {
228
+ console.log(pc.red("Content cannot be empty."));
229
+ process.exit(EXIT_INVALID_ARGS);
230
+ }
231
+ try {
232
+ // Resolve tag name to ID if provided
233
+ let tagIds;
234
+ if (args.tag) {
235
+ const tagId = await resolveTagName(client, args.tag);
236
+ if (tagId === null) {
237
+ process.exit(EXIT_INVALID_ARGS);
238
+ }
239
+ tagIds = [tagId];
240
+ }
241
+ const request = {
242
+ content,
243
+ ...(args.title && { title: args.title }),
244
+ ...(tagIds && { tagIds }),
245
+ };
246
+ const response = await client.createIdea(request);
247
+ if (args.json) {
248
+ console.log(JSON.stringify(response, null, 2));
249
+ return;
250
+ }
251
+ const { idea } = response;
252
+ const title = idea.title || formatDate(idea.createdAt);
253
+ console.log(pc.green(`✓ Created idea ${pc.cyan(`#${idea.id}`)} (${title})`));
254
+ }
255
+ catch (error) {
256
+ handleApiError(error);
257
+ }
258
+ },
259
+ });
260
+ const updateSubcommand = defineCommand({
261
+ meta: {
262
+ name: "update",
263
+ description: "Update an existing idea",
264
+ },
265
+ args: {
266
+ id: {
267
+ type: "positional",
268
+ description: "Idea ID",
269
+ required: true,
270
+ },
271
+ content: {
272
+ type: "string",
273
+ alias: "c",
274
+ description: "New content",
275
+ },
276
+ title: {
277
+ type: "string",
278
+ alias: "t",
279
+ description: "New title (use empty string to clear)",
280
+ },
281
+ tag: {
282
+ type: "string",
283
+ alias: "T",
284
+ description: "Set tag by name (replaces all existing tags)",
285
+ },
286
+ json: {
287
+ type: "boolean",
288
+ description: "Output as JSON",
289
+ },
290
+ },
291
+ async run({ args }) {
292
+ const apiKey = requireAuth();
293
+ const client = new ApiClient(apiKey);
294
+ const id = Number.parseInt(args.id, 10);
295
+ if (Number.isNaN(id)) {
296
+ console.log(pc.red("Invalid idea ID."));
297
+ process.exit(EXIT_INVALID_ARGS);
298
+ }
299
+ // Build update request
300
+ const request = {};
301
+ if (args.content !== undefined)
302
+ request.content = args.content;
303
+ if (args.title !== undefined) {
304
+ request.title = args.title === "" ? null : args.title;
305
+ }
306
+ // Resolve tag name if provided
307
+ if (args.tag !== undefined) {
308
+ if (args.tag === "") {
309
+ // Empty string means clear all tags
310
+ request.tagIds = [];
311
+ }
312
+ else {
313
+ const tagId = await resolveTagName(client, args.tag);
314
+ if (tagId === null) {
315
+ process.exit(EXIT_INVALID_ARGS);
316
+ }
317
+ request.tagIds = [tagId];
318
+ }
319
+ }
320
+ if (Object.keys(request).length === 0) {
321
+ console.log(pc.yellow("No changes specified."));
322
+ process.exit(EXIT_INVALID_ARGS);
323
+ }
324
+ try {
325
+ const response = await client.updateIdea(id, request);
326
+ if (args.json) {
327
+ console.log(JSON.stringify(response, null, 2));
328
+ return;
329
+ }
330
+ const { idea } = response;
331
+ const title = idea.title || formatDate(idea.createdAt);
332
+ console.log(pc.green(`✓ Updated idea ${pc.cyan(`#${idea.id}`)} (${title})`));
333
+ }
334
+ catch (error) {
335
+ handleApiError(error);
336
+ }
337
+ },
338
+ });
339
+ const deleteSubcommand = defineCommand({
340
+ meta: {
341
+ name: "delete",
342
+ description: "Delete an idea",
343
+ },
344
+ args: {
345
+ id: {
346
+ type: "positional",
347
+ description: "Idea ID",
348
+ required: true,
349
+ },
350
+ yes: {
351
+ type: "boolean",
352
+ alias: "y",
353
+ description: "Skip confirmation",
354
+ },
355
+ json: {
356
+ type: "boolean",
357
+ description: "Output as JSON",
358
+ },
359
+ },
360
+ async run({ args }) {
361
+ const apiKey = requireAuth();
362
+ const client = new ApiClient(apiKey);
363
+ const id = Number.parseInt(args.id, 10);
364
+ if (Number.isNaN(id)) {
365
+ console.log(pc.red("Invalid idea ID."));
366
+ process.exit(EXIT_INVALID_ARGS);
367
+ }
368
+ try {
369
+ // Only fetch idea for confirmation prompt (requires ideas:read)
370
+ // With --yes flag, skip prefetch to allow write-only keys
371
+ if (!args.yes) {
372
+ const { idea } = await client.getIdea(id);
373
+ const title = idea.title || formatDate(idea.createdAt);
374
+ const confirmed = await confirm(`Delete idea #${id} (${title})?`);
375
+ if (!confirmed) {
376
+ console.log(pc.dim("Cancelled."));
377
+ return;
378
+ }
379
+ }
380
+ await client.deleteIdea(id);
381
+ if (args.json) {
382
+ console.log(JSON.stringify({ success: true, id }, null, 2));
383
+ return;
384
+ }
385
+ console.log(pc.green(`✓ Deleted idea ${pc.cyan(`#${id}`)}`));
386
+ }
387
+ catch (error) {
388
+ handleApiError(error);
389
+ }
390
+ },
391
+ });
392
+ // ── Main command ──
393
+ export const ideaCommand = defineCommand({
394
+ meta: {
395
+ name: "idea",
396
+ description: "Manage ideas (Markdown notes)",
397
+ },
398
+ subCommands: {
399
+ list: listSubcommand,
400
+ get: getSubcommand,
401
+ add: addSubcommand,
402
+ update: updateSubcommand,
403
+ delete: deleteSubcommand,
404
+ },
405
+ });
406
+ //# sourceMappingURL=idea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea.js","sourceRoot":"","sources":["../../src/commands/idea.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACN,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,iBAAiB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,gBAAgB;AAEhB,SAAS,WAAW;IACnB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACrC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,KAAK,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IAClC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QACvC,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KACjB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,IAAW;IAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,cAAc,CAC5B,MAAiB,EACjB,OAAe;IAEf,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAC1B,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAC1D,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,kBAAkB,OAAO,oBAAoB,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CACV,EAAE,CAAC,GAAG,CACL,wBAAwB,OAAO,iFAAiF,CAChH,CACD,CAAC;QACF,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YACnC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,EAAE,CAAC,QAAQ,CAAC,GAAG,OAAO,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YAC3C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,oBAAoB;AAEpB,MAAM,cAAc,GAAG,aAAa,CAAC;IACpC,IAAI,EAAE;QACL,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,gBAAgB;KAC7B;IACD,IAAI,EAAE;QACL,KAAK,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,2BAA2B;SACxC;QACD,GAAG,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,oBAAoB;SACjC;QACD,KAAK,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,0BAA0B;SACvC;QACD,IAAI,EAAE;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,gBAAgB;SAC7B;KACD;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAErC,IAAI,CAAC;YACJ,qCAAqC;YACrC,IAAI,KAAyB,CAAC;YAC9B,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;oBACvB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACjC,CAAC;gBACD,KAAK,GAAG,QAAQ,CAAC;YAClB,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;gBACvC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;gBACxD,KAAK;gBACL,CAAC,EAAE,IAAI,CAAC,KAAK;aACb,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO;YACR,CAAC;YAED,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC1C,OAAO;YACR,CAAC;YAED,eAAe;YACf,OAAO,CAAC,GAAG,CACV,EAAE,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAC9D,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAEpC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC,KAAK,CACjE,CAAC,EACD,EAAE,CACF,CAAC;gBACF,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnC,OAAO,CAAC,GAAG,CACV,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAC9F,CAAC;YACH,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,cAAc,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;CACD,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,aAAa,CAAC;IACnC,IAAI,EAAE;QACL,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,6BAA6B;KAC1C;IACD,IAAI,EAAE;QACL,EAAE,EAAE;YACH,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,SAAS;YACtB,QAAQ,EAAE,IAAI;SACd;QACD,IAAI,EAAE;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,gBAAgB;SAC7B;KACD;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAErC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAY,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAE1C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO;YACR,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;YAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEvD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClE,IAAI,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,cAAc,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;CACD,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,aAAa,CAAC;IACnC,IAAI,EAAE;QACL,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,mBAAmB;KAChC;IACD,IAAI,EAAE;QACL,OAAO,EAAE;YACR,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,yBAAyB;YACtC,QAAQ,EAAE,IAAI;SACd;QACD,KAAK,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,gBAAgB;SAC7B;QACD,GAAG,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,iBAAiB;SAC9B;QACD,IAAI,EAAE;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,gBAAgB;SAC7B;KACD;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAErC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC;YACJ,qCAAqC;YACrC,IAAI,MAA4B,CAAC;YACjC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACjC,CAAC;gBACD,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,OAAO,GAAsB;gBAClC,OAAO;gBACP,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACxC,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;aACzB,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAElD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO;YACR,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CACV,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,CAC/D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,cAAc,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;CACD,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,aAAa,CAAC;IACtC,IAAI,EAAE;QACL,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,yBAAyB;KACtC;IACD,IAAI,EAAE;QACL,EAAE,EAAE;YACH,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,SAAS;YACtB,QAAQ,EAAE,IAAI;SACd;QACD,OAAO,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,aAAa;SAC1B;QACD,KAAK,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,uCAAuC;SACpD;QACD,GAAG,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,8CAA8C;SAC3D;QACD,IAAI,EAAE;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,gBAAgB;SAC7B;KACD;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAErC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAY,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC;QAED,uBAAuB;QACvB,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC/D,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACvD,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;gBACrB,oCAAoC;gBACpC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACP,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACjC,CAAC;gBACD,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACF,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAEtD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO;YACR,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CACV,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,CAC/D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,cAAc,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;CACD,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,aAAa,CAAC;IACtC,IAAI,EAAE;QACL,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gBAAgB;KAC7B;IACD,IAAI,EAAE;QACL,EAAE,EAAE;YACH,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,SAAS;YACtB,QAAQ,EAAE,IAAI;SACd;QACD,GAAG,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,mBAAmB;SAChC;QACD,IAAI,EAAE;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,gBAAgB;SAC7B;KACD;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAErC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAY,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC;YACJ,gEAAgE;YAChE,0DAA0D;YAC1D,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACf,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAEvD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;gBAClE,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;oBAClC,OAAO;gBACR,CAAC;YACF,CAAC;YAED,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAE5B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC5D,OAAO;YACR,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,cAAc,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;CACD,CAAC,CAAC;AAEH,qBAAqB;AAErB,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE;QACL,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,+BAA+B;KAC5C;IACD,WAAW,EAAE;QACZ,IAAI,EAAE,cAAc;QACpB,GAAG,EAAE,aAAa;QAClB,GAAG,EAAE,aAAa;QAClB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,gBAAgB;KACxB;CACD,CAAC,CAAC"}
@@ -10,7 +10,7 @@ export declare const listCommand: import("citty").CommandDef<{
10
10
  readonly folder: {
11
11
  readonly type: "string";
12
12
  readonly alias: "f";
13
- readonly description: "Filter by folder ID";
13
+ readonly description: "Filter by folder name or ID";
14
14
  };
15
15
  readonly inbox: {
16
16
  readonly type: "boolean";
@@ -20,7 +20,7 @@ export declare const listCommand: import("citty").CommandDef<{
20
20
  readonly tag: {
21
21
  readonly type: "string";
22
22
  readonly alias: "t";
23
- readonly description: "Filter by tag ID";
23
+ readonly description: "Filter by tag name or ID";
24
24
  };
25
25
  readonly limit: {
26
26
  readonly type: "string";
@@ -40,5 +40,15 @@ export declare const listCommand: import("citty").CommandDef<{
40
40
  readonly type: "boolean";
41
41
  readonly description: "Output short URLs only";
42
42
  };
43
+ readonly wide: {
44
+ readonly type: "boolean";
45
+ readonly alias: "w";
46
+ readonly description: "Show full URLs without truncation";
47
+ };
48
+ readonly count: {
49
+ readonly type: "boolean";
50
+ readonly alias: "c";
51
+ readonly description: "Show only the count of matching links";
52
+ };
43
53
  }>;
44
54
  //# sourceMappingURL=list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2FtB,CAAC"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2ItB,CAAC"}
@@ -4,7 +4,7 @@
4
4
  import { defineCommand, pc } from "@nocoo/cli-base";
5
5
  import { ApiClient, ApiClientError, EXIT_AUTH_REQUIRED, EXIT_ERROR, EXIT_INVALID_ARGS, EXIT_RATE_LIMITED, } from "../api/client.js";
6
6
  import { getApiKey, getOutputFormat } from "../config.js";
7
- import { formatLinksMinimal, formatLinksTable } from "../utils.js";
7
+ import { formatLinksMinimal, formatLinksTable, resolveFolderName, resolveTagName, } from "../utils.js";
8
8
  export const listCommand = defineCommand({
9
9
  meta: {
10
10
  name: "list",
@@ -19,7 +19,7 @@ export const listCommand = defineCommand({
19
19
  folder: {
20
20
  type: "string",
21
21
  alias: "f",
22
- description: "Filter by folder ID",
22
+ description: "Filter by folder name or ID",
23
23
  },
24
24
  inbox: {
25
25
  type: "boolean",
@@ -29,7 +29,7 @@ export const listCommand = defineCommand({
29
29
  tag: {
30
30
  type: "string",
31
31
  alias: "t",
32
- description: "Filter by tag ID",
32
+ description: "Filter by tag name or ID",
33
33
  },
34
34
  limit: {
35
35
  type: "string",
@@ -49,6 +49,16 @@ export const listCommand = defineCommand({
49
49
  type: "boolean",
50
50
  description: "Output short URLs only",
51
51
  },
52
+ wide: {
53
+ type: "boolean",
54
+ alias: "w",
55
+ description: "Show full URLs without truncation",
56
+ },
57
+ count: {
58
+ type: "boolean",
59
+ alias: "c",
60
+ description: "Show only the count of matching links",
61
+ },
52
62
  },
53
63
  async run({ args }) {
54
64
  const apiKey = getApiKey();
@@ -73,11 +83,40 @@ export const listCommand = defineCommand({
73
83
  params.query = args.query;
74
84
  if (args.inbox)
75
85
  params.inbox = true;
76
- if (args.folder)
77
- params.folderId = args.folder;
78
- if (args.tag)
79
- params.tagId = args.tag;
86
+ // Resolve folder name to ID
87
+ if (args.folder) {
88
+ const folderId = await resolveFolderName(client, args.folder);
89
+ if (folderId === null) {
90
+ process.exit(EXIT_INVALID_ARGS);
91
+ }
92
+ params.folderId = folderId;
93
+ }
94
+ // Resolve tag name to ID
95
+ if (args.tag) {
96
+ const tagId = await resolveTagName(client, args.tag);
97
+ if (tagId === null) {
98
+ process.exit(EXIT_INVALID_ARGS);
99
+ }
100
+ params.tagId = tagId;
101
+ }
80
102
  const response = await client.listLinks(params);
103
+ // Count-only mode: use total from API response
104
+ if (args.count) {
105
+ console.log(response.total);
106
+ return;
107
+ }
108
+ // Build folder name map for table output
109
+ let folderMap;
110
+ const hasFolders = response.links.some((l) => l.folderId);
111
+ if (hasFolders) {
112
+ try {
113
+ const foldersResponse = await client.listFolders();
114
+ folderMap = new Map(foldersResponse.folders.map((f) => [f.id, f.name]));
115
+ }
116
+ catch {
117
+ // If folder fetch fails, continue without folder names
118
+ }
119
+ }
81
120
  // Determine output format
82
121
  let format = getOutputFormat();
83
122
  if (args.json)
@@ -92,7 +131,7 @@ export const listCommand = defineCommand({
92
131
  console.log(formatLinksMinimal(response.links));
93
132
  break;
94
133
  default:
95
- console.log(formatLinksTable(response.links));
134
+ console.log(formatLinksTable(response.links, { wide: args.wide, folderMap }));
96
135
  }
97
136
  }
98
137
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,7 @@ export declare const updateCommand: import("citty").CommandDef<{
20
20
  readonly folder: {
21
21
  readonly type: "string";
22
22
  readonly alias: "f";
23
- readonly description: "New folder ID (use \"none\" to remove)";
23
+ readonly description: "Folder name or ID (use \"none\" to remove)";
24
24
  };
25
25
  readonly note: {
26
26
  readonly type: "string";
@@ -48,11 +48,11 @@ export declare const updateCommand: import("citty").CommandDef<{
48
48
  };
49
49
  readonly "add-tag": {
50
50
  readonly type: "string";
51
- readonly description: "Add tag to link (by ID)";
51
+ readonly description: "Add tag to link (by name or ID)";
52
52
  };
53
53
  readonly "remove-tag": {
54
54
  readonly type: "string";
55
- readonly description: "Remove tag from link (by ID)";
55
+ readonly description: "Remove tag from link (by name or ID)";
56
56
  };
57
57
  readonly json: {
58
58
  readonly type: "boolean";
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyJxB,CAAC"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2KxB,CAAC"}