@cortexmemory/cli 0.1.0 → 0.22.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 (114) hide show
  1. package/README.md +8 -0
  2. package/dist/commands/conversations.d.ts +1 -1
  3. package/dist/commands/conversations.d.ts.map +1 -1
  4. package/dist/commands/conversations.js +58 -28
  5. package/dist/commands/conversations.js.map +1 -1
  6. package/dist/commands/convex.d.ts +1 -1
  7. package/dist/commands/convex.d.ts.map +1 -1
  8. package/dist/commands/convex.js +237 -64
  9. package/dist/commands/convex.js.map +1 -1
  10. package/dist/commands/db.d.ts +1 -1
  11. package/dist/commands/db.d.ts.map +1 -1
  12. package/dist/commands/db.js +511 -113
  13. package/dist/commands/db.js.map +1 -1
  14. package/dist/commands/dev.d.ts +8 -8
  15. package/dist/commands/dev.d.ts.map +1 -1
  16. package/dist/commands/dev.js +734 -513
  17. package/dist/commands/dev.js.map +1 -1
  18. package/dist/commands/facts.d.ts +1 -1
  19. package/dist/commands/facts.d.ts.map +1 -1
  20. package/dist/commands/facts.js +79 -49
  21. package/dist/commands/facts.js.map +1 -1
  22. package/dist/commands/init.d.ts +28 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +895 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/memory.d.ts +1 -1
  27. package/dist/commands/memory.d.ts.map +1 -1
  28. package/dist/commands/memory.js +84 -48
  29. package/dist/commands/memory.js.map +1 -1
  30. package/dist/commands/setup.d.ts +4 -5
  31. package/dist/commands/setup.d.ts.map +1 -1
  32. package/dist/commands/setup.js +613 -265
  33. package/dist/commands/setup.js.map +1 -1
  34. package/dist/commands/spaces.d.ts +1 -1
  35. package/dist/commands/spaces.d.ts.map +1 -1
  36. package/dist/commands/spaces.js +100 -43
  37. package/dist/commands/spaces.js.map +1 -1
  38. package/dist/commands/status.d.ts +17 -0
  39. package/dist/commands/status.d.ts.map +1 -0
  40. package/dist/commands/status.js +314 -0
  41. package/dist/commands/status.js.map +1 -0
  42. package/dist/commands/users.d.ts +1 -1
  43. package/dist/commands/users.d.ts.map +1 -1
  44. package/dist/commands/users.js +152 -45
  45. package/dist/commands/users.js.map +1 -1
  46. package/dist/index.js +61 -19
  47. package/dist/index.js.map +1 -1
  48. package/dist/types.d.ts +11 -0
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/utils/__tests__/client.test.d.ts +5 -0
  51. package/dist/utils/__tests__/client.test.d.ts.map +1 -0
  52. package/dist/utils/__tests__/client.test.js +88 -0
  53. package/dist/utils/__tests__/client.test.js.map +1 -0
  54. package/dist/utils/__tests__/env-file.test.d.ts +7 -0
  55. package/dist/utils/__tests__/env-file.test.d.ts.map +1 -0
  56. package/dist/utils/__tests__/env-file.test.js +196 -0
  57. package/dist/utils/__tests__/env-file.test.js.map +1 -0
  58. package/dist/utils/__tests__/shell.test.d.ts +7 -0
  59. package/dist/utils/__tests__/shell.test.d.ts.map +1 -0
  60. package/dist/utils/__tests__/shell.test.js +89 -0
  61. package/dist/utils/__tests__/shell.test.js.map +1 -0
  62. package/dist/utils/client.d.ts +1 -0
  63. package/dist/utils/client.d.ts.map +1 -1
  64. package/dist/utils/client.js +7 -1
  65. package/dist/utils/client.js.map +1 -1
  66. package/dist/utils/config.d.ts.map +1 -1
  67. package/dist/utils/config.js +12 -39
  68. package/dist/utils/config.js.map +1 -1
  69. package/dist/utils/deployment-selector.d.ts +50 -0
  70. package/dist/utils/deployment-selector.d.ts.map +1 -0
  71. package/dist/utils/deployment-selector.js +129 -0
  72. package/dist/utils/deployment-selector.js.map +1 -0
  73. package/dist/utils/env-file.d.ts +48 -0
  74. package/dist/utils/env-file.d.ts.map +1 -0
  75. package/dist/utils/env-file.js +152 -0
  76. package/dist/utils/env-file.js.map +1 -0
  77. package/dist/utils/formatting.d.ts.map +1 -1
  78. package/dist/utils/formatting.js +4 -0
  79. package/dist/utils/formatting.js.map +1 -1
  80. package/dist/utils/init/convex-setup.d.ts +30 -0
  81. package/dist/utils/init/convex-setup.d.ts.map +1 -0
  82. package/dist/utils/init/convex-setup.js +225 -0
  83. package/dist/utils/init/convex-setup.js.map +1 -0
  84. package/dist/utils/init/env-generator.d.ts +32 -0
  85. package/dist/utils/init/env-generator.d.ts.map +1 -0
  86. package/dist/utils/init/env-generator.js +210 -0
  87. package/dist/utils/init/env-generator.js.map +1 -0
  88. package/dist/utils/init/file-operations.d.ts +22 -0
  89. package/dist/utils/init/file-operations.d.ts.map +1 -0
  90. package/dist/utils/init/file-operations.js +211 -0
  91. package/dist/utils/init/file-operations.js.map +1 -0
  92. package/dist/utils/init/graph-setup.d.ts +35 -0
  93. package/dist/utils/init/graph-setup.d.ts.map +1 -0
  94. package/dist/utils/init/graph-setup.js +413 -0
  95. package/dist/utils/init/graph-setup.js.map +1 -0
  96. package/dist/utils/init/index.d.ts +11 -0
  97. package/dist/utils/init/index.d.ts.map +1 -0
  98. package/dist/utils/init/index.js +11 -0
  99. package/dist/utils/init/index.js.map +1 -0
  100. package/dist/utils/init/types.d.ts +73 -0
  101. package/dist/utils/init/types.d.ts.map +1 -0
  102. package/dist/utils/init/types.js +5 -0
  103. package/dist/utils/init/types.js.map +1 -0
  104. package/dist/utils/shell.d.ts +60 -0
  105. package/dist/utils/shell.d.ts.map +1 -0
  106. package/dist/utils/shell.js +188 -0
  107. package/dist/utils/shell.js.map +1 -0
  108. package/package.json +30 -19
  109. package/templates/basic/README.md +105 -0
  110. package/templates/basic/dev-runner.mjs +215 -0
  111. package/templates/basic/package-lock.json +1263 -0
  112. package/templates/basic/package.json +22 -0
  113. package/templates/basic/src/index.ts +85 -0
  114. package/templates/basic/tsconfig.json +17 -0
