@stackmemoryai/stackmemory 0.5.54 → 0.5.56

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.
@@ -315,13 +315,121 @@ function createDoctorCommand() {
315
315
  }
316
316
  });
317
317
  }
318
+ function createSetupPluginsCommand() {
319
+ const cmd = new Command("setup-plugins");
320
+ cmd.description("Install StackMemory plugins for Claude Code").option("--force", "Overwrite existing plugins").action(async (options) => {
321
+ console.log(
322
+ chalk.cyan("Installing StackMemory plugins for Claude Code...\n")
323
+ );
324
+ const pluginsDir = join(CLAUDE_DIR, "plugins");
325
+ if (!existsSync(pluginsDir)) {
326
+ mkdirSync(pluginsDir, { recursive: true });
327
+ console.log(chalk.gray(`Created: ${pluginsDir}`));
328
+ }
329
+ const possiblePaths = [
330
+ join(process.cwd(), "plugins"),
331
+ join(__dirname, "..", "..", "..", "plugins"),
332
+ join(homedir(), ".stackmemory", "plugins")
333
+ ];
334
+ try {
335
+ const globalRoot = execSync("npm root -g", {
336
+ encoding: "utf-8"
337
+ }).trim();
338
+ possiblePaths.push(
339
+ join(globalRoot, "@stackmemoryai", "stackmemory", "plugins")
340
+ );
341
+ } catch {
342
+ }
343
+ let sourcePluginsDir;
344
+ for (const p of possiblePaths) {
345
+ if (existsSync(p) && existsSync(join(p, "stackmemory"))) {
346
+ sourcePluginsDir = p;
347
+ break;
348
+ }
349
+ }
350
+ if (!sourcePluginsDir) {
351
+ console.log(chalk.red("Could not find StackMemory plugins directory"));
352
+ console.log(chalk.gray("Searched:"));
353
+ possiblePaths.forEach((p) => console.log(chalk.gray(` - ${p}`)));
354
+ process.exit(1);
355
+ }
356
+ console.log(chalk.gray(`Source: ${sourcePluginsDir}
357
+ `));
358
+ const plugins = ["stackmemory", "ralph-wiggum"];
359
+ let installed = 0;
360
+ for (const plugin of plugins) {
361
+ const sourcePath = join(sourcePluginsDir, plugin);
362
+ const targetPath = join(pluginsDir, plugin);
363
+ if (!existsSync(sourcePath)) {
364
+ console.log(chalk.yellow(` [SKIP] ${plugin} - not found in source`));
365
+ continue;
366
+ }
367
+ if (existsSync(targetPath)) {
368
+ if (options.force) {
369
+ try {
370
+ execSync(`rm -rf "${targetPath}"`, { encoding: "utf-8" });
371
+ } catch {
372
+ console.log(
373
+ chalk.red(` [ERROR] ${plugin} - could not remove existing`)
374
+ );
375
+ continue;
376
+ }
377
+ } else {
378
+ console.log(
379
+ chalk.gray(` [EXISTS] ${plugin} - use --force to overwrite`)
380
+ );
381
+ continue;
382
+ }
383
+ }
384
+ try {
385
+ execSync(`ln -s "${sourcePath}" "${targetPath}"`, {
386
+ encoding: "utf-8"
387
+ });
388
+ console.log(chalk.green(` [OK] ${plugin}`));
389
+ installed++;
390
+ } catch (err) {
391
+ console.log(
392
+ chalk.red(` [ERROR] ${plugin} - ${err.message}`)
393
+ );
394
+ }
395
+ }
396
+ console.log("");
397
+ if (installed > 0) {
398
+ console.log(chalk.green(`Installed ${installed} plugin(s)`));
399
+ console.log(chalk.gray("\nAvailable commands in Claude Code:"));
400
+ console.log(
401
+ chalk.white(" /sm-status ") + chalk.gray("Show StackMemory status")
402
+ );
403
+ console.log(
404
+ chalk.white(" /sm-capture ") + chalk.gray("Capture work for handoff")
405
+ );
406
+ console.log(
407
+ chalk.white(" /sm-restore ") + chalk.gray("Restore from last handoff")
408
+ );
409
+ console.log(
410
+ chalk.white(" /sm-decision ") + chalk.gray("Record a decision")
411
+ );
412
+ console.log(
413
+ chalk.white(" /sm-help ") + chalk.gray("Show all commands")
414
+ );
415
+ console.log(
416
+ chalk.white(" /ralph-loop ") + chalk.gray("Start Ralph iteration loop")
417
+ );
418
+ } else {
419
+ console.log(chalk.yellow("No plugins installed"));
420
+ }
421
+ });
422
+ return cmd;
423
+ }
318
424
  function registerSetupCommands(program) {
319
425
  program.addCommand(createSetupMCPCommand());
320
426
  program.addCommand(createDoctorCommand());
427
+ program.addCommand(createSetupPluginsCommand());
321
428
  }
322
429
  export {
323
430
  createDoctorCommand,
324
431
  createSetupMCPCommand,
432
+ createSetupPluginsCommand,
325
433
  registerSetupCommands
326
434
  };
327
435
  //# sourceMappingURL=setup.js.map
