@stackmemoryai/stackmemory 0.5.23 → 0.5.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/bin/opencode-sm +6 -0
  2. package/dist/cli/claude-sm.js +2 -0
  3. package/dist/cli/claude-sm.js.map +2 -2
  4. package/dist/cli/commands/discovery.js +279 -0
  5. package/dist/cli/commands/discovery.js.map +7 -0
  6. package/dist/cli/index.js +2 -0
  7. package/dist/cli/index.js.map +2 -2
  8. package/dist/cli/opencode-sm.js +448 -0
  9. package/dist/cli/opencode-sm.js.map +7 -0
  10. package/dist/core/retrieval/llm-context-retrieval.js +1 -3
  11. package/dist/core/retrieval/llm-context-retrieval.js.map +3 -3
  12. package/dist/integrations/mcp/handlers/discovery-handlers.js +497 -0
  13. package/dist/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  14. package/dist/integrations/mcp/handlers/index.js +40 -12
  15. package/dist/integrations/mcp/handlers/index.js.map +2 -2
  16. package/dist/integrations/mcp/server.js +270 -0
  17. package/dist/integrations/mcp/server.js.map +2 -2
  18. package/dist/integrations/mcp/tool-definitions.js +141 -5
  19. package/dist/integrations/mcp/tool-definitions.js.map +2 -2
  20. package/package.json +3 -2
  21. package/dist/cli/commands/agent.js +0 -286
  22. package/dist/cli/commands/agent.js.map +0 -7
  23. package/dist/cli/commands/chromadb.js +0 -482
  24. package/dist/cli/commands/chromadb.js.map +0 -7
  25. package/dist/cli/commands/gc.js +0 -251
  26. package/dist/cli/commands/gc.js.map +0 -7
  27. package/dist/cli/commands/infinite-storage.js +0 -292
  28. package/dist/cli/commands/infinite-storage.js.map +0 -7
  29. package/dist/cli/commands/linear-create.js +0 -171
  30. package/dist/cli/commands/linear-create.js.map +0 -7
  31. package/dist/cli/commands/linear-list.js +0 -103
  32. package/dist/cli/commands/linear-list.js.map +0 -7
  33. package/dist/cli/commands/linear-migrate.js +0 -64
  34. package/dist/cli/commands/linear-migrate.js.map +0 -7
  35. package/dist/cli/commands/linear-test.js +0 -134
  36. package/dist/cli/commands/linear-test.js.map +0 -7
  37. package/dist/cli/commands/tui.js +0 -77
  38. package/dist/cli/commands/tui.js.map +0 -7
  39. package/dist/cli/commands/webhook.js +0 -181
  40. package/dist/cli/commands/webhook.js.map +0 -7
  41. package/dist/cli/streamlined-cli.js +0 -144
  42. package/dist/cli/streamlined-cli.js.map +0 -7
  43. package/dist/core/events/event-bus.js +0 -110
  44. package/dist/core/events/event-bus.js.map +0 -7
  45. package/dist/core/frame/workflow-templates-stub.js +0 -42
  46. package/dist/core/frame/workflow-templates-stub.js.map +0 -7
  47. package/dist/core/plugins/plugin-interface.js +0 -87
  48. package/dist/core/plugins/plugin-interface.js.map +0 -7
  49. package/dist/core/session/clear-survival-stub.js +0 -53
  50. package/dist/core/session/clear-survival-stub.js.map +0 -7
  51. package/dist/core/storage/chromadb-simple.js +0 -172
  52. package/dist/core/storage/chromadb-simple.js.map +0 -7
  53. package/dist/core/storage/simplified-storage.js +0 -328
  54. package/dist/core/storage/simplified-storage.js.map +0 -7
  55. package/dist/features/tasks/pebbles-task-store.js +0 -647
  56. package/dist/features/tasks/pebbles-task-store.js.map +0 -7
  57. package/dist/integrations/linear/sync-enhanced.js +0 -202
  58. package/dist/integrations/linear/sync-enhanced.js.map +0 -7
  59. package/dist/plugins/linear/index.js +0 -166
  60. package/dist/plugins/linear/index.js.map +0 -7
  61. package/dist/plugins/loader.js +0 -57
  62. package/dist/plugins/loader.js.map +0 -7
  63. package/dist/plugins/plugin-interface.js +0 -67
  64. package/dist/plugins/plugin-interface.js.map +0 -7
  65. package/dist/plugins/ralph/simple-ralph-plugin.js +0 -305
  66. package/dist/plugins/ralph/simple-ralph-plugin.js.map +0 -7
  67. package/dist/plugins/ralph/use-cases/code-generator.js +0 -151
  68. package/dist/plugins/ralph/use-cases/code-generator.js.map +0 -7
  69. package/dist/plugins/ralph/use-cases/test-generator.js +0 -201
  70. package/dist/plugins/ralph/use-cases/test-generator.js.map +0 -7
  71. package/dist/utils/logger.js +0 -52
  72. package/dist/utils/logger.js.map +0 -7
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * OpenCode-SM CLI Launcher (ESM)
4
+ * Delegates to built CLI in dist without requiring tsx.
5
+ */
6
+ import('../dist/cli/opencode-sm.js');
@@ -3,6 +3,8 @@ import { fileURLToPath as __fileURLToPath } from 'url';
3
3
  import { dirname as __pathDirname } from 'path';
4
4
  const __filename = __fileURLToPath(import.meta.url);
5
5
  const __dirname = __pathDirname(__filename);
6
+ import { config as loadDotenv } from "dotenv";
7
+ loadDotenv({ override: true });
6
8
  import { spawn, execSync, execFileSync } from "child_process";
7
9
  import * as fs from "fs";
