@stackmemoryai/stackmemory 0.3.19 → 0.3.20

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.
@@ -3,45 +3,141 @@ import chalk from "chalk";
3
3
  import { homedir } from "os";
4
4
  import { join } from "path";
5
5
  import { existsSync, mkdirSync, writeFileSync, readFileSync } from "fs";
6
+ import open from "open";
6
7
  function registerLoginCommand(program) {
7
- program.command("login").description("Login to hosted StackMemory (configure managed Postgres)").option("--open", "Open hosted signup/login page before prompting").action(async (options) => {
8
+ program.command("login").description("Login to hosted StackMemory service").option("--api-url <url>", "Custom API URL", "https://api.stackmemory.ai").option("--email <email>", "Email address for login").option("--password <password>", "Password (not recommended in CLI)").action(async (options) => {
8
9
  const cfgDir = join(homedir(), ".stackmemory");
9
10
  if (!existsSync(cfgDir)) mkdirSync(cfgDir, { recursive: true });
10
- if (options.open) {
11
- try {
12
- const signupUrl = "https://stackmemory.ai/hosted";
13
- const mod = await import("open");
14
- await mod.default(signupUrl);
15
- } catch (e) {
16
- console.log(chalk.yellow("Could not open browser automatically."));
17
- }
18
- }
19
- const { databaseUrl } = await inquirer.prompt([
11
+ console.log(chalk.cyan("\u{1F510} StackMemory Hosted Service Login\n"));
12
+ const credentials = await inquirer.prompt([
13
+ {
14
+ type: "input",
15
+ name: "email",
16
+ message: "Email:",
17
+ default: options.email,
18
+ validate: (input) => {
19
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
20
+ return emailRegex.test(input) ? true : "Please enter a valid email";
21
+ }
22
+ },
20
23
  {
21
24
  type: "password",
22
- name: "databaseUrl",
23
- message: "Paste your hosted DATABASE_URL (postgres://...)",
24
- validate: (input) => input.startsWith("postgres://") || input.startsWith("postgresql://") ? true : "Must start with postgres:// or postgresql://"
25
+ name: "password",
26
+ message: "Password:",
27
+ default: options.password,
28
+ mask: "*",
29
+ validate: (input) => input.length >= 6 ? true : "Password must be at least 6 characters"
25
30
  }
26
31
  ]);
27
- const cfgPath = join(cfgDir, "config.json");
28
- let cfg = {};
29
- try {
30
- if (existsSync(cfgPath)) cfg = JSON.parse(readFileSync(cfgPath, "utf-8"));
31
- } catch {
32
- }
33
- cfg.database = { ...cfg.database || {}, mode: "hosted", url: databaseUrl };
34
- writeFileSync(cfgPath, JSON.stringify(cfg, null, 2));
35
- console.log(chalk.green("\u2713 Hosted database configured in ~/.stackmemory/config.json"));
32
+ console.log(chalk.gray("\nAuthenticating with StackMemory API..."));
36
33
  try {
37
- const envFile = join(cfgDir, "railway.env");
38
- writeFileSync(envFile, `# StackMemory hosted DB
39
- DATABASE_URL=${databaseUrl}
40
- `);
41
- console.log(chalk.green("\u2713 Saved DATABASE_URL to ~/.stackmemory/railway.env"));
42
- } catch {
34
+ const apiUrl = options.apiUrl || process.env.STACKMEMORY_API_URL || "https://api.stackmemory.ai";
35
+ const response = await fetch(`${apiUrl}/auth/login`, {
36
+ method: "POST",
37
+ headers: {
38
+ "Content-Type": "application/json",
39
+ "User-Agent": "StackMemory-CLI/0.3.19"
40
+ },
41
+ body: JSON.stringify({
42
+ email: credentials.email,
43
+ password: credentials.password
44
+ })
45
+ });
46
+ const data = await response.json();
47
+ if (!response.ok || !data.success) {
48
+ if (response.status === 404) {
49
+ console.log(chalk.yellow("\n\u26A0\uFE0F Hosted API not available. Would you like to:"));
50
+ const { choice } = await inquirer.prompt([
51
+ {
52
+ type: "list",
53
+ name: "choice",
54
+ message: "Select an option:",
55
+ choices: [
56
+ { name: "Open signup page in browser", value: "signup" },
57
+ { name: "Configure database URL manually", value: "manual" },
58
+ { name: "Use local database", value: "local" },
59
+ { name: "Cancel", value: "cancel" }
60
+ ]
61
+ }
62
+ ]);
63
+ if (choice === "signup") {
64
+ await open("https://stackmemory.ai/signup");
65
+ console.log(chalk.cyan("Opening signup page in browser..."));
66
+ return;
67
+ } else if (choice === "manual") {
68
+ const { databaseUrl } = await inquirer.prompt([
69
+ {
70
+ type: "password",
71
+ name: "databaseUrl",
72
+ message: "Enter your DATABASE_URL (postgres://...):",
73
+ validate: (input) => input.startsWith("postgres://") || input.startsWith("postgresql://") ? true : "Must start with postgres:// or postgresql://"
74
+ }
75
+ ]);
76
+ const cfgPath2 = join(cfgDir, "config.json");
77
+ let cfg2 = {};
78
+ try {
79
+ if (existsSync(cfgPath2)) cfg2 = JSON.parse(readFileSync(cfgPath2, "utf-8"));
80
+ } catch {
81
+ }
82
+ cfg2.database = { mode: "hosted", url: databaseUrl };
83
+ cfg2.auth = { email: credentials.email };
84
+ writeFileSync(cfgPath2, JSON.stringify(cfg2, null, 2));
85
+ console.log(chalk.green("\u2713 Database configured successfully"));
86
+ return;
87
+ } else if (choice === "local") {
88
+ const cfgPath2 = join(cfgDir, "config.json");
89
+ let cfg2 = {};
90
+ try {
91
+ if (existsSync(cfgPath2)) cfg2 = JSON.parse(readFileSync(cfgPath2, "utf-8"));
92
+ } catch {
93
+ }
94
+ cfg2.database = { mode: "local" };
95
+ writeFileSync(cfgPath2, JSON.stringify(cfg2, null, 2));
96
+ console.log(chalk.green("\u2713 Switched to local database mode"));
97
+ return;
98
+ } else {
99
+ console.log(chalk.gray("Login cancelled"));
100
+ return;
101
+ }
102
+ }
103
+ throw new Error(data.error || "Authentication failed");
104
+ }
105
+ const cfgPath = join(cfgDir, "config.json");
106
+ let cfg = {};
107
+ try {
108
+ if (existsSync(cfgPath)) cfg = JSON.parse(readFileSync(cfgPath, "utf-8"));
109
+ } catch {
110
+ }
111
+ cfg.auth = {
112
+ apiKey: data.apiKey,
113
+ apiUrl,
114
+ email: credentials.email
115
+ };
116
+ if (data.databaseUrl) {
117
+ cfg.database = {
118
+ mode: "hosted",
119
+ url: data.databaseUrl
120
+ };
121
+ }
122
+ writeFileSync(cfgPath, JSON.stringify(cfg, null, 2));
123
+ const envFile = join(cfgDir, "stackmemory.env");
124
+ const envContent = `# StackMemory Authentication
125
+ STACKMEMORY_API_KEY=${data.apiKey}
126
+ STACKMEMORY_API_URL=${apiUrl}
127
+ ${data.databaseUrl ? `DATABASE_URL=${data.databaseUrl}` : ""}
128
+ `;
129
+ writeFileSync(envFile, envContent);
130
+ console.log(chalk.green("\n\u2705 Successfully logged in to StackMemory"));
131
+ console.log(chalk.green(`\u2713 Configuration saved to ~/.stackmemory/config.json`));
132
+ console.log(chalk.gray("\nYou can now use:"));
133
+ console.log(chalk.cyan(" stackmemory sync ") + chalk.gray("- Sync your context to the cloud"));
134
+ console.log(chalk.cyan(" stackmemory db status") + chalk.gray("- Check database connection"));
135
+ console.log(chalk.cyan(" stackmemory context ") + chalk.gray("- Manage your contexts"));
136
+ } catch (error) {
137
+ console.error(chalk.red("\n\u274C Login failed:"), error.message);
138
+ console.log(chalk.yellow("\nTip: Visit https://stackmemory.ai/signup to create an account"));
139
+ process.exit(1);
43
140
  }
44
- console.log(chalk.gray("Tip: export DATABASE_URL before starting the server."));
45
141
  });
46
142
  }
47
143
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/commands/login.ts"],
4
- "sourcesContent": ["import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\n\ninterface ConfigShape {\n version?: string;\n setupCompleted?: string;\n features?: any;\n paths?: any;\n database?: { mode?: 'local' | 'hosted'; url?: string };\n}\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command('login')\n .description('Login to hosted StackMemory (configure managed Postgres)')\n .option('--open', 'Open hosted signup/login page before prompting')\n .action(async (options) => {\n const cfgDir = join(homedir(), '.stackmemory');\n if (!existsSync(cfgDir)) mkdirSync(cfgDir, { recursive: true });\n\n if (options.open) {\n try {\n const signupUrl = 'https://stackmemory.ai/hosted';\n const mod = await import('open');\n await mod.default(signupUrl);\n } catch (e) {\n console.log(chalk.yellow('Could not open browser automatically.'));\n }\n }\n\n const { databaseUrl } = await inquirer.prompt([\n {\n type: 'password',\n name: 'databaseUrl',\n message: 'Paste your hosted DATABASE_URL (postgres://...)',\n validate: (input: string) =>\n input.startsWith('postgres://') || input.startsWith('postgresql://')\n ? true\n : 'Must start with postgres:// or postgresql://',\n },\n ]);\n\n // Merge into config.json\n const cfgPath = join(cfgDir, 'config.json');\n let cfg: ConfigShape = {};\n try {\n if (existsSync(cfgPath)) cfg = JSON.parse(readFileSync(cfgPath, 'utf-8'));\n } catch {}\n cfg.database = { ...(cfg.database || {}), mode: 'hosted', url: databaseUrl };\n writeFileSync(cfgPath, JSON.stringify(cfg, null, 2));\n console.log(chalk.green('\u2713 Hosted database configured in ~/.stackmemory/config.json'));\n\n // Save env helper\n try {\n const envFile = join(cfgDir, 'railway.env');\n writeFileSync(envFile, `# StackMemory hosted DB\\nDATABASE_URL=${databaseUrl}\\n`);\n console.log(chalk.green('\u2713 Saved DATABASE_URL to ~/.stackmemory/railway.env'));\n } catch {}\n\n console.log(chalk.gray('Tip: export DATABASE_URL before starting the server.'));\n });\n}\n\n"],
5
- "mappings": "AACA,OAAO,cAAc;AACrB,OAAO,WAAW;AAClB,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,YAAY,WAAW,eAAe,oBAAoB;AAU5D,SAAS,qBAAqB,SAAwB;AAC3D,UACG,QAAQ,OAAO,EACf,YAAY,0DAA0D,EACtE,OAAO,UAAU,gDAAgD,EACjE,OAAO,OAAO,YAAY;AACzB,UAAM,SAAS,KAAK,QAAQ,GAAG,cAAc;AAC7C,QAAI,CAAC,WAAW,MAAM,EAAG,WAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAE9D,QAAI,QAAQ,MAAM;AAChB,UAAI;AACF,cAAM,YAAY;AAClB,cAAM,MAAM,MAAM,OAAO,MAAM;AAC/B,cAAM,IAAI,QAAQ,SAAS;AAAA,MAC7B,SAAS,GAAG;AACV,gBAAQ,IAAI,MAAM,OAAO,uCAAuC,CAAC;AAAA,MACnE;AAAA,IACF;AAEA,UAAM,EAAE,YAAY,IAAI,MAAM,SAAS,OAAO;AAAA,MAC5C;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU,CAAC,UACT,MAAM,WAAW,aAAa,KAAK,MAAM,WAAW,eAAe,IAC/D,OACA;AAAA,MACR;AAAA,IACF,CAAC;AAGD,UAAM,UAAU,KAAK,QAAQ,aAAa;AAC1C,QAAI,MAAmB,CAAC;AACxB,QAAI;AACF,UAAI,WAAW,OAAO,EAAG,OAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;AAAA,IAC1E,QAAQ;AAAA,IAAC;AACT,QAAI,WAAW,EAAE,GAAI,IAAI,YAAY,CAAC,GAAI,MAAM,UAAU,KAAK,YAAY;AAC3E,kBAAc,SAAS,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AACnD,YAAQ,IAAI,MAAM,MAAM,iEAA4D,CAAC;AAGrF,QAAI;AACF,YAAM,UAAU,KAAK,QAAQ,aAAa;AAC1C,oBAAc,SAAS;AAAA,eAAyC,WAAW;AAAA,CAAI;AAC/E,cAAQ,IAAI,MAAM,MAAM,yDAAoD,CAAC;AAAA,IAC/E,QAAQ;AAAA,IAAC;AAET,YAAQ,IAAI,MAAM,KAAK,sDAAsD,CAAC;AAAA,EAChF,CAAC;AACL;",
6
- "names": []
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\nimport open from 'open';\n\ninterface ConfigShape {\n version?: string;\n setupCompleted?: string;\n features?: any;\n paths?: any;\n database?: { mode?: 'local' | 'hosted'; url?: string };\n auth?: { \n apiKey?: string;\n apiUrl?: string;\n email?: string;\n };\n}\n\ninterface AuthResponse {\n success: boolean;\n apiKey?: string;\n databaseUrl?: string;\n email?: string;\n error?: string;\n}\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command('login')\n .description('Login to hosted StackMemory service')\n .option('--api-url <url>', 'Custom API URL', 'https://api.stackmemory.ai')\n .option('--email <email>', 'Email address for login')\n .option('--password <password>', 'Password (not recommended in CLI)')\n .action(async (options) => {\n const cfgDir = join(homedir(), '.stackmemory');\n if (!existsSync(cfgDir)) mkdirSync(cfgDir, { recursive: true });\n\n console.log(chalk.cyan('\uD83D\uDD10 StackMemory Hosted Service Login\\n'));\n\n // Prompt for credentials\n const credentials = await inquirer.prompt([\n {\n type: 'input',\n name: 'email',\n message: 'Email:',\n default: options.email,\n validate: (input: string) => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(input) ? true : 'Please enter a valid email';\n },\n },\n {\n type: 'password',\n name: 'password',\n message: 'Password:',\n default: options.password,\n mask: '*',\n validate: (input: string) => input.length >= 6 ? true : 'Password must be at least 6 characters',\n },\n ]);\n\n console.log(chalk.gray('\\nAuthenticating with StackMemory API...'));\n\n try {\n // Authenticate with the hosted API\n const apiUrl = options.apiUrl || process.env.STACKMEMORY_API_URL || 'https://api.stackmemory.ai';\n const response = await fetch(`${apiUrl}/auth/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'StackMemory-CLI/0.3.19',\n },\n body: JSON.stringify({\n email: credentials.email,\n password: credentials.password,\n }),\n });\n\n const data: AuthResponse = await response.json();\n\n if (!response.ok || !data.success) {\n if (response.status === 404) {\n // Fallback to Railway server if hosted API not available\n console.log(chalk.yellow('\\n\u26A0\uFE0F Hosted API not available. Would you like to:'));\n const { choice } = await inquirer.prompt([\n {\n type: 'list',\n name: 'choice',\n message: 'Select an option:',\n choices: [\n { name: 'Open signup page in browser', value: 'signup' },\n { name: 'Configure database URL manually', value: 'manual' },\n { name: 'Use local database', value: 'local' },\n { name: 'Cancel', value: 'cancel' },\n ],\n },\n ]);\n\n if (choice === 'signup') {\n await open('https://stackmemory.ai/signup');\n console.log(chalk.cyan('Opening signup page in browser...'));\n return;\n } else if (choice === 'manual') {\n const { databaseUrl } = await inquirer.prompt([\n {\n type: 'password',\n name: 'databaseUrl',\n message: 'Enter your DATABASE_URL (postgres://...):',\n validate: (input: string) =>\n input.startsWith('postgres://') || input.startsWith('postgresql://')\n ? true\n : 'Must start with postgres:// or postgresql://',\n },\n ]);\n\n // Save manual configuration\n const cfgPath = join(cfgDir, 'config.json');\n let cfg: ConfigShape = {};\n try {\n if (existsSync(cfgPath)) cfg = JSON.parse(readFileSync(cfgPath, 'utf-8'));\n } catch {}\n \n cfg.database = { mode: 'hosted', url: databaseUrl };\n cfg.auth = { email: credentials.email };\n \n writeFileSync(cfgPath, JSON.stringify(cfg, null, 2));\n console.log(chalk.green('\u2713 Database configured successfully'));\n return;\n } else if (choice === 'local') {\n const cfgPath = join(cfgDir, 'config.json');\n let cfg: ConfigShape = {};\n try {\n if (existsSync(cfgPath)) cfg = JSON.parse(readFileSync(cfgPath, 'utf-8'));\n } catch {}\n \n cfg.database = { mode: 'local' };\n writeFileSync(cfgPath, JSON.stringify(cfg, null, 2));\n console.log(chalk.green('\u2713 Switched to local database mode'));\n return;\n } else {\n console.log(chalk.gray('Login cancelled'));\n return;\n }\n }\n\n throw new Error(data.error || 'Authentication failed');\n }\n\n // Save configuration\n const cfgPath = join(cfgDir, 'config.json');\n let cfg: ConfigShape = {};\n try {\n if (existsSync(cfgPath)) cfg = JSON.parse(readFileSync(cfgPath, 'utf-8'));\n } catch {}\n\n cfg.auth = {\n apiKey: data.apiKey,\n apiUrl: apiUrl,\n email: credentials.email,\n };\n\n if (data.databaseUrl) {\n cfg.database = {\n mode: 'hosted',\n url: data.databaseUrl,\n };\n }\n\n writeFileSync(cfgPath, JSON.stringify(cfg, null, 2));\n \n // Save environment variables\n const envFile = join(cfgDir, 'stackmemory.env');\n const envContent = `# StackMemory Authentication\nSTACKMEMORY_API_KEY=${data.apiKey}\nSTACKMEMORY_API_URL=${apiUrl}\n${data.databaseUrl ? `DATABASE_URL=${data.databaseUrl}` : ''}\n`;\n writeFileSync(envFile, envContent);\n\n console.log(chalk.green('\\n\u2705 Successfully logged in to StackMemory'));\n console.log(chalk.green(`\u2713 Configuration saved to ~/.stackmemory/config.json`));\n console.log(chalk.gray('\\nYou can now use:'));\n console.log(chalk.cyan(' stackmemory sync ') + chalk.gray('- Sync your context to the cloud'));\n console.log(chalk.cyan(' stackmemory db status') + chalk.gray('- Check database connection'));\n console.log(chalk.cyan(' stackmemory context ') + chalk.gray('- Manage your contexts'));\n \n } catch (error: any) {\n console.error(chalk.red('\\n\u274C Login failed:'), error.message);\n console.log(chalk.yellow('\\nTip: Visit https://stackmemory.ai/signup to create an account'));\n process.exit(1);\n }\n });\n}"],
5
+ "mappings": "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",
6
+ "names": ["cfgPath", "cfg"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackmemoryai/stackmemory",
3
- "version": "0.3.19",
3
+ "version": "0.3.20",
4
4
  "description": "Lossless memory runtime for AI coding tools - organizes context as a call stack instead of linear chat logs, with team collaboration and infinite retention",
5
5
  "engines": {
6
6
  "node": ">=20.0.0",
@@ -86,6 +86,7 @@
86
86
  "@google-cloud/storage": "^7.18.0",
87
87
  "@linear/sdk": "^68.1.0",
88
88
  "@modelcontextprotocol/sdk": "^0.5.0",
89
+ "@stackmemoryai/stackmemory": "^0.3.19",
89
90
  "@types/bcryptjs": "^2.4.6",
90
91
  "@types/inquirer": "^9.0.9",
91
92
  "@types/pg": "^8.16.0",