@stackmemoryai/stackmemory 0.5.57 → 0.5.59
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/bin/codex-smd +6 -0
- package/dist/cli/codex-sm-danger.js +21 -0
- package/dist/cli/codex-sm-danger.js.map +7 -0
- package/dist/cli/commands/handoff.js +33 -3
- package/dist/cli/commands/handoff.js.map +2 -2
- package/dist/cli/commands/search.js +20 -3
- package/dist/cli/commands/search.js.map +2 -2
- package/dist/core/database/sqlite-adapter.js +13 -3
- package/dist/core/database/sqlite-adapter.js.map +2 -2
- package/dist/core/errors/error-utils.js +208 -0
- package/dist/core/errors/error-utils.js.map +7 -0
- package/dist/core/errors/index.js +13 -4
- package/dist/core/errors/index.js.map +2 -2
- package/dist/core/merge/unified-merge-resolver.js +303 -0
- package/dist/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/core/monitoring/logger.js +61 -9
- package/dist/core/monitoring/logger.js.map +2 -2
- package/dist/core/security/index.js +35 -0
- package/dist/core/security/index.js.map +7 -0
- package/dist/core/security/input-sanitizer.js +321 -0
- package/dist/core/security/input-sanitizer.js.map +7 -0
- package/dist/core/session/enhanced-handoff.js +136 -2
- package/dist/core/session/enhanced-handoff.js.map +3 -3
- package/dist/integrations/linear/client.js +5 -1
- package/dist/integrations/linear/client.js.map +2 -2
- package/dist/integrations/mcp/remote-server.js +27 -36
- package/dist/integrations/mcp/remote-server.js.map +2 -2
- package/dist/integrations/mcp/server.js +44 -29
- package/dist/integrations/mcp/server.js.map +3 -3
- package/dist/scripts/benchmark-performance.js +48 -0
- package/dist/scripts/benchmark-performance.js.map +7 -0
- package/dist/scripts/check-redis.js +42 -0
- package/dist/scripts/check-redis.js.map +7 -0
- package/dist/scripts/initialize.js +116 -0
- package/dist/scripts/initialize.js.map +7 -0
- package/dist/scripts/list-linear-tasks.js +124 -0
- package/dist/scripts/list-linear-tasks.js.map +7 -0
- package/dist/scripts/measure-handoff-impact.js +340 -0
- package/dist/scripts/measure-handoff-impact.js.map +7 -0
- package/dist/scripts/query-chromadb.js +160 -0
- package/dist/scripts/query-chromadb.js.map +7 -0
- package/dist/scripts/show-linear-summary.js +119 -0
- package/dist/scripts/show-linear-summary.js.map +7 -0
- package/dist/scripts/simple-swarm-demo.js +90 -0
- package/dist/scripts/simple-swarm-demo.js.map +7 -0
- package/dist/scripts/status.js +155 -0
- package/dist/scripts/status.js.map +7 -0
- package/dist/scripts/test-chromadb-sync.js +192 -0
- package/dist/scripts/test-chromadb-sync.js.map +7 -0
- package/dist/scripts/test-ralph-iteration-fix.js +86 -0
- package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
- package/dist/scripts/test-ralph-iterations.js +121 -0
- package/dist/scripts/test-ralph-iterations.js.map +7 -0
- package/dist/scripts/test-redis-storage.js +389 -0
- package/dist/scripts/test-redis-storage.js.map +7 -0
- package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
- package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
- package/dist/scripts/test-swarm-fixes.js +125 -0
- package/dist/scripts/test-swarm-fixes.js.map +7 -0
- package/dist/scripts/test-swarm-tui.js +23 -0
- package/dist/scripts/test-swarm-tui.js.map +7 -0
- package/dist/scripts/test-tui-shortcuts.js +52 -0
- package/dist/scripts/test-tui-shortcuts.js.map +7 -0
- package/dist/scripts/validate-tui-shortcuts.js +60 -0
- package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
- package/dist/src/agents/core/agent-task-manager.js +527 -0
- package/dist/src/agents/core/agent-task-manager.js.map +7 -0
- package/dist/src/agents/verifiers/base-verifier.js +133 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/llm-judge.js +252 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/src/cli/auto-detect.js +321 -0
- package/dist/src/cli/auto-detect.js.map +7 -0
- package/dist/src/cli/claude-sm-danger.js +21 -0
- package/dist/src/cli/claude-sm-danger.js.map +7 -0
- package/dist/src/cli/claude-sm.js +1156 -0
- package/dist/src/cli/claude-sm.js.map +7 -0
- package/dist/src/cli/codex-sm-danger.js +21 -0
- package/dist/src/cli/codex-sm-danger.js.map +7 -0
- package/dist/src/cli/codex-sm.js +349 -0
- package/dist/src/cli/codex-sm.js.map +7 -0
- package/dist/src/cli/commands/api.js +232 -0
- package/dist/src/cli/commands/api.js.map +7 -0
- package/dist/src/cli/commands/auto-background.js +180 -0
- package/dist/src/cli/commands/auto-background.js.map +7 -0
- package/dist/src/cli/commands/cleanup-processes.js +68 -0
- package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
- package/dist/src/cli/commands/clear.js +202 -0
- package/dist/src/cli/commands/clear.js.map +7 -0
- package/dist/src/cli/commands/config.js +445 -0
- package/dist/src/cli/commands/config.js.map +7 -0
- package/dist/src/cli/commands/context-rehydrate.js +751 -0
- package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
- package/dist/src/cli/commands/context.js +343 -0
- package/dist/src/cli/commands/context.js.map +7 -0
- package/dist/src/cli/commands/daemon.js +392 -0
- package/dist/src/cli/commands/daemon.js.map +7 -0
- package/dist/src/cli/commands/dashboard.js +210 -0
- package/dist/src/cli/commands/dashboard.js.map +7 -0
- package/dist/src/cli/commands/db.js +147 -0
- package/dist/src/cli/commands/db.js.map +7 -0
- package/dist/src/cli/commands/decision.js +266 -0
- package/dist/src/cli/commands/decision.js.map +7 -0
- package/dist/src/cli/commands/discovery.js +279 -0
- package/dist/src/cli/commands/discovery.js.map +7 -0
- package/dist/src/cli/commands/handoff.js +624 -0
- package/dist/src/cli/commands/handoff.js.map +7 -0
- package/dist/src/cli/commands/hooks.js +298 -0
- package/dist/src/cli/commands/hooks.js.map +7 -0
- package/dist/src/cli/commands/linear.js +529 -0
- package/dist/src/cli/commands/linear.js.map +7 -0
- package/dist/src/cli/commands/log.js +169 -0
- package/dist/src/cli/commands/log.js.map +7 -0
- package/dist/src/cli/commands/login.js +172 -0
- package/dist/src/cli/commands/login.js.map +7 -0
- package/dist/src/cli/commands/migrate.js +240 -0
- package/dist/src/cli/commands/migrate.js.map +7 -0
- package/dist/src/cli/commands/model.js +533 -0
- package/dist/src/cli/commands/model.js.map +7 -0
- package/dist/src/cli/commands/onboard.js +536 -0
- package/dist/src/cli/commands/onboard.js.map +7 -0
- package/dist/src/cli/commands/projects.js +199 -0
- package/dist/src/cli/commands/projects.js.map +7 -0
- package/dist/src/cli/commands/ralph.js +909 -0
- package/dist/src/cli/commands/ralph.js.map +7 -0
- package/dist/src/cli/commands/retrieval.js +248 -0
- package/dist/src/cli/commands/retrieval.js.map +7 -0
- package/dist/src/cli/commands/search.js +173 -0
- package/dist/src/cli/commands/search.js.map +7 -0
- package/dist/src/cli/commands/service.js +749 -0
- package/dist/src/cli/commands/service.js.map +7 -0
- package/dist/src/cli/commands/session.js +200 -0
- package/dist/src/cli/commands/session.js.map +7 -0
- package/dist/src/cli/commands/settings.js +306 -0
- package/dist/src/cli/commands/settings.js.map +7 -0
- package/dist/src/cli/commands/setup.js +701 -0
- package/dist/src/cli/commands/setup.js.map +7 -0
- package/dist/src/cli/commands/shell.js +249 -0
- package/dist/src/cli/commands/shell.js.map +7 -0
- package/dist/src/cli/commands/signup.js +50 -0
- package/dist/src/cli/commands/signup.js.map +7 -0
- package/dist/src/cli/commands/skills.js +470 -0
- package/dist/src/cli/commands/skills.js.map +7 -0
- package/dist/src/cli/commands/sms-notify.js +795 -0
- package/dist/src/cli/commands/sms-notify.js.map +7 -0
- package/dist/src/cli/commands/storage-tier.js +183 -0
- package/dist/src/cli/commands/storage-tier.js.map +7 -0
- package/dist/src/cli/commands/sweep.js +249 -0
- package/dist/src/cli/commands/sweep.js.map +7 -0
- package/dist/src/cli/commands/tasks.js +213 -0
- package/dist/src/cli/commands/tasks.js.map +7 -0
- package/dist/src/cli/commands/worktree.js +319 -0
- package/dist/src/cli/commands/worktree.js.map +7 -0
- package/dist/src/cli/index.js +594 -0
- package/dist/src/cli/index.js.map +7 -0
- package/dist/src/cli/opencode-sm.js +448 -0
- package/dist/src/cli/opencode-sm.js.map +7 -0
- package/dist/src/cli/utils/viewer.js +96 -0
- package/dist/src/cli/utils/viewer.js.map +7 -0
- package/dist/src/core/config/config-manager.js +398 -0
- package/dist/src/core/config/config-manager.js.map +7 -0
- package/dist/src/core/config/feature-flags.js +76 -0
- package/dist/src/core/config/feature-flags.js.map +7 -0
- package/dist/src/core/config/storage-config.js +115 -0
- package/dist/src/core/config/storage-config.js.map +7 -0
- package/dist/src/core/config/types.js +144 -0
- package/dist/src/core/config/types.js.map +7 -0
- package/dist/src/core/context/auto-context.js +80 -0
- package/dist/src/core/context/auto-context.js.map +7 -0
- package/dist/src/core/context/dual-stack-manager.js +870 -0
- package/dist/src/core/context/dual-stack-manager.js.map +7 -0
- package/dist/src/core/context/enhanced-rehydration.js +994 -0
- package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
- package/dist/src/core/context/frame-database.js +479 -0
- package/dist/src/core/context/frame-database.js.map +7 -0
- package/dist/src/core/context/frame-digest.js +250 -0
- package/dist/src/core/context/frame-digest.js.map +7 -0
- package/dist/src/core/context/frame-handoff-manager.js +778 -0
- package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
- package/dist/src/core/context/frame-recovery.js +302 -0
- package/dist/src/core/context/frame-recovery.js.map +7 -0
- package/dist/src/core/context/frame-stack.js +314 -0
- package/dist/src/core/context/frame-stack.js.map +7 -0
- package/dist/src/core/context/frame-types.js +5 -0
- package/dist/src/core/context/frame-types.js.map +7 -0
- package/dist/src/core/context/index.js +25 -0
- package/dist/src/core/context/index.js.map +7 -0
- package/dist/src/core/context/permission-manager.js +185 -0
- package/dist/src/core/context/permission-manager.js.map +7 -0
- package/dist/src/core/context/recursive-context-manager.js +592 -0
- package/dist/src/core/context/recursive-context-manager.js.map +7 -0
- package/dist/src/core/context/refactored-frame-manager.js +754 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/src/core/context/shared-context-layer.js +621 -0
- package/dist/src/core/context/shared-context-layer.js.map +7 -0
- package/dist/src/core/context/stack-merge-resolver.js +749 -0
- package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
- package/dist/src/core/context/validation.js +130 -0
- package/dist/src/core/context/validation.js.map +7 -0
- package/dist/src/core/database/batch-operations.js +384 -0
- package/dist/src/core/database/batch-operations.js.map +7 -0
- package/dist/src/core/database/connection-pool.js +330 -0
- package/dist/src/core/database/connection-pool.js.map +7 -0
- package/dist/src/core/database/database-adapter.js +60 -0
- package/dist/src/core/database/database-adapter.js.map +7 -0
- package/dist/src/core/database/migration-manager.js +614 -0
- package/dist/src/core/database/migration-manager.js.map +7 -0
- package/dist/src/core/database/query-cache.js +298 -0
- package/dist/src/core/database/query-cache.js.map +7 -0
- package/dist/src/core/database/query-router.js +430 -0
- package/dist/src/core/database/query-router.js.map +7 -0
- package/dist/src/core/database/sqlite-adapter.js +738 -0
- package/dist/src/core/database/sqlite-adapter.js.map +7 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js +277 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
- package/dist/src/core/digest/frame-digest-integration.js +176 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
- package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/src/core/digest/index.js +9 -0
- package/dist/src/core/digest/index.js.map +7 -0
- package/dist/src/core/digest/types.js +25 -0
- package/dist/src/core/digest/types.js.map +7 -0
- package/dist/src/core/errors/error-utils.js +208 -0
- package/dist/src/core/errors/error-utils.js.map +7 -0
- package/dist/src/core/errors/index.js +521 -0
- package/dist/src/core/errors/index.js.map +7 -0
- package/dist/src/core/errors/recovery.js +269 -0
- package/dist/src/core/errors/recovery.js.map +7 -0
- package/dist/src/core/execution/parallel-executor.js +258 -0
- package/dist/src/core/execution/parallel-executor.js.map +7 -0
- package/dist/src/core/frame/workflow-templates.js +319 -0
- package/dist/src/core/frame/workflow-templates.js.map +7 -0
- package/dist/src/core/merge/conflict-detector.js +431 -0
- package/dist/src/core/merge/conflict-detector.js.map +7 -0
- package/dist/src/core/merge/index.js +9 -0
- package/dist/src/core/merge/index.js.map +7 -0
- package/dist/src/core/merge/resolution-engine.js +558 -0
- package/dist/src/core/merge/resolution-engine.js.map +7 -0
- package/dist/src/core/merge/stack-diff.js +532 -0
- package/dist/src/core/merge/stack-diff.js.map +7 -0
- package/dist/src/core/merge/types.js +5 -0
- package/dist/src/core/merge/types.js.map +7 -0
- package/dist/src/core/merge/unified-merge-resolver.js +303 -0
- package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/src/core/models/fallback-monitor.js +232 -0
- package/dist/src/core/models/fallback-monitor.js.map +7 -0
- package/dist/src/core/models/model-router.js +340 -0
- package/dist/src/core/models/model-router.js.map +7 -0
- package/dist/src/core/monitoring/error-handler.js +49 -0
- package/dist/src/core/monitoring/error-handler.js.map +7 -0
- package/dist/src/core/monitoring/logger.js +202 -0
- package/dist/src/core/monitoring/logger.js.map +7 -0
- package/dist/src/core/monitoring/metrics.js +172 -0
- package/dist/src/core/monitoring/metrics.js.map +7 -0
- package/dist/src/core/monitoring/progress-tracker.js +189 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/src/core/monitoring/session-monitor.js +300 -0
- package/dist/src/core/monitoring/session-monitor.js.map +7 -0
- package/dist/src/core/performance/context-cache.js +273 -0
- package/dist/src/core/performance/context-cache.js.map +7 -0
- package/dist/src/core/performance/index.js +11 -0
- package/dist/src/core/performance/index.js.map +7 -0
- package/dist/src/core/performance/lazy-context-loader.js +327 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/src/core/performance/monitor.js +221 -0
- package/dist/src/core/performance/monitor.js.map +7 -0
- package/dist/src/core/performance/optimized-frame-context.js +345 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/src/core/performance/performance-benchmark.js +277 -0
- package/dist/src/core/performance/performance-benchmark.js.map +7 -0
- package/dist/src/core/performance/performance-profiler.js +370 -0
- package/dist/src/core/performance/performance-profiler.js.map +7 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/src/core/persistence/postgres-adapter.js +349 -0
- package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/src/core/projects/project-isolation.js +201 -0
- package/dist/src/core/projects/project-isolation.js.map +7 -0
- package/dist/src/core/projects/project-manager.js +697 -0
- package/dist/src/core/projects/project-manager.js.map +7 -0
- package/dist/src/core/query/query-parser.js +370 -0
- package/dist/src/core/query/query-parser.js.map +7 -0
- package/dist/src/core/query/query-templates.js +321 -0
- package/dist/src/core/query/query-templates.js.map +7 -0
- package/dist/src/core/retrieval/context-retriever.js +479 -0
- package/dist/src/core/retrieval/context-retriever.js.map +7 -0
- package/dist/src/core/retrieval/index.js +8 -0
- package/dist/src/core/retrieval/index.js.map +7 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/src/core/retrieval/llm-provider.js +151 -0
- package/dist/src/core/retrieval/llm-provider.js.map +7 -0
- package/dist/src/core/retrieval/retrieval-audit.js +236 -0
- package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
- package/dist/src/core/retrieval/summary-generator.js +589 -0
- package/dist/src/core/retrieval/summary-generator.js.map +7 -0
- package/dist/src/core/retrieval/types.js +21 -0
- package/dist/src/core/retrieval/types.js.map +7 -0
- package/dist/src/core/security/index.js +35 -0
- package/dist/src/core/security/index.js.map +7 -0
- package/dist/src/core/security/input-sanitizer.js +321 -0
- package/dist/src/core/security/input-sanitizer.js.map +7 -0
- package/dist/src/core/session/clear-survival.js +465 -0
- package/dist/src/core/session/clear-survival.js.map +7 -0
- package/dist/src/core/session/enhanced-handoff.js +792 -0
- package/dist/src/core/session/enhanced-handoff.js.map +7 -0
- package/dist/src/core/session/handoff-generator.js +343 -0
- package/dist/src/core/session/handoff-generator.js.map +7 -0
- package/dist/src/core/session/index.js +15 -0
- package/dist/src/core/session/index.js.map +7 -0
- package/dist/src/core/session/session-manager.js +347 -0
- package/dist/src/core/session/session-manager.js.map +7 -0
- package/dist/src/core/skills/index.js +7 -0
- package/dist/src/core/skills/index.js.map +7 -0
- package/dist/src/core/skills/skill-storage.js +764 -0
- package/dist/src/core/skills/skill-storage.js.map +7 -0
- package/dist/src/core/skills/types.js +193 -0
- package/dist/src/core/skills/types.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +354 -0
- package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
- package/dist/src/core/storage/infinite-storage.js +510 -0
- package/dist/src/core/storage/infinite-storage.js.map +7 -0
- package/dist/src/core/storage/remote-storage.js +489 -0
- package/dist/src/core/storage/remote-storage.js.map +7 -0
- package/dist/src/core/storage/two-tier-storage.js +766 -0
- package/dist/src/core/storage/two-tier-storage.js.map +7 -0
- package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/db-trace-wrapper.js +247 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/debug-trace.js +417 -0
- package/dist/src/core/trace/debug-trace.js.map +7 -0
- package/dist/src/core/trace/index.js +109 -0
- package/dist/src/core/trace/index.js.map +7 -0
- package/dist/src/core/trace/linear-api-wrapper.js +178 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/src/core/trace/trace-detector.js +528 -0
- package/dist/src/core/trace/trace-detector.js.map +7 -0
- package/dist/src/core/trace/trace-store.js +345 -0
- package/dist/src/core/trace/trace-store.js.map +7 -0
- package/dist/src/core/trace/types.js +77 -0
- package/dist/src/core/trace/types.js.map +7 -0
- package/dist/src/core/types.js +5 -0
- package/dist/src/core/types.js.map +7 -0
- package/dist/src/core/utils/async-mutex.js +114 -0
- package/dist/src/core/utils/async-mutex.js.map +7 -0
- package/dist/src/core/utils/compression.js +83 -0
- package/dist/src/core/utils/compression.js.map +7 -0
- package/dist/src/core/utils/update-checker.js +218 -0
- package/dist/src/core/utils/update-checker.js.map +7 -0
- package/dist/src/core/worktree/worktree-manager.js +465 -0
- package/dist/src/core/worktree/worktree-manager.js.map +7 -0
- package/dist/src/daemon/daemon-config.js +149 -0
- package/dist/src/daemon/daemon-config.js.map +7 -0
- package/dist/src/daemon/services/context-service.js +122 -0
- package/dist/src/daemon/services/context-service.js.map +7 -0
- package/dist/src/daemon/services/linear-service.js +136 -0
- package/dist/src/daemon/services/linear-service.js.map +7 -0
- package/dist/src/daemon/session-daemon.js +312 -0
- package/dist/src/daemon/session-daemon.js.map +7 -0
- package/dist/src/daemon/unified-daemon.js +276 -0
- package/dist/src/daemon/unified-daemon.js.map +7 -0
- package/dist/src/features/analytics/api/analytics-api.js +287 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/src/features/analytics/core/analytics-service.js +282 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/src/features/analytics/index.js +18 -0
- package/dist/src/features/analytics/index.js.map +7 -0
- package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/src/features/analytics/types/metrics.js +5 -0
- package/dist/src/features/analytics/types/metrics.js.map +7 -0
- package/dist/src/features/browser/browser-mcp.js +492 -0
- package/dist/src/features/browser/browser-mcp.js.map +7 -0
- package/dist/src/features/sweep/index.js +20 -0
- package/dist/src/features/sweep/index.js.map +7 -0
- package/dist/src/features/sweep/prediction-client.js +155 -0
- package/dist/src/features/sweep/prediction-client.js.map +7 -0
- package/dist/src/features/sweep/prompt-builder.js +85 -0
- package/dist/src/features/sweep/prompt-builder.js.map +7 -0
- package/dist/src/features/sweep/pty-wrapper.js +171 -0
- package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
- package/dist/src/features/sweep/state-watcher.js +87 -0
- package/dist/src/features/sweep/state-watcher.js.map +7 -0
- package/dist/src/features/sweep/status-bar.js +88 -0
- package/dist/src/features/sweep/status-bar.js.map +7 -0
- package/dist/src/features/sweep/sweep-server-manager.js +226 -0
- package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
- package/dist/src/features/sweep/tab-interceptor.js +38 -0
- package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
- package/dist/src/features/sweep/types.js +18 -0
- package/dist/src/features/sweep/types.js.map +7 -0
- package/dist/src/features/tasks/linear-task-manager.js +487 -0
- package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
- package/dist/src/features/tasks/task-aware-context.js +410 -0
- package/dist/src/features/tasks/task-aware-context.js.map +7 -0
- package/dist/src/features/tui/simple-monitor.js +116 -0
- package/dist/src/features/tui/simple-monitor.js.map +7 -0
- package/dist/src/features/tui/swarm-monitor.js +648 -0
- package/dist/src/features/tui/swarm-monitor.js.map +7 -0
- package/dist/src/features/web/client/stores/task-store.js +26 -0
- package/dist/src/features/web/client/stores/task-store.js.map +7 -0
- package/dist/src/features/web/server/index.js +194 -0
- package/dist/src/features/web/server/index.js.map +7 -0
- package/dist/src/hooks/auto-background.js +151 -0
- package/dist/src/hooks/auto-background.js.map +7 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
- package/dist/src/hooks/config.js +150 -0
- package/dist/src/hooks/config.js.map +7 -0
- package/dist/src/hooks/daemon.js +364 -0
- package/dist/src/hooks/daemon.js.map +7 -0
- package/dist/src/hooks/events.js +58 -0
- package/dist/src/hooks/events.js.map +7 -0
- package/dist/src/hooks/index.js +12 -0
- package/dist/src/hooks/index.js.map +7 -0
- package/dist/src/hooks/linear-task-picker.js +186 -0
- package/dist/src/hooks/linear-task-picker.js.map +7 -0
- package/dist/src/hooks/schemas.js +197 -0
- package/dist/src/hooks/schemas.js.map +7 -0
- package/dist/src/hooks/secure-fs.js +49 -0
- package/dist/src/hooks/secure-fs.js.map +7 -0
- package/dist/src/hooks/security-logger.js +155 -0
- package/dist/src/hooks/security-logger.js.map +7 -0
- package/dist/src/hooks/session-summary.js +222 -0
- package/dist/src/hooks/session-summary.js.map +7 -0
- package/dist/src/hooks/sms-action-runner.js +371 -0
- package/dist/src/hooks/sms-action-runner.js.map +7 -0
- package/dist/src/hooks/sms-notify.js +506 -0
- package/dist/src/hooks/sms-notify.js.map +7 -0
- package/dist/src/hooks/sms-watcher.js +93 -0
- package/dist/src/hooks/sms-watcher.js.map +7 -0
- package/dist/src/hooks/sms-webhook.js +555 -0
- package/dist/src/hooks/sms-webhook.js.map +7 -0
- package/dist/src/hooks/whatsapp-commands.js +479 -0
- package/dist/src/hooks/whatsapp-commands.js.map +7 -0
- package/dist/src/hooks/whatsapp-scheduler.js +317 -0
- package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
- package/dist/src/hooks/whatsapp-sync.js +409 -0
- package/dist/src/hooks/whatsapp-sync.js.map +7 -0
- package/dist/src/index.js +25 -0
- package/dist/src/index.js.map +7 -0
- package/dist/src/integrations/anthropic/client.js +263 -0
- package/dist/src/integrations/anthropic/client.js.map +7 -0
- package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
- package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client.js +511 -0
- package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
- package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
- package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
- package/dist/src/integrations/linear/auth.js +337 -0
- package/dist/src/integrations/linear/auth.js.map +7 -0
- package/dist/src/integrations/linear/auto-sync.js +258 -0
- package/dist/src/integrations/linear/auto-sync.js.map +7 -0
- package/dist/src/integrations/linear/client.js +634 -0
- package/dist/src/integrations/linear/client.js.map +7 -0
- package/dist/src/integrations/linear/config.js +130 -0
- package/dist/src/integrations/linear/config.js.map +7 -0
- package/dist/src/integrations/linear/migration.js +361 -0
- package/dist/src/integrations/linear/migration.js.map +7 -0
- package/dist/src/integrations/linear/oauth-server.js +454 -0
- package/dist/src/integrations/linear/oauth-server.js.map +7 -0
- package/dist/src/integrations/linear/rest-client.js +213 -0
- package/dist/src/integrations/linear/rest-client.js.map +7 -0
- package/dist/src/integrations/linear/sync-manager.js +236 -0
- package/dist/src/integrations/linear/sync-manager.js.map +7 -0
- package/dist/src/integrations/linear/sync-service.js +231 -0
- package/dist/src/integrations/linear/sync-service.js.map +7 -0
- package/dist/src/integrations/linear/sync.js +782 -0
- package/dist/src/integrations/linear/sync.js.map +7 -0
- package/dist/src/integrations/linear/types.js +5 -0
- package/dist/src/integrations/linear/types.js.map +7 -0
- package/dist/src/integrations/linear/unified-sync.js +589 -0
- package/dist/src/integrations/linear/unified-sync.js.map +7 -0
- package/dist/src/integrations/linear/webhook-handler.js +219 -0
- package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
- package/dist/src/integrations/linear/webhook-server.js +218 -0
- package/dist/src/integrations/linear/webhook-server.js.map +7 -0
- package/dist/src/integrations/linear/webhook.js +291 -0
- package/dist/src/integrations/linear/webhook.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/index.js +166 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/index.js +23 -0
- package/dist/src/integrations/mcp/index.js.map +7 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
- package/dist/src/integrations/mcp/refactored-server.js +374 -0
- package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
- package/dist/src/integrations/mcp/remote-server.js +682 -0
- package/dist/src/integrations/mcp/remote-server.js.map +7 -0
- package/dist/src/integrations/mcp/schemas.js +147 -0
- package/dist/src/integrations/mcp/schemas.js.map +7 -0
- package/dist/src/integrations/mcp/server.js +1975 -0
- package/dist/src/integrations/mcp/server.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js +125 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions.js +702 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
- package/dist/src/integrations/ralph/index.js +18 -0
- package/dist/src/integrations/ralph/index.js.map +7 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
- package/dist/src/integrations/ralph/types.js +5 -0
- package/dist/src/integrations/ralph/types.js.map +7 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
- package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/src/middleware/exponential-rate-limiter.js +289 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/src/models/user.model.js +358 -0
- package/dist/src/models/user.model.js.map +7 -0
- package/dist/src/servers/production/auth-middleware.js +528 -0
- package/dist/src/servers/production/auth-middleware.js.map +7 -0
- package/dist/src/services/config-service.js +65 -0
- package/dist/src/services/config-service.js.map +7 -0
- package/dist/src/services/context-service.js +194 -0
- package/dist/src/services/context-service.js.map +7 -0
- package/dist/src/skills/api-discovery.js +354 -0
- package/dist/src/skills/api-discovery.js.map +7 -0
- package/dist/src/skills/api-skill.js +475 -0
- package/dist/src/skills/api-skill.js.map +7 -0
- package/dist/src/skills/claude-skills.js +1061 -0
- package/dist/src/skills/claude-skills.js.map +7 -0
- package/dist/src/skills/dashboard-launcher.js +216 -0
- package/dist/src/skills/dashboard-launcher.js.map +7 -0
- package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
- package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
- package/dist/src/skills/repo-ingestion-skill.js +609 -0
- package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
- package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
- package/dist/src/types/task.js +5 -0
- package/dist/src/types/task.js.map +7 -0
- package/dist/src/utils/env.js +50 -0
- package/dist/src/utils/env.js.map +7 -0
- package/dist/src/utils/formatting.js +62 -0
- package/dist/src/utils/formatting.js.map +7 -0
- package/dist/src/utils/process-cleanup.js +136 -0
- package/dist/src/utils/process-cleanup.js.map +7 -0
- package/package.json +4 -3
- package/scripts/create-cleanup-issues.js +302 -0
- package/scripts/demos/browser-test.ts +39 -0
- package/scripts/demos/ralph-integration-demo.ts +244 -0
- package/scripts/demos/trace-demo.ts +214 -0
- package/scripts/demos/trace-detector.demo.ts +171 -0
- package/scripts/demos/trace-test.ts +67 -0
- package/scripts/initialize.ts +16 -7
- package/scripts/install.sh +14 -62
- package/scripts/status.ts +111 -46
- package/scripts/test-claude-config.sh +123 -0
- package/scripts/validate-claude-config.sh +155 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/cli/commands/sweep.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Sweep CLI Command\n * Manage Sweep Next-Edit prediction server\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport {\n createServerManager,\n createPredictionClient,\n launchWrapper,\n SweepServerConfig,\n DEFAULT_SERVER_CONFIG,\n} from '../../features/sweep/index.js';\n\nconst HOME = process.env['HOME'] || '/tmp';\n\nexport function createSweepCommand(): Command {\n const cmd = new Command('sweep')\n .description('Manage Sweep Next-Edit prediction server')\n .addHelpText(\n 'after',\n `\nExamples:\n stackmemory sweep start Start the Sweep server\n stackmemory sweep stop Stop the Sweep server\n stackmemory sweep status Check server status\n stackmemory sweep predict Run a prediction manually\n stackmemory sweep hook Install/check Claude Code hook\n\nThe Sweep server uses the Sweep 1.5B model for next-edit predictions.\nPredictions are triggered after file edits via Claude Code hooks.\n`\n );\n\n // Start command\n cmd\n .command('start')\n .description('Start the Sweep prediction server')\n .option(\n '--port <number>',\n 'Server port',\n String(DEFAULT_SERVER_CONFIG.port)\n )\n .option('--model <path>', 'Path to GGUF model file')\n .option(\n '--context <size>',\n 'Context size',\n String(DEFAULT_SERVER_CONFIG.contextSize)\n )\n .option('--gpu-layers <n>', 'Number of GPU layers (0 for CPU only)', '0')\n .action(async (options) => {\n const spinner = ora('Starting Sweep server...').start();\n\n try {\n const config: Partial<SweepServerConfig> = {\n port: parseInt(options.port, 10),\n contextSize: parseInt(options.context, 10),\n gpuLayers: parseInt(options.gpuLayers, 10),\n };\n\n if (options.model) {\n config.modelPath = options.model;\n }\n\n const manager = createServerManager(config);\n const status = await manager.startServer();\n\n spinner.succeed(chalk.green('Sweep server started'));\n console.log(chalk.gray(` PID: ${status.pid}`));\n console.log(chalk.gray(` Port: ${status.port}`));\n console.log(chalk.gray(` Model: ${status.modelPath}`));\n } catch (error) {\n spinner.fail(chalk.red('Failed to start Sweep server'));\n console.error(chalk.red((error as Error).message));\n process.exit(1);\n }\n });\n\n // Stop command\n cmd\n .command('stop')\n .description('Stop the Sweep prediction server')\n .action(async () => {\n const spinner = ora('Stopping Sweep server...').start();\n\n try {\n const manager = createServerManager();\n await manager.stopServer();\n spinner.succeed(chalk.green('Sweep server stopped'));\n } catch (error) {\n spinner.fail(chalk.red('Failed to stop Sweep server'));\n console.error(chalk.red((error as Error).message));\n process.exit(1);\n }\n });\n\n // Status command\n cmd\n .command('status')\n .description('Check Sweep server status')\n .action(async () => {\n try {\n const manager = createServerManager();\n const status = await manager.getStatus();\n\n if (status.running) {\n console.log(chalk.green('Sweep server is running'));\n console.log(chalk.gray(` PID: ${status.pid}`));\n console.log(chalk.gray(` Port: ${status.port}`));\n console.log(chalk.gray(` Host: ${status.host}`));\n if (status.startedAt) {\n const uptime = Math.floor((Date.now() - status.startedAt) / 1000);\n console.log(chalk.gray(` Uptime: ${formatUptime(uptime)}`));\n }\n if (status.modelPath) {\n console.log(chalk.gray(` Model: ${status.modelPath}`));\n }\n } else {\n console.log(chalk.yellow('Sweep server is not running'));\n console.log(chalk.gray(' Start with: stackmemory sweep start'));\n }\n\n // Check model availability\n const defaultModelPath = join(\n HOME,\n '.stackmemory',\n 'models',\n 'sweep',\n 'sweep-next-edit-1.5b.q8_0.v2.gguf'\n );\n if (!existsSync(defaultModelPath)) {\n console.log('');\n console.log(chalk.yellow('Model not found at default location'));\n console.log(\n chalk.gray(\n ' Download with:\\n' +\n ' huggingface-cli download sweepai/sweep-next-edit-1.5B \\\\\\n' +\n ' sweep-next-edit-1.5b.q8_0.v2.gguf \\\\\\n' +\n ' --local-dir ~/.stackmemory/models/sweep'\n )\n );\n }\n } catch (error) {\n console.error(\n chalk.red('Error checking status:'),\n (error as Error).message\n );\n process.exit(1);\n }\n });\n\n // Predict command (for testing)\n cmd\n .command('predict')\n .description('Run a prediction manually (for testing)')\n .argument('<file>', 'File to predict edits for')\n .option(\n '--port <number>',\n 'Server port',\n String(DEFAULT_SERVER_CONFIG.port)\n )\n .action(async (file, options) => {\n const spinner = ora('Running prediction...').start();\n\n try {\n const { readFileSync } = await import('fs');\n const content = readFileSync(file, 'utf-8');\n\n const client = createPredictionClient({\n port: parseInt(options.port, 10),\n });\n\n // Check server\n const healthy = await client.checkHealth();\n if (!healthy) {\n spinner.fail(chalk.red('Server not running'));\n console.log(chalk.gray('Start with: stackmemory sweep start'));\n process.exit(1);\n }\n\n const result = await client.predict({\n file_path: file,\n current_content: content,\n recent_diffs: [],\n });\n\n spinner.stop();\n\n if (result.success && result.predicted_content) {\n console.log(chalk.green('Prediction complete'));\n console.log(chalk.gray(`Latency: ${result.latency_ms}ms`));\n console.log(chalk.gray(`Tokens: ${result.tokens_generated}`));\n console.log('');\n console.log(chalk.cyan('Predicted content:'));\n console.log(result.predicted_content.slice(0, 500));\n if (result.predicted_content.length > 500) {\n console.log(chalk.gray('... (truncated)'));\n }\n } else if (result.success) {\n console.log(chalk.yellow('No changes predicted'));\n } else {\n console.log(chalk.red('Prediction failed:'), result.message);\n }\n } catch (error) {\n spinner.fail(chalk.red('Prediction failed'));\n console.error(chalk.red((error as Error).message));\n process.exit(1);\n }\n });\n\n // Hook command\n cmd\n .command('hook')\n .description('Check Claude Code hook status')\n .action(async () => {\n const hookPath = join(HOME, '.claude', 'hooks', 'post-edit-sweep.js');\n const templatePath = join(\n process.cwd(),\n 'templates',\n 'claude-hooks',\n 'post-edit-sweep.js'\n );\n\n console.log(chalk.cyan('Sweep Hook Status'));\n console.log('');\n\n if (existsSync(hookPath)) {\n console.log(chalk.green('Hook installed:'), hookPath);\n } else {\n console.log(chalk.yellow('Hook not installed'));\n console.log(chalk.gray(` Copy from: ${templatePath}`));\n console.log(chalk.gray(` To: ${hookPath}`));\n }\n\n // Check settings.json\n const settingsPath = join(HOME, '.claude', 'settings.json');\n if (existsSync(settingsPath)) {\n try {\n const { readFileSync } = await import('fs');\n const settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));\n const hasHook = JSON.stringify(settings).includes('post-edit-sweep');\n if (hasHook) {\n console.log(chalk.green('Hook registered in settings.json'));\n } else {\n console.log(chalk.yellow('Hook not registered in settings.json'));\n console.log(\n chalk.gray(\n ' Add to hooks.PostToolUse:\\n' +\n ' { \"matcher\": \"Edit\", \"hooks\": [{ \"type\": \"command\", \"command\": \"node ~/.claude/hooks/post-edit-sweep.js\" }] }'\n )\n );\n }\n } catch {\n console.log(chalk.yellow('Could not read settings.json'));\n }\n } else {\n console.log(chalk.yellow('settings.json not found'));\n }\n\n // Check state file\n const statePath = join(HOME, '.stackmemory', 'sweep-state.json');\n if (existsSync(statePath)) {\n try {\n const { readFileSync } = await import('fs');\n const state = JSON.parse(readFileSync(statePath, 'utf-8'));\n console.log(\n chalk.gray(\n ` Recent diffs tracked: ${state.recentDiffs?.length || 0}`\n )\n );\n if (state.lastPrediction) {\n const ago = Math.floor(\n (Date.now() - state.lastPrediction.timestamp) / 1000\n );\n console.log(\n chalk.gray(` Last prediction: ${formatUptime(ago)} ago`)\n );\n }\n } catch {\n // Ignore\n }\n }\n });\n\n // Wrap command\n cmd\n .command('wrap')\n .description('Launch Claude Code with Sweep prediction status bar')\n .option('--claude-bin <path>', 'Path to claude binary')\n .allowUnknownOption(true)\n .action(async (options, command) => {\n try {\n const claudeArgs = command.args || [];\n await launchWrapper({\n claudeBin: options.claudeBin,\n claudeArgs,\n });\n } catch (error) {\n console.error(chalk.red((error as Error).message));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\nfunction formatUptime(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n return `${hours}h ${mins}m`;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
import Database from "better-sqlite3";
|
|
7
|
+
import { join } from "path";
|
|
8
|
+
import { existsSync } from "fs";
|
|
9
|
+
import {
|
|
10
|
+
LinearTaskManager
|
|
11
|
+
} from "../../features/tasks/linear-task-manager.js";
|
|
12
|
+
function getTaskStore(projectRoot) {
|
|
13
|
+
const dbPath = join(projectRoot, ".stackmemory", "context.db");
|
|
14
|
+
if (!existsSync(dbPath)) {
|
|
15
|
+
console.log(
|
|
16
|
+
'\u274C StackMemory not initialized. Run "stackmemory init" first.'
|
|
17
|
+
);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
const config = {
|
|
21
|
+
linearApiKey: process.env.STACKMEMORY_LINEAR_API_KEY || process.env.LINEAR_API_KEY,
|
|
22
|
+
autoSync: true,
|
|
23
|
+
syncInterval: 15
|
|
24
|
+
};
|
|
25
|
+
return new LinearTaskManager(config, void 0, projectRoot);
|
|
26
|
+
}
|
|
27
|
+
function createTaskCommands() {
|
|
28
|
+
const tasks = new Command("tasks").alias("task").description("Manage tasks from command line");
|
|
29
|
+
tasks.command("list").alias("ls").description("List tasks").option(
|
|
30
|
+
"-s, --status <status>",
|
|
31
|
+
"Filter by status (pending, in_progress, completed, blocked)"
|
|
32
|
+
).option(
|
|
33
|
+
"-p, --priority <priority>",
|
|
34
|
+
"Filter by priority (urgent, high, medium, low)"
|
|
35
|
+
).option("-q, --query <text>", "Search in title/description").option("-l, --limit <n>", "Limit results", "20").option("-a, --all", "Include completed tasks").action(async (options) => {
|
|
36
|
+
const projectRoot = process.cwd();
|
|
37
|
+
const taskStore = getTaskStore(projectRoot);
|
|
38
|
+
if (!taskStore) return;
|
|
39
|
+
try {
|
|
40
|
+
const db = new Database(
|
|
41
|
+
join(projectRoot, ".stackmemory", "context.db")
|
|
42
|
+
);
|
|
43
|
+
let query = "SELECT * FROM task_cache WHERE 1=1";
|
|
44
|
+
const params = [];
|
|
45
|
+
if (!options.all && !options.status) {
|
|
46
|
+
query += " AND status NOT IN ('completed', 'cancelled')";
|
|
47
|
+
}
|
|
48
|
+
if (options.status) {
|
|
49
|
+
query += " AND status = ?";
|
|
50
|
+
params.push(options.status);
|
|
51
|
+
}
|
|
52
|
+
if (options.priority) {
|
|
53
|
+
query += " AND priority = ?";
|
|
54
|
+
params.push(options.priority);
|
|
55
|
+
}
|
|
56
|
+
if (options.query) {
|
|
57
|
+
query += " AND (title LIKE ? OR description LIKE ?)";
|
|
58
|
+
params.push(`%${options.query}%`, `%${options.query}%`);
|
|
59
|
+
}
|
|
60
|
+
query += " ORDER BY priority ASC, created_at DESC LIMIT ?";
|
|
61
|
+
params.push(parseInt(options.limit));
|
|
62
|
+
const rows = db.prepare(query).all(...params);
|
|
63
|
+
db.close();
|
|
64
|
+
if (rows.length === 0) {
|
|
65
|
+
console.log("\u{1F4DD} No tasks found");
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
console.log(`
|
|
69
|
+
\u{1F4CB} Tasks (${rows.length})
|
|
70
|
+
`);
|
|
71
|
+
const priorityIcon = {
|
|
72
|
+
urgent: "\u{1F534}",
|
|
73
|
+
high: "\u{1F7E0}",
|
|
74
|
+
medium: "\u{1F7E1}",
|
|
75
|
+
low: "\u{1F7E2}"
|
|
76
|
+
};
|
|
77
|
+
const statusIcon = {
|
|
78
|
+
pending: "\u23F3",
|
|
79
|
+
in_progress: "\u{1F504}",
|
|
80
|
+
completed: "\u2705",
|
|
81
|
+
blocked: "\u{1F6AB}",
|
|
82
|
+
cancelled: "\u274C"
|
|
83
|
+
};
|
|
84
|
+
rows.forEach((row) => {
|
|
85
|
+
const pIcon = priorityIcon[row.priority] || "\u26AA";
|
|
86
|
+
const sIcon = statusIcon[row.status] || "\u26AA";
|
|
87
|
+
const id = row.id.slice(0, 10);
|
|
88
|
+
console.log(`${sIcon} ${pIcon} [${id}] ${row.title}`);
|
|
89
|
+
if (row.description) {
|
|
90
|
+
const desc = row.description.split("\n")[0].slice(0, 60);
|
|
91
|
+
console.log(
|
|
92
|
+
` ${desc}${row.description.length > 60 ? "..." : ""}`
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
console.log("");
|
|
97
|
+
} catch (error) {
|
|
98
|
+
console.error("\u274C Failed to list tasks:", error.message);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
tasks.command("add <title>").description("Add a new task").option("-d, --description <text>", "Task description").option(
|
|
102
|
+
"-p, --priority <priority>",
|
|
103
|
+
"Priority (urgent, high, medium, low)",
|
|
104
|
+
"medium"
|
|
105
|
+
).option("-t, --tags <tags>", "Comma-separated tags").action(async (title, options) => {
|
|
106
|
+
const projectRoot = process.cwd();
|
|
107
|
+
const taskStore = getTaskStore(projectRoot);
|
|
108
|
+
if (!taskStore) return;
|
|
109
|
+
try {
|
|
110
|
+
const taskId = taskStore.createTask({
|
|
111
|
+
title,
|
|
112
|
+
description: options.description,
|
|
113
|
+
priority: options.priority,
|
|
114
|
+
frameId: "cli",
|
|
115
|
+
tags: options.tags ? options.tags.split(",").map((t) => t.trim()) : []
|
|
116
|
+
});
|
|
117
|
+
console.log(`\u2705 Created task: ${taskId.slice(0, 10)}`);
|
|
118
|
+
console.log(` Title: ${title}`);
|
|
119
|
+
console.log(` Priority: ${options.priority}`);
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.error("\u274C Failed to add task:", error.message);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
tasks.command("start <taskId>").description("Start working on a task").action(async (taskId) => {
|
|
125
|
+
const projectRoot = process.cwd();
|
|
126
|
+
const taskStore = getTaskStore(projectRoot);
|
|
127
|
+
if (!taskStore) return;
|
|
128
|
+
try {
|
|
129
|
+
const task = findTaskByPartialId(projectRoot, taskId);
|
|
130
|
+
if (!task) {
|
|
131
|
+
console.log(`\u274C Task not found: ${taskId}`);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
taskStore.updateTaskStatus(task.id, "in_progress", "Started from CLI");
|
|
135
|
+
console.log(`\u{1F504} Started: ${task.title}`);
|
|
136
|
+
} catch (error) {
|
|
137
|
+
console.error("\u274C Failed to start task:", error.message);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
tasks.command("done <taskId>").alias("complete").description("Mark task as completed").action(async (taskId) => {
|
|
141
|
+
const projectRoot = process.cwd();
|
|
142
|
+
const taskStore = getTaskStore(projectRoot);
|
|
143
|
+
if (!taskStore) return;
|
|
144
|
+
try {
|
|
145
|
+
const task = findTaskByPartialId(projectRoot, taskId);
|
|
146
|
+
if (!task) {
|
|
147
|
+
console.log(`\u274C Task not found: ${taskId}`);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
taskStore.updateTaskStatus(task.id, "completed", "Completed from CLI");
|
|
151
|
+
console.log(`\u2705 Completed: ${task.title}`);
|
|
152
|
+
} catch (error) {
|
|
153
|
+
console.error("\u274C Failed to complete task:", error.message);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
tasks.command("show <taskId>").description("Show task details").action(async (taskId) => {
|
|
157
|
+
const projectRoot = process.cwd();
|
|
158
|
+
try {
|
|
159
|
+
const task = findTaskByPartialId(projectRoot, taskId);
|
|
160
|
+
if (!task) {
|
|
161
|
+
console.log(`\u274C Task not found: ${taskId}`);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
console.log(`
|
|
165
|
+
\u{1F4CB} Task Details
|
|
166
|
+
`);
|
|
167
|
+
console.log(`ID: ${task.id}`);
|
|
168
|
+
console.log(`Title: ${task.title}`);
|
|
169
|
+
console.log(`Status: ${task.status}`);
|
|
170
|
+
console.log(`Priority: ${task.priority}`);
|
|
171
|
+
console.log(
|
|
172
|
+
`Created: ${new Date(task.created_at * 1e3).toLocaleString()}`
|
|
173
|
+
);
|
|
174
|
+
if (task.completed_at) {
|
|
175
|
+
console.log(
|
|
176
|
+
`Completed: ${new Date(task.completed_at * 1e3).toLocaleString()}`
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
if (task.description) {
|
|
180
|
+
console.log(`
|
|
181
|
+
Description:
|
|
182
|
+
${task.description}`);
|
|
183
|
+
}
|
|
184
|
+
const tags = JSON.parse(task.tags || "[]");
|
|
185
|
+
if (tags.length > 0) {
|
|
186
|
+
console.log(`
|
|
187
|
+
Tags: ${tags.join(", ")}`);
|
|
188
|
+
}
|
|
189
|
+
console.log("");
|
|
190
|
+
} catch (error) {
|
|
191
|
+
console.error("\u274C Failed to show task:", error.message);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
return tasks;
|
|
195
|
+
}
|
|
196
|
+
function findTaskByPartialId(projectRoot, partialId) {
|
|
197
|
+
const dbPath = join(projectRoot, ".stackmemory", "context.db");
|
|
198
|
+
if (!existsSync(dbPath)) return null;
|
|
199
|
+
const db = new Database(dbPath);
|
|
200
|
+
let row = db.prepare("SELECT * FROM task_cache WHERE id = ?").get(partialId);
|
|
201
|
+
if (!row) {
|
|
202
|
+
row = db.prepare("SELECT * FROM task_cache WHERE id LIKE ?").get(`${partialId}%`);
|
|
203
|
+
}
|
|
204
|
+
if (!row && partialId.match(/^ENG-\d+$/i)) {
|
|
205
|
+
row = db.prepare("SELECT * FROM task_cache WHERE title LIKE ?").get(`%[${partialId.toUpperCase()}]%`);
|
|
206
|
+
}
|
|
207
|
+
db.close();
|
|
208
|
+
return row || null;
|
|
209
|
+
}
|
|
210
|
+
export {
|
|
211
|
+
createTaskCommands
|
|
212
|
+
};
|
|
213
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/cli/commands/tasks.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Enhanced Task Commands for StackMemory CLI\n * Provides task management directly from command line\n */\n\nimport { Command } from 'commander';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport {\n LinearTaskManager,\n TaskPriority,\n} from '../../features/tasks/linear-task-manager.js';\n\nfunction getTaskStore(projectRoot: string): LinearTaskManager | null {\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return null;\n }\n \n // Use project isolation for proper task management\n const config = {\n linearApiKey: process.env.STACKMEMORY_LINEAR_API_KEY || process.env.LINEAR_API_KEY,\n autoSync: true,\n syncInterval: 15,\n };\n return new LinearTaskManager(config, undefined, projectRoot);\n}\n\nexport function createTaskCommands(): Command {\n const tasks = new Command('tasks')\n .alias('task')\n .description('Manage tasks from command line');\n\n // List tasks\n tasks\n .command('list')\n .alias('ls')\n .description('List tasks')\n .option(\n '-s, --status <status>',\n 'Filter by status (pending, in_progress, completed, blocked)'\n )\n .option(\n '-p, --priority <priority>',\n 'Filter by priority (urgent, high, medium, low)'\n )\n .option('-q, --query <text>', 'Search in title/description')\n .option('-l, --limit <n>', 'Limit results', '20')\n .option('-a, --all', 'Include completed tasks')\n .action(async (options) => {\n const projectRoot = process.cwd();\n const taskStore = getTaskStore(projectRoot);\n if (!taskStore) return;\n\n try {\n // Get all tasks from DB\n const db = new Database(\n join(projectRoot, '.stackmemory', 'context.db')\n );\n let query = 'SELECT * FROM task_cache WHERE 1=1';\n const params: any[] = [];\n\n if (!options.all && !options.status) {\n query += \" AND status NOT IN ('completed', 'cancelled')\";\n }\n\n if (options.status) {\n query += ' AND status = ?';\n params.push(options.status);\n }\n\n if (options.priority) {\n query += ' AND priority = ?';\n params.push(options.priority);\n }\n\n if (options.query) {\n query += ' AND (title LIKE ? OR description LIKE ?)';\n params.push(`%${options.query}%`, `%${options.query}%`);\n }\n\n query += ' ORDER BY priority ASC, created_at DESC LIMIT ?';\n params.push(parseInt(options.limit));\n\n const rows = db.prepare(query).all(...params) as any[];\n db.close();\n\n if (rows.length === 0) {\n console.log('\uD83D\uDCDD No tasks found');\n return;\n }\n\n console.log(`\\n\uD83D\uDCCB Tasks (${rows.length})\\n`);\n\n const priorityIcon: Record<string, string> = {\n urgent: '\uD83D\uDD34',\n high: '\uD83D\uDFE0',\n medium: '\uD83D\uDFE1',\n low: '\uD83D\uDFE2',\n };\n const statusIcon: Record<string, string> = {\n pending: '\u23F3',\n in_progress: '\uD83D\uDD04',\n completed: '\u2705',\n blocked: '\uD83D\uDEAB',\n cancelled: '\u274C',\n };\n\n rows.forEach((row) => {\n const pIcon = priorityIcon[row.priority] || '\u26AA';\n const sIcon = statusIcon[row.status] || '\u26AA';\n const id = row.id.slice(0, 10);\n console.log(`${sIcon} ${pIcon} [${id}] ${row.title}`);\n if (row.description) {\n const desc = row.description.split('\\n')[0].slice(0, 60);\n console.log(\n ` ${desc}${row.description.length > 60 ? '...' : ''}`\n );\n }\n });\n console.log('');\n } catch (error: unknown) {\n console.error('\u274C Failed to list tasks:', (error as Error).message);\n }\n });\n\n // Add task\n tasks\n .command('add <title>')\n .description('Add a new task')\n .option('-d, --description <text>', 'Task description')\n .option(\n '-p, --priority <priority>',\n 'Priority (urgent, high, medium, low)',\n 'medium'\n )\n .option('-t, --tags <tags>', 'Comma-separated tags')\n .action(async (title, options) => {\n const projectRoot = process.cwd();\n const taskStore = getTaskStore(projectRoot);\n if (!taskStore) return;\n\n try {\n const taskId = taskStore.createTask({\n title,\n description: options.description,\n priority: options.priority as TaskPriority,\n frameId: 'cli',\n tags: options.tags\n ? options.tags.split(',').map((t: string) => t.trim())\n : [],\n });\n\n console.log(`\u2705 Created task: ${taskId.slice(0, 10)}`);\n console.log(` Title: ${title}`);\n console.log(` Priority: ${options.priority}`);\n } catch (error: unknown) {\n console.error('\u274C Failed to add task:', (error as Error).message);\n }\n });\n\n // Start task (set to in_progress)\n tasks\n .command('start <taskId>')\n .description('Start working on a task')\n .action(async (taskId) => {\n const projectRoot = process.cwd();\n const taskStore = getTaskStore(projectRoot);\n if (!taskStore) return;\n\n try {\n // Find task by partial ID\n const task = findTaskByPartialId(projectRoot, taskId);\n if (!task) {\n console.log(`\u274C Task not found: ${taskId}`);\n return;\n }\n\n taskStore.updateTaskStatus(task.id, 'in_progress', 'Started from CLI');\n console.log(`\uD83D\uDD04 Started: ${task.title}`);\n } catch (error: unknown) {\n console.error('\u274C Failed to start task:', (error as Error).message);\n }\n });\n\n // Complete task\n tasks\n .command('done <taskId>')\n .alias('complete')\n .description('Mark task as completed')\n .action(async (taskId) => {\n const projectRoot = process.cwd();\n const taskStore = getTaskStore(projectRoot);\n if (!taskStore) return;\n\n try {\n const task = findTaskByPartialId(projectRoot, taskId);\n if (!task) {\n console.log(`\u274C Task not found: ${taskId}`);\n return;\n }\n\n taskStore.updateTaskStatus(task.id, 'completed', 'Completed from CLI');\n console.log(`\u2705 Completed: ${task.title}`);\n } catch (error: unknown) {\n console.error('\u274C Failed to complete task:', (error as Error).message);\n }\n });\n\n // Show task details\n tasks\n .command('show <taskId>')\n .description('Show task details')\n .action(async (taskId) => {\n const projectRoot = process.cwd();\n\n try {\n const task = findTaskByPartialId(projectRoot, taskId);\n if (!task) {\n console.log(`\u274C Task not found: ${taskId}`);\n return;\n }\n\n console.log(`\\n\uD83D\uDCCB Task Details\\n`);\n console.log(`ID: ${task.id}`);\n console.log(`Title: ${task.title}`);\n console.log(`Status: ${task.status}`);\n console.log(`Priority: ${task.priority}`);\n console.log(\n `Created: ${new Date(task.created_at * 1000).toLocaleString()}`\n );\n if (task.completed_at) {\n console.log(\n `Completed: ${new Date(task.completed_at * 1000).toLocaleString()}`\n );\n }\n if (task.description) {\n console.log(`\\nDescription:\\n${task.description}`);\n }\n const tags = JSON.parse(task.tags || '[]');\n if (tags.length > 0) {\n console.log(`\\nTags: ${tags.join(', ')}`);\n }\n console.log('');\n } catch (error: unknown) {\n console.error('\u274C Failed to show task:', (error as Error).message);\n }\n });\n\n return tasks;\n}\n\nfunction findTaskByPartialId(\n projectRoot: string,\n partialId: string\n): any | null {\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n if (!existsSync(dbPath)) return null;\n\n const db = new Database(dbPath);\n\n // Try exact match first, then partial\n let row = db.prepare('SELECT * FROM task_cache WHERE id = ?').get(partialId);\n\n if (!row) {\n row = db\n .prepare('SELECT * FROM task_cache WHERE id LIKE ?')\n .get(`${partialId}%`);\n }\n\n // Also try matching Linear identifier in title\n if (!row && partialId.match(/^ENG-\\d+$/i)) {\n row = db\n .prepare('SELECT * FROM task_cache WHERE title LIKE ?')\n .get(`%[${partialId.toUpperCase()}]%`);\n }\n\n db.close();\n return row || null;\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAKA,SAAS,eAAe;AACxB,OAAO,cAAc;AACrB,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,OAEK;AAEP,SAAS,aAAa,aAA+C;AACnE,QAAM,SAAS,KAAK,aAAa,gBAAgB,YAAY;AAC7D,MAAI,CAAC,WAAW,MAAM,GAAG;AACvB,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,SAAS;AAAA,IACb,cAAc,QAAQ,IAAI,8BAA8B,QAAQ,IAAI;AAAA,IACpE,UAAU;AAAA,IACV,cAAc;AAAA,EAChB;AACA,SAAO,IAAI,kBAAkB,QAAQ,QAAW,WAAW;AAC7D;AAEO,SAAS,qBAA8B;AAC5C,QAAM,QAAQ,IAAI,QAAQ,OAAO,EAC9B,MAAM,MAAM,EACZ,YAAY,gCAAgC;AAG/C,QACG,QAAQ,MAAM,EACd,MAAM,IAAI,EACV,YAAY,YAAY,EACxB;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,sBAAsB,6BAA6B,EAC1D,OAAO,mBAAmB,iBAAiB,IAAI,EAC/C,OAAO,aAAa,yBAAyB,EAC7C,OAAO,OAAO,YAAY;AACzB,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,YAAY,aAAa,WAAW;AAC1C,QAAI,CAAC,UAAW;AAEhB,QAAI;AAEF,YAAM,KAAK,IAAI;AAAA,QACb,KAAK,aAAa,gBAAgB,YAAY;AAAA,MAChD;AACA,UAAI,QAAQ;AACZ,YAAM,SAAgB,CAAC;AAEvB,UAAI,CAAC,QAAQ,OAAO,CAAC,QAAQ,QAAQ;AACnC,iBAAS;AAAA,MACX;AAEA,UAAI,QAAQ,QAAQ;AAClB,iBAAS;AACT,eAAO,KAAK,QAAQ,MAAM;AAAA,MAC5B;AAEA,UAAI,QAAQ,UAAU;AACpB,iBAAS;AACT,eAAO,KAAK,QAAQ,QAAQ;AAAA,MAC9B;AAEA,UAAI,QAAQ,OAAO;AACjB,iBAAS;AACT,eAAO,KAAK,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,GAAG;AAAA,MACxD;AAEA,eAAS;AACT,aAAO,KAAK,SAAS,QAAQ,KAAK,CAAC;AAEnC,YAAM,OAAO,GAAG,QAAQ,KAAK,EAAE,IAAI,GAAG,MAAM;AAC5C,SAAG,MAAM;AAET,UAAI,KAAK,WAAW,GAAG;AACrB,gBAAQ,IAAI,0BAAmB;AAC/B;AAAA,MACF;AAEA,cAAQ,IAAI;AAAA,mBAAe,KAAK,MAAM;AAAA,CAAK;AAE3C,YAAM,eAAuC;AAAA,QAC3C,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,KAAK;AAAA,MACP;AACA,YAAM,aAAqC;AAAA,QACzC,SAAS;AAAA,QACT,aAAa;AAAA,QACb,WAAW;AAAA,QACX,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAEA,WAAK,QAAQ,CAAC,QAAQ;AACpB,cAAM,QAAQ,aAAa,IAAI,QAAQ,KAAK;AAC5C,cAAM,QAAQ,WAAW,IAAI,MAAM,KAAK;AACxC,cAAM,KAAK,IAAI,GAAG,MAAM,GAAG,EAAE;AAC7B,gBAAQ,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE;AACpD,YAAI,IAAI,aAAa;AACnB,gBAAM,OAAO,IAAI,YAAY,MAAM,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE;AACvD,kBAAQ;AAAA,YACN,SAAS,IAAI,GAAG,IAAI,YAAY,SAAS,KAAK,QAAQ,EAAE;AAAA,UAC1D;AAAA,QACF;AAAA,MACF,CAAC;AACD,cAAQ,IAAI,EAAE;AAAA,IAChB,SAAS,OAAgB;AACvB,cAAQ,MAAM,gCAA4B,MAAgB,OAAO;AAAA,IACnE;AAAA,EACF,CAAC;AAGH,QACG,QAAQ,aAAa,EACrB,YAAY,gBAAgB,EAC5B,OAAO,4BAA4B,kBAAkB,EACrD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,qBAAqB,sBAAsB,EAClD,OAAO,OAAO,OAAO,YAAY;AAChC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,YAAY,aAAa,WAAW;AAC1C,QAAI,CAAC,UAAW;AAEhB,QAAI;AACF,YAAM,SAAS,UAAU,WAAW;AAAA,QAClC;AAAA,QACA,aAAa,QAAQ;AAAA,QACrB,UAAU,QAAQ;AAAA,QAClB,SAAS;AAAA,QACT,MAAM,QAAQ,OACV,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,IACnD,CAAC;AAAA,MACP,CAAC;AAED,cAAQ,IAAI,wBAAmB,OAAO,MAAM,GAAG,EAAE,CAAC,EAAE;AACpD,cAAQ,IAAI,aAAa,KAAK,EAAE;AAChC,cAAQ,IAAI,gBAAgB,QAAQ,QAAQ,EAAE;AAAA,IAChD,SAAS,OAAgB;AACvB,cAAQ,MAAM,8BAA0B,MAAgB,OAAO;AAAA,IACjE;AAAA,EACF,CAAC;AAGH,QACG,QAAQ,gBAAgB,EACxB,YAAY,yBAAyB,EACrC,OAAO,OAAO,WAAW;AACxB,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,YAAY,aAAa,WAAW;AAC1C,QAAI,CAAC,UAAW;AAEhB,QAAI;AAEF,YAAM,OAAO,oBAAoB,aAAa,MAAM;AACpD,UAAI,CAAC,MAAM;AACT,gBAAQ,IAAI,0BAAqB,MAAM,EAAE;AACzC;AAAA,MACF;AAEA,gBAAU,iBAAiB,KAAK,IAAI,eAAe,kBAAkB;AACrE,cAAQ,IAAI,sBAAe,KAAK,KAAK,EAAE;AAAA,IACzC,SAAS,OAAgB;AACvB,cAAQ,MAAM,gCAA4B,MAAgB,OAAO;AAAA,IACnE;AAAA,EACF,CAAC;AAGH,QACG,QAAQ,eAAe,EACvB,MAAM,UAAU,EAChB,YAAY,wBAAwB,EACpC,OAAO,OAAO,WAAW;AACxB,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,YAAY,aAAa,WAAW;AAC1C,QAAI,CAAC,UAAW;AAEhB,QAAI;AACF,YAAM,OAAO,oBAAoB,aAAa,MAAM;AACpD,UAAI,CAAC,MAAM;AACT,gBAAQ,IAAI,0BAAqB,MAAM,EAAE;AACzC;AAAA,MACF;AAEA,gBAAU,iBAAiB,KAAK,IAAI,aAAa,oBAAoB;AACrE,cAAQ,IAAI,qBAAgB,KAAK,KAAK,EAAE;AAAA,IAC1C,SAAS,OAAgB;AACvB,cAAQ,MAAM,mCAA+B,MAAgB,OAAO;AAAA,IACtE;AAAA,EACF,CAAC;AAGH,QACG,QAAQ,eAAe,EACvB,YAAY,mBAAmB,EAC/B,OAAO,OAAO,WAAW;AACxB,UAAM,cAAc,QAAQ,IAAI;AAEhC,QAAI;AACF,YAAM,OAAO,oBAAoB,aAAa,MAAM;AACpD,UAAI,CAAC,MAAM;AACT,gBAAQ,IAAI,0BAAqB,MAAM,EAAE;AACzC;AAAA,MACF;AAEA,cAAQ,IAAI;AAAA;AAAA,CAAqB;AACjC,cAAQ,IAAI,gBAAgB,KAAK,EAAE,EAAE;AACrC,cAAQ,IAAI,gBAAgB,KAAK,KAAK,EAAE;AACxC,cAAQ,IAAI,gBAAgB,KAAK,MAAM,EAAE;AACzC,cAAQ,IAAI,gBAAgB,KAAK,QAAQ,EAAE;AAC3C,cAAQ;AAAA,QACN,gBAAgB,IAAI,KAAK,KAAK,aAAa,GAAI,EAAE,eAAe,CAAC;AAAA,MACnE;AACA,UAAI,KAAK,cAAc;AACrB,gBAAQ;AAAA,UACN,gBAAgB,IAAI,KAAK,KAAK,eAAe,GAAI,EAAE,eAAe,CAAC;AAAA,QACrE;AAAA,MACF;AACA,UAAI,KAAK,aAAa;AACpB,gBAAQ,IAAI;AAAA;AAAA,EAAmB,KAAK,WAAW,EAAE;AAAA,MACnD;AACA,YAAM,OAAO,KAAK,MAAM,KAAK,QAAQ,IAAI;AACzC,UAAI,KAAK,SAAS,GAAG;AACnB,gBAAQ,IAAI;AAAA,QAAW,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,MAC1C;AACA,cAAQ,IAAI,EAAE;AAAA,IAChB,SAAS,OAAgB;AACvB,cAAQ,MAAM,+BAA2B,MAAgB,OAAO;AAAA,IAClE;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,SAAS,oBACP,aACA,WACY;AACZ,QAAM,SAAS,KAAK,aAAa,gBAAgB,YAAY;AAC7D,MAAI,CAAC,WAAW,MAAM,EAAG,QAAO;AAEhC,QAAM,KAAK,IAAI,SAAS,MAAM;AAG9B,MAAI,MAAM,GAAG,QAAQ,uCAAuC,EAAE,IAAI,SAAS;AAE3E,MAAI,CAAC,KAAK;AACR,UAAM,GACH,QAAQ,0CAA0C,EAClD,IAAI,GAAG,SAAS,GAAG;AAAA,EACxB;AAGA,MAAI,CAAC,OAAO,UAAU,MAAM,YAAY,GAAG;AACzC,UAAM,GACH,QAAQ,6CAA6C,EACrD,IAAI,KAAK,UAAU,YAAY,CAAC,IAAI;AAAA,EACzC;AAEA,KAAG,MAAM;AACT,SAAO,OAAO;AAChB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
3
|
+
import { dirname as __pathDirname } from 'path';
|
|
4
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = __pathDirname(__filename);
|
|
6
|
+
import { WorktreeManager } from "../../core/worktree/worktree-manager.js";
|
|
7
|
+
import { ProjectManager } from "../../core/projects/project-manager.js";
|
|
8
|
+
import { FrameManager } from "../../core/context/index.js";
|
|
9
|
+
import chalk from "chalk";
|
|
10
|
+
import Table from "cli-table3";
|
|
11
|
+
import { existsSync } from "fs";
|
|
12
|
+
import Database from "better-sqlite3";
|
|
13
|
+
import { execFileSync } from "child_process";
|
|
14
|
+
import { z } from "zod";
|
|
15
|
+
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 "`"');
|
|
16
|
+
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 ".."');
|
|
17
|
+
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");
|
|
18
|
+
function registerWorktreeCommands(program) {
|
|
19
|
+
const worktree = program.command("worktree").alias("wt").description("Manage StackMemory across git worktrees");
|
|
20
|
+
worktree.command("enable").description("Enable worktree support").option(
|
|
21
|
+
"--isolate",
|
|
22
|
+
"Isolate contexts between worktrees (default: true)",
|
|
23
|
+
true
|
|
24
|
+
).option("--auto-detect", "Auto-detect worktrees (default: true)", true).option("--sync-interval <minutes>", "Context sync interval", "15").action(async (options) => {
|
|
25
|
+
const manager = WorktreeManager.getInstance();
|
|
26
|
+
manager.saveConfig({
|
|
27
|
+
enabled: true,
|
|
28
|
+
autoDetect: options.autoDetect,
|
|
29
|
+
isolateContexts: options.isolate,
|
|
30
|
+
shareGlobalContext: false,
|
|
31
|
+
syncInterval: parseInt(options.syncInterval)
|
|
32
|
+
});
|
|
33
|
+
console.log(chalk.green("\u2713 Worktree support enabled"));
|
|
34
|
+
const worktrees = manager.detectWorktrees();
|
|
35
|
+
if (worktrees.length > 0) {
|
|
36
|
+
console.log(chalk.cyan(`
|
|
37
|
+
Detected ${worktrees.length} worktree(s):`));
|
|
38
|
+
worktrees.forEach((wt) => {
|
|
39
|
+
const marker = wt.isMainWorktree ? " (main)" : "";
|
|
40
|
+
console.log(chalk.gray(` - ${wt.branch}${marker} at ${wt.path}`));
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
worktree.command("disable").description("Disable worktree support").action(() => {
|
|
45
|
+
const manager = WorktreeManager.getInstance();
|
|
46
|
+
manager.setEnabled(false);
|
|
47
|
+
console.log(chalk.yellow("\u26A0 Worktree support disabled"));
|
|
48
|
+
});
|
|
49
|
+
worktree.command("list").alias("ls").description("List all git worktrees with StackMemory status").option("-v, --verbose", "Show detailed information").action((options) => {
|
|
50
|
+
const manager = WorktreeManager.getInstance();
|
|
51
|
+
const worktrees = manager.detectWorktrees();
|
|
52
|
+
if (worktrees.length === 0) {
|
|
53
|
+
console.log(chalk.yellow("No worktrees found in current repository"));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const table = new Table({
|
|
57
|
+
head: ["Branch", "Path", "Type", "Context", "Last Activity"],
|
|
58
|
+
style: { head: ["cyan"] }
|
|
59
|
+
});
|
|
60
|
+
for (const wt of worktrees) {
|
|
61
|
+
const type = wt.isMainWorktree ? "Main" : wt.isDetached ? "Detached" : "Branch";
|
|
62
|
+
let contextStatus = "\u2014";
|
|
63
|
+
let lastActivity = "\u2014";
|
|
64
|
+
try {
|
|
65
|
+
const context = manager.getWorktreeContext(wt.path);
|
|
66
|
+
if (existsSync(context.dbPath)) {
|
|
67
|
+
contextStatus = "\u2713 Active";
|
|
68
|
+
const db = new Database(context.dbPath);
|
|
69
|
+
const lastEvent = db.prepare("SELECT MAX(created_at) as last FROM events").get();
|
|
70
|
+
if (lastEvent?.last) {
|
|
71
|
+
const date = new Date(lastEvent.last);
|
|
72
|
+
lastActivity = date.toLocaleDateString();
|
|
73
|
+
}
|
|
74
|
+
db.close();
|
|
75
|
+
} else {
|
|
76
|
+
contextStatus = "\u25CB Not initialized";
|
|
77
|
+
}
|
|
78
|
+
} catch (error) {
|
|
79
|
+
contextStatus = "\u2717 Error";
|
|
80
|
+
}
|
|
81
|
+
table.push([
|
|
82
|
+
wt.branch || "detached",
|
|
83
|
+
options.verbose ? wt.path : `.../${wt.path.split("/").slice(-2).join("/")}`,
|
|
84
|
+
type,
|
|
85
|
+
contextStatus,
|
|
86
|
+
lastActivity
|
|
87
|
+
]);
|
|
88
|
+
}
|
|
89
|
+
console.log(chalk.cyan("\nGit Worktrees:\n"));
|
|
90
|
+
console.log(table.toString());
|
|
91
|
+
if (manager.isEnabled()) {
|
|
92
|
+
console.log(chalk.gray("\n\u2713 Worktree support is enabled"));
|
|
93
|
+
const config = manager.getConfig();
|
|
94
|
+
if (config.isolateContexts) {
|
|
95
|
+
console.log(
|
|
96
|
+
chalk.gray(" - Contexts are isolated between worktrees")
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
if (config.autoDetect) {
|
|
100
|
+
console.log(chalk.gray(" - Auto-detection is enabled"));
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
console.log(chalk.gray("\n\u25CB Worktree support is disabled"));
|
|
104
|
+
console.log(
|
|
105
|
+
chalk.gray(' Run "stackmemory worktree enable" to activate')
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
worktree.command("status").description("Show status of current worktree").action(async () => {
|
|
110
|
+
const manager = WorktreeManager.getInstance();
|
|
111
|
+
const currentPath = process.cwd();
|
|
112
|
+
const worktrees = manager.detectWorktrees(currentPath);
|
|
113
|
+
const current = worktrees.find(
|
|
114
|
+
(w) => currentPath.startsWith(w.path)
|
|
115
|
+
);
|
|
116
|
+
if (!current) {
|
|
117
|
+
console.log(chalk.yellow("Not in a git worktree"));
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
console.log(chalk.cyan("Current Worktree:\n"));
|
|
121
|
+
console.log(chalk.gray(" Branch:"), current.branch || "detached");
|
|
122
|
+
console.log(chalk.gray(" Path:"), current.path);
|
|
123
|
+
console.log(
|
|
124
|
+
chalk.gray(" Type:"),
|
|
125
|
+
current.isMainWorktree ? "Main" : "Branch"
|
|
126
|
+
);
|
|
127
|
+
console.log(chalk.gray(" Commit:"), current.commit.substring(0, 8));
|
|
128
|
+
if (manager.isEnabled()) {
|
|
129
|
+
try {
|
|
130
|
+
const context = manager.getWorktreeContext(current.path);
|
|
131
|
+
console.log(chalk.gray(" Context Path:"), context.contextPath);
|
|
132
|
+
if (existsSync(context.dbPath)) {
|
|
133
|
+
const db = new Database(context.dbPath);
|
|
134
|
+
const stats = db.prepare(
|
|
135
|
+
`
|
|
136
|
+
SELECT
|
|
137
|
+
(SELECT COUNT(*) FROM frames) as frames,
|
|
138
|
+
(SELECT COUNT(*) FROM events) as events,
|
|
139
|
+
(SELECT COUNT(*) FROM contexts) as contexts
|
|
140
|
+
`
|
|
141
|
+
).get();
|
|
142
|
+
console.log(chalk.cyan("\nContext Statistics:"));
|
|
143
|
+
console.log(chalk.gray(" Frames:"), stats.frames);
|
|
144
|
+
console.log(chalk.gray(" Events:"), stats.events);
|
|
145
|
+
console.log(chalk.gray(" Contexts:"), stats.contexts);
|
|
146
|
+
db.close();
|
|
147
|
+
} else {
|
|
148
|
+
console.log(chalk.yellow("\nContext not initialized"));
|
|
149
|
+
console.log(chalk.gray(' Run "stackmemory init" to initialize'));
|
|
150
|
+
}
|
|
151
|
+
} catch (error) {
|
|
152
|
+
console.log(
|
|
153
|
+
chalk.red("\nError accessing context:"),
|
|
154
|
+
error.message
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
} else {
|
|
158
|
+
console.log(chalk.gray("\nWorktree support is disabled"));
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
worktree.command("create <branch>").description("Create new git worktree with StackMemory context").option("-p, --path <path>", "Worktree path (default: ../repo-branch)").option("--from <commit>", "Create branch from commit/branch").option("--init", "Initialize StackMemory immediately").action(async (branch, options) => {
|
|
162
|
+
const manager = WorktreeManager.getInstance();
|
|
163
|
+
const projectManager = ProjectManager.getInstance();
|
|
164
|
+
try {
|
|
165
|
+
const validatedBranch = BranchNameSchema.parse(branch);
|
|
166
|
+
const project = await projectManager.detectProject();
|
|
167
|
+
const worktreePath = options.path || `../${project.name}-${validatedBranch}`;
|
|
168
|
+
if (options.path) {
|
|
169
|
+
PathSchema.parse(options.path);
|
|
170
|
+
}
|
|
171
|
+
if (options.from) {
|
|
172
|
+
CommitSchema.parse(options.from);
|
|
173
|
+
}
|
|
174
|
+
const gitArgs = ["worktree", "add", "-b", validatedBranch, worktreePath];
|
|
175
|
+
if (options.from) {
|
|
176
|
+
gitArgs.push(options.from);
|
|
177
|
+
}
|
|
178
|
+
console.log(chalk.gray(`Creating worktree: git ${gitArgs.join(" ")}`));
|
|
179
|
+
execFileSync("git", gitArgs, { stdio: "inherit" });
|
|
180
|
+
console.log(chalk.green(`\u2713 Created worktree at ${worktreePath}`));
|
|
181
|
+
if (manager.isEnabled()) {
|
|
182
|
+
const context = manager.getWorktreeContext(worktreePath);
|
|
183
|
+
console.log(
|
|
184
|
+
chalk.green(`\u2713 Created isolated context at ${context.contextPath}`)
|
|
185
|
+
);
|
|
186
|
+
if (options.init) {
|
|
187
|
+
const db = new Database(context.dbPath);
|
|
188
|
+
new FrameManager(db, project.id);
|
|
189
|
+
db.close();
|
|
190
|
+
console.log(chalk.green("\u2713 StackMemory initialized in worktree"));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
console.log(chalk.cyan("\nNext steps:"));
|
|
194
|
+
console.log(chalk.gray(` cd ${worktreePath}`));
|
|
195
|
+
if (!options.init && manager.isEnabled()) {
|
|
196
|
+
console.log(chalk.gray(" stackmemory init"));
|
|
197
|
+
}
|
|
198
|
+
console.log(chalk.gray(" # Start working in isolated context"));
|
|
199
|
+
} catch (error) {
|
|
200
|
+
if (error instanceof z.ZodError) {
|
|
201
|
+
console.error(chalk.red("Invalid input:"));
|
|
202
|
+
error.errors.forEach((err) => {
|
|
203
|
+
console.error(chalk.red(` ${err.path.join(".")}: ${err.message}`));
|
|
204
|
+
});
|
|
205
|
+
} else {
|
|
206
|
+
console.error(
|
|
207
|
+
chalk.red("Failed to create worktree:"),
|
|
208
|
+
error.message
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
process.exit(1);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
worktree.command("sync").description("Sync contexts between worktrees").option("-s, --source <branch>", "Source worktree branch").option("-t, --target <branch>", "Target worktree branch").option("--type <type>", "Sync type: push|pull|merge (default: merge)").action(async (options) => {
|
|
215
|
+
const manager = WorktreeManager.getInstance();
|
|
216
|
+
if (!manager.isEnabled()) {
|
|
217
|
+
console.log(chalk.yellow("Worktree support is not enabled"));
|
|
218
|
+
console.log(chalk.gray('Run "stackmemory worktree enable" first'));
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const worktrees = manager.detectWorktrees();
|
|
222
|
+
let source = worktrees.find((w) => w.branch === options.source);
|
|
223
|
+
let target = worktrees.find((w) => w.branch === options.target);
|
|
224
|
+
if (!source || !target) {
|
|
225
|
+
const inquirer = await import("inquirer");
|
|
226
|
+
if (!source) {
|
|
227
|
+
const { sourceBranch } = await inquirer.default.prompt([
|
|
228
|
+
{
|
|
229
|
+
type: "list",
|
|
230
|
+
name: "sourceBranch",
|
|
231
|
+
message: "Select source worktree:",
|
|
232
|
+
choices: worktrees.map((w) => ({
|
|
233
|
+
name: `${w.branch} (${w.path})`,
|
|
234
|
+
value: w
|
|
235
|
+
}))
|
|
236
|
+
}
|
|
237
|
+
]);
|
|
238
|
+
source = sourceBranch;
|
|
239
|
+
}
|
|
240
|
+
if (!target) {
|
|
241
|
+
const { targetBranch } = await inquirer.default.prompt([
|
|
242
|
+
{
|
|
243
|
+
type: "list",
|
|
244
|
+
name: "targetBranch",
|
|
245
|
+
message: "Select target worktree:",
|
|
246
|
+
choices: worktrees.filter((w) => w.path !== source.path).map((w) => ({
|
|
247
|
+
name: `${w.branch} (${w.path})`,
|
|
248
|
+
value: w
|
|
249
|
+
}))
|
|
250
|
+
}
|
|
251
|
+
]);
|
|
252
|
+
target = targetBranch;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
console.log(chalk.cyan("Syncing contexts:"));
|
|
256
|
+
console.log(chalk.gray(" Source:"), source.branch);
|
|
257
|
+
console.log(chalk.gray(" Target:"), target.branch);
|
|
258
|
+
console.log(chalk.gray(" Type:"), options.type || "merge");
|
|
259
|
+
try {
|
|
260
|
+
await manager.syncContexts(
|
|
261
|
+
source.path,
|
|
262
|
+
target.path,
|
|
263
|
+
options.type || "merge"
|
|
264
|
+
);
|
|
265
|
+
console.log(chalk.green("\u2713 Context sync completed"));
|
|
266
|
+
} catch (error) {
|
|
267
|
+
console.error(chalk.red("Sync failed:"), error.message);
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
worktree.command("cleanup").description("Clean up stale worktree contexts").option("--dry-run", "Show what would be cleaned without doing it").action((options) => {
|
|
272
|
+
const manager = WorktreeManager.getInstance();
|
|
273
|
+
if (options.dryRun) {
|
|
274
|
+
console.log(chalk.yellow("Dry run - no changes will be made"));
|
|
275
|
+
}
|
|
276
|
+
console.log(chalk.cyan("Checking for stale worktree contexts..."));
|
|
277
|
+
if (!options.dryRun) {
|
|
278
|
+
manager.cleanupStaleContexts();
|
|
279
|
+
console.log(chalk.green("\u2713 Cleanup completed"));
|
|
280
|
+
} else {
|
|
281
|
+
const active = manager.detectWorktrees();
|
|
282
|
+
const stored = manager.listActiveWorktrees();
|
|
283
|
+
const activePaths = new Set(active.map((w) => w.path));
|
|
284
|
+
const stale = stored.filter((w) => !activePaths.has(w.path));
|
|
285
|
+
if (stale.length === 0) {
|
|
286
|
+
console.log(chalk.green("No stale contexts found"));
|
|
287
|
+
} else {
|
|
288
|
+
console.log(chalk.yellow(`Found ${stale.length} stale context(s):`));
|
|
289
|
+
stale.forEach((w) => {
|
|
290
|
+
console.log(chalk.gray(` - ${w.branch} at ${w.path}`));
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
worktree.command("switch <branch>").description("Switch to a different worktree").action(async (branch) => {
|
|
296
|
+
const manager = WorktreeManager.getInstance();
|
|
297
|
+
const worktrees = manager.detectWorktrees();
|
|
298
|
+
const target = worktrees.find((w) => w.branch === branch);
|
|
299
|
+
if (!target) {
|
|
300
|
+
console.log(chalk.red(`Worktree '${branch}' not found`));
|
|
301
|
+
console.log(chalk.gray("\nAvailable worktrees:"));
|
|
302
|
+
worktrees.forEach((w) => {
|
|
303
|
+
console.log(chalk.gray(` - ${w.branch}`));
|
|
304
|
+
});
|
|
305
|
+
process.exit(1);
|
|
306
|
+
}
|
|
307
|
+
console.log(chalk.cyan(`Switching to worktree: ${branch}`));
|
|
308
|
+
console.log(chalk.gray(`Path: ${target.path}`));
|
|
309
|
+
console.log(chalk.gray("\nRun this command to switch:"));
|
|
310
|
+
console.log(chalk.green(` cd ${target.path}`));
|
|
311
|
+
if (manager.isEnabled() && !target.isMainWorktree) {
|
|
312
|
+
console.log(chalk.gray("\nThis worktree has an isolated context"));
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
export {
|
|
317
|
+
registerWorktreeCommands
|
|
318
|
+
};
|
|
319
|
+
//# sourceMappingURL=worktree.js.map
|