@stackmemoryai/stackmemory 0.2.9 → 0.3.0
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 +512 -0
- package/dist/agents/core/agent-task-manager.js.map +7 -0
- package/dist/agents/verifiers/base-verifier.js +129 -0
- package/dist/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/agents/verifiers/formatter-verifier.js +126 -0
- package/dist/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/agents/verifiers/llm-judge.js +248 -0
- package/dist/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/cli/__tests__/index.test.js +290 -0
- package/dist/cli/__tests__/index.test.js.map +7 -0
- package/dist/cli/auto-detect.js +317 -0
- package/dist/cli/auto-detect.js.map +7 -0
- package/dist/cli/browser-test.js +29 -0
- package/dist/cli/browser-test.js.map +7 -0
- package/dist/cli/claude-sm.js +369 -0
- package/dist/cli/claude-sm.js.map +7 -0
- package/dist/cli/codex-sm.js +283 -0
- package/dist/cli/codex-sm.js.map +7 -0
- package/dist/cli/commands/agent.js +286 -0
- package/dist/cli/commands/agent.js.map +7 -0
- package/dist/cli/commands/config.js +199 -0
- package/dist/cli/commands/config.js.map +7 -0
- package/dist/cli/commands/context.js +327 -0
- package/dist/cli/commands/context.js.map +7 -0
- package/dist/cli/commands/handoff.js +191 -0
- package/dist/cli/commands/handoff.js.map +7 -0
- package/dist/cli/commands/linear-test.js +115 -0
- package/dist/cli/commands/linear-test.js.map +7 -0
- package/dist/cli/commands/linear.js +378 -0
- package/dist/cli/commands/linear.js.map +7 -0
- package/dist/cli/commands/log.js +165 -0
- package/dist/cli/commands/log.js.map +7 -0
- package/dist/cli/commands/onboard.js +349 -0
- package/dist/cli/commands/onboard.js.map +7 -0
- package/dist/cli/commands/projects.js +195 -0
- package/dist/cli/commands/projects.js.map +7 -0
- package/dist/cli/commands/search.js +152 -0
- package/dist/cli/commands/search.js.map +7 -0
- package/dist/cli/commands/session.js +179 -0
- package/dist/cli/commands/session.js.map +7 -0
- package/dist/cli/commands/tasks.js +205 -0
- package/dist/cli/commands/tasks.js.map +7 -0
- package/dist/cli/commands/webhook.js +131 -0
- package/dist/cli/commands/webhook.js.map +7 -0
- package/dist/cli/commands/worktree.js +276 -0
- package/dist/cli/commands/worktree.js.map +7 -0
- package/dist/cli/index.js +953 -0
- package/dist/cli/index.js.map +7 -0
- package/dist/cli/utils/viewer.js +92 -0
- package/dist/cli/utils/viewer.js.map +7 -0
- package/dist/core/config/__tests__/config-manager.test.js +248 -0
- package/dist/core/config/__tests__/config-manager.test.js.map +7 -0
- package/dist/core/config/config-manager.js +368 -0
- package/dist/core/config/config-manager.js.map +7 -0
- package/dist/core/config/types.js +140 -0
- package/dist/core/config/types.js.map +7 -0
- package/dist/core/context/__tests__/frame-manager.test.js +879 -0
- package/dist/core/context/__tests__/frame-manager.test.js.map +7 -0
- package/dist/core/context/auto-context.js +72 -0
- package/dist/core/context/auto-context.js.map +7 -0
- package/dist/core/context/compaction-handler.js +326 -0
- package/dist/core/context/compaction-handler.js.map +7 -0
- package/dist/core/context/frame-database.js +376 -0
- package/dist/core/context/frame-database.js.map +7 -0
- package/dist/core/context/frame-digest.js +239 -0
- package/dist/core/context/frame-digest.js.map +7 -0
- package/dist/core/context/frame-manager.js +682 -0
- package/dist/core/context/frame-manager.js.map +7 -0
- package/dist/core/context/frame-stack.js +270 -0
- package/dist/core/context/frame-stack.js.map +7 -0
- package/dist/core/context/frame-types.js +1 -0
- package/dist/core/context/frame-types.js.map +7 -0
- package/dist/core/context/index.js +33 -0
- package/dist/core/context/index.js.map +7 -0
- package/dist/core/context/model-aware-compaction.js +619 -0
- package/dist/core/context/model-aware-compaction.js.map +7 -0
- package/dist/core/context/refactored-frame-manager.js +393 -0
- package/dist/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/core/database/batch-operations.js +329 -0
- package/dist/core/database/batch-operations.js.map +7 -0
- package/dist/core/database/connection-pool.js +224 -0
- package/dist/core/database/connection-pool.js.map +7 -0
- package/dist/core/database/query-cache.js +284 -0
- package/dist/core/database/query-cache.js.map +7 -0
- package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +379 -0
- package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +7 -0
- package/dist/core/digest/__tests__/frame-digest-integration.test.js +230 -0
- package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +7 -0
- package/dist/core/digest/enhanced-hybrid-digest.js +267 -0
- package/dist/core/digest/enhanced-hybrid-digest.js.map +7 -0
- package/dist/core/digest/frame-digest-integration.js +172 -0
- package/dist/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/core/digest/hybrid-digest-generator.js +549 -0
- package/dist/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/core/digest/index.js +5 -0
- package/dist/core/digest/index.js.map +7 -0
- package/dist/core/digest/types.js +21 -0
- package/dist/core/digest/types.js.map +7 -0
- package/dist/core/errors/__tests__/error-handling.test.js +270 -0
- package/dist/core/errors/__tests__/error-handling.test.js.map +7 -0
- package/dist/core/errors/index.js +239 -0
- package/dist/core/errors/index.js.map +7 -0
- package/dist/core/errors/recovery.js +258 -0
- package/dist/core/errors/recovery.js.map +7 -0
- package/dist/core/merge/__tests__/conflict-scenarios.test.js +414 -0
- package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +7 -0
- package/dist/core/merge/conflict-detector.js +424 -0
- package/dist/core/merge/conflict-detector.js.map +7 -0
- package/dist/core/merge/index.js +5 -0
- package/dist/core/merge/index.js.map +7 -0
- package/dist/core/merge/resolution-engine.js +565 -0
- package/dist/core/merge/resolution-engine.js.map +7 -0
- package/dist/core/merge/stack-diff.js +528 -0
- package/dist/core/merge/stack-diff.js.map +7 -0
- package/dist/core/merge/types.js +1 -0
- package/dist/core/merge/types.js.map +7 -0
- package/dist/core/monitoring/error-handler.js +278 -0
- package/dist/core/monitoring/error-handler.js.map +7 -0
- package/dist/core/monitoring/logger.js +115 -0
- package/dist/core/monitoring/logger.js.map +7 -0
- package/dist/core/monitoring/metrics.js +157 -0
- package/dist/core/monitoring/metrics.js.map +7 -0
- package/dist/core/monitoring/progress-tracker.js +174 -0
- package/dist/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/core/performance/context-cache.js +269 -0
- package/dist/core/performance/context-cache.js.map +7 -0
- package/dist/core/performance/index.js +7 -0
- package/dist/core/performance/index.js.map +7 -0
- package/dist/core/performance/lazy-context-loader.js +319 -0
- package/dist/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/core/performance/monitor.js +217 -0
- package/dist/core/performance/monitor.js.map +7 -0
- package/dist/core/performance/optimized-frame-context.js +326 -0
- package/dist/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/core/performance/performance-benchmark.js +269 -0
- package/dist/core/performance/performance-benchmark.js.map +7 -0
- package/dist/core/performance/performance-profiler.js +318 -0
- package/dist/core/performance/performance-profiler.js.map +7 -0
- package/dist/core/performance/streaming-jsonl-parser.js +187 -0
- package/dist/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/core/persistence/postgres-adapter.js +345 -0
- package/dist/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/core/projects/project-manager.js +699 -0
- package/dist/core/projects/project-manager.js.map +7 -0
- package/dist/core/query/__tests__/query-parser.test.js +301 -0
- package/dist/core/query/__tests__/query-parser.test.js.map +7 -0
- package/dist/core/query/__tests__/query-templates.test.js +210 -0
- package/dist/core/query/__tests__/query-templates.test.js.map +7 -0
- package/dist/core/query/query-parser.js +366 -0
- package/dist/core/query/query-parser.js.map +7 -0
- package/dist/core/query/query-templates.js +317 -0
- package/dist/core/query/query-templates.js.map +7 -0
- package/dist/core/retrieval/index.js +4 -0
- package/dist/core/retrieval/index.js.map +7 -0
- package/dist/core/retrieval/llm-context-retrieval.js +577 -0
- package/dist/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/core/retrieval/summary-generator.js +585 -0
- package/dist/core/retrieval/summary-generator.js.map +7 -0
- package/dist/core/retrieval/types.js +17 -0
- package/dist/core/retrieval/types.js.map +7 -0
- package/dist/core/session/index.js +11 -0
- package/dist/core/session/index.js.map +7 -0
- package/dist/core/session/session-manager.js +297 -0
- package/dist/core/session/session-manager.js.map +7 -0
- package/dist/core/trace/cli-trace-wrapper.js +110 -0
- package/dist/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/core/trace/db-trace-wrapper.js +215 -0
- package/dist/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/core/trace/debug-trace.js +385 -0
- package/dist/core/trace/debug-trace.js.map +7 -0
- package/dist/core/trace/index.js +158 -0
- package/dist/core/trace/index.js.map +7 -0
- package/dist/core/trace/linear-api-wrapper.js +169 -0
- package/dist/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/core/trace/trace-demo.js +135 -0
- package/dist/core/trace/trace-demo.js.map +7 -0
- package/dist/core/trace/trace-detector.demo.js +138 -0
- package/dist/core/trace/trace-detector.demo.js.map +7 -0
- package/dist/core/trace/trace-detector.js +386 -0
- package/dist/core/trace/trace-detector.js.map +7 -0
- package/dist/core/trace/trace-detector.test.js +401 -0
- package/dist/core/trace/trace-detector.test.js.map +7 -0
- package/dist/core/trace/trace-store.js +341 -0
- package/dist/core/trace/trace-store.js.map +7 -0
- package/dist/core/trace/types.js +73 -0
- package/dist/core/trace/types.js.map +7 -0
- package/dist/core/types.js +1 -0
- package/dist/core/types.js.map +7 -0
- package/dist/core/utils/update-checker.js +214 -0
- package/dist/core/utils/update-checker.js.map +7 -0
- package/dist/core/worktree/worktree-manager.js +450 -0
- package/dist/core/worktree/worktree-manager.js.map +7 -0
- package/dist/features/analytics/api/analytics-api.js +283 -0
- package/dist/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/features/analytics/core/analytics-service.js +267 -0
- package/dist/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/features/analytics/index.js +14 -0
- package/dist/features/analytics/index.js.map +7 -0
- package/dist/features/analytics/queries/metrics-queries.js +273 -0
- package/dist/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/features/analytics/types/metrics.js +1 -0
- package/dist/features/analytics/types/metrics.js.map +7 -0
- package/dist/features/browser/browser-mcp.js +488 -0
- package/dist/features/browser/browser-mcp.js.map +7 -0
- package/dist/features/tasks/__tests__/pebbles-task-store.test.js +747 -0
- package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +7 -0
- package/dist/features/tasks/pebbles-task-store.js +647 -0
- package/dist/features/tasks/pebbles-task-store.js.map +7 -0
- package/dist/features/tasks/task-aware-context.js +406 -0
- package/dist/features/tasks/task-aware-context.js.map +7 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +7 -0
- package/dist/integrations/linear/__tests__/auth.test.js +558 -0
- package/dist/integrations/linear/__tests__/auth.test.js.map +7 -0
- package/dist/integrations/linear/__tests__/sync-service.test.js +760 -0
- package/dist/integrations/linear/__tests__/sync-service.test.js.map +7 -0
- package/dist/integrations/linear/auth.js +308 -0
- package/dist/integrations/linear/auth.js.map +7 -0
- package/dist/integrations/linear/auto-sync.js +244 -0
- package/dist/integrations/linear/auto-sync.js.map +7 -0
- package/dist/integrations/linear/client.js +448 -0
- package/dist/integrations/linear/client.js.map +7 -0
- package/dist/integrations/linear/config.js +115 -0
- package/dist/integrations/linear/config.js.map +7 -0
- package/dist/integrations/linear/sync-manager.js +233 -0
- package/dist/integrations/linear/sync-manager.js.map +7 -0
- package/dist/integrations/linear/sync-service.js +214 -0
- package/dist/integrations/linear/sync-service.js.map +7 -0
- package/dist/integrations/linear/sync.js +565 -0
- package/dist/integrations/linear/sync.js.map +7 -0
- package/dist/integrations/linear/types.js +1 -0
- package/dist/integrations/linear/types.js.map +7 -0
- package/dist/integrations/linear/webhook-server.js +204 -0
- package/dist/integrations/linear/webhook-server.js.map +7 -0
- package/dist/integrations/linear/webhook.js +269 -0
- package/dist/integrations/linear/webhook.js.map +7 -0
- package/dist/integrations/mcp/__tests__/server.test.js +798 -0
- package/dist/integrations/mcp/__tests__/server.test.js.map +7 -0
- package/dist/integrations/mcp/handlers/context-handlers.js +253 -0
- package/dist/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/integrations/mcp/handlers/index.js +134 -0
- package/dist/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/integrations/mcp/handlers/linear-handlers.js +243 -0
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/integrations/mcp/handlers/task-handlers.js +235 -0
- package/dist/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/integrations/mcp/handlers/trace-handlers.js +304 -0
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/integrations/mcp/index.js +19 -0
- package/dist/integrations/mcp/index.js.map +7 -0
- package/dist/integrations/mcp/refactored-server.js +331 -0
- package/dist/integrations/mcp/refactored-server.js.map +7 -0
- package/dist/integrations/mcp/server.js +1621 -0
- package/dist/integrations/mcp/server.js.map +7 -0
- package/dist/integrations/mcp/tool-definitions.js +562 -0
- package/dist/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/integrations/mcp/trace-test.js +44 -0
- package/dist/integrations/mcp/trace-test.js.map +7 -0
- package/dist/integrations/pg-aiguide/embedding-provider.js +174 -0
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +7 -0
- package/dist/integrations/pg-aiguide/semantic-search.js +183 -0
- package/dist/integrations/pg-aiguide/semantic-search.js.map +7 -0
- package/dist/integrations/pg-aiguide/timescale-analytics.js +220 -0
- package/dist/integrations/pg-aiguide/timescale-analytics.js.map +7 -0
- package/dist/mcp/stackmemory-mcp-server.js +550 -0
- package/dist/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/middleware/exponential-rate-limiter.js +285 -0
- package/dist/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/models/user.model.js +351 -0
- package/dist/models/user.model.js.map +7 -0
- package/dist/scripts/benchmark-performance.d.ts +7 -0
- package/dist/scripts/benchmark-performance.d.ts.map +1 -0
- package/dist/scripts/benchmark-performance.js +44 -0
- package/dist/scripts/benchmark-performance.js.map +1 -0
- package/dist/scripts/cleanup-duplicate-tasks.d.ts +12 -0
- package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +1 -0
- package/dist/scripts/cleanup-duplicate-tasks.js +215 -0
- package/dist/scripts/cleanup-duplicate-tasks.js.map +1 -0
- package/dist/servers/production/auth-middleware.js +513 -0
- package/dist/servers/production/auth-middleware.js.map +7 -0
- package/dist/servers/railway/index.js +390 -0
- package/dist/servers/railway/index.js.map +7 -0
- package/dist/services/config-service.js +62 -0
- package/dist/services/config-service.js.map +7 -0
- package/dist/services/context-service.js +191 -0
- package/dist/services/context-service.js.map +7 -0
- package/dist/src/agents/core/agent-task-manager.d.ts +154 -0
- package/dist/src/agents/core/agent-task-manager.d.ts.map +1 -0
- package/dist/src/agents/core/agent-task-manager.js +504 -0
- package/dist/src/agents/core/agent-task-manager.js.map +1 -0
- package/dist/src/agents/verifiers/base-verifier.d.ts +112 -0
- package/dist/src/agents/verifiers/base-verifier.d.ts.map +1 -0
- package/dist/src/agents/verifiers/base-verifier.js +130 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +1 -0
- package/dist/src/agents/verifiers/formatter-verifier.d.ts +14 -0
- package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +1 -0
- package/dist/src/agents/verifiers/formatter-verifier.js +107 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +1 -0
- package/dist/src/agents/verifiers/llm-judge.d.ts +46 -0
- package/dist/src/agents/verifiers/llm-judge.d.ts.map +1 -0
- package/dist/src/agents/verifiers/llm-judge.js +248 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +1 -0
- package/dist/src/cli/claude-sm.js +55 -0
- package/dist/src/cli/claude-sm.js.map +1 -1
- package/dist/src/cli/commands/agent.d.ts +9 -0
- package/dist/src/cli/commands/agent.d.ts.map +1 -0
- package/dist/src/cli/commands/agent.js +303 -0
- package/dist/src/cli/commands/agent.js.map +1 -0
- package/dist/src/cli/commands/handoff.d.ts +6 -0
- package/dist/src/cli/commands/handoff.d.ts.map +1 -0
- package/dist/src/cli/commands/handoff.js +212 -0
- package/dist/src/cli/commands/handoff.js.map +1 -0
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +4 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/context/frame-database.d.ts +59 -0
- package/dist/src/core/context/frame-database.d.ts.map +1 -0
- package/dist/src/core/context/frame-database.js +333 -0
- package/dist/src/core/context/frame-database.js.map +1 -0
- package/dist/src/core/context/frame-digest.d.ts +59 -0
- package/dist/src/core/context/frame-digest.d.ts.map +1 -0
- package/dist/src/core/context/frame-digest.js +264 -0
- package/dist/src/core/context/frame-digest.js.map +1 -0
- package/dist/src/core/context/frame-manager.d.ts +2 -0
- package/dist/src/core/context/frame-manager.d.ts.map +1 -1
- package/dist/src/core/context/frame-manager.js +7 -0
- package/dist/src/core/context/frame-manager.js.map +1 -1
- package/dist/src/core/context/frame-stack.d.ts +85 -0
- package/dist/src/core/context/frame-stack.d.ts.map +1 -0
- package/dist/src/core/context/frame-stack.js +287 -0
- package/dist/src/core/context/frame-stack.js.map +1 -0
- package/dist/src/core/context/frame-types.d.ts +67 -0
- package/dist/src/core/context/frame-types.d.ts.map +1 -0
- package/dist/src/core/context/frame-types.js +6 -0
- package/dist/src/core/context/frame-types.js.map +1 -0
- package/dist/src/core/context/index.d.ts +11 -0
- package/dist/src/core/context/index.d.ts.map +1 -0
- package/dist/src/core/context/index.js +14 -0
- package/dist/src/core/context/index.js.map +1 -0
- package/dist/src/core/context/refactored-frame-manager.d.ts +99 -0
- package/dist/src/core/context/refactored-frame-manager.d.ts.map +1 -0
- package/dist/src/core/context/refactored-frame-manager.js +340 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +1 -0
- package/dist/src/core/database/batch-operations.d.ts +118 -0
- package/dist/src/core/database/batch-operations.d.ts.map +1 -0
- package/dist/src/core/database/batch-operations.js +339 -0
- package/dist/src/core/database/batch-operations.js.map +1 -0
- package/dist/src/core/database/connection-pool.d.ts +79 -0
- package/dist/src/core/database/connection-pool.d.ts.map +1 -0
- package/dist/src/core/database/connection-pool.js +236 -0
- package/dist/src/core/database/connection-pool.js.map +1 -0
- package/dist/src/core/database/query-cache.d.ts +135 -0
- package/dist/src/core/database/query-cache.d.ts.map +1 -0
- package/dist/src/core/database/query-cache.js +294 -0
- package/dist/src/core/database/query-cache.js.map +1 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +125 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +1 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js +282 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +1 -0
- package/dist/src/core/digest/frame-digest-integration.d.ts +67 -0
- package/dist/src/core/digest/frame-digest-integration.d.ts.map +1 -0
- package/dist/src/core/digest/frame-digest-integration.js +198 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +1 -0
- package/dist/src/core/digest/hybrid-digest-generator.d.ts +3 -3
- package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +1 -1
- package/dist/src/core/digest/hybrid-digest-generator.js.map +1 -1
- package/dist/src/core/digest/index.d.ts +3 -1
- package/dist/src/core/digest/index.d.ts.map +1 -1
- package/dist/src/core/digest/index.js +3 -1
- package/dist/src/core/digest/index.js.map +1 -1
- package/dist/src/core/errors/index.d.ts +13 -5
- package/dist/src/core/errors/index.d.ts.map +1 -1
- package/dist/src/core/errors/index.js +13 -5
- package/dist/src/core/errors/index.js.map +1 -1
- package/dist/src/core/merge/conflict-detector.d.ts +122 -0
- package/dist/src/core/merge/conflict-detector.d.ts.map +1 -0
- package/dist/src/core/merge/conflict-detector.js +468 -0
- package/dist/src/core/merge/conflict-detector.js.map +1 -0
- package/dist/src/core/merge/index.d.ts +9 -0
- package/dist/src/core/merge/index.d.ts.map +1 -0
- package/dist/src/core/merge/index.js +9 -0
- package/dist/src/core/merge/index.js.map +1 -0
- package/dist/src/core/merge/resolution-engine.d.ts +120 -0
- package/dist/src/core/merge/resolution-engine.d.ts.map +1 -0
- package/dist/src/core/merge/resolution-engine.js +573 -0
- package/dist/src/core/merge/resolution-engine.js.map +1 -0
- package/dist/src/core/merge/stack-diff.d.ts +97 -0
- package/dist/src/core/merge/stack-diff.d.ts.map +1 -0
- package/dist/src/core/merge/stack-diff.js +516 -0
- package/dist/src/core/merge/stack-diff.js.map +1 -0
- package/dist/src/core/merge/types.d.ts +110 -0
- package/dist/src/core/merge/types.d.ts.map +1 -0
- package/dist/src/core/merge/types.js +6 -0
- package/dist/src/core/merge/types.js.map +1 -0
- package/dist/src/core/performance/context-cache.d.ts +109 -0
- package/dist/src/core/performance/context-cache.d.ts.map +1 -0
- package/dist/src/core/performance/context-cache.js +280 -0
- package/dist/src/core/performance/context-cache.js.map +1 -0
- package/dist/src/core/performance/index.d.ts +3 -0
- package/dist/src/core/performance/index.d.ts.map +1 -0
- package/dist/src/core/performance/index.js +3 -0
- package/dist/src/core/performance/index.js.map +1 -0
- package/dist/src/core/performance/lazy-context-loader.d.ts +93 -0
- package/dist/src/core/performance/lazy-context-loader.d.ts.map +1 -0
- package/dist/src/core/performance/lazy-context-loader.js +332 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +1 -0
- package/dist/src/core/performance/monitor.d.ts +48 -0
- package/dist/src/core/performance/monitor.d.ts.map +1 -0
- package/dist/src/core/performance/monitor.js +226 -0
- package/dist/src/core/performance/monitor.js.map +1 -0
- package/dist/src/core/performance/optimized-frame-context.d.ts +74 -0
- package/dist/src/core/performance/optimized-frame-context.d.ts.map +1 -0
- package/dist/src/core/performance/optimized-frame-context.js +330 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +1 -0
- package/dist/src/core/performance/performance-benchmark.d.ts +50 -0
- package/dist/src/core/performance/performance-benchmark.d.ts.map +1 -0
- package/dist/src/core/performance/performance-benchmark.js +290 -0
- package/dist/src/core/performance/performance-benchmark.js.map +1 -0
- package/dist/src/core/performance/performance-profiler.d.ts +151 -0
- package/dist/src/core/performance/performance-profiler.d.ts.map +1 -0
- package/dist/src/core/performance/performance-profiler.js +346 -0
- package/dist/src/core/performance/performance-profiler.js.map +1 -0
- package/dist/src/core/performance/streaming-jsonl-parser.d.ts +41 -0
- package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +1 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js +193 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +1 -0
- package/dist/src/core/persistence/postgres-adapter.d.ts.map +1 -1
- package/dist/src/core/persistence/postgres-adapter.js +18 -4
- package/dist/src/core/persistence/postgres-adapter.js.map +1 -1
- package/dist/src/core/query/query-parser.d.ts +5 -0
- package/dist/src/core/query/query-parser.d.ts.map +1 -1
- package/dist/src/core/query/query-parser.js +86 -18
- package/dist/src/core/query/query-parser.js.map +1 -1
- package/dist/src/core/query/query-templates.d.ts +44 -0
- package/dist/src/core/query/query-templates.d.ts.map +1 -0
- package/dist/src/core/query/query-templates.js +326 -0
- package/dist/src/core/query/query-templates.js.map +1 -0
- package/dist/src/core/retrieval/llm-context-retrieval.d.ts +5 -3
- package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +1 -1
- package/dist/src/core/retrieval/llm-context-retrieval.js +73 -21
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +1 -1
- package/dist/src/core/trace/cli-trace-wrapper.d.ts +23 -0
- package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +1 -0
- package/dist/src/core/trace/cli-trace-wrapper.js +141 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +1 -0
- package/dist/src/core/trace/db-trace-wrapper.d.ts +36 -0
- package/dist/src/core/trace/db-trace-wrapper.d.ts.map +1 -0
- package/dist/src/core/trace/db-trace-wrapper.js +252 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +1 -0
- package/dist/src/core/trace/debug-trace.d.ts +84 -0
- package/dist/src/core/trace/debug-trace.d.ts.map +1 -0
- package/dist/src/core/trace/debug-trace.js +402 -0
- package/dist/src/core/trace/debug-trace.js.map +1 -0
- package/dist/src/core/trace/error-test.d.ts +6 -0
- package/dist/src/core/trace/error-test.d.ts.map +1 -0
- package/dist/src/core/trace/error-test.js +128 -0
- package/dist/src/core/trace/error-test.js.map +1 -0
- package/dist/src/core/trace/index.d.ts +25 -0
- package/dist/src/core/trace/index.d.ts.map +1 -0
- package/dist/src/core/trace/index.js +121 -0
- package/dist/src/core/trace/index.js.map +1 -0
- package/dist/src/core/trace/linear-api-wrapper.d.ts +17 -0
- package/dist/src/core/trace/linear-api-wrapper.d.ts.map +1 -0
- package/dist/src/core/trace/linear-api-wrapper.js +205 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +1 -0
- package/dist/src/core/trace/performance-test.d.ts +6 -0
- package/dist/src/core/trace/performance-test.d.ts.map +1 -0
- package/dist/src/core/trace/performance-test.js +111 -0
- package/dist/src/core/trace/performance-test.js.map +1 -0
- package/dist/src/core/trace/trace-demo.d.ts +8 -0
- package/dist/src/core/trace/trace-demo.d.ts.map +1 -0
- package/dist/src/core/trace/trace-demo.js +154 -0
- package/dist/src/core/trace/trace-demo.js.map +1 -0
- package/dist/src/core/trace/trace-detector.d.ts +2 -2
- package/dist/src/core/trace/trace-detector.d.ts.map +1 -1
- package/dist/src/core/trace/trace-detector.demo.js +1 -1
- package/dist/src/core/trace/trace-detector.demo.js.map +1 -1
- package/dist/src/core/trace/trace-detector.js +3 -3
- package/dist/src/core/trace/trace-detector.js.map +1 -1
- package/dist/src/features/tasks/pebbles-task-store.d.ts +9 -2
- package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -1
- package/dist/src/features/tasks/pebbles-task-store.js +97 -18
- package/dist/src/features/tasks/pebbles-task-store.js.map +1 -1
- package/dist/src/integrations/linear/auth.d.ts.map +1 -1
- package/dist/src/integrations/linear/auth.js.map +1 -1
- package/dist/src/integrations/linear/client.d.ts +15 -1
- package/dist/src/integrations/linear/client.d.ts.map +1 -1
- package/dist/src/integrations/linear/client.js +85 -3
- package/dist/src/integrations/linear/client.js.map +1 -1
- package/dist/src/integrations/linear/sync-manager.d.ts +2 -0
- package/dist/src/integrations/linear/sync-manager.d.ts.map +1 -1
- package/dist/src/integrations/linear/sync-manager.js +16 -4
- package/dist/src/integrations/linear/sync-manager.js.map +1 -1
- package/dist/src/integrations/linear/sync-service.d.ts +23 -2
- package/dist/src/integrations/linear/sync-service.d.ts.map +1 -1
- package/dist/src/integrations/linear/sync-service.js +44 -25
- package/dist/src/integrations/linear/sync-service.js.map +1 -1
- package/dist/src/integrations/linear/sync.d.ts +6 -0
- package/dist/src/integrations/linear/sync.d.ts.map +1 -1
- package/dist/src/integrations/linear/sync.js +27 -2
- package/dist/src/integrations/linear/sync.js.map +1 -1
- package/dist/src/integrations/linear/types.d.ts +16 -1
- package/dist/src/integrations/linear/types.d.ts.map +1 -1
- package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -1
- package/dist/src/integrations/linear/webhook-server.js +10 -8
- package/dist/src/integrations/linear/webhook-server.js.map +1 -1
- package/dist/src/integrations/linear/webhook.d.ts +13 -0
- package/dist/src/integrations/linear/webhook.d.ts.map +1 -1
- package/dist/src/integrations/linear/webhook.js +101 -14
- package/dist/src/integrations/linear/webhook.js.map +1 -1
- package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +39 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js +266 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +1 -0
- package/dist/src/integrations/mcp/handlers/index.d.ts +37 -0
- package/dist/src/integrations/mcp/handlers/index.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/index.js +134 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +1 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +33 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +251 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +1 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +42 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js +238 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +1 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +41 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +298 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +1 -0
- package/dist/src/integrations/mcp/index.d.ts +13 -0
- package/dist/src/integrations/mcp/index.d.ts.map +1 -0
- package/dist/src/integrations/mcp/index.js +17 -0
- package/dist/src/integrations/mcp/index.js.map +1 -0
- package/dist/src/integrations/mcp/refactored-server.d.ts +76 -0
- package/dist/src/integrations/mcp/refactored-server.d.ts.map +1 -0
- package/dist/src/integrations/mcp/refactored-server.js +351 -0
- package/dist/src/integrations/mcp/refactored-server.js.map +1 -0
- package/dist/src/integrations/mcp/tool-definitions.d.ts +44 -0
- package/dist/src/integrations/mcp/tool-definitions.d.ts.map +1 -0
- package/dist/src/integrations/mcp/tool-definitions.js +563 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +1 -0
- package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +1 -1
- package/dist/src/integrations/pg-aiguide/semantic-search.js +43 -21
- package/dist/src/integrations/pg-aiguide/semantic-search.js.map +1 -1
- package/dist/src/mcp/stackmemory-mcp-server.d.ts +9 -0
- package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +1 -0
- package/dist/src/mcp/stackmemory-mcp-server.js +519 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +1 -0
- package/dist/src/middleware/exponential-rate-limiter.d.ts +78 -0
- package/dist/src/middleware/exponential-rate-limiter.d.ts.map +1 -0
- package/dist/src/middleware/exponential-rate-limiter.js +293 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +1 -0
- package/dist/src/models/user.model.d.ts +8 -1
- package/dist/src/models/user.model.d.ts.map +1 -1
- package/dist/src/models/user.model.js +62 -14
- package/dist/src/models/user.model.js.map +1 -1
- package/dist/src/servers/production/auth-middleware.d.ts +5 -2
- package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
- package/dist/src/servers/production/auth-middleware.js +71 -34
- package/dist/src/servers/production/auth-middleware.js.map +1 -1
- package/dist/src/services/context-service.d.ts.map +1 -1
- package/dist/src/services/context-service.js +86 -1
- package/dist/src/services/context-service.js.map +1 -1
- package/dist/src/validation/schemas.d.ts +633 -0
- package/dist/src/validation/schemas.d.ts.map +1 -0
- package/dist/src/validation/schemas.js +347 -0
- package/dist/src/validation/schemas.js.map +1 -0
- package/dist/types/task.js +1 -0
- package/dist/types/task.js.map +7 -0
- package/dist/utils/logger.js +52 -0
- package/dist/utils/logger.js.map +7 -0
- package/dist/validation/schemas.js +218 -0
- package/dist/validation/schemas.js.map +7 -0
- package/package.json +7 -3
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import inquirer from "inquirer";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { homedir } from "os";
|
|
5
|
+
import { join } from "path";
|
|
6
|
+
import { existsSync, mkdirSync, writeFileSync } from "fs";
|
|
7
|
+
import { execSync } from "child_process";
|
|
8
|
+
import { WorktreeManager } from "../../core/worktree/worktree-manager.js";
|
|
9
|
+
import { ProjectManager } from "../../core/projects/project-manager.js";
|
|
10
|
+
import { logger } from "../../core/monitoring/logger.js";
|
|
11
|
+
function registerOnboardingCommand(program) {
|
|
12
|
+
program.command("onboard").alias("setup").description("Interactive setup for StackMemory").option("--reset", "Reset all configurations and start fresh").action(async (options) => {
|
|
13
|
+
console.log(chalk.cyan("\n\u{1F680} Welcome to StackMemory Setup!\n"));
|
|
14
|
+
const configPath = join(homedir(), ".stackmemory");
|
|
15
|
+
if (existsSync(configPath) && !options.reset) {
|
|
16
|
+
const { proceed } = await inquirer.prompt([
|
|
17
|
+
{
|
|
18
|
+
type: "confirm",
|
|
19
|
+
name: "proceed",
|
|
20
|
+
message: "StackMemory is already configured. Do you want to reconfigure?",
|
|
21
|
+
default: false
|
|
22
|
+
}
|
|
23
|
+
]);
|
|
24
|
+
if (!proceed) {
|
|
25
|
+
console.log(chalk.yellow("\nSetup cancelled."));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const config = await runOnboarding();
|
|
31
|
+
await applyConfiguration(config);
|
|
32
|
+
console.log(chalk.green("\n\u2705 StackMemory setup completed successfully!\n"));
|
|
33
|
+
showNextSteps(config);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
logger.error("Onboarding failed", error);
|
|
36
|
+
console.error(chalk.red("\n\u274C Setup failed:"), error.message);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async function runOnboarding() {
|
|
42
|
+
const { setupType } = await inquirer.prompt([
|
|
43
|
+
{
|
|
44
|
+
type: "list",
|
|
45
|
+
name: "setupType",
|
|
46
|
+
message: "Choose your setup type:",
|
|
47
|
+
choices: [
|
|
48
|
+
{ name: "Basic (Recommended for most users)", value: "basic" },
|
|
49
|
+
{ name: "Advanced (Full customization)", value: "advanced" }
|
|
50
|
+
],
|
|
51
|
+
default: "basic"
|
|
52
|
+
}
|
|
53
|
+
]);
|
|
54
|
+
let config = {
|
|
55
|
+
setupType,
|
|
56
|
+
enableWorktrees: false,
|
|
57
|
+
worktreeIsolation: true,
|
|
58
|
+
enableProjects: true,
|
|
59
|
+
scanProjects: false,
|
|
60
|
+
enableLinear: false,
|
|
61
|
+
enableAnalytics: true,
|
|
62
|
+
defaultContextPath: join(homedir(), ".stackmemory")
|
|
63
|
+
};
|
|
64
|
+
if (setupType === "basic") {
|
|
65
|
+
const basicAnswers = await inquirer.prompt([
|
|
66
|
+
{
|
|
67
|
+
type: "confirm",
|
|
68
|
+
name: "enableWorktrees",
|
|
69
|
+
message: "Enable Git worktree support? (Recommended for multi-branch workflows)",
|
|
70
|
+
default: false
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
type: "confirm",
|
|
74
|
+
name: "scanProjects",
|
|
75
|
+
message: "Scan and organize your existing projects?",
|
|
76
|
+
default: true
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: "confirm",
|
|
80
|
+
name: "enableLinear",
|
|
81
|
+
message: "Connect to Linear for task management?",
|
|
82
|
+
default: false
|
|
83
|
+
}
|
|
84
|
+
]);
|
|
85
|
+
config = { ...config, ...basicAnswers };
|
|
86
|
+
if (basicAnswers.enableLinear) {
|
|
87
|
+
const { linearApiKey } = await inquirer.prompt([
|
|
88
|
+
{
|
|
89
|
+
type: "password",
|
|
90
|
+
name: "linearApiKey",
|
|
91
|
+
message: "Enter your Linear API key:",
|
|
92
|
+
validate: (input) => input.length > 0 || "API key is required"
|
|
93
|
+
}
|
|
94
|
+
]);
|
|
95
|
+
config.linearApiKey = linearApiKey;
|
|
96
|
+
}
|
|
97
|
+
} else {
|
|
98
|
+
const advancedAnswers = await inquirer.prompt([
|
|
99
|
+
{
|
|
100
|
+
type: "confirm",
|
|
101
|
+
name: "enableWorktrees",
|
|
102
|
+
message: "Enable Git worktree support?",
|
|
103
|
+
default: false
|
|
104
|
+
}
|
|
105
|
+
]);
|
|
106
|
+
if (advancedAnswers.enableWorktrees) {
|
|
107
|
+
const worktreeAnswers = await inquirer.prompt([
|
|
108
|
+
{
|
|
109
|
+
type: "confirm",
|
|
110
|
+
name: "worktreeIsolation",
|
|
111
|
+
message: "Isolate contexts between worktrees? (Recommended)",
|
|
112
|
+
default: true
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: "confirm",
|
|
116
|
+
name: "autoDetect",
|
|
117
|
+
message: "Auto-detect worktrees when switching directories?",
|
|
118
|
+
default: true
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
type: "confirm",
|
|
122
|
+
name: "shareGlobal",
|
|
123
|
+
message: "Share global context across worktrees?",
|
|
124
|
+
default: false
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
type: "number",
|
|
128
|
+
name: "syncInterval",
|
|
129
|
+
message: "Context sync interval in minutes (0 to disable):",
|
|
130
|
+
default: 15,
|
|
131
|
+
validate: (input) => input >= 0 || "Must be 0 or positive"
|
|
132
|
+
}
|
|
133
|
+
]);
|
|
134
|
+
config = { ...config, ...advancedAnswers, ...worktreeAnswers };
|
|
135
|
+
}
|
|
136
|
+
const projectAnswers = await inquirer.prompt([
|
|
137
|
+
{
|
|
138
|
+
type: "confirm",
|
|
139
|
+
name: "enableProjects",
|
|
140
|
+
message: "Enable automatic project management?",
|
|
141
|
+
default: true
|
|
142
|
+
}
|
|
143
|
+
]);
|
|
144
|
+
if (projectAnswers.enableProjects) {
|
|
145
|
+
const projectDetailAnswers = await inquirer.prompt([
|
|
146
|
+
{
|
|
147
|
+
type: "confirm",
|
|
148
|
+
name: "scanProjects",
|
|
149
|
+
message: "Scan for existing projects now?",
|
|
150
|
+
default: true
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: "checkbox",
|
|
154
|
+
name: "scanPaths",
|
|
155
|
+
message: "Select directories to scan:",
|
|
156
|
+
choices: [
|
|
157
|
+
{ name: "~/Dev", value: join(homedir(), "Dev"), checked: true },
|
|
158
|
+
{ name: "~/dev", value: join(homedir(), "dev"), checked: true },
|
|
159
|
+
{ name: "~/Projects", value: join(homedir(), "Projects"), checked: true },
|
|
160
|
+
{ name: "~/projects", value: join(homedir(), "projects"), checked: true },
|
|
161
|
+
{ name: "~/Work", value: join(homedir(), "Work"), checked: false },
|
|
162
|
+
{ name: "~/code", value: join(homedir(), "code"), checked: true },
|
|
163
|
+
{ name: "~/Documents/GitHub", value: join(homedir(), "Documents/GitHub"), checked: false }
|
|
164
|
+
],
|
|
165
|
+
when: () => projectDetailAnswers.scanProjects
|
|
166
|
+
}
|
|
167
|
+
]);
|
|
168
|
+
config = { ...config, ...projectAnswers, ...projectDetailAnswers };
|
|
169
|
+
}
|
|
170
|
+
const integrationAnswers = await inquirer.prompt([
|
|
171
|
+
{
|
|
172
|
+
type: "confirm",
|
|
173
|
+
name: "enableLinear",
|
|
174
|
+
message: "Enable Linear integration?",
|
|
175
|
+
default: false
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
type: "password",
|
|
179
|
+
name: "linearApiKey",
|
|
180
|
+
message: "Linear API key:",
|
|
181
|
+
when: (answers) => answers.enableLinear,
|
|
182
|
+
validate: (input) => input.length > 0 || "API key is required"
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
type: "confirm",
|
|
186
|
+
name: "enableAnalytics",
|
|
187
|
+
message: "Enable usage analytics? (Local only)",
|
|
188
|
+
default: true
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
type: "input",
|
|
192
|
+
name: "defaultContextPath",
|
|
193
|
+
message: "Default context storage path:",
|
|
194
|
+
default: join(homedir(), ".stackmemory"),
|
|
195
|
+
validate: (input) => input.length > 0 || "Path is required"
|
|
196
|
+
}
|
|
197
|
+
]);
|
|
198
|
+
config = { ...config, ...integrationAnswers };
|
|
199
|
+
}
|
|
200
|
+
return config;
|
|
201
|
+
}
|
|
202
|
+
async function applyConfiguration(config) {
|
|
203
|
+
const configPath = join(homedir(), ".stackmemory");
|
|
204
|
+
console.log(chalk.gray("\nCreating directory structure..."));
|
|
205
|
+
const dirs = [
|
|
206
|
+
configPath,
|
|
207
|
+
join(configPath, "contexts"),
|
|
208
|
+
join(configPath, "projects"),
|
|
209
|
+
join(configPath, "worktrees"),
|
|
210
|
+
join(configPath, "bin"),
|
|
211
|
+
join(configPath, "logs"),
|
|
212
|
+
join(configPath, "analytics")
|
|
213
|
+
];
|
|
214
|
+
for (const dir of dirs) {
|
|
215
|
+
if (!existsSync(dir)) {
|
|
216
|
+
mkdirSync(dir, { recursive: true });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (config.enableWorktrees) {
|
|
220
|
+
console.log(chalk.gray("Configuring worktree support..."));
|
|
221
|
+
const worktreeManager = WorktreeManager.getInstance();
|
|
222
|
+
worktreeManager.saveConfig({
|
|
223
|
+
enabled: true,
|
|
224
|
+
autoDetect: true,
|
|
225
|
+
isolateContexts: config.worktreeIsolation,
|
|
226
|
+
shareGlobalContext: false,
|
|
227
|
+
syncInterval: 15
|
|
228
|
+
});
|
|
229
|
+
const worktrees = worktreeManager.detectWorktrees();
|
|
230
|
+
if (worktrees.length > 0) {
|
|
231
|
+
console.log(chalk.green(` \u2713 Found ${worktrees.length} worktree(s)`));
|
|
232
|
+
worktrees.forEach((wt) => {
|
|
233
|
+
console.log(chalk.gray(` - ${wt.branch} at ${wt.path}`));
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (config.enableProjects && config.scanProjects) {
|
|
238
|
+
console.log(chalk.gray("Scanning for projects..."));
|
|
239
|
+
const projectManager = ProjectManager.getInstance();
|
|
240
|
+
const scanPaths = config.scanPaths || [
|
|
241
|
+
join(homedir(), "Dev"),
|
|
242
|
+
join(homedir(), "dev"),
|
|
243
|
+
join(homedir(), "Projects"),
|
|
244
|
+
join(homedir(), "projects"),
|
|
245
|
+
join(homedir(), "code")
|
|
246
|
+
];
|
|
247
|
+
await projectManager.scanAndCategorizeAllProjects(
|
|
248
|
+
scanPaths.filter((p) => existsSync(p))
|
|
249
|
+
);
|
|
250
|
+
const projects = projectManager.getAllProjects();
|
|
251
|
+
console.log(chalk.green(` \u2713 Found ${projects.length} project(s)`));
|
|
252
|
+
const byType = {};
|
|
253
|
+
projects.forEach((p) => {
|
|
254
|
+
byType[p.accountType] = (byType[p.accountType] || 0) + 1;
|
|
255
|
+
});
|
|
256
|
+
Object.entries(byType).forEach(([type, count]) => {
|
|
257
|
+
console.log(chalk.gray(` - ${type}: ${count} project(s)`));
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
if (config.enableLinear && config.linearApiKey) {
|
|
261
|
+
console.log(chalk.gray("Configuring Linear integration..."));
|
|
262
|
+
const linearConfig = {
|
|
263
|
+
apiKey: config.linearApiKey,
|
|
264
|
+
autoSync: true,
|
|
265
|
+
syncInterval: 3e5
|
|
266
|
+
// 5 minutes
|
|
267
|
+
};
|
|
268
|
+
writeFileSync(
|
|
269
|
+
join(configPath, "linear-config.json"),
|
|
270
|
+
JSON.stringify(linearConfig, null, 2)
|
|
271
|
+
);
|
|
272
|
+
console.log(chalk.green(" \u2713 Linear configured"));
|
|
273
|
+
}
|
|
274
|
+
const mainConfig = {
|
|
275
|
+
version: "1.0.0",
|
|
276
|
+
setupCompleted: (/* @__PURE__ */ new Date()).toISOString(),
|
|
277
|
+
features: {
|
|
278
|
+
worktrees: config.enableWorktrees,
|
|
279
|
+
projects: config.enableProjects,
|
|
280
|
+
linear: config.enableLinear,
|
|
281
|
+
analytics: config.enableAnalytics
|
|
282
|
+
},
|
|
283
|
+
paths: {
|
|
284
|
+
default: config.defaultContextPath
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
writeFileSync(
|
|
288
|
+
join(configPath, "config.json"),
|
|
289
|
+
JSON.stringify(mainConfig, null, 2)
|
|
290
|
+
);
|
|
291
|
+
const binPath = "/usr/local/bin/claude-sm";
|
|
292
|
+
const sourcePath = join(configPath, "bin", "stackmemory");
|
|
293
|
+
try {
|
|
294
|
+
const wrapperScript = `#!/bin/bash
|
|
295
|
+
# StackMemory CLI wrapper with worktree support
|
|
296
|
+
CURRENT_DIR=$(pwd)
|
|
297
|
+
|
|
298
|
+
# Auto-detect worktree if enabled
|
|
299
|
+
if [ -f ~/.stackmemory/worktree-config.json ]; then
|
|
300
|
+
WORKTREE_ENABLED=$(grep '"enabled": true' ~/.stackmemory/worktree-config.json)
|
|
301
|
+
if [ ! -z "$WORKTREE_ENABLED" ]; then
|
|
302
|
+
# Check if we're in a git worktree
|
|
303
|
+
if git worktree list &>/dev/null; then
|
|
304
|
+
export SM_WORKTREE_PATH="$CURRENT_DIR"
|
|
305
|
+
fi
|
|
306
|
+
fi
|
|
307
|
+
fi
|
|
308
|
+
|
|
309
|
+
# Run StackMemory with context
|
|
310
|
+
exec stackmemory "$@"
|
|
311
|
+
`;
|
|
312
|
+
writeFileSync(sourcePath, wrapperScript);
|
|
313
|
+
execSync(`chmod +x ${sourcePath}`);
|
|
314
|
+
if (!existsSync(binPath)) {
|
|
315
|
+
execSync(`ln -s ${sourcePath} ${binPath}`);
|
|
316
|
+
console.log(chalk.green(" \u2713 Created claude-sm command"));
|
|
317
|
+
}
|
|
318
|
+
} catch (error) {
|
|
319
|
+
console.log(chalk.yellow(" \u26A0 Could not create claude-sm symlink (may need sudo)"));
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
function showNextSteps(config) {
|
|
323
|
+
console.log(chalk.cyan("\u{1F389} Next Steps:\n"));
|
|
324
|
+
console.log("1. Initialize StackMemory in your project:");
|
|
325
|
+
console.log(chalk.gray(" cd your-project"));
|
|
326
|
+
console.log(chalk.gray(" stackmemory init\n"));
|
|
327
|
+
if (config.enableWorktrees) {
|
|
328
|
+
console.log("2. Create a new worktree:");
|
|
329
|
+
console.log(chalk.gray(" git worktree add -b feature/new-feature ../project-feature"));
|
|
330
|
+
console.log(chalk.gray(" cd ../project-feature"));
|
|
331
|
+
console.log(chalk.gray(" stackmemory status # Isolated context for this worktree\n"));
|
|
332
|
+
}
|
|
333
|
+
console.log("3. Use with Claude:");
|
|
334
|
+
console.log(chalk.gray(" claude-sm # Or use stackmemory directly\n"));
|
|
335
|
+
if (config.enableLinear) {
|
|
336
|
+
console.log("4. Sync with Linear:");
|
|
337
|
+
console.log(chalk.gray(" stackmemory linear sync\n"));
|
|
338
|
+
}
|
|
339
|
+
console.log("For more help:");
|
|
340
|
+
console.log(chalk.gray(" stackmemory --help"));
|
|
341
|
+
console.log(chalk.gray(" stackmemory projects --help"));
|
|
342
|
+
if (config.enableWorktrees) {
|
|
343
|
+
console.log(chalk.gray(" stackmemory worktree --help"));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
export {
|
|
347
|
+
registerOnboardingCommand
|
|
348
|
+
};
|
|
349
|
+
//# sourceMappingURL=onboard.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/cli/commands/onboard.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n/**\n * StackMemory Onboarding CLI\n * Interactive setup for new StackMemory installations\n */\n\nimport { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { execSync } from 'child_process';\nimport { WorktreeManager } from '../../core/worktree/worktree-manager.js';\nimport { ProjectManager } from '../../core/projects/project-manager.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\ninterface OnboardingConfig {\n setupType: 'basic' | 'advanced';\n enableWorktrees: boolean;\n worktreeIsolation: boolean;\n enableProjects: boolean;\n scanProjects: boolean;\n enableLinear: boolean;\n linearApiKey?: string;\n enableAnalytics: boolean;\n defaultContextPath: string;\n}\n\nexport function registerOnboardingCommand(program: Command): void {\n program\n .command('onboard')\n .alias('setup')\n .description('Interactive setup for StackMemory')\n .option('--reset', 'Reset all configurations and start fresh')\n .action(async (options) => {\n console.log(chalk.cyan('\\n\uD83D\uDE80 Welcome to StackMemory Setup!\\n'));\n \n // Check if already configured\n const configPath = join(homedir(), '.stackmemory');\n if (existsSync(configPath) && !options.reset) {\n const { proceed } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'proceed',\n message: 'StackMemory is already configured. Do you want to reconfigure?',\n default: false,\n },\n ]);\n \n if (!proceed) {\n console.log(chalk.yellow('\\nSetup cancelled.'));\n return;\n }\n }\n\n try {\n const config = await runOnboarding();\n await applyConfiguration(config);\n \n console.log(chalk.green('\\n\u2705 StackMemory setup completed successfully!\\n'));\n showNextSteps(config);\n } catch (error) {\n logger.error('Onboarding failed', error as Error);\n console.error(chalk.red('\\n\u274C Setup failed:'), (error as Error).message);\n process.exit(1);\n }\n });\n}\n\nasync function runOnboarding(): Promise<OnboardingConfig> {\n // Basic or Advanced Setup\n const { setupType } = await inquirer.prompt([\n {\n type: 'list',\n name: 'setupType',\n message: 'Choose your setup type:',\n choices: [\n { name: 'Basic (Recommended for most users)', value: 'basic' },\n { name: 'Advanced (Full customization)', value: 'advanced' },\n ],\n default: 'basic',\n },\n ]);\n\n let config: OnboardingConfig = {\n setupType,\n enableWorktrees: false,\n worktreeIsolation: true,\n enableProjects: true,\n scanProjects: false,\n enableLinear: false,\n enableAnalytics: true,\n defaultContextPath: join(homedir(), '.stackmemory'),\n };\n\n if (setupType === 'basic') {\n // Basic setup with sensible defaults\n const basicAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enableWorktrees',\n message: 'Enable Git worktree support? (Recommended for multi-branch workflows)',\n default: false,\n },\n {\n type: 'confirm',\n name: 'scanProjects',\n message: 'Scan and organize your existing projects?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'enableLinear',\n message: 'Connect to Linear for task management?',\n default: false,\n },\n ]);\n\n config = { ...config, ...basicAnswers };\n\n if (basicAnswers.enableLinear) {\n const { linearApiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'linearApiKey',\n message: 'Enter your Linear API key:',\n validate: (input: string) => input.length > 0 || 'API key is required',\n },\n ]);\n config.linearApiKey = linearApiKey;\n }\n } else {\n // Advanced setup with all options\n const advancedAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enableWorktrees',\n message: 'Enable Git worktree support?',\n default: false,\n },\n ]);\n\n if (advancedAnswers.enableWorktrees) {\n const worktreeAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'worktreeIsolation',\n message: 'Isolate contexts between worktrees? (Recommended)',\n default: true,\n },\n {\n type: 'confirm',\n name: 'autoDetect',\n message: 'Auto-detect worktrees when switching directories?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'shareGlobal',\n message: 'Share global context across worktrees?',\n default: false,\n },\n {\n type: 'number',\n name: 'syncInterval',\n message: 'Context sync interval in minutes (0 to disable):',\n default: 15,\n validate: (input: number) => input >= 0 || 'Must be 0 or positive',\n },\n ]);\n\n config = { ...config, ...advancedAnswers, ...worktreeAnswers };\n }\n\n const projectAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enableProjects',\n message: 'Enable automatic project management?',\n default: true,\n },\n ]);\n\n if (projectAnswers.enableProjects) {\n const projectDetailAnswers: any = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'scanProjects',\n message: 'Scan for existing projects now?',\n default: true,\n },\n {\n type: 'checkbox',\n name: 'scanPaths',\n message: 'Select directories to scan:',\n choices: [\n { name: '~/Dev', value: join(homedir(), 'Dev'), checked: true },\n { name: '~/dev', value: join(homedir(), 'dev'), checked: true },\n { name: '~/Projects', value: join(homedir(), 'Projects'), checked: true },\n { name: '~/projects', value: join(homedir(), 'projects'), checked: true },\n { name: '~/Work', value: join(homedir(), 'Work'), checked: false },\n { name: '~/code', value: join(homedir(), 'code'), checked: true },\n { name: '~/Documents/GitHub', value: join(homedir(), 'Documents/GitHub'), checked: false },\n ],\n when: (): boolean => projectDetailAnswers.scanProjects,\n },\n ]);\n\n config = { ...config, ...projectAnswers, ...projectDetailAnswers };\n }\n\n const integrationAnswers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enableLinear',\n message: 'Enable Linear integration?',\n default: false,\n },\n {\n type: 'password',\n name: 'linearApiKey',\n message: 'Linear API key:',\n when: (answers: any) => answers.enableLinear,\n validate: (input: string) => input.length > 0 || 'API key is required',\n },\n {\n type: 'confirm',\n name: 'enableAnalytics',\n message: 'Enable usage analytics? (Local only)',\n default: true,\n },\n {\n type: 'input',\n name: 'defaultContextPath',\n message: 'Default context storage path:',\n default: join(homedir(), '.stackmemory'),\n validate: (input: string) => input.length > 0 || 'Path is required',\n },\n ]);\n\n config = { ...config, ...integrationAnswers };\n }\n\n return config;\n}\n\nasync function applyConfiguration(config: OnboardingConfig): Promise<void> {\n const configPath = join(homedir(), '.stackmemory');\n \n // Create base directory structure\n console.log(chalk.gray('\\nCreating directory structure...'));\n const dirs = [\n configPath,\n join(configPath, 'contexts'),\n join(configPath, 'projects'),\n join(configPath, 'worktrees'),\n join(configPath, 'bin'),\n join(configPath, 'logs'),\n join(configPath, 'analytics'),\n ];\n\n for (const dir of dirs) {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n // Configure git worktree support\n if (config.enableWorktrees) {\n console.log(chalk.gray('Configuring worktree support...'));\n const worktreeManager = WorktreeManager.getInstance();\n worktreeManager.saveConfig({\n enabled: true,\n autoDetect: true,\n isolateContexts: config.worktreeIsolation,\n shareGlobalContext: false,\n syncInterval: 15,\n });\n\n // Detect current worktrees\n const worktrees = worktreeManager.detectWorktrees();\n if (worktrees.length > 0) {\n console.log(chalk.green(` \u2713 Found ${worktrees.length} worktree(s)`));\n worktrees.forEach(wt => {\n console.log(chalk.gray(` - ${wt.branch} at ${wt.path}`));\n });\n }\n }\n\n // Scan and organize projects\n if (config.enableProjects && config.scanProjects) {\n console.log(chalk.gray('Scanning for projects...'));\n const projectManager = ProjectManager.getInstance();\n \n const scanPaths = (config as any).scanPaths || [\n join(homedir(), 'Dev'),\n join(homedir(), 'dev'),\n join(homedir(), 'Projects'),\n join(homedir(), 'projects'),\n join(homedir(), 'code'),\n ];\n \n await projectManager.scanAndCategorizeAllProjects(\n scanPaths.filter((p: string) => existsSync(p))\n );\n \n const projects = projectManager.getAllProjects();\n console.log(chalk.green(` \u2713 Found ${projects.length} project(s)`));\n \n // Show summary\n const byType: Record<string, number> = {};\n projects.forEach(p => {\n byType[p.accountType] = (byType[p.accountType] || 0) + 1;\n });\n \n Object.entries(byType).forEach(([type, count]) => {\n console.log(chalk.gray(` - ${type}: ${count} project(s)`));\n });\n }\n\n // Configure Linear integration\n if (config.enableLinear && config.linearApiKey) {\n console.log(chalk.gray('Configuring Linear integration...'));\n const linearConfig = {\n apiKey: config.linearApiKey,\n autoSync: true,\n syncInterval: 300000, // 5 minutes\n };\n \n writeFileSync(\n join(configPath, 'linear-config.json'),\n JSON.stringify(linearConfig, null, 2)\n );\n console.log(chalk.green(' \u2713 Linear configured'));\n }\n\n // Save main configuration\n const mainConfig = {\n version: '1.0.0',\n setupCompleted: new Date().toISOString(),\n features: {\n worktrees: config.enableWorktrees,\n projects: config.enableProjects,\n linear: config.enableLinear,\n analytics: config.enableAnalytics,\n },\n paths: {\n default: config.defaultContextPath,\n },\n };\n\n writeFileSync(\n join(configPath, 'config.json'),\n JSON.stringify(mainConfig, null, 2)\n );\n\n // Create claude-sm symlink for easy access\n const binPath = '/usr/local/bin/claude-sm';\n const sourcePath = join(configPath, 'bin', 'stackmemory');\n \n try {\n // Create wrapper script\n const wrapperScript = `#!/bin/bash\n# StackMemory CLI wrapper with worktree support\nCURRENT_DIR=$(pwd)\n\n# Auto-detect worktree if enabled\nif [ -f ~/.stackmemory/worktree-config.json ]; then\n WORKTREE_ENABLED=$(grep '\"enabled\": true' ~/.stackmemory/worktree-config.json)\n if [ ! -z \"$WORKTREE_ENABLED\" ]; then\n # Check if we're in a git worktree\n if git worktree list &>/dev/null; then\n export SM_WORKTREE_PATH=\"$CURRENT_DIR\"\n fi\n fi\nfi\n\n# Run StackMemory with context\nexec stackmemory \"$@\"\n`;\n\n writeFileSync(sourcePath, wrapperScript);\n execSync(`chmod +x ${sourcePath}`);\n\n // Create symlink if it doesn't exist\n if (!existsSync(binPath)) {\n execSync(`ln -s ${sourcePath} ${binPath}`);\n console.log(chalk.green(' \u2713 Created claude-sm command'));\n }\n } catch (error) {\n console.log(chalk.yellow(' \u26A0 Could not create claude-sm symlink (may need sudo)'));\n }\n}\n\nfunction showNextSteps(config: OnboardingConfig): void {\n console.log(chalk.cyan('\uD83C\uDF89 Next Steps:\\n'));\n\n console.log('1. Initialize StackMemory in your project:');\n console.log(chalk.gray(' cd your-project'));\n console.log(chalk.gray(' stackmemory init\\n'));\n\n if (config.enableWorktrees) {\n console.log('2. Create a new worktree:');\n console.log(chalk.gray(' git worktree add -b feature/new-feature ../project-feature'));\n console.log(chalk.gray(' cd ../project-feature'));\n console.log(chalk.gray(' stackmemory status # Isolated context for this worktree\\n'));\n }\n\n console.log('3. Use with Claude:');\n console.log(chalk.gray(' claude-sm # Or use stackmemory directly\\n'));\n\n if (config.enableLinear) {\n console.log('4. Sync with Linear:');\n console.log(chalk.gray(' stackmemory linear sync\\n'));\n }\n\n console.log('For more help:');\n console.log(chalk.gray(' stackmemory --help'));\n console.log(chalk.gray(' stackmemory projects --help'));\n if (config.enableWorktrees) {\n console.log(chalk.gray(' stackmemory worktree --help'));\n }\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { ProjectManager } from "../../core/projects/project-manager.js";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import Table from "cli-table3";
|
|
5
|
+
function registerProjectCommands(program) {
|
|
6
|
+
const projects = program.command("projects").description("Manage multi-project organization");
|
|
7
|
+
projects.command("detect").description("Auto-detect current project").action(async () => {
|
|
8
|
+
const manager = ProjectManager.getInstance();
|
|
9
|
+
const project = await manager.detectProject();
|
|
10
|
+
console.log(chalk.green("\u2713 Project detected:"));
|
|
11
|
+
console.log(chalk.cyan(" Name:"), project.name);
|
|
12
|
+
console.log(
|
|
13
|
+
chalk.cyan(" Organization:"),
|
|
14
|
+
project.organization || "none"
|
|
15
|
+
);
|
|
16
|
+
console.log(chalk.cyan(" Account Type:"), project.accountType);
|
|
17
|
+
console.log(chalk.cyan(" Private:"), project.isPrivate ? "Yes" : "No");
|
|
18
|
+
console.log(
|
|
19
|
+
chalk.cyan(" Language:"),
|
|
20
|
+
project.primaryLanguage || "unknown"
|
|
21
|
+
);
|
|
22
|
+
console.log(chalk.cyan(" Framework:"), project.framework || "unknown");
|
|
23
|
+
console.log(chalk.cyan(" ID:"), project.id);
|
|
24
|
+
});
|
|
25
|
+
projects.command("scan").description("Scan and auto-categorize all Git projects").option("-p, --paths <paths...>", "Custom paths to scan").action(async (options) => {
|
|
26
|
+
const manager = ProjectManager.getInstance();
|
|
27
|
+
console.log(chalk.yellow("\u{1F50D} Scanning for Git repositories..."));
|
|
28
|
+
await manager.scanAndCategorizeAllProjects(options.paths);
|
|
29
|
+
const allProjects = manager.getAllProjects();
|
|
30
|
+
console.log(chalk.green(`\u2713 Found ${allProjects.length} projects`));
|
|
31
|
+
const byType = {};
|
|
32
|
+
const byOrg = {};
|
|
33
|
+
for (const project of allProjects) {
|
|
34
|
+
byType[project.accountType] = (byType[project.accountType] || 0) + 1;
|
|
35
|
+
if (project.organization) {
|
|
36
|
+
byOrg[project.organization] = (byOrg[project.organization] || 0) + 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
console.log("\n\u{1F4CA} Summary by Account Type:");
|
|
40
|
+
for (const [type, count] of Object.entries(byType)) {
|
|
41
|
+
console.log(` ${type}: ${count} projects`);
|
|
42
|
+
}
|
|
43
|
+
console.log("\n\u{1F3E2} Top Organizations:");
|
|
44
|
+
const topOrgs = Object.entries(byOrg).sort((a, b) => b[1] - a[1]).slice(0, 5);
|
|
45
|
+
for (const [org, count] of topOrgs) {
|
|
46
|
+
console.log(` ${org}: ${count} projects`);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
projects.command("list").description("List all discovered projects").option(
|
|
50
|
+
"-t, --type <type>",
|
|
51
|
+
"Filter by account type (personal/work/opensource/client)"
|
|
52
|
+
).option("-o, --org <org>", "Filter by organization").option("-l, --language <lang>", "Filter by language").action((options) => {
|
|
53
|
+
const manager = ProjectManager.getInstance();
|
|
54
|
+
let projectList = manager.getAllProjects();
|
|
55
|
+
if (options.type) {
|
|
56
|
+
projectList = projectList.filter((p) => p.accountType === options.type);
|
|
57
|
+
}
|
|
58
|
+
if (options.org) {
|
|
59
|
+
projectList = projectList.filter((p) => p.organization === options.org);
|
|
60
|
+
}
|
|
61
|
+
if (options.language) {
|
|
62
|
+
projectList = projectList.filter(
|
|
63
|
+
(p) => p.primaryLanguage?.toLowerCase().includes(options.language.toLowerCase())
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
if (projectList.length === 0) {
|
|
67
|
+
console.log(chalk.yellow("No projects found matching criteria"));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const table = new Table({
|
|
71
|
+
head: [
|
|
72
|
+
"Name",
|
|
73
|
+
"Organization",
|
|
74
|
+
"Type",
|
|
75
|
+
"Language",
|
|
76
|
+
"Framework",
|
|
77
|
+
"Last Accessed"
|
|
78
|
+
],
|
|
79
|
+
style: { head: ["cyan"] }
|
|
80
|
+
});
|
|
81
|
+
for (const project of projectList.slice(0, 20)) {
|
|
82
|
+
table.push([
|
|
83
|
+
project.name,
|
|
84
|
+
project.organization || "-",
|
|
85
|
+
project.accountType,
|
|
86
|
+
project.primaryLanguage || "-",
|
|
87
|
+
project.framework || "-",
|
|
88
|
+
new Date(project.lastAccessed).toLocaleDateString()
|
|
89
|
+
]);
|
|
90
|
+
}
|
|
91
|
+
console.log(table.toString());
|
|
92
|
+
if (projectList.length > 20) {
|
|
93
|
+
console.log(
|
|
94
|
+
chalk.gray(`
|
|
95
|
+
... and ${projectList.length - 20} more projects`)
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
projects.command("orgs").description("List all detected organizations").action(() => {
|
|
100
|
+
const manager = ProjectManager.getInstance();
|
|
101
|
+
const allProjects = manager.getAllProjects();
|
|
102
|
+
const orgMap = {};
|
|
103
|
+
for (const project of allProjects) {
|
|
104
|
+
if (project.organization) {
|
|
105
|
+
if (!orgMap[project.organization]) {
|
|
106
|
+
orgMap[project.organization] = { count: 0, types: /* @__PURE__ */ new Set() };
|
|
107
|
+
}
|
|
108
|
+
orgMap[project.organization].count++;
|
|
109
|
+
orgMap[project.organization].types.add(project.accountType);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const table = new Table({
|
|
113
|
+
head: ["Organization", "Projects", "Account Types"],
|
|
114
|
+
style: { head: ["cyan"] }
|
|
115
|
+
});
|
|
116
|
+
const sorted = Object.entries(orgMap).sort(
|
|
117
|
+
(a, b) => b[1].count - a[1].count
|
|
118
|
+
);
|
|
119
|
+
for (const [org, data] of sorted) {
|
|
120
|
+
table.push([
|
|
121
|
+
org,
|
|
122
|
+
data.count.toString(),
|
|
123
|
+
Array.from(data.types).join(", ")
|
|
124
|
+
]);
|
|
125
|
+
}
|
|
126
|
+
console.log(table.toString());
|
|
127
|
+
});
|
|
128
|
+
projects.command("config-org <name>").description("Configure an organization").option(
|
|
129
|
+
"-t, --type <type>",
|
|
130
|
+
"Organization type (company/personal/opensource/client)"
|
|
131
|
+
).option(
|
|
132
|
+
"-a, --account <account>",
|
|
133
|
+
"Account type (personal/work/opensource/client)"
|
|
134
|
+
).option("-d, --domain <domain>", "Add domain pattern").action((name, options) => {
|
|
135
|
+
const manager = ProjectManager.getInstance();
|
|
136
|
+
manager.saveOrganization({
|
|
137
|
+
name,
|
|
138
|
+
type: options.type || "company",
|
|
139
|
+
accountType: options.account || "work",
|
|
140
|
+
domains: options.domain ? [options.domain] : [],
|
|
141
|
+
githubOrgs: [name],
|
|
142
|
+
autoPatterns: []
|
|
143
|
+
});
|
|
144
|
+
console.log(chalk.green(`\u2713 Organization '${name}' configured`));
|
|
145
|
+
});
|
|
146
|
+
projects.command("report").description("Generate project statistics report").action(() => {
|
|
147
|
+
const manager = ProjectManager.getInstance();
|
|
148
|
+
const report = manager.generateReport();
|
|
149
|
+
console.log(chalk.cyan("\n\u{1F4CA} Project Statistics:\n"));
|
|
150
|
+
console.log(report);
|
|
151
|
+
});
|
|
152
|
+
projects.command("switch <path>").description("Switch to a different project context").action(async (projectPath) => {
|
|
153
|
+
const manager = ProjectManager.getInstance();
|
|
154
|
+
const project = await manager.detectProject(projectPath);
|
|
155
|
+
console.log(chalk.green(`\u2713 Switched to project: ${project.name}`));
|
|
156
|
+
console.log(
|
|
157
|
+
chalk.cyan(` Organization: ${project.organization || "none"}`)
|
|
158
|
+
);
|
|
159
|
+
console.log(chalk.cyan(` Account Type: ${project.accountType}`));
|
|
160
|
+
});
|
|
161
|
+
projects.command("organize").description("Auto-organize projects into accounts").action(async () => {
|
|
162
|
+
const manager = ProjectManager.getInstance();
|
|
163
|
+
console.log(chalk.yellow("\u{1F504} Auto-organizing projects..."));
|
|
164
|
+
await manager.scanAndCategorizeAllProjects();
|
|
165
|
+
const allProjects = manager.getAllProjects();
|
|
166
|
+
const organized = {
|
|
167
|
+
personal: [],
|
|
168
|
+
work: [],
|
|
169
|
+
opensource: [],
|
|
170
|
+
client: []
|
|
171
|
+
};
|
|
172
|
+
for (const project of allProjects) {
|
|
173
|
+
organized[project.accountType]?.push(project.name);
|
|
174
|
+
}
|
|
175
|
+
console.log(chalk.green("\n\u2713 Projects organized by account type:\n"));
|
|
176
|
+
for (const [type, projects2] of Object.entries(organized)) {
|
|
177
|
+
if (projects2.length > 0) {
|
|
178
|
+
console.log(
|
|
179
|
+
chalk.cyan(`${type.toUpperCase()} (${projects2.length} projects):`)
|
|
180
|
+
);
|
|
181
|
+
for (const proj of projects2.slice(0, 5)) {
|
|
182
|
+
console.log(` - ${proj}`);
|
|
183
|
+
}
|
|
184
|
+
if (projects2.length > 5) {
|
|
185
|
+
console.log(chalk.gray(` ... and ${projects2.length - 5} more`));
|
|
186
|
+
}
|
|
187
|
+
console.log();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
export {
|
|
193
|
+
registerProjectCommands
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/cli/commands/projects.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n/**\n * Project Management CLI Commands\n * Auto-manages multi-project across GitHub orgs\n */\n\nimport { Command } from 'commander';\nimport { ProjectManager } from '../../core/projects/project-manager.js';\nimport chalk from 'chalk';\n// @ts-ignore - No types available for cli-table3\nimport Table from 'cli-table3';\n\nexport function registerProjectCommands(program: Command): void {\n const projects = program\n .command('projects')\n .description('Manage multi-project organization');\n\n // Auto-detect current project\n projects\n .command('detect')\n .description('Auto-detect current project')\n .action(async () => {\n const manager = ProjectManager.getInstance();\n const project = await manager.detectProject();\n\n console.log(chalk.green('\u2713 Project detected:'));\n console.log(chalk.cyan(' Name:'), project.name);\n console.log(\n chalk.cyan(' Organization:'),\n project.organization || 'none'\n );\n console.log(chalk.cyan(' Account Type:'), project.accountType);\n console.log(chalk.cyan(' Private:'), project.isPrivate ? 'Yes' : 'No');\n console.log(\n chalk.cyan(' Language:'),\n project.primaryLanguage || 'unknown'\n );\n console.log(chalk.cyan(' Framework:'), project.framework || 'unknown');\n console.log(chalk.cyan(' ID:'), project.id);\n });\n\n // Scan all projects\n projects\n .command('scan')\n .description('Scan and auto-categorize all Git projects')\n .option('-p, --paths <paths...>', 'Custom paths to scan')\n .action(async (options) => {\n const manager = ProjectManager.getInstance();\n\n console.log(chalk.yellow('\uD83D\uDD0D Scanning for Git repositories...'));\n await manager.scanAndCategorizeAllProjects(options.paths);\n\n const allProjects = manager.getAllProjects();\n console.log(chalk.green(`\u2713 Found ${allProjects.length} projects`));\n\n // Show summary\n const byType: Record<string, number> = {};\n const byOrg: Record<string, number> = {};\n\n for (const project of allProjects) {\n byType[project.accountType] = (byType[project.accountType] || 0) + 1;\n if (project.organization) {\n byOrg[project.organization] = (byOrg[project.organization] || 0) + 1;\n }\n }\n\n console.log('\\n\uD83D\uDCCA Summary by Account Type:');\n for (const [type, count] of Object.entries(byType)) {\n console.log(` ${type}: ${count} projects`);\n }\n\n console.log('\\n\uD83C\uDFE2 Top Organizations:');\n const topOrgs = Object.entries(byOrg)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n for (const [org, count] of topOrgs) {\n console.log(` ${org}: ${count} projects`);\n }\n });\n\n // List all projects\n projects\n .command('list')\n .description('List all discovered projects')\n .option(\n '-t, --type <type>',\n 'Filter by account type (personal/work/opensource/client)'\n )\n .option('-o, --org <org>', 'Filter by organization')\n .option('-l, --language <lang>', 'Filter by language')\n .action((options) => {\n const manager = ProjectManager.getInstance();\n let projectList = manager.getAllProjects();\n\n // Apply filters\n if (options.type) {\n projectList = projectList.filter((p) => p.accountType === options.type);\n }\n if (options.org) {\n projectList = projectList.filter((p) => p.organization === options.org);\n }\n if (options.language) {\n projectList = projectList.filter((p) =>\n p.primaryLanguage\n ?.toLowerCase()\n .includes(options.language.toLowerCase())\n );\n }\n\n if (projectList.length === 0) {\n console.log(chalk.yellow('No projects found matching criteria'));\n return;\n }\n\n // Create table\n const table = new Table({\n head: [\n 'Name',\n 'Organization',\n 'Type',\n 'Language',\n 'Framework',\n 'Last Accessed',\n ],\n style: { head: ['cyan'] },\n });\n\n for (const project of projectList.slice(0, 20)) {\n table.push([\n project.name,\n project.organization || '-',\n project.accountType,\n project.primaryLanguage || '-',\n project.framework || '-',\n new Date(project.lastAccessed).toLocaleDateString(),\n ]);\n }\n\n console.log(table.toString());\n\n if (projectList.length > 20) {\n console.log(\n chalk.gray(`\\n... and ${projectList.length - 20} more projects`)\n );\n }\n });\n\n // Show organizations\n projects\n .command('orgs')\n .description('List all detected organizations')\n .action(() => {\n const manager = ProjectManager.getInstance();\n const allProjects = manager.getAllProjects();\n\n const orgMap: Record<string, { count: number; types: Set<string> }> = {};\n\n for (const project of allProjects) {\n if (project.organization) {\n if (!orgMap[project.organization]) {\n orgMap[project.organization] = { count: 0, types: new Set() };\n }\n orgMap[project.organization]!.count++;\n orgMap[project.organization]!.types.add(project.accountType);\n }\n }\n\n const table = new Table({\n head: ['Organization', 'Projects', 'Account Types'],\n style: { head: ['cyan'] },\n });\n\n const sorted = Object.entries(orgMap).sort(\n (a, b) => b[1].count - a[1].count\n );\n\n for (const [org, data] of sorted) {\n table.push([\n org,\n data.count.toString(),\n Array.from(data.types).join(', '),\n ]);\n }\n\n console.log(table.toString());\n });\n\n // Configure organization\n projects\n .command('config-org <name>')\n .description('Configure an organization')\n .option(\n '-t, --type <type>',\n 'Organization type (company/personal/opensource/client)'\n )\n .option(\n '-a, --account <account>',\n 'Account type (personal/work/opensource/client)'\n )\n .option('-d, --domain <domain>', 'Add domain pattern')\n .action((name, options) => {\n const manager = ProjectManager.getInstance();\n\n manager.saveOrganization({\n name,\n type: options.type || 'company',\n accountType: options.account || 'work',\n domains: options.domain ? [options.domain] : [],\n githubOrgs: [name],\n autoPatterns: [],\n });\n\n console.log(chalk.green(`\u2713 Organization '${name}' configured`));\n });\n\n // Show project report\n projects\n .command('report')\n .description('Generate project statistics report')\n .action(() => {\n const manager = ProjectManager.getInstance();\n const report = manager.generateReport();\n\n console.log(chalk.cyan('\\n\uD83D\uDCCA Project Statistics:\\n'));\n console.log(report);\n });\n\n // Switch context based on project\n projects\n .command('switch <path>')\n .description('Switch to a different project context')\n .action(async (projectPath) => {\n const manager = ProjectManager.getInstance();\n const project = await manager.detectProject(projectPath);\n\n console.log(chalk.green(`\u2713 Switched to project: ${project.name}`));\n console.log(\n chalk.cyan(` Organization: ${project.organization || 'none'}`)\n );\n console.log(chalk.cyan(` Account Type: ${project.accountType}`));\n });\n\n // Auto-organize projects by patterns\n projects\n .command('organize')\n .description('Auto-organize projects into accounts')\n .action(async () => {\n const manager = ProjectManager.getInstance();\n\n console.log(chalk.yellow('\uD83D\uDD04 Auto-organizing projects...'));\n\n // First scan\n await manager.scanAndCategorizeAllProjects();\n\n const allProjects = manager.getAllProjects();\n const organized: Record<string, string[]> = {\n personal: [],\n work: [],\n opensource: [],\n client: [],\n };\n\n for (const project of allProjects) {\n organized[project.accountType]?.push(project.name);\n }\n\n console.log(chalk.green('\\n\u2713 Projects organized by account type:\\n'));\n\n for (const [type, projects] of Object.entries(organized)) {\n if (projects.length > 0) {\n console.log(\n chalk.cyan(`${type.toUpperCase()} (${projects.length} projects):`)\n );\n for (const proj of projects.slice(0, 5)) {\n console.log(` - ${proj}`);\n }\n if (projects.length > 5) {\n console.log(chalk.gray(` ... and ${projects.length - 5} more`));\n }\n console.log();\n }\n }\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["projects"]
|
|
7
|
+
}
|