8
10
  import * as path from "path";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/cli/claude-sm.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n\n/**\n * claude-sm: Claude wrapper with StackMemory and worktree integration\n * Automatically manages context persistence and instance isolation\n */\n\nimport { spawn, execSync, execFileSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { program } from 'commander';\nimport { v4 as uuidv4 } from 'uuid';\nimport chalk from 'chalk';\nimport { initializeTracing, trace } from '../core/trace/index.js';\nimport {\n generateSessionSummary,\n formatSummaryMessage,\n SessionContext,\n} from '../hooks/session-summary.js';\nimport { sendNotification } from '../hooks/sms-notify.js';\n\n// __filename and __dirname are provided by esbuild banner for ESM compatibility\n\ninterface ClaudeSMConfig {\n defaultWorktree: boolean;\n defaultSandbox: boolean;\n defaultChrome: boolean;\n defaultTracing: boolean;\n defaultRemote: boolean;\n defaultNotifyOnDone: boolean;\n}\n\ninterface ClaudeConfig {\n instanceId: string;\n worktreePath?: string;\n useSandbox: boolean;\n useChrome: boolean;\n useWorktree: boolean;\n useRemote: boolean;\n notifyOnDone: boolean;\n contextEnabled: boolean;\n branch?: string;\n task?: string;\n tracingEnabled: boolean;\n verboseTracing: boolean;\n claudeBin?: string;\n sessionStartTime: number;\n}\n\nconst DEFAULT_SM_CONFIG: ClaudeSMConfig = {\n defaultWorktree: false,\n defaultSandbox: false,\n defaultChrome: false,\n defaultTracing: true,\n defaultRemote: false,\n defaultNotifyOnDone: true,\n};\n\nfunction getConfigPath(): string {\n return path.join(os.homedir(), '.stackmemory', 'claude-sm.json');\n}\n\nfunction loadSMConfig(): ClaudeSMConfig {\n try {\n const configPath = getConfigPath();\n if (fs.existsSync(configPath)) {\n const content = fs.readFileSync(configPath, 'utf8');\n return { ...DEFAULT_SM_CONFIG, ...JSON.parse(content) };\n }\n } catch {\n // Ignore errors, use defaults\n }\n return { ...DEFAULT_SM_CONFIG };\n}\n\nfunction saveSMConfig(config: ClaudeSMConfig): void {\n const configPath = getConfigPath();\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2));\n}\n\nclass ClaudeSM {\n private config: ClaudeConfig;\n private stackmemoryPath: string;\n private worktreeScriptPath: string;\n private claudeConfigDir: string;\n private smConfig: ClaudeSMConfig;\n\n constructor() {\n // Load persistent defaults\n this.smConfig = loadSMConfig();\n\n this.config = {\n instanceId: this.generateInstanceId(),\n useSandbox: this.smConfig.defaultSandbox,\n useChrome: this.smConfig.defaultChrome,\n useWorktree: this.smConfig.defaultWorktree,\n useRemote: this.smConfig.defaultRemote,\n notifyOnDone: this.smConfig.defaultNotifyOnDone,\n contextEnabled: true,\n tracingEnabled: this.smConfig.defaultTracing,\n verboseTracing: false,\n sessionStartTime: Date.now(),\n };\n\n this.stackmemoryPath = this.findStackMemory();\n this.worktreeScriptPath = path.join(\n __dirname,\n '../../scripts/claude-worktree-manager.sh'\n );\n this.claudeConfigDir = path.join(os.homedir(), '.claude');\n\n // Ensure config directory exists\n if (!fs.existsSync(this.claudeConfigDir)) {\n fs.mkdirSync(this.claudeConfigDir, { recursive: true });\n }\n }\n\n private generateInstanceId(): string {\n return uuidv4().substring(0, 8);\n }\n\n private findStackMemory(): string {\n // Check multiple possible locations\n const possiblePaths = [\n path.join(os.homedir(), '.stackmemory', 'bin', 'stackmemory'),\n '/usr/local/bin/stackmemory',\n '/opt/homebrew/bin/stackmemory',\n 'stackmemory', // Rely on PATH\n ];\n\n for (const smPath of possiblePaths) {\n try {\n execFileSync('which', [smPath], { stdio: 'ignore' });\n return smPath;\n } catch {\n // Continue searching\n }\n }\n\n return 'stackmemory'; // Fallback to PATH\n }\n\n private isGitRepo(): boolean {\n try {\n execSync('git rev-parse --git-dir', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n private getCurrentBranch(): string {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf8',\n }).trim();\n } catch {\n return 'main';\n }\n }\n\n private hasUncommittedChanges(): boolean {\n try {\n const status = execSync('git status --porcelain', { encoding: 'utf8' });\n return status.length > 0;\n } catch {\n return false;\n }\n }\n\n private resolveClaudeBin(): string | null {\n // 1) CLI-specified\n if (this.config.claudeBin && this.config.claudeBin.trim()) {\n return this.config.claudeBin.trim();\n }\n // 2) Env override\n const envBin = process.env['CLAUDE_BIN'];\n if (envBin && envBin.trim()) return envBin.trim();\n // 3) PATH detection\n try {\n execSync('which claude', { stdio: 'ignore' });\n return 'claude';\n } catch {}\n return null;\n }\n\n private setupWorktree(): string | null {\n if (!this.config.useWorktree || !this.isGitRepo()) {\n return null;\n }\n\n console.log(chalk.blue('\uD83C\uDF33 Setting up isolated worktree...'));\n\n const timestamp = new Date()\n .toISOString()\n .replace(/[:.]/g, '-')\n .substring(0, 19);\n const branch =\n this.config.branch ||\n `claude-${this.config.task || 'work'}-${timestamp}-${this.config.instanceId}`;\n const repoName = path.basename(process.cwd());\n const worktreePath = path.join(\n path.dirname(process.cwd()),\n `${repoName}--${branch}`\n );\n\n try {\n // Create worktree\n const flags = [];\n if (this.config.useSandbox) flags.push('--sandbox');\n if (this.config.useChrome) flags.push('--chrome');\n\n const cmd = `git worktree add -b \"${branch}\" \"${worktreePath}\"`;\n execSync(cmd, { stdio: 'inherit' });\n\n console.log(chalk.green(`\u2705 Worktree created: ${worktreePath}`));\n console.log(chalk.gray(` Branch: ${branch}`));\n\n // Save worktree config\n const configPath = path.join(worktreePath, '.claude-instance.json');\n const configData = {\n instanceId: this.config.instanceId,\n worktreePath,\n branch,\n task: this.config.task,\n sandboxEnabled: this.config.useSandbox,\n chromeEnabled: this.config.useChrome,\n created: new Date().toISOString(),\n parentRepo: process.cwd(),\n };\n fs.writeFileSync(configPath, JSON.stringify(configData, null, 2));\n\n // Copy environment files\n const envFiles = ['.env', '.env.local', '.mise.toml', '.tool-versions'];\n for (const file of envFiles) {\n const srcPath = path.join(process.cwd(), file);\n if (fs.existsSync(srcPath)) {\n fs.copyFileSync(srcPath, path.join(worktreePath, file));\n }\n }\n\n return worktreePath;\n } catch (err: unknown) {\n console.error(chalk.red('\u274C Failed to create worktree:'), err);\n return null;\n }\n }\n\n private saveContext(\n message: string,\n metadata: Record<string, unknown> = {}\n ): void {\n if (!this.config.contextEnabled) return;\n\n try {\n const contextData = {\n message,\n metadata: {\n ...metadata,\n instanceId: this.config.instanceId,\n worktree: this.config.worktreePath,\n timestamp: new Date().toISOString(),\n },\n };\n\n const cmd = `${this.stackmemoryPath} context save --json '${JSON.stringify(contextData)}'`;\n execSync(cmd, { stdio: 'ignore' });\n } catch {\n // Silently fail - don't interrupt Claude\n }\n }\n\n private loadContext(): void {\n if (!this.config.contextEnabled) return;\n\n try {\n console.log(chalk.blue('\uD83D\uDCDA Loading previous context...'));\n\n // Use 'context show' command which outputs the current context stack\n const cmd = `${this.stackmemoryPath} context show`;\n const output = execSync(cmd, {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'], // Capture stderr to suppress errors\n });\n\n // Check if we got meaningful output (not empty or just headers)\n const lines = output\n .trim()\n .split('\\n')\n .filter((l) => l.trim());\n if (lines.length > 3) {\n // Has content beyond headers\n console.log(chalk.gray('Context stack loaded'));\n }\n } catch {\n // Silently continue - context loading is optional\n }\n }\n\n private detectMultipleInstances(): boolean {\n try {\n const lockDir = path.join(process.cwd(), '.claude-worktree-locks');\n if (!fs.existsSync(lockDir)) return false;\n\n const locks = fs.readdirSync(lockDir).filter((f) => f.endsWith('.lock'));\n const activeLocks = locks.filter((lockFile) => {\n const lockPath = path.join(lockDir, lockFile);\n const lockData = JSON.parse(fs.readFileSync(lockPath, 'utf8'));\n const lockAge = Date.now() - new Date(lockData.created).getTime();\n return lockAge < 24 * 60 * 60 * 1000; // Less than 24 hours old\n });\n\n return activeLocks.length > 0;\n } catch {\n return false;\n }\n }\n\n private suggestWorktreeMode(): void {\n if (this.hasUncommittedChanges()) {\n console.log(chalk.yellow('\u26A0\uFE0F Uncommitted changes detected'));\n console.log(\n chalk.gray(' Consider using --worktree to work in isolation')\n );\n }\n\n if (this.detectMultipleInstances()) {\n console.log(chalk.yellow('\u26A0\uFE0F Other Claude instances detected'));\n console.log(\n chalk.gray(' Using --worktree is recommended to avoid conflicts')\n );\n }\n }\n\n private async sendDoneNotification(exitCode: number | null): Promise<void> {\n try {\n const context: SessionContext = {\n instanceId: this.config.instanceId,\n exitCode,\n sessionStartTime: this.config.sessionStartTime,\n worktreePath: this.config.worktreePath,\n branch: this.config.branch,\n task: this.config.task,\n };\n\n const summary = await generateSessionSummary(context);\n const message = formatSummaryMessage(summary);\n\n console.log(chalk.cyan('\\nSending session summary via WhatsApp...'));\n\n // Build options from suggestions for interactive response\n const options = summary.suggestions.slice(0, 4).map((s) => ({\n key: s.key,\n label: s.label,\n action: s.action,\n }));\n\n const result = await sendNotification({\n type: 'task_complete',\n title: 'Claude Session Complete',\n message,\n prompt:\n options.length > 0\n ? {\n type: 'options',\n options,\n }\n : undefined,\n });\n\n if (result.success) {\n console.log(chalk.green('Notification sent successfully'));\n } else {\n console.log(\n chalk.yellow(`Notification not sent: ${result.error || 'unknown'}`)\n );\n }\n } catch (error) {\n console.log(\n chalk.yellow(\n `Could not send notification: ${error instanceof Error ? error.message : 'unknown'}`\n )\n );\n }\n }\n\n public async run(args: string[]): Promise<void> {\n // Parse arguments\n const claudeArgs: string[] = [];\n let i = 0;\n\n while (i < args.length) {\n const arg = args[i];\n\n switch (arg) {\n case '--worktree':\n case '-w':\n this.config.useWorktree = true;\n break;\n case '--no-worktree':\n case '-W':\n this.config.useWorktree = false;\n break;\n case '--remote':\n case '-r':\n this.config.useRemote = true;\n break;\n case '--no-remote':\n this.config.useRemote = false;\n break;\n case '--notify-done':\n case '-n':\n this.config.notifyOnDone = true;\n break;\n case '--no-notify-done':\n this.config.notifyOnDone = false;\n break;\n case '--sandbox':\n case '-s':\n this.config.useSandbox = true;\n claudeArgs.push('--sandbox');\n break;\n case '--chrome':\n case '-c':\n this.config.useChrome = true;\n claudeArgs.push('--chrome');\n break;\n case '--no-context':\n this.config.contextEnabled = false;\n break;\n case '--no-trace':\n this.config.tracingEnabled = false;\n break;\n case '--verbose-trace':\n this.config.verboseTracing = true;\n break;\n case '--branch':\n case '-b':\n i++;\n this.config.branch = args[i];\n break;\n case '--task':\n case '-t':\n i++;\n this.config.task = args[i];\n break;\n case '--claude-bin':\n i++;\n this.config.claudeBin = args[i];\n process.env['CLAUDE_BIN'] = this.config.claudeBin;\n break;\n case '--auto':\n case '-a':\n // Auto mode: detect and apply best settings\n if (this.isGitRepo()) {\n this.config.useWorktree =\n this.hasUncommittedChanges() || this.detectMultipleInstances();\n }\n break;\n default:\n claudeArgs.push(arg);\n }\n i++;\n }\n\n // Initialize tracing system if enabled\n if (this.config.tracingEnabled) {\n // Set up environment for tracing\n process.env['DEBUG_TRACE'] = 'true';\n process.env['STACKMEMORY_DEBUG'] = 'true';\n process.env['TRACE_OUTPUT'] = 'file'; // Write to file to not clutter Claude output\n process.env['TRACE_MASK_SENSITIVE'] = 'true'; // Always mask sensitive data\n\n if (this.config.verboseTracing) {\n process.env['TRACE_VERBOSITY'] = 'full';\n process.env['TRACE_PARAMS'] = 'true';\n process.env['TRACE_RESULTS'] = 'true';\n process.env['TRACE_MEMORY'] = 'true';\n } else {\n process.env['TRACE_VERBOSITY'] = 'summary';\n process.env['TRACE_PARAMS'] = 'true';\n process.env['TRACE_RESULTS'] = 'false';\n }\n\n // Initialize the tracing system\n initializeTracing();\n\n // Start tracing this Claude session\n trace.command(\n 'claude-sm',\n {\n instanceId: this.config.instanceId,\n worktree: this.config.useWorktree,\n sandbox: this.config.useSandbox,\n task: this.config.task,\n },\n async () => {\n // Session tracing will wrap the entire Claude execution\n }\n );\n }\n\n // Show header\n console.log(chalk.blue('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557'));\n console.log(chalk.blue('\u2551 Claude + StackMemory + Worktree \u2551'));\n console.log(chalk.blue('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D'));\n console.log();\n\n // Check Git repo status\n if (this.isGitRepo()) {\n const branch = this.getCurrentBranch();\n console.log(chalk.gray(`\uD83D\uDCCD Current branch: ${branch}`));\n\n if (!this.config.useWorktree) {\n this.suggestWorktreeMode();\n }\n }\n\n // Setup worktree if requested\n if (this.config.useWorktree) {\n const worktreePath = this.setupWorktree();\n if (worktreePath) {\n this.config.worktreePath = worktreePath;\n process.chdir(worktreePath);\n\n // Save context about worktree creation\n this.saveContext('Created worktree for Claude instance', {\n action: 'worktree_created',\n path: worktreePath,\n branch: this.config.branch,\n });\n }\n }\n\n // Load previous context\n this.loadContext();\n\n // Setup environment\n process.env['CLAUDE_INSTANCE_ID'] = this.config.instanceId;\n if (this.config.worktreePath) {\n process.env['CLAUDE_WORKTREE_PATH'] = this.config.worktreePath;\n }\n if (this.config.useRemote) {\n process.env['CLAUDE_REMOTE'] = '1';\n }\n\n console.log(chalk.gray(`\uD83E\uDD16 Instance ID: ${this.config.instanceId}`));\n console.log(chalk.gray(`\uD83D\uDCC1 Working in: ${process.cwd()}`));\n\n if (this.config.useSandbox) {\n console.log(chalk.yellow('\uD83D\uDD12 Sandbox mode enabled'));\n }\n if (this.config.useRemote) {\n console.log(\n chalk.cyan('\uD83D\uDCF1 Remote mode: WhatsApp notifications for all questions')\n );\n }\n if (this.config.useChrome) {\n console.log(chalk.yellow('\uD83C\uDF10 Chrome automation enabled'));\n }\n if (this.config.tracingEnabled) {\n console.log(\n chalk.gray(`\uD83D\uDD0D Debug tracing enabled (logs to ~/.stackmemory/traces/)`)\n );\n if (this.config.verboseTracing) {\n console.log(\n chalk.gray(` Verbose mode: capturing all execution details`)\n );\n }\n }\n\n console.log();\n console.log(chalk.gray('Starting Claude...'));\n console.log(chalk.gray('\u2500'.repeat(42)));\n\n const claudeBin = this.resolveClaudeBin();\n if (!claudeBin) {\n console.error(chalk.red('\u274C Claude CLI not found.'));\n console.log(\n chalk.gray(\n ' Install Claude CLI or set an override:\\n' +\n ' export CLAUDE_BIN=/path/to/claude\\n' +\n ' claude-sm --help\\n\\n' +\n ' Ensure PATH includes npm global bin (npm bin -g).'\n )\n );\n process.exit(1);\n return;\n }\n\n // Launch Claude\n const claude = spawn(claudeBin, claudeArgs, {\n stdio: 'inherit',\n env: process.env,\n });\n\n claude.on('error', (err: NodeJS.ErrnoException) => {\n console.error(chalk.red('\u274C Failed to launch Claude CLI.'));\n if (err.code === 'ENOENT') {\n console.error(\n chalk.gray(' Not found. Set CLAUDE_BIN or install claude on PATH.')\n );\n } else if (err.code === 'EPERM' || err.code === 'EACCES') {\n console.error(\n chalk.gray(\n ' Permission/sandbox issue. Try outside a sandbox or set CLAUDE_BIN.'\n )\n );\n } else {\n console.error(chalk.gray(` ${err.message}`));\n }\n process.exit(1);\n });\n\n // Handle exit\n claude.on('exit', async (code) => {\n // Save final context\n this.saveContext('Claude session ended', {\n action: 'session_end',\n exitCode: code,\n });\n\n // End tracing and show summary if enabled\n if (this.config.tracingEnabled) {\n const summary = trace.getExecutionSummary();\n console.log();\n console.log(chalk.gray('\u2500'.repeat(42)));\n console.log(chalk.blue('Debug Trace Summary:'));\n console.log(chalk.gray(summary));\n }\n\n // Send notification when done (if enabled)\n if (this.config.notifyOnDone || this.config.useRemote) {\n await this.sendDoneNotification(code);\n }\n\n // Offer to clean up worktree\n if (this.config.worktreePath) {\n console.log();\n console.log(chalk.gray('\u2500'.repeat(42)));\n console.log(chalk.blue('Session ended in worktree:'));\n console.log(chalk.gray(` ${this.config.worktreePath}`));\n console.log();\n console.log(chalk.gray('To remove worktree: gd_claude'));\n console.log(chalk.gray('To merge to main: cwm'));\n }\n\n process.exit(code || 0);\n });\n\n // Handle signals\n process.on('SIGINT', () => {\n this.saveContext('Claude session interrupted', {\n action: 'session_interrupt',\n });\n claude.kill('SIGINT');\n });\n\n process.on('SIGTERM', () => {\n this.saveContext('Claude session terminated', {\n action: 'session_terminate',\n });\n claude.kill('SIGTERM');\n });\n }\n}\n\n// CLI interface\nprogram\n .name('claude-sm')\n .description('Claude with StackMemory context and worktree isolation')\n .version('1.0.0');\n\n// Config subcommand\nconst configCmd = program\n .command('config')\n .description('Manage claude-sm defaults');\n\nconfigCmd\n .command('show')\n .description('Show current default settings')\n .action(() => {\n const config = loadSMConfig();\n console.log(chalk.blue('claude-sm defaults:'));\n console.log(\n ` defaultWorktree: ${config.defaultWorktree ? chalk.green('true') : chalk.gray('false')}`\n );\n console.log(\n ` defaultSandbox: ${config.defaultSandbox ? chalk.green('true') : chalk.gray('false')}`\n );\n console.log(\n ` defaultChrome: ${config.defaultChrome ? chalk.green('true') : chalk.gray('false')}`\n );\n console.log(\n ` defaultTracing: ${config.defaultTracing ? chalk.green('true') : chalk.gray('false')}`\n );\n console.log(\n ` defaultRemote: ${config.defaultRemote ? chalk.green('true') : chalk.gray('false')}`\n );\n console.log(\n ` defaultNotifyOnDone: ${config.defaultNotifyOnDone ? chalk.green('true') : chalk.gray('false')}`\n );\n console.log(chalk.gray(`\\nConfig: ${getConfigPath()}`));\n });\n\nconfigCmd\n .command('set <key> <value>')\n .description('Set a default (e.g., set worktree true)')\n .action((key: string, value: string) => {\n const config = loadSMConfig();\n const boolValue = value === 'true' || value === '1' || value === 'on';\n\n const keyMap: Record<string, keyof ClaudeSMConfig> = {\n worktree: 'defaultWorktree',\n sandbox: 'defaultSandbox',\n chrome: 'defaultChrome',\n tracing: 'defaultTracing',\n remote: 'defaultRemote',\n 'notify-done': 'defaultNotifyOnDone',\n notifyondone: 'defaultNotifyOnDone',\n };\n\n const configKey = keyMap[key];\n if (!configKey) {\n console.log(chalk.red(`Unknown key: ${key}`));\n console.log(\n chalk.gray(\n 'Valid keys: worktree, sandbox, chrome, tracing, remote, notify-done'\n )\n );\n process.exit(1);\n }\n\n config[configKey] = boolValue;\n saveSMConfig(config);\n console.log(chalk.green(`Set ${key} = ${boolValue}`));\n });\n\nconfigCmd\n .command('worktree-on')\n .description('Enable worktree mode by default')\n .action(() => {\n const config = loadSMConfig();\n config.defaultWorktree = true;\n saveSMConfig(config);\n console.log(chalk.green('Worktree mode enabled by default'));\n });\n\nconfigCmd\n .command('worktree-off')\n .description('Disable worktree mode by default')\n .action(() => {\n const config = loadSMConfig();\n config.defaultWorktree = false;\n saveSMConfig(config);\n console.log(chalk.green('Worktree mode disabled by default'));\n });\n\nconfigCmd\n .command('remote-on')\n .description('Enable remote mode by default (WhatsApp for all questions)')\n .action(() => {\n const config = loadSMConfig();\n config.defaultRemote = true;\n saveSMConfig(config);\n console.log(chalk.green('Remote mode enabled by default'));\n });\n\nconfigCmd\n .command('remote-off')\n .description('Disable remote mode by default')\n .action(() => {\n const config = loadSMConfig();\n config.defaultRemote = false;\n saveSMConfig(config);\n console.log(chalk.green('Remote mode disabled by default'));\n });\n\nconfigCmd\n .command('notify-done-on')\n .description('Enable WhatsApp notification when session ends (default)')\n .action(() => {\n const config = loadSMConfig();\n config.defaultNotifyOnDone = true;\n saveSMConfig(config);\n console.log(chalk.green('Notify-on-done enabled by default'));\n });\n\nconfigCmd\n .command('notify-done-off')\n .description('Disable notification when session ends')\n .action(() => {\n const config = loadSMConfig();\n config.defaultNotifyOnDone = false;\n saveSMConfig(config);\n console.log(chalk.green('Notify-on-done disabled by default'));\n });\n\n// Main command (default action when no subcommand)\nprogram\n .option('-w, --worktree', 'Create isolated worktree for this instance')\n .option('-W, --no-worktree', 'Disable worktree (override default)')\n .option('-r, --remote', 'Enable remote mode (WhatsApp for all questions)')\n .option('--no-remote', 'Disable remote mode (override default)')\n .option('-n, --notify-done', 'Send WhatsApp notification when session ends')\n .option('--no-notify-done', 'Disable notification when session ends')\n .option('-s, --sandbox', 'Enable sandbox mode (file/network restrictions)')\n .option('-c, --chrome', 'Enable Chrome automation')\n .option('-a, --auto', 'Automatically detect and apply best settings')\n .option('-b, --branch <name>', 'Specify branch name for worktree')\n .option('-t, --task <desc>', 'Task description for context')\n .option('--claude-bin <path>', 'Path to claude CLI (or use CLAUDE_BIN)')\n .option('--no-context', 'Disable StackMemory context integration')\n .option('--no-trace', 'Disable debug tracing (enabled by default)')\n .option('--verbose-trace', 'Enable verbose debug tracing with full details')\n .helpOption('-h, --help', 'Display help')\n .allowUnknownOption(true)\n .action(async (_options) => {\n const claudeSM = new ClaudeSM();\n const args = process.argv.slice(2);\n await claudeSM.run(args);\n });\n\n// Handle direct execution\n// ESM-safe CLI entry\nprogram.parse(process.argv);\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["#!/usr/bin/env node\n\n/**\n * claude-sm: Claude wrapper with StackMemory and worktree integration\n * Automatically manages context persistence and instance isolation\n */\n\nimport { config as loadDotenv } from 'dotenv';\nloadDotenv({ override: true });\n\nimport { spawn, execSync, execFileSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { program } from 'commander';\nimport { v4 as uuidv4 } from 'uuid';\nimport chalk from 'chalk';\nimport { initializeTracing, trace } from '../core/trace/index.js';\nimport {\n generateSessionSummary,\n formatSummaryMessage,\n SessionContext,\n} from '../hooks/session-summary.js';\nimport { sendNotification } from '../hooks/sms-notify.js';\n\n// __filename and __dirname are provided by esbuild banner for ESM compatibility\n\ninterface ClaudeSMConfig {\n defaultWorktree: boolean;\n defaultSandbox: boolean;\n defaultChrome: boolean;\n defaultTracing: boolean;\n defaultRemote: boolean;\n defaultNotifyOnDone: boolean;\n}\n\ninterface ClaudeConfig {\n instanceId: string;\n worktreePath?: string;\n useSandbox: boolean;\n useChrome: boolean;\n useWorktree: boolean;\n useRemote: boolean;\n notifyOnDone: boolean;\n contextEnabled: boolean;\n branch?: string;\n task?: string;\n tracingEnabled: boolean;\n verboseTracing: boolean;\n claudeBin?: string;\n sessionStartTime: number;\n}\n\nconst DEFAULT_SM_CONFIG: ClaudeSMConfig = {\n defaultWorktree: false,\n defaultSandbox: false,\n defaultChrome: false,\n defaultTracing: true,\n defaultRemote: false,\n defaultNotifyOnDone: true,\n};\n\nfunction getConfigPath(): string {\n return path.join(os.homedir(), '.stackmemory', 'claude-sm.json');\n}\n\nfunction loadSMConfig(): ClaudeSMConfig {\n try {\n const configPath = getConfigPath();\n if (fs.existsSync(configPath)) {\n const content = fs.readFileSync(configPath, 'utf8');\n return { ...DEFAULT_SM_CONFIG, ...JSON.parse(content) };\n }\n } catch {\n // Ignore errors, use defaults\n }\n return { ...DEFAULT_SM_CONFIG };\n}\n\nfunction saveSMConfig(config: ClaudeSMConfig): void {\n const configPath = getConfigPath();\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2));\n}\n\nclass ClaudeSM {\n private config: ClaudeConfig;\n private stackmemoryPath: string;\n private worktreeScriptPath: string;\n private claudeConfigDir: string;\n private smConfig: ClaudeSMConfig;\n\n constructor() {\n // Load persistent defaults\n this.smConfig = loadSMConfig();\n\n this.config = {\n instanceId: this.generateInstanceId(),\n useSandbox: this.smConfig.defaultSandbox,\n useChrome: this.smConfig.defaultChrome,\n useWorktree: this.smConfig.defaultWorktree,\n useRemote: this.smConfig.defaultRemote,\n notifyOnDone: this.smConfig.defaultNotifyOnDone,\n contextEnabled: true,\n tracingEnabled: this.smConfig.defaultTracing,\n verboseTracing: false,\n sessionStartTime: Date.now(),\n };\n\n this.stackmemoryPath = this.findStackMemory();\n this.worktreeScriptPath = path.join(\n __dirname,\n '../../scripts/claude-worktree-manager.sh'\n );\n this.claudeConfigDir = path.join(os.homedir(), '.claude');\n\n // Ensure config directory exists\n if (!fs.existsSync(this.claudeConfigDir)) {\n fs.mkdirSync(this.claudeConfigDir, { recursive: true });\n }\n }\n\n private generateInstanceId(): string {\n return uuidv4().substring(0, 8);\n }\n\n private findStackMemory(): string {\n // Check multiple possible locations\n const possiblePaths = [\n path.join(os.homedir(), '.stackmemory', 'bin', 'stackmemory'),\n '/usr/local/bin/stackmemory',\n '/opt/homebrew/bin/stackmemory',\n 'stackmemory', // Rely on PATH\n ];\n\n for (const smPath of possiblePaths) {\n try {\n execFileSync('which', [smPath], { stdio: 'ignore' });\n return smPath;\n } catch {\n // Continue searching\n }\n }\n\n return 'stackmemory'; // Fallback to PATH\n }\n\n private isGitRepo(): boolean {\n try {\n execSync('git rev-parse --git-dir', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n private getCurrentBranch(): string {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf8',\n }).trim();\n } catch {\n return 'main';\n }\n }\n\n private hasUncommittedChanges(): boolean {\n try {\n const status = execSync('git status --porcelain', { encoding: 'utf8' });\n return status.length > 0;\n } catch {\n return false;\n }\n }\n\n private resolveClaudeBin(): string | null {\n // 1) CLI-specified\n if (this.config.claudeBin && this.config.claudeBin.trim()) {\n return this.config.claudeBin.trim();\n }\n // 2) Env override\n const envBin = process.env['CLAUDE_BIN'];\n if (envBin && envBin.trim()) return envBin.trim();\n // 3) PATH detection\n try {\n execSync('which claude', { stdio: 'ignore' });\n return 'claude';\n } catch {}\n return null;\n }\n\n private setupWorktree(): string | null {\n if (!this.config.useWorktree || !this.isGitRepo()) {\n return null;\n }\n\n console.log(chalk.blue('\uD83C\uDF33 Setting up isolated worktree...'));\n\n const timestamp = new Date()\n .toISOString()\n .replace(/[:.]/g, '-')\n .substring(0, 19);\n const branch =\n this.config.branch ||\n `claude-${this.config.task || 'work'}-${timestamp}-${this.config.instanceId}`;\n const repoName = path.basename(process.cwd());\n const worktreePath = path.join(\n path.dirname(process.cwd()),\n `${repoName}--${branch}`\n );\n\n try {\n // Create worktree\n const flags = [];\n if (this.config.useSandbox) flags.push('--sandbox');\n if (this.config.useChrome) flags.push('--chrome');\n\n const cmd = `git worktree add -b \"${branch}\" \"${worktreePath}\"`;\n execSync(cmd, { stdio: 'inherit' });\n\n console.log(chalk.green(`\u2705 Worktree created: ${worktreePath}`));\n console.log(chalk.gray(` Branch: ${branch}`));\n\n // Save worktree config\n const configPath = path.join(worktreePath, '.claude-instance.json');\n const configData = {\n instanceId: this.config.instanceId,\n worktreePath,\n branch,\n task: this.config.task,\n sandboxEnabled: this.config.useSandbox,\n chromeEnabled: this.config.useChrome,\n created: new Date().toISOString(),\n parentRepo: process.cwd(),\n };\n fs.writeFileSync(configPath, JSON.stringify(configData, null, 2));\n\n // Copy environment files\n const envFiles = ['.env', '.env.local', '.mise.toml', '.tool-versions'];\n for (const file of envFiles) {\n const srcPath = path.join(process.cwd(), file);\n if (fs.existsSync(srcPath)) {\n fs.copyFileSync(srcPath, path.join(worktreePath, file));\n }\n }\n\n return worktreePath;\n } catch (err: unknown) {\n console.error(chalk.red('\u274C Failed to create worktree:'), err);\n return null;\n }\n }\n\n private saveContext(\n message: string,\n metadata: Record<string, unknown> = {}\n ): void {\n if (!this.config.contextEnabled) return;\n\n try {\n const contextData = {\n message,\n metadata: {\n ...metadata,\n instanceId: this.config.instanceId,\n worktree: this.config.worktreePath,\n timestamp: new Date().toISOString(),\n },\n };\n\n const cmd = `${this.stackmemoryPath} context save --json '${JSON.stringify(contextData)}'`;\n execSync(cmd, { stdio: 'ignore' });\n } catch {\n // Silently fail - don't interrupt Claude\n }\n }\n\n private loadContext(): void {\n if (!this.config.contextEnabled) return;\n\n try {\n console.log(chalk.blue('\uD83D\uDCDA Loading previous context...'));\n\n // Use 'context show' command which outputs the current context stack\n const cmd = `${this.stackmemoryPath} context show`;\n const output = execSync(cmd, {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'], // Capture stderr to suppress errors\n });\n\n // Check if we got meaningful output (not empty or just headers)\n const lines = output\n .trim()\n .split('\\n')\n .filter((l) => l.trim());\n if (lines.length > 3) {\n // Has content beyond headers\n console.log(chalk.gray('Context stack loaded'));\n }\n } catch {\n // Silently continue - context loading is optional\n }\n }\n\n private detectMultipleInstances(): boolean {\n try {\n const lockDir = path.join(process.cwd(), '.claude-worktree-locks');\n if (!fs.existsSync(lockDir)) return false;\n\n const locks = fs.readdirSync(lockDir).filter((f) => f.endsWith('.lock'));\n const activeLocks = locks.filter((lockFile) => {\n const lockPath = path.join(lockDir, lockFile);\n const lockData = JSON.parse(fs.readFileSync(lockPath, 'utf8'));\n const lockAge = Date.now() - new Date(lockData.created).getTime();\n return lockAge < 24 * 60 * 60 * 1000; // Less than 24 hours old\n });\n\n return activeLocks.length > 0;\n } catch {\n return false;\n }\n }\n\n private suggestWorktreeMode(): void {\n if (this.hasUncommittedChanges()) {\n console.log(chalk.yellow('\u26A0\uFE0F Uncommitted changes detected'));\n console.log(\n chalk.gray(' Consider using --worktree to work in isolation')\n );\n }\n\n if (this.detectMultipleInstances()) {\n console.log(chalk.yellow('\u26A0\uFE0F Other Claude instances detected'));\n console.log(\n chalk.gray(' Using --worktree is recommended to avoid conflicts')\n );\n }\n }\n\n private async sendDoneNotification(exitCode: number | null): Promise<void> {\n try {\n const context: SessionContext = {\n instanceId: this.config.instanceId,\n exitCode,\n sessionStartTime: this.config.sessionStartTime,\n worktreePath: this.config.worktreePath,\n branch: this.config.branch,\n task: this.config.task,\n };\n\n const summary = await generateSessionSummary(context);\n const message = formatSummaryMessage(summary);\n\n console.log(chalk.cyan('\\nSending session summary via WhatsApp...'));\n\n // Build options from suggestions for interactive response\n const options = summary.suggestions.slice(0, 4).map((s) => ({\n key: s.key,\n label: s.label,\n action: s.action,\n }));\n\n const result = await sendNotification({\n type: 'task_complete',\n title: 'Claude Session Complete',\n message,\n prompt:\n options.length > 0\n ? {\n type: 'options',\n options,\n }\n : undefined,\n });\n\n if (result.success) {\n console.log(chalk.green('Notification sent successfully'));\n } else {\n console.log(\n chalk.yellow(`Notification not sent: ${result.error || 'unknown'}`)\n );\n }\n } catch (error) {\n console.log(\n chalk.yellow(\n `Could not send notification: ${error instanceof Error ? error.message : 'unknown'}`\n )\n );\n }\n }\n\n public async run(args: string[]): Promise<void> {\n // Parse arguments\n const claudeArgs: string[] = [];\n let i = 0;\n\n while (i < args.length) {\n const arg = args[i];\n\n switch (arg) {\n case '--worktree':\n case '-w':\n this.config.useWorktree = true;\n break;\n case '--no-worktree':\n case '-W':\n this.config.useWorktree = false;\n break;\n case '--remote':\n case '-r':\n this.config.useRemote = true;\n break;\n case '--no-remote':\n this.config.useRemote = false;\n break;\n case '--notify-done':\n case '-n':\n this.config.notifyOnDone = true;\n break;\n case '--no-notify-done':\n this.config.notifyOnDone = false;\n break;\n case '--sandbox':\n case '-s':\n this.config.useSandbox = true;\n claudeArgs.push('--sandbox');\n break;\n case '--chrome':\n case '-c':\n this.config.useChrome = true;\n claudeArgs.push('--chrome');\n break;\n case '--no-context':\n this.config.contextEnabled = false;\n break;\n case '--no-trace':\n this.config.tracingEnabled = false;\n break;\n case '--verbose-trace':\n this.config.verboseTracing = true;\n break;\n case '--branch':\n case '-b':\n i++;\n this.config.branch = args[i];\n break;\n case '--task':\n case '-t':\n i++;\n this.config.task = args[i];\n break;\n case '--claude-bin':\n i++;\n this.config.claudeBin = args[i];\n process.env['CLAUDE_BIN'] = this.config.claudeBin;\n break;\n case '--auto':\n case '-a':\n // Auto mode: detect and apply best settings\n if (this.isGitRepo()) {\n this.config.useWorktree =\n this.hasUncommittedChanges() || this.detectMultipleInstances();\n }\n break;\n default:\n claudeArgs.push(arg);\n }\n i++;\n }\n\n // Initialize tracing system if enabled\n if (this.config.tracingEnabled) {\n // Set up environment for tracing\n process.env['DEBUG_TRACE'] = 'true';\n process.env['STACKMEMORY_DEBUG'] = 'true';\n process.env['TRACE_OUTPUT'] = 'file'; // Write to file to not clutter Claude output\n process.env['TRACE_MASK_SENSITIVE'] = 'true'; // Always mask sensitive data\n\n if (this.config.verboseTracing) {\n process.env['TRACE_VERBOSITY'] = 'full';\n process.env['TRACE_PARAMS'] = 'true';\n process.env['TRACE_RESULTS'] = 'true';\n process.env['TRACE_MEMORY'] = 'true';\n } else {\n process.env['TRACE_VERBOSITY'] = 'summary';\n process.env['TRACE_PARAMS'] = 'true';\n process.env['TRACE_RESULTS'] = 'false';\n }\n\n // Initialize the tracing system\n initializeTracing();\n\n // Start tracing this Claude session\n trace.command(\n 'claude-sm',\n {\n instanceId: this.config.instanceId,\n worktree: this.config.useWorktree,\n sandbox: this.config.useSandbox,\n task: this.config.task,\n },\n async () => {\n // Session tracing will wrap the entire Claude execution\n }\n );\n }\n\n // Show header\n console.log(chalk.blue('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557'));\n console.log(chalk.blue('\u2551 Claude + StackMemory + Worktree \u2551'));\n console.log(chalk.blue('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D'));\n console.log();\n\n // Check Git repo status\n if (this.isGitRepo()) {\n const branch = this.getCurrentBranch();\n console.log(chalk.gray(`\uD83D\uDCCD Current branch: ${branch}`));\n\n if (!this.config.useWorktree) {\n this.suggestWorktreeMode();\n }\n }\n\n // Setup worktree if requested\n if (this.config.useWorktree) {\n const worktreePath = this.setupWorktree();\n if (worktreePath) {\n this.config.worktreePath = worktreePath;\n process.chdir(worktreePath);\n\n // Save context about worktree creation\n this.saveContext('Created worktree for Claude instance', {\n action: 'worktree_created',\n path: worktreePath,\n branch: this.config.branch,\n });\n }\n }\n\n // Load previous context\n this.loadContext();\n\n // Setup environment\n process.env['CLAUDE_INSTANCE_ID'] = this.config.instanceId;\n if (this.config.worktreePath) {\n process.env['CLAUDE_WORKTREE_PATH'] = this.config.worktreePath;\n }\n if (this.config.useRemote) {\n process.env['CLAUDE_REMOTE'] = '1';\n }\n\n console.log(chalk.gray(`\uD83E\uDD16 Instance ID: ${this.config.instanceId}`));\n console.log(chalk.gray(`\uD83D\uDCC1 Working in: ${process.cwd()}`));\n\n if (this.config.useSandbox) {\n console.log(chalk.yellow('\uD83D\uDD12 Sandbox mode enabled'));\n }\n if (this.config.useRemote) {\n console.log(\n chalk.cyan('\uD83D\uDCF1 Remote mode: WhatsApp notifications for all questions')\n );\n }\n if (this.config.useChrome) {\n console.log(chalk.yellow('\uD83C\uDF10 Chrome automation enabled'));\n }\n if (this.config.tracingEnabled) {\n console.log(\n chalk.gray(`\uD83D\uDD0D Debug tracing enabled (logs to ~/.stackmemory/traces/)`)\n );\n if (this.config.verboseTracing) {\n console.log(\n chalk.gray(` Verbose mode: capturing all execution details`)\n );\n }\n }\n\n console.log();\n console.log(chalk.gray('Starting Claude...'));\n console.log(chalk.gray('\u2500'.repeat(42)));\n\n const claudeBin = this.resolveClaudeBin();\n if (!claudeBin) {\n console.error(chalk.red('\u274C Claude CLI not found.'));\n console.log(\n chalk.gray(\n ' Install Claude CLI or set an override:\\n' +\n ' export CLAUDE_BIN=/path/to/claude\\n' +\n ' claude-sm --help\\n\\n' +\n ' Ensure PATH includes npm global bin (npm bin -g).'\n )\n );\n process.exit(1);\n return;\n }\n\n // Launch Claude\n const claude = spawn(claudeBin, claudeArgs, {\n stdio: 'inherit',\n env: process.env,\n });\n\n claude.on('error', (err: NodeJS.ErrnoException) => {\n console.error(chalk.red('\u274C Failed to launch Claude CLI.'));\n if (err.code === 'ENOENT') {\n console.error(\n chalk.gray(' Not found. Set CLAUDE_BIN or install claude on PATH.')\n );\n } else if (err.code === 'EPERM' || err.code === 'EACCES') {\n console.error(\n chalk.gray(\n ' Permission/sandbox issue. Try outside a sandbox or set CLAUDE_BIN.'\n )\n );\n } else {\n console.error(chalk.gray(` ${err.message}`));\n }\n process.exit(1);\n });\n\n // Handle exit\n claude.on('exit', async (code) => {\n // Save final context\n this.saveContext('Claude session ended', {\n action: 'session_end',\n exitCode: code,\n });\n\n // End tracing and show summary if enabled\n if (this.config.tracingEnabled) {\n const summary = trace.getExecutionSummary();\n console.log();\n console.log(chalk.gray('\u2500'.repeat(42)));\n console.log(chalk.blue('Debug Trace Summary:'));\n console.log(chalk.gray(summary));\n }\n\n // Send notification when done (if enabled)\n if (this.config.notifyOnDone || this.config.useRemote) {\n await this.sendDoneNotification(code);\n }\n\n // Offer to clean up worktree\n if (this.config.worktreePath) {\n console.log();\n console.log(chalk.gray('\u2500'.repeat(42)));\n console.log(chalk.blue('Session ended in worktree:'));\n console.log(chalk.gray(` ${this.config.worktreePath}`));\n console.log();\n console.log(chalk.gray('To remove worktree: gd_claude'));\n console.log(chalk.gray('To merge to main: cwm'));\n }\n\n process.exit(code || 0);\n });\n\n // Handle signals\n process.on('SIGINT', () => {\n this.saveContext('Claude session interrupted', {\n action: 'session_interrupt',\n });\n claude.kill('SIGINT');\n });\n\n process.on('SIGTERM', () => {\n this.saveContext('Claude session terminated', {\n action: 'session_terminate',\n });\n claude.kill('SIGTERM');\n });\n }\n}\n\n// CLI interface\nprogram\n .name('claude-sm')\n .description('Claude with StackMemory context and worktree isolation')\n .version('1.0.0');\n\n// Config subcommand\nconst configCmd = program\n .command('config')\n .description('Manage claude-sm defaults');\n\nconfigCmd\n .command('show')\n .description('Show current default settings')\n .action(() => {\n const config = loadSMConfig();\n console.log(chalk.blue('claude-sm defaults:'));\n console.log(\n ` defaultWorktree: ${config.defaultWorktree ? chalk.green('true') : chalk.gray('false')}`\n );\n console.log(\n ` defaultSandbox: ${config.defaultSandbox ? chalk.green('true') : chalk.gray('false')}`\n );\n console.log(\n ` defaultChrome: ${config.defaultChrome ? chalk.green('true') : chalk.gray('false')}`\n );\n console.log(\n ` defaultTracing: ${config.defaultTracing ? chalk.green('true') : chalk.gray('false')}`\n );\n console.log(\n ` defaultRemote: ${config.defaultRemote ? chalk.green('true') : chalk.gray('false')}`\n );\n console.log(\n ` defaultNotifyOnDone: ${config.defaultNotifyOnDone ? chalk.green('true') : chalk.gray('false')}`\n );\n console.log(chalk.gray(`\\nConfig: ${getConfigPath()}`));\n });\n\nconfigCmd\n .command('set <key> <value>')\n .description('Set a default (e.g., set worktree true)')\n .action((key: string, value: string) => {\n const config = loadSMConfig();\n const boolValue = value === 'true' || value === '1' || value === 'on';\n\n const keyMap: Record<string, keyof ClaudeSMConfig> = {\n worktree: 'defaultWorktree',\n sandbox: 'defaultSandbox',\n chrome: 'defaultChrome',\n tracing: 'defaultTracing',\n remote: 'defaultRemote',\n 'notify-done': 'defaultNotifyOnDone',\n notifyondone: 'defaultNotifyOnDone',\n };\n\n const configKey = keyMap[key];\n if (!configKey) {\n console.log(chalk.red(`Unknown key: ${key}`));\n console.log(\n chalk.gray(\n 'Valid keys: worktree, sandbox, chrome, tracing, remote, notify-done'\n )\n );\n process.exit(1);\n }\n\n config[configKey] = boolValue;\n saveSMConfig(config);\n console.log(chalk.green(`Set ${key} = ${boolValue}`));\n });\n\nconfigCmd\n .command('worktree-on')\n .description('Enable worktree mode by default')\n .action(() => {\n const config = loadSMConfig();\n config.defaultWorktree = true;\n saveSMConfig(config);\n console.log(chalk.green('Worktree mode enabled by default'));\n });\n\nconfigCmd\n .command('worktree-off')\n .description('Disable worktree mode by default')\n .action(() => {\n const config = loadSMConfig();\n config.defaultWorktree = false;\n saveSMConfig(config);\n console.log(chalk.green('Worktree mode disabled by default'));\n });\n\nconfigCmd\n .command('remote-on')\n .description('Enable remote mode by default (WhatsApp for all questions)')\n .action(() => {\n const config = loadSMConfig();\n config.defaultRemote = true;\n saveSMConfig(config);\n console.log(chalk.green('Remote mode enabled by default'));\n });\n\nconfigCmd\n .command('remote-off')\n .description('Disable remote mode by default')\n .action(() => {\n const config = loadSMConfig();\n config.defaultRemote = false;\n saveSMConfig(config);\n console.log(chalk.green('Remote mode disabled by default'));\n });\n\nconfigCmd\n .command('notify-done-on')\n .description('Enable WhatsApp notification when session ends (default)')\n .action(() => {\n const config = loadSMConfig();\n config.defaultNotifyOnDone = true;\n saveSMConfig(config);\n console.log(chalk.green('Notify-on-done enabled by default'));\n });\n\nconfigCmd\n .command('notify-done-off')\n .description('Disable notification when session ends')\n .action(() => {\n const config = loadSMConfig();\n config.defaultNotifyOnDone = false;\n saveSMConfig(config);\n console.log(chalk.green('Notify-on-done disabled by default'));\n });\n\n// Main command (default action when no subcommand)\nprogram\n .option('-w, --worktree', 'Create isolated worktree for this instance')\n .option('-W, --no-worktree', 'Disable worktree (override default)')\n .option('-r, --remote', 'Enable remote mode (WhatsApp for all questions)')\n .option('--no-remote', 'Disable remote mode (override default)')\n .option('-n, --notify-done', 'Send WhatsApp notification when session ends')\n .option('--no-notify-done', 'Disable notification when session ends')\n .option('-s, --sandbox', 'Enable sandbox mode (file/network restrictions)')\n .option('-c, --chrome', 'Enable Chrome automation')\n .option('-a, --auto', 'Automatically detect and apply best settings')\n .option('-b, --branch <name>', 'Specify branch name for worktree')\n .option('-t, --task <desc>', 'Task description for context')\n .option('--claude-bin <path>', 'Path to claude CLI (or use CLAUDE_BIN)')\n .option('--no-context', 'Disable StackMemory context integration')\n .option('--no-trace', 'Disable debug tracing (enabled by default)')\n .option('--verbose-trace', 'Enable verbose debug tracing with full details')\n .helpOption('-h, --help', 'Display help')\n .allowUnknownOption(true)\n .action(async (_options) => {\n const claudeSM = new ClaudeSM();\n const args = process.argv.slice(2);\n await claudeSM.run(args);\n });\n\n// Handle direct execution\n// ESM-safe CLI entry\nprogram.parse(process.argv);\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,279 @@
1
+ import { fileURLToPath as __fileURLToPath } from 'url';
2
+ import { dirname as __pathDirname } from 'path';
3
+ const __filename = __fileURLToPath(import.meta.url);
4
+ const __dirname = __pathDirname(__filename);
5
+ import { Command } from "commander";
6
+ import Database from "better-sqlite3";
7
+ import { join } from "path";
8
+ import { existsSync } from "fs";
9
+ import chalk from "chalk";
10
+ import { FrameManager } from "../../core/context/frame-manager.js";
11
+ import { LLMContextRetrieval } from "../../core/retrieval/index.js";
12
+ import { DiscoveryHandlers } from "../../integrations/mcp/handlers/discovery-handlers.js";
13
+ function createDiscoveryCommands() {
14
+ const discovery = new Command("discovery").alias("discover").description("Discover relevant files based on current context");
15
+ discovery.command("files").alias("f").description("Discover files relevant to current context").option("-q, --query <text>", "Focus discovery on specific query").option(
16
+ "-d, --depth <level>",
17
+ "Search depth: shallow, medium, deep",
18
+ "medium"
19
+ ).option("-m, --max <n>", "Maximum files to return", "20").option("-i, --include <patterns>", "Include patterns (comma-separated)").option("-e, --exclude <patterns>", "Exclude patterns (comma-separated)").action(async (options) => {
20
+ const projectRoot = process.cwd();
21
+ const dbPath = join(projectRoot, ".stackmemory", "context.db");
22
+ if (!existsSync(dbPath)) {
23
+ console.log(
24
+ chalk.red("StackMemory not initialized in this directory.")
25
+ );
26
+ console.log(chalk.gray('Run "stackmemory init" first.'));
27
+ return;
28
+ }
29
+ const db = new Database(dbPath);
30
+ try {
31
+ let projectId = "default";
32
+ try {
33
+ const row = db.prepare(`SELECT value FROM metadata WHERE key = 'project_id'`).get();
34
+ if (row?.value) projectId = row.value;
35
+ } catch {
36
+ }
37
+ const frameManager = new FrameManager(db, projectId, {
38
+ skipContextBridge: true
39
+ });
40
+ const contextRetrieval = new LLMContextRetrieval(
41
+ db,
42
+ frameManager,
43
+ projectId
44
+ );
45
+ const handlers = new DiscoveryHandlers({
46
+ frameManager,
47
+ contextRetrieval,
48
+ db,
49
+ projectRoot
50
+ });
51
+ console.log(chalk.blue("\nDiscovering relevant files...\n"));
52
+ const result = await handlers.handleDiscover({
53
+ query: options.query,
54
+ depth: options.depth,
55
+ maxFiles: parseInt(options.max),
56
+ includePatterns: options.include?.split(","),
57
+ excludePatterns: options.exclude?.split(",")
58
+ });
59
+ const metadata = result.metadata;
60
+ console.log(chalk.cyan("Context Summary"));
61
+ console.log(chalk.gray(metadata.contextSummary));
62
+ console.log("");
63
+ console.log(chalk.cyan("Keywords Extracted"));
64
+ console.log(chalk.gray(metadata.keywords.slice(0, 15).join(", ")));
65
+ console.log("");
66
+ console.log(chalk.cyan("Relevant Files"));
67
+ for (const file of metadata.files.slice(0, parseInt(options.max))) {
68
+ const icon = file.relevance === "high" ? chalk.green("[HIGH]") : file.relevance === "medium" ? chalk.yellow("[MED]") : chalk.gray("[LOW]");
69
+ console.log(`${icon} ${chalk.white(file.path)}`);
70
+ console.log(chalk.gray(` ${file.reason}`));
71
+ }
72
+ if (Object.keys(metadata.mdContext).length > 0) {
73
+ console.log("");
74
+ console.log(chalk.cyan("MD Files Parsed"));
75
+ for (const mdFile of Object.keys(metadata.mdContext)) {
76
+ console.log(chalk.gray(` - ${mdFile}`));
77
+ }
78
+ }
79
+ console.log("");
80
+ } finally {
81
+ db.close();
82
+ }
83
+ });
84
+ discovery.command("related").alias("r").description("Find files related to a specific file or concept").option("-f, --file <path>", "File to find related files for").option("-c, --concept <text>", "Concept to search for").option("-m, --max <n>", "Maximum files to return", "10").action(async (options) => {
85
+ if (!options.file && !options.concept) {
86
+ console.log(chalk.red("Either --file or --concept is required"));
87
+ return;
88
+ }
89
+ const projectRoot = process.cwd();
90
+ const dbPath = join(projectRoot, ".stackmemory", "context.db");
91
+ if (!existsSync(dbPath)) {
92
+ console.log(
93
+ chalk.red("StackMemory not initialized in this directory.")
94
+ );
95
+ return;
96
+ }
97
+ const db = new Database(dbPath);
98
+ try {
99
+ let projectId = "default";
100
+ try {
101
+ const row = db.prepare(`SELECT value FROM metadata WHERE key = 'project_id'`).get();
102
+ if (row?.value) projectId = row.value;
103
+ } catch {
104
+ }
105
+ const frameManager = new FrameManager(db, projectId, {
106
+ skipContextBridge: true
107
+ });
108
+ const contextRetrieval = new LLMContextRetrieval(
109
+ db,
110
+ frameManager,
111
+ projectId
112
+ );
113
+ const handlers = new DiscoveryHandlers({
114
+ frameManager,
115
+ contextRetrieval,
116
+ db,
117
+ projectRoot
118
+ });
119
+ const target = options.file || options.concept;
120
+ console.log(chalk.blue(`
121
+ Finding files related to: ${target}
122
+ `));
123
+ const result = await handlers.handleRelatedFiles({
124
+ file: options.file,
125
+ concept: options.concept,
126
+ maxFiles: parseInt(options.max)
127
+ });
128
+ const files = result.metadata.relatedFiles;
129
+ if (files.length === 0) {
130
+ console.log(chalk.gray("No related files found."));
131
+ return;
132
+ }
133
+ for (const file of files) {
134
+ const icon = file.relevance === "high" ? chalk.green("[HIGH]") : chalk.yellow("[MED]");
135
+ console.log(`${icon} ${chalk.white(file.path)}`);
136
+ console.log(chalk.gray(` ${file.reason}`));
137
+ }
138
+ console.log("");
139
+ } finally {
140
+ db.close();
141
+ }
142
+ });
143
+ discovery.command("session").alias("s").description("Get current session summary").option("--no-files", "Exclude recent files").option("--no-decisions", "Exclude recent decisions").action(async (options) => {
144
+ const projectRoot = process.cwd();
145
+ const dbPath = join(projectRoot, ".stackmemory", "context.db");
146
+ if (!existsSync(dbPath)) {
147
+ console.log(
148
+ chalk.red("StackMemory not initialized in this directory.")
149
+ );
150
+ return;
151
+ }
152
+ const db = new Database(dbPath);
153
+ try {
154
+ let projectId = "default";
155
+ try {
156
+ const row = db.prepare(`SELECT value FROM metadata WHERE key = 'project_id'`).get();
157
+ if (row?.value) projectId = row.value;
158
+ } catch {
159
+ }
160
+ const frameManager = new FrameManager(db, projectId, {
161
+ skipContextBridge: true
162
+ });
163
+ const contextRetrieval = new LLMContextRetrieval(
164
+ db,
165
+ frameManager,
166
+ projectId
167
+ );
168
+ const handlers = new DiscoveryHandlers({
169
+ frameManager,
170
+ contextRetrieval,
171
+ db,
172
+ projectRoot
173
+ });
174
+ const result = await handlers.handleSessionSummary({
175
+ includeFiles: options.files !== false,
176
+ includeDecisions: options.decisions !== false
177
+ });
178
+ const summary = result.metadata;
179
+ console.log(chalk.blue("\nSession Summary\n"));
180
+ console.log(`${chalk.cyan("Current Goal:")} ${summary.currentGoal}`);
181
+ console.log(`${chalk.cyan("Active Frames:")} ${summary.activeFrames}`);
182
+ console.log(`${chalk.cyan("Stack Depth:")} ${summary.stackDepth}`);
183
+ if (summary.recentFiles?.length > 0) {
184
+ console.log(chalk.cyan("\nRecent Files:"));
185
+ for (const f of summary.recentFiles.slice(0, 10)) {
186
+ console.log(chalk.gray(` - ${f}`));
187
+ }
188
+ }
189
+ if (summary.decisions?.length > 0) {
190
+ console.log(chalk.cyan("\nRecent Decisions:"));
191
+ for (const d of summary.decisions.slice(0, 5)) {
192
+ console.log(
193
+ chalk.gray(
194
+ ` [${d.type}] ${d.text.slice(0, 60)}${d.text.length > 60 ? "..." : ""}`
195
+ )
196
+ );
197
+ }
198
+ }
199
+ console.log("");
200
+ } finally {
201
+ db.close();
202
+ }
203
+ });
204
+ discovery.command("quick", { isDefault: true }).description("Quick discovery based on current context").action(async () => {
205
+ const projectRoot = process.cwd();
206
+ const dbPath = join(projectRoot, ".stackmemory", "context.db");
207
+ if (!existsSync(dbPath)) {
208
+ console.log(
209
+ chalk.red("StackMemory not initialized in this directory.")
210
+ );
211
+ console.log(chalk.gray('Run "stackmemory init" first.'));
212
+ return;
213
+ }
214
+ const db = new Database(dbPath);
215
+ try {
216
+ let projectId = "default";
217
+ try {
218
+ const row = db.prepare(`SELECT value FROM metadata WHERE key = 'project_id'`).get();
219
+ if (row?.value) projectId = row.value;
220
+ } catch {
221
+ }
222
+ const frameManager = new FrameManager(db, projectId, {
223
+ skipContextBridge: true
224
+ });
225
+ const contextRetrieval = new LLMContextRetrieval(
226
+ db,
227
+ frameManager,
228
+ projectId
229
+ );
230
+ const handlers = new DiscoveryHandlers({
231
+ frameManager,
232
+ contextRetrieval,
233
+ db,
234
+ projectRoot
235
+ });
236
+ console.log(chalk.blue("\nQuick Discovery\n"));
237
+ const sessionResult = await handlers.handleSessionSummary({
238
+ includeFiles: true,
239
+ includeDecisions: true
240
+ });
241
+ const session = sessionResult.metadata;
242
+ console.log(`${chalk.cyan("Current:")} ${session.currentGoal}`);
243
+ console.log(`${chalk.cyan("Stack:")} ${session.stackDepth} frames`);
244
+ console.log("");
245
+ const discoverResult = await handlers.handleDiscover({
246
+ depth: "shallow",
247
+ maxFiles: 10
248
+ });
249
+ const discovery2 = discoverResult.metadata;
250
+ console.log(
251
+ chalk.cyan("Keywords: ") + chalk.gray(discovery2.keywords.slice(0, 8).join(", "))
252
+ );
253
+ console.log("");
254
+ console.log(chalk.cyan("Top Relevant Files:"));
255
+ for (const file of discovery2.files.slice(0, 5)) {
256
+ const icon = file.relevance === "high" ? chalk.green("*") : chalk.yellow("-");
257
+ console.log(`${icon} ${file.path}`);
258
+ }
259
+ if (session.decisions?.length > 0) {
260
+ console.log("");
261
+ console.log(chalk.cyan("Recent Decisions:"));
262
+ for (const d of session.decisions.slice(0, 3)) {
263
+ console.log(chalk.gray(` [${d.type}] ${d.text.slice(0, 50)}...`));
264
+ }
265
+ }
266
+ console.log("");
267
+ console.log(
268
+ chalk.gray('Use "stackmemory discovery files" for detailed discovery')
269
+ );
270
+ } finally {
271
+ db.close();
272
+ }
273
+ });
274
+ return discovery;
275
+ }
276
+ export {
277
+ createDiscoveryCommands
278
+ };
279
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/commands/discovery.ts"],
4
+ "sourcesContent": ["/**\n * Discovery CLI Commands\n * Discover relevant files based on current context\n */\n\nimport { Command } from 'commander';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport chalk from 'chalk';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport { LLMContextRetrieval } from '../../core/retrieval/index.js';\nimport { DiscoveryHandlers } from '../../integrations/mcp/handlers/discovery-handlers.js';\n\nexport function createDiscoveryCommands(): Command {\n const discovery = new Command('discovery')\n .alias('discover')\n .description('Discover relevant files based on current context');\n\n // Main discovery command\n discovery\n .command('files')\n .alias('f')\n .description('Discover files relevant to current context')\n .option('-q, --query <text>', 'Focus discovery on specific query')\n .option(\n '-d, --depth <level>',\n 'Search depth: shallow, medium, deep',\n 'medium'\n )\n .option('-m, --max <n>', 'Maximum files to return', '20')\n .option('-i, --include <patterns>', 'Include patterns (comma-separated)')\n .option('-e, --exclude <patterns>', 'Exclude patterns (comma-separated)')\n .action(async (options) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n chalk.red('StackMemory not initialized in this directory.')\n );\n console.log(chalk.gray('Run \"stackmemory init\" first.'));\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n let projectId = 'default';\n try {\n const row = db\n .prepare(`SELECT value FROM metadata WHERE key = 'project_id'`)\n .get() as any;\n if (row?.value) projectId = row.value;\n } catch {}\n\n const frameManager = new FrameManager(db, projectId, {\n skipContextBridge: true,\n });\n const contextRetrieval = new LLMContextRetrieval(\n db,\n frameManager,\n projectId\n );\n const handlers = new DiscoveryHandlers({\n frameManager,\n contextRetrieval,\n db,\n projectRoot,\n });\n\n console.log(chalk.blue('\\nDiscovering relevant files...\\n'));\n\n const result = await handlers.handleDiscover({\n query: options.query,\n depth: options.depth as 'shallow' | 'medium' | 'deep',\n maxFiles: parseInt(options.max),\n includePatterns: options.include?.split(','),\n excludePatterns: options.exclude?.split(','),\n });\n\n // Display results\n const metadata = result.metadata;\n\n console.log(chalk.cyan('Context Summary'));\n console.log(chalk.gray(metadata.contextSummary));\n console.log('');\n\n console.log(chalk.cyan('Keywords Extracted'));\n console.log(chalk.gray(metadata.keywords.slice(0, 15).join(', ')));\n console.log('');\n\n console.log(chalk.cyan('Relevant Files'));\n for (const file of metadata.files.slice(0, parseInt(options.max))) {\n const icon =\n file.relevance === 'high'\n ? chalk.green('[HIGH]')\n : file.relevance === 'medium'\n ? chalk.yellow('[MED]')\n : chalk.gray('[LOW]');\n console.log(`${icon} ${chalk.white(file.path)}`);\n console.log(chalk.gray(` ${file.reason}`));\n }\n\n if (Object.keys(metadata.mdContext).length > 0) {\n console.log('');\n console.log(chalk.cyan('MD Files Parsed'));\n for (const mdFile of Object.keys(metadata.mdContext)) {\n console.log(chalk.gray(` - ${mdFile}`));\n }\n }\n\n console.log('');\n } finally {\n db.close();\n }\n });\n\n // Related files command\n discovery\n .command('related')\n .alias('r')\n .description('Find files related to a specific file or concept')\n .option('-f, --file <path>', 'File to find related files for')\n .option('-c, --concept <text>', 'Concept to search for')\n .option('-m, --max <n>', 'Maximum files to return', '10')\n .action(async (options) => {\n if (!options.file && !options.concept) {\n console.log(chalk.red('Either --file or --concept is required'));\n return;\n }\n\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n chalk.red('StackMemory not initialized in this directory.')\n );\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n let projectId = 'default';\n try {\n const row = db\n .prepare(`SELECT value FROM metadata WHERE key = 'project_id'`)\n .get() as any;\n if (row?.value) projectId = row.value;\n } catch {}\n\n const frameManager = new FrameManager(db, projectId, {\n skipContextBridge: true,\n });\n const contextRetrieval = new LLMContextRetrieval(\n db,\n frameManager,\n projectId\n );\n const handlers = new DiscoveryHandlers({\n frameManager,\n contextRetrieval,\n db,\n projectRoot,\n });\n\n const target = options.file || options.concept;\n console.log(chalk.blue(`\\nFinding files related to: ${target}\\n`));\n\n const result = await handlers.handleRelatedFiles({\n file: options.file,\n concept: options.concept,\n maxFiles: parseInt(options.max),\n });\n\n const files = result.metadata.relatedFiles;\n\n if (files.length === 0) {\n console.log(chalk.gray('No related files found.'));\n return;\n }\n\n for (const file of files) {\n const icon =\n file.relevance === 'high'\n ? chalk.green('[HIGH]')\n : chalk.yellow('[MED]');\n console.log(`${icon} ${chalk.white(file.path)}`);\n console.log(chalk.gray(` ${file.reason}`));\n }\n\n console.log('');\n } finally {\n db.close();\n }\n });\n\n // Session summary command\n discovery\n .command('session')\n .alias('s')\n .description('Get current session summary')\n .option('--no-files', 'Exclude recent files')\n .option('--no-decisions', 'Exclude recent decisions')\n .action(async (options) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n chalk.red('StackMemory not initialized in this directory.')\n );\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n let projectId = 'default';\n try {\n const row = db\n .prepare(`SELECT value FROM metadata WHERE key = 'project_id'`)\n .get() as any;\n if (row?.value) projectId = row.value;\n } catch {}\n\n const frameManager = new FrameManager(db, projectId, {\n skipContextBridge: true,\n });\n const contextRetrieval = new LLMContextRetrieval(\n db,\n frameManager,\n projectId\n );\n const handlers = new DiscoveryHandlers({\n frameManager,\n contextRetrieval,\n db,\n projectRoot,\n });\n\n const result = await handlers.handleSessionSummary({\n includeFiles: options.files !== false,\n includeDecisions: options.decisions !== false,\n });\n\n const summary = result.metadata;\n\n console.log(chalk.blue('\\nSession Summary\\n'));\n\n console.log(`${chalk.cyan('Current Goal:')} ${summary.currentGoal}`);\n console.log(`${chalk.cyan('Active Frames:')} ${summary.activeFrames}`);\n console.log(`${chalk.cyan('Stack Depth:')} ${summary.stackDepth}`);\n\n if (summary.recentFiles?.length > 0) {\n console.log(chalk.cyan('\\nRecent Files:'));\n for (const f of summary.recentFiles.slice(0, 10)) {\n console.log(chalk.gray(` - ${f}`));\n }\n }\n\n if (summary.decisions?.length > 0) {\n console.log(chalk.cyan('\\nRecent Decisions:'));\n for (const d of summary.decisions.slice(0, 5)) {\n console.log(\n chalk.gray(\n ` [${d.type}] ${d.text.slice(0, 60)}${d.text.length > 60 ? '...' : ''}`\n )\n );\n }\n }\n\n console.log('');\n } finally {\n db.close();\n }\n });\n\n // Quick context command (default)\n discovery\n .command('quick', { isDefault: true })\n .description('Quick discovery based on current context')\n .action(async () => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n chalk.red('StackMemory not initialized in this directory.')\n );\n console.log(chalk.gray('Run \"stackmemory init\" first.'));\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n let projectId = 'default';\n try {\n const row = db\n .prepare(`SELECT value FROM metadata WHERE key = 'project_id'`)\n .get() as any;\n if (row?.value) projectId = row.value;\n } catch {}\n\n const frameManager = new FrameManager(db, projectId, {\n skipContextBridge: true,\n });\n const contextRetrieval = new LLMContextRetrieval(\n db,\n frameManager,\n projectId\n );\n const handlers = new DiscoveryHandlers({\n frameManager,\n contextRetrieval,\n db,\n projectRoot,\n });\n\n console.log(chalk.blue('\\nQuick Discovery\\n'));\n\n // Get session summary first\n const sessionResult = await handlers.handleSessionSummary({\n includeFiles: true,\n includeDecisions: true,\n });\n const session = sessionResult.metadata;\n\n console.log(`${chalk.cyan('Current:')} ${session.currentGoal}`);\n console.log(`${chalk.cyan('Stack:')} ${session.stackDepth} frames`);\n console.log('');\n\n // Quick file discovery\n const discoverResult = await handlers.handleDiscover({\n depth: 'shallow',\n maxFiles: 10,\n });\n const discovery = discoverResult.metadata;\n\n console.log(\n chalk.cyan('Keywords: ') +\n chalk.gray(discovery.keywords.slice(0, 8).join(', '))\n );\n console.log('');\n\n console.log(chalk.cyan('Top Relevant Files:'));\n for (const file of discovery.files.slice(0, 5)) {\n const icon =\n file.relevance === 'high' ? chalk.green('*') : chalk.yellow('-');\n console.log(`${icon} ${file.path}`);\n }\n\n if (session.decisions?.length > 0) {\n console.log('');\n console.log(chalk.cyan('Recent Decisions:'));\n for (const d of session.decisions.slice(0, 3)) {\n console.log(chalk.gray(` [${d.type}] ${d.text.slice(0, 50)}...`));\n }\n }\n\n console.log('');\n console.log(\n chalk.gray('Use \"stackmemory discovery files\" for detailed discovery')\n );\n } finally {\n db.close();\n }\n });\n\n return discovery;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["discovery"]
7
+ }
package/dist/cli/index.js CHANGED
@@ -50,6 +50,7 @@ import { createAutoBackgroundCommand } from "./commands/auto-background.js";
50
50
  import { createSMSNotifyCommand } from "./commands/sms-notify.js";
51
51
  import { createSettingsCommand } from "./commands/settings.js";
52
52
  import { createRetrievalCommands } from "./commands/retrieval.js";
53
+ import { createDiscoveryCommands } from "./commands/discovery.js";
53
54
  import { ProjectManager } from "../core/projects/project-manager.js";
54
55
  import Database from "better-sqlite3";
55
56
  import { join } from "path";
@@ -507,6 +508,7 @@ program.addCommand(createAutoBackgroundCommand());
507
508
  program.addCommand(createSMSNotifyCommand());
508
509
  program.addCommand(createSettingsCommand());
509
510
  program.addCommand(createRetrievalCommands());
511
+ program.addCommand(createDiscoveryCommands());
510
512
  program.command("dashboard").description("Display monitoring dashboard in terminal").option("-w, --watch", "Auto-refresh dashboard").option("-i, --interval <seconds>", "Refresh interval in seconds", "5").action(async (options) => {
511
513
  const { dashboardCommand } = await import("./commands/dashboard.js");
512
514
  await dashboardCommand.handler(options);