@nocoo/zhe 1.11.3 → 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.
Files changed (48) hide show
  1. package/dist/api/client.d.ts +29 -1
  2. package/dist/api/client.d.ts.map +1 -1
  3. package/dist/api/client.js +65 -2
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/api/types.d.ts +70 -0
  6. package/dist/api/types.d.ts.map +1 -1
  7. package/dist/commands/create.d.ts +1 -1
  8. package/dist/commands/create.d.ts.map +1 -1
  9. package/dist/commands/create.js +48 -4
  10. package/dist/commands/create.js.map +1 -1
  11. package/dist/commands/folders.d.ts +10 -0
  12. package/dist/commands/folders.d.ts.map +1 -0
  13. package/dist/commands/folders.js +58 -0
  14. package/dist/commands/folders.js.map +1 -0
  15. package/dist/commands/get.d.ts.map +1 -1
  16. package/dist/commands/get.js +29 -2
  17. package/dist/commands/get.js.map +1 -1
  18. package/dist/commands/idea.d.ts +5 -0
  19. package/dist/commands/idea.d.ts.map +1 -0
  20. package/dist/commands/idea.js +406 -0
  21. package/dist/commands/idea.js.map +1 -0
  22. package/dist/commands/inbox.d.ts +19 -0
  23. package/dist/commands/inbox.d.ts.map +1 -0
  24. package/dist/commands/inbox.js +81 -0
  25. package/dist/commands/inbox.js.map +1 -0
  26. package/dist/commands/list.d.ts +26 -1
  27. package/dist/commands/list.d.ts.map +1 -1
  28. package/dist/commands/list.js +71 -6
  29. package/dist/commands/list.js.map +1 -1
  30. package/dist/commands/tags.d.ts +10 -0
  31. package/dist/commands/tags.d.ts.map +1 -0
  32. package/dist/commands/tags.js +58 -0
  33. package/dist/commands/tags.js.map +1 -0
  34. package/dist/commands/update.d.ts +23 -1
  35. package/dist/commands/update.d.ts.map +1 -1
  36. package/dist/commands/update.js +63 -5
  37. package/dist/commands/update.js.map +1 -1
  38. package/dist/index.js +10 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/utils.d.ts +33 -3
  41. package/dist/utils.d.ts.map +1 -1
  42. package/dist/utils.js +128 -4
  43. package/dist/utils.js.map +1 -1
  44. package/dist/version.d.ts +5 -0
  45. package/dist/version.d.ts.map +1 -0
  46. package/dist/version.js +28 -0
  47. package/dist/version.js.map +1 -0
  48. package/package.json +1 -1
@@ -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":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * zhe inbox — List uncategorized links (no folder)
3
+ */
4
+ export declare const inboxCommand: import("citty").CommandDef<{
5
+ readonly limit: {
6
+ readonly type: "string";
7
+ readonly alias: "l";
8
+ readonly description: "Max results (default: 50, max: 500)";
9
+ };
10
+ readonly json: {
11
+ readonly type: "boolean";
12
+ readonly description: "Output as JSON";
13
+ };
14
+ readonly minimal: {
15
+ readonly type: "boolean";
16
+ readonly description: "Output short URLs only";
17
+ };
18
+ }>;
19
+ //# sourceMappingURL=inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;EA4DvB,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * zhe inbox — List uncategorized links (no folder)
3
+ */
4
+ import { defineCommand, pc } from "@nocoo/cli-base";
5
+ import { ApiClient, ApiClientError, EXIT_AUTH_REQUIRED, EXIT_ERROR, EXIT_RATE_LIMITED, } from "../api/client.js";
6
+ import { getApiKey, getOutputFormat } from "../config.js";
7
+ import { formatLinksMinimal, formatLinksTable } from "../utils.js";
8
+ export const inboxCommand = defineCommand({
9
+ meta: {
10
+ name: "inbox",
11
+ description: "List uncategorized links (no folder)",
12
+ },
13
+ args: {
14
+ limit: {
15
+ type: "string",
16
+ alias: "l",
17
+ description: "Max results (default: 50, max: 500)",
18
+ },
19
+ json: {
20
+ type: "boolean",
21
+ description: "Output as JSON",
22
+ },
23
+ minimal: {
24
+ type: "boolean",
25
+ description: "Output short URLs only",
26
+ },
27
+ },
28
+ async run({ args }) {
29
+ const apiKey = getApiKey();
30
+ if (!apiKey) {
31
+ console.log(pc.red("Not authenticated. Run `zhe login` first."));
32
+ process.exit(EXIT_AUTH_REQUIRED);
33
+ }
34
+ const client = new ApiClient(apiKey);
35
+ try {
36
+ const params = {
37
+ inbox: true,
38
+ ...(args.limit ? { limit: Number.parseInt(args.limit, 10) } : {}),
39
+ };
40
+ const response = await client.listLinks(params);
41
+ // Determine output format
42
+ let format = getOutputFormat();
43
+ if (args.json)
44
+ format = "json";
45
+ if (args.minimal)
46
+ format = "minimal";
47
+ switch (format) {
48
+ case "json":
49
+ console.log(JSON.stringify(response, null, 2));
50
+ break;
51
+ case "minimal":
52
+ console.log(formatLinksMinimal(response.links));
53
+ break;
54
+ default:
55
+ if (response.links.length === 0) {
56
+ console.log(pc.dim("No uncategorized links found."));
57
+ }
58
+ else {
59
+ console.log(formatLinksTable(response.links));
60
+ }
61
+ }
62
+ }
63
+ catch (error) {
64
+ handleApiError(error);
65
+ }
66
+ },
67
+ });
68
+ function handleApiError(error) {
69
+ if (error instanceof ApiClientError) {
70
+ console.log(pc.red(`Error: ${error.message}`));
71
+ if (error.status === 401) {
72
+ process.exit(EXIT_AUTH_REQUIRED);
73
+ }
74
+ if (error.status === 429) {
75
+ process.exit(EXIT_RATE_LIMITED);
76
+ }
77
+ process.exit(EXIT_ERROR);
78
+ }
79
+ throw error;
80
+ }
81
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,25 @@
2
2
  * zhe list — List all links
3
3
  */
4
4
  export declare const listCommand: import("citty").CommandDef<{
5
+ readonly query: {
6
+ readonly type: "string";
7
+ readonly alias: "q";
8
+ readonly description: "Search by slug, URL, note, or title";
9
+ };
5
10
  readonly folder: {
6
11
  readonly type: "string";
7
12
  readonly alias: "f";
8
- readonly description: "Filter by folder ID";
13
+ readonly description: "Filter by folder name or ID";
14
+ };
15
+ readonly inbox: {
16
+ readonly type: "boolean";
17
+ readonly alias: "i";
18
+ readonly description: "Show uncategorized links only (no folder)";
19
+ };
20
+ readonly tag: {
21
+ readonly type: "string";
22
+ readonly alias: "t";
23
+ readonly description: "Filter by tag name or ID";
9
24
  };
10
25
  readonly limit: {
11
26
  readonly type: "string";
@@ -25,5 +40,15 @@ export declare const listCommand: import("citty").CommandDef<{
25
40
  readonly type: "boolean";
26
41
  readonly description: "Output short URLs only";
27
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
+ };
28
53
  }>;
29
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;AAcH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;EAmEtB,CAAC"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2ItB,CAAC"}