@@ -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 * Register setup commands\n */\nexport function registerSetupCommands(program: Command): void {\n program.addCommand(createSetupMCPCommand());\n program.addCommand(createDoctorCommand());\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 { 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 * Register setup commands\n */\nexport function registerSetupCommands(program: Command): void {\n program.addCommand(createSetupMCPCommand());\n program.addCommand(createDoctorCommand());\n program.addCommand(createSetupPluginsCommand());\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/context/stack-merge-resolver.ts"],
4
- "sourcesContent": ["/**\n * Stack Merge Conflict Resolution - STA-101\n * Advanced conflict resolution for frame merging between individual and shared stacks\n */\n\nimport type { Frame, Event, Anchor } from './frame-types.js';\nimport {\n DualStackManager,\n type StackSyncResult,\n} from './dual-stack-manager.js';\nimport { logger } from '../monitoring/logger.js';\nimport { ValidationError, DatabaseError, ErrorCode } from '../errors/index.js';\nimport {\n validateInput,\n StartMergeSessionSchema,\n CreateMergePolicySchema,\n ConflictResolutionSchema,\n type StartMergeSessionInput,\n type CreateMergePolicyInput,\n type ConflictResolutionInput,\n} from './validation.js';\n\nexport interface MergeConflict {\n frameId: string;\n conflictType:\n | 'content'\n | 'metadata'\n | 'sequence'\n | 'dependency'\n | 'permission';\n sourceFrame: Frame;\n targetFrame: Frame;\n conflictDetails: {\n field: string;\n sourceValue: any;\n targetValue: any;\n lastModified: {\n source: Date;\n target: Date;\n };\n }[];\n severity: 'low' | 'medium' | 'high' | 'critical';\n autoResolvable: boolean;\n}\n\nexport interface MergeResolution {\n conflictId: string;\n strategy: 'source_wins' | 'target_wins' | 'merge_both' | 'manual' | 'skip';\n resolutionData?: Record<string, any>;\n resolvedBy: string;\n resolvedAt: Date;\n notes?: string;\n}\n\nexport interface MergePolicy {\n name: string;\n description: string;\n rules: Array<{\n condition: string; // JSONPath expression\n action: 'source_wins' | 'target_wins' | 'merge_both' | 'require_manual';\n priority: number;\n }>;\n autoApplyThreshold: 'low' | 'medium' | 'high' | 'never';\n}\n\nexport interface MergeSession {\n sessionId: string;\n sourceStackId: string;\n targetStackId: string;\n conflicts: MergeConflict[];\n resolutions: MergeResolution[];\n policy: MergePolicy;\n status: 'analyzing' | 'resolving' | 'completed' | 'failed' | 'manual_review';\n startedAt: Date;\n completedAt?: Date;\n metadata: {\n totalFrames: number;\n conflictFrames: number;\n autoResolvedConflicts: number;\n manualResolvedConflicts: number;\n };\n}\n\nexport class StackMergeResolver {\n private dualStackManager: DualStackManager;\n private activeSessions: Map<string, MergeSession> = new Map();\n private mergePolicies: Map<string, MergePolicy> = new Map();\n\n constructor(dualStackManager: DualStackManager) {\n this.dualStackManager = dualStackManager;\n this.initializeDefaultPolicies();\n logger.debug('StackMergeResolver initialized', {\n policies: Array.from(this.mergePolicies.keys()),\n });\n }\n\n /**\n * Start a merge session with conflict analysis\n */\n async startMergeSession(\n sourceStackId: string,\n targetStackId: string,\n frameIds?: string[],\n policyName: string = 'default'\n ): Promise<string> {\n // Validate input parameters\n const input = validateInput(StartMergeSessionSchema, {\n sourceStackId,\n targetStackId,\n frameIds,\n policyName,\n });\n const sessionId = `merge-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n logger.debug('Looking for merge policy', {\n policyName: input.policyName,\n availablePolicies: Array.from(this.mergePolicies.keys()),\n });\n const policy = this.mergePolicies.get(input.policyName);\n if (!policy) {\n logger.error('Merge policy not found', {\n requested: input.policyName,\n available: Array.from(this.mergePolicies.keys()),\n });\n throw new ValidationError(\n `Merge policy not found: ${input.policyName}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n try {\n // Check merge permissions on both stacks\n const currentUserId =\n this.dualStackManager.getCurrentContext().ownerId || 'unknown';\n await this.dualStackManager\n .getPermissionManager()\n .enforcePermission(\n this.dualStackManager\n .getPermissionManager()\n .createContext(currentUserId, 'merge', 'stack', input.sourceStackId)\n );\n\n await this.dualStackManager\n .getPermissionManager()\n .enforcePermission(\n this.dualStackManager\n .getPermissionManager()\n .createContext(currentUserId, 'merge', 'stack', input.targetStackId)\n );\n\n // Create merge session\n const session: MergeSession = {\n sessionId,\n sourceStackId: input.sourceStackId,\n targetStackId: input.targetStackId,\n conflicts: [],\n resolutions: [],\n policy,\n status: 'analyzing',\n startedAt: new Date(),\n metadata: {\n totalFrames: 0,\n conflictFrames: 0,\n autoResolvedConflicts: 0,\n manualResolvedConflicts: 0,\n },\n };\n\n this.activeSessions.set(sessionId, session);\n\n // Analyze conflicts\n await this.analyzeConflicts(sessionId, frameIds);\n\n // Auto-resolve conflicts where possible\n await this.autoResolveConflicts(sessionId);\n\n logger.info(`Merge session started: ${sessionId}`, {\n sourceStack: sourceStackId,\n targetStack: targetStackId,\n conflicts: session.conflicts.length,\n policy: policyName,\n });\n\n return sessionId;\n } catch (error: unknown) {\n logger.error('Failed to start merge session', {\n error: error instanceof Error ? error.message : error,\n sourceStackId: input.sourceStackId,\n targetStackId: input.targetStackId,\n policyName: input.policyName,\n });\n throw new DatabaseError(\n 'Failed to start merge session',\n ErrorCode.OPERATION_FAILED,\n { sourceStackId, targetStackId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Analyze conflicts between source and target stacks\n */\n private async analyzeConflicts(\n sessionId: string,\n frameIds?: string[]\n ): Promise<void> {\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new DatabaseError(\n `Merge session not found: ${sessionId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n try {\n const sourceStack = this.getStackManager(session.sourceStackId);\n const targetStack = this.getStackManager(session.targetStackId);\n\n // Get frames to analyze\n const framesToAnalyze =\n frameIds ||\n (await sourceStack.getActiveFrames()).map((f) => f.frame_id);\n\n session.metadata.totalFrames = framesToAnalyze.length;\n\n for (const frameId of framesToAnalyze) {\n const sourceFrame = await sourceStack.getFrame(frameId);\n if (!sourceFrame) continue;\n\n const targetFrame = await targetStack.getFrame(frameId);\n if (!targetFrame) continue; // No conflict if target doesn't exist\n\n // Analyze frame-level conflicts\n const conflicts = await this.analyzeFrameConflicts(\n sourceFrame,\n targetFrame\n );\n session.conflicts.push(...conflicts);\n }\n\n session.metadata.conflictFrames = new Set(\n session.conflicts.map((c) => c.frameId)\n ).size;\n session.status = 'resolving';\n\n this.activeSessions.set(sessionId, session);\n\n logger.info(`Conflict analysis completed: ${sessionId}`, {\n totalConflicts: session.conflicts.length,\n conflictFrames: session.metadata.conflictFrames,\n });\n } catch (error: unknown) {\n session.status = 'failed';\n this.activeSessions.set(sessionId, session);\n throw error;\n }\n }\n\n /**\n * Analyze conflicts within a single frame\n */\n private async analyzeFrameConflicts(\n sourceFrame: Frame,\n targetFrame: Frame\n ): Promise<MergeConflict[]> {\n const conflicts: MergeConflict[] = [];\n\n // Content conflicts\n if (sourceFrame.name !== targetFrame.name) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'name',\n sourceValue: sourceFrame.name,\n targetValue: targetFrame.name,\n lastModified: {\n source: new Date(sourceFrame.created_at * 1000),\n target: new Date(targetFrame.created_at * 1000),\n },\n },\n ],\n severity: 'medium',\n autoResolvable: false,\n });\n }\n\n // State conflicts\n if (sourceFrame.state !== targetFrame.state) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'metadata',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'state',\n sourceValue: sourceFrame.state,\n targetValue: targetFrame.state,\n lastModified: {\n source: new Date(sourceFrame.created_at * 1000),\n target: new Date(targetFrame.created_at * 1000),\n },\n },\n ],\n severity: 'high',\n autoResolvable: true, // Can auto-resolve based on timestamps\n });\n }\n\n // Input/Output conflicts\n if (\n JSON.stringify(sourceFrame.inputs) !== JSON.stringify(targetFrame.inputs)\n ) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'inputs',\n sourceValue: sourceFrame.inputs,\n targetValue: targetFrame.inputs,\n lastModified: {\n source: new Date(sourceFrame.created_at * 1000),\n target: new Date(targetFrame.created_at * 1000),\n },\n },\n ],\n severity: 'medium',\n autoResolvable: false,\n });\n }\n\n // Analyze event conflicts\n const eventConflicts = await this.analyzeEventConflicts(\n sourceFrame,\n targetFrame\n );\n conflicts.push(...eventConflicts);\n\n // Analyze anchor conflicts\n const anchorConflicts = await this.analyzeAnchorConflicts(\n sourceFrame,\n targetFrame\n );\n conflicts.push(...anchorConflicts);\n\n return conflicts;\n }\n\n /**\n * Analyze conflicts in frame events\n */\n private async analyzeEventConflicts(\n sourceFrame: Frame,\n targetFrame: Frame\n ): Promise<MergeConflict[]> {\n const conflicts: MergeConflict[] = [];\n\n try {\n const sourceStack = this.getStackManager(sourceFrame.project_id);\n const targetStack = this.getStackManager(targetFrame.project_id);\n\n const sourceEvents = await sourceStack.getFrameEvents(\n sourceFrame.frame_id\n );\n const targetEvents = await targetStack.getFrameEvents(\n targetFrame.frame_id\n );\n\n // Check for sequence conflicts\n if (sourceEvents.length !== targetEvents.length) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'sequence',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'event_count',\n sourceValue: sourceEvents.length,\n targetValue: targetEvents.length,\n lastModified: {\n source: new Date(),\n target: new Date(),\n },\n },\n ],\n severity: 'high',\n autoResolvable: true, // Can merge events\n });\n }\n\n // Check for content conflicts in matching events\n const minLength = Math.min(sourceEvents.length, targetEvents.length);\n for (let i = 0; i < minLength; i++) {\n const sourceEvent = sourceEvents[i];\n const targetEvent = targetEvents[i];\n\n if (\n sourceEvent.text !== targetEvent.text ||\n JSON.stringify(sourceEvent.metadata) !==\n JSON.stringify(targetEvent.metadata)\n ) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: `event_${i}`,\n sourceValue: {\n text: sourceEvent.text,\n metadata: sourceEvent.metadata,\n },\n targetValue: {\n text: targetEvent.text,\n metadata: targetEvent.metadata,\n },\n lastModified: {\n source: new Date(),\n target: new Date(),\n },\n },\n ],\n severity: 'medium',\n autoResolvable: false,\n });\n }\n }\n } catch (error: unknown) {\n logger.warn(\n `Failed to analyze event conflicts for frame: ${sourceFrame.frame_id}`,\n error\n );\n }\n\n return conflicts;\n }\n\n /**\n * Analyze conflicts in frame anchors\n */\n private async analyzeAnchorConflicts(\n sourceFrame: Frame,\n targetFrame: Frame\n ): Promise<MergeConflict[]> {\n const conflicts: MergeConflict[] = [];\n\n try {\n const sourceStack = this.getStackManager(sourceFrame.project_id);\n const targetStack = this.getStackManager(targetFrame.project_id);\n\n const sourceAnchors = await sourceStack.getFrameAnchors(\n sourceFrame.frame_id\n );\n const targetAnchors = await targetStack.getFrameAnchors(\n targetFrame.frame_id\n );\n\n // Group anchors by type for comparison\n const sourceAnchorsByType = this.groupAnchorsByType(sourceAnchors);\n const targetAnchorsByType = this.groupAnchorsByType(targetAnchors);\n\n const allTypes = new Set([\n ...Object.keys(sourceAnchorsByType),\n ...Object.keys(targetAnchorsByType),\n ]);\n\n for (const type of allTypes) {\n const sourceTypeAnchors = sourceAnchorsByType[type] || [];\n const targetTypeAnchors = targetAnchorsByType[type] || [];\n\n if (\n sourceTypeAnchors.length !== targetTypeAnchors.length ||\n !this.anchorsEqual(sourceTypeAnchors, targetTypeAnchors)\n ) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: `anchors_${type}`,\n sourceValue: sourceTypeAnchors,\n targetValue: targetTypeAnchors,\n lastModified: {\n source: new Date(),\n target: new Date(),\n },\n },\n ],\n severity: 'low',\n autoResolvable: true, // Can merge anchors\n });\n }\n }\n } catch (error: unknown) {\n logger.warn(\n `Failed to analyze anchor conflicts for frame: ${sourceFrame.frame_id}`,\n error\n );\n }\n\n return conflicts;\n }\n\n /**\n * Auto-resolve conflicts based on merge policy\n */\n private async autoResolveConflicts(sessionId: string): Promise<void> {\n const session = this.activeSessions.get(sessionId);\n if (!session) return;\n\n const autoResolvableConflicts = session.conflicts.filter(\n (c) => c.autoResolvable\n );\n\n for (const conflict of autoResolvableConflicts) {\n const resolution = await this.applyMergePolicy(conflict, session.policy);\n if (resolution) {\n session.resolutions.push(resolution);\n session.metadata.autoResolvedConflicts++;\n\n logger.debug(`Auto-resolved conflict: ${conflict.frameId}`, {\n type: conflict.conflictType,\n strategy: resolution.strategy,\n });\n }\n }\n\n // Update session status\n const remainingConflicts = session.conflicts.filter(\n (c) => !session.resolutions.find((r) => r.conflictId === c.frameId)\n );\n\n if (remainingConflicts.length === 0) {\n session.status = 'completed';\n session.completedAt = new Date();\n } else if (remainingConflicts.every((c) => !c.autoResolvable)) {\n session.status = 'manual_review';\n }\n\n this.activeSessions.set(sessionId, session);\n }\n\n /**\n * Apply merge policy to resolve conflicts automatically\n */\n private async applyMergePolicy(\n conflict: MergeConflict,\n policy: MergePolicy\n ): Promise<MergeResolution | null> {\n // Sort rules by priority\n const sortedRules = policy.rules.sort((a, b) => b.priority - a.priority);\n\n for (const rule of sortedRules) {\n if (this.evaluateRuleCondition(conflict, rule.condition)) {\n return {\n conflictId: conflict.frameId,\n strategy:\n rule.action === 'require_manual' ? 'manual' : (rule.action as any),\n resolvedBy: 'system',\n resolvedAt: new Date(),\n notes: `Auto-resolved by policy: ${policy.name}`,\n };\n }\n }\n\n return null;\n }\n\n /**\n * Manually resolve a specific conflict\n */\n async resolveConflict(\n sessionId: string,\n conflictId: string,\n resolution: Omit<MergeResolution, 'conflictId' | 'resolvedAt'>\n ): Promise<void> {\n // Validate input parameters\n const input = validateInput(ConflictResolutionSchema, {\n strategy: resolution.strategy,\n resolvedBy: resolution.resolvedBy,\n notes: resolution.notes,\n });\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new ValidationError(\n `Merge session not found: ${sessionId}`,\n ErrorCode.MERGE_SESSION_INVALID\n );\n }\n\n const conflict = session.conflicts.find((c) => c.frameId === conflictId);\n if (!conflict) {\n throw new ValidationError(\n `Conflict not found: ${conflictId}`,\n ErrorCode.MERGE_CONFLICT_UNRESOLVABLE\n );\n }\n\n const fullResolution: MergeResolution = {\n ...input,\n conflictId,\n resolvedAt: new Date(),\n };\n\n session.resolutions.push(fullResolution);\n session.metadata.manualResolvedConflicts++;\n\n // Check if all conflicts are resolved\n const resolvedConflictIds = new Set(\n session.resolutions.map((r) => r.conflictId)\n );\n const allResolved = session.conflicts.every((c) =>\n resolvedConflictIds.has(c.frameId)\n );\n\n if (allResolved) {\n session.status = 'completed';\n session.completedAt = new Date();\n }\n\n this.activeSessions.set(sessionId, session);\n\n logger.info(`Conflict manually resolved: ${conflictId}`, {\n strategy: resolution.strategy,\n resolvedBy: resolution.resolvedBy,\n });\n }\n\n /**\n * Execute merge with resolved conflicts\n */\n async executeMerge(sessionId: string): Promise<StackSyncResult> {\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new DatabaseError(\n `Merge session not found: ${sessionId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n if (session.status !== 'completed') {\n throw new DatabaseError(\n `Merge session not ready for execution: ${session.status}`,\n ErrorCode.INVALID_STATE\n );\n }\n\n try {\n // Build resolution map\n const resolutionMap = new Map(\n session.resolutions.map((r) => [r.conflictId, r])\n );\n\n // Execute sync with custom conflict resolution\n const result = await this.dualStackManager.syncStacks(\n session.sourceStackId,\n session.targetStackId,\n {\n conflictResolution: 'merge', // Will be overridden by our resolution map\n frameIds: session.conflicts.map((c) => c.frameId),\n }\n );\n\n logger.info(`Merge executed: ${sessionId}`, {\n mergedFrames: result.mergedFrames.length,\n conflicts: result.conflictFrames.length,\n errors: result.errors.length,\n });\n\n return result;\n } catch (error: unknown) {\n throw new DatabaseError(\n 'Failed to execute merge',\n ErrorCode.OPERATION_FAILED,\n { sessionId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get merge session details\n */\n async getMergeSession(sessionId: string): Promise<MergeSession | null> {\n return this.activeSessions.get(sessionId) || null;\n }\n\n /**\n * Create custom merge policy\n */\n async createMergePolicy(policy: MergePolicy): Promise<void> {\n // Validate input parameters\n const input = validateInput(CreateMergePolicySchema, policy);\n\n this.mergePolicies.set(input.name, input);\n logger.info(`Created merge policy: ${input.name}`, {\n rules: input.rules.length,\n autoApplyThreshold: input.autoApplyThreshold,\n });\n }\n\n /**\n * Initialize default merge policies\n */\n private initializeDefaultPolicies(): void {\n // Conservative policy - prefer manual resolution\n this.mergePolicies.set('conservative', {\n name: 'conservative',\n description: 'Prefer manual resolution for most conflicts',\n rules: [\n {\n condition: '$.conflictType == \"metadata\" && $.severity == \"low\"',\n action: 'target_wins',\n priority: 1,\n },\n {\n condition: '$.severity == \"critical\"',\n action: 'require_manual',\n priority: 10,\n },\n ],\n autoApplyThreshold: 'never',\n });\n\n // Aggressive policy - auto-resolve when possible\n this.mergePolicies.set('aggressive', {\n name: 'aggressive',\n description: 'Auto-resolve conflicts when safe',\n rules: [\n {\n condition: '$.conflictType == \"sequence\"',\n action: 'merge_both',\n priority: 5,\n },\n {\n condition: '$.severity == \"low\"',\n action: 'source_wins',\n priority: 2,\n },\n {\n condition: '$.severity == \"medium\" && $.autoResolvable',\n action: 'merge_both',\n priority: 4,\n },\n ],\n autoApplyThreshold: 'medium',\n });\n\n // Default policy - balanced approach\n this.mergePolicies.set('default', {\n name: 'default',\n description: 'Balanced conflict resolution',\n rules: [\n {\n condition: '$.conflictType == \"sequence\" && $.severity == \"low\"',\n action: 'merge_both',\n priority: 3,\n },\n {\n condition: '$.conflictType == \"metadata\" && $.autoResolvable',\n action: 'target_wins',\n priority: 2,\n },\n {\n condition: '$.severity == \"critical\"',\n action: 'require_manual',\n priority: 10,\n },\n ],\n autoApplyThreshold: 'low',\n });\n }\n\n // Helper methods\n private getStackManager(stackId: string): any {\n // Use DualStackManager's getStackManager method to get the right stack\n return this.dualStackManager.getStackManager(stackId);\n }\n\n private groupAnchorsByType(anchors: Anchor[]): Record<string, Anchor[]> {\n return anchors.reduce(\n (groups, anchor) => {\n if (!groups[anchor.type]) groups[anchor.type] = [];\n groups[anchor.type].push(anchor);\n return groups;\n },\n {} as Record<string, Anchor[]>\n );\n }\n\n private anchorsEqual(anchors1: Anchor[], anchors2: Anchor[]): boolean {\n if (anchors1.length !== anchors2.length) return false;\n\n // Sort by text for comparison\n const sorted1 = [...anchors1].sort((a, b) => a.text.localeCompare(b.text));\n const sorted2 = [...anchors2].sort((a, b) => a.text.localeCompare(b.text));\n\n return sorted1.every(\n (anchor, i) =>\n anchor.text === sorted2[i].text &&\n anchor.priority === sorted2[i].priority\n );\n }\n\n private evaluateRuleCondition(\n conflict: MergeConflict,\n condition: string\n ): boolean {\n // Simple condition evaluation - in real implementation would use JSONPath\n return (\n condition.includes(conflict.conflictType) ||\n condition.includes(conflict.severity)\n );\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Stack Merge Conflict Resolution - STA-101\n * Advanced conflict resolution for frame merging between individual and shared stacks\n */\n\nimport type { Frame, Event, Anchor } from './frame-types.js';\nimport {\n DualStackManager,\n type StackSyncResult,\n} from './dual-stack-manager.js';\nimport { logger } from '../monitoring/logger.js';\nimport { ValidationError, DatabaseError, ErrorCode } from '../errors/index.js';\nimport {\n validateInput,\n StartMergeSessionSchema,\n CreateMergePolicySchema,\n ConflictResolutionSchema,\n} from './validation.js';\n\nexport interface MergeConflict {\n frameId: string;\n conflictType:\n | 'content'\n | 'metadata'\n | 'sequence'\n | 'dependency'\n | 'permission';\n sourceFrame: Frame;\n targetFrame: Frame;\n conflictDetails: {\n field: string;\n sourceValue: any;\n targetValue: any;\n lastModified: {\n source: Date;\n target: Date;\n };\n }[];\n severity: 'low' | 'medium' | 'high' | 'critical';\n autoResolvable: boolean;\n}\n\nexport interface MergeResolution {\n conflictId: string;\n strategy: 'source_wins' | 'target_wins' | 'merge_both' | 'manual' | 'skip';\n resolutionData?: Record<string, any>;\n resolvedBy: string;\n resolvedAt: Date;\n notes?: string;\n}\n\nexport interface MergePolicy {\n name: string;\n description: string;\n rules: Array<{\n condition: string; // JSONPath expression\n action: 'source_wins' | 'target_wins' | 'merge_both' | 'require_manual';\n priority: number;\n }>;\n autoApplyThreshold: 'low' | 'medium' | 'high' | 'never';\n}\n\nexport interface MergeSession {\n sessionId: string;\n sourceStackId: string;\n targetStackId: string;\n conflicts: MergeConflict[];\n resolutions: MergeResolution[];\n policy: MergePolicy;\n status: 'analyzing' | 'resolving' | 'completed' | 'failed' | 'manual_review';\n startedAt: Date;\n completedAt?: Date;\n metadata: {\n totalFrames: number;\n conflictFrames: number;\n autoResolvedConflicts: number;\n manualResolvedConflicts: number;\n };\n}\n\nexport class StackMergeResolver {\n private dualStackManager: DualStackManager;\n private activeSessions: Map<string, MergeSession> = new Map();\n private mergePolicies: Map<string, MergePolicy> = new Map();\n\n constructor(dualStackManager: DualStackManager) {\n this.dualStackManager = dualStackManager;\n this.initializeDefaultPolicies();\n logger.debug('StackMergeResolver initialized', {\n policies: Array.from(this.mergePolicies.keys()),\n });\n }\n\n /**\n * Start a merge session with conflict analysis\n */\n async startMergeSession(\n sourceStackId: string,\n targetStackId: string,\n frameIds?: string[],\n policyName: string = 'default'\n ): Promise<string> {\n // Validate input parameters\n const input = validateInput(StartMergeSessionSchema, {\n sourceStackId,\n targetStackId,\n frameIds,\n policyName,\n });\n const sessionId = `merge-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n logger.debug('Looking for merge policy', {\n policyName: input.policyName,\n availablePolicies: Array.from(this.mergePolicies.keys()),\n });\n const policy = this.mergePolicies.get(input.policyName);\n if (!policy) {\n logger.error('Merge policy not found', {\n requested: input.policyName,\n available: Array.from(this.mergePolicies.keys()),\n });\n throw new ValidationError(\n `Merge policy not found: ${input.policyName}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n try {\n // Check merge permissions on both stacks\n const currentUserId =\n this.dualStackManager.getCurrentContext().ownerId || 'unknown';\n await this.dualStackManager\n .getPermissionManager()\n .enforcePermission(\n this.dualStackManager\n .getPermissionManager()\n .createContext(currentUserId, 'merge', 'stack', input.sourceStackId)\n );\n\n await this.dualStackManager\n .getPermissionManager()\n .enforcePermission(\n this.dualStackManager\n .getPermissionManager()\n .createContext(currentUserId, 'merge', 'stack', input.targetStackId)\n );\n\n // Create merge session\n const session: MergeSession = {\n sessionId,\n sourceStackId: input.sourceStackId,\n targetStackId: input.targetStackId,\n conflicts: [],\n resolutions: [],\n policy,\n status: 'analyzing',\n startedAt: new Date(),\n metadata: {\n totalFrames: 0,\n conflictFrames: 0,\n autoResolvedConflicts: 0,\n manualResolvedConflicts: 0,\n },\n };\n\n this.activeSessions.set(sessionId, session);\n\n // Analyze conflicts\n await this.analyzeConflicts(sessionId, frameIds);\n\n // Auto-resolve conflicts where possible\n await this.autoResolveConflicts(sessionId);\n\n logger.info(`Merge session started: ${sessionId}`, {\n sourceStack: sourceStackId,\n targetStack: targetStackId,\n conflicts: session.conflicts.length,\n policy: policyName,\n });\n\n return sessionId;\n } catch (error: unknown) {\n logger.error('Failed to start merge session', {\n error: error instanceof Error ? error.message : error,\n sourceStackId: input.sourceStackId,\n targetStackId: input.targetStackId,\n policyName: input.policyName,\n });\n throw new DatabaseError(\n 'Failed to start merge session',\n ErrorCode.OPERATION_FAILED,\n { sourceStackId, targetStackId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Analyze conflicts between source and target stacks\n */\n private async analyzeConflicts(\n sessionId: string,\n frameIds?: string[]\n ): Promise<void> {\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new DatabaseError(\n `Merge session not found: ${sessionId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n try {\n const sourceStack = this.getStackManager(session.sourceStackId);\n const targetStack = this.getStackManager(session.targetStackId);\n\n // Get frames to analyze\n const framesToAnalyze =\n frameIds ||\n (await sourceStack.getActiveFrames()).map((f) => f.frame_id);\n\n session.metadata.totalFrames = framesToAnalyze.length;\n\n for (const frameId of framesToAnalyze) {\n const sourceFrame = await sourceStack.getFrame(frameId);\n if (!sourceFrame) continue;\n\n const targetFrame = await targetStack.getFrame(frameId);\n if (!targetFrame) continue; // No conflict if target doesn't exist\n\n // Analyze frame-level conflicts\n const conflicts = await this.analyzeFrameConflicts(\n sourceFrame,\n targetFrame\n );\n session.conflicts.push(...conflicts);\n }\n\n session.metadata.conflictFrames = new Set(\n session.conflicts.map((c) => c.frameId)\n ).size;\n session.status = 'resolving';\n\n this.activeSessions.set(sessionId, session);\n\n logger.info(`Conflict analysis completed: ${sessionId}`, {\n totalConflicts: session.conflicts.length,\n conflictFrames: session.metadata.conflictFrames,\n });\n } catch (error: unknown) {\n session.status = 'failed';\n this.activeSessions.set(sessionId, session);\n throw error;\n }\n }\n\n /**\n * Analyze conflicts within a single frame\n */\n private async analyzeFrameConflicts(\n sourceFrame: Frame,\n targetFrame: Frame\n ): Promise<MergeConflict[]> {\n const conflicts: MergeConflict[] = [];\n\n // Content conflicts\n if (sourceFrame.name !== targetFrame.name) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'name',\n sourceValue: sourceFrame.name,\n targetValue: targetFrame.name,\n lastModified: {\n source: new Date(sourceFrame.created_at * 1000),\n target: new Date(targetFrame.created_at * 1000),\n },\n },\n ],\n severity: 'medium',\n autoResolvable: false,\n });\n }\n\n // State conflicts\n if (sourceFrame.state !== targetFrame.state) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'metadata',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'state',\n sourceValue: sourceFrame.state,\n targetValue: targetFrame.state,\n lastModified: {\n source: new Date(sourceFrame.created_at * 1000),\n target: new Date(targetFrame.created_at * 1000),\n },\n },\n ],\n severity: 'high',\n autoResolvable: true, // Can auto-resolve based on timestamps\n });\n }\n\n // Input/Output conflicts\n if (\n JSON.stringify(sourceFrame.inputs) !== JSON.stringify(targetFrame.inputs)\n ) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'inputs',\n sourceValue: sourceFrame.inputs,\n targetValue: targetFrame.inputs,\n lastModified: {\n source: new Date(sourceFrame.created_at * 1000),\n target: new Date(targetFrame.created_at * 1000),\n },\n },\n ],\n severity: 'medium',\n autoResolvable: false,\n });\n }\n\n // Analyze event conflicts\n const eventConflicts = await this.analyzeEventConflicts(\n sourceFrame,\n targetFrame\n );\n conflicts.push(...eventConflicts);\n\n // Analyze anchor conflicts\n const anchorConflicts = await this.analyzeAnchorConflicts(\n sourceFrame,\n targetFrame\n );\n conflicts.push(...anchorConflicts);\n\n return conflicts;\n }\n\n /**\n * Analyze conflicts in frame events\n */\n private async analyzeEventConflicts(\n sourceFrame: Frame,\n targetFrame: Frame\n ): Promise<MergeConflict[]> {\n const conflicts: MergeConflict[] = [];\n\n try {\n const sourceStack = this.getStackManager(sourceFrame.project_id);\n const targetStack = this.getStackManager(targetFrame.project_id);\n\n const sourceEvents = await sourceStack.getFrameEvents(\n sourceFrame.frame_id\n );\n const targetEvents = await targetStack.getFrameEvents(\n targetFrame.frame_id\n );\n\n // Check for sequence conflicts\n if (sourceEvents.length !== targetEvents.length) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'sequence',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'event_count',\n sourceValue: sourceEvents.length,\n targetValue: targetEvents.length,\n lastModified: {\n source: new Date(),\n target: new Date(),\n },\n },\n ],\n severity: 'high',\n autoResolvable: true, // Can merge events\n });\n }\n\n // Check for content conflicts in matching events\n const minLength = Math.min(sourceEvents.length, targetEvents.length);\n for (let i = 0; i < minLength; i++) {\n const sourceEvent = sourceEvents[i];\n const targetEvent = targetEvents[i];\n\n if (\n sourceEvent.text !== targetEvent.text ||\n JSON.stringify(sourceEvent.metadata) !==\n JSON.stringify(targetEvent.metadata)\n ) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: `event_${i}`,\n sourceValue: {\n text: sourceEvent.text,\n metadata: sourceEvent.metadata,\n },\n targetValue: {\n text: targetEvent.text,\n metadata: targetEvent.metadata,\n },\n lastModified: {\n source: new Date(),\n target: new Date(),\n },\n },\n ],\n severity: 'medium',\n autoResolvable: false,\n });\n }\n }\n } catch (error: unknown) {\n logger.warn(\n `Failed to analyze event conflicts for frame: ${sourceFrame.frame_id}`,\n error\n );\n }\n\n return conflicts;\n }\n\n /**\n * Analyze conflicts in frame anchors\n */\n private async analyzeAnchorConflicts(\n sourceFrame: Frame,\n targetFrame: Frame\n ): Promise<MergeConflict[]> {\n const conflicts: MergeConflict[] = [];\n\n try {\n const sourceStack = this.getStackManager(sourceFrame.project_id);\n const targetStack = this.getStackManager(targetFrame.project_id);\n\n const sourceAnchors = await sourceStack.getFrameAnchors(\n sourceFrame.frame_id\n );\n const targetAnchors = await targetStack.getFrameAnchors(\n targetFrame.frame_id\n );\n\n // Group anchors by type for comparison\n const sourceAnchorsByType = this.groupAnchorsByType(sourceAnchors);\n const targetAnchorsByType = this.groupAnchorsByType(targetAnchors);\n\n const allTypes = new Set([\n ...Object.keys(sourceAnchorsByType),\n ...Object.keys(targetAnchorsByType),\n ]);\n\n for (const type of allTypes) {\n const sourceTypeAnchors = sourceAnchorsByType[type] || [];\n const targetTypeAnchors = targetAnchorsByType[type] || [];\n\n if (\n sourceTypeAnchors.length !== targetTypeAnchors.length ||\n !this.anchorsEqual(sourceTypeAnchors, targetTypeAnchors)\n ) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: `anchors_${type}`,\n sourceValue: sourceTypeAnchors,\n targetValue: targetTypeAnchors,\n lastModified: {\n source: new Date(),\n target: new Date(),\n },\n },\n ],\n severity: 'low',\n autoResolvable: true, // Can merge anchors\n });\n }\n }\n } catch (error: unknown) {\n logger.warn(\n `Failed to analyze anchor conflicts for frame: ${sourceFrame.frame_id}`,\n error\n );\n }\n\n return conflicts;\n }\n\n /**\n * Auto-resolve conflicts based on merge policy\n */\n private async autoResolveConflicts(sessionId: string): Promise<void> {\n const session = this.activeSessions.get(sessionId);\n if (!session) return;\n\n const autoResolvableConflicts = session.conflicts.filter(\n (c) => c.autoResolvable\n );\n\n for (const conflict of autoResolvableConflicts) {\n const resolution = await this.applyMergePolicy(conflict, session.policy);\n if (resolution) {\n session.resolutions.push(resolution);\n session.metadata.autoResolvedConflicts++;\n\n logger.debug(`Auto-resolved conflict: ${conflict.frameId}`, {\n type: conflict.conflictType,\n strategy: resolution.strategy,\n });\n }\n }\n\n // Update session status\n const remainingConflicts = session.conflicts.filter(\n (c) => !session.resolutions.find((r) => r.conflictId === c.frameId)\n );\n\n if (remainingConflicts.length === 0) {\n session.status = 'completed';\n session.completedAt = new Date();\n } else if (remainingConflicts.every((c) => !c.autoResolvable)) {\n session.status = 'manual_review';\n }\n\n this.activeSessions.set(sessionId, session);\n }\n\n /**\n * Apply merge policy to resolve conflicts automatically\n */\n private async applyMergePolicy(\n conflict: MergeConflict,\n policy: MergePolicy\n ): Promise<MergeResolution | null> {\n // Sort rules by priority\n const sortedRules = policy.rules.sort((a, b) => b.priority - a.priority);\n\n for (const rule of sortedRules) {\n if (this.evaluateRuleCondition(conflict, rule.condition)) {\n return {\n conflictId: conflict.frameId,\n strategy:\n rule.action === 'require_manual' ? 'manual' : (rule.action as any),\n resolvedBy: 'system',\n resolvedAt: new Date(),\n notes: `Auto-resolved by policy: ${policy.name}`,\n };\n }\n }\n\n return null;\n }\n\n /**\n * Manually resolve a specific conflict\n */\n async resolveConflict(\n sessionId: string,\n conflictId: string,\n resolution: Omit<MergeResolution, 'conflictId' | 'resolvedAt'>\n ): Promise<void> {\n // Validate input parameters\n const input = validateInput(ConflictResolutionSchema, {\n strategy: resolution.strategy,\n resolvedBy: resolution.resolvedBy,\n notes: resolution.notes,\n });\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new ValidationError(\n `Merge session not found: ${sessionId}`,\n ErrorCode.MERGE_SESSION_INVALID\n );\n }\n\n const conflict = session.conflicts.find((c) => c.frameId === conflictId);\n if (!conflict) {\n throw new ValidationError(\n `Conflict not found: ${conflictId}`,\n ErrorCode.MERGE_CONFLICT_UNRESOLVABLE\n );\n }\n\n const fullResolution: MergeResolution = {\n ...input,\n conflictId,\n resolvedAt: new Date(),\n };\n\n session.resolutions.push(fullResolution);\n session.metadata.manualResolvedConflicts++;\n\n // Check if all conflicts are resolved\n const resolvedConflictIds = new Set(\n session.resolutions.map((r) => r.conflictId)\n );\n const allResolved = session.conflicts.every((c) =>\n resolvedConflictIds.has(c.frameId)\n );\n\n if (allResolved) {\n session.status = 'completed';\n session.completedAt = new Date();\n }\n\n this.activeSessions.set(sessionId, session);\n\n logger.info(`Conflict manually resolved: ${conflictId}`, {\n strategy: resolution.strategy,\n resolvedBy: resolution.resolvedBy,\n });\n }\n\n /**\n * Execute merge with resolved conflicts\n */\n async executeMerge(sessionId: string): Promise<StackSyncResult> {\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new DatabaseError(\n `Merge session not found: ${sessionId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n if (session.status !== 'completed') {\n throw new DatabaseError(\n `Merge session not ready for execution: ${session.status}`,\n ErrorCode.INVALID_STATE\n );\n }\n\n try {\n // Build resolution map\n const resolutionMap = new Map(\n session.resolutions.map((r) => [r.conflictId, r])\n );\n\n // Execute sync with custom conflict resolution\n const result = await this.dualStackManager.syncStacks(\n session.sourceStackId,\n session.targetStackId,\n {\n conflictResolution: 'merge', // Will be overridden by our resolution map\n frameIds: session.conflicts.map((c) => c.frameId),\n }\n );\n\n logger.info(`Merge executed: ${sessionId}`, {\n mergedFrames: result.mergedFrames.length,\n conflicts: result.conflictFrames.length,\n errors: result.errors.length,\n });\n\n return result;\n } catch (error: unknown) {\n throw new DatabaseError(\n 'Failed to execute merge',\n ErrorCode.OPERATION_FAILED,\n { sessionId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get merge session details\n */\n async getMergeSession(sessionId: string): Promise<MergeSession | null> {\n return this.activeSessions.get(sessionId) || null;\n }\n\n /**\n * Create custom merge policy\n */\n async createMergePolicy(policy: MergePolicy): Promise<void> {\n // Validate input parameters\n const input = validateInput(CreateMergePolicySchema, policy);\n\n this.mergePolicies.set(input.name, input);\n logger.info(`Created merge policy: ${input.name}`, {\n rules: input.rules.length,\n autoApplyThreshold: input.autoApplyThreshold,\n });\n }\n\n /**\n * Initialize default merge policies\n */\n private initializeDefaultPolicies(): void {\n // Conservative policy - prefer manual resolution\n this.mergePolicies.set('conservative', {\n name: 'conservative',\n description: 'Prefer manual resolution for most conflicts',\n rules: [\n {\n condition: '$.conflictType == \"metadata\" && $.severity == \"low\"',\n action: 'target_wins',\n priority: 1,\n },\n {\n condition: '$.severity == \"critical\"',\n action: 'require_manual',\n priority: 10,\n },\n ],\n autoApplyThreshold: 'never',\n });\n\n // Aggressive policy - auto-resolve when possible\n this.mergePolicies.set('aggressive', {\n name: 'aggressive',\n description: 'Auto-resolve conflicts when safe',\n rules: [\n {\n condition: '$.conflictType == \"sequence\"',\n action: 'merge_both',\n priority: 5,\n },\n {\n condition: '$.severity == \"low\"',\n action: 'source_wins',\n priority: 2,\n },\n {\n condition: '$.severity == \"medium\" && $.autoResolvable',\n action: 'merge_both',\n priority: 4,\n },\n ],\n autoApplyThreshold: 'medium',\n });\n\n // Default policy - balanced approach\n this.mergePolicies.set('default', {\n name: 'default',\n description: 'Balanced conflict resolution',\n rules: [\n {\n condition: '$.conflictType == \"sequence\" && $.severity == \"low\"',\n action: 'merge_both',\n priority: 3,\n },\n {\n condition: '$.conflictType == \"metadata\" && $.autoResolvable',\n action: 'target_wins',\n priority: 2,\n },\n {\n condition: '$.severity == \"critical\"',\n action: 'require_manual',\n priority: 10,\n },\n ],\n autoApplyThreshold: 'low',\n });\n }\n\n // Helper methods\n private getStackManager(stackId: string): any {\n // Use DualStackManager's getStackManager method to get the right stack\n return this.dualStackManager.getStackManager(stackId);\n }\n\n private groupAnchorsByType(anchors: Anchor[]): Record<string, Anchor[]> {\n return anchors.reduce(\n (groups, anchor) => {\n if (!groups[anchor.type]) groups[anchor.type] = [];\n groups[anchor.type].push(anchor);\n return groups;\n },\n {} as Record<string, Anchor[]>\n );\n }\n\n private anchorsEqual(anchors1: Anchor[], anchors2: Anchor[]): boolean {\n if (anchors1.length !== anchors2.length) return false;\n\n // Sort by text for comparison\n const sorted1 = [...anchors1].sort((a, b) => a.text.localeCompare(b.text));\n const sorted2 = [...anchors2].sort((a, b) => a.text.localeCompare(b.text));\n\n return sorted1.every(\n (anchor, i) =>\n anchor.text === sorted2[i].text &&\n anchor.priority === sorted2[i].priority\n );\n }\n\n private evaluateRuleCondition(\n conflict: MergeConflict,\n condition: string\n ): boolean {\n // Simple condition evaluation - in real implementation would use JSONPath\n return (\n condition.includes(conflict.conflictType) ||\n condition.includes(conflict.severity)\n );\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackmemoryai/stackmemory",
3
- "version": "0.5.54",
3
+ "version": "0.5.56",
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",