@alpacali/papyrus-cli 1.0.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 (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +188 -0
  3. package/dist/api.d.ts +67 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +247 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/cli.d.ts +8 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +391 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/cards.d.ts +52 -0
  12. package/dist/commands/cards.d.ts.map +1 -0
  13. package/dist/commands/cards.js +189 -0
  14. package/dist/commands/cards.js.map +1 -0
  15. package/dist/commands/data.d.ts +34 -0
  16. package/dist/commands/data.d.ts.map +1 -0
  17. package/dist/commands/data.js +230 -0
  18. package/dist/commands/data.js.map +1 -0
  19. package/dist/commands/review.d.ts +16 -0
  20. package/dist/commands/review.d.ts.map +1 -0
  21. package/dist/commands/review.js +132 -0
  22. package/dist/commands/review.js.map +1 -0
  23. package/dist/commands/serve.d.ts +24 -0
  24. package/dist/commands/serve.d.ts.map +1 -0
  25. package/dist/commands/serve.js +161 -0
  26. package/dist/commands/serve.js.map +1 -0
  27. package/dist/config.d.ts +37 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +94 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/index.d.ts +10 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +12 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/types.d.ts +114 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +5 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils.d.ts +52 -0
  40. package/dist/utils.d.ts.map +1 -0
  41. package/dist/utils.js +141 -0
  42. package/dist/utils.js.map +1 -0
  43. package/package.json +62 -0
package/dist/cli.js ADDED
@@ -0,0 +1,391 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Papyrus CLI - Main Entry Point
4
+ *
5
+ * A command-line interface for the Papyrus SRS learning system.
6
+ */
7
+ import { Command } from "commander";
8
+ import chalk from "chalk";
9
+ import { displayConfig, resetConfig, setConfig } from "./config.js";
10
+ import { addCardCommand, deleteCardCommand, dueCardsCommand, editCardCommand, exportCardsCommand, importCardsCommand, listCardsCommand, searchCardsCommand, showCardCommand, } from "./commands/cards.js";
11
+ import { backupCommand, cleanBackupsCommand, exportCommand, importCommand, listBackupsCommand, restoreCommand, statsCommand, } from "./commands/data.js";
12
+ import { reviewCommand, reviewStatsCommand } from "./commands/review.js";
13
+ import { docsCommand, serveCommand, statusCommand, stopCommand } from "./commands/serve.js";
14
+ // Version - will be replaced by build process
15
+ const version = "1.0.0";
16
+ // Create CLI
17
+ const program = new Command()
18
+ .name("papyrus")
19
+ .description("Papyrus CLI - Command line interface for Papyrus SRS")
20
+ .version(version, "-v, --version", "Display version number")
21
+ .configureOutput({
22
+ outputError: (str, write) => write(chalk.red(str)),
23
+ });
24
+ // ==================== Card Commands ====================
25
+ const cardCmd = program
26
+ .command("card")
27
+ .alias("cards")
28
+ .description("Manage flashcards");
29
+ cardCmd
30
+ .command("list")
31
+ .alias("ls")
32
+ .description("List all cards")
33
+ .option("-l, --limit <number>", "Limit number of results", parseInt)
34
+ .option("-t, --tags <tags>", "Filter by tags (comma-separated)")
35
+ .option("-d, --detailed", "Show detailed information")
36
+ .action(async (options) => {
37
+ try {
38
+ await listCardsCommand(options);
39
+ }
40
+ catch (error) {
41
+ console.error(chalk.red(`Error: ${error}`));
42
+ process.exit(1);
43
+ }
44
+ });
45
+ cardCmd
46
+ .command("show <id>")
47
+ .alias("get")
48
+ .description("Show card details")
49
+ .action(async (id) => {
50
+ try {
51
+ await showCardCommand(id);
52
+ }
53
+ catch (error) {
54
+ console.error(chalk.red(`Error: ${error}`));
55
+ process.exit(1);
56
+ }
57
+ });
58
+ cardCmd
59
+ .command("add <question> <answer>")
60
+ .alias("create")
61
+ .description("Add a new card")
62
+ .option("-t, --tags <tags>", "Add tags (comma-separated)")
63
+ .action(async (question, answer, options) => {
64
+ try {
65
+ await addCardCommand(question, answer, options);
66
+ }
67
+ catch (error) {
68
+ console.error(chalk.red(`Error: ${error}`));
69
+ process.exit(1);
70
+ }
71
+ });
72
+ cardCmd
73
+ .command("edit <id>")
74
+ .alias("update")
75
+ .description("Edit a card")
76
+ .option("-q, --question <text>", "Update question")
77
+ .option("-a, --answer <text>", "Update answer")
78
+ .option("-t, --tags <tags>", "Update tags (comma-separated)")
79
+ .action(async (id, options) => {
80
+ try {
81
+ await editCardCommand(id, options);
82
+ }
83
+ catch (error) {
84
+ console.error(chalk.red(`Error: ${error}`));
85
+ process.exit(1);
86
+ }
87
+ });
88
+ cardCmd
89
+ .command("delete <id>")
90
+ .alias("rm")
91
+ .description("Delete a card")
92
+ .option("-f, --force", "Force deletion without confirmation")
93
+ .action(async (id, options) => {
94
+ try {
95
+ await deleteCardCommand(id, options.force);
96
+ }
97
+ catch (error) {
98
+ console.error(chalk.red(`Error: ${error}`));
99
+ process.exit(1);
100
+ }
101
+ });
102
+ cardCmd
103
+ .command("search <query>")
104
+ .alias("find")
105
+ .description("Search cards")
106
+ .action(async (query) => {
107
+ try {
108
+ await searchCardsCommand(query);
109
+ }
110
+ catch (error) {
111
+ console.error(chalk.red(`Error: ${error}`));
112
+ process.exit(1);
113
+ }
114
+ });
115
+ cardCmd
116
+ .command("import <file>")
117
+ .description("Import cards from text file")
118
+ .action(async (file) => {
119
+ try {
120
+ await importCardsCommand(file);
121
+ }
122
+ catch (error) {
123
+ console.error(chalk.red(`Error: ${error}`));
124
+ process.exit(1);
125
+ }
126
+ });
127
+ cardCmd
128
+ .command("export")
129
+ .description("Export cards to JSON")
130
+ .option("-o, --output <file>", "Output file path")
131
+ .action(async (options) => {
132
+ try {
133
+ await exportCardsCommand(options);
134
+ }
135
+ catch (error) {
136
+ console.error(chalk.red(`Error: ${error}`));
137
+ process.exit(1);
138
+ }
139
+ });
140
+ cardCmd
141
+ .command("due")
142
+ .alias("due-today")
143
+ .description("List cards due for review")
144
+ .action(async () => {
145
+ try {
146
+ await dueCardsCommand();
147
+ }
148
+ catch (error) {
149
+ console.error(chalk.red(`Error: ${error}`));
150
+ process.exit(1);
151
+ }
152
+ });
153
+ // ==================== Review Commands ====================
154
+ program
155
+ .command("review")
156
+ .alias("study")
157
+ .description("Start a review session")
158
+ .action(async () => {
159
+ try {
160
+ await reviewCommand();
161
+ }
162
+ catch (error) {
163
+ console.error(chalk.red(`Error: ${error}`));
164
+ process.exit(1);
165
+ }
166
+ });
167
+ program
168
+ .command("stats")
169
+ .alias("statistics")
170
+ .description("Show review statistics")
171
+ .action(async () => {
172
+ try {
173
+ await reviewStatsCommand();
174
+ }
175
+ catch (error) {
176
+ console.error(chalk.red(`Error: ${error}`));
177
+ process.exit(1);
178
+ }
179
+ });
180
+ // ==================== Data Commands ====================
181
+ const dataCmd = program
182
+ .command("data")
183
+ .description("Manage data and backups");
184
+ dataCmd
185
+ .command("backup")
186
+ .description("Create a backup")
187
+ .option("-o, --output <file>", "Output file path")
188
+ .action(async (options) => {
189
+ try {
190
+ await backupCommand(options);
191
+ }
192
+ catch (error) {
193
+ console.error(chalk.red(`Error: ${error}`));
194
+ process.exit(1);
195
+ }
196
+ });
197
+ dataCmd
198
+ .command("restore <file>")
199
+ .description("Restore from backup")
200
+ .option("-f, --force", "Force restore without confirmation")
201
+ .action(async (file, options) => {
202
+ try {
203
+ await restoreCommand(file, options.force);
204
+ }
205
+ catch (error) {
206
+ console.error(chalk.red(`Error: ${error}`));
207
+ process.exit(1);
208
+ }
209
+ });
210
+ dataCmd
211
+ .command("list-backups")
212
+ .alias("backups")
213
+ .description("List all backups")
214
+ .action(async () => {
215
+ try {
216
+ await listBackupsCommand();
217
+ }
218
+ catch (error) {
219
+ console.error(chalk.red(`Error: ${error}`));
220
+ process.exit(1);
221
+ }
222
+ });
223
+ dataCmd
224
+ .command("clean-backups")
225
+ .description("Clean old backups")
226
+ .option("-k, --keep <number>", "Number of backups to keep", parseInt, 10)
227
+ .action(async (options) => {
228
+ try {
229
+ await cleanBackupsCommand(options.keep);
230
+ }
231
+ catch (error) {
232
+ console.error(chalk.red(`Error: ${error}`));
233
+ process.exit(1);
234
+ }
235
+ });
236
+ dataCmd
237
+ .command("export <file>")
238
+ .description("Export data to JSON file")
239
+ .action(async (file) => {
240
+ try {
241
+ await exportCommand(file);
242
+ }
243
+ catch (error) {
244
+ console.error(chalk.red(`Error: ${error}`));
245
+ process.exit(1);
246
+ }
247
+ });
248
+ dataCmd
249
+ .command("import <file>")
250
+ .description("Import data from JSON file")
251
+ .option("-f, --force", "Force import without confirmation")
252
+ .action(async (file, options) => {
253
+ try {
254
+ await importCommand(file, options.force);
255
+ }
256
+ catch (error) {
257
+ console.error(chalk.red(`Error: ${error}`));
258
+ process.exit(1);
259
+ }
260
+ });
261
+ dataCmd
262
+ .command("stats")
263
+ .description("Show data statistics")
264
+ .action(async () => {
265
+ try {
266
+ await statsCommand();
267
+ }
268
+ catch (error) {
269
+ console.error(chalk.red(`Error: ${error}`));
270
+ process.exit(1);
271
+ }
272
+ });
273
+ // ==================== Server Commands ====================
274
+ program
275
+ .command("serve")
276
+ .alias("server")
277
+ .description("Start the Papyrus API server")
278
+ .option("-p, --port <number>", "Port to listen on", parseInt)
279
+ .option("-h, --host <address>", "Host to bind to")
280
+ .option("-d, --detach", "Run in background")
281
+ .action(async (options) => {
282
+ try {
283
+ await serveCommand(options);
284
+ }
285
+ catch (error) {
286
+ console.error(chalk.red(`Error: ${error}`));
287
+ process.exit(1);
288
+ }
289
+ });
290
+ program
291
+ .command("status")
292
+ .description("Check server status")
293
+ .action(async () => {
294
+ try {
295
+ await statusCommand();
296
+ }
297
+ catch (error) {
298
+ console.error(chalk.red(`Error: ${error}`));
299
+ process.exit(1);
300
+ }
301
+ });
302
+ program
303
+ .command("stop")
304
+ .description("Stop the Papyrus server")
305
+ .action(async () => {
306
+ try {
307
+ await stopCommand();
308
+ }
309
+ catch (error) {
310
+ console.error(chalk.red(`Error: ${error}`));
311
+ process.exit(1);
312
+ }
313
+ });
314
+ program
315
+ .command("docs")
316
+ .description("Open API documentation")
317
+ .action(async () => {
318
+ try {
319
+ await docsCommand();
320
+ }
321
+ catch (error) {
322
+ console.error(chalk.red(`Error: ${error}`));
323
+ process.exit(1);
324
+ }
325
+ });
326
+ // ==================== Config Commands ====================
327
+ program
328
+ .command("config")
329
+ .description("Manage CLI configuration")
330
+ .option("--get <key>", "Get configuration value")
331
+ .option("--set <key=value>", "Set configuration value")
332
+ .option("--reset", "Reset to defaults")
333
+ .action(async (options) => {
334
+ try {
335
+ if (options.reset) {
336
+ resetConfig();
337
+ console.log(chalk.green("Configuration reset to defaults."));
338
+ }
339
+ else if (options.get) {
340
+ const { loadConfig } = await import("./config.js");
341
+ const config = loadConfig();
342
+ const value = config[options.get];
343
+ console.log(`${options.get}: ${value}`);
344
+ }
345
+ else if (options.set) {
346
+ const [key, value] = options.set.split("=");
347
+ if (!key || value === undefined) {
348
+ console.error(chalk.red("Usage: --set key=value"));
349
+ process.exit(1);
350
+ }
351
+ setConfig(key, value);
352
+ console.log(chalk.green(`Set ${key} = ${value}`));
353
+ }
354
+ else {
355
+ displayConfig();
356
+ }
357
+ }
358
+ catch (error) {
359
+ console.error(chalk.red(`Error: ${error}`));
360
+ process.exit(1);
361
+ }
362
+ });
363
+ // ==================== Help & Info ====================
364
+ program
365
+ .command("quickstart")
366
+ .description("Show quick start guide")
367
+ .action(() => {
368
+ console.log(chalk.bold("\nšŸ“š Papyrus CLI Quick Start\n"));
369
+ console.log("1. Start the server:");
370
+ console.log(chalk.cyan(" papyrus serve\n"));
371
+ console.log("2. Add some cards:");
372
+ console.log(chalk.cyan(" papyrus card add \"Question?\" \"Answer!\"\n"));
373
+ console.log("3. Start reviewing:");
374
+ console.log(chalk.cyan(" papyrus review\n"));
375
+ console.log("4. Check stats:");
376
+ console.log(chalk.cyan(" papyrus stats\n"));
377
+ console.log("For more help: papyrus --help\n");
378
+ });
379
+ // Error handling
380
+ program.exitOverride();
381
+ async function main() {
382
+ try {
383
+ await program.parseAsync();
384
+ }
385
+ catch (error) {
386
+ // Commander handles its own errors
387
+ process.exit(1);
388
+ }
389
+ }
390
+ main();
391
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Papyrus CLI - Card Management Commands
3
+ */
4
+ /**
5
+ * List all cards command
6
+ */
7
+ export declare function listCardsCommand(options: {
8
+ limit?: number;
9
+ tags?: string;
10
+ detailed?: boolean;
11
+ }): Promise<void>;
12
+ /**
13
+ * Show card details command
14
+ */
15
+ export declare function showCardCommand(id: string): Promise<void>;
16
+ /**
17
+ * Add card command
18
+ */
19
+ export declare function addCardCommand(question: string, answer: string, options: {
20
+ tags?: string;
21
+ }): Promise<void>;
22
+ /**
23
+ * Edit card command
24
+ */
25
+ export declare function editCardCommand(id: string, options: {
26
+ question?: string;
27
+ answer?: string;
28
+ tags?: string;
29
+ }): Promise<void>;
30
+ /**
31
+ * Delete card command
32
+ */
33
+ export declare function deleteCardCommand(id: string, force?: boolean): Promise<void>;
34
+ /**
35
+ * Search cards command
36
+ */
37
+ export declare function searchCardsCommand(query: string): Promise<void>;
38
+ /**
39
+ * Import cards from file command
40
+ */
41
+ export declare function importCardsCommand(filePath: string): Promise<void>;
42
+ /**
43
+ * Export cards command
44
+ */
45
+ export declare function exportCardsCommand(options: {
46
+ output?: string;
47
+ }): Promise<void>;
48
+ /**
49
+ * Get due cards command
50
+ */
51
+ export declare function dueCardsCommand(): Promise<void>;
52
+ //# sourceMappingURL=cards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cards.d.ts","sourceRoot":"","sources":["../../src/commands/cards.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmCH;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqChB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB/D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GACA,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAarE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBpF;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBrD"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Papyrus CLI - Card Management Commands
3
+ */
4
+ import { readFileSync } from "fs";
5
+ import { createCard, deleteCard, getCard, importCards, listCards, searchCards, updateCard, } from "../api.js";
6
+ import { formatRelativeTime, parseTags, truncate } from "../utils.js";
7
+ /**
8
+ * Display card in formatted output
9
+ */
10
+ function displayCard(card, detailed = false) {
11
+ console.log(`\n ID: ${card.id}`);
12
+ console.log(` Q: ${card.q}`);
13
+ console.log(` A: ${card.a}`);
14
+ if (card.tags && card.tags.length > 0) {
15
+ console.log(` Tags: ${card.tags.join(", ")}`);
16
+ }
17
+ if (detailed) {
18
+ console.log(` Next Review: ${formatRelativeTime(card.next_review)}`);
19
+ console.log(` Interval: ${Math.round(card.interval / 86400)} days`);
20
+ console.log(` EF: ${card.ef.toFixed(2)}`);
21
+ console.log(` Repetitions: ${card.repetitions}`);
22
+ }
23
+ }
24
+ /**
25
+ * List all cards command
26
+ */
27
+ export async function listCardsCommand(options) {
28
+ const cards = await listCards();
29
+ if (cards.length === 0) {
30
+ console.log("No cards found.");
31
+ return;
32
+ }
33
+ // Filter by tags if specified
34
+ let filtered = cards;
35
+ if (options.tags) {
36
+ const tags = parseTags(options.tags);
37
+ filtered = cards.filter(c => tags.some(t => c.tags?.includes(t)));
38
+ }
39
+ // Limit if specified
40
+ const limit = options.limit || filtered.length;
41
+ const display = filtered.slice(0, limit);
42
+ console.log(`\nFound ${filtered.length} cards (showing ${display.length}):\n`);
43
+ for (const card of display) {
44
+ console.log(` [${card.id}] ${truncate(card.q, 50)}`);
45
+ if (options.detailed) {
46
+ console.log(` A: ${truncate(card.a, 50)}`);
47
+ if (card.tags?.length) {
48
+ console.log(` Tags: ${card.tags.join(", ")}`);
49
+ }
50
+ console.log(` Next: ${formatRelativeTime(card.next_review)}`);
51
+ }
52
+ }
53
+ if (filtered.length > limit) {
54
+ console.log(`\n ... and ${filtered.length - limit} more`);
55
+ }
56
+ }
57
+ /**
58
+ * Show card details command
59
+ */
60
+ export async function showCardCommand(id) {
61
+ try {
62
+ const card = await getCard(id);
63
+ console.log("\nšŸ“„ Card Details");
64
+ displayCard(card, true);
65
+ }
66
+ catch {
67
+ // Try searching if exact ID fails
68
+ const results = await searchCards(id);
69
+ if (results.count > 0) {
70
+ console.log(`\nFound ${results.count} matching card(s):`);
71
+ for (const result of results.results.slice(0, 5)) {
72
+ displayCard(result.card, true);
73
+ }
74
+ }
75
+ else {
76
+ console.error(`Card not found: ${id}`);
77
+ process.exit(1);
78
+ }
79
+ }
80
+ }
81
+ /**
82
+ * Add card command
83
+ */
84
+ export async function addCardCommand(question, answer, options) {
85
+ const tags = parseTags(options.tags);
86
+ const card = await createCard({
87
+ q: question,
88
+ a: answer,
89
+ tags,
90
+ });
91
+ console.log("\nāœ… Card created successfully!");
92
+ displayCard(card, true);
93
+ }
94
+ /**
95
+ * Edit card command
96
+ */
97
+ export async function editCardCommand(id, options) {
98
+ const update = {};
99
+ if (options.question)
100
+ update.q = options.question;
101
+ if (options.answer)
102
+ update.a = options.answer;
103
+ if (options.tags !== undefined)
104
+ update.tags = parseTags(options.tags);
105
+ const card = await updateCard(id, update);
106
+ console.log("\nāœ… Card updated successfully!");
107
+ displayCard(card, true);
108
+ }
109
+ /**
110
+ * Delete card command
111
+ */
112
+ export async function deleteCardCommand(id, force = false) {
113
+ const card = await getCard(id);
114
+ if (!force) {
115
+ const { confirm } = await import("../utils.js");
116
+ const confirmed = await confirm(`Delete card "${truncate(card.q, 40)}"?`);
117
+ if (!confirmed) {
118
+ console.log("Cancelled.");
119
+ return;
120
+ }
121
+ }
122
+ await deleteCard(id);
123
+ console.log("\nāœ… Card deleted successfully!");
124
+ }
125
+ /**
126
+ * Search cards command
127
+ */
128
+ export async function searchCardsCommand(query) {
129
+ const results = await searchCards(query);
130
+ if (results.count === 0) {
131
+ console.log("No cards found matching your query.");
132
+ return;
133
+ }
134
+ console.log(`\nFound ${results.count} matching card(s):\n`);
135
+ for (const result of results.results) {
136
+ displayCard(result.card);
137
+ }
138
+ }
139
+ /**
140
+ * Import cards from file command
141
+ */
142
+ export async function importCardsCommand(filePath) {
143
+ const { isReadableFile } = await import("../utils.js");
144
+ if (!isReadableFile(filePath)) {
145
+ console.error(`File not found or not readable: ${filePath}`);
146
+ process.exit(1);
147
+ }
148
+ const content = readFileSync(filePath, "utf-8");
149
+ const count = await importCards(content);
150
+ console.log(`\nāœ… Successfully imported ${count} card(s)!`);
151
+ }
152
+ /**
153
+ * Export cards command
154
+ */
155
+ export async function exportCardsCommand(options) {
156
+ const cards = await listCards();
157
+ const output = {
158
+ cards,
159
+ exported_at: new Date().toISOString(),
160
+ count: cards.length,
161
+ };
162
+ const json = JSON.stringify(output, null, 2);
163
+ if (options.output) {
164
+ const { writeFileSync } = await import("fs");
165
+ writeFileSync(options.output, json, "utf-8");
166
+ console.log(`\nāœ… Exported ${cards.length} cards to ${options.output}`);
167
+ }
168
+ else {
169
+ console.log(json);
170
+ }
171
+ }
172
+ /**
173
+ * Get due cards command
174
+ */
175
+ export async function dueCardsCommand() {
176
+ const cards = await listCards();
177
+ const now = Date.now() / 1000;
178
+ const dueCards = cards.filter(c => c.next_review <= now);
179
+ if (dueCards.length === 0) {
180
+ console.log("\nšŸŽ‰ No cards are due for review!");
181
+ return;
182
+ }
183
+ console.log(`\nšŸ“š ${dueCards.length} card(s) due for review:\n`);
184
+ for (const card of dueCards) {
185
+ console.log(` [${card.id}] ${truncate(card.q, 50)}`);
186
+ console.log(` Due: ${formatRelativeTime(card.next_review)}`);
187
+ }
188
+ }
189
+ //# sourceMappingURL=cards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cards.js","sourceRoot":"","sources":["../../src/commands/cards.ts"],"names":[],"mappings":"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"}