@stackmemoryai/stackmemory 0.3.9 → 0.3.11

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 (86) hide show
  1. package/README.md +54 -0
  2. package/dist/agents/core/agent-task-manager.js +12 -1
  3. package/dist/agents/core/agent-task-manager.js.map +3 -3
  4. package/dist/agents/testing-agent.js +610 -0
  5. package/dist/agents/testing-agent.js.map +7 -0
  6. package/dist/cli/browser-test.js +4 -4
  7. package/dist/cli/browser-test.js.map +2 -2
  8. package/dist/cli/claude-sm.js +2 -2
  9. package/dist/cli/claude-sm.js.map +2 -2
  10. package/dist/cli/codex-sm.js +5 -5
  11. package/dist/cli/codex-sm.js.map +2 -2
  12. package/dist/cli/commands/agent.js +3 -3
  13. package/dist/cli/commands/agent.js.map +2 -2
  14. package/dist/cli/commands/handoff.js +67 -20
  15. package/dist/cli/commands/handoff.js.map +3 -3
  16. package/dist/cli/commands/linear-unified.js +3 -3
  17. package/dist/cli/commands/linear-unified.js.map +2 -2
  18. package/dist/cli/commands/linear.js +2 -2
  19. package/dist/cli/commands/linear.js.map +2 -2
  20. package/dist/cli/commands/onboard.js +3 -3
  21. package/dist/cli/commands/onboard.js.map +2 -2
  22. package/dist/cli/commands/quality.js +2 -2
  23. package/dist/cli/commands/quality.js.map +2 -2
  24. package/dist/cli/commands/skills.js +113 -28
  25. package/dist/cli/commands/skills.js.map +2 -2
  26. package/dist/cli/commands/tasks.js +3 -3
  27. package/dist/cli/commands/tasks.js.map +2 -2
  28. package/dist/cli/commands/test.js +282 -0
  29. package/dist/cli/commands/test.js.map +7 -0
  30. package/dist/cli/commands/worktree.js +28 -10
  31. package/dist/cli/commands/worktree.js.map +2 -2
  32. package/dist/cli/index.js +5 -3
  33. package/dist/cli/index.js.map +2 -2
  34. package/dist/cli/utils/viewer.js +9 -9
  35. package/dist/cli/utils/viewer.js.map +2 -2
  36. package/dist/core/config/config-manager.js +26 -0
  37. package/dist/core/config/config-manager.js.map +3 -3
  38. package/dist/core/context/frame-handoff-manager.js +4 -4
  39. package/dist/core/context/frame-handoff-manager.js.map +1 -1
  40. package/dist/core/context/frame-manager.js +139 -0
  41. package/dist/core/context/frame-manager.js.map +2 -2
  42. package/dist/core/context/refactored-frame-manager.js +180 -1
  43. package/dist/core/context/refactored-frame-manager.js.map +2 -2
  44. package/dist/core/projects/project-isolation.js +197 -0
  45. package/dist/core/projects/project-isolation.js.map +7 -0
  46. package/dist/core/trace/debug-trace.js +1 -1
  47. package/dist/core/trace/debug-trace.js.map +2 -2
  48. package/dist/core/trace/index.js +4 -4
  49. package/dist/core/trace/index.js.map +2 -2
  50. package/dist/core/trace/trace-demo.js +8 -8
  51. package/dist/core/trace/trace-demo.js.map +2 -2
  52. package/dist/core/trace/trace-detector.demo.js +5 -5
  53. package/dist/core/trace/trace-detector.demo.js.map +2 -2
  54. package/dist/core/utils/update-checker.js +2 -2
  55. package/dist/core/utils/update-checker.js.map +2 -2
  56. package/dist/features/analytics/core/analytics-service.js +2 -2
  57. package/dist/features/analytics/core/analytics-service.js.map +2 -2
  58. package/dist/features/tasks/linear-task-manager.js +483 -0
  59. package/dist/features/tasks/linear-task-manager.js.map +7 -0
  60. package/dist/integrations/claude-code/subagent-client-stub.js +16 -0
  61. package/dist/integrations/claude-code/subagent-client-stub.js.map +7 -0
  62. package/dist/integrations/linear/auto-sync.js +2 -2
  63. package/dist/integrations/linear/auto-sync.js.map +2 -2
  64. package/dist/integrations/linear/config.js +12 -1
  65. package/dist/integrations/linear/config.js.map +2 -2
  66. package/dist/integrations/linear/sync-manager.js.map +1 -1
  67. package/dist/integrations/linear/sync.js.map +1 -1
  68. package/dist/integrations/linear/unified-sync.js.map +1 -1
  69. package/dist/integrations/linear/webhook-handler.js.map +2 -2
  70. package/dist/integrations/linear/webhook.js.map +2 -2
  71. package/dist/integrations/mcp/handlers/linear-handlers.js.map +1 -1
  72. package/dist/integrations/mcp/handlers/task-handlers.js.map +1 -1
  73. package/dist/integrations/mcp/refactored-server.js +2 -2
  74. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  75. package/dist/integrations/mcp/server.js +3 -3
  76. package/dist/integrations/mcp/server.js.map +2 -2
  77. package/dist/mcp/stackmemory-mcp-server.js +3 -3
  78. package/dist/mcp/stackmemory-mcp-server.js.map +2 -2
  79. package/dist/skills/claude-skills.js +99 -5
  80. package/dist/skills/claude-skills.js.map +2 -2
  81. package/dist/skills/recursive-agent-orchestrator.js.map +1 -1
  82. package/dist/skills/security-secrets-scanner.js +21 -6
  83. package/dist/skills/security-secrets-scanner.js.map +2 -2
  84. package/dist/skills/unified-rlm-orchestrator.js +400 -0
  85. package/dist/skills/unified-rlm-orchestrator.js.map +7 -0
  86. package/package.json +4 -5
