@stackmemoryai/stackmemory 0.2.9 → 0.3.1
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 +312 -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 +10 -3
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/cli/commands/agent.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Agent command - Integrates Spotify's background coding agent strategies\n * with StackMemory's task system\n *\n * Usage: stackmemory agent <action> [options]\n */\n\nimport { Command } from 'commander';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { PebblesTaskStore } from '../../features/tasks/pebbles-task-store.js';\nimport { FrameManager } from '../../core/context/frame-manager.js';\nimport {\n AgentTaskManager,\n AgentTaskSession,\n} from '../../agents/core/agent-task-manager.js';\nimport { FormatterVerifier } from '../../agents/verifiers/formatter-verifier.js';\nimport { LLMJudge } from '../../agents/verifiers/llm-judge.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport function createAgentCommand(): Command {\n const agent = new Command('agent')\n .description('AI agent task execution with Spotify-inspired strategies')\n .option('-p, --project <path>', 'Project root directory', process.cwd());\n\n agent\n .command('execute <taskId>')\n .description('Execute a task with agent assistance')\n .option('-f, --frame <frameId>', 'Frame ID to use')\n .option('--max-turns <number>', 'Maximum turns per session', '10')\n .option('--no-verify', 'Skip verification loops')\n .action(async (taskId: string, options) => {\n const spinner = ora('Initializing agent...').start();\n\n try {\n const { taskManager, session } = await initializeAgent(\n options.project,\n taskId,\n options.frame,\n parseInt(options.maxTurns)\n );\n\n spinner.succeed('Agent initialized');\n\n // Display session info\n console.log(chalk.cyan('\\n\uD83D\uDCCB Task Session Started'));\n console.log(chalk.gray(' Session ID:'), session.id);\n console.log(chalk.gray(' Task ID:'), session.taskId);\n console.log(chalk.gray(' Max Turns:'), session.maxTurns);\n console.log(\n chalk.gray(' Verification:'),\n options.verify ? 'Enabled' : 'Disabled'\n );\n\n // Execute task with feedback loop\n await executeTaskWithFeedback(taskManager, session, options.verify);\n } catch (error) {\n spinner.fail('Agent execution failed');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n agent\n .command('status')\n .description('Show active agent sessions')\n .action(async (options) => {\n const spinner = ora('Loading sessions...').start();\n\n try {\n const projectRoot = options.parent?.project || process.cwd();\n const { taskManager } = await initializeAgentManager(projectRoot);\n\n const sessions = taskManager.getActiveSessions();\n spinner.stop();\n\n if (sessions.length === 0) {\n console.log(chalk.yellow('No active agent sessions'));\n return;\n }\n\n console.log(chalk.cyan('\\n\uD83E\uDD16 Active Agent Sessions\\n'));\n\n for (const session of sessions) {\n console.log(chalk.bold(`Session: ${session.sessionId}`));\n console.log(chalk.gray(' Task:'), session.taskId);\n console.log(\n chalk.gray(' Status:'),\n getStatusColor(session.status)(session.status)\n );\n console.log(chalk.gray(' Turn:'), `${session.turnCount}/10`);\n console.log(\n chalk.gray(' Started:'),\n session.startedAt.toLocaleString()\n );\n console.log('');\n }\n } catch (error) {\n spinner.fail('Failed to load sessions');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n agent\n .command('retry <sessionId>')\n .description('Retry a failed session with learned context')\n .action(async (sessionId: string, options) => {\n const spinner = ora('Retrying session...').start();\n\n try {\n const projectRoot = options.parent?.project || process.cwd();\n const { taskManager } = await initializeAgentManager(projectRoot);\n\n const newSession = await taskManager.retrySession(sessionId);\n\n if (!newSession) {\n spinner.fail(\n 'Cannot retry session (max retries reached or session active)'\n );\n return;\n }\n\n spinner.succeed('Session retry started');\n console.log(chalk.cyan('\\n\u267B\uFE0F Retry Session Started'));\n console.log(chalk.gray(' New Session ID:'), newSession.id);\n console.log(chalk.gray(' Task ID:'), newSession.taskId);\n\n // Execute with feedback\n await executeTaskWithFeedback(taskManager, newSession, true);\n } catch (error) {\n spinner.fail('Retry failed');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n agent\n .command('breakdown <taskId>')\n .description('Break down a complex task into subtasks')\n .action(async (taskId: string, options) => {\n const spinner = ora('Analyzing task complexity...').start();\n\n try {\n const projectRoot = options.parent?.project || process.cwd();\n const db = await openDatabase(projectRoot);\n const taskStore = new PebblesTaskStore(projectRoot, db);\n\n const task = taskStore.getTask(taskId);\n if (!task) {\n spinner.fail(`Task ${taskId} not found`);\n return;\n }\n\n spinner.text = 'Breaking down task...';\n\n // Simulate task breakdown (in production, would use LLM)\n const subtasks = generateTaskBreakdown(\n task.title,\n task.description || ''\n );\n\n spinner.succeed('Task breakdown complete');\n\n console.log(chalk.cyan(`\\n\uD83D\uDCCA Task Breakdown: ${task.title}\\n`));\n\n subtasks.forEach((subtask, index) => {\n console.log(chalk.bold(`${index + 1}. ${subtask.title}`));\n console.log(chalk.gray(' Description:'), subtask.description);\n console.log(\n chalk.gray(' Estimated turns:'),\n subtask.estimatedTurns\n );\n console.log(\n chalk.gray(' Verifiers:'),\n subtask.verifiers.join(', ')\n );\n console.log('');\n });\n\n console.log(\n chalk.yellow('Total estimated turns:'),\n subtasks.reduce((sum, st) => sum + st.estimatedTurns, 0)\n );\n } catch (error) {\n spinner.fail('Breakdown failed');\n console.error(\n chalk.red('Error:'),\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n return agent;\n}\n\n/**\n * Initialize agent and start task session\n */\nasync function initializeAgent(\n projectRoot: string,\n taskId: string,\n frameId?: string,\n maxTurns = 10\n): Promise<{\n taskManager: AgentTaskManager;\n session: AgentTaskSession;\n}> {\n const { taskManager, frameManager, taskStore } =\n await initializeAgentManager(projectRoot);\n\n // Create or get frame\n const finalFrameId =\n frameId ||\n frameManager.createFrame({\n type: 'task',\n name: `Agent task execution for ${taskId}`,\n inputs: { taskId, agentSession: true },\n });\n\n // Start session\n const session = await taskManager.startTaskSession(taskId, finalFrameId);\n\n // Override max turns if specified\n if (maxTurns !== 10) {\n session.maxTurns = maxTurns;\n }\n\n return { taskManager, session };\n}\n\n/**\n * Initialize agent manager components\n */\nasync function initializeAgentManager(projectRoot: string): Promise<{\n taskManager: AgentTaskManager;\n frameManager: FrameManager;\n taskStore: PebblesTaskStore;\n}> {\n const db = await openDatabase(projectRoot);\n const taskStore = new PebblesTaskStore(projectRoot, db);\n const frameManager = new FrameManager(db, projectRoot, undefined);\n const taskManager = new AgentTaskManager(taskStore, frameManager);\n\n return { taskManager, frameManager, taskStore };\n}\n\n/**\n * Execute task with feedback loop (Spotify pattern)\n */\nasync function executeTaskWithFeedback(\n taskManager: AgentTaskManager,\n session: AgentTaskSession,\n enableVerification: boolean\n): Promise<void> {\n console.log(chalk.cyan('\\n\uD83D\uDD04 Starting execution loop...\\n'));\n\n let turnCount = 0;\n let shouldContinue = true;\n let lastFeedback = '';\n\n while (shouldContinue && turnCount < session.maxTurns) {\n turnCount++;\n\n console.log(chalk.bold(`\\n\u2550\u2550\u2550 Turn ${turnCount}/${session.maxTurns} \u2550\u2550\u2550`));\n\n // Simulate agent action (in production, would use actual AI)\n const action = generateMockAction(turnCount, lastFeedback);\n console.log(chalk.gray('Action:'), action.substring(0, 100) + '...');\n\n // Execute turn with verification\n const spinner = ora('Executing...').start();\n\n const result = await taskManager.executeTurn(session.id, action, {\n codeChange: turnCount > 1,\n testsPresent: turnCount > 2,\n enableVerification,\n });\n\n if (result.success) {\n spinner.succeed('Turn completed successfully');\n } else {\n spinner.warn('Turn completed with issues');\n }\n\n // Display feedback\n console.log(chalk.yellow('\\n\uD83D\uDCDD Feedback:'));\n console.log(result.feedback);\n\n // Display verification results if any\n if (result.verificationResults.length > 0) {\n console.log(chalk.cyan('\\n\u2713 Verification Results:'));\n for (const vr of result.verificationResults) {\n const icon = vr.passed ? '\u2713' : '\u2717';\n const color = vr.passed ? chalk.green : chalk.red;\n console.log(color(` ${icon} ${vr.verifierId}: ${vr.message}`));\n }\n }\n\n shouldContinue = result.shouldContinue;\n lastFeedback = result.feedback;\n\n // Short delay for readability\n await delay(1000);\n }\n\n // Final status\n console.log(chalk.cyan('\\n\u2550\u2550\u2550 Session Complete \u2550\u2550\u2550\\n'));\n console.log(chalk.gray('Total turns:'), turnCount);\n console.log(chalk.gray('Final status:'), session.status);\n}\n\n/**\n * Generate mock action for demonstration\n */\nfunction generateMockAction(turn: number, previousFeedback: string): string {\n const actions = [\n 'Analyzing task requirements and constraints',\n 'Setting up project structure and dependencies',\n 'Implementing core functionality',\n 'Adding error handling and validation',\n 'Writing unit tests',\n 'Refactoring for better code organization',\n 'Adding documentation and comments',\n 'Running final verification checks',\n 'Optimizing performance',\n 'Completing final cleanup',\n ];\n\n if (previousFeedback.includes('error')) {\n return `Fixing issues: ${previousFeedback.substring(0, 50)}...`;\n }\n\n return actions[Math.min(turn - 1, actions.length - 1)];\n}\n\n/**\n * Generate task breakdown for complex tasks\n */\nfunction generateTaskBreakdown(\n title: string,\n description: string\n): Array<{\n title: string;\n description: string;\n estimatedTurns: number;\n verifiers: string[];\n}> {\n // Simple heuristic breakdown (in production, would use LLM)\n return [\n {\n title: `Analyze and plan: ${title}`,\n description: 'Understand requirements and create implementation plan',\n estimatedTurns: 2,\n verifiers: ['semantic-validator'],\n },\n {\n title: `Implement core: ${title}`,\n description: 'Build main functionality',\n estimatedTurns: 4,\n verifiers: ['formatter', 'linter', 'semantic-validator'],\n },\n {\n title: `Test and validate: ${title}`,\n description: 'Add tests and validate implementation',\n estimatedTurns: 3,\n verifiers: ['test-runner', 'semantic-validator'],\n },\n {\n title: `Polish and document: ${title}`,\n description: 'Final improvements and documentation',\n estimatedTurns: 1,\n verifiers: ['formatter', 'linter'],\n },\n ];\n}\n\n/**\n * Open or create database\n */\nasync function openDatabase(projectRoot: string): Promise<Database.Database> {\n const dbPath = join(projectRoot, '.stackmemory', 'cache.db');\n\n if (!existsSync(join(projectRoot, '.stackmemory'))) {\n throw new Error(\n 'StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n }\n\n return new Database(dbPath);\n}\n\n/**\n * Get color function for status\n */\nfunction getStatusColor(status: string): (text: string) => string {\n switch (status) {\n case 'active':\n return chalk.green;\n case 'completed':\n return chalk.blue;\n case 'failed':\n return chalk.red;\n case 'timeout':\n return chalk.yellow;\n default:\n return chalk.gray;\n }\n}\n\n/**\n * Delay helper\n */\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import * as yaml from "js-yaml";
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
import { ConfigManager } from "../../core/config/config-manager.js";
|
|
7
|
+
import { DEFAULT_CONFIG } from "../../core/config/types.js";
|
|
8
|
+
function createConfigCommand() {
|
|
9
|
+
const config = new Command("config").description(
|
|
10
|
+
"Manage StackMemory configuration"
|
|
11
|
+
);
|
|
12
|
+
config.command("validate").description("Validate configuration file").option(
|
|
13
|
+
"-f, --file <path>",
|
|
14
|
+
"Path to config file",
|
|
15
|
+
".stackmemory/config.yaml"
|
|
16
|
+
).option("--fix", "Attempt to auto-fix common issues").action(async (options) => {
|
|
17
|
+
console.log(chalk.blue("\u{1F50D} Validating configuration..."));
|
|
18
|
+
const configPath = path.resolve(options.file);
|
|
19
|
+
const manager = new ConfigManager(configPath);
|
|
20
|
+
const result = manager.validate();
|
|
21
|
+
if (result.errors.length > 0) {
|
|
22
|
+
console.log(chalk.red("\n\u2717 Errors:"));
|
|
23
|
+
result.errors.forEach((error) => {
|
|
24
|
+
console.log(chalk.red(` \u2022 ${error}`));
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (result.warnings.length > 0) {
|
|
28
|
+
console.log(chalk.yellow("\n\u26A0 Warnings:"));
|
|
29
|
+
result.warnings.forEach((warning) => {
|
|
30
|
+
console.log(chalk.yellow(` \u2022 ${warning}`));
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (result.suggestions.length > 0) {
|
|
34
|
+
console.log(chalk.cyan("\n\u{1F4A1} Suggestions:"));
|
|
35
|
+
result.suggestions.forEach((suggestion) => {
|
|
36
|
+
console.log(chalk.cyan(` \u2022 ${suggestion}`));
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (options.fix && result.errors.length > 0) {
|
|
40
|
+
console.log(chalk.blue("\n\u{1F527} Attempting auto-fix..."));
|
|
41
|
+
const config2 = manager.getConfig();
|
|
42
|
+
const weights = config2.scoring.weights;
|
|
43
|
+
const weightSum = weights.base + weights.impact + weights.persistence + weights.reference;
|
|
44
|
+
if (Math.abs(weightSum - 1) > 1e-3) {
|
|
45
|
+
const factor = 1 / weightSum;
|
|
46
|
+
manager.updateWeights({
|
|
47
|
+
base: weights.base * factor,
|
|
48
|
+
impact: weights.impact * factor,
|
|
49
|
+
persistence: weights.persistence * factor,
|
|
50
|
+
reference: weights.reference * factor
|
|
51
|
+
});
|
|
52
|
+
manager.save();
|
|
53
|
+
console.log(chalk.green(" \u2713 Normalized weights to sum to 1.0"));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (result.valid) {
|
|
57
|
+
console.log(chalk.green("\n\u2705 Configuration is valid"));
|
|
58
|
+
process.exit(0);
|
|
59
|
+
} else {
|
|
60
|
+
console.log(chalk.red("\n\u274C Configuration has errors"));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
config.command("init").description("Initialize configuration file with defaults").option("-p, --profile <name>", "Use a preset profile", "default").option("-f, --force", "Overwrite existing config").action(async (options) => {
|
|
65
|
+
const configPath = path.join(
|
|
66
|
+
process.cwd(),
|
|
67
|
+
".stackmemory",
|
|
68
|
+
"config.yaml"
|
|
69
|
+
);
|
|
70
|
+
if (fs.existsSync(configPath) && !options.force) {
|
|
71
|
+
console.log(
|
|
72
|
+
chalk.yellow(
|
|
73
|
+
"\u26A0 Config file already exists. Use --force to overwrite."
|
|
74
|
+
)
|
|
75
|
+
);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
const dir = path.dirname(configPath);
|
|
79
|
+
if (!fs.existsSync(dir)) {
|
|
80
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
81
|
+
}
|
|
82
|
+
const config2 = { ...DEFAULT_CONFIG };
|
|
83
|
+
if (options.profile && options.profile !== "default") {
|
|
84
|
+
config2.profile = options.profile;
|
|
85
|
+
}
|
|
86
|
+
const content = yaml.dump(config2, {
|
|
87
|
+
indent: 2,
|
|
88
|
+
lineWidth: 120,
|
|
89
|
+
noRefs: true
|
|
90
|
+
});
|
|
91
|
+
fs.writeFileSync(configPath, content, "utf-8");
|
|
92
|
+
console.log(chalk.green(`\u2705 Created config file at ${configPath}`));
|
|
93
|
+
if (options.profile !== "default") {
|
|
94
|
+
console.log(chalk.cyan(`\u{1F4CB} Using profile: ${options.profile}`));
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
config.command("show").description("Show current configuration").option("-p, --profile <name>", "Show specific profile").action(async (options) => {
|
|
98
|
+
const manager = new ConfigManager();
|
|
99
|
+
const config2 = manager.getConfig();
|
|
100
|
+
if (options.profile) {
|
|
101
|
+
const profiles = manager.getProfiles();
|
|
102
|
+
const profile = profiles[options.profile];
|
|
103
|
+
if (!profile) {
|
|
104
|
+
console.log(chalk.red(`\u274C Profile '${options.profile}' not found`));
|
|
105
|
+
console.log(chalk.cyan("Available profiles:"));
|
|
106
|
+
Object.keys(profiles).forEach((name) => {
|
|
107
|
+
console.log(` \u2022 ${name}`);
|
|
108
|
+
});
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
console.log(chalk.blue(`
|
|
112
|
+
\u{1F4CB} Profile: ${profile.name}`));
|
|
113
|
+
if (profile.description) {
|
|
114
|
+
console.log(chalk.gray(` ${profile.description}`));
|
|
115
|
+
}
|
|
116
|
+
console.log("\n" + yaml.dump(profile, { indent: 2 }));
|
|
117
|
+
} else {
|
|
118
|
+
console.log(chalk.blue("\n\u{1F4CB} Current Configuration:"));
|
|
119
|
+
if (config2.profile) {
|
|
120
|
+
console.log(chalk.cyan(` Active Profile: ${config2.profile}`));
|
|
121
|
+
}
|
|
122
|
+
console.log("\n" + yaml.dump(config2, { indent: 2 }));
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
config.command("set-profile <name>").description("Set active profile").action(async (name) => {
|
|
126
|
+
const manager = new ConfigManager();
|
|
127
|
+
if (manager.setProfile(name)) {
|
|
128
|
+
manager.save();
|
|
129
|
+
console.log(chalk.green(`\u2705 Active profile set to: ${name}`));
|
|
130
|
+
} else {
|
|
131
|
+
console.log(chalk.red(`\u274C Profile '${name}' not found`));
|
|
132
|
+
console.log(chalk.cyan("Available profiles:"));
|
|
133
|
+
Object.keys(manager.getProfiles()).forEach((profile) => {
|
|
134
|
+
console.log(` \u2022 ${profile}`);
|
|
135
|
+
});
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
config.command("list-profiles").description("List available profiles").action(async () => {
|
|
140
|
+
const manager = new ConfigManager();
|
|
141
|
+
const profiles = manager.getProfiles();
|
|
142
|
+
const currentProfile = manager.getConfig().profile;
|
|
143
|
+
console.log(chalk.blue("\n\u{1F4CB} Available Profiles:"));
|
|
144
|
+
Object.entries(profiles).forEach(([name, profile]) => {
|
|
145
|
+
const marker = name === currentProfile ? chalk.green(" \u2713") : "";
|
|
146
|
+
console.log(` \u2022 ${chalk.cyan(name)}${marker}`);
|
|
147
|
+
if (profile.description) {
|
|
148
|
+
console.log(chalk.gray(` ${profile.description}`));
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
config.command("test-score <tool>").description("Test importance scoring for a tool").option("-f, --files <number>", "Number of files affected", parseInt).option("-p, --permanent", "Is change permanent").option("-r, --references <number>", "Reference count", parseInt).action(async (tool, options) => {
|
|
153
|
+
const manager = new ConfigManager();
|
|
154
|
+
const score = manager.calculateScore(tool, {
|
|
155
|
+
filesAffected: options.files,
|
|
156
|
+
isPermanent: options.permanent,
|
|
157
|
+
referenceCount: options.references
|
|
158
|
+
});
|
|
159
|
+
const config2 = manager.getConfig();
|
|
160
|
+
const baseScore = config2.scoring.tool_scores[tool] || 0.5;
|
|
161
|
+
console.log(chalk.blue("\n\u{1F4CA} Score Calculation:"));
|
|
162
|
+
console.log(` Tool: ${chalk.cyan(tool)}`);
|
|
163
|
+
console.log(` Base Score: ${chalk.yellow(baseScore.toFixed(3))}`);
|
|
164
|
+
if (options.files !== void 0) {
|
|
165
|
+
console.log(` Files Affected: ${options.files}`);
|
|
166
|
+
}
|
|
167
|
+
if (options.permanent) {
|
|
168
|
+
console.log(` Permanent: ${chalk.green("Yes")}`);
|
|
169
|
+
}
|
|
170
|
+
if (options.references !== void 0) {
|
|
171
|
+
console.log(` References: ${options.references}`);
|
|
172
|
+
}
|
|
173
|
+
console.log(chalk.blue("\n Weights:"));
|
|
174
|
+
console.log(` Base: ${config2.scoring.weights.base}`);
|
|
175
|
+
console.log(` Impact: ${config2.scoring.weights.impact}`);
|
|
176
|
+
console.log(` Persistence: ${config2.scoring.weights.persistence}`);
|
|
177
|
+
console.log(` Reference: ${config2.scoring.weights.reference}`);
|
|
178
|
+
console.log(chalk.green(`
|
|
179
|
+
Final Score: ${score.toFixed(3)}`));
|
|
180
|
+
let level = "Low";
|
|
181
|
+
let color = chalk.gray;
|
|
182
|
+
if (score >= 0.8) {
|
|
183
|
+
level = "Critical";
|
|
184
|
+
color = chalk.red;
|
|
185
|
+
} else if (score >= 0.6) {
|
|
186
|
+
level = "High";
|
|
187
|
+
color = chalk.yellow;
|
|
188
|
+
} else if (score >= 0.4) {
|
|
189
|
+
level = "Medium";
|
|
190
|
+
color = chalk.cyan;
|
|
191
|
+
}
|
|
192
|
+
console.log(` Importance: ${color(level)}`);
|
|
193
|
+
});
|
|
194
|
+
return config;
|
|
195
|
+
}
|
|
196
|
+
export {
|
|
197
|
+
createConfigCommand
|
|
198
|
+
};
|
|
199
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/cli/commands/config.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Config command for StackMemory CLI\n */\n\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport chalk from 'chalk';\nimport { ConfigManager } from '../../core/config/config-manager.js';\nimport { DEFAULT_CONFIG, PRESET_PROFILES } from '../../core/config/types.js';\n\nexport function createConfigCommand(): Command {\n const config = new Command('config').description(\n 'Manage StackMemory configuration'\n );\n\n config\n .command('validate')\n .description('Validate configuration file')\n .option(\n '-f, --file <path>',\n 'Path to config file',\n '.stackmemory/config.yaml'\n )\n .option('--fix', 'Attempt to auto-fix common issues')\n .action(async (options) => {\n console.log(chalk.blue('\uD83D\uDD0D Validating configuration...'));\n\n const configPath = path.resolve(options.file);\n const manager = new ConfigManager(configPath);\n const result = manager.validate();\n\n // Display errors\n if (result.errors.length > 0) {\n console.log(chalk.red('\\n\u2717 Errors:'));\n result.errors.forEach((error) => {\n console.log(chalk.red(` \u2022 ${error}`));\n });\n }\n\n // Display warnings\n if (result.warnings.length > 0) {\n console.log(chalk.yellow('\\n\u26A0 Warnings:'));\n result.warnings.forEach((warning) => {\n console.log(chalk.yellow(` \u2022 ${warning}`));\n });\n }\n\n // Display suggestions\n if (result.suggestions.length > 0) {\n console.log(chalk.cyan('\\n\uD83D\uDCA1 Suggestions:'));\n result.suggestions.forEach((suggestion) => {\n console.log(chalk.cyan(` \u2022 ${suggestion}`));\n });\n }\n\n // Auto-fix if requested\n if (options.fix && result.errors.length > 0) {\n console.log(chalk.blue('\\n\uD83D\uDD27 Attempting auto-fix...'));\n\n const config = manager.getConfig();\n const weights = config.scoring.weights;\n const weightSum =\n weights.base +\n weights.impact +\n weights.persistence +\n weights.reference;\n\n if (Math.abs(weightSum - 1.0) > 0.001) {\n // Normalize weights to sum to 1.0\n const factor = 1.0 / weightSum;\n manager.updateWeights({\n base: weights.base * factor,\n impact: weights.impact * factor,\n persistence: weights.persistence * factor,\n reference: weights.reference * factor,\n });\n manager.save();\n console.log(chalk.green(' \u2713 Normalized weights to sum to 1.0'));\n }\n }\n\n // Final status\n if (result.valid) {\n console.log(chalk.green('\\n\u2705 Configuration is valid'));\n process.exit(0);\n } else {\n console.log(chalk.red('\\n\u274C Configuration has errors'));\n process.exit(1);\n }\n });\n\n config\n .command('init')\n .description('Initialize configuration file with defaults')\n .option('-p, --profile <name>', 'Use a preset profile', 'default')\n .option('-f, --force', 'Overwrite existing config')\n .action(async (options) => {\n const configPath = path.join(\n process.cwd(),\n '.stackmemory',\n 'config.yaml'\n );\n\n if (fs.existsSync(configPath) && !options.force) {\n console.log(\n chalk.yellow(\n '\u26A0 Config file already exists. Use --force to overwrite.'\n )\n );\n process.exit(1);\n }\n\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const config = { ...DEFAULT_CONFIG };\n if (options.profile && options.profile !== 'default') {\n config.profile = options.profile;\n }\n\n const content = yaml.dump(config, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n });\n\n fs.writeFileSync(configPath, content, 'utf-8');\n console.log(chalk.green(`\u2705 Created config file at ${configPath}`));\n\n if (options.profile !== 'default') {\n console.log(chalk.cyan(`\uD83D\uDCCB Using profile: ${options.profile}`));\n }\n });\n\n config\n .command('show')\n .description('Show current configuration')\n .option('-p, --profile <name>', 'Show specific profile')\n .action(async (options) => {\n const manager = new ConfigManager();\n const config = manager.getConfig();\n\n if (options.profile) {\n const profiles = manager.getProfiles();\n const profile = profiles[options.profile];\n\n if (!profile) {\n console.log(chalk.red(`\u274C Profile '${options.profile}' not found`));\n console.log(chalk.cyan('Available profiles:'));\n Object.keys(profiles).forEach((name) => {\n console.log(` \u2022 ${name}`);\n });\n process.exit(1);\n }\n\n console.log(chalk.blue(`\\n\uD83D\uDCCB Profile: ${profile.name}`));\n if (profile.description) {\n console.log(chalk.gray(` ${profile.description}`));\n }\n console.log('\\n' + yaml.dump(profile, { indent: 2 }));\n } else {\n console.log(chalk.blue('\\n\uD83D\uDCCB Current Configuration:'));\n if (config.profile) {\n console.log(chalk.cyan(` Active Profile: ${config.profile}`));\n }\n console.log('\\n' + yaml.dump(config, { indent: 2 }));\n }\n });\n\n config\n .command('set-profile <name>')\n .description('Set active profile')\n .action(async (name) => {\n const manager = new ConfigManager();\n\n if (manager.setProfile(name)) {\n manager.save();\n console.log(chalk.green(`\u2705 Active profile set to: ${name}`));\n } else {\n console.log(chalk.red(`\u274C Profile '${name}' not found`));\n console.log(chalk.cyan('Available profiles:'));\n Object.keys(manager.getProfiles()).forEach((profile) => {\n console.log(` \u2022 ${profile}`);\n });\n process.exit(1);\n }\n });\n\n config\n .command('list-profiles')\n .description('List available profiles')\n .action(async () => {\n const manager = new ConfigManager();\n const profiles = manager.getProfiles();\n const currentProfile = manager.getConfig().profile;\n\n console.log(chalk.blue('\\n\uD83D\uDCCB Available Profiles:'));\n Object.entries(profiles).forEach(([name, profile]) => {\n const marker = name === currentProfile ? chalk.green(' \u2713') : '';\n console.log(` \u2022 ${chalk.cyan(name)}${marker}`);\n if (profile.description) {\n console.log(chalk.gray(` ${profile.description}`));\n }\n });\n });\n\n config\n .command('test-score <tool>')\n .description('Test importance scoring for a tool')\n .option('-f, --files <number>', 'Number of files affected', parseInt)\n .option('-p, --permanent', 'Is change permanent')\n .option('-r, --references <number>', 'Reference count', parseInt)\n .action(async (tool, options) => {\n const manager = new ConfigManager();\n\n const score = manager.calculateScore(tool, {\n filesAffected: options.files,\n isPermanent: options.permanent,\n referenceCount: options.references,\n });\n\n const config = manager.getConfig();\n const baseScore = config.scoring.tool_scores[tool] || 0.5;\n\n console.log(chalk.blue('\\n\uD83D\uDCCA Score Calculation:'));\n console.log(` Tool: ${chalk.cyan(tool)}`);\n console.log(` Base Score: ${chalk.yellow(baseScore.toFixed(3))}`);\n\n if (options.files !== undefined) {\n console.log(` Files Affected: ${options.files}`);\n }\n if (options.permanent) {\n console.log(` Permanent: ${chalk.green('Yes')}`);\n }\n if (options.references !== undefined) {\n console.log(` References: ${options.references}`);\n }\n\n console.log(chalk.blue('\\n Weights:'));\n console.log(` Base: ${config.scoring.weights.base}`);\n console.log(` Impact: ${config.scoring.weights.impact}`);\n console.log(` Persistence: ${config.scoring.weights.persistence}`);\n console.log(` Reference: ${config.scoring.weights.reference}`);\n\n console.log(chalk.green(`\\n Final Score: ${score.toFixed(3)}`));\n\n // Show importance level\n let level = 'Low';\n let color = chalk.gray;\n if (score >= 0.8) {\n level = 'Critical';\n color = chalk.red;\n } else if (score >= 0.6) {\n level = 'High';\n color = chalk.yellow;\n } else if (score >= 0.4) {\n level = 'Medium';\n color = chalk.cyan;\n }\n\n console.log(` Importance: ${color(level)}`);\n });\n\n return config;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["config"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import Database from "better-sqlite3";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { existsSync } from "fs";
|
|
5
|
+
import { FrameManager } from "../../core/context/frame-manager.js";
|
|
6
|
+
function createContextCommands() {
|
|
7
|
+
const context = new Command("context").alias("ctx").description("Manage context stack");
|
|
8
|
+
context.command("show").alias("status").description("Show current context stack").option("-v, --verbose", "Show detailed information").action(async (options) => {
|
|
9
|
+
const projectRoot = process.cwd();
|
|
10
|
+
const dbPath = join(projectRoot, ".stackmemory", "context.db");
|
|
11
|
+
if (!existsSync(dbPath)) {
|
|
12
|
+
console.log(
|
|
13
|
+
'\u274C StackMemory not initialized. Run "stackmemory init" first.'
|
|
14
|
+
);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const db = new Database(dbPath);
|
|
18
|
+
try {
|
|
19
|
+
let projectId = "default";
|
|
20
|
+
try {
|
|
21
|
+
const projectRow = db.prepare(
|
|
22
|
+
`
|
|
23
|
+
SELECT value FROM metadata WHERE key = 'project_id'
|
|
24
|
+
`
|
|
25
|
+
).get();
|
|
26
|
+
if (projectRow?.value) projectId = projectRow.value;
|
|
27
|
+
} catch {
|
|
28
|
+
}
|
|
29
|
+
const frameManager = new FrameManager(db, projectId);
|
|
30
|
+
const depth = frameManager.getStackDepth();
|
|
31
|
+
const activePath = frameManager.getActiveFramePath();
|
|
32
|
+
console.log(`
|
|
33
|
+
\u{1F4DA} Context Stack
|
|
34
|
+
`);
|
|
35
|
+
console.log(`Project: ${projectId}`);
|
|
36
|
+
console.log(`Depth: ${depth}`);
|
|
37
|
+
console.log(`Active frames: ${activePath.length}
|
|
38
|
+
`);
|
|
39
|
+
if (activePath.length === 0) {
|
|
40
|
+
console.log("No active context frames.\n");
|
|
41
|
+
console.log('Use "stackmemory context push" to create one.');
|
|
42
|
+
} else {
|
|
43
|
+
const typeIcon = {
|
|
44
|
+
session: "\u{1F537}",
|
|
45
|
+
task: "\u{1F4CB}",
|
|
46
|
+
command: "\u26A1",
|
|
47
|
+
file: "\u{1F4C4}",
|
|
48
|
+
decision: "\u{1F4A1}"
|
|
49
|
+
};
|
|
50
|
+
console.log("Stack (bottom to top):");
|
|
51
|
+
activePath.forEach((frame, i) => {
|
|
52
|
+
const icon = typeIcon[frame.type] || "\u{1F4E6}";
|
|
53
|
+
const indent = " ".repeat(i);
|
|
54
|
+
console.log(
|
|
55
|
+
`${indent}${i === activePath.length - 1 ? "\u2514\u2500" : "\u251C\u2500"} ${icon} ${frame.name || frame.frame_id.slice(0, 10)}`
|
|
56
|
+
);
|
|
57
|
+
if (options.verbose) {
|
|
58
|
+
console.log(`${indent} ID: ${frame.frame_id}`);
|
|
59
|
+
console.log(`${indent} Type: ${frame.type}`);
|
|
60
|
+
console.log(
|
|
61
|
+
`${indent} Created: ${new Date(frame.created_at * 1e3).toLocaleString()}`
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
console.log("");
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error("\u274C Failed to show context:", error.message);
|
|
69
|
+
} finally {
|
|
70
|
+
db.close();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
context.command("push <name>").description("Push a new context frame onto the stack").option(
|
|
74
|
+
"-t, --type <type>",
|
|
75
|
+
"Frame type (session, task, command, file, decision)",
|
|
76
|
+
"task"
|
|
77
|
+
).option("-m, --metadata <json>", "Additional metadata as JSON").action(async (name, options) => {
|
|
78
|
+
const projectRoot = process.cwd();
|
|
79
|
+
const dbPath = join(projectRoot, ".stackmemory", "context.db");
|
|
80
|
+
if (!existsSync(dbPath)) {
|
|
81
|
+
console.log(
|
|
82
|
+
'\u274C StackMemory not initialized. Run "stackmemory init" first.'
|
|
83
|
+
);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const db = new Database(dbPath);
|
|
87
|
+
try {
|
|
88
|
+
let projectId = "default";
|
|
89
|
+
try {
|
|
90
|
+
const projectRow = db.prepare(`SELECT value FROM metadata WHERE key = 'project_id'`).get();
|
|
91
|
+
if (projectRow?.value) projectId = projectRow.value;
|
|
92
|
+
} catch {
|
|
93
|
+
}
|
|
94
|
+
const frameManager = new FrameManager(db, projectId);
|
|
95
|
+
const activePath = frameManager.getActiveFramePath();
|
|
96
|
+
const parentId = activePath.length > 0 ? activePath[activePath.length - 1].frame_id : void 0;
|
|
97
|
+
let inputs = {};
|
|
98
|
+
if (options.metadata) {
|
|
99
|
+
try {
|
|
100
|
+
inputs = JSON.parse(options.metadata);
|
|
101
|
+
} catch {
|
|
102
|
+
console.log("\u26A0\uFE0F Invalid metadata JSON, ignoring");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const frameId = frameManager.createFrame({
|
|
106
|
+
type: options.type,
|
|
107
|
+
name,
|
|
108
|
+
inputs,
|
|
109
|
+
parentFrameId: parentId
|
|
110
|
+
});
|
|
111
|
+
console.log(`\u2705 Pushed context frame: ${name}`);
|
|
112
|
+
console.log(` ID: ${frameId.slice(0, 10)}`);
|
|
113
|
+
console.log(` Type: ${options.type}`);
|
|
114
|
+
console.log(` Depth: ${frameManager.getStackDepth()}`);
|
|
115
|
+
} catch (error) {
|
|
116
|
+
console.error("\u274C Failed to push context:", error.message);
|
|
117
|
+
} finally {
|
|
118
|
+
db.close();
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
context.command("pop").description("Pop the top context frame from the stack").option("-a, --all", "Pop all frames (clear stack)").action(async (options) => {
|
|
122
|
+
const projectRoot = process.cwd();
|
|
123
|
+
const dbPath = join(projectRoot, ".stackmemory", "context.db");
|
|
124
|
+
if (!existsSync(dbPath)) {
|
|
125
|
+
console.log(
|
|
126
|
+
'\u274C StackMemory not initialized. Run "stackmemory init" first.'
|
|
127
|
+
);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const db = new Database(dbPath);
|
|
131
|
+
try {
|
|
132
|
+
let projectId = "default";
|
|
133
|
+
try {
|
|
134
|
+
const projectRow = db.prepare(`SELECT value FROM metadata WHERE key = 'project_id'`).get();
|
|
135
|
+
if (projectRow?.value) projectId = projectRow.value;
|
|
136
|
+
} catch {
|
|
137
|
+
}
|
|
138
|
+
const frameManager = new FrameManager(db, projectId);
|
|
139
|
+
const activePath = frameManager.getActiveFramePath();
|
|
140
|
+
if (activePath.length === 0) {
|
|
141
|
+
console.log("\u{1F4DA} Stack is already empty.");
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (options.all) {
|
|
145
|
+
for (let i = activePath.length - 1; i >= 0; i--) {
|
|
146
|
+
frameManager.closeFrame(activePath[i].frame_id);
|
|
147
|
+
}
|
|
148
|
+
console.log(`\u2705 Cleared all ${activePath.length} context frames.`);
|
|
149
|
+
} else {
|
|
150
|
+
const topFrame = activePath[activePath.length - 1];
|
|
151
|
+
frameManager.closeFrame(topFrame.frame_id);
|
|
152
|
+
console.log(
|
|
153
|
+
`\u2705 Popped: ${topFrame.name || topFrame.frame_id.slice(0, 10)}`
|
|
154
|
+
);
|
|
155
|
+
console.log(` Depth: ${frameManager.getStackDepth()}`);
|
|
156
|
+
}
|
|
157
|
+
} catch (error) {
|
|
158
|
+
console.error("\u274C Failed to pop context:", error.message);
|
|
159
|
+
} finally {
|
|
160
|
+
db.close();
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
context.command("add <type> <message>").description(
|
|
164
|
+
"Add an event to current context (types: observation, decision, error)"
|
|
165
|
+
).action(async (type, message) => {
|
|
166
|
+
const projectRoot = process.cwd();
|
|
167
|
+
const dbPath = join(projectRoot, ".stackmemory", "context.db");
|
|
168
|
+
if (!existsSync(dbPath)) {
|
|
169
|
+
console.log(
|
|
170
|
+
'\u274C StackMemory not initialized. Run "stackmemory init" first.'
|
|
171
|
+
);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const db = new Database(dbPath);
|
|
175
|
+
try {
|
|
176
|
+
let projectId = "default";
|
|
177
|
+
try {
|
|
178
|
+
const projectRow = db.prepare(`SELECT value FROM metadata WHERE key = 'project_id'`).get();
|
|
179
|
+
if (projectRow?.value) projectId = projectRow.value;
|
|
180
|
+
} catch {
|
|
181
|
+
}
|
|
182
|
+
const frameManager = new FrameManager(db, projectId);
|
|
183
|
+
const activePath = frameManager.getActiveFramePath();
|
|
184
|
+
if (activePath.length === 0) {
|
|
185
|
+
console.log("\u26A0\uFE0F No active context frame. Creating one...");
|
|
186
|
+
frameManager.createFrame({
|
|
187
|
+
type: "task",
|
|
188
|
+
name: "cli-session",
|
|
189
|
+
inputs: {}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
const currentFrame = frameManager.getActiveFramePath().slice(-1)[0];
|
|
193
|
+
const validTypes = [
|
|
194
|
+
"observation",
|
|
195
|
+
"decision",
|
|
196
|
+
"error",
|
|
197
|
+
"action",
|
|
198
|
+
"result"
|
|
199
|
+
];
|
|
200
|
+
if (!validTypes.includes(type)) {
|
|
201
|
+
console.log(`\u26A0\uFE0F Unknown event type "${type}". Using "observation".`);
|
|
202
|
+
type = "observation";
|
|
203
|
+
}
|
|
204
|
+
frameManager.addEvent(
|
|
205
|
+
type,
|
|
206
|
+
{ message, content: message },
|
|
207
|
+
currentFrame.frame_id
|
|
208
|
+
);
|
|
209
|
+
console.log(
|
|
210
|
+
`\u2705 Added ${type}: ${message.slice(0, 50)}${message.length > 50 ? "..." : ""}`
|
|
211
|
+
);
|
|
212
|
+
} catch (error) {
|
|
213
|
+
console.error("\u274C Failed to add event:", error.message);
|
|
214
|
+
} finally {
|
|
215
|
+
db.close();
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
context.command("worktree [action]").description("Manage Claude worktree contexts").option("-i, --instance <id>", "Instance ID").option("-b, --branch <name>", "Branch name").option("-l, --list", "List worktree contexts").action(async (action, options) => {
|
|
219
|
+
const projectRoot = process.cwd();
|
|
220
|
+
const dbPath = join(projectRoot, ".stackmemory", "context.db");
|
|
221
|
+
if (!existsSync(dbPath)) {
|
|
222
|
+
console.log(
|
|
223
|
+
'\u274C StackMemory not initialized. Run "stackmemory init" first.'
|
|
224
|
+
);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const db = new Database(dbPath);
|
|
228
|
+
try {
|
|
229
|
+
let projectId = "default";
|
|
230
|
+
try {
|
|
231
|
+
const projectRow = db.prepare(`SELECT value FROM metadata WHERE key = 'project_id'`).get();
|
|
232
|
+
if (projectRow?.value) projectId = projectRow.value;
|
|
233
|
+
} catch {
|
|
234
|
+
}
|
|
235
|
+
const frameManager = new FrameManager(db, projectId);
|
|
236
|
+
if (options.list || action === "list") {
|
|
237
|
+
const worktreeFrames = db.prepare(
|
|
238
|
+
`
|
|
239
|
+
SELECT * FROM frames
|
|
240
|
+
WHERE project_id = ?
|
|
241
|
+
AND type = 'session'
|
|
242
|
+
AND inputs LIKE '%worktree%'
|
|
243
|
+
ORDER BY created_at DESC
|
|
244
|
+
LIMIT 10
|
|
245
|
+
`
|
|
246
|
+
).all(projectId);
|
|
247
|
+
console.log("\n\u{1F333} Worktree Contexts\n");
|
|
248
|
+
if (worktreeFrames.length === 0) {
|
|
249
|
+
console.log("No worktree contexts found.");
|
|
250
|
+
} else {
|
|
251
|
+
worktreeFrames.forEach((frame) => {
|
|
252
|
+
const inputs = JSON.parse(frame.inputs || "{}");
|
|
253
|
+
const instanceId = inputs.instanceId || "unknown";
|
|
254
|
+
const branch = inputs.branch || "unknown";
|
|
255
|
+
const created = new Date(
|
|
256
|
+
frame.created_at * 1e3
|
|
257
|
+
).toLocaleString();
|
|
258
|
+
console.log(`\u{1F4CD} ${frame.name || frame.frame_id.slice(0, 10)}`);
|
|
259
|
+
console.log(` Instance: ${instanceId}`);
|
|
260
|
+
console.log(` Branch: ${branch}`);
|
|
261
|
+
console.log(` Created: ${created}`);
|
|
262
|
+
console.log("");
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
} else if (action === "save") {
|
|
266
|
+
const instanceId = options.instance || process.env.CLAUDE_INSTANCE_ID;
|
|
267
|
+
const branch = options.branch || "unknown";
|
|
268
|
+
if (!instanceId) {
|
|
269
|
+
console.log("\u26A0\uFE0F No instance ID provided or detected.");
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const frameId = frameManager.createFrame({
|
|
273
|
+
type: "task",
|
|
274
|
+
name: `worktree-${branch}`,
|
|
275
|
+
inputs: {
|
|
276
|
+
worktree: true,
|
|
277
|
+
instanceId,
|
|
278
|
+
branch,
|
|
279
|
+
path: process.cwd()
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
console.log(`\u2705 Saved worktree context for ${branch}`);
|
|
283
|
+
console.log(` Instance: ${instanceId}`);
|
|
284
|
+
console.log(` Frame ID: ${frameId.slice(0, 10)}`);
|
|
285
|
+
} else if (action === "load") {
|
|
286
|
+
const instanceId = options.instance || process.env.CLAUDE_INSTANCE_ID;
|
|
287
|
+
if (!instanceId) {
|
|
288
|
+
console.log("\u26A0\uFE0F No instance ID provided.");
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const worktreeFrame = db.prepare(
|
|
292
|
+
`
|
|
293
|
+
SELECT * FROM frames
|
|
294
|
+
WHERE project_id = ?
|
|
295
|
+
AND type = 'session'
|
|
296
|
+
AND inputs LIKE ?
|
|
297
|
+
ORDER BY created_at DESC
|
|
298
|
+
LIMIT 1
|
|
299
|
+
`
|
|
300
|
+
).get(projectId, `%"instanceId":"${instanceId}"%`);
|
|
301
|
+
if (worktreeFrame) {
|
|
302
|
+
const inputs = JSON.parse(worktreeFrame.inputs || "{}");
|
|
303
|
+
console.log(`\u2705 Loaded worktree context`);
|
|
304
|
+
console.log(` Branch: ${inputs.branch}`);
|
|
305
|
+
console.log(` Instance: ${inputs.instanceId}`);
|
|
306
|
+
console.log(` Path: ${inputs.path}`);
|
|
307
|
+
} else {
|
|
308
|
+
console.log("\u26A0\uFE0F No worktree context found for this instance.");
|
|
309
|
+
}
|
|
310
|
+
} else {
|
|
311
|
+
console.log("Usage: stackmemory context worktree [save|load|list]");
|
|
312
|
+
}
|
|
313
|
+
} catch (error) {
|
|
314
|
+
console.error(
|
|
315
|
+
"\u274C Failed to manage worktree context:",
|
|
316
|
+
error.message
|
|
317
|
+
);
|
|
318
|
+
} finally {
|
|
319
|
+
db.close();
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
return context;
|
|
323
|
+
}
|
|
324
|
+
export {
|
|
325
|
+
createContextCommands
|
|
326
|
+
};
|
|
327
|
+
//# sourceMappingURL=context.js.map
|