@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,486 @@
1
+ /**
2
+ * User Commands
3
+ *
4
+ * Commands for managing users with GDPR cascade deletion support:
5
+ * - list: List all users
6
+ * - get: Get user profile
7
+ * - delete: Delete user with optional cascade
8
+ * - delete-many: Delete multiple users
9
+ * - export: Export user data
10
+ * - stats: Show user statistics
11
+ */
12
+ import ora from "ora";
13
+ import { withClient } from "../utils/client.js";
14
+ import { resolveConfig } from "../utils/config.js";
15
+ import { formatOutput, printSuccess, printError, printWarning, printSection, formatCount, formatTimestamp, formatRelativeTime, } from "../utils/formatting.js";
16
+ import { validateUserId, validateLimit, validateFilePath, requireConfirmation, requireExactConfirmation, } from "../utils/validation.js";
17
+ import { writeFile } from "fs/promises";
18
+ /**
19
+ * Register user commands
20
+ */
21
+ export function registerUserCommands(program, config) {
22
+ const users = program
23
+ .command("users")
24
+ .description("Manage user profiles and data");
25
+ // users list
26
+ users
27
+ .command("list")
28
+ .description("List all user profiles")
29
+ .option("-l, --limit <number>", "Maximum number of results", "50")
30
+ .option("-f, --format <format>", "Output format: table, json, csv")
31
+ .action(async (options) => {
32
+ const globalOpts = program.opts();
33
+ const resolved = resolveConfig(config, globalOpts);
34
+ const format = (options.format ?? resolved.format);
35
+ const spinner = ora("Loading users...").start();
36
+ try {
37
+ const limit = validateLimit(parseInt(options.limit, 10));
38
+ await withClient(config, globalOpts, async (client) => {
39
+ const usersList = await client.users.list({ limit });
40
+ spinner.stop();
41
+ if (usersList.length === 0) {
42
+ printWarning("No users found");
43
+ return;
44
+ }
45
+ // Format users for display
46
+ const displayData = usersList.map((u) => ({
47
+ id: u.id,
48
+ version: u.version,
49
+ created: formatRelativeTime(u.createdAt),
50
+ updated: formatRelativeTime(u.updatedAt),
51
+ data: JSON.stringify(u.data).substring(0, 50) + "...",
52
+ }));
53
+ console.log(formatOutput(displayData, format, {
54
+ title: "User Profiles",
55
+ headers: ["id", "version", "created", "updated", "data"],
56
+ }));
57
+ printSuccess(`Found ${formatCount(usersList.length, "user")}`);
58
+ });
59
+ }
60
+ catch (error) {
61
+ spinner.stop();
62
+ printError(error instanceof Error ? error.message : "Failed to list users");
63
+ process.exit(1);
64
+ }
65
+ });
66
+ // users get
67
+ users
68
+ .command("get <userId>")
69
+ .description("Get user profile details")
70
+ .option("-f, --format <format>", "Output format: table, json")
71
+ .option("--include-history", "Include version history", false)
72
+ .action(async (userId, options) => {
73
+ const globalOpts = program.opts();
74
+ const resolved = resolveConfig(config, globalOpts);
75
+ const format = (options.format ?? resolved.format);
76
+ const spinner = ora("Loading user...").start();
77
+ try {
78
+ validateUserId(userId);
79
+ await withClient(config, globalOpts, async (client) => {
80
+ const user = await client.users.get(userId);
81
+ if (!user) {
82
+ spinner.stop();
83
+ printError(`User ${userId} not found`);
84
+ process.exit(1);
85
+ }
86
+ // Get version history if requested
87
+ let history = null;
88
+ if (options.includeHistory) {
89
+ history = await client.users.getHistory(userId);
90
+ }
91
+ spinner.stop();
92
+ if (format === "json") {
93
+ console.log(formatOutput(options.includeHistory ? { user, history } : user, "json"));
94
+ }
95
+ else {
96
+ printSection(`User Profile: ${userId}`, {
97
+ ID: user.id,
98
+ Version: user.version,
99
+ Created: formatTimestamp(user.createdAt),
100
+ Updated: formatTimestamp(user.updatedAt),
101
+ });
102
+ console.log("\n Profile Data:");
103
+ for (const [key, value] of Object.entries(user.data)) {
104
+ console.log(` ${key}: ${JSON.stringify(value)}`);
105
+ }
106
+ if (history && history.length > 0) {
107
+ console.log(`\n Version History: ${history.length} versions`);
108
+ for (const v of history.slice(0, 5)) {
109
+ console.log(` v${v.version}: ${formatTimestamp(v.timestamp)}`);
110
+ }
111
+ if (history.length > 5) {
112
+ console.log(` ... and ${history.length - 5} more`);
113
+ }
114
+ }
115
+ }
116
+ });
117
+ }
118
+ catch (error) {
119
+ spinner.stop();
120
+ printError(error instanceof Error ? error.message : "Failed to get user");
121
+ process.exit(1);
122
+ }
123
+ });
124
+ // users delete (with GDPR cascade)
125
+ users
126
+ .command("delete <userId>")
127
+ .description("Delete user profile with optional GDPR cascade deletion")
128
+ .option("--cascade", "Delete all user data across all layers (GDPR)", false)
129
+ .option("--dry-run", "Preview what would be deleted without actually deleting", false)
130
+ .option("--verify", "Verify deletion completeness after cascade", true)
131
+ .option("-y, --yes", "Skip confirmation prompt (not recommended for cascade)", false)
132
+ .action(async (userId, options) => {
133
+ const globalOpts = program.opts();
134
+ try {
135
+ validateUserId(userId);
136
+ // Require extra confirmation for cascade deletion
137
+ if (options.cascade && !options.yes && !options.dryRun) {
138
+ console.log("\n⚠️ GDPR CASCADE DELETION");
139
+ console.log("This will permanently delete ALL data for this user across:");
140
+ console.log(" • User profile");
141
+ console.log(" • Conversations and messages");
142
+ console.log(" • Memories (vector store)");
143
+ console.log(" • Facts");
144
+ console.log(" • Immutable records");
145
+ console.log(" • Mutable records");
146
+ console.log(" • Graph nodes (if configured)\n");
147
+ const confirmed = await requireExactConfirmation(userId, `Type the user ID "${userId}" to confirm cascade deletion:`);
148
+ if (!confirmed) {
149
+ printWarning("Operation cancelled");
150
+ return;
151
+ }
152
+ }
153
+ else if (!options.yes && !options.dryRun) {
154
+ const confirmed = await requireConfirmation(`Delete user profile ${userId}?`, config);
155
+ if (!confirmed) {
156
+ printWarning("Operation cancelled");
157
+ return;
158
+ }
159
+ }
160
+ const spinner = ora(options.dryRun
161
+ ? "Analyzing deletion scope..."
162
+ : options.cascade
163
+ ? "Performing cascade deletion..."
164
+ : "Deleting user...").start();
165
+ await withClient(config, globalOpts, async (client) => {
166
+ const result = await client.users.delete(userId, {
167
+ cascade: options.cascade,
168
+ dryRun: options.dryRun,
169
+ verify: options.verify,
170
+ });
171
+ spinner.stop();
172
+ if (options.dryRun) {
173
+ console.log("\n📋 DRY RUN - No data was deleted\n");
174
+ printSection(`Would delete for user ${userId}`, {
175
+ "User Profile": "Yes",
176
+ Conversations: result.conversationsDeleted,
177
+ "Conversation Messages": result.conversationMessagesDeleted,
178
+ "Immutable Records": result.immutableRecordsDeleted,
179
+ "Mutable Keys": result.mutableKeysDeleted,
180
+ "Vector Memories": result.vectorMemoriesDeleted,
181
+ Facts: result.factsDeleted,
182
+ "Graph Nodes": result.graphNodesDeleted ?? "N/A",
183
+ "Total Records": result.totalDeleted,
184
+ "Affected Layers": result.deletedLayers.join(", "),
185
+ });
186
+ }
187
+ else {
188
+ printSuccess(`Deleted user ${userId}`);
189
+ if (options.cascade) {
190
+ printSection("Cascade Deletion Summary", {
191
+ Conversations: result.conversationsDeleted,
192
+ Messages: result.conversationMessagesDeleted,
193
+ Memories: result.vectorMemoriesDeleted,
194
+ Facts: result.factsDeleted,
195
+ "Immutable Records": result.immutableRecordsDeleted,
196
+ "Mutable Keys": result.mutableKeysDeleted,
197
+ "Graph Nodes": result.graphNodesDeleted ?? "N/A",
198
+ "Total Deleted": result.totalDeleted,
199
+ });
200
+ // Show verification results
201
+ if (options.verify && result.verification) {
202
+ if (result.verification.complete) {
203
+ printSuccess("✓ Verification passed - all user data deleted");
204
+ }
205
+ else {
206
+ printWarning("Verification found potential issues:");
207
+ for (const issue of result.verification.issues) {
208
+ console.log(` • ${issue}`);
209
+ }
210
+ }
211
+ }
212
+ }
213
+ }
214
+ });
215
+ }
216
+ catch (error) {
217
+ printError(error instanceof Error ? error.message : "Delete failed");
218
+ process.exit(1);
219
+ }
220
+ });
221
+ // users delete-many
222
+ users
223
+ .command("delete-many <userIds...>")
224
+ .description("Delete multiple users with optional GDPR cascade")
225
+ .option("--cascade", "Delete all user data across all layers", false)
226
+ .option("--dry-run", "Preview what would be deleted", false)
227
+ .option("-y, --yes", "Skip confirmation prompt", false)
228
+ .action(async (userIds, options) => {
229
+ const globalOpts = program.opts();
230
+ try {
231
+ // Validate all user IDs
232
+ for (const userId of userIds) {
233
+ validateUserId(userId);
234
+ }
235
+ if (!options.yes && !options.dryRun) {
236
+ const cascade = options.cascade ? " (with cascade)" : "";
237
+ const confirmed = await requireConfirmation(`Delete ${formatCount(userIds.length, "user")}${cascade}? This cannot be undone.`, config);
238
+ if (!confirmed) {
239
+ printWarning("Operation cancelled");
240
+ return;
241
+ }
242
+ }
243
+ const spinner = ora(`Deleting ${userIds.length} users...`).start();
244
+ await withClient(config, globalOpts, async (client) => {
245
+ const result = await client.users.deleteMany(userIds, {
246
+ cascade: options.cascade,
247
+ dryRun: options.dryRun,
248
+ });
249
+ spinner.stop();
250
+ if (options.dryRun) {
251
+ printWarning(`DRY RUN: Would delete ${formatCount(userIds.length, "user")}`);
252
+ }
253
+ else {
254
+ printSuccess(`Deleted ${formatCount(result.deleted, "user")} of ${userIds.length}`);
255
+ if (result.deleted < userIds.length) {
256
+ printWarning(`${userIds.length - result.deleted} users not found or could not be deleted`);
257
+ }
258
+ }
259
+ });
260
+ }
261
+ catch (error) {
262
+ printError(error instanceof Error ? error.message : "Delete failed");
263
+ process.exit(1);
264
+ }
265
+ });
266
+ // users export
267
+ users
268
+ .command("export <userId>")
269
+ .description("Export all user data (GDPR data portability)")
270
+ .option("-o, --output <file>", "Output file path", "user-export.json")
271
+ .action(async (userId, options) => {
272
+ const globalOpts = program.opts();
273
+ const spinner = ora("Exporting user data...").start();
274
+ try {
275
+ validateUserId(userId);
276
+ validateFilePath(options.output);
277
+ await withClient(config, globalOpts, async (client) => {
278
+ // Get user profile
279
+ const user = await client.users.get(userId);
280
+ if (!user) {
281
+ spinner.stop();
282
+ printError(`User ${userId} not found`);
283
+ process.exit(1);
284
+ }
285
+ // Get user history
286
+ const history = await client.users.getHistory(userId);
287
+ // Export the data
288
+ const exportData = {
289
+ userId,
290
+ exportedAt: Date.now(),
291
+ profile: user,
292
+ versionHistory: history,
293
+ };
294
+ await writeFile(options.output, JSON.stringify(exportData, null, 2), "utf-8");
295
+ spinner.stop();
296
+ printSuccess(`Exported user data to ${options.output}`);
297
+ });
298
+ }
299
+ catch (error) {
300
+ spinner.stop();
301
+ printError(error instanceof Error ? error.message : "Export failed");
302
+ process.exit(1);
303
+ }
304
+ });
305
+ // users stats
306
+ users
307
+ .command("stats <userId>")
308
+ .description("Show statistics for a user")
309
+ .option("-f, --format <format>", "Output format: table, json")
310
+ .action(async (userId, options) => {
311
+ const globalOpts = program.opts();
312
+ const resolved = resolveConfig(config, globalOpts);
313
+ const format = (options.format ?? resolved.format);
314
+ const spinner = ora("Loading user statistics...").start();
315
+ try {
316
+ validateUserId(userId);
317
+ await withClient(config, globalOpts, async (client) => {
318
+ // Check if user exists
319
+ const user = await client.users.get(userId);
320
+ if (!user) {
321
+ spinner.stop();
322
+ printError(`User ${userId} not found`);
323
+ process.exit(1);
324
+ }
325
+ // Get version count
326
+ const history = await client.users.getHistory(userId);
327
+ // Get all memory spaces to count user's data
328
+ const spaces = await client.memorySpaces.list();
329
+ let totalMemories = 0;
330
+ let totalConversations = 0;
331
+ const spacesWithData = [];
332
+ for (const space of spaces) {
333
+ const memoryCount = await client.memory.count({
334
+ memorySpaceId: space.memorySpaceId,
335
+ userId,
336
+ });
337
+ if (memoryCount > 0) {
338
+ totalMemories += memoryCount;
339
+ spacesWithData.push(space.memorySpaceId);
340
+ }
341
+ // Try to count conversations (may not have userId filter)
342
+ try {
343
+ const conversations = await client.conversations.list({
344
+ memorySpaceId: space.memorySpaceId,
345
+ userId,
346
+ limit: 1000,
347
+ });
348
+ totalConversations += conversations.length;
349
+ }
350
+ catch {
351
+ // Skip if conversations don't support userId filter
352
+ }
353
+ }
354
+ spinner.stop();
355
+ const stats = {
356
+ userId,
357
+ profileVersions: history.length,
358
+ totalMemories,
359
+ totalConversations,
360
+ memorySpaces: spacesWithData.length,
361
+ spacesWithData,
362
+ profileCreated: formatTimestamp(user.createdAt),
363
+ lastUpdated: formatTimestamp(user.updatedAt),
364
+ };
365
+ if (format === "json") {
366
+ console.log(formatOutput(stats, "json"));
367
+ }
368
+ else {
369
+ printSection(`User Statistics: ${userId}`, {
370
+ "Profile Versions": history.length,
371
+ "Total Memories": totalMemories,
372
+ "Total Conversations": totalConversations,
373
+ "Memory Spaces with Data": spacesWithData.length,
374
+ "Profile Created": formatTimestamp(user.createdAt),
375
+ "Last Updated": formatTimestamp(user.updatedAt),
376
+ });
377
+ if (spacesWithData.length > 0) {
378
+ console.log("\n Spaces with user data:");
379
+ for (const space of spacesWithData.slice(0, 5)) {
380
+ console.log(` • ${space}`);
381
+ }
382
+ if (spacesWithData.length > 5) {
383
+ console.log(` ... and ${spacesWithData.length - 5} more`);
384
+ }
385
+ }
386
+ }
387
+ });
388
+ }
389
+ catch (error) {
390
+ spinner.stop();
391
+ printError(error instanceof Error ? error.message : "Failed to load statistics");
392
+ process.exit(1);
393
+ }
394
+ });
395
+ // users update
396
+ users
397
+ .command("update <userId>")
398
+ .description("Update user profile data")
399
+ .option("-d, --data <json>", "JSON data to merge into profile")
400
+ .option("-f, --file <path>", "JSON file with data to merge")
401
+ .action(async (userId, options) => {
402
+ const globalOpts = program.opts();
403
+ try {
404
+ validateUserId(userId);
405
+ if (!options.data && !options.file) {
406
+ printError("Either --data or --file is required");
407
+ process.exit(1);
408
+ }
409
+ let data;
410
+ if (options.file) {
411
+ const { readFile } = await import("fs/promises");
412
+ const content = await readFile(options.file, "utf-8");
413
+ data = JSON.parse(content);
414
+ }
415
+ else {
416
+ data = JSON.parse(options.data);
417
+ }
418
+ const spinner = ora("Updating user profile...").start();
419
+ await withClient(config, globalOpts, async (client) => {
420
+ const updated = await client.users.merge(userId, data);
421
+ spinner.stop();
422
+ printSuccess(`Updated user ${userId} (now version ${updated.version})`);
423
+ });
424
+ }
425
+ catch (error) {
426
+ printError(error instanceof Error ? error.message : "Update failed");
427
+ process.exit(1);
428
+ }
429
+ });
430
+ // users create
431
+ users
432
+ .command("create <userId>")
433
+ .description("Create a new user profile")
434
+ .option("-d, --data <json>", "JSON data for the profile", "{}")
435
+ .action(async (userId, options) => {
436
+ const globalOpts = program.opts();
437
+ try {
438
+ validateUserId(userId);
439
+ const data = JSON.parse(options.data);
440
+ const spinner = ora("Creating user profile...").start();
441
+ await withClient(config, globalOpts, async (client) => {
442
+ // Check if user exists
443
+ const existing = await client.users.get(userId);
444
+ if (existing) {
445
+ spinner.stop();
446
+ printError(`User ${userId} already exists`);
447
+ process.exit(1);
448
+ }
449
+ const user = await client.users.update(userId, data);
450
+ spinner.stop();
451
+ printSuccess(`Created user ${userId}`);
452
+ console.log(` Version: ${user.version}`);
453
+ console.log(` Created: ${formatTimestamp(user.createdAt)}`);
454
+ });
455
+ }
456
+ catch (error) {
457
+ printError(error instanceof Error ? error.message : "Create failed");
458
+ process.exit(1);
459
+ }
460
+ });
461
+ // users exists
462
+ users
463
+ .command("exists <userId>")
464
+ .description("Check if a user exists")
465
+ .action(async (userId) => {
466
+ const globalOpts = program.opts();
467
+ try {
468
+ validateUserId(userId);
469
+ await withClient(config, globalOpts, async (client) => {
470
+ const exists = await client.users.exists(userId);
471
+ if (exists) {
472
+ printSuccess(`User ${userId} exists`);
473
+ }
474
+ else {
475
+ printWarning(`User ${userId} does not exist`);
476
+ process.exit(1);
477
+ }
478
+ });
479
+ }
480
+ catch (error) {
481
+ printError(error instanceof Error ? error.message : "Check failed");
482
+ process.exit(1);
483
+ }
484
+ });
485
+ }
486
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/commands/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cortex CLI - Command Line Interface for Cortex Memory SDK
4
+ *
5
+ * A powerful tool for managing Cortex deployments, performing administrative tasks,
6
+ * and streamlining development workflows.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cortex CLI - Command Line Interface for Cortex Memory SDK
4
+ *
5
+ * A powerful tool for managing Cortex deployments, performing administrative tasks,
6
+ * and streamlining development workflows.
7
+ */
8
+ import { Command } from "commander";
9
+ import pc from "picocolors";
10
+ import { registerMemoryCommands } from "./commands/memory.js";
11
+ import { registerUserCommands } from "./commands/users.js";
12
+ import { registerSpaceCommands } from "./commands/spaces.js";
13
+ import { registerFactsCommands } from "./commands/facts.js";
14
+ import { registerConversationsCommands } from "./commands/conversations.js";
15
+ import { registerConvexCommands } from "./commands/convex.js";
16
+ import { registerSetupCommands } from "./commands/setup.js";
17
+ import { registerDbCommands } from "./commands/db.js";
18
+ import { registerDevCommands } from "./commands/dev.js";
19
+ import { loadConfig } from "./utils/config.js";
20
+ // Package version - will be read from package.json in build
21
+ const VERSION = "0.1.0";
22
+ const program = new Command();
23
+ program
24
+ .name("cortex")
25
+ .description("CLI tool for managing Cortex Memory deployments and performing administrative tasks")
26
+ .version(VERSION)
27
+ .option("-d, --deployment <name>", "Deployment name to use (from config)")
28
+ .option("-u, --url <url>", "Convex deployment URL (overrides config)")
29
+ .option("-k, --key <key>", "Convex deploy key (overrides config)")
30
+ .option("-f, --format <format>", "Output format: table, json, csv", "table")
31
+ .option("-q, --quiet", "Suppress non-essential output", false)
32
+ .option("--debug", "Enable debug output", false);
33
+ // Load config and register commands
34
+ async function main() {
35
+ try {
36
+ // Load configuration
37
+ const config = await loadConfig();
38
+ // Register all command groups
39
+ registerMemoryCommands(program, config);
40
+ registerUserCommands(program, config);
41
+ registerSpaceCommands(program, config);
42
+ registerFactsCommands(program, config);
43
+ registerConversationsCommands(program, config);
44
+ registerConvexCommands(program, config);
45
+ registerSetupCommands(program, config);
46
+ registerDbCommands(program, config);
47
+ registerDevCommands(program, config);
48
+ // Parse arguments and execute
49
+ await program.parseAsync(process.argv);
50
+ }
51
+ catch (error) {
52
+ if (error instanceof Error) {
53
+ console.error(pc.red(`\n✖ Error: ${error.message}\n`));
54
+ if (process.env.DEBUG || program.opts().debug) {
55
+ console.error(error.stack);
56
+ }
57
+ }
58
+ else {
59
+ console.error(pc.red(`\n✖ An unexpected error occurred\n`));
60
+ }
61
+ process.exit(1);
62
+ }
63
+ }
64
+ // Show help if no command provided
65
+ if (process.argv.length === 2) {
66
+ program.outputHelp();
67
+ process.exit(0);
68
+ }
69
+ main();
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}