@@ -6,7 +6,11 @@ import chalk from "chalk";
6
6
  import Table from "cli-table3";
7
7
  import { existsSync } from "fs";
8
8
  import Database from "better-sqlite3";
9
- import { execSync } from "child_process";
9
+ import { execFileSync } from "child_process";
10
+ import { z } from "zod";
11
+ const BranchNameSchema = z.string().min(1, "Branch name cannot be empty").max(100, "Branch name too long").regex(/^[a-zA-Z0-9._/-]+$/, "Branch name contains invalid characters").refine((name) => !name.includes(".."), 'Branch name cannot contain ".."').refine((name) => !name.includes(";"), 'Branch name cannot contain ";"').refine((name) => !name.includes("&"), 'Branch name cannot contain "&"').refine((name) => !name.includes("|"), 'Branch name cannot contain "|"').refine((name) => !name.includes("$"), 'Branch name cannot contain "$"').refine((name) => !name.includes("`"), 'Branch name cannot contain "`"');
12
+ const PathSchema = z.string().min(1, "Path cannot be empty").max(500, "Path too long").regex(/^[a-zA-Z0-9._/-]+$/, "Path contains invalid characters").refine((path) => !path.includes(".."), 'Path cannot contain ".."');
13
+ const CommitSchema = z.string().min(1, "Commit reference cannot be empty").max(100, "Commit reference too long").regex(/^[a-zA-Z0-9._/-]+$/, "Commit reference contains invalid characters");
10
14
  function registerWorktreeCommands(program) {
11
15
  const worktree = program.command("worktree").alias("wt").description("Manage StackMemory across git worktrees");
12
16
  worktree.command("enable").description("Enable worktree support").option(
@@ -154,14 +158,21 @@ Detected ${worktrees.length} worktree(s):`));
154
158
  const manager = WorktreeManager.getInstance();
155
159
  const projectManager = ProjectManager.getInstance();
156
160
  try {
161
+ const validatedBranch = BranchNameSchema.parse(branch);
157
162
  const project = await projectManager.detectProject();
158
- const worktreePath = options.path || `../${project.name}-${branch}`;
159
- let gitCommand = `git worktree add -b ${branch} ${worktreePath}`;
163
+ const worktreePath = options.path || `../${project.name}-${validatedBranch}`;
164
+ if (options.path) {
165
+ PathSchema.parse(options.path);
166
+ }
167
+ if (options.from) {
168
+ CommitSchema.parse(options.from);
169
+ }
170
+ const gitArgs = ["worktree", "add", "-b", validatedBranch, worktreePath];
160
171
  if (options.from) {
161
- gitCommand += ` ${options.from}`;
172
+ gitArgs.push(options.from);
162
173
  }
163
- console.log(chalk.gray(`Creating worktree: ${gitCommand}`));
164
- execSync(gitCommand, { stdio: "inherit" });
174
+ console.log(chalk.gray(`Creating worktree: git ${gitArgs.join(" ")}`));
175
+ execFileSync("git", gitArgs, { stdio: "inherit" });
165
176
  console.log(chalk.green(`\u2713 Created worktree at ${worktreePath}`));
166
177
  if (manager.isEnabled()) {
167
178
  const context = manager.getWorktreeContext(worktreePath);
@@ -182,10 +193,17 @@ Detected ${worktrees.length} worktree(s):`));
182
193
  }
183
194
  console.log(chalk.gray(" # Start working in isolated context"));
184
195
  } catch (error) {
185
- console.error(
186
- chalk.red("Failed to create worktree:"),
187
- error.message
188
- );
196
+ if (error instanceof z.ZodError) {
197
+ console.error(chalk.red("Invalid input:"));
198
+ error.errors.forEach((err) => {
199
+ console.error(chalk.red(` ${err.path.join(".")}: ${err.message}`));
200
+ });
201
+ } else {
202
+ console.error(
203
+ chalk.red("Failed to create worktree:"),
204
+ error.message
205
+ );
206
+ }
189
207
  process.exit(1);
190
208
  }
