@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
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Papyrus CLI - Configuration Management
3
+ */
4
+ import type { CLIConfig } from "./types.js";
5
+ /**
6
+ * Load CLI configuration
7
+ */
8
+ export declare function loadConfig(): CLIConfig;
9
+ /**
10
+ * Save CLI configuration
11
+ */
12
+ export declare function saveConfig(config: CLIConfig): void;
13
+ /**
14
+ * Get configuration value
15
+ */
16
+ export declare function getConfig<K extends keyof CLIConfig>(key: K): CLIConfig[K];
17
+ /**
18
+ * Set configuration value
19
+ */
20
+ export declare function setConfig<K extends keyof CLIConfig>(key: K, value: CLIConfig[K]): void;
21
+ /**
22
+ * Reset configuration to defaults
23
+ */
24
+ export declare function resetConfig(): void;
25
+ /**
26
+ * Get data directory path
27
+ */
28
+ export declare function getDataDir(): string;
29
+ /**
30
+ * Get API URL
31
+ */
32
+ export declare function getApiUrl(): string;
33
+ /**
34
+ * Display current configuration
35
+ */
36
+ export declare function displayConfig(): void;
37
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAmB5C;;GAEG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAetC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAGlD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAGzE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAItF;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAMpC"}
package/dist/config.js ADDED
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Papyrus CLI - Configuration Management
3
+ */
4
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
5
+ import { homedir } from "os";
6
+ import { join } from "path";
7
+ const CONFIG_DIR = join(homedir(), ".papyrus");
8
+ const CONFIG_FILE = join(CONFIG_DIR, "config.json");
9
+ const DEFAULT_CONFIG = {
10
+ apiUrl: "http://127.0.0.1:8000",
11
+ dataDir: join(homedir(), "Documents", "Papyrus"),
12
+ };
13
+ /**
14
+ * Ensure config directory exists
15
+ */
16
+ function ensureConfigDir() {
17
+ if (!existsSync(CONFIG_DIR)) {
18
+ mkdirSync(CONFIG_DIR, { recursive: true });
19
+ }
20
+ }
21
+ /**
22
+ * Load CLI configuration
23
+ */
24
+ export function loadConfig() {
25
+ ensureConfigDir();
26
+ if (!existsSync(CONFIG_FILE)) {
27
+ saveConfig(DEFAULT_CONFIG);
28
+ return { ...DEFAULT_CONFIG };
29
+ }
30
+ try {
31
+ const data = readFileSync(CONFIG_FILE, "utf-8");
32
+ const config = JSON.parse(data);
33
+ return { ...DEFAULT_CONFIG, ...config };
34
+ }
35
+ catch {
36
+ return { ...DEFAULT_CONFIG };
37
+ }
38
+ }
39
+ /**
40
+ * Save CLI configuration
41
+ */
42
+ export function saveConfig(config) {
43
+ ensureConfigDir();
44
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), "utf-8");
45
+ }
46
+ /**
47
+ * Get configuration value
48
+ */
49
+ export function getConfig(key) {
50
+ const config = loadConfig();
51
+ return config[key];
52
+ }
53
+ /**
54
+ * Set configuration value
55
+ */
56
+ export function setConfig(key, value) {
57
+ const config = loadConfig();
58
+ config[key] = value;
59
+ saveConfig(config);
60
+ }
61
+ /**
62
+ * Reset configuration to defaults
63
+ */
64
+ export function resetConfig() {
65
+ saveConfig(DEFAULT_CONFIG);
66
+ }
67
+ /**
68
+ * Get data directory path
69
+ */
70
+ export function getDataDir() {
71
+ const config = loadConfig();
72
+ if (!existsSync(config.dataDir)) {
73
+ mkdirSync(config.dataDir, { recursive: true });
74
+ }
75
+ return config.dataDir;
76
+ }
77
+ /**
78
+ * Get API URL
79
+ */
80
+ export function getApiUrl() {
81
+ const config = loadConfig();
82
+ return config.apiUrl;
83
+ }
84
+ /**
85
+ * Display current configuration
86
+ */
87
+ export function displayConfig() {
88
+ const config = loadConfig();
89
+ console.log("Current Configuration:");
90
+ console.log(` API URL: ${config.apiUrl}`);
91
+ console.log(` Data Directory: ${config.dataDir}`);
92
+ console.log(` Config File: ${CONFIG_FILE}`);
93
+ }
94
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Papyrus CLI - Library Exports
3
+ *
4
+ * This file exports the API client and types for programmatic use.
5
+ */
6
+ export { healthCheck, isApiAvailable, listCards, getCard, createCard, updateCard, deleteCard, importCards, getReviewQueue, getReviewStats, submitReview, searchCards, exportData, importData, createBackup, } from "./api.js";
7
+ export { loadConfig, saveConfig, getConfig, setConfig, resetConfig, getDataDir, getApiUrl, displayConfig, } from "./config.js";
8
+ export type { Card, CreateCardInput, UpdateCardInput, CardsListResponse, CardResponse, DeleteResponse, ImportResponse, ReviewQueueItem, ReviewStats, ReviewStatsResponse, ReviewSubmission, ReviewSubmitResponse, HealthResponse, CLIConfig, BackupInfo, SearchResult, SearchResponse, Note, APIError, } from "./types.js";
9
+ export { formatDate, formatRelativeTime, truncate, readFileSafe, isReadableFile, parseTags, formatFileSize, isValidCardId, escapeRegex, sleep, prompt, confirm, } from "./utils.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,WAAW,EACX,cAAc,EACd,SAAS,EACT,OAAO,EACP,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,GACb,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,UAAU,EACV,SAAS,EACT,aAAa,GACd,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,IAAI,EACJ,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,UAAU,EACV,YAAY,EACZ,cAAc,EACd,IAAI,EACJ,QAAQ,GACT,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,SAAS,EACT,cAAc,EACd,aAAa,EACb,WAAW,EACX,KAAK,EACL,MAAM,EACN,OAAO,GACR,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Papyrus CLI - Library Exports
3
+ *
4
+ * This file exports the API client and types for programmatic use.
5
+ */
6
+ // API Client
7
+ export { healthCheck, isApiAvailable, listCards, getCard, createCard, updateCard, deleteCard, importCards, getReviewQueue, getReviewStats, submitReview, searchCards, exportData, importData, createBackup, } from "./api.js";
8
+ // Configuration
9
+ export { loadConfig, saveConfig, getConfig, setConfig, resetConfig, getDataDir, getApiUrl, displayConfig, } from "./config.js";
10
+ // Utilities
11
+ export { formatDate, formatRelativeTime, truncate, readFileSafe, isReadableFile, parseTags, formatFileSize, isValidCardId, escapeRegex, sleep, prompt, confirm, } from "./utils.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,aAAa;AACb,OAAO,EACL,WAAW,EACX,cAAc,EACd,SAAS,EACT,OAAO,EACP,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,GACb,MAAM,UAAU,CAAC;AAElB,gBAAgB;AAChB,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,UAAU,EACV,SAAS,EACT,aAAa,GACd,MAAM,aAAa,CAAC;AAyBrB,YAAY;AACZ,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,SAAS,EACT,cAAc,EACd,aAAa,EACb,WAAW,EACX,KAAK,EACL,MAAM,EACN,OAAO,GACR,MAAM,YAAY,CAAC"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Papyrus CLI - Type Definitions
3
+ */
4
+ /** Card data structure */
5
+ export interface Card {
6
+ id: string;
7
+ q: string;
8
+ a: string;
9
+ next_review: number;
10
+ interval: number;
11
+ ef: number;
12
+ repetitions: number;
13
+ tags: string[];
14
+ }
15
+ /** Card creation input */
16
+ export interface CreateCardInput {
17
+ q: string;
18
+ a: string;
19
+ tags?: string[];
20
+ }
21
+ /** Card update input */
22
+ export interface UpdateCardInput {
23
+ q?: string;
24
+ a?: string;
25
+ tags?: string[];
26
+ }
27
+ /** API response for card list */
28
+ export interface CardsListResponse {
29
+ success: boolean;
30
+ cards: Card[];
31
+ count: number;
32
+ }
33
+ /** API response for single card */
34
+ export interface CardResponse {
35
+ success: boolean;
36
+ card: Card;
37
+ }
38
+ /** API response for delete operation */
39
+ export interface DeleteResponse {
40
+ success: boolean;
41
+ }
42
+ /** API response for import operation */
43
+ export interface ImportResponse {
44
+ success: boolean;
45
+ count: number;
46
+ }
47
+ /** Review queue item */
48
+ export interface ReviewQueueItem {
49
+ card: Card;
50
+ index: number;
51
+ }
52
+ /** Review stats */
53
+ export interface ReviewStats {
54
+ total_cards: number;
55
+ due_today: number;
56
+ new_cards: number;
57
+ review_cards: number;
58
+ }
59
+ /** API response for review stats */
60
+ export interface ReviewStatsResponse {
61
+ success: boolean;
62
+ stats: ReviewStats;
63
+ }
64
+ /** Review submission */
65
+ export interface ReviewSubmission {
66
+ quality: number;
67
+ }
68
+ /** API response for review submit */
69
+ export interface ReviewSubmitResponse {
70
+ success: boolean;
71
+ message: string;
72
+ }
73
+ /** Health check response */
74
+ export interface HealthResponse {
75
+ status: string;
76
+ }
77
+ /** CLI Configuration */
78
+ export interface CLIConfig {
79
+ apiUrl: string;
80
+ dataDir: string;
81
+ defaultEditor?: string;
82
+ }
83
+ /** Backup info */
84
+ export interface BackupInfo {
85
+ path: string;
86
+ size: number;
87
+ created: Date;
88
+ }
89
+ /** Search result */
90
+ export interface SearchResult {
91
+ card: Card;
92
+ score: number;
93
+ }
94
+ /** Search response */
95
+ export interface SearchResponse {
96
+ success: boolean;
97
+ results: SearchResult[];
98
+ count: number;
99
+ }
100
+ /** Note data */
101
+ export interface Note {
102
+ id: string;
103
+ title: string;
104
+ content: string;
105
+ created_at: string;
106
+ updated_at: string;
107
+ tags: string[];
108
+ }
109
+ /** API Error response */
110
+ export interface APIError {
111
+ detail?: string;
112
+ message?: string;
113
+ }
114
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Papyrus CLI - Type Definitions
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Papyrus CLI - Utility Functions
3
+ */
4
+ /**
5
+ * Format date for display
6
+ */
7
+ export declare function formatDate(timestamp: number): string;
8
+ /**
9
+ * Format relative time (e.g., "2 hours ago")
10
+ */
11
+ export declare function formatRelativeTime(timestamp: number): string;
12
+ /**
13
+ * Truncate text to a maximum length
14
+ */
15
+ export declare function truncate(text: string, maxLength: number): string;
16
+ /**
17
+ * Read file content safely
18
+ */
19
+ export declare function readFileSafe(path: string): string | null;
20
+ /**
21
+ * Check if file exists and is readable
22
+ */
23
+ export declare function isReadableFile(path: string): boolean;
24
+ /**
25
+ * Parse tags from comma-separated string
26
+ */
27
+ export declare function parseTags(tagsStr: string | undefined): string[];
28
+ /**
29
+ * Format file size
30
+ */
31
+ export declare function formatFileSize(bytes: number): string;
32
+ /**
33
+ * Validate card ID format
34
+ */
35
+ export declare function isValidCardId(id: string): boolean;
36
+ /**
37
+ * Escape special regex characters
38
+ */
39
+ export declare function escapeRegex(str: string): string;
40
+ /**
41
+ * Sleep for a given duration
42
+ */
43
+ export declare function sleep(ms: number): Promise<void>;
44
+ /**
45
+ * Prompt for user input (basic implementation)
46
+ */
47
+ export declare function prompt(question: string): Promise<string>;
48
+ /**
49
+ * Confirm action with user
50
+ */
51
+ export declare function confirm(question: string): Promise<boolean>;
52
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAkB5D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CASpD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAM/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAa9D;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGhE"}
package/dist/utils.js ADDED
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Papyrus CLI - Utility Functions
3
+ */
4
+ import { existsSync, readFileSync, statSync } from "fs";
5
+ import { resolve } from "path";
6
+ /**
7
+ * Format date for display
8
+ */
9
+ export function formatDate(timestamp) {
10
+ return new Date(timestamp * 1000).toLocaleString();
11
+ }
12
+ /**
13
+ * Format relative time (e.g., "2 hours ago")
14
+ */
15
+ export function formatRelativeTime(timestamp) {
16
+ const now = Date.now() / 1000;
17
+ const diff = timestamp - now;
18
+ if (diff < 0) {
19
+ const absDiff = Math.abs(diff);
20
+ if (absDiff < 60)
21
+ return "just now";
22
+ if (absDiff < 3600)
23
+ return `${Math.floor(absDiff / 60)} minutes ago`;
24
+ if (absDiff < 86400)
25
+ return `${Math.floor(absDiff / 3600)} hours ago`;
26
+ if (absDiff < 604800)
27
+ return `${Math.floor(absDiff / 86400)} days ago`;
28
+ return formatDate(timestamp);
29
+ }
30
+ if (diff < 60)
31
+ return "in a few seconds";
32
+ if (diff < 3600)
33
+ return `in ${Math.floor(diff / 60)} minutes`;
34
+ if (diff < 86400)
35
+ return `in ${Math.floor(diff / 3600)} hours`;
36
+ if (diff < 604800)
37
+ return `in ${Math.floor(diff / 86400)} days`;
38
+ return formatDate(timestamp);
39
+ }
40
+ /**
41
+ * Truncate text to a maximum length
42
+ */
43
+ export function truncate(text, maxLength) {
44
+ if (text.length <= maxLength)
45
+ return text;
46
+ return text.substring(0, maxLength - 3) + "...";
47
+ }
48
+ /**
49
+ * Read file content safely
50
+ */
51
+ export function readFileSafe(path) {
52
+ try {
53
+ const resolved = resolve(path);
54
+ if (!existsSync(resolved))
55
+ return null;
56
+ return readFileSync(resolved, "utf-8");
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ /**
63
+ * Check if file exists and is readable
64
+ */
65
+ export function isReadableFile(path) {
66
+ try {
67
+ const resolved = resolve(path);
68
+ if (!existsSync(resolved))
69
+ return false;
70
+ const stats = statSync(resolved);
71
+ return stats.isFile();
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }
77
+ /**
78
+ * Parse tags from comma-separated string
79
+ */
80
+ export function parseTags(tagsStr) {
81
+ if (!tagsStr)
82
+ return [];
83
+ return tagsStr
84
+ .split(",")
85
+ .map(t => t.trim())
86
+ .filter(t => t.length > 0);
87
+ }
88
+ /**
89
+ * Format file size
90
+ */
91
+ export function formatFileSize(bytes) {
92
+ if (bytes < 1024)
93
+ return `${bytes} B`;
94
+ if (bytes < 1024 * 1024)
95
+ return `${(bytes / 1024).toFixed(1)} KB`;
96
+ if (bytes < 1024 * 1024 * 1024)
97
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
98
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
99
+ }
100
+ /**
101
+ * Validate card ID format
102
+ */
103
+ export function isValidCardId(id) {
104
+ return /^[a-zA-Z0-9_-]+$/.test(id);
105
+ }
106
+ /**
107
+ * Escape special regex characters
108
+ */
109
+ export function escapeRegex(str) {
110
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
111
+ }
112
+ /**
113
+ * Sleep for a given duration
114
+ */
115
+ export function sleep(ms) {
116
+ return new Promise(resolve => setTimeout(resolve, ms));
117
+ }
118
+ /**
119
+ * Prompt for user input (basic implementation)
120
+ */
121
+ export async function prompt(question) {
122
+ const { createInterface } = await import("readline");
123
+ const rl = createInterface({
124
+ input: process.stdin,
125
+ output: process.stdout,
126
+ });
127
+ return new Promise(resolve => {
128
+ rl.question(question, answer => {
129
+ rl.close();
130
+ resolve(answer.trim());
131
+ });
132
+ });
133
+ }
134
+ /**
135
+ * Confirm action with user
136
+ */
137
+ export async function confirm(question) {
138
+ const answer = await prompt(`${question} (y/N): `);
139
+ return answer.toLowerCase() === "y" || answer.toLowerCase() === "yes";
140
+ }
141
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@alpacali/papyrus-cli",
3
+ "version": "1.0.0",
4
+ "description": "Papyrus CLI - Command line interface for Papyrus SRS learning system",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "papyrus": "dist/cli.js",
10
+ "papyrus-cli": "dist/cli.js"
11
+ },
12
+ "files": [
13
+ "dist/**/*",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "start": "node dist/cli.js",
21
+ "test": "jest",
22
+ "lint": "eslint src/**/*.ts",
23
+ "typecheck": "tsc --noEmit",
24
+ "prepublishOnly": "npm run build"
25
+ },
26
+ "keywords": [
27
+ "papyrus",
28
+ "srs",
29
+ "spaced-repetition",
30
+ "flashcards",
31
+ "learning",
32
+ "cli",
33
+ "study"
34
+ ],
35
+ "author": "Papyrus Team",
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/Papyrus/Papyrus-cli.git"
40
+ },
41
+ "bugs": {
42
+ "url": "https://github.com/Papyrus/Papyrus-cli/issues"
43
+ },
44
+ "homepage": "https://github.com/Papyrus/Papyrus-cli#readme",
45
+ "engines": {
46
+ "node": ">=18.0.0"
47
+ },
48
+ "dependencies": {
49
+ "axios": "^1.7.9",
50
+ "chalk": "^5.4.1",
51
+ "commander": "^13.1.0",
52
+ "fs-extra": "^11.3.0",
53
+ "inquirer": "^12.5.0",
54
+ "ora": "^8.2.0"
55
+ },
56
+ "devDependencies": {
57
+ "@types/fs-extra": "^11.0.4",
58
+ "@types/inquirer": "^9.0.7",
59
+ "@types/node": "^22.14.0",
60
+ "typescript": "^5.8.3"
61
+ }
62
+ }