@@ -0,0 +1,211 @@
1
+ /**
2
+ * File operations for init wizard
3
+ *
4
+ * Handles copying templates and deploying Cortex backend functions.
5
+ */
6
+ import fs from "fs-extra";
7
+ import path from "path";
8
+ import { fileURLToPath } from "url";
9
+ import { dirname } from "path";
10
+ import { getSDKPath } from "../shell.js";
11
+ import pc from "picocolors";
12
+ // ES module equivalents of __dirname
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = dirname(__filename);
15
+ /**
16
+ * Copy Cortex backend functions from SDK to user project
17
+ */
18
+ export async function deployCortexBackend(projectPath) {
19
+ // Look for SDK in the newly created project's node_modules
20
+ const sdkPath = getSDKPath(projectPath);
21
+ if (!sdkPath) {
22
+ // Debug: Check what's actually in node_modules
23
+ const nodeModulesPath = path.join(projectPath, "node_modules", "@cortexmemory");
24
+ const exists = fs.existsSync(nodeModulesPath);
25
+ throw new Error(`Could not locate @cortexmemory/sdk package. ` +
26
+ `Checked: ${path.join(projectPath, "node_modules", "@cortexmemory", "sdk")} ` +
27
+ `(@cortexmemory folder exists: ${exists})`);
28
+ }
29
+ const convexDevPath = path.join(sdkPath, "convex-dev");
30
+ const targetConvexPath = path.join(projectPath, "convex");
31
+ // Check if convex-dev exists in SDK
32
+ if (!fs.existsSync(convexDevPath)) {
33
+ throw new Error(`Convex backend functions not found at ${convexDevPath}. ` +
34
+ "Please ensure you are using @cortexmemory/sdk v0.8.1 or later.");
35
+ }
36
+ // Backup existing convex/ folder if it exists
37
+ try {
38
+ const backupPath = path.join(projectPath, `convex.backup.${Date.now()}`);
39
+ await fs.move(targetConvexPath, backupPath);
40
+ console.log(pc.yellow(" Existing convex/ folder backed up"));
41
+ console.log(pc.dim(` Backed up to ${path.basename(backupPath)}`));
42
+ }
43
+ catch (error) {
44
+ const err = error;
45
+ if (err.code !== "ENOENT") {
46
+ throw error;
47
+ }
48
+ }
49
+ // Copy all files from convex-dev to convex
50
+ console.log(pc.dim(" Copying Cortex backend functions..."));
51
+ await fs.copy(convexDevPath, targetConvexPath, {
52
+ overwrite: true,
53
+ errorOnExist: false,
54
+ });
55
+ // List of critical files to verify
56
+ const criticalFiles = [
57
+ "schema.ts",
58
+ "conversations.ts",
59
+ "immutable.ts",
60
+ "mutable.ts",
61
+ "memories.ts",
62
+ "facts.ts",
63
+ "contexts.ts",
64
+ "memorySpaces.ts",
65
+ "users.ts",
66
+ "agents.ts",
67
+ "graphSync.ts",
68
+ ];
69
+ // Verify all critical files were copied
70
+ const missingFiles = criticalFiles.filter((file) => !fs.existsSync(path.join(targetConvexPath, file)));
71
+ if (missingFiles.length > 0) {
72
+ throw new Error(`Failed to copy some backend functions: ${missingFiles.join(", ")}`);
73
+ }
74
+ console.log(pc.green(` Copied ${criticalFiles.length} backend functions`));
75
+ }
76
+ /**
77
+ * Create or update convex.json configuration
78
+ */
79
+ export async function createConvexJson(projectPath) {
80
+ const convexJsonPath = path.join(projectPath, "convex.json");
81
+ const convexConfig = {
82
+ functions: "convex/",
83
+ };
84
+ await fs.writeJson(convexJsonPath, convexConfig, { spaces: 2 });
85
+ console.log(pc.dim(" Created convex.json"));
86
+ }
87
+ /**
88
+ * Copy project template files
89
+ */
90
+ export async function copyTemplate(templateName, targetPath, projectName, convexVersion) {
91
+ // When running from npm/npx, templates are relative to the package root
92
+ // Try multiple possible locations
93
+ const possiblePaths = [
94
+ path.join(__dirname, "../../../templates", templateName), // From dist/utils/init/
95
+ path.join(__dirname, "../../../../templates", templateName), // From dist/utils/init/subdir
96
+ path.join(process.cwd(), "node_modules", "@cortexmemory", "cli", "templates", templateName), // From installed package
97
+ ];
98
+ let templatePath = null;
99
+ for (const tryPath of possiblePaths) {
100
+ if (fs.existsSync(tryPath)) {
101
+ templatePath = tryPath;
102
+ break;
103
+ }
104
+ }
105
+ console.log(pc.dim(" Looking for template..."));
106
+ if (!templatePath) {
107
+ throw new Error(`Template ${templateName} not found. Tried:\n` +
108
+ possiblePaths.map((p) => ` - ${p}`).join("\n"));
109
+ }
110
+ console.log(pc.dim(` Found at: ${templatePath}`));
111
+ console.log(pc.dim(` Copying to: ${targetPath}`));
112
+ // List what's in the template
113
+ const templateFiles = await fs.readdir(templatePath, { recursive: true });
114
+ console.log(pc.dim(` Template has ${templateFiles.length} items`));
115
+ // Copy template files
116
+ console.log(pc.dim(" Starting fs.copy..."));
117
+ try {
118
+ await fs.copy(templatePath, targetPath, {
119
+ overwrite: true,
120
+ errorOnExist: false,
121
+ filter: (src) => {
122
+ const relativeSrc = path.relative(templatePath, src) || ".";
123
+ // Only skip if node_modules/dist are IN the template itself
124
+ const skip = relativeSrc.includes("node_modules") || relativeSrc.includes("dist");
125
+ console.log(pc.dim(` Filter: ${relativeSrc} -> ${skip ? "SKIP" : "COPY"}`));
126
+ return !skip;
127
+ },
128
+ });
129
+ console.log(pc.dim(" fs.copy completed"));
130
+ }
131
+ catch (error) {
132
+ console.error(pc.red(` fs.copy error: ${error}`));
133
+ throw new Error(`fs.copy failed: ${error}`);
134
+ }
135
+ // Verify key files were copied
136
+ const keyFiles = ["package.json", "src/index.ts", "tsconfig.json"];
137
+ const missing = keyFiles.filter((f) => !fs.existsSync(path.join(targetPath, f)));
138
+ if (missing.length > 0) {
139
+ throw new Error(`Failed to copy template files: ${missing.join(", ")} not found`);
140
+ }
141
+ // Replace template variables in package.json
142
+ const packageJsonPath = path.join(targetPath, "package.json");
143
+ try {
144
+ const packageJsonContent = await fs.readFile(packageJsonPath, "utf-8");
145
+ const packageJson = JSON.parse(packageJsonContent);
146
+ // Replace project name
147
+ packageJson.name = projectName;
148
+ // Update Convex version if provided
149
+ if (convexVersion && packageJson.dependencies?.convex) {
150
+ packageJson.dependencies.convex = convexVersion;
151
+ console.log(pc.dim(` Using Convex ${convexVersion} (from SDK metadata)`));
152
+ }
153
+ // Write back with proper formatting
154
+ await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n");
155
+ }
156
+ catch (error) {
157
+ const err = error;
158
+ if (err.code !== "ENOENT") {
159
+ throw error;
160
+ }
161
+ }
162
+ }
163
+ /**
164
+ * Create .gitignore if it doesn't exist
165
+ */
166
+ export async function ensureGitignore(projectPath) {
167
+ const gitignorePath = path.join(projectPath, ".gitignore");
168
+ const gitignoreContent = `# Dependencies
169
+ node_modules/
170
+
171
+ # Build output
172
+ dist/
173
+ build/
174
+
175
+ # Environment variables
176
+ .env
177
+ .env.local
178
+ .env.*.local
179
+
180
+ # OS files
181
+ .DS_Store
182
+ Thumbs.db
183
+
184
+ # IDE
185
+ .vscode/
186
+ .idea/
187
+ *.swp
188
+ *.swo
189
+
190
+ # Logs
191
+ *.log
192
+ npm-debug.log*
193
+ yarn-debug.log*
194
+ yarn-error.log*
195
+
196
+ # Convex
197
+ .convex/
198
+ `;
199
+ // Use atomic file operation to avoid race condition
200
+ try {
201
+ await fs.writeFile(gitignorePath, gitignoreContent, { flag: "wx" });
202
+ console.log(pc.dim(" Created .gitignore"));
203
+ }
204
+ catch (error) {
205
+ const err = error;
206
+ if (err.code !== "EEXIST") {
207
+ throw error;
208
+ }
209
+ }
210
+ }
211
+ //# sourceMappingURL=file-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-operations.js","sourceRoot":"","sources":["../../../src/utils/init/file-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Graph database setup
3
+ *
4
+ * Handles setting up Neo4j or Memgraph for the init wizard.
5
+ */
6
+ import type { GraphConfig } from "./types.js";
7
+ /**
8
+ * Get graph database configuration (prompts only, no file creation)
9
+ */
10
+ export declare function getGraphConfig(): Promise<GraphConfig | null>;
11
+ /**
12
+ * Create graph database files (docker-compose, etc.)
13
+ */
14
+ export declare function setupGraphFiles(projectPath: string, config: GraphConfig): Promise<void>;
15
+ /**
16
+ * Start graph database containers
17
+ */
18
+ export declare function startGraphContainers(projectPath: string, graphType: "neo4j" | "memgraph"): Promise<boolean>;
19
+ /**
20
+ * Stop graph database containers
21
+ */
22
+ export declare function stopGraphContainers(projectPath: string): Promise<boolean>;
23
+ /**
24
+ * Check if graph containers are running
25
+ */
26
+ export declare function isGraphRunning(graphType: "neo4j" | "memgraph"): Promise<boolean>;
27
+ /**
28
+ * Add graph database dependencies to package.json
29
+ */
30
+ export declare function addGraphDependencies(projectPath: string): Promise<void>;
31
+ /**
32
+ * Create example graph initialization file
33
+ */
34
+ export declare function createGraphExample(projectPath: string): Promise<void>;
35
+ //# sourceMappingURL=graph-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-setup.d.ts","sourceRoot":"","sources":["../../../src/utils/init/graph-setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAmE9C;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmFlE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAKf;AA+BD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,OAAO,GAAG,UAAU,GAC9B,OAAO,CAAC,OAAO,CAAC,CAyFlB;AA4CD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CA2BlB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,OAAO,GAAG,UAAU,GAC9B,OAAO,CAAC,OAAO,CAAC,CAWlB;AAoDD;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB7E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE3E"}
@@ -0,0 +1,413 @@
1
+ /**
2
+ * Graph database setup
3
+ *
4
+ * Handles setting up Neo4j or Memgraph for the init wizard.
5
+ */
6
+ import fs from "fs-extra";
7
+ import path from "path";
8
+ import prompts from "prompts";
9
+ import ora from "ora";
10
+ import pc from "picocolors";
11
+ import { createGraphDockerCompose } from "./env-generator.js";
12
+ import { execCommand } from "../shell.js";
13
+ /**
14
+ * Check if Docker is installed
15
+ */
16
+ async function checkDockerInstalled() {
17
+ try {
18
+ const result = await execCommand("docker", ["--version"], { quiet: true });
19
+ return result.code === 0;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ /**
26
+ * Show Docker installation instructions
27
+ */
28
+ function showDockerInstructions() {
29
+ console.log(pc.yellow("\n Docker Desktop is not installed\n"));
30
+ console.log(pc.bold("To use local graph database, please install Docker Desktop:\n"));
31
+ const platform = process.platform;
32
+ if (platform === "darwin") {
33
+ console.log(pc.cyan("macOS:"));
34
+ console.log(pc.dim(" 1. Download Docker Desktop: https://www.docker.com/products/docker-desktop"));
35
+ console.log(pc.dim(" 2. Install and start Docker Desktop"));
36
+ console.log(pc.dim(" 3. Run the wizard again\n"));
37
+ }
38
+ else if (platform === "win32") {
39
+ console.log(pc.cyan("Windows:"));
40
+ console.log(pc.dim(" 1. Download Docker Desktop: https://www.docker.com/products/docker-desktop"));
41
+ console.log(pc.dim(" 2. Install and start Docker Desktop"));
42
+ console.log(pc.dim(" 3. Run the wizard again\n"));
43
+ }
44
+ else {
45
+ console.log(pc.cyan("Linux:"));
46
+ console.log(pc.dim(" 1. Install Docker Engine: https://docs.docker.com/engine/install/"));
47
+ console.log(pc.dim(" 2. Install Docker Compose: https://docs.docker.com/compose/install/"));
48
+ console.log(pc.dim(" 3. Run the wizard again\n"));
49
+ }
50
+ console.log(pc.dim('Or choose "Cloud/Existing instance" to use a remote graph database.\n'));
51
+ }
52
+ /**
53
+ * Get graph database configuration (prompts only, no file creation)
54
+ */
55
+ export async function getGraphConfig() {
56
+ console.log(pc.cyan("\n Graph Database Setup"));
57
+ console.log(pc.dim(" Graph databases enable advanced relationship queries"));
58
+ console.log(pc.dim(" Recommended for production use\n"));
59
+ const { enableGraph } = await prompts({
60
+ type: "confirm",
61
+ name: "enableGraph",
62
+ message: "Enable graph database integration?",
63
+ initial: true,
64
+ });
65
+ if (!enableGraph) {
66
+ console.log(pc.dim(" Skipping graph database setup"));
67
+ return null;
68
+ }
69
+ const { graphType } = await prompts({
70
+ type: "select",
71
+ name: "graphType",
72
+ message: "Which graph database would you like to use?",
73
+ choices: [
74
+ { title: "Neo4j (Most popular, enterprise-ready)", value: "neo4j" },
75
+ {
76
+ title: "Memgraph (High-performance, analytics-focused)",
77
+ value: "memgraph",
78
+ },
79
+ { title: "Skip for now", value: "skip" },
80
+ ],
81
+ initial: 0,
82
+ });
83
+ if (!graphType || graphType === "skip") {
84
+ return null;
85
+ }
86
+ // Check for Docker if user wants local deployment
87
+ const hasDocker = await checkDockerInstalled();
88
+ const deploymentChoices = [
89
+ { title: "Local (Docker Compose)", value: "local", disabled: !hasDocker },
90
+ { title: "Cloud/Existing instance", value: "cloud" },
91
+ ];
92
+ if (!hasDocker) {
93
+ console.log(pc.yellow(" Docker not detected - local deployment unavailable"));
94
+ }
95
+ const { deploymentType } = await prompts({
96
+ type: "select",
97
+ name: "deploymentType",
98
+ message: `How would you like to run ${graphType === "neo4j" ? "Neo4j" : "Memgraph"}?`,
99
+ choices: deploymentChoices,
100
+ initial: hasDocker ? 0 : 1,
101
+ });
102
+ if (!deploymentType) {
103
+ return null;
104
+ }
105
+ // If local was selected but Docker isn't installed, show instructions
106
+ if (deploymentType === "local" && !hasDocker) {
107
+ showDockerInstructions();
108
+ return null;
109
+ }
110
+ let config;
111
+ if (deploymentType === "local") {
112
+ config = await getLocalGraphConfig(graphType);
113
+ }
114
+ else {
115
+ config = await getCloudGraphConfig(graphType);
116
+ }
117
+ console.log(pc.green("\n Graph database configured"));
118
+ console.log(pc.dim(` Type: ${config.type}`));
119
+ console.log(pc.dim(` URI: ${config.uri}`));
120
+ return config;
121
+ }
122
+ /**
123
+ * Create graph database files (docker-compose, etc.)
124
+ */
125
+ export async function setupGraphFiles(projectPath, config) {
126
+ // Only create docker-compose for local deployments
127
+ if (config.uri.includes("localhost") || config.uri.includes("127.0.0.1")) {
128
+ await createGraphDockerCompose(projectPath, config.type);
129
+ }
130
+ }
131
+ /**
132
+ * Get local graph database configuration
133
+ */
134
+ async function getLocalGraphConfig(graphType) {
135
+ const defaultPort = 7687;
136
+ const defaultPassword = "cortex-password";
137
+ console.log(pc.cyan(`\n Local ${graphType} will be configured with Docker Compose`));
138
+ if (graphType === "neo4j") {
139
+ console.log(pc.dim(" Neo4j Browser: http://localhost:7474"));
140
+ console.log(pc.dim(" Bolt: bolt://localhost:7687\n"));
141
+ }
142
+ else {
143
+ console.log(pc.dim(" Memgraph Lab: http://localhost:3000"));
144
+ console.log(pc.dim(" Bolt: bolt://localhost:7687\n"));
145
+ }
146
+ return {
147
+ type: graphType,
148
+ uri: `bolt://localhost:${defaultPort}`,
149
+ username: graphType === "neo4j" ? "neo4j" : "memgraph",
150
+ password: defaultPassword,
151
+ };
152
+ }
153
+ /**
154
+ * Start graph database containers
155
+ */
156
+ export async function startGraphContainers(projectPath, graphType) {
157
+ const dockerComposePath = path.join(projectPath, "docker-compose.graph.yml");
158
+ if (!fs.existsSync(dockerComposePath)) {
159
+ console.log(pc.yellow(" docker-compose.graph.yml not found"));
160
+ return false;
161
+ }
162
+ const spinner = ora(`Starting ${graphType} containers...`).start();
163
+ const containerName = `cortex-${graphType}`;
164
+ try {
165
+ // Check if containers are already running
166
+ const checkResult = await execCommand("docker", ["ps", "--filter", `name=${containerName}`, "--format", "{{.Status}}"], { cwd: projectPath, quiet: true });
167
+ if (checkResult.stdout.includes("Up")) {
168
+ spinner.succeed(`${graphType} is already running`);
169
+ showGraphConnectionInfo(graphType);
170
+ return true;
171
+ }
172
+ // Check if container exists but is stopped (from a previous run)
173
+ const existsResult = await execCommand("docker", ["ps", "-a", "--filter", `name=${containerName}`, "--format", "{{.Names}}"], { cwd: projectPath, quiet: true });
174
+ if (existsResult.stdout.includes(containerName)) {
175
+ // Container exists, try to start it first
176
+ spinner.text = `Starting existing ${graphType} container...`;
177
+ const startResult = await execCommand("docker", ["start", containerName], { cwd: projectPath, quiet: true });
178
+ if (startResult.code === 0) {
179
+ await waitForGraphReady(spinner, graphType);
180
+ spinner.succeed(`${graphType} is running`);
181
+ showGraphConnectionInfo(graphType);
182
+ return true;
183
+ }
184
+ // If start failed, remove the old container and recreate
185
+ spinner.text = `Removing old ${graphType} container...`;
186
+ await execCommand("docker", ["rm", "-f", containerName], { cwd: projectPath, quiet: true });
187
+ }
188
+ // Pull images first (may take time on first run)
189
+ spinner.text = `Pulling ${graphType} image (this may take a few minutes on first run)...`;
190
+ await execCommand("docker", ["compose", "-f", "docker-compose.graph.yml", "pull"], { cwd: projectPath, quiet: true });
191
+ // Start containers
192
+ spinner.text = `Starting ${graphType} containers...`;
193
+ const result = await execCommand("docker", ["compose", "-f", "docker-compose.graph.yml", "up", "-d"], { cwd: projectPath, quiet: true });
194
+ if (result.code !== 0) {
195
+ spinner.fail(`Failed to start ${graphType}`);
196
+ console.log(pc.dim(` Error: ${result.stderr}`));
197
+ return false;
198
+ }
199
+ // Wait for container to be healthy
200
+ await waitForGraphReady(spinner, graphType);
201
+ spinner.succeed(`${graphType} is running`);
202
+ showGraphConnectionInfo(graphType);
203
+ return true;
204
+ }
205
+ catch (error) {
206
+ spinner.fail(`Failed to start ${graphType}`);
207
+ console.log(pc.dim(` Error: ${error}`));
208
+ return false;
209
+ }
210
+ }
211
+ /**
212
+ * Wait for graph database to be ready
213
+ */
214
+ async function waitForGraphReady(spinner, graphType) {
215
+ spinner.text = `Waiting for ${graphType} to be ready...`;
216
+ const maxWait = 60; // seconds
217
+ const startTime = Date.now();
218
+ while ((Date.now() - startTime) / 1000 < maxWait) {
219
+ const healthCheck = await execCommand("docker", ["ps", "--filter", `name=cortex-${graphType}`, "--format", "{{.Status}}"], { quiet: true });
220
+ if (healthCheck.stdout.includes("Up")) {
221
+ // Give it a moment to fully initialize
222
+ await new Promise((resolve) => setTimeout(resolve, 3000));
223
+ return;
224
+ }
225
+ await new Promise((resolve) => setTimeout(resolve, 2000));
226
+ }
227
+ }
228
+ /**
229
+ * Show graph database connection info
230
+ */
231
+ function showGraphConnectionInfo(graphType) {
232
+ if (graphType === "neo4j") {
233
+ console.log(pc.dim(" Browser: http://localhost:7474"));
234
+ console.log(pc.dim(" Bolt: bolt://localhost:7687"));
235
+ console.log(pc.dim(" Default login: neo4j / cortex-password"));
236
+ }
237
+ else {
238
+ console.log(pc.dim(" Memgraph Lab: http://localhost:3000"));
239
+ console.log(pc.dim(" Bolt: bolt://localhost:7687"));
240
+ }
241
+ }
242
+ /**
243
+ * Stop graph database containers
244
+ */
245
+ export async function stopGraphContainers(projectPath) {
246
+ const dockerComposePath = path.join(projectPath, "docker-compose.graph.yml");
247
+ if (!fs.existsSync(dockerComposePath)) {
248
+ return false;
249
+ }
250
+ const spinner = ora("Stopping graph database containers...").start();
251
+ try {
252
+ const result = await execCommand("docker", ["compose", "-f", "docker-compose.graph.yml", "down"], { cwd: projectPath, quiet: true });
253
+ if (result.code === 0) {
254
+ spinner.succeed("Graph database containers stopped");
255
+ return true;
256
+ }
257
+ else {
258
+ spinner.fail("Failed to stop containers");
259
+ return false;
260
+ }
261
+ }
262
+ catch {
263
+ spinner.fail("Failed to stop containers");
264
+ return false;
265
+ }
266
+ }
267
+ /**
268
+ * Check if graph containers are running
269
+ */
270
+ export async function isGraphRunning(graphType) {
271
+ try {
272
+ const result = await execCommand("docker", ["ps", "--filter", `name=cortex-${graphType}`, "--format", "{{.Status}}"], { quiet: true });
273
+ return result.stdout.includes("Up");
274
+ }
275
+ catch {
276
+ return false;
277
+ }
278
+ }
279
+ /**
280
+ * Get cloud/existing graph database configuration
281
+ */
282
+ async function getCloudGraphConfig(graphType) {
283
+ console.log(pc.cyan("\n Enter your graph database connection details:"));
284
+ const response = await prompts([
285
+ {
286
+ type: "text",
287
+ name: "uri",
288
+ message: "Database URI (e.g., bolt://localhost:7687):",
289
+ initial: "bolt://localhost:7687",
290
+ validate: (value) => {
291
+ if (!value)
292
+ return "URI is required";
293
+ if (!value.startsWith("bolt://") && !value.startsWith("neo4j://")) {
294
+ return "URI must start with bolt:// or neo4j://";
295
+ }
296
+ return true;
297
+ },
298
+ },
299
+ {
300
+ type: "text",
301
+ name: "username",
302
+ message: "Username:",
303
+ initial: graphType === "neo4j" ? "neo4j" : "memgraph",
304
+ },
305
+ {
306
+ type: "password",
307
+ name: "password",
308
+ message: "Password:",
309
+ },
310
+ ]);
311
+ if (!response.uri || !response.username || !response.password) {
312
+ throw new Error("All connection details are required");
313
+ }
314
+ console.log(pc.green(" Connection details saved"));
315
+ console.log(pc.dim(" Connection will be tested when you start your app"));
316
+ return {
317
+ type: graphType,
318
+ uri: response.uri,
319
+ username: response.username,
320
+ password: response.password,
321
+ };
322
+ }
323
+ /**
324
+ * Add graph database dependencies to package.json
325
+ */
326
+ export async function addGraphDependencies(projectPath) {
327
+ const packageJsonPath = path.join(projectPath, "package.json");
328
+ if (!fs.existsSync(packageJsonPath)) {
329
+ throw new Error("package.json not found");
330
+ }
331
+ const packageJson = await fs.readJson(packageJsonPath);
332
+ // Add neo4j-driver if not present
333
+ if (!packageJson.dependencies) {
334
+ packageJson.dependencies = {};
335
+ }
336
+ if (!packageJson.dependencies["neo4j-driver"]) {
337
+ packageJson.dependencies["neo4j-driver"] = "^6.0.0";
338
+ await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });
339
+ console.log(pc.dim(" Added neo4j-driver to dependencies"));
340
+ }
341
+ }
342
+ /**
343
+ * Create example graph initialization file
344
+ */
345
+ export async function createGraphExample(projectPath) {
346
+ const examplePath = path.join(projectPath, "src", "graph-init.example.ts");
347
+ const exampleCode = `/**
348
+ * Graph Database Initialization Example
349
+ *
350
+ * This file shows how to initialize and use the graph database
351
+ * with Cortex Memory SDK.
352
+ */
353
+
354
+ import { Cortex } from '@cortexmemory/sdk';
355
+ import { CypherGraphAdapter, initializeGraphSchema } from '@cortexmemory/sdk/graph';
356
+
357
+ async function initializeGraph() {
358
+ // 1. Create graph adapter
359
+ const graphAdapter = new CypherGraphAdapter();
360
+
361
+ // 2. Connect to graph database
362
+ await graphAdapter.connect({
363
+ uri: process.env.NEO4J_URI || 'bolt://localhost:7687',
364
+ username: process.env.NEO4J_USERNAME || 'neo4j',
365
+ password: process.env.NEO4J_PASSWORD || 'cortex-password',
366
+ });
367
+
368
+ // 3. Initialize schema (constraints and indexes)
369
+ await initializeGraphSchema(graphAdapter);
370
+
371
+ // 4. Initialize Cortex with graph integration
372
+ const cortex = new Cortex({
373
+ convexUrl: process.env.CONVEX_URL!,
374
+ graph: {
375
+ adapter: graphAdapter,
376
+ orphanCleanup: true,
377
+ },
378
+ });
379
+
380
+ return { cortex, graphAdapter };
381
+ }
382
+
383
+ // Example usage
384
+ async function main() {
385
+ const { cortex, graphAdapter } = await initializeGraph();
386
+
387
+ try {
388
+ // Use Cortex normally - graph sync happens automatically!
389
+ await cortex.memory.remember({
390
+ memorySpaceId: 'my-agent',
391
+ conversationId: 'conv-1',
392
+ userMessage: 'Hello, Cortex with graph!',
393
+ agentResponse: 'Ready to remember with enhanced graph capabilities!',
394
+ userId: 'user-1',
395
+ userName: 'User',
396
+ });
397
+
398
+ console.log('Memory stored with graph enrichment!');
399
+ } finally {
400
+ // Cleanup
401
+ cortex.close();
402
+ await graphAdapter.disconnect();
403
+ }
404
+ }
405
+
406
+ // Uncomment to run:
407
+ // main().catch(console.error);
408
+ `;
409
+ await fs.ensureDir(path.dirname(examplePath));
410
+ await fs.writeFile(examplePath, exampleCode);
411
+ console.log(pc.dim(` Created example: ${path.relative(projectPath, examplePath)}`));
412
+ }
413
+ //# sourceMappingURL=graph-setup.js.map