191
209
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/commands/worktree.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n/**\n * Git Worktree Management CLI Commands\n * Handles multiple StackMemory instances across git worktrees\n */\n\nimport { Command } from 'commander';\nimport { WorktreeManager } from '../../core/worktree/worktree-manager.js';\nimport { ProjectManager } from '../../core/projects/project-manager.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport Database from 'better-sqlite3';\nimport { execSync } from 'child_process';\n\nexport function registerWorktreeCommands(program: Command): void {\n const worktree = program\n .command('worktree')\n .alias('wt')\n .description('Manage StackMemory across git worktrees');\n\n // Enable/disable worktree support\n worktree\n .command('enable')\n .description('Enable worktree support')\n .option(\n '--isolate',\n 'Isolate contexts between worktrees (default: true)',\n true\n )\n .option('--auto-detect', 'Auto-detect worktrees (default: true)', true)\n .option('--sync-interval <minutes>', 'Context sync interval', '15')\n .action(async (options) => {\n const manager = WorktreeManager.getInstance();\n\n manager.saveConfig({\n enabled: true,\n autoDetect: options.autoDetect,\n isolateContexts: options.isolate,\n shareGlobalContext: false,\n syncInterval: parseInt(options.syncInterval),\n });\n\n console.log(chalk.green('\u2713 Worktree support enabled'));\n\n // Auto-detect current worktrees\n const worktrees = manager.detectWorktrees();\n if (worktrees.length > 0) {\n console.log(chalk.cyan(`\\nDetected ${worktrees.length} worktree(s):`));\n worktrees.forEach((wt) => {\n const marker = wt.isMainWorktree ? ' (main)' : '';\n console.log(chalk.gray(` - ${wt.branch}${marker} at ${wt.path}`));\n });\n }\n });\n\n worktree\n .command('disable')\n .description('Disable worktree support')\n .action(() => {\n const manager = WorktreeManager.getInstance();\n manager.setEnabled(false);\n console.log(chalk.yellow('\u26A0 Worktree support disabled'));\n });\n\n // List all worktrees\n worktree\n .command('list')\n .alias('ls')\n .description('List all git worktrees with StackMemory status')\n .option('-v, --verbose', 'Show detailed information')\n .action((options) => {\n const manager = WorktreeManager.getInstance();\n const worktrees = manager.detectWorktrees();\n\n if (worktrees.length === 0) {\n console.log(chalk.yellow('No worktrees found in current repository'));\n return;\n }\n\n const table = new Table({\n head: ['Branch', 'Path', 'Type', 'Context', 'Last Activity'],\n style: { head: ['cyan'] },\n });\n\n for (const wt of worktrees) {\n const type = wt.isMainWorktree\n ? 'Main'\n : wt.isDetached\n ? 'Detached'\n : 'Branch';\n\n // Check for context\n let contextStatus = '\u2014';\n let lastActivity = '\u2014';\n\n try {\n const context = manager.getWorktreeContext(wt.path);\n if (existsSync(context.dbPath)) {\n contextStatus = '\u2713 Active';\n\n // Get last activity\n const db = new Database(context.dbPath);\n const lastEvent = db\n .prepare('SELECT MAX(created_at) as last FROM events')\n .get() as any;\n\n if (lastEvent?.last) {\n const date = new Date(lastEvent.last);\n lastActivity = date.toLocaleDateString();\n }\n\n db.close();\n } else {\n contextStatus = '\u25CB Not initialized';\n }\n } catch (error: unknown) {\n contextStatus = '\u2717 Error';\n }\n\n table.push([\n wt.branch || 'detached',\n options.verbose\n ? wt.path\n : `.../${wt.path.split('/').slice(-2).join('/')}`,\n type,\n contextStatus,\n lastActivity,\n ]);\n }\n\n console.log(chalk.cyan('\\nGit Worktrees:\\n'));\n console.log(table.toString());\n\n if (manager.isEnabled()) {\n console.log(chalk.gray('\\n\u2713 Worktree support is enabled'));\n const config = manager.getConfig();\n if (config.isolateContexts) {\n console.log(\n chalk.gray(' - Contexts are isolated between worktrees')\n );\n }\n if (config.autoDetect) {\n console.log(chalk.gray(' - Auto-detection is enabled'));\n }\n } else {\n console.log(chalk.gray('\\n\u25CB Worktree support is disabled'));\n console.log(\n chalk.gray(' Run \"stackmemory worktree enable\" to activate')\n );\n }\n });\n\n // Status of current worktree\n worktree\n .command('status')\n .description('Show status of current worktree')\n .action(async () => {\n const manager = WorktreeManager.getInstance();\n const currentPath = process.cwd();\n\n // Detect current worktree\n const worktrees = manager.detectWorktrees(currentPath);\n const current = worktrees.find((w: any) =>\n currentPath.startsWith(w.path)\n );\n\n if (!current) {\n console.log(chalk.yellow('Not in a git worktree'));\n return;\n }\n\n console.log(chalk.cyan('Current Worktree:\\n'));\n console.log(chalk.gray(' Branch:'), current.branch || 'detached');\n console.log(chalk.gray(' Path:'), current.path);\n console.log(\n chalk.gray(' Type:'),\n current.isMainWorktree ? 'Main' : 'Branch'\n );\n console.log(chalk.gray(' Commit:'), current.commit.substring(0, 8));\n\n if (manager.isEnabled()) {\n try {\n const context = manager.getWorktreeContext(current.path);\n console.log(chalk.gray(' Context Path:'), context.contextPath);\n\n if (existsSync(context.dbPath)) {\n const db = new Database(context.dbPath);\n\n // Get statistics\n const stats = db\n .prepare(\n `\n SELECT \n (SELECT COUNT(*) FROM frames) as frames,\n (SELECT COUNT(*) FROM events) as events,\n (SELECT COUNT(*) FROM contexts) as contexts\n `\n )\n .get() as any;\n\n console.log(chalk.cyan('\\nContext Statistics:'));\n console.log(chalk.gray(' Frames:'), stats.frames);\n console.log(chalk.gray(' Events:'), stats.events);\n console.log(chalk.gray(' Contexts:'), stats.contexts);\n\n db.close();\n } else {\n console.log(chalk.yellow('\\nContext not initialized'));\n console.log(chalk.gray(' Run \"stackmemory init\" to initialize'));\n }\n } catch (error: unknown) {\n console.log(\n chalk.red('\\nError accessing context:'),\n (error as Error).message\n );\n }\n } else {\n console.log(chalk.gray('\\nWorktree support is disabled'));\n }\n });\n\n // Create new worktree with StackMemory\n worktree\n .command('create <branch>')\n .description('Create new git worktree with StackMemory context')\n .option('-p, --path <path>', 'Worktree path (default: ../repo-branch)')\n .option('--from <commit>', 'Create branch from commit/branch')\n .option('--init', 'Initialize StackMemory immediately')\n .action(async (branch, options) => {\n const manager = WorktreeManager.getInstance();\n const projectManager = ProjectManager.getInstance();\n\n try {\n // Get current project info\n const project = await projectManager.detectProject();\n const worktreePath = options.path || `../${project.name}-${branch}`;\n\n // Create git worktree\n let gitCommand = `git worktree add -b ${branch} ${worktreePath}`;\n if (options.from) {\n gitCommand += ` ${options.from}`;\n }\n\n console.log(chalk.gray(`Creating worktree: ${gitCommand}`));\n execSync(gitCommand, { stdio: 'inherit' });\n\n console.log(chalk.green(`\u2713 Created worktree at ${worktreePath}`));\n\n // Set up StackMemory context if enabled\n if (manager.isEnabled()) {\n const context = manager.getWorktreeContext(worktreePath);\n console.log(\n chalk.green(`\u2713 Created isolated context at ${context.contextPath}`)\n );\n\n if (options.init) {\n // Initialize StackMemory in new worktree\n const db = new Database(context.dbPath);\n new FrameManager(db, project.id);\n db.close();\n\n console.log(chalk.green('\u2713 StackMemory initialized in worktree'));\n }\n }\n\n console.log(chalk.cyan('\\nNext steps:'));\n console.log(chalk.gray(` cd ${worktreePath}`));\n if (!options.init && manager.isEnabled()) {\n console.log(chalk.gray(' stackmemory init'));\n }\n console.log(chalk.gray(' # Start working in isolated context'));\n } catch (error: unknown) {\n console.error(\n chalk.red('Failed to create worktree:'),\n (error as Error).message\n );\n process.exit(1);\n }\n });\n\n // Sync contexts between worktrees\n worktree\n .command('sync')\n .description('Sync contexts between worktrees')\n .option('-s, --source <branch>', 'Source worktree branch')\n .option('-t, --target <branch>', 'Target worktree branch')\n .option('--type <type>', 'Sync type: push|pull|merge (default: merge)')\n .action(async (options) => {\n const manager = WorktreeManager.getInstance();\n\n if (!manager.isEnabled()) {\n console.log(chalk.yellow('Worktree support is not enabled'));\n console.log(chalk.gray('Run \"stackmemory worktree enable\" first'));\n return;\n }\n\n const worktrees = manager.detectWorktrees();\n\n // Find source and target\n let source = worktrees.find((w: any) => w.branch === options.source);\n let target = worktrees.find((w: any) => w.branch === options.target);\n\n if (!source || !target) {\n // Interactive selection if not specified\n const inquirer = await import('inquirer');\n\n if (!source) {\n const { sourceBranch } = await inquirer.default.prompt([\n {\n type: 'list',\n name: 'sourceBranch',\n message: 'Select source worktree:',\n choices: worktrees.map((w: any) => ({\n name: `${w.branch} (${w.path})`,\n value: w,\n })),\n },\n ]);\n source = sourceBranch;\n }\n\n if (!target) {\n const { targetBranch } = await inquirer.default.prompt([\n {\n type: 'list',\n name: 'targetBranch',\n message: 'Select target worktree:',\n choices: worktrees\n .filter((w: any) => w.path !== source!.path)\n .map((w: any) => ({\n name: `${w.branch} (${w.path})`,\n value: w,\n })),\n },\n ]);\n target = targetBranch;\n }\n }\n\n console.log(chalk.cyan('Syncing contexts:'));\n console.log(chalk.gray(' Source:'), source!.branch);\n console.log(chalk.gray(' Target:'), target!.branch);\n console.log(chalk.gray(' Type:'), options.type || 'merge');\n\n try {\n await manager.syncContexts(\n source!.path,\n target!.path,\n options.type || 'merge'\n );\n\n console.log(chalk.green('\u2713 Context sync completed'));\n } catch (error: unknown) {\n console.error(chalk.red('Sync failed:'), (error as Error).message);\n process.exit(1);\n }\n });\n\n // Clean up stale worktree contexts\n worktree\n .command('cleanup')\n .description('Clean up stale worktree contexts')\n .option('--dry-run', 'Show what would be cleaned without doing it')\n .action((options) => {\n const manager = WorktreeManager.getInstance();\n\n if (options.dryRun) {\n console.log(chalk.yellow('Dry run - no changes will be made'));\n }\n\n console.log(chalk.cyan('Checking for stale worktree contexts...'));\n\n if (!options.dryRun) {\n manager.cleanupStaleContexts();\n console.log(chalk.green('\u2713 Cleanup completed'));\n } else {\n const active = manager.detectWorktrees();\n const stored = manager.listActiveWorktrees();\n\n const activePaths = new Set(active.map((w: any) => w.path));\n const stale = stored.filter((w: any) => !activePaths.has(w.path));\n\n if (stale.length === 0) {\n console.log(chalk.green('No stale contexts found'));\n } else {\n console.log(chalk.yellow(`Found ${stale.length} stale context(s):`));\n stale.forEach((w) => {\n console.log(chalk.gray(` - ${w.branch} at ${w.path}`));\n });\n }\n }\n });\n\n // Switch to different worktree\n worktree\n .command('switch <branch>')\n .description('Switch to a different worktree')\n .action(async (branch) => {\n const manager = WorktreeManager.getInstance();\n const worktrees = manager.detectWorktrees();\n\n const target = worktrees.find((w: any) => w.branch === branch);\n if (!target) {\n console.log(chalk.red(`Worktree '${branch}' not found`));\n console.log(chalk.gray('\\nAvailable worktrees:'));\n worktrees.forEach((w) => {\n console.log(chalk.gray(` - ${w.branch}`));\n });\n process.exit(1);\n }\n\n console.log(chalk.cyan(`Switching to worktree: ${branch}`));\n console.log(chalk.gray(`Path: ${target.path}`));\n console.log(chalk.gray('\\nRun this command to switch:'));\n console.log(chalk.green(` cd ${target.path}`));\n\n if (manager.isEnabled() && !target.isMainWorktree) {\n console.log(chalk.gray('\\nThis worktree has an isolated context'));\n }\n });\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["#!/usr/bin/env node\n/**\n * Git Worktree Management CLI Commands\n * Handles multiple StackMemory instances across git worktrees\n */\n\nimport { Command } from 'commander';\nimport { WorktreeManager } from '../../core/worktree/worktree-manager.js';\nimport { ProjectManager } from '../../core/projects/project-manager.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport Database from 'better-sqlite3';\nimport { execSync, execFileSync } from 'child_process';\nimport shellEscape from 'shell-escape';\nimport { z } from 'zod';\n\n// Input validation schemas\nconst BranchNameSchema = z.string()\n .min(1, 'Branch name cannot be empty')\n .max(100, 'Branch name too long')\n .regex(/^[a-zA-Z0-9._/-]+$/, 'Branch name contains invalid characters')\n .refine(name => !name.includes('..'), 'Branch name cannot contain \"..\"')\n .refine(name => !name.includes(';'), 'Branch name cannot contain \";\"')\n .refine(name => !name.includes('&'), 'Branch name cannot contain \"&\"')\n .refine(name => !name.includes('|'), 'Branch name cannot contain \"|\"')\n .refine(name => !name.includes('$'), 'Branch name cannot contain \"$\"')\n .refine(name => !name.includes('`'), 'Branch name cannot contain \"`\"');\n\nconst PathSchema = z.string()\n .min(1, 'Path cannot be empty')\n .max(500, 'Path too long')\n .regex(/^[a-zA-Z0-9._/-]+$/, 'Path contains invalid characters')\n .refine(path => !path.includes('..'), 'Path cannot contain \"..\"');\n\nconst CommitSchema = z.string()\n .min(1, 'Commit reference cannot be empty')\n .max(100, 'Commit reference too long')\n .regex(/^[a-zA-Z0-9._/-]+$/, 'Commit reference contains invalid characters');\n\nexport function registerWorktreeCommands(program: Command): void {\n const worktree = program\n .command('worktree')\n .alias('wt')\n .description('Manage StackMemory across git worktrees');\n\n // Enable/disable worktree support\n worktree\n .command('enable')\n .description('Enable worktree support')\n .option(\n '--isolate',\n 'Isolate contexts between worktrees (default: true)',\n true\n )\n .option('--auto-detect', 'Auto-detect worktrees (default: true)', true)\n .option('--sync-interval <minutes>', 'Context sync interval', '15')\n .action(async (options) => {\n const manager = WorktreeManager.getInstance();\n\n manager.saveConfig({\n enabled: true,\n autoDetect: options.autoDetect,\n isolateContexts: options.isolate,\n shareGlobalContext: false,\n syncInterval: parseInt(options.syncInterval),\n });\n\n console.log(chalk.green('\u2713 Worktree support enabled'));\n\n // Auto-detect current worktrees\n const worktrees = manager.detectWorktrees();\n if (worktrees.length > 0) {\n console.log(chalk.cyan(`\\nDetected ${worktrees.length} worktree(s):`));\n worktrees.forEach((wt) => {\n const marker = wt.isMainWorktree ? ' (main)' : '';\n console.log(chalk.gray(` - ${wt.branch}${marker} at ${wt.path}`));\n });\n }\n });\n\n worktree\n .command('disable')\n .description('Disable worktree support')\n .action(() => {\n const manager = WorktreeManager.getInstance();\n manager.setEnabled(false);\n console.log(chalk.yellow('\u26A0 Worktree support disabled'));\n });\n\n // List all worktrees\n worktree\n .command('list')\n .alias('ls')\n .description('List all git worktrees with StackMemory status')\n .option('-v, --verbose', 'Show detailed information')\n .action((options) => {\n const manager = WorktreeManager.getInstance();\n const worktrees = manager.detectWorktrees();\n\n if (worktrees.length === 0) {\n console.log(chalk.yellow('No worktrees found in current repository'));\n return;\n }\n\n const table = new Table({\n head: ['Branch', 'Path', 'Type', 'Context', 'Last Activity'],\n style: { head: ['cyan'] },\n });\n\n for (const wt of worktrees) {\n const type = wt.isMainWorktree\n ? 'Main'\n : wt.isDetached\n ? 'Detached'\n : 'Branch';\n\n // Check for context\n let contextStatus = '\u2014';\n let lastActivity = '\u2014';\n\n try {\n const context = manager.getWorktreeContext(wt.path);\n if (existsSync(context.dbPath)) {\n contextStatus = '\u2713 Active';\n\n // Get last activity\n const db = new Database(context.dbPath);\n const lastEvent = db\n .prepare('SELECT MAX(created_at) as last FROM events')\n .get() as any;\n\n if (lastEvent?.last) {\n const date = new Date(lastEvent.last);\n lastActivity = date.toLocaleDateString();\n }\n\n db.close();\n } else {\n contextStatus = '\u25CB Not initialized';\n }\n } catch (error: unknown) {\n contextStatus = '\u2717 Error';\n }\n\n table.push([\n wt.branch || 'detached',\n options.verbose\n ? wt.path\n : `.../${wt.path.split('/').slice(-2).join('/')}`,\n type,\n contextStatus,\n lastActivity,\n ]);\n }\n\n console.log(chalk.cyan('\\nGit Worktrees:\\n'));\n console.log(table.toString());\n\n if (manager.isEnabled()) {\n console.log(chalk.gray('\\n\u2713 Worktree support is enabled'));\n const config = manager.getConfig();\n if (config.isolateContexts) {\n console.log(\n chalk.gray(' - Contexts are isolated between worktrees')\n );\n }\n if (config.autoDetect) {\n console.log(chalk.gray(' - Auto-detection is enabled'));\n }\n } else {\n console.log(chalk.gray('\\n\u25CB Worktree support is disabled'));\n console.log(\n chalk.gray(' Run \"stackmemory worktree enable\" to activate')\n );\n }\n });\n\n // Status of current worktree\n worktree\n .command('status')\n .description('Show status of current worktree')\n .action(async () => {\n const manager = WorktreeManager.getInstance();\n const currentPath = process.cwd();\n\n // Detect current worktree\n const worktrees = manager.detectWorktrees(currentPath);\n const current = worktrees.find((w: any) =>\n currentPath.startsWith(w.path)\n );\n\n if (!current) {\n console.log(chalk.yellow('Not in a git worktree'));\n return;\n }\n\n console.log(chalk.cyan('Current Worktree:\\n'));\n console.log(chalk.gray(' Branch:'), current.branch || 'detached');\n console.log(chalk.gray(' Path:'), current.path);\n console.log(\n chalk.gray(' Type:'),\n current.isMainWorktree ? 'Main' : 'Branch'\n );\n console.log(chalk.gray(' Commit:'), current.commit.substring(0, 8));\n\n if (manager.isEnabled()) {\n try {\n const context = manager.getWorktreeContext(current.path);\n console.log(chalk.gray(' Context Path:'), context.contextPath);\n\n if (existsSync(context.dbPath)) {\n const db = new Database(context.dbPath);\n\n // Get statistics\n const stats = db\n .prepare(\n `\n SELECT \n (SELECT COUNT(*) FROM frames) as frames,\n (SELECT COUNT(*) FROM events) as events,\n (SELECT COUNT(*) FROM contexts) as contexts\n `\n )\n .get() as any;\n\n console.log(chalk.cyan('\\nContext Statistics:'));\n console.log(chalk.gray(' Frames:'), stats.frames);\n console.log(chalk.gray(' Events:'), stats.events);\n console.log(chalk.gray(' Contexts:'), stats.contexts);\n\n db.close();\n } else {\n console.log(chalk.yellow('\\nContext not initialized'));\n console.log(chalk.gray(' Run \"stackmemory init\" to initialize'));\n }\n } catch (error: unknown) {\n console.log(\n chalk.red('\\nError accessing context:'),\n (error as Error).message\n );\n }\n } else {\n console.log(chalk.gray('\\nWorktree support is disabled'));\n }\n });\n\n // Create new worktree with StackMemory\n worktree\n .command('create <branch>')\n .description('Create new git worktree with StackMemory context')\n .option('-p, --path <path>', 'Worktree path (default: ../repo-branch)')\n .option('--from <commit>', 'Create branch from commit/branch')\n .option('--init', 'Initialize StackMemory immediately')\n .action(async (branch, options) => {\n const manager = WorktreeManager.getInstance();\n const projectManager = ProjectManager.getInstance();\n\n try {\n // Validate and sanitize inputs\n const validatedBranch = BranchNameSchema.parse(branch);\n \n // Get current project info\n const project = await projectManager.detectProject();\n const worktreePath = options.path || `../${project.name}-${validatedBranch}`;\n \n // Validate path if provided\n if (options.path) {\n PathSchema.parse(options.path);\n }\n \n // Validate commit reference if provided\n if (options.from) {\n CommitSchema.parse(options.from);\n }\n\n // Create git worktree using execFileSync for safety\n const gitArgs = ['worktree', 'add', '-b', validatedBranch, worktreePath];\n if (options.from) {\n gitArgs.push(options.from);\n }\n\n console.log(chalk.gray(`Creating worktree: git ${gitArgs.join(' ')}`));\n execFileSync('git', gitArgs, { stdio: 'inherit' });\n\n console.log(chalk.green(`\u2713 Created worktree at ${worktreePath}`));\n\n // Set up StackMemory context if enabled\n if (manager.isEnabled()) {\n const context = manager.getWorktreeContext(worktreePath);\n console.log(\n chalk.green(`\u2713 Created isolated context at ${context.contextPath}`)\n );\n\n if (options.init) {\n // Initialize StackMemory in new worktree\n const db = new Database(context.dbPath);\n new FrameManager(db, project.id);\n db.close();\n\n console.log(chalk.green('\u2713 StackMemory initialized in worktree'));\n }\n }\n\n console.log(chalk.cyan('\\nNext steps:'));\n console.log(chalk.gray(` cd ${worktreePath}`));\n if (!options.init && manager.isEnabled()) {\n console.log(chalk.gray(' stackmemory init'));\n }\n console.log(chalk.gray(' # Start working in isolated context'));\n } catch (error: unknown) {\n if (error instanceof z.ZodError) {\n console.error(chalk.red('Invalid input:'));\n error.errors.forEach(err => {\n console.error(chalk.red(` ${err.path.join('.')}: ${err.message}`));\n });\n } else {\n console.error(\n chalk.red('Failed to create worktree:'),\n (error as Error).message\n );\n }\n process.exit(1);\n }\n });\n\n // Sync contexts between worktrees\n worktree\n .command('sync')\n .description('Sync contexts between worktrees')\n .option('-s, --source <branch>', 'Source worktree branch')\n .option('-t, --target <branch>', 'Target worktree branch')\n .option('--type <type>', 'Sync type: push|pull|merge (default: merge)')\n .action(async (options) => {\n const manager = WorktreeManager.getInstance();\n\n if (!manager.isEnabled()) {\n console.log(chalk.yellow('Worktree support is not enabled'));\n console.log(chalk.gray('Run \"stackmemory worktree enable\" first'));\n return;\n }\n\n const worktrees = manager.detectWorktrees();\n\n // Find source and target\n let source = worktrees.find((w: any) => w.branch === options.source);\n let target = worktrees.find((w: any) => w.branch === options.target);\n\n if (!source || !target) {\n // Interactive selection if not specified\n const inquirer = await import('inquirer');\n\n if (!source) {\n const { sourceBranch } = await inquirer.default.prompt([\n {\n type: 'list',\n name: 'sourceBranch',\n message: 'Select source worktree:',\n choices: worktrees.map((w: any) => ({\n name: `${w.branch} (${w.path})`,\n value: w,\n })),\n },\n ]);\n source = sourceBranch;\n }\n\n if (!target) {\n const { targetBranch } = await inquirer.default.prompt([\n {\n type: 'list',\n name: 'targetBranch',\n message: 'Select target worktree:',\n choices: worktrees\n .filter((w: any) => w.path !== source!.path)\n .map((w: any) => ({\n name: `${w.branch} (${w.path})`,\n value: w,\n })),\n },\n ]);\n target = targetBranch;\n }\n }\n\n console.log(chalk.cyan('Syncing contexts:'));\n console.log(chalk.gray(' Source:'), source!.branch);\n console.log(chalk.gray(' Target:'), target!.branch);\n console.log(chalk.gray(' Type:'), options.type || 'merge');\n\n try {\n await manager.syncContexts(\n source!.path,\n target!.path,\n options.type || 'merge'\n );\n\n console.log(chalk.green('\u2713 Context sync completed'));\n } catch (error: unknown) {\n console.error(chalk.red('Sync failed:'), (error as Error).message);\n process.exit(1);\n }\n });\n\n // Clean up stale worktree contexts\n worktree\n .command('cleanup')\n .description('Clean up stale worktree contexts')\n .option('--dry-run', 'Show what would be cleaned without doing it')\n .action((options) => {\n const manager = WorktreeManager.getInstance();\n\n if (options.dryRun) {\n console.log(chalk.yellow('Dry run - no changes will be made'));\n }\n\n console.log(chalk.cyan('Checking for stale worktree contexts...'));\n\n if (!options.dryRun) {\n manager.cleanupStaleContexts();\n console.log(chalk.green('\u2713 Cleanup completed'));\n } else {\n const active = manager.detectWorktrees();\n const stored = manager.listActiveWorktrees();\n\n const activePaths = new Set(active.map((w: any) => w.path));\n const stale = stored.filter((w: any) => !activePaths.has(w.path));\n\n if (stale.length === 0) {\n console.log(chalk.green('No stale contexts found'));\n } else {\n console.log(chalk.yellow(`Found ${stale.length} stale context(s):`));\n stale.forEach((w) => {\n console.log(chalk.gray(` - ${w.branch} at ${w.path}`));\n });\n }\n }\n });\n\n // Switch to different worktree\n worktree\n .command('switch <branch>')\n .description('Switch to a different worktree')\n .action(async (branch) => {\n const manager = WorktreeManager.getInstance();\n const worktrees = manager.detectWorktrees();\n\n const target = worktrees.find((w: any) => w.branch === branch);\n if (!target) {\n console.log(chalk.red(`Worktree '${branch}' not found`));\n console.log(chalk.gray('\\nAvailable worktrees:'));\n worktrees.forEach((w) => {\n console.log(chalk.gray(` - ${w.branch}`));\n });\n process.exit(1);\n }\n\n console.log(chalk.cyan(`Switching to worktree: ${branch}`));\n console.log(chalk.gray(`Path: ${target.path}`));\n console.log(chalk.gray('\\nRun this command to switch:'));\n console.log(chalk.green(` cd ${target.path}`));\n\n if (manager.isEnabled() && !target.isMainWorktree) {\n console.log(chalk.gray('\\nThis worktree has an isolated context'));\n }\n });\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/cli/index.js CHANGED
@@ -5,7 +5,7 @@ import { logger } from "../core/monitoring/logger.js";
5
5
  import { FrameManager } from "../core/context/frame-manager.js";
