@stackmemoryai/stackmemory 0.8.0 → 0.8.1

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.
@@ -100,7 +100,11 @@ async function runOnboarding() {
100
100
  const mod = await import("open");
101
101
  await mod.default(signupUrl);
102
102
  } catch (e) {
103
- console.log(chalk.yellow("Could not open browser automatically. Please sign up and obtain your DATABASE_URL."));
103
+ console.log(
104
+ chalk.yellow(
105
+ "Could not open browser automatically. Please sign up and obtain your DATABASE_URL."
106
+ )
107
+ );
104
108
  }
105
109
  }
106
110
  const { databaseUrl } = await inquirer.prompt([
@@ -359,11 +363,22 @@ async function applyConfiguration(config) {
359
363
  if (config.storageMode === "hosted" && config.databaseUrl) {
360
364
  try {
361
365
  const envFile = join(configPath, "railway.env");
362
- writeFileSync(envFile, `# StackMemory hosted DB
366
+ writeFileSync(
367
+ envFile,
368
+ `# StackMemory hosted DB
363
369
  DATABASE_URL=${config.databaseUrl}
364
- `);
365
- console.log(chalk.green(" \u2713 Saved hosted DB settings to ~/.stackmemory/railway.env"));
366
- console.log(chalk.gray(" Tip: export DATABASE_URL from this file in your shell profile."));
370
+ `
371
+ );
372
+ console.log(
373
+ chalk.green(
374
+ " \u2713 Saved hosted DB settings to ~/.stackmemory/railway.env"
375
+ )
376
+ );
377
+ console.log(
378
+ chalk.gray(
379
+ " Tip: export DATABASE_URL from this file in your shell profile."
380
+ )
381
+ );
367
382
  } catch (e) {
368
383
  console.log(chalk.yellow(" \u26A0 Could not write hosted DB env file"));
369
384
  }
@@ -426,7 +441,8 @@ done
426
441
  # Auto-initialize StackMemory if in git repo without it
427
442
  if [ -d ".git" ] && [ ! -d ".stackmemory" ]; then
428
443
  echo "\u{1F4E6} Initializing StackMemory for this project..."
429
- stackmemory init --silent 2>/dev/null || true
444
+ # Quiet init (no unsupported flags)
445
+ stackmemory init >/dev/null 2>&1 || true
430
446
  fi
431
447
 
432
448
  # Load existing context if available
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/commands/onboard.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n/**\n * StackMemory Onboarding CLI\n * Interactive setup for new StackMemory installations\n */\n\nimport { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { execSync, execFileSync } from 'child_process';\nimport { WorktreeManager } from '../../core/worktree/worktree-manager.js';\nimport { ProjectManager } from '../../core/projects/project-manager.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\ninterface OnboardingConfig {\n setupType: 'basic' | 'advanced';\n enableWorktrees: boolean;\n worktreeIsolation: boolean;\n enableProjects: boolean;\n scanProjects: boolean;\n enableLinear: boolean;\n linearApiKey?: string;\n enableAnalytics: boolean;\n defaultContextPath: string;\n storageMode: 'local' | 'hosted';\n databaseUrl?: string;\n}\n\nexport function registerOnboardingCommand(program: Command): void {\n program\n .command('onboard')\n .alias('setup')\n .description('Interactive setup for StackMemory')\n .option('--reset', 'Reset all configurations and start fresh')\n .action(async (options) => {\n console.log(chalk.cyan('\\n\uD83D\uDE80 Welcome to StackMemory Setup!\\n'));\n\n // Check if already configured\n const configPath = join(homedir(), '.stackmemory');\n if (existsSync(configPath) && !options.reset) {\n const { proceed } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'proceed',\n message:\n 'StackMemory is already configured. Do you want to reconfigure?',\n default: false,\n },\n ]);\n\n if (!proceed) {\n console.log(chalk.yellow('\\nSetup cancelled.'));\n return;\n }\n }\n\n try {\n const config = await runOnboarding();\n await applyConfiguration(config);\n\n console.log(\n chalk.green('\\n\u2705 StackMemory setup completed successfully!\\n')\n );\n showNextSteps(config);\n } catch (error: unknown) {\n logger.error('Onboarding failed', error as Error);\n console.error(\n chalk.red('\\n\u274C Setup failed:'),\n (error as Error).message\n );\n process.exit(1);\n }\n });\n}\n\nasync function runOnboarding(): Promise<OnboardingConfig> {\n // Basic or Advanced Setup\n const { setupType } = await inquirer.prompt([\n {\n type: 'list',\n name: 'setupType',\n message: 'Choose your setup type:',\n choices: [\n { name: 'Basic (Recommended for most users)', value: 'basic' },\n { name: 'Advanced (Full customization)', value: 'advanced' },\n ],\n default: 'basic',\n },\n ]);\n\n let config: OnboardingConfig = {\n setupType,\n enableWorktrees: false,\n worktreeIsolation: true,\n enableProjects: true,\n scanProjects: false,\n enableLinear: false,\n enableAnalytics: true,\n defaultContextPath: join(homedir(), '.stackmemory'),\n storageMode: 'local',\n };\n\n // Choose storage mode\n const { storageMode } = await inquirer.prompt([\n {\n type: 'list',\n name: 'storageMode',\n message: 'Where should StackMemory store data?',\n choices: [\n { name: 'Local (free, SQLite in ~/.stackmemory)', value: 'local' },\n { name: 'Hosted (paid, managed Postgres)', value: 'hosted' },\n ],\n default: 'local',\n },\n ]);\n config.storageMode = storageMode;\n\n if (storageMode === 'hosted') {\n const { hasAccount } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'hasAccount',\n message: 'Do you already have a hosted account & connection string?',\n default: false,\n },\n ]);\n\n if (!hasAccount) {\n try {\n const signupUrl = 'https://stackmemory.ai/hosted';\n console.log(chalk.gray(`Opening signup page: ${signupUrl}`));\n // Lazy load open to avoid ES module issues\n const mod = await import('open');\n await mod.default(signupUrl);\n } catch (e) {\n console.log(chalk.yellow('Could not open browser automatically. Please sign up and obtain your DATABASE_URL.'));\n }\n }\n\n const { databaseUrl } = await inquirer.prompt([\n {\n type: 'password',\n name: 'databaseUrl',\n message: 'Paste 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 config.databaseUrl = databaseUrl;\n }\n\n if (setupType === 'basic') {\n // Basic setup with sensible defaults\n const basicAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enableWorktrees',\n message:\n 'Enable Git worktree support? (Recommended for multi-branch workflows)',\n default: false,\n },\n {\n type: 'confirm',\n name: 'scanProjects',\n message: 'Scan and organize your existing projects?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'enableLinear',\n message: 'Connect to Linear for task management?',\n default: false,\n },\n ]);\n\n config = { ...config, ...basicAnswers };\n\n if (basicAnswers.enableLinear) {\n const { linearApiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'linearApiKey',\n message: 'Enter your Linear API key:',\n validate: (input: string) =>\n input.length > 0 || 'API key is required',\n },\n ]);\n config.linearApiKey = linearApiKey;\n }\n } else {\n // Advanced setup with all options\n const advancedAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enableWorktrees',\n message: 'Enable Git worktree support?',\n default: false,\n },\n ]);\n\n if (advancedAnswers.enableWorktrees) {\n const worktreeAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'worktreeIsolation',\n message: 'Isolate contexts between worktrees? (Recommended)',\n default: true,\n },\n {\n type: 'confirm',\n name: 'autoDetect',\n message: 'Auto-detect worktrees when switching directories?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'shareGlobal',\n message: 'Share global context across worktrees?',\n default: false,\n },\n {\n type: 'number',\n name: 'syncInterval',\n message: 'Context sync interval in minutes (0 to disable):',\n default: 15,\n validate: (input: number) => input >= 0 || 'Must be 0 or positive',\n },\n ]);\n\n config = { ...config, ...advancedAnswers, ...worktreeAnswers };\n }\n\n const projectAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enableProjects',\n message: 'Enable automatic project management?',\n default: true,\n },\n ]);\n\n if (projectAnswers.enableProjects) {\n const projectDetailAnswers: any = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'scanProjects',\n message: 'Scan for existing projects now?',\n default: true,\n },\n {\n type: 'checkbox',\n name: 'scanPaths',\n message: 'Select directories to scan:',\n choices: [\n { name: '~/Dev', value: join(homedir(), 'Dev'), checked: true },\n { name: '~/dev', value: join(homedir(), 'dev'), checked: true },\n {\n name: '~/Projects',\n value: join(homedir(), 'Projects'),\n checked: true,\n },\n {\n name: '~/projects',\n value: join(homedir(), 'projects'),\n checked: true,\n },\n { name: '~/Work', value: join(homedir(), 'Work'), checked: false },\n { name: '~/code', value: join(homedir(), 'code'), checked: true },\n {\n name: '~/Documents/GitHub',\n value: join(homedir(), 'Documents/GitHub'),\n checked: false,\n },\n ],\n when: (): boolean => projectDetailAnswers.scanProjects,\n },\n ]);\n\n config = { ...config, ...projectAnswers, ...projectDetailAnswers };\n }\n\n const integrationAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enableLinear',\n message: 'Enable Linear integration?',\n default: false,\n },\n {\n type: 'password',\n name: 'linearApiKey',\n message: 'Linear API key:',\n when: (answers: any) => answers.enableLinear,\n validate: (input: string) => input.length > 0 || 'API key is required',\n },\n {\n type: 'confirm',\n name: 'enableAnalytics',\n message: 'Enable usage analytics? (Local only)',\n default: true,\n },\n {\n type: 'input',\n name: 'defaultContextPath',\n message: 'Default context storage path:',\n default: join(homedir(), '.stackmemory'),\n validate: (input: string) => input.length > 0 || 'Path is required',\n },\n ]);\n\n config = { ...config, ...integrationAnswers };\n }\n\n return config;\n}\n\nasync function applyConfiguration(config: OnboardingConfig): Promise<void> {\n const configPath = join(homedir(), '.stackmemory');\n\n // Create base directory structure\n console.log(chalk.gray('\\nCreating directory structure...'));\n const dirs = [\n configPath,\n join(configPath, 'contexts'),\n join(configPath, 'projects'),\n join(configPath, 'worktrees'),\n join(configPath, 'bin'),\n join(configPath, 'logs'),\n join(configPath, 'analytics'),\n ];\n\n for (const dir of dirs) {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n // Configure git worktree support\n if (config.enableWorktrees) {\n console.log(chalk.gray('Configuring worktree support...'));\n const worktreeManager = WorktreeManager.getInstance();\n worktreeManager.saveConfig({\n enabled: true,\n autoDetect: true,\n isolateContexts: config.worktreeIsolation,\n shareGlobalContext: false,\n syncInterval: 15,\n });\n\n // Detect current worktrees\n const worktrees = worktreeManager.detectWorktrees();\n if (worktrees.length > 0) {\n console.log(chalk.green(` \u2713 Found ${worktrees.length} worktree(s)`));\n worktrees.forEach((wt) => {\n console.log(chalk.gray(` - ${wt.branch} at ${wt.path}`));\n });\n }\n }\n\n // Scan and organize projects\n if (config.enableProjects && config.scanProjects) {\n console.log(chalk.gray('Scanning for projects...'));\n const projectManager = ProjectManager.getInstance();\n\n const scanPaths = (config as any).scanPaths || [\n join(homedir(), 'Dev'),\n join(homedir(), 'dev'),\n join(homedir(), 'Projects'),\n join(homedir(), 'projects'),\n join(homedir(), 'code'),\n ];\n\n await projectManager.scanAndCategorizeAllProjects(\n scanPaths.filter((p: string) => existsSync(p))\n );\n\n const projects = projectManager.getAllProjects();\n console.log(chalk.green(` \u2713 Found ${projects.length} project(s)`));\n\n // Show summary\n const byType: Record<string, number> = {};\n projects.forEach((p) => {\n byType[p.accountType] = (byType[p.accountType] || 0) + 1;\n });\n\n Object.entries(byType).forEach(([type, count]) => {\n console.log(chalk.gray(` - ${type}: ${count} project(s)`));\n });\n }\n\n // Configure Linear integration\n if (config.enableLinear && config.linearApiKey) {\n console.log(chalk.gray('Configuring Linear integration...'));\n const linearConfig = {\n apiKey: config.linearApiKey,\n autoSync: true,\n syncInterval: 300000, // 5 minutes\n };\n\n writeFileSync(\n join(configPath, 'linear-config.json'),\n JSON.stringify(linearConfig, null, 2)\n );\n console.log(chalk.green(' \u2713 Linear configured'));\n }\n\n // Save main configuration\n const mainConfig = {\n version: '1.0.0',\n setupCompleted: new Date().toISOString(),\n features: {\n worktrees: config.enableWorktrees,\n projects: config.enableProjects,\n linear: config.enableLinear,\n analytics: config.enableAnalytics,\n },\n paths: {\n default: config.defaultContextPath,\n },\n database: {\n mode: config.storageMode,\n ...(config.databaseUrl ? { url: config.databaseUrl } : {}),\n },\n };\n\n writeFileSync(\n join(configPath, 'config.json'),\n JSON.stringify(mainConfig, null, 2)\n );\n\n // If hosted selected, persist a simple env file suggestion\n if (config.storageMode === 'hosted' && config.databaseUrl) {\n try {\n const envFile = join(configPath, 'railway.env');\n writeFileSync(envFile, `# StackMemory hosted DB\\nDATABASE_URL=${config.databaseUrl}\\n`);\n console.log(chalk.green(' \u2713 Saved hosted DB settings to ~/.stackmemory/railway.env'));\n console.log(chalk.gray(' Tip: export DATABASE_URL from this file in your shell profile.'));\n } catch (e) {\n console.log(chalk.yellow(' \u26A0 Could not write hosted DB env file'));\n }\n }\n\n // Create claude-sm symlink for easy access\n const binPath = '/usr/local/bin/claude-sm';\n const sourcePath = join(configPath, 'bin', 'stackmemory');\n\n try {\n // Create wrapper script\n const wrapperScript = `#!/bin/bash\n# StackMemory CLI wrapper with worktree support\nCURRENT_DIR=$(pwd)\n\n# Auto-detect worktree if enabled\nif [ -f ~/.stackmemory/worktree-config.json ]; then\n WORKTREE_ENABLED=$(grep '\"enabled\": true' ~/.stackmemory/worktree-config.json)\n if [ ! -z \"$WORKTREE_ENABLED\" ]; then\n # Check if we're in a git worktree\n if git worktree list &>/dev/null; then\n export SM_WORKTREE_PATH=\"$CURRENT_DIR\"\n fi\n fi\nfi\n\n# Run StackMemory with context\nexec stackmemory \"$@\"\n`;\n\n writeFileSync(sourcePath, wrapperScript);\n execFileSync('chmod', ['+x', sourcePath]);\n\n // Create symlink if it doesn't exist\n if (!existsSync(binPath)) {\n execFileSync('ln', ['-s', sourcePath, binPath]);\n console.log(chalk.green(' \u2713 Created claude-sm command'));\n }\n } catch (error: unknown) {\n console.log(\n chalk.yellow(' \u26A0 Could not create claude-sm symlink (may need sudo)')\n );\n }\n\n // Create codex-sm symlink for easy access\n const codexBinPath = '/usr/local/bin/codex-sm';\n const codexSourcePath = join(configPath, 'bin', 'codex-sm');\n\n try {\n // Create Codex wrapper script (based on scripts/codex-wrapper.sh)\n const codexWrapper = `#!/bin/bash\n# Codex CLI wrapper with StackMemory integration\n# Usage: codex-sm [--auto-sync] [--sync-interval=MINUTES] [args...]\n\n# Flags\nAUTO_SYNC=false\nSYNC_INTERVAL=5\nfor arg in \"$@\"; do\n case $arg in\n --auto-sync)\n AUTO_SYNC=true\n shift\n ;;\n --sync-interval=*)\n SYNC_INTERVAL=\"\\${arg#*=}\"\n shift\n ;;\n esac\ndone\n\n# Auto-initialize StackMemory if in git repo without it\nif [ -d \".git\" ] && [ ! -d \".stackmemory\" ]; then\n echo \"\uD83D\uDCE6 Initializing StackMemory for this project...\"\n stackmemory init --silent 2>/dev/null || true\nfi\n\n# Load existing context if available\nif [ -d \".stackmemory\" ]; then\n echo \"\uD83E\uDDE0 Loading StackMemory context...\"\n stackmemory status --brief 2>/dev/null || true\nfi\n\n# Start Linear auto-sync in background if requested\nSYNC_PID=\"\"\nif [ \"$AUTO_SYNC\" = true ] && [ -n \"$LINEAR_API_KEY\" ]; then\n echo \"\uD83D\uDD04 Starting Linear auto-sync (${SYNC_INTERVAL}min intervals)...\"\n (\n while true; do\n sleep $((SYNC_INTERVAL * 60))\n if [ -d \".stackmemory\" ]; then\n stackmemory linear sync --quiet 2>/dev/null || true\n fi\n done\n ) &\n SYNC_PID=$!\nfi\n\ncleanup() {\n echo \"\"\n echo \"\uD83D\uDCDD Saving StackMemory context...\"\n\n # Kill auto-sync if running\n if [ -n \"$SYNC_PID\" ] && kill -0 $SYNC_PID 2>/dev/null; then\n echo \"\uD83D\uDED1 Stopping auto-sync...\"\n kill $SYNC_PID 2>/dev/null || true\n fi\n\n # Save project status and final sync\n if [ -d \".stackmemory\" ]; then\n stackmemory status 2>/dev/null\n if [ -n \"$LINEAR_API_KEY\" ]; then\n echo \"\uD83D\uDD04 Final Linear sync...\"\n stackmemory linear sync 2>/dev/null\n fi\n echo \"\u2705 StackMemory context saved\"\n fi\n}\n\ntrap cleanup EXIT INT TERM\n\n# Run Codex CLI\nif command -v codex &> /dev/null; then\n codex \"$@\"\nelif command -v codex-cli &> /dev/null; then\n codex-cli \"$@\"\nelse\n echo \"\u274C Codex CLI not found. Please install it first.\"\n echo \" See: https://github.com/openai/codex-cli\"\n exit 1\nfi\n`;\n\n writeFileSync(codexSourcePath, codexWrapper);\n execFileSync('chmod', ['+x', codexSourcePath]);\n\n // Create symlink if it doesn't exist\n if (!existsSync(codexBinPath)) {\n execFileSync('ln', ['-s', codexSourcePath, codexBinPath]);\n console.log(chalk.green(' \u2713 Created codex-sm command'));\n }\n } catch (error: unknown) {\n console.log(\n chalk.yellow(' \u26A0 Could not create codex-sm symlink (may need sudo)')\n );\n }\n}\n\nfunction showNextSteps(config: OnboardingConfig): void {\n console.log(chalk.cyan('\uD83C\uDF89 Next Steps:\\n'));\n\n console.log('1. Initialize StackMemory in your project:');\n console.log(chalk.gray(' cd your-project'));\n console.log(chalk.gray(' stackmemory init\\n'));\n\n if (config.enableWorktrees) {\n console.log('2. Create a new worktree:');\n console.log(\n chalk.gray(\n ' git worktree add -b feature/new-feature ../project-feature'\n )\n );\n console.log(chalk.gray(' cd ../project-feature'));\n console.log(\n chalk.gray(\n ' stackmemory status # Isolated context for this worktree\\n'\n )\n );\n }\n\n console.log('3. Use with Claude:');\n console.log(chalk.gray(' claude-sm # Or use stackmemory directly\\n'));\n\n console.log('4. Use with Codex:');\n console.log(chalk.gray(' codex-sm # Codex + StackMemory integration\\n'));\n\n if (config.enableLinear) {\n console.log('5. Sync with Linear:');\n console.log(chalk.gray(' stackmemory linear sync\\n'));\n }\n\n console.log('For more help:');\n console.log(chalk.gray(' stackmemory --help'));\n console.log(chalk.gray(' stackmemory projects --help'));\n if (config.enableWorktrees) {\n console.log(chalk.gray(' stackmemory worktree --help'));\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["#!/usr/bin/env node\n/**\n * StackMemory Onboarding CLI\n * Interactive setup for new StackMemory installations\n */\n\nimport { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { execSync, execFileSync } from 'child_process';\nimport { WorktreeManager } from '../../core/worktree/worktree-manager.js';\nimport { ProjectManager } from '../../core/projects/project-manager.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\ninterface OnboardingConfig {\n setupType: 'basic' | 'advanced';\n enableWorktrees: boolean;\n worktreeIsolation: boolean;\n enableProjects: boolean;\n scanProjects: boolean;\n enableLinear: boolean;\n linearApiKey?: string;\n enableAnalytics: boolean;\n defaultContextPath: string;\n storageMode: 'local' | 'hosted';\n databaseUrl?: string;\n}\n\nexport function registerOnboardingCommand(program: Command): void {\n program\n .command('onboard')\n .alias('setup')\n .description('Interactive setup for StackMemory')\n .option('--reset', 'Reset all configurations and start fresh')\n .action(async (options) => {\n console.log(chalk.cyan('\\n\uD83D\uDE80 Welcome to StackMemory Setup!\\n'));\n\n // Check if already configured\n const configPath = join(homedir(), '.stackmemory');\n if (existsSync(configPath) && !options.reset) {\n const { proceed } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'proceed',\n message:\n 'StackMemory is already configured. Do you want to reconfigure?',\n default: false,\n },\n ]);\n\n if (!proceed) {\n console.log(chalk.yellow('\\nSetup cancelled.'));\n return;\n }\n }\n\n try {\n const config = await runOnboarding();\n await applyConfiguration(config);\n\n console.log(\n chalk.green('\\n\u2705 StackMemory setup completed successfully!\\n')\n );\n showNextSteps(config);\n } catch (error: unknown) {\n logger.error('Onboarding failed', error as Error);\n console.error(\n chalk.red('\\n\u274C Setup failed:'),\n (error as Error).message\n );\n process.exit(1);\n }\n });\n}\n\nasync function runOnboarding(): Promise<OnboardingConfig> {\n // Basic or Advanced Setup\n const { setupType } = await inquirer.prompt([\n {\n type: 'list',\n name: 'setupType',\n message: 'Choose your setup type:',\n choices: [\n { name: 'Basic (Recommended for most users)', value: 'basic' },\n { name: 'Advanced (Full customization)', value: 'advanced' },\n ],\n default: 'basic',\n },\n ]);\n\n let config: OnboardingConfig = {\n setupType,\n enableWorktrees: false,\n worktreeIsolation: true,\n enableProjects: true,\n scanProjects: false,\n enableLinear: false,\n enableAnalytics: true,\n defaultContextPath: join(homedir(), '.stackmemory'),\n storageMode: 'local',\n };\n\n // Choose storage mode\n const { storageMode } = await inquirer.prompt([\n {\n type: 'list',\n name: 'storageMode',\n message: 'Where should StackMemory store data?',\n choices: [\n { name: 'Local (free, SQLite in ~/.stackmemory)', value: 'local' },\n { name: 'Hosted (paid, managed Postgres)', value: 'hosted' },\n ],\n default: 'local',\n },\n ]);\n config.storageMode = storageMode;\n\n if (storageMode === 'hosted') {\n const { hasAccount } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'hasAccount',\n message: 'Do you already have a hosted account & connection string?',\n default: false,\n },\n ]);\n\n if (!hasAccount) {\n try {\n const signupUrl = 'https://stackmemory.ai/hosted';\n console.log(chalk.gray(`Opening signup page: ${signupUrl}`));\n // Lazy load open to avoid ES module issues\n const mod = await import('open');\n await mod.default(signupUrl);\n } catch (e) {\n console.log(\n chalk.yellow(\n 'Could not open browser automatically. Please sign up and obtain your DATABASE_URL.'\n )\n );\n }\n }\n\n const { databaseUrl } = await inquirer.prompt([\n {\n type: 'password',\n name: 'databaseUrl',\n message: 'Paste 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 config.databaseUrl = databaseUrl;\n }\n\n if (setupType === 'basic') {\n // Basic setup with sensible defaults\n const basicAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enableWorktrees',\n message:\n 'Enable Git worktree support? (Recommended for multi-branch workflows)',\n default: false,\n },\n {\n type: 'confirm',\n name: 'scanProjects',\n message: 'Scan and organize your existing projects?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'enableLinear',\n message: 'Connect to Linear for task management?',\n default: false,\n },\n ]);\n\n config = { ...config, ...basicAnswers };\n\n if (basicAnswers.enableLinear) {\n const { linearApiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'linearApiKey',\n message: 'Enter your Linear API key:',\n validate: (input: string) =>\n input.length > 0 || 'API key is required',\n },\n ]);\n config.linearApiKey = linearApiKey;\n }\n } else {\n // Advanced setup with all options\n const advancedAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enableWorktrees',\n message: 'Enable Git worktree support?',\n default: false,\n },\n ]);\n\n if (advancedAnswers.enableWorktrees) {\n const worktreeAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'worktreeIsolation',\n message: 'Isolate contexts between worktrees? (Recommended)',\n default: true,\n },\n {\n type: 'confirm',\n name: 'autoDetect',\n message: 'Auto-detect worktrees when switching directories?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'shareGlobal',\n message: 'Share global context across worktrees?',\n default: false,\n },\n {\n type: 'number',\n name: 'syncInterval',\n message: 'Context sync interval in minutes (0 to disable):',\n default: 15,\n validate: (input: number) => input >= 0 || 'Must be 0 or positive',\n },\n ]);\n\n config = { ...config, ...advancedAnswers, ...worktreeAnswers };\n }\n\n const projectAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enableProjects',\n message: 'Enable automatic project management?',\n default: true,\n },\n ]);\n\n if (projectAnswers.enableProjects) {\n const projectDetailAnswers: any = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'scanProjects',\n message: 'Scan for existing projects now?',\n default: true,\n },\n {\n type: 'checkbox',\n name: 'scanPaths',\n message: 'Select directories to scan:',\n choices: [\n { name: '~/Dev', value: join(homedir(), 'Dev'), checked: true },\n { name: '~/dev', value: join(homedir(), 'dev'), checked: true },\n {\n name: '~/Projects',\n value: join(homedir(), 'Projects'),\n checked: true,\n },\n {\n name: '~/projects',\n value: join(homedir(), 'projects'),\n checked: true,\n },\n { name: '~/Work', value: join(homedir(), 'Work'), checked: false },\n { name: '~/code', value: join(homedir(), 'code'), checked: true },\n {\n name: '~/Documents/GitHub',\n value: join(homedir(), 'Documents/GitHub'),\n checked: false,\n },\n ],\n when: (): boolean => projectDetailAnswers.scanProjects,\n },\n ]);\n\n config = { ...config, ...projectAnswers, ...projectDetailAnswers };\n }\n\n const integrationAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enableLinear',\n message: 'Enable Linear integration?',\n default: false,\n },\n {\n type: 'password',\n name: 'linearApiKey',\n message: 'Linear API key:',\n when: (answers: any) => answers.enableLinear,\n validate: (input: string) => input.length > 0 || 'API key is required',\n },\n {\n type: 'confirm',\n name: 'enableAnalytics',\n message: 'Enable usage analytics? (Local only)',\n default: true,\n },\n {\n type: 'input',\n name: 'defaultContextPath',\n message: 'Default context storage path:',\n default: join(homedir(), '.stackmemory'),\n validate: (input: string) => input.length > 0 || 'Path is required',\n },\n ]);\n\n config = { ...config, ...integrationAnswers };\n }\n\n return config;\n}\n\nasync function applyConfiguration(config: OnboardingConfig): Promise<void> {\n const configPath = join(homedir(), '.stackmemory');\n\n // Create base directory structure\n console.log(chalk.gray('\\nCreating directory structure...'));\n const dirs = [\n configPath,\n join(configPath, 'contexts'),\n join(configPath, 'projects'),\n join(configPath, 'worktrees'),\n join(configPath, 'bin'),\n join(configPath, 'logs'),\n join(configPath, 'analytics'),\n ];\n\n for (const dir of dirs) {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n // Configure git worktree support\n if (config.enableWorktrees) {\n console.log(chalk.gray('Configuring worktree support...'));\n const worktreeManager = WorktreeManager.getInstance();\n worktreeManager.saveConfig({\n enabled: true,\n autoDetect: true,\n isolateContexts: config.worktreeIsolation,\n shareGlobalContext: false,\n syncInterval: 15,\n });\n\n // Detect current worktrees\n const worktrees = worktreeManager.detectWorktrees();\n if (worktrees.length > 0) {\n console.log(chalk.green(` \u2713 Found ${worktrees.length} worktree(s)`));\n worktrees.forEach((wt) => {\n console.log(chalk.gray(` - ${wt.branch} at ${wt.path}`));\n });\n }\n }\n\n // Scan and organize projects\n if (config.enableProjects && config.scanProjects) {\n console.log(chalk.gray('Scanning for projects...'));\n const projectManager = ProjectManager.getInstance();\n\n const scanPaths = (config as any).scanPaths || [\n join(homedir(), 'Dev'),\n join(homedir(), 'dev'),\n join(homedir(), 'Projects'),\n join(homedir(), 'projects'),\n join(homedir(), 'code'),\n ];\n\n await projectManager.scanAndCategorizeAllProjects(\n scanPaths.filter((p: string) => existsSync(p))\n );\n\n const projects = projectManager.getAllProjects();\n console.log(chalk.green(` \u2713 Found ${projects.length} project(s)`));\n\n // Show summary\n const byType: Record<string, number> = {};\n projects.forEach((p) => {\n byType[p.accountType] = (byType[p.accountType] || 0) + 1;\n });\n\n Object.entries(byType).forEach(([type, count]) => {\n console.log(chalk.gray(` - ${type}: ${count} project(s)`));\n });\n }\n\n // Configure Linear integration\n if (config.enableLinear && config.linearApiKey) {\n console.log(chalk.gray('Configuring Linear integration...'));\n const linearConfig = {\n apiKey: config.linearApiKey,\n autoSync: true,\n syncInterval: 300000, // 5 minutes\n };\n\n writeFileSync(\n join(configPath, 'linear-config.json'),\n JSON.stringify(linearConfig, null, 2)\n );\n console.log(chalk.green(' \u2713 Linear configured'));\n }\n\n // Save main configuration\n const mainConfig = {\n version: '1.0.0',\n setupCompleted: new Date().toISOString(),\n features: {\n worktrees: config.enableWorktrees,\n projects: config.enableProjects,\n linear: config.enableLinear,\n analytics: config.enableAnalytics,\n },\n paths: {\n default: config.defaultContextPath,\n },\n database: {\n mode: config.storageMode,\n ...(config.databaseUrl ? { url: config.databaseUrl } : {}),\n },\n };\n\n writeFileSync(\n join(configPath, 'config.json'),\n JSON.stringify(mainConfig, null, 2)\n );\n\n // If hosted selected, persist a simple env file suggestion\n if (config.storageMode === 'hosted' && config.databaseUrl) {\n try {\n const envFile = join(configPath, 'railway.env');\n writeFileSync(\n envFile,\n `# StackMemory hosted DB\\nDATABASE_URL=${config.databaseUrl}\\n`\n );\n console.log(\n chalk.green(\n ' \u2713 Saved hosted DB settings to ~/.stackmemory/railway.env'\n )\n );\n console.log(\n chalk.gray(\n ' Tip: export DATABASE_URL from this file in your shell profile.'\n )\n );\n } catch (e) {\n console.log(chalk.yellow(' \u26A0 Could not write hosted DB env file'));\n }\n }\n\n // Create claude-sm symlink for easy access\n const binPath = '/usr/local/bin/claude-sm';\n const sourcePath = join(configPath, 'bin', 'stackmemory');\n\n try {\n // Create wrapper script\n const wrapperScript = `#!/bin/bash\n# StackMemory CLI wrapper with worktree support\nCURRENT_DIR=$(pwd)\n\n# Auto-detect worktree if enabled\nif [ -f ~/.stackmemory/worktree-config.json ]; then\n WORKTREE_ENABLED=$(grep '\"enabled\": true' ~/.stackmemory/worktree-config.json)\n if [ ! -z \"$WORKTREE_ENABLED\" ]; then\n # Check if we're in a git worktree\n if git worktree list &>/dev/null; then\n export SM_WORKTREE_PATH=\"$CURRENT_DIR\"\n fi\n fi\nfi\n\n# Run StackMemory with context\nexec stackmemory \"$@\"\n`;\n\n writeFileSync(sourcePath, wrapperScript);\n execFileSync('chmod', ['+x', sourcePath]);\n\n // Create symlink if it doesn't exist\n if (!existsSync(binPath)) {\n execFileSync('ln', ['-s', sourcePath, binPath]);\n console.log(chalk.green(' \u2713 Created claude-sm command'));\n }\n } catch (error: unknown) {\n console.log(\n chalk.yellow(' \u26A0 Could not create claude-sm symlink (may need sudo)')\n );\n }\n\n // Create codex-sm symlink for easy access\n const codexBinPath = '/usr/local/bin/codex-sm';\n const codexSourcePath = join(configPath, 'bin', 'codex-sm');\n\n try {\n // Create Codex wrapper script (based on scripts/codex-wrapper.sh)\n const codexWrapper = `#!/bin/bash\n# Codex CLI wrapper with StackMemory integration\n# Usage: codex-sm [--auto-sync] [--sync-interval=MINUTES] [args...]\n\n# Flags\nAUTO_SYNC=false\nSYNC_INTERVAL=5\nfor arg in \"$@\"; do\n case $arg in\n --auto-sync)\n AUTO_SYNC=true\n shift\n ;;\n --sync-interval=*)\n SYNC_INTERVAL=\"\\${arg#*=}\"\n shift\n ;;\n esac\ndone\n\n# Auto-initialize StackMemory if in git repo without it\nif [ -d \".git\" ] && [ ! -d \".stackmemory\" ]; then\n echo \"\uD83D\uDCE6 Initializing StackMemory for this project...\"\n # Quiet init (no unsupported flags)\n stackmemory init >/dev/null 2>&1 || true\nfi\n\n# Load existing context if available\nif [ -d \".stackmemory\" ]; then\n echo \"\uD83E\uDDE0 Loading StackMemory context...\"\n stackmemory status --brief 2>/dev/null || true\nfi\n\n# Start Linear auto-sync in background if requested\nSYNC_PID=\"\"\nif [ \"$AUTO_SYNC\" = true ] && [ -n \"$LINEAR_API_KEY\" ]; then\n echo \"\uD83D\uDD04 Starting Linear auto-sync (${SYNC_INTERVAL}min intervals)...\"\n (\n while true; do\n sleep $((SYNC_INTERVAL * 60))\n if [ -d \".stackmemory\" ]; then\n stackmemory linear sync --quiet 2>/dev/null || true\n fi\n done\n ) &\n SYNC_PID=$!\nfi\n\ncleanup() {\n echo \"\"\n echo \"\uD83D\uDCDD Saving StackMemory context...\"\n\n # Kill auto-sync if running\n if [ -n \"$SYNC_PID\" ] && kill -0 $SYNC_PID 2>/dev/null; then\n echo \"\uD83D\uDED1 Stopping auto-sync...\"\n kill $SYNC_PID 2>/dev/null || true\n fi\n\n # Save project status and final sync\n if [ -d \".stackmemory\" ]; then\n stackmemory status 2>/dev/null\n if [ -n \"$LINEAR_API_KEY\" ]; then\n echo \"\uD83D\uDD04 Final Linear sync...\"\n stackmemory linear sync 2>/dev/null\n fi\n echo \"\u2705 StackMemory context saved\"\n fi\n}\n\ntrap cleanup EXIT INT TERM\n\n# Run Codex CLI\nif command -v codex &> /dev/null; then\n codex \"$@\"\nelif command -v codex-cli &> /dev/null; then\n codex-cli \"$@\"\nelse\n echo \"\u274C Codex CLI not found. Please install it first.\"\n echo \" See: https://github.com/openai/codex-cli\"\n exit 1\nfi\n`;\n\n writeFileSync(codexSourcePath, codexWrapper);\n execFileSync('chmod', ['+x', codexSourcePath]);\n\n // Create symlink if it doesn't exist\n if (!existsSync(codexBinPath)) {\n execFileSync('ln', ['-s', codexSourcePath, codexBinPath]);\n console.log(chalk.green(' \u2713 Created codex-sm command'));\n }\n } catch (error: unknown) {\n console.log(\n chalk.yellow(' \u26A0 Could not create codex-sm symlink (may need sudo)')\n );\n }\n}\n\nfunction showNextSteps(config: OnboardingConfig): void {\n console.log(chalk.cyan('\uD83C\uDF89 Next Steps:\\n'));\n\n console.log('1. Initialize StackMemory in your project:');\n console.log(chalk.gray(' cd your-project'));\n console.log(chalk.gray(' stackmemory init\\n'));\n\n if (config.enableWorktrees) {\n console.log('2. Create a new worktree:');\n console.log(\n chalk.gray(\n ' git worktree add -b feature/new-feature ../project-feature'\n )\n );\n console.log(chalk.gray(' cd ../project-feature'));\n console.log(\n chalk.gray(\n ' stackmemory status # Isolated context for this worktree\\n'\n )\n );\n }\n\n console.log('3. Use with Claude:');\n console.log(chalk.gray(' claude-sm # Or use stackmemory directly\\n'));\n\n console.log('4. Use with Codex:');\n console.log(chalk.gray(' codex-sm # Codex + StackMemory integration\\n'));\n\n if (config.enableLinear) {\n console.log('5. Sync with Linear:');\n console.log(chalk.gray(' stackmemory linear sync\\n'));\n }\n\n console.log('For more help:');\n console.log(chalk.gray(' stackmemory --help'));\n console.log(chalk.gray(' stackmemory projects --help'));\n if (config.enableWorktrees) {\n console.log(chalk.gray(' stackmemory worktree --help'));\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -233,8 +233,7 @@ function createDoctorCommand() {
233
233
  });
234
234
  }
235
235
  const envChecks = [
236
- { key: "LINEAR_API_KEY", name: "Linear API Key", optional: true },
237
- { key: "TWILIO_ACCOUNT_SID", name: "Twilio Account", optional: true }
236
+ { key: "LINEAR_API_KEY", name: "Linear API Key", optional: true }
238
237
  ];
239
238
  for (const check of envChecks) {
240
239
  const value = process.env[check.key];
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/commands/setup.ts"],
4
- "sourcesContent": ["/**\n * Setup commands for StackMemory onboarding\n * - setup-mcp: Auto-configure Claude Code MCP integration\n * - doctor: Diagnose common issues\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { execSync } from 'child_process';\n\n// Claude config paths\nconst CLAUDE_DIR = join(homedir(), '.claude');\nconst CLAUDE_CONFIG_FILE = join(CLAUDE_DIR, 'config.json');\nconst MCP_CONFIG_FILE = join(CLAUDE_DIR, 'stackmemory-mcp.json');\nconst HOOKS_JSON = join(CLAUDE_DIR, 'hooks.json');\n\ninterface DiagnosticResult {\n name: string;\n status: 'ok' | 'warn' | 'error';\n message: string;\n fix?: string;\n}\n\n/**\n * Create setup-mcp command\n */\nexport function createSetupMCPCommand(): Command {\n return new Command('setup-mcp')\n .description('Auto-configure Claude Code MCP integration')\n .option('--dry-run', 'Show what would be configured without making changes')\n .option('--reset', 'Reset MCP configuration to defaults')\n .action(async (options) => {\n console.log(chalk.cyan('\\nStackMemory MCP Setup\\n'));\n\n if (options.dryRun) {\n console.log(chalk.yellow('[DRY RUN] No changes will be made.\\n'));\n }\n\n // Step 1: Ensure Claude directory exists\n if (!existsSync(CLAUDE_DIR)) {\n if (options.dryRun) {\n console.log(chalk.gray(`Would create: ${CLAUDE_DIR}`));\n } else {\n mkdirSync(CLAUDE_DIR, { recursive: true });\n console.log(chalk.green('[OK]') + ' Created ~/.claude directory');\n }\n }\n\n // Step 2: Create MCP server configuration\n const mcpConfig = {\n mcpServers: {\n stackmemory: {\n command: 'stackmemory',\n args: ['mcp-server'],\n env: {\n NODE_ENV: 'production',\n },\n },\n },\n };\n\n if (options.dryRun) {\n console.log(\n chalk.gray(`Would write MCP config to: ${MCP_CONFIG_FILE}`)\n );\n console.log(chalk.gray(JSON.stringify(mcpConfig, null, 2)));\n } else {\n writeFileSync(MCP_CONFIG_FILE, JSON.stringify(mcpConfig, null, 2));\n console.log(chalk.green('[OK]') + ' Created MCP server configuration');\n }\n\n // Step 3: Update Claude config.json to reference MCP config\n let claudeConfig: Record<string, unknown> = {};\n if (existsSync(CLAUDE_CONFIG_FILE)) {\n try {\n claudeConfig = JSON.parse(readFileSync(CLAUDE_CONFIG_FILE, 'utf8'));\n } catch {\n console.log(\n chalk.yellow('[WARN]') +\n ' Could not parse existing config.json, creating new'\n );\n }\n }\n\n // Ensure mcp.configFiles array includes our config\n if (!claudeConfig.mcp) {\n claudeConfig.mcp = {};\n }\n const mcp = claudeConfig.mcp as Record<string, unknown>;\n if (!mcp.configFiles) {\n mcp.configFiles = [];\n }\n const configFiles = mcp.configFiles as string[];\n if (!configFiles.includes(MCP_CONFIG_FILE)) {\n configFiles.push(MCP_CONFIG_FILE);\n }\n\n if (options.dryRun) {\n console.log(chalk.gray(`Would update: ${CLAUDE_CONFIG_FILE}`));\n } else {\n writeFileSync(\n CLAUDE_CONFIG_FILE,\n JSON.stringify(claudeConfig, null, 2)\n );\n console.log(chalk.green('[OK]') + ' Updated Claude config.json');\n }\n\n // Step 4: Validate configuration\n console.log(chalk.cyan('\\nValidating configuration...'));\n\n // Check stackmemory command is available\n try {\n execSync('stackmemory --version', { stdio: 'pipe' });\n console.log(chalk.green('[OK]') + ' stackmemory CLI is installed');\n } catch {\n console.log(chalk.yellow('[WARN]') + ' stackmemory CLI not in PATH');\n console.log(chalk.gray(' You may need to restart your terminal'));\n }\n\n // Check Claude Code is available\n try {\n execSync('claude --version', { stdio: 'pipe' });\n console.log(chalk.green('[OK]') + ' Claude Code is installed');\n } catch {\n console.log(chalk.yellow('[WARN]') + ' Claude Code not found');\n console.log(chalk.gray(' Install from: https://claude.ai/code'));\n }\n\n // Final instructions\n if (!options.dryRun) {\n console.log(chalk.green('\\nMCP setup complete!'));\n console.log(chalk.cyan('\\nNext steps:'));\n console.log(chalk.white(' 1. Restart Claude Code'));\n console.log(\n chalk.white(\n ' 2. The StackMemory MCP tools will be available automatically'\n )\n );\n console.log(\n chalk.gray(\n '\\nTo verify: Run \"stackmemory doctor\" to check all integrations'\n )\n );\n }\n });\n}\n\n/**\n * Create doctor command for diagnostics\n */\nexport function createDoctorCommand(): Command {\n return new Command('doctor')\n .description('Diagnose StackMemory configuration and common issues')\n .option('--fix', 'Attempt to automatically fix issues')\n .action(async (options) => {\n console.log(chalk.cyan('\\nStackMemory Doctor\\n'));\n console.log(chalk.gray('Checking configuration and dependencies...\\n'));\n\n const results: DiagnosticResult[] = [];\n\n // 1. Check project initialization\n const projectDir = join(process.cwd(), '.stackmemory');\n const dbPath = join(projectDir, 'context.db');\n if (existsSync(dbPath)) {\n results.push({\n name: 'Project Initialization',\n status: 'ok',\n message: 'StackMemory is initialized in this project',\n });\n } else if (existsSync(projectDir)) {\n results.push({\n name: 'Project Initialization',\n status: 'warn',\n message: '.stackmemory directory exists but database not found',\n fix: 'Run: stackmemory init',\n });\n } else {\n results.push({\n name: 'Project Initialization',\n status: 'error',\n message: 'StackMemory not initialized in this project',\n fix: 'Run: stackmemory init',\n });\n }\n\n // 2. Check database integrity\n if (existsSync(dbPath)) {\n try {\n const Database = (await import('better-sqlite3')).default;\n const db = new Database(dbPath, { readonly: true });\n const tables = db\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table'\")\n .all() as { name: string }[];\n db.close();\n\n const hasFrames = tables.some((t) => t.name === 'frames');\n if (hasFrames) {\n results.push({\n name: 'Database Integrity',\n status: 'ok',\n message: `Database has ${tables.length} tables`,\n });\n } else {\n results.push({\n name: 'Database Integrity',\n status: 'warn',\n message: 'Database exists but missing expected tables',\n fix: 'Run: stackmemory init --interactive',\n });\n }\n } catch (error) {\n results.push({\n name: 'Database Integrity',\n status: 'error',\n message: `Database error: ${(error as Error).message}`,\n fix: 'Remove .stackmemory/context.db and run: stackmemory init',\n });\n }\n }\n\n // 3. Check MCP configuration\n if (existsSync(MCP_CONFIG_FILE)) {\n try {\n const config = JSON.parse(readFileSync(MCP_CONFIG_FILE, 'utf8'));\n if (config.mcpServers?.stackmemory) {\n results.push({\n name: 'MCP Configuration',\n status: 'ok',\n message: 'MCP server configured',\n });\n } else {\n results.push({\n name: 'MCP Configuration',\n status: 'warn',\n message:\n 'MCP config file exists but stackmemory server not configured',\n fix: 'Run: stackmemory setup-mcp',\n });\n }\n } catch {\n results.push({\n name: 'MCP Configuration',\n status: 'error',\n message: 'Invalid MCP configuration file',\n fix: 'Run: stackmemory setup-mcp --reset',\n });\n }\n } else {\n results.push({\n name: 'MCP Configuration',\n status: 'warn',\n message: 'MCP not configured for Claude Code',\n fix: 'Run: stackmemory setup-mcp',\n });\n }\n\n // 4. Check Claude hooks\n if (existsSync(HOOKS_JSON)) {\n try {\n const hooks = JSON.parse(readFileSync(HOOKS_JSON, 'utf8'));\n const hasTraceHook = !!hooks['tool-use-approval'];\n if (hasTraceHook) {\n results.push({\n name: 'Claude Hooks',\n status: 'ok',\n message: 'Tool tracing hook installed',\n });\n } else {\n results.push({\n name: 'Claude Hooks',\n status: 'warn',\n message: 'Hooks file exists but tracing not configured',\n fix: 'Run: stackmemory hooks install',\n });\n }\n } catch {\n results.push({\n name: 'Claude Hooks',\n status: 'warn',\n message: 'Could not read hooks.json',\n });\n }\n } else {\n results.push({\n name: 'Claude Hooks',\n status: 'warn',\n message: 'Claude hooks not installed (optional)',\n fix: 'Run: stackmemory hooks install',\n });\n }\n\n // 5. Check environment variables\n const envChecks = [\n { key: 'LINEAR_API_KEY', name: 'Linear API Key', optional: true },\n { key: 'TWILIO_ACCOUNT_SID', name: 'Twilio Account', optional: true },\n ];\n\n for (const check of envChecks) {\n const value = process.env[check.key];\n if (value) {\n results.push({\n name: check.name,\n status: 'ok',\n message: 'Environment variable set',\n });\n } else if (!check.optional) {\n results.push({\n name: check.name,\n status: 'error',\n message: 'Required environment variable not set',\n fix: `Set ${check.key} in your .env file`,\n });\n }\n // Skip optional env vars that aren't set\n }\n\n // 6. Check file permissions\n const homeStackmemory = join(homedir(), '.stackmemory');\n if (existsSync(homeStackmemory)) {\n try {\n const testFile = join(homeStackmemory, '.write-test');\n writeFileSync(testFile, 'test');\n const { unlinkSync } = await import('fs');\n unlinkSync(testFile);\n results.push({\n name: 'File Permissions',\n status: 'ok',\n message: '~/.stackmemory is writable',\n });\n } catch {\n results.push({\n name: 'File Permissions',\n status: 'error',\n message: '~/.stackmemory is not writable',\n fix: 'Run: chmod 700 ~/.stackmemory',\n });\n }\n }\n\n // Display results\n let hasErrors = false;\n let hasWarnings = false;\n\n for (const result of results) {\n const icon =\n result.status === 'ok'\n ? chalk.green('[OK]')\n : result.status === 'warn'\n ? chalk.yellow('[WARN]')\n : chalk.red('[ERROR]');\n\n console.log(`${icon} ${result.name}`);\n console.log(chalk.gray(` ${result.message}`));\n\n if (result.fix) {\n console.log(chalk.cyan(` Fix: ${result.fix}`));\n\n if (options.fix && result.status !== 'ok') {\n // Auto-fix logic for specific issues\n if (result.fix.includes('stackmemory setup-mcp')) {\n console.log(chalk.gray(' Attempting auto-fix...'));\n try {\n execSync('stackmemory setup-mcp', { stdio: 'inherit' });\n } catch {\n console.log(chalk.red(' Auto-fix failed'));\n }\n }\n }\n }\n\n if (result.status === 'error') hasErrors = true;\n if (result.status === 'warn') hasWarnings = true;\n }\n\n // Summary\n console.log('');\n if (hasErrors) {\n console.log(\n chalk.red('Some issues need attention. Run suggested fixes above.')\n );\n process.exit(1);\n } else if (hasWarnings) {\n console.log(\n chalk.yellow(\n 'StackMemory is working but some optional features are not configured.'\n )\n );\n } else {\n console.log(\n chalk.green('All checks passed! StackMemory is properly configured.')\n );\n }\n });\n}\n\n/**\n * Create setup-plugins command\n */\nexport function createSetupPluginsCommand(): Command {\n const cmd = new Command('setup-plugins');\n\n cmd\n .description('Install StackMemory plugins for Claude Code')\n .option('--force', 'Overwrite existing plugins')\n .action(async (options) => {\n console.log(\n chalk.cyan('Installing StackMemory plugins for Claude Code...\\n')\n );\n\n const pluginsDir = join(CLAUDE_DIR, 'plugins');\n\n // Ensure plugins directory exists\n if (!existsSync(pluginsDir)) {\n mkdirSync(pluginsDir, { recursive: true });\n console.log(chalk.gray(`Created: ${pluginsDir}`));\n }\n\n // Find the plugins source directory\n // Check multiple locations: local dev, global npm, local npm\n const possiblePaths = [\n join(process.cwd(), 'plugins'),\n join(__dirname, '..', '..', '..', 'plugins'),\n join(homedir(), '.stackmemory', 'plugins'),\n ];\n\n // Try to find via npm root\n try {\n const globalRoot = execSync('npm root -g', {\n encoding: 'utf-8',\n }).trim();\n possiblePaths.push(\n join(globalRoot, '@stackmemoryai', 'stackmemory', 'plugins')\n );\n } catch {\n // npm not available or failed\n }\n\n let sourcePluginsDir: string | undefined;\n for (const p of possiblePaths) {\n if (existsSync(p) && existsSync(join(p, 'stackmemory'))) {\n sourcePluginsDir = p;\n break;\n }\n }\n\n if (!sourcePluginsDir) {\n console.log(chalk.red('Could not find StackMemory plugins directory'));\n console.log(chalk.gray('Searched:'));\n possiblePaths.forEach((p) => console.log(chalk.gray(` - ${p}`)));\n process.exit(1);\n }\n\n console.log(chalk.gray(`Source: ${sourcePluginsDir}\\n`));\n\n // List of plugins to install\n const plugins = ['stackmemory', 'ralph-wiggum'];\n let installed = 0;\n\n for (const plugin of plugins) {\n const sourcePath = join(sourcePluginsDir, plugin);\n const targetPath = join(pluginsDir, plugin);\n\n if (!existsSync(sourcePath)) {\n console.log(chalk.yellow(` [SKIP] ${plugin} - not found in source`));\n continue;\n }\n\n if (existsSync(targetPath)) {\n if (options.force) {\n // Remove existing\n try {\n execSync(`rm -rf \"${targetPath}\"`, { encoding: 'utf-8' });\n } catch {\n console.log(\n chalk.red(` [ERROR] ${plugin} - could not remove existing`)\n );\n continue;\n }\n } else {\n console.log(\n chalk.gray(` [EXISTS] ${plugin} - use --force to overwrite`)\n );\n continue;\n }\n }\n\n // Create symlink\n try {\n execSync(`ln -s \"${sourcePath}\" \"${targetPath}\"`, {\n encoding: 'utf-8',\n });\n console.log(chalk.green(` [OK] ${plugin}`));\n installed++;\n } catch (err) {\n console.log(\n chalk.red(` [ERROR] ${plugin} - ${(err as Error).message}`)\n );\n }\n }\n\n console.log('');\n if (installed > 0) {\n console.log(chalk.green(`Installed ${installed} plugin(s)`));\n console.log(chalk.gray('\\nAvailable commands in Claude Code:'));\n console.log(\n chalk.white(' /sm-status ') +\n chalk.gray('Show StackMemory status')\n );\n console.log(\n chalk.white(' /sm-capture ') +\n chalk.gray('Capture work for handoff')\n );\n console.log(\n chalk.white(' /sm-restore ') +\n chalk.gray('Restore from last handoff')\n );\n console.log(\n chalk.white(' /sm-decision ') + chalk.gray('Record a decision')\n );\n console.log(\n chalk.white(' /sm-help ') + chalk.gray('Show all commands')\n );\n console.log(\n chalk.white(' /ralph-loop ') +\n chalk.gray('Start Ralph iteration loop')\n );\n } else {\n console.log(chalk.yellow('No plugins installed'));\n }\n });\n\n return cmd;\n}\n\n/**\n * Create setup-remote command for remote MCP server auto-start\n */\nexport function createSetupRemoteCommand(): Command {\n const cmd = new Command('setup-remote');\n\n cmd\n .description('Configure remote MCP server to auto-start on boot')\n .option('--port <number>', 'Port for remote server', '3847')\n .option('--project <path>', 'Project root directory')\n .option('--uninstall', 'Remove the auto-start service')\n .option('--status', 'Check service status')\n .action(async (options) => {\n const home = homedir();\n const platform = process.platform;\n\n // Service configuration\n const serviceName =\n platform === 'darwin'\n ? 'com.stackmemory.remote-mcp'\n : 'stackmemory-remote-mcp';\n const serviceDir =\n platform === 'darwin'\n ? join(home, 'Library', 'LaunchAgents')\n : join(home, '.config', 'systemd', 'user');\n const serviceFile =\n platform === 'darwin'\n ? join(serviceDir, `${serviceName}.plist`)\n : join(serviceDir, `${serviceName}.service`);\n const logDir = join(home, '.stackmemory', 'logs');\n const pidFile = join(home, '.stackmemory', 'remote-mcp.pid');\n\n // Handle status check\n if (options.status) {\n console.log(chalk.cyan('\\nRemote MCP Server Status\\n'));\n\n if (platform === 'darwin') {\n try {\n const result = execSync(\n `launchctl list | grep ${serviceName} || true`,\n { encoding: 'utf-8' }\n );\n if (result.includes(serviceName)) {\n console.log(chalk.green('[RUNNING]') + ' Service is active');\n try {\n const health = execSync(\n `curl -s http://localhost:${options.port}/health 2>/dev/null`,\n { encoding: 'utf-8' }\n );\n const data = JSON.parse(health);\n console.log(chalk.gray(` Project: ${data.projectId}`));\n console.log(\n chalk.gray(` URL: http://localhost:${options.port}/sse`)\n );\n } catch {\n console.log(\n chalk.yellow(' Server not responding to health check')\n );\n }\n } else {\n console.log(chalk.yellow('[STOPPED]') + ' Service not running');\n }\n } catch {\n console.log(chalk.yellow('[UNKNOWN]') + ' Could not check status');\n }\n } else if (platform === 'linux') {\n try {\n execSync(`systemctl --user is-active ${serviceName}`, {\n stdio: 'pipe',\n });\n console.log(chalk.green('[RUNNING]') + ' Service is active');\n } catch {\n console.log(chalk.yellow('[STOPPED]') + ' Service not running');\n }\n }\n\n console.log(chalk.gray(`\\nService file: ${serviceFile}`));\n console.log(chalk.gray(`Logs: ${logDir}/remote-mcp.log`));\n return;\n }\n\n // Handle uninstall\n if (options.uninstall) {\n console.log(chalk.cyan('\\nUninstalling Remote MCP Server Service\\n'));\n\n if (platform === 'darwin') {\n try {\n execSync(`launchctl unload \"${serviceFile}\"`, { stdio: 'pipe' });\n console.log(chalk.green('[OK]') + ' Service unloaded');\n } catch {\n console.log(chalk.gray('[SKIP]') + ' Service was not loaded');\n }\n\n if (existsSync(serviceFile)) {\n const fs = await import('fs/promises');\n await fs.unlink(serviceFile);\n console.log(chalk.green('[OK]') + ' Service file removed');\n }\n } else if (platform === 'linux') {\n try {\n execSync(`systemctl --user stop ${serviceName}`, { stdio: 'pipe' });\n execSync(`systemctl --user disable ${serviceName}`, {\n stdio: 'pipe',\n });\n console.log(chalk.green('[OK]') + ' Service stopped and disabled');\n } catch {\n console.log(chalk.gray('[SKIP]') + ' Service was not running');\n }\n\n if (existsSync(serviceFile)) {\n const fs = await import('fs/promises');\n await fs.unlink(serviceFile);\n execSync('systemctl --user daemon-reload', { stdio: 'pipe' });\n console.log(chalk.green('[OK]') + ' Service file removed');\n }\n }\n\n console.log(chalk.green('\\nRemote MCP service uninstalled'));\n return;\n }\n\n // Install service\n console.log(chalk.cyan('\\nSetting up Remote MCP Server Auto-Start\\n'));\n\n if (platform !== 'darwin' && platform !== 'linux') {\n console.log(\n chalk.red('Auto-start is only supported on macOS and Linux')\n );\n console.log(chalk.gray('\\nManual start: stackmemory mcp-remote'));\n return;\n }\n\n // Create directories\n if (!existsSync(serviceDir)) {\n mkdirSync(serviceDir, { recursive: true });\n }\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true });\n }\n\n // Find node and stackmemory paths\n let nodePath: string;\n try {\n nodePath = execSync('which node', { encoding: 'utf-8' }).trim();\n } catch {\n nodePath = '/usr/local/bin/node';\n }\n\n // Find stackmemory CLI path\n let stackmemoryPath: string;\n try {\n stackmemoryPath = execSync('which stackmemory', {\n encoding: 'utf-8',\n }).trim();\n } catch {\n // Try npm global path\n try {\n const npmRoot = execSync('npm root -g', { encoding: 'utf-8' }).trim();\n stackmemoryPath = join(\n npmRoot,\n '@stackmemoryai',\n 'stackmemory',\n 'dist',\n 'cli',\n 'index.js'\n );\n } catch {\n stackmemoryPath = 'npx stackmemory';\n }\n }\n\n const projectPath = options.project || home;\n const port = options.port || '3847';\n\n if (platform === 'darwin') {\n // Generate macOS launchd plist\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${serviceName}</string>\n\n <key>ProgramArguments</key>\n <array>\n <string>${stackmemoryPath.includes('npx') ? 'npx' : nodePath}</string>\n ${stackmemoryPath.includes('npx') ? '<string>stackmemory</string>' : `<string>${stackmemoryPath}</string>`}\n <string>mcp-remote</string>\n <string>--port</string>\n <string>${port}</string>\n <string>--project</string>\n <string>${projectPath}</string>\n </array>\n\n <key>RunAtLoad</key>\n <true/>\n\n <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n\n <key>WorkingDirectory</key>\n <string>${projectPath}</string>\n\n <key>StandardOutPath</key>\n <string>${logDir}/remote-mcp.log</string>\n\n <key>StandardErrorPath</key>\n <string>${logDir}/remote-mcp.error.log</string>\n\n <key>EnvironmentVariables</key>\n <dict>\n <key>HOME</key>\n <string>${home}</string>\n <key>PATH</key>\n <string>/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin</string>\n <key>NODE_ENV</key>\n <string>production</string>\n </dict>\n\n <key>ThrottleInterval</key>\n <integer>10</integer>\n</dict>\n</plist>`;\n\n writeFileSync(serviceFile, plist);\n console.log(chalk.green('[OK]') + ' Created launchd service file');\n\n // Unload if already loaded\n try {\n execSync(`launchctl unload \"${serviceFile}\" 2>/dev/null`, {\n stdio: 'pipe',\n });\n } catch {\n // Not loaded, ignore\n }\n\n // Load the service\n try {\n execSync(`launchctl load -w \"${serviceFile}\"`, { stdio: 'pipe' });\n console.log(chalk.green('[OK]') + ' Service loaded and started');\n } catch (err) {\n console.log(chalk.red('[ERROR]') + ` Failed to load service: ${err}`);\n return;\n }\n } else if (platform === 'linux') {\n // Generate systemd service\n const service = `[Unit]\nDescription=StackMemory Remote MCP Server\nDocumentation=https://github.com/stackmemoryai/stackmemory\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=${stackmemoryPath.includes('npx') ? 'npx stackmemory' : `${nodePath} ${stackmemoryPath}`} mcp-remote --port ${port} --project ${projectPath}\nRestart=on-failure\nRestartSec=10\nWorkingDirectory=${projectPath}\n\nEnvironment=HOME=${home}\nEnvironment=PATH=/usr/local/bin:/usr/bin:/bin\nEnvironment=NODE_ENV=production\n\nStandardOutput=append:${logDir}/remote-mcp.log\nStandardError=append:${logDir}/remote-mcp.error.log\n\n[Install]\nWantedBy=default.target`;\n\n writeFileSync(serviceFile, service);\n console.log(chalk.green('[OK]') + ' Created systemd service file');\n\n try {\n execSync('systemctl --user daemon-reload', { stdio: 'pipe' });\n execSync(`systemctl --user enable ${serviceName}`, { stdio: 'pipe' });\n execSync(`systemctl --user start ${serviceName}`, { stdio: 'pipe' });\n console.log(chalk.green('[OK]') + ' Service enabled and started');\n } catch (err) {\n console.log(\n chalk.red('[ERROR]') + ` Failed to start service: ${err}`\n );\n return;\n }\n }\n\n // Verify it's running\n console.log(chalk.cyan('\\nVerifying server...\\n'));\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n try {\n const health = execSync(\n `curl -s http://localhost:${port}/health 2>/dev/null`,\n { encoding: 'utf-8' }\n );\n const data = JSON.parse(health);\n console.log(chalk.green('[OK]') + ' Server is running');\n console.log(chalk.gray(` Project: ${data.projectId}`));\n } catch {\n console.log(\n chalk.yellow('[WARN]') +\n ' Server not responding yet (may still be starting)'\n );\n }\n\n console.log(\n chalk.green('\\nRemote MCP Server configured for auto-start!')\n );\n console.log(chalk.cyan('\\nConnection info:'));\n console.log(chalk.white(` URL: http://localhost:${port}/sse`));\n console.log(chalk.white(` Health: http://localhost:${port}/health`));\n console.log(chalk.gray(`\\nLogs: ${logDir}/remote-mcp.log`));\n console.log(chalk.gray(`Service: ${serviceFile}`));\n console.log(chalk.cyan('\\nFor external access (ngrok):'));\n console.log(chalk.white(` ngrok http ${port}`));\n console.log(chalk.gray(' Then use the ngrok URL + /sse in Claude.ai'));\n });\n\n return cmd;\n}\n\n/**\n * Register setup commands\n */\nexport function registerSetupCommands(program: Command): void {\n program.addCommand(createSetupMCPCommand());\n program.addCommand(createDoctorCommand());\n program.addCommand(createSetupPluginsCommand());\n program.addCommand(createSetupRemoteCommand());\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Setup commands for StackMemory onboarding\n * - setup-mcp: Auto-configure Claude Code MCP integration\n * - doctor: Diagnose common issues\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { execSync } from 'child_process';\n\n// Claude config paths\nconst CLAUDE_DIR = join(homedir(), '.claude');\nconst CLAUDE_CONFIG_FILE = join(CLAUDE_DIR, 'config.json');\nconst MCP_CONFIG_FILE = join(CLAUDE_DIR, 'stackmemory-mcp.json');\nconst HOOKS_JSON = join(CLAUDE_DIR, 'hooks.json');\n\ninterface DiagnosticResult {\n name: string;\n status: 'ok' | 'warn' | 'error';\n message: string;\n fix?: string;\n}\n\n/**\n * Create setup-mcp command\n */\nexport function createSetupMCPCommand(): Command {\n return new Command('setup-mcp')\n .description('Auto-configure Claude Code MCP integration')\n .option('--dry-run', 'Show what would be configured without making changes')\n .option('--reset', 'Reset MCP configuration to defaults')\n .action(async (options) => {\n console.log(chalk.cyan('\\nStackMemory MCP Setup\\n'));\n\n if (options.dryRun) {\n console.log(chalk.yellow('[DRY RUN] No changes will be made.\\n'));\n }\n\n // Step 1: Ensure Claude directory exists\n if (!existsSync(CLAUDE_DIR)) {\n if (options.dryRun) {\n console.log(chalk.gray(`Would create: ${CLAUDE_DIR}`));\n } else {\n mkdirSync(CLAUDE_DIR, { recursive: true });\n console.log(chalk.green('[OK]') + ' Created ~/.claude directory');\n }\n }\n\n // Step 2: Create MCP server configuration\n const mcpConfig = {\n mcpServers: {\n stackmemory: {\n command: 'stackmemory',\n args: ['mcp-server'],\n env: {\n NODE_ENV: 'production',\n },\n },\n },\n };\n\n if (options.dryRun) {\n console.log(\n chalk.gray(`Would write MCP config to: ${MCP_CONFIG_FILE}`)\n );\n console.log(chalk.gray(JSON.stringify(mcpConfig, null, 2)));\n } else {\n writeFileSync(MCP_CONFIG_FILE, JSON.stringify(mcpConfig, null, 2));\n console.log(chalk.green('[OK]') + ' Created MCP server configuration');\n }\n\n // Step 3: Update Claude config.json to reference MCP config\n let claudeConfig: Record<string, unknown> = {};\n if (existsSync(CLAUDE_CONFIG_FILE)) {\n try {\n claudeConfig = JSON.parse(readFileSync(CLAUDE_CONFIG_FILE, 'utf8'));\n } catch {\n console.log(\n chalk.yellow('[WARN]') +\n ' Could not parse existing config.json, creating new'\n );\n }\n }\n\n // Ensure mcp.configFiles array includes our config\n if (!claudeConfig.mcp) {\n claudeConfig.mcp = {};\n }\n const mcp = claudeConfig.mcp as Record<string, unknown>;\n if (!mcp.configFiles) {\n mcp.configFiles = [];\n }\n const configFiles = mcp.configFiles as string[];\n if (!configFiles.includes(MCP_CONFIG_FILE)) {\n configFiles.push(MCP_CONFIG_FILE);\n }\n\n if (options.dryRun) {\n console.log(chalk.gray(`Would update: ${CLAUDE_CONFIG_FILE}`));\n } else {\n writeFileSync(\n CLAUDE_CONFIG_FILE,\n JSON.stringify(claudeConfig, null, 2)\n );\n console.log(chalk.green('[OK]') + ' Updated Claude config.json');\n }\n\n // Step 4: Validate configuration\n console.log(chalk.cyan('\\nValidating configuration...'));\n\n // Check stackmemory command is available\n try {\n execSync('stackmemory --version', { stdio: 'pipe' });\n console.log(chalk.green('[OK]') + ' stackmemory CLI is installed');\n } catch {\n console.log(chalk.yellow('[WARN]') + ' stackmemory CLI not in PATH');\n console.log(chalk.gray(' You may need to restart your terminal'));\n }\n\n // Check Claude Code is available\n try {\n execSync('claude --version', { stdio: 'pipe' });\n console.log(chalk.green('[OK]') + ' Claude Code is installed');\n } catch {\n console.log(chalk.yellow('[WARN]') + ' Claude Code not found');\n console.log(chalk.gray(' Install from: https://claude.ai/code'));\n }\n\n // Final instructions\n if (!options.dryRun) {\n console.log(chalk.green('\\nMCP setup complete!'));\n console.log(chalk.cyan('\\nNext steps:'));\n console.log(chalk.white(' 1. Restart Claude Code'));\n console.log(\n chalk.white(\n ' 2. The StackMemory MCP tools will be available automatically'\n )\n );\n console.log(\n chalk.gray(\n '\\nTo verify: Run \"stackmemory doctor\" to check all integrations'\n )\n );\n }\n });\n}\n\n/**\n * Create doctor command for diagnostics\n */\nexport function createDoctorCommand(): Command {\n return new Command('doctor')\n .description('Diagnose StackMemory configuration and common issues')\n .option('--fix', 'Attempt to automatically fix issues')\n .action(async (options) => {\n console.log(chalk.cyan('\\nStackMemory Doctor\\n'));\n console.log(chalk.gray('Checking configuration and dependencies...\\n'));\n\n const results: DiagnosticResult[] = [];\n\n // 1. Check project initialization\n const projectDir = join(process.cwd(), '.stackmemory');\n const dbPath = join(projectDir, 'context.db');\n if (existsSync(dbPath)) {\n results.push({\n name: 'Project Initialization',\n status: 'ok',\n message: 'StackMemory is initialized in this project',\n });\n } else if (existsSync(projectDir)) {\n results.push({\n name: 'Project Initialization',\n status: 'warn',\n message: '.stackmemory directory exists but database not found',\n fix: 'Run: stackmemory init',\n });\n } else {\n results.push({\n name: 'Project Initialization',\n status: 'error',\n message: 'StackMemory not initialized in this project',\n fix: 'Run: stackmemory init',\n });\n }\n\n // 2. Check database integrity\n if (existsSync(dbPath)) {\n try {\n const Database = (await import('better-sqlite3')).default;\n const db = new Database(dbPath, { readonly: true });\n const tables = db\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table'\")\n .all() as { name: string }[];\n db.close();\n\n const hasFrames = tables.some((t) => t.name === 'frames');\n if (hasFrames) {\n results.push({\n name: 'Database Integrity',\n status: 'ok',\n message: `Database has ${tables.length} tables`,\n });\n } else {\n results.push({\n name: 'Database Integrity',\n status: 'warn',\n message: 'Database exists but missing expected tables',\n fix: 'Run: stackmemory init --interactive',\n });\n }\n } catch (error) {\n results.push({\n name: 'Database Integrity',\n status: 'error',\n message: `Database error: ${(error as Error).message}`,\n fix: 'Remove .stackmemory/context.db and run: stackmemory init',\n });\n }\n }\n\n // 3. Check MCP configuration\n if (existsSync(MCP_CONFIG_FILE)) {\n try {\n const config = JSON.parse(readFileSync(MCP_CONFIG_FILE, 'utf8'));\n if (config.mcpServers?.stackmemory) {\n results.push({\n name: 'MCP Configuration',\n status: 'ok',\n message: 'MCP server configured',\n });\n } else {\n results.push({\n name: 'MCP Configuration',\n status: 'warn',\n message:\n 'MCP config file exists but stackmemory server not configured',\n fix: 'Run: stackmemory setup-mcp',\n });\n }\n } catch {\n results.push({\n name: 'MCP Configuration',\n status: 'error',\n message: 'Invalid MCP configuration file',\n fix: 'Run: stackmemory setup-mcp --reset',\n });\n }\n } else {\n results.push({\n name: 'MCP Configuration',\n status: 'warn',\n message: 'MCP not configured for Claude Code',\n fix: 'Run: stackmemory setup-mcp',\n });\n }\n\n // 4. Check Claude hooks\n if (existsSync(HOOKS_JSON)) {\n try {\n const hooks = JSON.parse(readFileSync(HOOKS_JSON, 'utf8'));\n const hasTraceHook = !!hooks['tool-use-approval'];\n if (hasTraceHook) {\n results.push({\n name: 'Claude Hooks',\n status: 'ok',\n message: 'Tool tracing hook installed',\n });\n } else {\n results.push({\n name: 'Claude Hooks',\n status: 'warn',\n message: 'Hooks file exists but tracing not configured',\n fix: 'Run: stackmemory hooks install',\n });\n }\n } catch {\n results.push({\n name: 'Claude Hooks',\n status: 'warn',\n message: 'Could not read hooks.json',\n });\n }\n } else {\n results.push({\n name: 'Claude Hooks',\n status: 'warn',\n message: 'Claude hooks not installed (optional)',\n fix: 'Run: stackmemory hooks install',\n });\n }\n\n // 5. Check environment variables\n const envChecks = [\n { key: 'LINEAR_API_KEY', name: 'Linear API Key', optional: true },\n ];\n\n for (const check of envChecks) {\n const value = process.env[check.key];\n if (value) {\n results.push({\n name: check.name,\n status: 'ok',\n message: 'Environment variable set',\n });\n } else if (!check.optional) {\n results.push({\n name: check.name,\n status: 'error',\n message: 'Required environment variable not set',\n fix: `Set ${check.key} in your .env file`,\n });\n }\n // Skip optional env vars that aren't set\n }\n\n // 6. Check file permissions\n const homeStackmemory = join(homedir(), '.stackmemory');\n if (existsSync(homeStackmemory)) {\n try {\n const testFile = join(homeStackmemory, '.write-test');\n writeFileSync(testFile, 'test');\n const { unlinkSync } = await import('fs');\n unlinkSync(testFile);\n results.push({\n name: 'File Permissions',\n status: 'ok',\n message: '~/.stackmemory is writable',\n });\n } catch {\n results.push({\n name: 'File Permissions',\n status: 'error',\n message: '~/.stackmemory is not writable',\n fix: 'Run: chmod 700 ~/.stackmemory',\n });\n }\n }\n\n // Display results\n let hasErrors = false;\n let hasWarnings = false;\n\n for (const result of results) {\n const icon =\n result.status === 'ok'\n ? chalk.green('[OK]')\n : result.status === 'warn'\n ? chalk.yellow('[WARN]')\n : chalk.red('[ERROR]');\n\n console.log(`${icon} ${result.name}`);\n console.log(chalk.gray(` ${result.message}`));\n\n if (result.fix) {\n console.log(chalk.cyan(` Fix: ${result.fix}`));\n\n if (options.fix && result.status !== 'ok') {\n // Auto-fix logic for specific issues\n if (result.fix.includes('stackmemory setup-mcp')) {\n console.log(chalk.gray(' Attempting auto-fix...'));\n try {\n execSync('stackmemory setup-mcp', { stdio: 'inherit' });\n } catch {\n console.log(chalk.red(' Auto-fix failed'));\n }\n }\n }\n }\n\n if (result.status === 'error') hasErrors = true;\n if (result.status === 'warn') hasWarnings = true;\n }\n\n // Summary\n console.log('');\n if (hasErrors) {\n console.log(\n chalk.red('Some issues need attention. Run suggested fixes above.')\n );\n process.exit(1);\n } else if (hasWarnings) {\n console.log(\n chalk.yellow(\n 'StackMemory is working but some optional features are not configured.'\n )\n );\n } else {\n console.log(\n chalk.green('All checks passed! StackMemory is properly configured.')\n );\n }\n });\n}\n\n/**\n * Create setup-plugins command\n */\nexport function createSetupPluginsCommand(): Command {\n const cmd = new Command('setup-plugins');\n\n cmd\n .description('Install StackMemory plugins for Claude Code')\n .option('--force', 'Overwrite existing plugins')\n .action(async (options) => {\n console.log(\n chalk.cyan('Installing StackMemory plugins for Claude Code...\\n')\n );\n\n const pluginsDir = join(CLAUDE_DIR, 'plugins');\n\n // Ensure plugins directory exists\n if (!existsSync(pluginsDir)) {\n mkdirSync(pluginsDir, { recursive: true });\n console.log(chalk.gray(`Created: ${pluginsDir}`));\n }\n\n // Find the plugins source directory\n // Check multiple locations: local dev, global npm, local npm\n const possiblePaths = [\n join(process.cwd(), 'plugins'),\n join(__dirname, '..', '..', '..', 'plugins'),\n join(homedir(), '.stackmemory', 'plugins'),\n ];\n\n // Try to find via npm root\n try {\n const globalRoot = execSync('npm root -g', {\n encoding: 'utf-8',\n }).trim();\n possiblePaths.push(\n join(globalRoot, '@stackmemoryai', 'stackmemory', 'plugins')\n );\n } catch {\n // npm not available or failed\n }\n\n let sourcePluginsDir: string | undefined;\n for (const p of possiblePaths) {\n if (existsSync(p) && existsSync(join(p, 'stackmemory'))) {\n sourcePluginsDir = p;\n break;\n }\n }\n\n if (!sourcePluginsDir) {\n console.log(chalk.red('Could not find StackMemory plugins directory'));\n console.log(chalk.gray('Searched:'));\n possiblePaths.forEach((p) => console.log(chalk.gray(` - ${p}`)));\n process.exit(1);\n }\n\n console.log(chalk.gray(`Source: ${sourcePluginsDir}\\n`));\n\n // List of plugins to install\n const plugins = ['stackmemory', 'ralph-wiggum'];\n let installed = 0;\n\n for (const plugin of plugins) {\n const sourcePath = join(sourcePluginsDir, plugin);\n const targetPath = join(pluginsDir, plugin);\n\n if (!existsSync(sourcePath)) {\n console.log(chalk.yellow(` [SKIP] ${plugin} - not found in source`));\n continue;\n }\n\n if (existsSync(targetPath)) {\n if (options.force) {\n // Remove existing\n try {\n execSync(`rm -rf \"${targetPath}\"`, { encoding: 'utf-8' });\n } catch {\n console.log(\n chalk.red(` [ERROR] ${plugin} - could not remove existing`)\n );\n continue;\n }\n } else {\n console.log(\n chalk.gray(` [EXISTS] ${plugin} - use --force to overwrite`)\n );\n continue;\n }\n }\n\n // Create symlink\n try {\n execSync(`ln -s \"${sourcePath}\" \"${targetPath}\"`, {\n encoding: 'utf-8',\n });\n console.log(chalk.green(` [OK] ${plugin}`));\n installed++;\n } catch (err) {\n console.log(\n chalk.red(` [ERROR] ${plugin} - ${(err as Error).message}`)\n );\n }\n }\n\n console.log('');\n if (installed > 0) {\n console.log(chalk.green(`Installed ${installed} plugin(s)`));\n console.log(chalk.gray('\\nAvailable commands in Claude Code:'));\n console.log(\n chalk.white(' /sm-status ') +\n chalk.gray('Show StackMemory status')\n );\n console.log(\n chalk.white(' /sm-capture ') +\n chalk.gray('Capture work for handoff')\n );\n console.log(\n chalk.white(' /sm-restore ') +\n chalk.gray('Restore from last handoff')\n );\n console.log(\n chalk.white(' /sm-decision ') + chalk.gray('Record a decision')\n );\n console.log(\n chalk.white(' /sm-help ') + chalk.gray('Show all commands')\n );\n console.log(\n chalk.white(' /ralph-loop ') +\n chalk.gray('Start Ralph iteration loop')\n );\n } else {\n console.log(chalk.yellow('No plugins installed'));\n }\n });\n\n return cmd;\n}\n\n/**\n * Create setup-remote command for remote MCP server auto-start\n */\nexport function createSetupRemoteCommand(): Command {\n const cmd = new Command('setup-remote');\n\n cmd\n .description('Configure remote MCP server to auto-start on boot')\n .option('--port <number>', 'Port for remote server', '3847')\n .option('--project <path>', 'Project root directory')\n .option('--uninstall', 'Remove the auto-start service')\n .option('--status', 'Check service status')\n .action(async (options) => {\n const home = homedir();\n const platform = process.platform;\n\n // Service configuration\n const serviceName =\n platform === 'darwin'\n ? 'com.stackmemory.remote-mcp'\n : 'stackmemory-remote-mcp';\n const serviceDir =\n platform === 'darwin'\n ? join(home, 'Library', 'LaunchAgents')\n : join(home, '.config', 'systemd', 'user');\n const serviceFile =\n platform === 'darwin'\n ? join(serviceDir, `${serviceName}.plist`)\n : join(serviceDir, `${serviceName}.service`);\n const logDir = join(home, '.stackmemory', 'logs');\n const pidFile = join(home, '.stackmemory', 'remote-mcp.pid');\n\n // Handle status check\n if (options.status) {\n console.log(chalk.cyan('\\nRemote MCP Server Status\\n'));\n\n if (platform === 'darwin') {\n try {\n const result = execSync(\n `launchctl list | grep ${serviceName} || true`,\n { encoding: 'utf-8' }\n );\n if (result.includes(serviceName)) {\n console.log(chalk.green('[RUNNING]') + ' Service is active');\n try {\n const health = execSync(\n `curl -s http://localhost:${options.port}/health 2>/dev/null`,\n { encoding: 'utf-8' }\n );\n const data = JSON.parse(health);\n console.log(chalk.gray(` Project: ${data.projectId}`));\n console.log(\n chalk.gray(` URL: http://localhost:${options.port}/sse`)\n );\n } catch {\n console.log(\n chalk.yellow(' Server not responding to health check')\n );\n }\n } else {\n console.log(chalk.yellow('[STOPPED]') + ' Service not running');\n }\n } catch {\n console.log(chalk.yellow('[UNKNOWN]') + ' Could not check status');\n }\n } else if (platform === 'linux') {\n try {\n execSync(`systemctl --user is-active ${serviceName}`, {\n stdio: 'pipe',\n });\n console.log(chalk.green('[RUNNING]') + ' Service is active');\n } catch {\n console.log(chalk.yellow('[STOPPED]') + ' Service not running');\n }\n }\n\n console.log(chalk.gray(`\\nService file: ${serviceFile}`));\n console.log(chalk.gray(`Logs: ${logDir}/remote-mcp.log`));\n return;\n }\n\n // Handle uninstall\n if (options.uninstall) {\n console.log(chalk.cyan('\\nUninstalling Remote MCP Server Service\\n'));\n\n if (platform === 'darwin') {\n try {\n execSync(`launchctl unload \"${serviceFile}\"`, { stdio: 'pipe' });\n console.log(chalk.green('[OK]') + ' Service unloaded');\n } catch {\n console.log(chalk.gray('[SKIP]') + ' Service was not loaded');\n }\n\n if (existsSync(serviceFile)) {\n const fs = await import('fs/promises');\n await fs.unlink(serviceFile);\n console.log(chalk.green('[OK]') + ' Service file removed');\n }\n } else if (platform === 'linux') {\n try {\n execSync(`systemctl --user stop ${serviceName}`, { stdio: 'pipe' });\n execSync(`systemctl --user disable ${serviceName}`, {\n stdio: 'pipe',\n });\n console.log(chalk.green('[OK]') + ' Service stopped and disabled');\n } catch {\n console.log(chalk.gray('[SKIP]') + ' Service was not running');\n }\n\n if (existsSync(serviceFile)) {\n const fs = await import('fs/promises');\n await fs.unlink(serviceFile);\n execSync('systemctl --user daemon-reload', { stdio: 'pipe' });\n console.log(chalk.green('[OK]') + ' Service file removed');\n }\n }\n\n console.log(chalk.green('\\nRemote MCP service uninstalled'));\n return;\n }\n\n // Install service\n console.log(chalk.cyan('\\nSetting up Remote MCP Server Auto-Start\\n'));\n\n if (platform !== 'darwin' && platform !== 'linux') {\n console.log(\n chalk.red('Auto-start is only supported on macOS and Linux')\n );\n console.log(chalk.gray('\\nManual start: stackmemory mcp-remote'));\n return;\n }\n\n // Create directories\n if (!existsSync(serviceDir)) {\n mkdirSync(serviceDir, { recursive: true });\n }\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true });\n }\n\n // Find node and stackmemory paths\n let nodePath: string;\n try {\n nodePath = execSync('which node', { encoding: 'utf-8' }).trim();\n } catch {\n nodePath = '/usr/local/bin/node';\n }\n\n // Find stackmemory CLI path\n let stackmemoryPath: string;\n try {\n stackmemoryPath = execSync('which stackmemory', {\n encoding: 'utf-8',\n }).trim();\n } catch {\n // Try npm global path\n try {\n const npmRoot = execSync('npm root -g', { encoding: 'utf-8' }).trim();\n stackmemoryPath = join(\n npmRoot,\n '@stackmemoryai',\n 'stackmemory',\n 'dist',\n 'cli',\n 'index.js'\n );\n } catch {\n stackmemoryPath = 'npx stackmemory';\n }\n }\n\n const projectPath = options.project || home;\n const port = options.port || '3847';\n\n if (platform === 'darwin') {\n // Generate macOS launchd plist\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${serviceName}</string>\n\n <key>ProgramArguments</key>\n <array>\n <string>${stackmemoryPath.includes('npx') ? 'npx' : nodePath}</string>\n ${stackmemoryPath.includes('npx') ? '<string>stackmemory</string>' : `<string>${stackmemoryPath}</string>`}\n <string>mcp-remote</string>\n <string>--port</string>\n <string>${port}</string>\n <string>--project</string>\n <string>${projectPath}</string>\n </array>\n\n <key>RunAtLoad</key>\n <true/>\n\n <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n\n <key>WorkingDirectory</key>\n <string>${projectPath}</string>\n\n <key>StandardOutPath</key>\n <string>${logDir}/remote-mcp.log</string>\n\n <key>StandardErrorPath</key>\n <string>${logDir}/remote-mcp.error.log</string>\n\n <key>EnvironmentVariables</key>\n <dict>\n <key>HOME</key>\n <string>${home}</string>\n <key>PATH</key>\n <string>/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin</string>\n <key>NODE_ENV</key>\n <string>production</string>\n </dict>\n\n <key>ThrottleInterval</key>\n <integer>10</integer>\n</dict>\n</plist>`;\n\n writeFileSync(serviceFile, plist);\n console.log(chalk.green('[OK]') + ' Created launchd service file');\n\n // Unload if already loaded\n try {\n execSync(`launchctl unload \"${serviceFile}\" 2>/dev/null`, {\n stdio: 'pipe',\n });\n } catch {\n // Not loaded, ignore\n }\n\n // Load the service\n try {\n execSync(`launchctl load -w \"${serviceFile}\"`, { stdio: 'pipe' });\n console.log(chalk.green('[OK]') + ' Service loaded and started');\n } catch (err) {\n console.log(chalk.red('[ERROR]') + ` Failed to load service: ${err}`);\n return;\n }\n } else if (platform === 'linux') {\n // Generate systemd service\n const service = `[Unit]\nDescription=StackMemory Remote MCP Server\nDocumentation=https://github.com/stackmemoryai/stackmemory\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=${stackmemoryPath.includes('npx') ? 'npx stackmemory' : `${nodePath} ${stackmemoryPath}`} mcp-remote --port ${port} --project ${projectPath}\nRestart=on-failure\nRestartSec=10\nWorkingDirectory=${projectPath}\n\nEnvironment=HOME=${home}\nEnvironment=PATH=/usr/local/bin:/usr/bin:/bin\nEnvironment=NODE_ENV=production\n\nStandardOutput=append:${logDir}/remote-mcp.log\nStandardError=append:${logDir}/remote-mcp.error.log\n\n[Install]\nWantedBy=default.target`;\n\n writeFileSync(serviceFile, service);\n console.log(chalk.green('[OK]') + ' Created systemd service file');\n\n try {\n execSync('systemctl --user daemon-reload', { stdio: 'pipe' });\n execSync(`systemctl --user enable ${serviceName}`, { stdio: 'pipe' });\n execSync(`systemctl --user start ${serviceName}`, { stdio: 'pipe' });\n console.log(chalk.green('[OK]') + ' Service enabled and started');\n } catch (err) {\n console.log(\n chalk.red('[ERROR]') + ` Failed to start service: ${err}`\n );\n return;\n }\n }\n\n // Verify it's running\n console.log(chalk.cyan('\\nVerifying server...\\n'));\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n try {\n const health = execSync(\n `curl -s http://localhost:${port}/health 2>/dev/null`,\n { encoding: 'utf-8' }\n );\n const data = JSON.parse(health);\n console.log(chalk.green('[OK]') + ' Server is running');\n console.log(chalk.gray(` Project: ${data.projectId}`));\n } catch {\n console.log(\n chalk.yellow('[WARN]') +\n ' Server not responding yet (may still be starting)'\n );\n }\n\n console.log(\n chalk.green('\\nRemote MCP Server configured for auto-start!')\n );\n console.log(chalk.cyan('\\nConnection info:'));\n console.log(chalk.white(` URL: http://localhost:${port}/sse`));\n console.log(chalk.white(` Health: http://localhost:${port}/health`));\n console.log(chalk.gray(`\\nLogs: ${logDir}/remote-mcp.log`));\n console.log(chalk.gray(`Service: ${serviceFile}`));\n console.log(chalk.cyan('\\nFor external access (ngrok):'));\n console.log(chalk.white(` ngrok http ${port}`));\n console.log(chalk.gray(' Then use the ngrok URL + /sse in Claude.ai'));\n });\n\n return cmd;\n}\n\n/**\n * Register setup commands\n */\nexport function registerSetupCommands(program: Command): void {\n program.addCommand(createSetupMCPCommand());\n program.addCommand(createDoctorCommand());\n program.addCommand(createSetupPluginsCommand());\n program.addCommand(createSetupRemoteCommand());\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -17,7 +17,7 @@ import { UpdateChecker } from "../core/utils/update-checker.js";
17
17
  import { ProgressTracker } from "../core/monitoring/progress-tracker.js";
18
18
  import { registerProjectCommands } from "./commands/projects.js";
19
19
  import { createSessionCommands } from "./commands/session.js";
20
- import { isFeatureEnabled, isLocalOnly } from "../core/config/feature-flags.js";
20
+ import { isFeatureEnabled } from "../core/config/feature-flags.js";
21
21
  import { registerWorktreeCommands } from "./commands/worktree.js";
22
22
  import { registerOnboardingCommand } from "./commands/onboard.js";
23
23
  import { createTaskCommands } from "./commands/tasks.js";
@@ -46,7 +46,6 @@ import { createShellCommand } from "./commands/shell.js";
46
46
  import { createAPICommand } from "./commands/api.js";
47
47
  import { createCleanupProcessesCommand } from "./commands/cleanup-processes.js";
48
48
  import { createAutoBackgroundCommand } from "./commands/auto-background.js";
49
- import { createSettingsCommand } from "./commands/settings.js";
50
49
  import { createRetrievalCommands } from "./commands/retrieval.js";
51
50
  import { createDiscoveryCommands } from "./commands/discovery.js";
52
51
  import { createModelCommand } from "./commands/model.js";
@@ -61,8 +60,6 @@ import { join } from "path";
61
60
  import { existsSync, mkdirSync } from "fs";
62
61
  import inquirer from "inquirer";
63
62
  import { enableChromaDB } from "../core/config/storage-config.js";
64
- import { spawn } from "child_process";
65
- import { homedir } from "os";
66
63
  import { createRequire } from "module";
67
64
  import { fileURLToPath } from "url";
68
65
  import * as pathModule from "path";
@@ -91,64 +88,6 @@ function isTestEnv() {
91
88
  }
92
89
  UpdateChecker.checkForUpdates(VERSION, true).catch(() => {
93
90
  });
94
- async function startNotificationServices() {
95
- if (isLocalOnly() || !isFeatureEnabled("whatsapp")) return;
96
- try {
97
- const { loadSMSConfig } = await import("../hooks/sms-notify.js");
98
- const config = loadSMSConfig();
99
- if (!config.enabled) return;
100
- const WEBHOOK_PORT = 3456;
101
- let webhookStarted = false;
102
- let ngrokStarted = false;
103
- const webhookRunning = await fetch(
104
- `http://localhost:${WEBHOOK_PORT}/health`
105
- ).then((r) => r.ok).catch(() => false);
106
- if (!webhookRunning) {
107
- const webhookPath = join(__dirname, "../hooks/sms-webhook.js");
108
- const webhookProcess = spawn("node", [webhookPath], {
109
- detached: true,
110
- stdio: "ignore",
111
- env: { ...process.env, SMS_WEBHOOK_PORT: String(WEBHOOK_PORT) }
112
- });
113
- webhookProcess.unref();
114
- webhookStarted = true;
115
- }
116
- const ngrokRunning = await fetch("http://localhost:4040/api/tunnels").then((r) => r.ok).catch(() => false);
117
- if (!ngrokRunning) {
118
- const ngrokProcess = spawn("ngrok", ["http", String(WEBHOOK_PORT)], {
119
- detached: true,
120
- stdio: "ignore"
121
- });
122
- ngrokProcess.unref();
123
- ngrokStarted = true;
124
- }
125
- if (webhookStarted || ngrokStarted) {
126
- setTimeout(async () => {
127
- try {
128
- const tunnels = await fetch("http://localhost:4040/api/tunnels").then(
129
- (r) => r.json()
130
- );
131
- const publicUrl = tunnels?.tunnels?.[0]?.public_url;
132
- if (publicUrl) {
133
- const configDir = join(homedir(), ".stackmemory");
134
- const configPath = join(configDir, "ngrok-url.txt");
135
- const { writeFileSync, mkdirSync: mkdirSync2, existsSync: existsSync2 } = await import("fs");
136
- if (!existsSync2(configDir)) {
137
- mkdirSync2(configDir, { recursive: true });
138
- }
139
- writeFileSync(configPath, publicUrl);
140
- console.log(
141
- chalk.gray(`[notify] Webhook: ${publicUrl}/sms/incoming`)
142
- );
143
- }
144
- } catch {
145
- }
146
- }, 4e3);
147
- }
148
- } catch {
149
- }
150
- }
151
- startNotificationServices();
152
91
  program.name("stackmemory").description(
153
92
  "Lossless memory runtime for AI coding tools - organizes context as a call stack instead of linear chat logs, with team collaboration and infinite retention"
154
93
  ).version(VERSION);
@@ -604,16 +543,7 @@ program.addCommand(createShellCommand());
604
543
  program.addCommand(createAPICommand());
605
544
  program.addCommand(createCleanupProcessesCommand());
606
545
  program.addCommand(createAutoBackgroundCommand());
607
- program.addCommand(createSettingsCommand());
608
546
  program.addCommand(createPingCommand());
609
- if (isFeatureEnabled("whatsapp")) {
610
- lazyCommands.push(
611
- import("./commands/sms-notify.js").then(
612
- ({ createSMSNotifyCommand }) => program.addCommand(createSMSNotifyCommand())
613
- ).catch(() => {
614
- })
615
- );
616
- }
617
547
  program.addCommand(createRetrievalCommands());
618
548
  program.addCommand(createDiscoveryCommands());
619
549
  program.addCommand(createModelCommand());