@stackmemoryai/stackmemory 0.3.6 → 0.3.8
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.
- package/dist/agents/core/agent-task-manager.js +5 -5
- package/dist/agents/core/agent-task-manager.js.map +2 -2
- package/dist/agents/verifiers/base-verifier.js +2 -2
- package/dist/agents/verifiers/base-verifier.js.map +2 -2
- package/dist/agents/verifiers/formatter-verifier.js.map +2 -2
- package/dist/agents/verifiers/llm-judge.js.map +2 -2
- package/dist/cli/claude-sm.js +13 -13
- package/dist/cli/claude-sm.js.map +2 -2
- package/dist/cli/codex-sm.js +13 -13
- package/dist/cli/codex-sm.js.map +2 -2
- package/dist/cli/commands/agent.js.map +2 -2
- package/dist/cli/commands/chromadb.js +261 -46
- package/dist/cli/commands/chromadb.js.map +2 -2
- package/dist/cli/commands/clear.js +10 -3
- package/dist/cli/commands/clear.js.map +2 -2
- package/dist/cli/commands/config.js +43 -33
- package/dist/cli/commands/config.js.map +2 -2
- package/dist/cli/commands/context.js +13 -2
- package/dist/cli/commands/context.js.map +2 -2
- package/dist/cli/commands/dashboard.js +41 -13
- package/dist/cli/commands/dashboard.js.map +2 -2
- package/dist/cli/commands/gc.js +251 -0
- package/dist/cli/commands/gc.js.map +7 -0
- package/dist/cli/commands/handoff.js +12 -1
- package/dist/cli/commands/handoff.js.map +2 -2
- package/dist/cli/commands/infinite-storage.js +92 -40
- package/dist/cli/commands/infinite-storage.js.map +2 -2
- package/dist/cli/commands/linear-create.js +49 -10
- package/dist/cli/commands/linear-create.js.map +2 -2
- package/dist/cli/commands/linear-list.js +45 -11
- package/dist/cli/commands/linear-list.js.map +2 -2
- package/dist/cli/commands/linear-migrate.js +29 -5
- package/dist/cli/commands/linear-migrate.js.map +2 -2
- package/dist/cli/commands/linear-test.js +26 -7
- package/dist/cli/commands/linear-test.js.map +2 -2
- package/dist/cli/commands/linear-unified.js +350 -0
- package/dist/cli/commands/linear-unified.js.map +7 -0
- package/dist/cli/commands/linear.js +17 -6
- package/dist/cli/commands/linear.js.map +2 -2
- package/dist/cli/commands/monitor.js.map +2 -2
- package/dist/cli/commands/onboard.js +35 -8
- package/dist/cli/commands/onboard.js.map +2 -2
- package/dist/cli/commands/quality.js +2 -7
- package/dist/cli/commands/quality.js.map +2 -2
- package/dist/cli/commands/search.js.map +2 -2
- package/dist/cli/commands/session.js +23 -6
- package/dist/cli/commands/session.js.map +2 -2
- package/dist/cli/commands/skills.js +84 -28
- package/dist/cli/commands/skills.js.map +2 -2
- package/dist/cli/commands/storage.js +119 -38
- package/dist/cli/commands/storage.js.map +2 -2
- package/dist/cli/commands/tasks.js.map +2 -2
- package/dist/cli/commands/tui.js +13 -2
- package/dist/cli/commands/tui.js.map +2 -2
- package/dist/cli/commands/webhook.js +71 -21
- package/dist/cli/commands/webhook.js.map +2 -2
- package/dist/cli/commands/workflow.js +11 -7
- package/dist/cli/commands/workflow.js.map +2 -2
- package/dist/cli/commands/worktree.js +34 -13
- package/dist/cli/commands/worktree.js.map +2 -2
- package/dist/cli/index.js +7 -5
- package/dist/cli/index.js.map +2 -2
- package/dist/core/config/config-manager.js.map +2 -2
- package/dist/core/config/types.js.map +1 -1
- package/dist/core/context/auto-context.js +10 -6
- package/dist/core/context/auto-context.js.map +2 -2
- package/dist/core/context/compaction-handler.js.map +2 -2
- package/dist/core/context/context-bridge.js.map +2 -2
- package/dist/core/context/dual-stack-manager.js.map +2 -2
- package/dist/core/context/frame-database.js +13 -3
- package/dist/core/context/frame-database.js.map +2 -2
- package/dist/core/context/frame-digest.js +7 -5
- package/dist/core/context/frame-digest.js.map +2 -2
- package/dist/core/context/frame-handoff-manager.js.map +2 -2
- package/dist/core/context/frame-manager.js +12 -1
- package/dist/core/context/frame-manager.js.map +2 -2
- package/dist/core/context/frame-stack.js +16 -5
- package/dist/core/context/frame-stack.js.map +2 -2
- package/dist/core/context/incremental-gc.js +286 -0
- package/dist/core/context/incremental-gc.js.map +7 -0
- package/dist/core/context/index.js.map +1 -1
- package/dist/core/context/permission-manager.js +12 -1
- package/dist/core/context/permission-manager.js.map +2 -2
- package/dist/core/context/refactored-frame-manager.js +12 -3
- package/dist/core/context/refactored-frame-manager.js.map +2 -2
- package/dist/core/context/shared-context-layer.js +16 -3
- package/dist/core/context/shared-context-layer.js.map +2 -2
- package/dist/core/context/stack-merge-resolver.js.map +2 -2
- package/dist/core/context/validation.js.map +2 -2
- package/dist/core/database/batch-operations.js +112 -86
- package/dist/core/database/batch-operations.js.map +2 -2
- package/dist/core/database/connection-pool.js.map +2 -2
- package/dist/core/database/migration-manager.js.map +2 -2
- package/dist/core/database/paradedb-adapter.js.map +2 -2
- package/dist/core/database/query-cache.js +19 -9
- package/dist/core/database/query-cache.js.map +2 -2
- package/dist/core/database/query-router.js.map +2 -2
- package/dist/core/database/sqlite-adapter.js +1 -1
- package/dist/core/database/sqlite-adapter.js.map +2 -2
- package/dist/core/digest/enhanced-hybrid-digest.js +8 -2
- package/dist/core/digest/enhanced-hybrid-digest.js.map +2 -2
- package/dist/core/errors/recovery.js +9 -2
- package/dist/core/errors/recovery.js.map +2 -2
- package/dist/core/frame/workflow-templates-stub.js.map +1 -1
- package/dist/core/frame/workflow-templates.js +40 -1
- package/dist/core/frame/workflow-templates.js.map +2 -2
- package/dist/core/merge/resolution-engine.js.map +2 -2
- package/dist/core/monitoring/error-handler.js.map +2 -2
- package/dist/core/monitoring/logger.js +19 -3
- package/dist/core/monitoring/logger.js.map +2 -2
- package/dist/core/monitoring/metrics.js +13 -2
- package/dist/core/monitoring/metrics.js.map +2 -2
- package/dist/core/monitoring/progress-tracker.js +12 -1
- package/dist/core/monitoring/progress-tracker.js.map +2 -2
- package/dist/core/monitoring/session-monitor.js.map +2 -2
- package/dist/core/performance/context-cache.js.map +2 -2
- package/dist/core/performance/lazy-context-loader.js +24 -20
- package/dist/core/performance/lazy-context-loader.js.map +2 -2
- package/dist/core/performance/monitor.js.map +2 -2
- package/dist/core/performance/optimized-frame-context.js +27 -12
- package/dist/core/performance/optimized-frame-context.js.map +2 -2
- package/dist/core/performance/performance-benchmark.js +10 -6
- package/dist/core/performance/performance-benchmark.js.map +2 -2
- package/dist/core/performance/performance-profiler.js +63 -15
- package/dist/core/performance/performance-profiler.js.map +2 -2
- package/dist/core/performance/streaming-jsonl-parser.js +5 -1
- package/dist/core/performance/streaming-jsonl-parser.js.map +2 -2
- package/dist/core/persistence/postgres-adapter.js.map +2 -2
- package/dist/core/projects/project-manager.js +14 -20
- package/dist/core/projects/project-manager.js.map +2 -2
- package/dist/core/retrieval/context-retriever.js.map +2 -2
- package/dist/core/retrieval/graph-retrieval.js.map +2 -2
- package/dist/core/retrieval/llm-context-retrieval.js.map +2 -2
- package/dist/core/retrieval/retrieval-benchmarks.js.map +2 -2
- package/dist/core/retrieval/summary-generator.js.map +2 -2
- package/dist/core/session/clear-survival-stub.js +5 -1
- package/dist/core/session/clear-survival-stub.js.map +2 -2
- package/dist/core/session/clear-survival.js +35 -0
- package/dist/core/session/clear-survival.js.map +2 -2
- package/dist/core/session/handoff-generator.js.map +2 -2
- package/dist/core/session/index.js.map +1 -1
- package/dist/core/session/session-manager.js +16 -5
- package/dist/core/session/session-manager.js.map +2 -2
- package/dist/core/skills/skill-storage.js +13 -2
- package/dist/core/skills/skill-storage.js.map +2 -2
- package/dist/core/storage/chromadb-adapter.js +6 -2
- package/dist/core/storage/chromadb-adapter.js.map +2 -2
- package/dist/core/storage/chromadb-simple.js +17 -5
- package/dist/core/storage/chromadb-simple.js.map +2 -2
- package/dist/core/storage/infinite-storage.js +109 -46
- package/dist/core/storage/infinite-storage.js.map +2 -2
- package/dist/core/storage/railway-optimized-storage.js +67 -30
- package/dist/core/storage/railway-optimized-storage.js.map +2 -2
- package/dist/core/storage/remote-storage.js +53 -24
- package/dist/core/storage/remote-storage.js.map +2 -2
- package/dist/core/trace/cli-trace-wrapper.js +25 -7
- package/dist/core/trace/cli-trace-wrapper.js.map +2 -2
- package/dist/core/trace/db-trace-wrapper.js +96 -68
- package/dist/core/trace/db-trace-wrapper.js.map +2 -2
- package/dist/core/trace/debug-trace.js +44 -16
- package/dist/core/trace/debug-trace.js.map +2 -2
- package/dist/core/trace/index.js +50 -35
- package/dist/core/trace/index.js.map +2 -2
- package/dist/core/trace/linear-api-wrapper.js +10 -5
- package/dist/core/trace/linear-api-wrapper.js.map +2 -2
- package/dist/core/trace/trace-demo.js +26 -11
- package/dist/core/trace/trace-demo.js.map +2 -2
- package/dist/core/trace/trace-detector.js +9 -2
- package/dist/core/trace/trace-detector.js.map +2 -2
- package/dist/core/trace/trace-store.js.map +2 -2
- package/dist/core/trace/types.js.map +1 -1
- package/dist/core/utils/compression.js.map +1 -1
- package/dist/core/utils/update-checker.js.map +2 -2
- package/dist/core/worktree/worktree-manager.js +18 -7
- package/dist/core/worktree/worktree-manager.js.map +2 -2
- package/dist/features/analytics/api/analytics-api.js.map +2 -2
- package/dist/features/analytics/core/analytics-service.js +12 -1
- package/dist/features/analytics/core/analytics-service.js.map +2 -2
- package/dist/features/analytics/queries/metrics-queries.js +1 -1
- package/dist/features/analytics/queries/metrics-queries.js.map +2 -2
- package/dist/features/tasks/pebbles-task-store.js.map +2 -2
- package/dist/features/tui/components/analytics-panel.js +36 -15
- package/dist/features/tui/components/analytics-panel.js.map +2 -2
- package/dist/features/tui/components/pr-tracker.js +19 -7
- package/dist/features/tui/components/pr-tracker.js.map +2 -2
- package/dist/features/tui/components/session-monitor.js +22 -9
- package/dist/features/tui/components/session-monitor.js.map +2 -2
- package/dist/features/tui/components/subagent-fleet.js +20 -13
- package/dist/features/tui/components/subagent-fleet.js.map +2 -2
- package/dist/features/tui/components/task-board.js +666 -2
- package/dist/features/tui/components/task-board.js.map +2 -2
- package/dist/features/tui/index.js +16 -5
- package/dist/features/tui/index.js.map +2 -2
- package/dist/features/tui/services/data-service.js +30 -15
- package/dist/features/tui/services/data-service.js.map +2 -2
- package/dist/features/tui/services/linear-task-reader.js +3 -1
- package/dist/features/tui/services/linear-task-reader.js.map +2 -2
- package/dist/features/tui/services/websocket-client.js +16 -3
- package/dist/features/tui/services/websocket-client.js.map +2 -2
- package/dist/features/tui/terminal-compat.js +33 -18
- package/dist/features/tui/terminal-compat.js.map +2 -2
- package/dist/features/web/client/stores/task-store.js.map +2 -2
- package/dist/features/web/server/index.js +31 -12
- package/dist/features/web/server/index.js.map +2 -2
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +2 -2
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +2 -2
- package/dist/integrations/claude-code/post-task-hooks.js.map +2 -2
- package/dist/integrations/linear/auth.js +17 -6
- package/dist/integrations/linear/auth.js.map +2 -2
- package/dist/integrations/linear/auto-sync.js.map +2 -2
- package/dist/integrations/linear/client.js.map +2 -2
- package/dist/integrations/linear/config.js.map +2 -2
- package/dist/integrations/linear/migration.js.map +2 -2
- package/dist/integrations/linear/oauth-server.js +13 -2
- package/dist/integrations/linear/oauth-server.js.map +2 -2
- package/dist/integrations/linear/rest-client.js.map +2 -2
- package/dist/integrations/linear/sync-enhanced.js +202 -0
- package/dist/integrations/linear/sync-enhanced.js.map +7 -0
- package/dist/integrations/linear/sync-manager.js.map +2 -2
- package/dist/integrations/linear/sync-service.js +24 -14
- package/dist/integrations/linear/sync-service.js.map +2 -2
- package/dist/integrations/linear/sync.js +196 -3
- package/dist/integrations/linear/sync.js.map +2 -2
- package/dist/integrations/linear/unified-sync.js +560 -0
- package/dist/integrations/linear/unified-sync.js.map +7 -0
- package/dist/integrations/linear/webhook-handler.js +12 -1
- package/dist/integrations/linear/webhook-handler.js.map +2 -2
- package/dist/integrations/linear/webhook-server.js +29 -19
- package/dist/integrations/linear/webhook-server.js.map +2 -2
- package/dist/integrations/linear/webhook.js +12 -1
- package/dist/integrations/linear/webhook.js.map +2 -2
- package/dist/integrations/mcp/handlers/context-handlers.js.map +2 -2
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +2 -2
- package/dist/integrations/mcp/handlers/skill-handlers.js +13 -2
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +2 -2
- package/dist/integrations/mcp/handlers/task-handlers.js.map +2 -2
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +2 -2
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +2 -2
- package/dist/integrations/mcp/refactored-server.js +15 -4
- package/dist/integrations/mcp/refactored-server.js.map +2 -2
- package/dist/integrations/mcp/server.js +12 -1
- package/dist/integrations/mcp/server.js.map +2 -2
- package/dist/integrations/mcp/tool-definitions.js.map +2 -2
- package/dist/integrations/pg-aiguide/embedding-provider.js +13 -2
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +2 -2
- package/dist/integrations/pg-aiguide/semantic-search.js.map +2 -2
- package/dist/mcp/stackmemory-mcp-server.js +1 -1
- package/dist/mcp/stackmemory-mcp-server.js.map +2 -2
- package/dist/middleware/exponential-rate-limiter.js.map +2 -2
- package/dist/servers/production/auth-middleware.js +13 -2
- package/dist/servers/production/auth-middleware.js.map +2 -2
- package/dist/servers/railway/index.js +22 -11
- package/dist/servers/railway/index.js.map +2 -2
- package/dist/services/config-service.js +6 -7
- package/dist/services/config-service.js.map +2 -2
- package/dist/services/context-service.js +11 -12
- package/dist/services/context-service.js.map +2 -2
- package/dist/skills/claude-skills.js +108 -3
- package/dist/skills/claude-skills.js.map +2 -2
- package/dist/skills/dashboard-launcher.js.map +2 -2
- package/dist/skills/repo-ingestion-skill.js +561 -0
- package/dist/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/utils/env.js +46 -0
- package/dist/utils/env.js.map +7 -0
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +2 -2
- package/package.json +5 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/commands/workflow.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Workflow command for StackMemory\n * Manages workflow templates and execution\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as path from 'path';\nimport Database from 'better-sqlite3';\nimport { existsSync } from 'fs';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport { workflowTemplates } from '../../core/frame/workflow-templates
|
|
5
|
-
"mappings": "AAKA,SAAS,eAAe;AACxB,OAAO,WAAW;AAClB,YAAY,UAAU;AACtB,OAAO,cAAc;AACrB,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,yBAAyB;AAClC,SAAS,sBAAsB;
|
|
4
|
+
"sourcesContent": ["/**\n * Workflow command for StackMemory\n * Manages workflow templates and execution\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as path from 'path';\nimport Database from 'better-sqlite3';\nimport { existsSync } from 'fs';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport { workflowTemplates } from '../../core/frame/workflow-templates.js';\nimport { sessionManager } from '../../core/session/session-manager.js';\nimport { getEnv, getOptionalEnv } from '../../utils/env.js';\n\nexport function createWorkflowCommand(): Command {\n const cmd = new Command('workflow')\n .description('Manage structured workflow templates')\n .option('-l, --list', 'List available workflow templates')\n .option('-s, --start <template>', 'Start a new workflow from template')\n .option('--status', 'Show status of active workflow')\n .action(async (options) => {\n try {\n const projectRoot = process.cwd();\n const dbPath = path.join(projectRoot, '.stackmemory', 'context.db');\n\n // Check if StackMemory is initialized\n if (!existsSync(dbPath)) {\n console.error(chalk.red('\u2717 StackMemory not initialized'));\n console.log(chalk.yellow('Run: stackmemory init'));\n if (process.env['NODE_ENV'] !== 'test') {\n process.exit(1);\n }\n return;\n }\n\n if (options.list) {\n await listWorkflows();\n } else if (options.start) {\n await startWorkflow(options.start, dbPath);\n } else if (options.status) {\n await showWorkflowStatus(dbPath);\n } else {\n // Default: list workflows\n await listWorkflows();\n }\n } catch (error: unknown) {\n console.error(chalk.red('Error: ' + (error as Error).message));\n if (process.env['NODE_ENV'] !== 'test') {\n process.exit(1);\n }\n }\n });\n\n return cmd;\n}\n\nasync function listWorkflows(): Promise<void> {\n console.log(chalk.bold('\\n\uD83D\uDCCB Available Workflows'));\n console.log('\u2500'.repeat(40));\n\n Object.entries(workflowTemplates).forEach(([key, template]) => {\n console.log(chalk.cyan(`\\n${key}:`));\n console.log(` ${template.description}`);\n console.log(chalk.gray(` Phases: ${template.phases.length}`));\n\n // Show first few phases\n template.phases.slice(0, 3).forEach((phase) => {\n console.log(` \u2022 ${phase.name}`);\n });\n if (template.phases.length > 3) {\n console.log(` ... and ${template.phases.length - 3} more`);\n }\n });\n\n console.log(\n chalk.gray('\\nStart a workflow: stackmemory workflow --start <name>')\n );\n}\n\nasync function startWorkflow(\n workflowName: string,\n dbPath: string\n): Promise<void> {\n const template =\n workflowTemplates[workflowName as keyof typeof workflowTemplates];\n\n if (!template) {\n console.error(chalk.red(`Unknown workflow: ${workflowName}`));\n console.log(chalk.yellow('Use --list to see available workflows'));\n if (process.env['NODE_ENV'] !== 'test') {\n process.exit(1);\n }\n return;\n }\n\n const db = new Database(dbPath);\n\n try {\n // Initialize session\n await sessionManager.initialize();\n const session = await sessionManager.getOrCreateSession({\n projectPath: process.cwd(),\n });\n\n const frameManager = new FrameManager(db, session.projectId);\n\n // Create root frame for workflow\n const workflowId = await frameManager.createFrame({\n type: 'workflow',\n name: `${template.name} Workflow`,\n metadata: {\n workflow: workflowName,\n phases: template.phases.map((p: any) => p.name),\n currentPhase: 0,\n startTime: Date.now(),\n },\n });\n\n console.log(chalk.green(`\u2713 Started ${workflowName} workflow`));\n console.log(chalk.cyan(`Workflow ID: ${workflowId}`));\n console.log('\\nPhases:');\n\n template.phases.forEach((phase, index) => {\n const marker = index === 0 ? '\u2192' : ' ';\n console.log(`${marker} ${index + 1}. ${phase.name}`);\n });\n\n console.log(chalk.gray('\\nTrack progress: stackmemory workflow --status'));\n } finally {\n db.close();\n }\n}\n\nasync function showWorkflowStatus(dbPath: string): Promise<void> {\n const db = new Database(dbPath);\n\n try {\n // Get active workflow frames\n const workflows = db\n .prepare(\n `\n SELECT * FROM frames \n WHERE type = 'workflow' \n AND state = 'active'\n ORDER BY created_at DESC\n `\n )\n .all() as any[];\n\n if (workflows.length === 0) {\n console.log(chalk.yellow('No active workflows'));\n return;\n }\n\n console.log(chalk.bold('\\n\uD83D\uDD04 Active Workflows'));\n console.log('\u2500'.repeat(40));\n\n workflows.forEach((workflow) => {\n const metadata = workflow.metadata ? JSON.parse(workflow.metadata) : {};\n const elapsed = Date.now() - workflow.created_at;\n const minutes = Math.floor(elapsed / 60000);\n\n console.log(chalk.cyan(`\\n${workflow.name}`));\n console.log(` ID: ${workflow.frame_id}`);\n console.log(` Duration: ${minutes} minutes`);\n\n if (metadata.phases) {\n const current = metadata.currentPhase || 0;\n console.log(` Phase: ${current + 1}/${metadata.phases.length}`);\n console.log(` Current: ${metadata.phases[current]}`);\n }\n });\n } finally {\n db.close();\n }\n}\n\nexport default createWorkflowCommand;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -9,7 +9,11 @@ import Database from "better-sqlite3";
|
|
|
9
9
|
import { execSync } from "child_process";
|
|
10
10
|
function registerWorktreeCommands(program) {
|
|
11
11
|
const worktree = program.command("worktree").alias("wt").description("Manage StackMemory across git worktrees");
|
|
12
|
-
worktree.command("enable").description("Enable worktree support").option(
|
|
12
|
+
worktree.command("enable").description("Enable worktree support").option(
|
|
13
|
+
"--isolate",
|
|
14
|
+
"Isolate contexts between worktrees (default: true)",
|
|
15
|
+
true
|
|
16
|
+
).option("--auto-detect", "Auto-detect worktrees (default: true)", true).option("--sync-interval <minutes>", "Context sync interval", "15").action(async (options) => {
|
|
13
17
|
const manager = WorktreeManager.getInstance();
|
|
14
18
|
manager.saveConfig({
|
|
15
19
|
enabled: true,
|
|
@@ -54,9 +58,7 @@ Detected ${worktrees.length} worktree(s):`));
|
|
|
54
58
|
if (existsSync(context.dbPath)) {
|
|
55
59
|
contextStatus = "\u2713 Active";
|
|
56
60
|
const db = new Database(context.dbPath);
|
|
57
|
-
const lastEvent = db.prepare(
|
|
58
|
-
"SELECT MAX(created_at) as last FROM events"
|
|
59
|
-
).get();
|
|
61
|
+
const lastEvent = db.prepare("SELECT MAX(created_at) as last FROM events").get();
|
|
60
62
|
if (lastEvent?.last) {
|
|
61
63
|
const date = new Date(lastEvent.last);
|
|
62
64
|
lastActivity = date.toLocaleDateString();
|
|
@@ -82,21 +84,27 @@ Detected ${worktrees.length} worktree(s):`));
|
|
|
82
84
|
console.log(chalk.gray("\n\u2713 Worktree support is enabled"));
|
|
83
85
|
const config = manager.getConfig();
|
|
84
86
|
if (config.isolateContexts) {
|
|
85
|
-
console.log(
|
|
87
|
+
console.log(
|
|
88
|
+
chalk.gray(" - Contexts are isolated between worktrees")
|
|
89
|
+
);
|
|
86
90
|
}
|
|
87
91
|
if (config.autoDetect) {
|
|
88
92
|
console.log(chalk.gray(" - Auto-detection is enabled"));
|
|
89
93
|
}
|
|
90
94
|
} else {
|
|
91
95
|
console.log(chalk.gray("\n\u25CB Worktree support is disabled"));
|
|
92
|
-
console.log(
|
|
96
|
+
console.log(
|
|
97
|
+
chalk.gray(' Run "stackmemory worktree enable" to activate')
|
|
98
|
+
);
|
|
93
99
|
}
|
|
94
100
|
});
|
|
95
101
|
worktree.command("status").description("Show status of current worktree").action(async () => {
|
|
96
102
|
const manager = WorktreeManager.getInstance();
|
|
97
103
|
const currentPath = process.cwd();
|
|
98
104
|
const worktrees = manager.detectWorktrees(currentPath);
|
|
99
|
-
const current = worktrees.find(
|
|
105
|
+
const current = worktrees.find(
|
|
106
|
+
(w) => currentPath.startsWith(w.path)
|
|
107
|
+
);
|
|
100
108
|
if (!current) {
|
|
101
109
|
console.log(chalk.yellow("Not in a git worktree"));
|
|
102
110
|
return;
|
|
@@ -104,7 +112,10 @@ Detected ${worktrees.length} worktree(s):`));
|
|
|
104
112
|
console.log(chalk.cyan("Current Worktree:\n"));
|
|
105
113
|
console.log(chalk.gray(" Branch:"), current.branch || "detached");
|
|
106
114
|
console.log(chalk.gray(" Path:"), current.path);
|
|
107
|
-
console.log(
|
|
115
|
+
console.log(
|
|
116
|
+
chalk.gray(" Type:"),
|
|
117
|
+
current.isMainWorktree ? "Main" : "Branch"
|
|
118
|
+
);
|
|
108
119
|
console.log(chalk.gray(" Commit:"), current.commit.substring(0, 8));
|
|
109
120
|
if (manager.isEnabled()) {
|
|
110
121
|
try {
|
|
@@ -112,12 +123,14 @@ Detected ${worktrees.length} worktree(s):`));
|
|
|
112
123
|
console.log(chalk.gray(" Context Path:"), context.contextPath);
|
|
113
124
|
if (existsSync(context.dbPath)) {
|
|
114
125
|
const db = new Database(context.dbPath);
|
|
115
|
-
const stats = db.prepare(
|
|
126
|
+
const stats = db.prepare(
|
|
127
|
+
`
|
|
116
128
|
SELECT
|
|
117
129
|
(SELECT COUNT(*) FROM frames) as frames,
|
|
118
130
|
(SELECT COUNT(*) FROM events) as events,
|
|
119
131
|
(SELECT COUNT(*) FROM contexts) as contexts
|
|
120
|
-
`
|
|
132
|
+
`
|
|
133
|
+
).get();
|
|
121
134
|
console.log(chalk.cyan("\nContext Statistics:"));
|
|
122
135
|
console.log(chalk.gray(" Frames:"), stats.frames);
|
|
123
136
|
console.log(chalk.gray(" Events:"), stats.events);
|
|
@@ -128,7 +141,10 @@ Detected ${worktrees.length} worktree(s):`));
|
|
|
128
141
|
console.log(chalk.gray(' Run "stackmemory init" to initialize'));
|
|
129
142
|
}
|
|
130
143
|
} catch (error) {
|
|
131
|
-
console.log(
|
|
144
|
+
console.log(
|
|
145
|
+
chalk.red("\nError accessing context:"),
|
|
146
|
+
error.message
|
|
147
|
+
);
|
|
132
148
|
}
|
|
133
149
|
} else {
|
|
134
150
|
console.log(chalk.gray("\nWorktree support is disabled"));
|
|
@@ -149,7 +165,9 @@ Detected ${worktrees.length} worktree(s):`));
|
|
|
149
165
|
console.log(chalk.green(`\u2713 Created worktree at ${worktreePath}`));
|
|
150
166
|
if (manager.isEnabled()) {
|
|
151
167
|
const context = manager.getWorktreeContext(worktreePath);
|
|
152
|
-
console.log(
|
|
168
|
+
console.log(
|
|
169
|
+
chalk.green(`\u2713 Created isolated context at ${context.contextPath}`)
|
|
170
|
+
);
|
|
153
171
|
if (options.init) {
|
|
154
172
|
const db = new Database(context.dbPath);
|
|
155
173
|
new FrameManager(db, project.id);
|
|
@@ -164,7 +182,10 @@ Detected ${worktrees.length} worktree(s):`));
|
|
|
164
182
|
}
|
|
165
183
|
console.log(chalk.gray(" # Start working in isolated context"));
|
|
166
184
|
} catch (error) {
|
|
167
|
-
console.error(
|
|
185
|
+
console.error(
|
|
186
|
+
chalk.red("Failed to create worktree:"),
|
|
187
|
+
error.message
|
|
188
|
+
);
|
|
168
189
|
process.exit(1);
|
|
169
190
|
}
|
|
170
191
|
});
|
|
@@ -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('--isolate', 'Isolate contexts between worktrees (default: true)', true)\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 ? 'Main' : wt.isDetached ? 'Detached' : '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.prepare(\n '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) {\n contextStatus = '\u2717 Error';\n }\n\n table.push([\n wt.branch || 'detached',\n options.verbose ? wt.path : `.../${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(chalk.gray(' - Contexts are isolated between worktrees'));\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(chalk.gray(' Run \"stackmemory worktree enable\" to activate'));\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 => currentPath.startsWith(w.path));\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(chalk.gray(' Type:'), current.isMainWorktree ? 'Main' : 'Branch');\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.prepare(`\n SELECT \n (SELECT COUNT(*) FROM frames) as frames,\n (SELECT COUNT(*) FROM events) as events,\n (SELECT COUNT(*) FROM contexts) as contexts\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) {\n console.log(chalk.red('\\nError accessing context:'), (error as Error).message);\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(chalk.green(`\u2713 Created isolated context at ${context.contextPath}`));\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) {\n console.error(chalk.red('Failed to create worktree:'), (error as Error).message);\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 => w.branch === options.source);\n let target = worktrees.find(w => 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 => ({\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 => w.path !== source!.path)\n .map(w => ({\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) {\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 => w.path));\n const stale = stored.filter(w => !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 => 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}"],
|
|
5
|
-
"mappings": ";AAOA,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAC7B,OAAO,WAAW;AAClB,OAAO,WAAW;AAElB,SAAS,kBAAkB;AAC3B,OAAO,cAAc;AACrB,SAAS,gBAAgB;AAElB,SAAS,yBAAyB,SAAwB;AAC/D,QAAM,WAAW,QACd,QAAQ,UAAU,EAClB,MAAM,IAAI,EACV,YAAY,yCAAyC;AAGxD,WACG,QAAQ,QAAQ,EAChB,YAAY,yBAAyB,EACrC,
|
|
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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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
process.env
|
|
2
|
+
process.env["STACKMEMORY_CLI"] = "true";
|
|
3
3
|
import { program } from "commander";
|
|
4
4
|
import { logger } from "../core/monitoring/logger.js";
|
|
5
5
|
import { FrameManager } from "../core/context/frame-manager.js";
|
|
@@ -30,6 +30,7 @@ import { registerLinearMigrateCommand } from "./commands/linear-migrate.js";
|
|
|
30
30
|
import { registerLinearCreateCommand } from "./commands/linear-create.js";
|
|
31
31
|
import { createChromaDBCommand } from "./commands/chromadb.js";
|
|
32
32
|
import { createInfiniteStorageCommand } from "./commands/infinite-storage.js";
|
|
33
|
+
import { createGCCommand } from "./commands/gc.js";
|
|
33
34
|
import { createSessionCommands } from "./commands/session.js";
|
|
34
35
|
import { registerWorktreeCommands } from "./commands/worktree.js";
|
|
35
36
|
import { registerOnboardingCommand } from "./commands/onboard.js";
|
|
@@ -317,7 +318,7 @@ linearCommand.command("sync").description("Sync tasks with Linear").option(
|
|
|
317
318
|
return;
|
|
318
319
|
}
|
|
319
320
|
const authManager = new LinearAuthManager(projectRoot);
|
|
320
|
-
if (!process.env
|
|
321
|
+
if (!process.env["LINEAR_API_KEY"] && !authManager.isConfigured()) {
|
|
321
322
|
console.log(
|
|
322
323
|
'\u274C Linear not configured. Set LINEAR_API_KEY environment variable or run "stackmemory linear setup" first.'
|
|
323
324
|
);
|
|
@@ -839,7 +840,7 @@ program.command("analytics").description("Launch task analytics dashboard").opti
|
|
|
839
840
|
<div class="card"><div class="metric-label">Completion</div><div class="metric-value">\${metrics.data.metrics.completionRate.toFixed(0)}%</div></div>
|
|
840
841
|
\`;
|
|
841
842
|
|
|
842
|
-
document.getElementById('tasks').innerHTML = tasks.data.tasks.slice(0, 10).map(t => \`
|
|
843
|
+
document.getElementById('tasks').innerHTML = tasks.data.tasks.slice(0, 10).map((t: any) => \`
|
|
843
844
|
<div class="task-item \${t.state}">
|
|
844
845
|
<span class="status \${t.state}">\${t.state}</span>
|
|
845
846
|
<strong>\${t.title}</strong>
|
|
@@ -900,7 +901,7 @@ program.command("progress").description("Show current progress and recent change
|
|
|
900
901
|
program.command("mcp-server").description("Start StackMemory MCP server for Claude Desktop").option("-p, --project <path>", "Project root directory", process.cwd()).action(async (options) => {
|
|
901
902
|
try {
|
|
902
903
|
const { runMCPServer } = await import("../integrations/mcp/server.js");
|
|
903
|
-
process.env
|
|
904
|
+
process.env["PROJECT_ROOT"] = options.project;
|
|
904
905
|
console.log("\u{1F680} Starting StackMemory MCP Server...");
|
|
905
906
|
console.log(` Project: ${options.project}`);
|
|
906
907
|
console.log(` Version: ${VERSION}`);
|
|
@@ -976,6 +977,7 @@ registerLinearMigrateCommand(program);
|
|
|
976
977
|
registerLinearCreateCommand(program);
|
|
977
978
|
program.addCommand(createChromaDBCommand());
|
|
978
979
|
program.addCommand(createInfiniteStorageCommand());
|
|
980
|
+
program.addCommand(createGCCommand());
|
|
979
981
|
program.addCommand(createSessionCommands());
|
|
980
982
|
program.addCommand(webhookCommand());
|
|
981
983
|
program.addCommand(createTaskCommands());
|
|
@@ -1015,7 +1017,7 @@ program.command("tui").description("Launch interactive TUI monitoring dashboard
|
|
|
1015
1017
|
const __filename = fileURLToPath(import.meta.url);
|
|
1016
1018
|
const __dirname = dirname(__filename);
|
|
1017
1019
|
console.log("\u{1F680} Launching StackMemory TUI Dashboard...");
|
|
1018
|
-
process.env
|
|
1020
|
+
process.env["STACKMEMORY_WS_URL"] = options.wsUrl;
|
|
1019
1021
|
const tuiPath = join2(__dirname, "../features/tui/index.js");
|
|
1020
1022
|
const tui = spawn("node", [tuiPath], {
|
|
1021
1023
|
stdio: "inherit",
|