6
6
  import { sessionManager, FrameQueryMode } from "../core/session/index.js";
7
7
  import { sharedContextLayer } from "../core/context/shared-context-layer.js";
8
- import { PebblesTaskStore } from "../features/tasks/pebbles-task-store.js";
8
+ import { LinearTaskManager } from "../features/tasks/linear-task-manager.js";
9
9
  import {
10
10
  LinearAuthManager,
11
11
  LinearOAuthSetup
@@ -44,6 +44,7 @@ import { createAgentCommand } from "./commands/agent.js";
44
44
  import { createHandoffCommand } from "./commands/handoff.js";
45
45
  import { createStorageCommand } from "./commands/storage.js";
46
46
  import { createSkillsCommand } from "./commands/skills.js";
47
+ import { createTestCommand } from "./commands/test.js";
47
48
  import clearCommand from "./commands/clear.js";
48
49
  import createWorkflowCommand from "./commands/workflow.js";
49
50
  import monitorCommand from "./commands/monitor.js";
@@ -325,7 +326,7 @@ linearCommand.command("sync").description("Sync tasks with Linear").option(
325
326
  return;
326
327
  }
327
328
  const db = new Database(dbPath);
328
- const taskStore = new PebblesTaskStore(projectRoot, db);
329
+ const taskStore = new LinearTaskManager(projectRoot, db);
329
330
  const syncConfig = {
330
331
  ...DEFAULT_SYNC_CONFIG,
331
332
  enabled: true,
@@ -554,7 +555,7 @@ linearCommand.command("update <issueId>").description("Update Linear task status
554
555
  const dbPath = join(projectRoot, ".stackmemory", "context.db");
555
556
  if (existsSync(dbPath)) {
556
557
  const db = new Database(dbPath);
557
- const taskStore = new PebblesTaskStore(projectRoot, db);
558
+ const taskStore = new LinearTaskManager(projectRoot, db);
558
559
  const { LinearSyncEngine: LinearSyncEngine2, DEFAULT_SYNC_CONFIG: DEFAULT_SYNC_CONFIG2 } = await import("../integrations/linear/sync.js");
559
560
  const syncEngine = new LinearSyncEngine2(
560
561
  taskStore,
@@ -989,6 +990,7 @@ program.addCommand(createAgentCommand());
989
990
  program.addCommand(createHandoffCommand());
990
991
  program.addCommand(createStorageCommand());
991
992
  program.addCommand(createSkillsCommand());
993
+ program.addCommand(createTestCommand());
992
994
  program.addCommand(clearCommand);
993
995
  program.addCommand(createWorkflowCommand());
994
996
  program.addCommand(monitorCommand);