@cortexmemory/cli 0.1.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 (75) hide show
  1. package/README.md +325 -0
  2. package/dist/commands/conversations.d.ts +16 -0
  3. package/dist/commands/conversations.d.ts.map +1 -0
  4. package/dist/commands/conversations.js +421 -0
  5. package/dist/commands/conversations.js.map +1 -0
  6. package/dist/commands/convex.d.ts +17 -0
  7. package/dist/commands/convex.d.ts.map +1 -0
  8. package/dist/commands/convex.js +442 -0
  9. package/dist/commands/convex.js.map +1 -0
  10. package/dist/commands/db.d.ts +16 -0
  11. package/dist/commands/db.d.ts.map +1 -0
  12. package/dist/commands/db.js +371 -0
  13. package/dist/commands/db.js.map +1 -0
  14. package/dist/commands/dev.d.ts +16 -0
  15. package/dist/commands/dev.d.ts.map +1 -0
  16. package/dist/commands/dev.js +558 -0
  17. package/dist/commands/dev.js.map +1 -0
  18. package/dist/commands/facts.d.ts +17 -0
  19. package/dist/commands/facts.d.ts.map +1 -0
  20. package/dist/commands/facts.js +386 -0
  21. package/dist/commands/facts.js.map +1 -0
  22. package/dist/commands/memory.d.ts +18 -0
  23. package/dist/commands/memory.d.ts.map +1 -0
  24. package/dist/commands/memory.js +486 -0
  25. package/dist/commands/memory.js.map +1 -0
  26. package/dist/commands/setup.d.ts +14 -0
  27. package/dist/commands/setup.d.ts.map +1 -0
  28. package/dist/commands/setup.js +494 -0
  29. package/dist/commands/setup.js.map +1 -0
  30. package/dist/commands/spaces.d.ts +18 -0
  31. package/dist/commands/spaces.d.ts.map +1 -0
  32. package/dist/commands/spaces.js +553 -0
  33. package/dist/commands/spaces.js.map +1 -0
  34. package/dist/commands/users.d.ts +18 -0
  35. package/dist/commands/users.d.ts.map +1 -0
  36. package/dist/commands/users.js +486 -0
  37. package/dist/commands/users.js.map +1 -0
  38. package/dist/index.d.ts +9 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +70 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/types.d.ts +144 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +5 -0
  45. package/dist/types.js.map +1 -0
  46. package/dist/utils/__tests__/config.test.d.ts +5 -0
  47. package/dist/utils/__tests__/config.test.d.ts.map +1 -0
  48. package/dist/utils/__tests__/config.test.js +127 -0
  49. package/dist/utils/__tests__/config.test.js.map +1 -0
  50. package/dist/utils/__tests__/formatting.test.d.ts +5 -0
  51. package/dist/utils/__tests__/formatting.test.d.ts.map +1 -0
  52. package/dist/utils/__tests__/formatting.test.js +132 -0
  53. package/dist/utils/__tests__/formatting.test.js.map +1 -0
  54. package/dist/utils/__tests__/validation.test.d.ts +5 -0
  55. package/dist/utils/__tests__/validation.test.d.ts.map +1 -0
  56. package/dist/utils/__tests__/validation.test.js +207 -0
  57. package/dist/utils/__tests__/validation.test.js.map +1 -0
  58. package/dist/utils/client.d.ts +42 -0
  59. package/dist/utils/client.d.ts.map +1 -0
  60. package/dist/utils/client.js +108 -0
  61. package/dist/utils/client.js.map +1 -0
  62. package/dist/utils/config.d.ts +67 -0
  63. package/dist/utils/config.d.ts.map +1 -0
  64. package/dist/utils/config.js +261 -0
  65. package/dist/utils/config.js.map +1 -0
  66. package/dist/utils/formatting.d.ts +81 -0
  67. package/dist/utils/formatting.d.ts.map +1 -0
  68. package/dist/utils/formatting.js +239 -0
  69. package/dist/utils/formatting.js.map +1 -0
  70. package/dist/utils/validation.d.ts +83 -0
  71. package/dist/utils/validation.d.ts.map +1 -0
  72. package/dist/utils/validation.js +243 -0
  73. package/dist/utils/validation.js.map +1 -0
  74. package/package.json +72 -0
  75. package/templates/.cortexrc.template +15 -0
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Configuration Management
3
+ *
4
+ * Handles loading, saving, and managing CLI configuration from multiple sources:
5
+ * 1. CLI flags (highest priority)
6
+ * 2. Environment variables
7
+ * 3. Project config (./cortex.config.json)
8
+ * 4. User config (~/.cortexrc)
9
+ */
10
+ import { cosmiconfig } from "cosmiconfig";
11
+ import { readFile, writeFile, mkdir } from "fs/promises";
12
+ import { existsSync } from "fs";
13
+ import { homedir } from "os";
14
+ import { join, dirname } from "path";
15
+ /**
16
+ * Default configuration
17
+ */
18
+ const DEFAULT_CONFIG = {
19
+ deployments: {
20
+ local: {
21
+ url: "http://127.0.0.1:3210",
22
+ deployment: "anonymous:anonymous-cortex-sdk-local",
23
+ },
24
+ },
25
+ default: "local",
26
+ format: "table",
27
+ confirmDangerous: true,
28
+ };
29
+ /**
30
+ * Explorer for loading configuration from various sources
31
+ */
32
+ const explorer = cosmiconfig("cortex", {
33
+ searchPlaces: [
34
+ "cortex.config.json",
35
+ "cortex.config.js",
36
+ ".cortexrc",
37
+ ".cortexrc.json",
38
+ "package.json",
39
+ ],
40
+ });
41
+ /**
42
+ * Get the path to the user config file
43
+ */
44
+ export function getUserConfigPath() {
45
+ return join(homedir(), ".cortexrc");
46
+ }
47
+ /**
48
+ * Get the path to the project config file
49
+ */
50
+ export function getProjectConfigPath() {
51
+ return join(process.cwd(), "cortex.config.json");
52
+ }
53
+ /**
54
+ * Load configuration from all sources
55
+ */
56
+ export async function loadConfig() {
57
+ let config = { ...DEFAULT_CONFIG };
58
+ // Try to load from cosmiconfig (searches up directory tree)
59
+ try {
60
+ const result = await explorer.search();
61
+ if (result && result.config) {
62
+ config = mergeConfig(config, result.config);
63
+ }
64
+ }
65
+ catch {
66
+ // No config file found, use defaults
67
+ }
68
+ // Try to load user config from ~/.cortexrc
69
+ const userConfigPath = getUserConfigPath();
70
+ if (existsSync(userConfigPath)) {
71
+ try {
72
+ const userConfigContent = await readFile(userConfigPath, "utf-8");
73
+ const userConfig = JSON.parse(userConfigContent);
74
+ config = mergeConfig(config, userConfig);
75
+ }
76
+ catch {
77
+ // Invalid user config, skip
78
+ }
79
+ }
80
+ // Override with environment variables
81
+ config = applyEnvOverrides(config);
82
+ return config;
83
+ }
84
+ /**
85
+ * Merge two configurations, with source overriding target
86
+ */
87
+ function mergeConfig(target, source) {
88
+ return {
89
+ deployments: {
90
+ ...target.deployments,
91
+ ...source.deployments,
92
+ },
93
+ default: source.default ?? target.default,
94
+ format: source.format ?? target.format,
95
+ confirmDangerous: source.confirmDangerous ?? target.confirmDangerous,
96
+ };
97
+ }
98
+ /**
99
+ * Apply environment variable overrides
100
+ */
101
+ function applyEnvOverrides(config) {
102
+ // If CONVEX_URL is set, create/update a deployment called "env"
103
+ const convexUrl = process.env.CONVEX_URL;
104
+ const convexKey = process.env.CONVEX_DEPLOY_KEY;
105
+ if (convexUrl) {
106
+ config.deployments.env = {
107
+ url: convexUrl,
108
+ key: convexKey,
109
+ };
110
+ // If no default is set, use env
111
+ if (!config.default || config.default === "local") {
112
+ config.default = "env";
113
+ }
114
+ }
115
+ // Check for local-specific env vars
116
+ const localUrl = process.env.LOCAL_CONVEX_URL;
117
+ const localDeployment = process.env.LOCAL_CONVEX_DEPLOYMENT;
118
+ if (localUrl) {
119
+ config.deployments.local = {
120
+ url: localUrl,
121
+ deployment: localDeployment,
122
+ };
123
+ }
124
+ // Check for cloud-specific env vars
125
+ const cloudUrl = process.env.CLOUD_CONVEX_URL;
126
+ const cloudKey = process.env.CLOUD_CONVEX_DEPLOY_KEY;
127
+ if (cloudUrl) {
128
+ config.deployments.cloud = {
129
+ url: cloudUrl,
130
+ key: cloudKey,
131
+ };
132
+ }
133
+ return config;
134
+ }
135
+ /**
136
+ * Save configuration to user config file
137
+ */
138
+ export async function saveUserConfig(config) {
139
+ const configPath = getUserConfigPath();
140
+ const configDir = dirname(configPath);
141
+ // Ensure directory exists
142
+ if (!existsSync(configDir)) {
143
+ await mkdir(configDir, { recursive: true });
144
+ }
145
+ await writeFile(configPath, JSON.stringify(config, null, 2), "utf-8");
146
+ }
147
+ /**
148
+ * Save configuration to project config file
149
+ */
150
+ export async function saveProjectConfig(config) {
151
+ const configPath = getProjectConfigPath();
152
+ await writeFile(configPath, JSON.stringify(config, null, 2), "utf-8");
153
+ }
154
+ /**
155
+ * Get a specific deployment configuration
156
+ */
157
+ export function getDeployment(config, name) {
158
+ const deploymentName = name ?? config.default;
159
+ return config.deployments[deploymentName] ?? null;
160
+ }
161
+ /**
162
+ * Resolve final configuration from global options and config
163
+ */
164
+ export function resolveConfig(config, options) {
165
+ // CLI flags have highest priority
166
+ if (options.url) {
167
+ return {
168
+ url: options.url,
169
+ key: options.key,
170
+ format: options.format ?? config.format,
171
+ quiet: options.quiet ?? false,
172
+ debug: options.debug ?? false,
173
+ };
174
+ }
175
+ // Look up deployment from config
176
+ const deploymentConfig = getDeployment(config, options.deployment);
177
+ if (!deploymentConfig) {
178
+ throw new Error(`Deployment "${options.deployment ?? config.default}" not found in configuration. ` +
179
+ `Run 'cortex setup' to configure deployments.`);
180
+ }
181
+ return {
182
+ url: deploymentConfig.url,
183
+ key: deploymentConfig.key ?? options.key,
184
+ deployment: deploymentConfig.deployment,
185
+ format: options.format ?? config.format,
186
+ quiet: options.quiet ?? false,
187
+ debug: options.debug ?? false,
188
+ };
189
+ }
190
+ /**
191
+ * Update a single deployment in the config
192
+ */
193
+ export async function updateDeployment(name, deployment, saveToUser = true) {
194
+ const config = await loadConfig();
195
+ config.deployments[name] = deployment;
196
+ if (saveToUser) {
197
+ await saveUserConfig(config);
198
+ }
199
+ return config;
200
+ }
201
+ /**
202
+ * Set the default deployment
203
+ */
204
+ export async function setDefaultDeployment(name) {
205
+ const config = await loadConfig();
206
+ if (!config.deployments[name]) {
207
+ throw new Error(`Deployment "${name}" not found`);
208
+ }
209
+ config.default = name;
210
+ await saveUserConfig(config);
211
+ }
212
+ /**
213
+ * Set a configuration value
214
+ */
215
+ export async function setConfigValue(key, value) {
216
+ const config = await loadConfig();
217
+ switch (key) {
218
+ case "default":
219
+ if (!config.deployments[value]) {
220
+ throw new Error(`Deployment "${value}" not found`);
221
+ }
222
+ config.default = value;
223
+ break;
224
+ case "format":
225
+ if (!["table", "json", "csv"].includes(value)) {
226
+ throw new Error(`Invalid format: ${value}. Use table, json, or csv`);
227
+ }
228
+ config.format = value;
229
+ break;
230
+ case "confirmDangerous":
231
+ config.confirmDangerous = value === "true";
232
+ break;
233
+ case "convex-url":
234
+ config.deployments[config.default] = {
235
+ ...config.deployments[config.default],
236
+ url: value,
237
+ };
238
+ break;
239
+ case "convex-key":
240
+ config.deployments[config.default] = {
241
+ ...config.deployments[config.default],
242
+ key: value,
243
+ };
244
+ break;
245
+ default:
246
+ throw new Error(`Unknown config key: ${key}`);
247
+ }
248
+ await saveUserConfig(config);
249
+ }
250
+ /**
251
+ * List all deployments
252
+ */
253
+ export function listDeployments(config) {
254
+ return Object.entries(config.deployments).map(([name, deployment]) => ({
255
+ name,
256
+ url: deployment.url,
257
+ isDefault: name === config.default,
258
+ hasKey: Boolean(deployment.key),
259
+ }));
260
+ }
261
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Output Formatting Utilities
3
+ *
4
+ * Handles formatting data for display in various formats:
5
+ * - Table (default, human-readable)
6
+ * - JSON (machine-readable)
7
+ * - CSV (for exports)
8
+ */
9
+ import type { OutputFormat } from "../types.js";
10
+ /**
11
+ * Format data based on the specified format
12
+ */
13
+ export declare function formatOutput(data: unknown, format: OutputFormat, options?: {
14
+ headers?: string[];
15
+ title?: string;
16
+ }): string;
17
+ /**
18
+ * Format data as JSON
19
+ */
20
+ export declare function formatJSON(data: unknown): string;
21
+ /**
22
+ * Format data as CSV
23
+ */
24
+ export declare function formatCSV(data: unknown, headers?: string[]): string;
25
+ /**
26
+ * Format data as a table
27
+ */
28
+ export declare function formatTable(data: unknown, headers?: string[], title?: string): string;
29
+ /**
30
+ * Format a timestamp for display
31
+ */
32
+ export declare function formatTimestamp(timestamp: number): string;
33
+ /**
34
+ * Format a relative time (e.g., "2 hours ago")
35
+ */
36
+ export declare function formatRelativeTime(timestamp: number): string;
37
+ /**
38
+ * Format bytes to human-readable size
39
+ */
40
+ export declare function formatBytes(bytes: number): string;
41
+ /**
42
+ * Format a count with proper pluralization
43
+ */
44
+ export declare function formatCount(count: number, singular: string, plural?: string): string;
45
+ /**
46
+ * Print a success message
47
+ */
48
+ export declare function printSuccess(message: string): void;
49
+ /**
50
+ * Print an error message
51
+ */
52
+ export declare function printError(message: string): void;
53
+ /**
54
+ * Print a warning message
55
+ */
56
+ export declare function printWarning(message: string): void;
57
+ /**
58
+ * Print an info message
59
+ */
60
+ export declare function printInfo(message: string): void;
61
+ /**
62
+ * Print a header/title
63
+ */
64
+ export declare function printHeader(title: string): void;
65
+ /**
66
+ * Print a key-value pair
67
+ */
68
+ export declare function printKeyValue(key: string, value: unknown): void;
69
+ /**
70
+ * Print a section with key-value pairs
71
+ */
72
+ export declare function printSection(title: string, data: Record<string, unknown>): void;
73
+ /**
74
+ * Print a divider line
75
+ */
76
+ export declare function printDivider(): void;
77
+ /**
78
+ * Create a simple progress indicator
79
+ */
80
+ export declare function createProgressText(current: number, total: number): string;
81
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,MAAM,CAUR;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAkCnE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,MAAM,EAAE,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAuCR;AAwCD;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmB5D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAE/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKzE"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Output Formatting Utilities
3
+ *
4
+ * Handles formatting data for display in various formats:
5
+ * - Table (default, human-readable)
6
+ * - JSON (machine-readable)
7
+ * - CSV (for exports)
8
+ */
9
+ import Table from "cli-table3";
10
+ import pc from "picocolors";
11
+ /**
12
+ * Format data based on the specified format
13
+ */
14
+ export function formatOutput(data, format, options) {
15
+ switch (format) {
16
+ case "json":
17
+ return formatJSON(data);
18
+ case "csv":
19
+ return formatCSV(data, options?.headers);
20
+ case "table":
21
+ default:
22
+ return formatTable(data, options?.headers, options?.title);
23
+ }
24
+ }
25
+ /**
26
+ * Format data as JSON
27
+ */
28
+ export function formatJSON(data) {
29
+ return JSON.stringify(data, null, 2);
30
+ }
31
+ /**
32
+ * Format data as CSV
33
+ */
34
+ export function formatCSV(data, headers) {
35
+ if (!Array.isArray(data)) {
36
+ data = [data];
37
+ }
38
+ const rows = data;
39
+ if (rows.length === 0) {
40
+ return "";
41
+ }
42
+ // Determine headers from first row if not provided
43
+ const columnHeaders = headers ?? Object.keys(rows[0]);
44
+ // Create CSV content
45
+ const csvRows = [
46
+ columnHeaders.join(","),
47
+ ...rows.map((row) => columnHeaders
48
+ .map((header) => {
49
+ const value = row[header];
50
+ // Handle values that need quoting
51
+ if (typeof value === "string" &&
52
+ (value.includes(",") || value.includes('"') || value.includes("\n"))) {
53
+ return `"${value.replace(/"/g, '""')}"`;
54
+ }
55
+ return String(value ?? "");
56
+ })
57
+ .join(",")),
58
+ ];
59
+ return csvRows.join("\n");
60
+ }
61
+ /**
62
+ * Format data as a table
63
+ */
64
+ export function formatTable(data, headers, title) {
65
+ if (!Array.isArray(data)) {
66
+ data = [data];
67
+ }
68
+ const rows = data;
69
+ if (rows.length === 0) {
70
+ return pc.dim("No data to display");
71
+ }
72
+ // Determine headers from first row if not provided
73
+ const columnHeaders = headers ?? Object.keys(rows[0]);
74
+ // Create table
75
+ const table = new Table({
76
+ head: columnHeaders.map((h) => pc.cyan(h)),
77
+ style: {
78
+ head: [],
79
+ border: [],
80
+ },
81
+ });
82
+ // Add rows
83
+ for (const row of rows) {
84
+ table.push(columnHeaders.map((header) => {
85
+ const value = row[header];
86
+ return formatValue(value);
87
+ }));
88
+ }
89
+ let output = "";
90
+ if (title) {
91
+ output += pc.bold(pc.white(title)) + "\n\n";
92
+ }
93
+ output += table.toString();
94
+ return output;
95
+ }
96
+ /**
97
+ * Format a single value for display
98
+ */
99
+ function formatValue(value) {
100
+ if (value === null || value === undefined) {
101
+ return pc.dim("-");
102
+ }
103
+ if (typeof value === "boolean") {
104
+ return value ? pc.green("✓") : pc.red("✗");
105
+ }
106
+ if (typeof value === "number") {
107
+ return pc.yellow(String(value));
108
+ }
109
+ if (value instanceof Date) {
110
+ return formatTimestamp(value.getTime());
111
+ }
112
+ if (typeof value === "object") {
113
+ if (Array.isArray(value)) {
114
+ if (value.length === 0) {
115
+ return pc.dim("[]");
116
+ }
117
+ return value.slice(0, 3).join(", ") + (value.length > 3 ? "..." : "");
118
+ }
119
+ return pc.dim("[object]");
120
+ }
121
+ const str = String(value);
122
+ // Truncate long strings
123
+ if (str.length > 50) {
124
+ return str.substring(0, 47) + "...";
125
+ }
126
+ return str;
127
+ }
128
+ /**
129
+ * Format a timestamp for display
130
+ */
131
+ export function formatTimestamp(timestamp) {
132
+ const date = new Date(timestamp);
133
+ return date.toLocaleString();
134
+ }
135
+ /**
136
+ * Format a relative time (e.g., "2 hours ago")
137
+ */
138
+ export function formatRelativeTime(timestamp) {
139
+ const now = Date.now();
140
+ const diff = now - timestamp;
141
+ const seconds = Math.floor(diff / 1000);
142
+ const minutes = Math.floor(seconds / 60);
143
+ const hours = Math.floor(minutes / 60);
144
+ const days = Math.floor(hours / 24);
145
+ if (days > 0) {
146
+ return `${days}d ago`;
147
+ }
148
+ if (hours > 0) {
149
+ return `${hours}h ago`;
150
+ }
151
+ if (minutes > 0) {
152
+ return `${minutes}m ago`;
153
+ }
154
+ return "just now";
155
+ }
156
+ /**
157
+ * Format bytes to human-readable size
158
+ */
159
+ export function formatBytes(bytes) {
160
+ const units = ["B", "KB", "MB", "GB", "TB"];
161
+ let unitIndex = 0;
162
+ let size = bytes;
163
+ while (size >= 1024 && unitIndex < units.length - 1) {
164
+ size /= 1024;
165
+ unitIndex++;
166
+ }
167
+ return `${size.toFixed(1)} ${units[unitIndex]}`;
168
+ }
169
+ /**
170
+ * Format a count with proper pluralization
171
+ */
172
+ export function formatCount(count, singular, plural) {
173
+ const word = count === 1 ? singular : (plural ?? `${singular}s`);
174
+ return `${count.toLocaleString()} ${word}`;
175
+ }
176
+ /**
177
+ * Print a success message
178
+ */
179
+ export function printSuccess(message) {
180
+ console.log(pc.green(`✔ ${message}`));
181
+ }
182
+ /**
183
+ * Print an error message
184
+ */
185
+ export function printError(message) {
186
+ console.error(pc.red(`✖ ${message}`));
187
+ }
188
+ /**
189
+ * Print a warning message
190
+ */
191
+ export function printWarning(message) {
192
+ console.warn(pc.yellow(`⚠ ${message}`));
193
+ }
194
+ /**
195
+ * Print an info message
196
+ */
197
+ export function printInfo(message) {
198
+ console.log(pc.blue(`ℹ ${message}`));
199
+ }
200
+ /**
201
+ * Print a header/title
202
+ */
203
+ export function printHeader(title) {
204
+ console.log();
205
+ console.log(pc.bold(pc.white(title)));
206
+ console.log(pc.dim("─".repeat(title.length)));
207
+ }
208
+ /**
209
+ * Print a key-value pair
210
+ */
211
+ export function printKeyValue(key, value) {
212
+ console.log(` ${pc.cyan(key)}: ${formatValue(value)}`);
213
+ }
214
+ /**
215
+ * Print a section with key-value pairs
216
+ */
217
+ export function printSection(title, data) {
218
+ printHeader(title);
219
+ for (const [key, value] of Object.entries(data)) {
220
+ printKeyValue(key, value);
221
+ }
222
+ console.log();
223
+ }
224
+ /**
225
+ * Print a divider line
226
+ */
227
+ export function printDivider() {
228
+ console.log(pc.dim("─".repeat(40)));
229
+ }
230
+ /**
231
+ * Create a simple progress indicator
232
+ */
233
+ export function createProgressText(current, total) {
234
+ const percentage = Math.round((current / total) * 100);
235
+ const filled = Math.round(percentage / 5);
236
+ const bar = "█".repeat(filled) + "░".repeat(20 - filled);
237
+ return `[${bar}] ${percentage}%`;
238
+ }
239
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Input Validation Utilities
3
+ *
4
+ * Provides validation functions for CLI inputs
5
+ */
6
+ import type { MemorySpaceType, MemorySpaceStatus, FactType, OutputFormat } from "../types.js";
7
+ /**
8
+ * Validation error
9
+ */
10
+ export declare class ValidationError extends Error {
11
+ constructor(message: string);
12
+ }
13
+ /**
14
+ * Validate a memory space ID
15
+ */
16
+ export declare function validateMemorySpaceId(id: string): void;
17
+ /**
18
+ * Validate a user ID
19
+ */
20
+ export declare function validateUserId(id: string): void;
21
+ /**
22
+ * Validate a memory ID
23
+ */
24
+ export declare function validateMemoryId(id: string): void;
25
+ /**
26
+ * Validate a conversation ID
27
+ */
28
+ export declare function validateConversationId(id: string): void;
29
+ /**
30
+ * Validate a fact ID
31
+ */
32
+ export declare function validateFactId(id: string): void;
33
+ /**
34
+ * Validate memory space type
35
+ */
36
+ export declare function validateMemorySpaceType(type: string): MemorySpaceType;
37
+ /**
38
+ * Validate memory space status
39
+ */
40
+ export declare function validateMemorySpaceStatus(status: string): MemorySpaceStatus;
41
+ /**
42
+ * Validate fact type
43
+ */
44
+ export declare function validateFactType(type: string): FactType;
45
+ /**
46
+ * Validate output format
47
+ */
48
+ export declare function validateOutputFormat(format: string): OutputFormat;
49
+ /**
50
+ * Validate a limit (pagination)
51
+ */
52
+ export declare function validateLimit(limit: number, max?: number): number;
53
+ /**
54
+ * Validate a URL
55
+ */
56
+ export declare function validateUrl(url: string): void;
57
+ /**
58
+ * Validate file path
59
+ */
60
+ export declare function validateFilePath(path: string): void;
61
+ /**
62
+ * Validate search query
63
+ */
64
+ export declare function validateSearchQuery(query: string): void;
65
+ /**
66
+ * Require confirmation for dangerous operations
67
+ */
68
+ export declare function requireConfirmation(message: string, options?: {
69
+ confirmDangerous?: boolean;
70
+ }): Promise<boolean>;
71
+ /**
72
+ * Require exact text confirmation for very dangerous operations
73
+ */
74
+ export declare function requireExactConfirmation(expectedText: string, message?: string): Promise<boolean>;
75
+ /**
76
+ * Parse array argument from comma-separated string
77
+ */
78
+ export declare function parseArrayArg(value: string): string[];
79
+ /**
80
+ * Parse key-value pairs from "key=value" format
81
+ */
82
+ export declare function parseKeyValueArg(value: string): Record<string, string>;
83
+ //# sourceMappingURL=validation.d.ts.map