@stackmemoryai/stackmemory 0.8.1 → 1.0.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/LICENSE +64 -0
- package/README.md +15 -3
- package/dist/src/agents/core/agent-task-manager.js +0 -1
- package/dist/src/agents/verifiers/base-verifier.js +0 -1
- package/dist/src/agents/verifiers/formatter-verifier.js +0 -1
- package/dist/src/agents/verifiers/llm-judge.js +0 -1
- package/dist/src/cli/auto-detect.js +0 -1
- package/dist/src/cli/claude-sm-danger.js +0 -1
- package/dist/src/cli/claude-sm.js +0 -1
- package/dist/src/cli/codex-sm-danger.js +0 -1
- package/dist/src/cli/codex-sm.js +0 -1
- package/dist/src/cli/commands/api.js +0 -1
- package/dist/src/cli/commands/auto-background.js +0 -1
- package/dist/src/cli/commands/cleanup-processes.js +0 -1
- package/dist/src/cli/commands/clear.js +0 -1
- package/dist/src/cli/commands/config.js +0 -1
- package/dist/src/cli/commands/context-rehydrate.js +0 -1
- package/dist/src/cli/commands/context.js +0 -1
- package/dist/src/cli/commands/daemon.js +0 -1
- package/dist/src/cli/commands/dashboard.js +4 -5
- package/dist/src/cli/commands/db.js +0 -1
- package/dist/src/cli/commands/decision.js +0 -1
- package/dist/src/cli/commands/discovery.js +0 -1
- package/dist/src/cli/commands/handoff.js +0 -1
- package/dist/src/cli/commands/hooks.js +0 -1
- package/dist/src/cli/commands/linear.js +0 -1
- package/dist/src/cli/commands/log.js +0 -1
- package/dist/src/cli/commands/login.js +0 -1
- package/dist/src/cli/commands/migrate.js +0 -1
- package/dist/src/cli/commands/model.js +0 -1
- package/dist/src/cli/commands/onboard.js +0 -1
- package/dist/src/cli/commands/ping.js +0 -1
- package/dist/src/cli/commands/projects.js +0 -1
- package/dist/src/cli/commands/ralph.js +0 -1
- package/dist/src/cli/commands/retrieval.js +0 -1
- package/dist/src/cli/commands/search.js +0 -1
- package/dist/src/cli/commands/service.js +0 -1
- package/dist/src/cli/commands/session.js +0 -1
- package/dist/src/cli/commands/setup.js +0 -4
- package/dist/src/cli/commands/shell.js +0 -1
- package/dist/src/cli/commands/signup.js +0 -1
- package/dist/src/cli/commands/skills.js +4 -3
- package/dist/src/cli/commands/storage-tier.js +0 -1
- package/dist/src/cli/commands/sweep.js +0 -1
- package/dist/src/cli/commands/tasks.js +0 -1
- package/dist/src/cli/commands/worktree.js +10 -5
- package/dist/src/cli/index.js +8 -5
- package/dist/src/cli/opencode-sm.js +0 -1
- package/dist/src/cli/utils/viewer.js +0 -1
- package/dist/src/core/config/config-manager.js +0 -1
- package/dist/src/core/config/feature-flags.js +0 -1
- package/dist/src/core/config/storage-config.js +0 -1
- package/dist/src/core/config/types.js +0 -1
- package/dist/src/core/context/auto-context.js +0 -1
- package/dist/src/core/context/dual-stack-manager.js +0 -1
- package/dist/src/core/context/enhanced-rehydration.js +0 -2
- package/dist/src/core/context/frame-database.js +60 -6
- package/dist/src/core/context/frame-digest.js +0 -1
- package/dist/src/core/context/frame-handoff-manager.js +0 -1
- package/dist/src/core/context/frame-lifecycle-hooks.js +0 -1
- package/dist/src/core/context/frame-recovery.js +0 -1
- package/dist/src/core/context/frame-stack.js +0 -1
- package/dist/src/core/context/frame-types.js +0 -1
- package/dist/src/core/context/index.js +0 -1
- package/dist/src/core/context/permission-manager.js +0 -1
- package/dist/src/core/context/recursive-context-manager.js +3 -2
- package/dist/src/core/context/refactored-frame-manager.js +0 -1
- package/dist/src/core/context/shared-context-layer.js +0 -1
- package/dist/src/core/context/stack-merge-resolver.js +0 -1
- package/dist/src/core/context/validation.js +0 -1
- package/dist/src/core/database/batch-operations.js +0 -1
- package/dist/src/core/database/connection-pool.js +0 -1
- package/dist/src/core/database/database-adapter.js +0 -1
- package/dist/src/core/database/embedding-provider-factory.js +0 -1
- package/dist/src/core/database/embedding-provider.js +0 -1
- package/dist/src/core/database/migration-manager.js +0 -1
- package/dist/src/core/database/ollama-embedding-provider.js +0 -1
- package/dist/src/core/database/openai-embedding-provider.js +0 -1
- package/dist/src/core/database/query-cache.js +0 -1
- package/dist/src/core/database/query-router.js +0 -1
- package/dist/src/core/database/sqlite-adapter.js +18 -108
- package/dist/src/core/database/transformers-embedding-provider.js +0 -1
- package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -1
- package/dist/src/core/digest/frame-digest-integration.js +0 -1
- package/dist/src/core/digest/hybrid-digest-generator.js +0 -1
- package/dist/src/core/digest/index.js +0 -1
- package/dist/src/core/digest/types.js +0 -1
- package/dist/src/core/errors/error-utils.js +0 -1
- package/dist/src/core/errors/index.js +0 -1
- package/dist/src/core/errors/recovery.js +0 -1
- package/dist/src/core/execution/parallel-executor.js +0 -1
- package/dist/src/core/extensions/custom-tools.js +0 -1
- package/dist/src/core/extensions/index.js +0 -1
- package/dist/src/core/extensions/loader.js +0 -1
- package/dist/src/core/extensions/plugin-system.js +0 -1
- package/dist/src/core/extensions/provider-adapter.js +0 -1
- package/dist/src/core/extensions/sandbox-runtime.js +0 -1
- package/dist/src/core/extensions/types.js +0 -1
- package/dist/src/core/frame/workflow-templates.js +0 -1
- package/dist/src/core/merge/conflict-detector.js +0 -1
- package/dist/src/core/merge/index.js +0 -1
- package/dist/src/core/merge/resolution-engine.js +0 -1
- package/dist/src/core/merge/stack-diff.js +0 -1
- package/dist/src/core/merge/types.js +0 -1
- package/dist/src/core/merge/unified-merge-resolver.js +0 -1
- package/dist/src/core/models/fallback-monitor.js +0 -1
- package/dist/src/core/models/model-router.js +0 -1
- package/dist/src/core/monitoring/error-handler.js +0 -1
- package/dist/src/core/monitoring/logger.js +0 -1
- package/dist/src/core/monitoring/metrics.js +0 -1
- package/dist/src/core/monitoring/progress-tracker.js +0 -1
- package/dist/src/core/monitoring/session-monitor.js +0 -1
- package/dist/src/core/performance/context-cache.js +0 -1
- package/dist/src/core/performance/index.js +0 -1
- package/dist/src/core/performance/lazy-context-loader.js +3 -8
- package/dist/src/core/performance/monitor.js +0 -1
- package/dist/src/core/performance/optimized-frame-context.js +0 -1
- package/dist/src/core/performance/performance-benchmark.js +0 -1
- package/dist/src/core/performance/performance-profiler.js +0 -1
- package/dist/src/core/performance/streaming-jsonl-parser.js +0 -1
- package/dist/src/core/persistence/postgres-adapter.js +0 -1
- package/dist/src/core/projects/project-isolation.js +0 -1
- package/dist/src/core/projects/project-manager.js +0 -1
- package/dist/src/core/query/query-parser.js +0 -1
- package/dist/src/core/query/query-templates.js +0 -1
- package/dist/src/core/retrieval/context-retriever.js +0 -1
- package/dist/src/core/retrieval/index.js +0 -1
- package/dist/src/core/retrieval/llm-context-retrieval.js +0 -1
- package/dist/src/core/retrieval/llm-provider.js +0 -1
- package/dist/src/core/retrieval/privacy-filter.js +0 -1
- package/dist/src/core/retrieval/retrieval-audit.js +0 -1
- package/dist/src/core/retrieval/summary-generator.js +15 -6
- package/dist/src/core/retrieval/types.js +0 -1
- package/dist/src/core/retrieval/unified-context-assembler.js +0 -1
- package/dist/src/core/security/index.js +0 -1
- package/dist/src/core/security/input-sanitizer.js +0 -1
- package/dist/src/core/session/clear-survival.js +0 -1
- package/dist/src/core/session/enhanced-handoff.js +0 -1
- package/dist/src/core/session/handoff-generator.js +0 -1
- package/dist/src/core/session/index.js +0 -1
- package/dist/src/core/session/session-manager.js +0 -1
- package/dist/src/core/skills/index.js +0 -1
- package/dist/src/core/skills/skill-storage.js +0 -1
- package/dist/src/core/skills/types.js +0 -1
- package/dist/src/core/storage/chromadb-adapter.js +0 -1
- package/dist/src/core/storage/infinite-storage.js +0 -1
- package/dist/src/core/storage/project-registry.js +0 -1
- package/dist/src/core/storage/remote-storage.js +4 -2
- package/dist/src/core/storage/storage-tier-manager.js +0 -1
- package/dist/src/core/storage/two-tier-storage.js +0 -1
- package/dist/src/core/trace/cli-trace-wrapper.js +0 -1
- package/dist/src/core/trace/db-trace-wrapper.js +0 -1
- package/dist/src/core/trace/debug-trace.js +0 -1
- package/dist/src/core/trace/index.js +0 -1
- package/dist/src/core/trace/linear-api-wrapper.js +0 -1
- package/dist/src/core/trace/trace-detector.js +0 -1
- package/dist/src/core/trace/trace-store.js +4 -5
- package/dist/src/core/trace/types.js +0 -1
- package/dist/src/core/types.js +0 -1
- package/dist/src/core/utils/async-mutex.js +0 -1
- package/dist/src/core/utils/compression.js +0 -1
- package/dist/src/core/utils/update-checker.js +0 -1
- package/dist/src/core/worktree/worktree-manager.js +0 -1
- package/dist/src/daemon/daemon-config.js +0 -1
- package/dist/src/daemon/services/context-service.js +0 -1
- package/dist/src/daemon/services/linear-service.js +0 -1
- package/dist/src/daemon/services/maintenance-service.js +0 -1
- package/dist/src/daemon/services/memory-service.js +0 -1
- package/dist/src/daemon/session-daemon.js +0 -1
- package/dist/src/daemon/unified-daemon.js +0 -1
- package/dist/src/features/analytics/api/analytics-api.js +0 -1
- package/dist/src/features/analytics/core/analytics-service.js +1 -2
- package/dist/src/features/analytics/index.js +0 -1
- package/dist/src/features/analytics/queries/metrics-queries.js +8 -9
- package/dist/src/features/analytics/types/metrics.js +0 -1
- package/dist/src/features/browser/browser-mcp.js +0 -1
- package/dist/src/features/sweep/index.js +0 -1
- package/dist/src/features/sweep/prediction-client.js +0 -1
- package/dist/src/features/sweep/prompt-builder.js +0 -1
- package/dist/src/features/sweep/pty-wrapper.js +0 -1
- package/dist/src/features/sweep/state-watcher.js +0 -1
- package/dist/src/features/sweep/status-bar.js +0 -1
- package/dist/src/features/sweep/sweep-server-manager.js +0 -1
- package/dist/src/features/sweep/tab-interceptor.js +0 -1
- package/dist/src/features/sweep/types.js +0 -1
- package/dist/src/features/tasks/linear-task-manager.js +0 -1
- package/dist/src/features/tasks/task-aware-context.js +0 -1
- package/dist/src/features/tui/simple-monitor.js +0 -1
- package/dist/src/features/tui/swarm-monitor.js +0 -1
- package/dist/src/features/web/client/stores/task-store.js +0 -1
- package/dist/src/features/web/server/index.js +0 -1
- package/dist/src/features/workers/tmux-manager.js +0 -1
- package/dist/src/features/workers/worker-registry.js +0 -1
- package/dist/src/hooks/auto-background.js +0 -1
- package/dist/src/hooks/config.js +0 -1
- package/dist/src/hooks/daemon.js +0 -1
- package/dist/src/hooks/diffmem-hooks.js +0 -1
- package/dist/src/hooks/events.js +0 -1
- package/dist/src/hooks/index.js +0 -1
- package/dist/src/hooks/linear-task-picker.js +0 -1
- package/dist/src/hooks/schemas.js +0 -1
- package/dist/src/hooks/secure-fs.js +0 -1
- package/dist/src/hooks/security-logger.js +0 -1
- package/dist/src/hooks/session-summary.js +0 -1
- package/dist/src/index.js +0 -1
- package/dist/src/integrations/anthropic/client.js +0 -1
- package/dist/src/integrations/claude-code/agent-bridge.js +0 -1
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +0 -1
- package/dist/src/integrations/claude-code/lifecycle-hooks.js +0 -1
- package/dist/src/integrations/claude-code/post-task-hooks.js +0 -1
- package/dist/src/integrations/claude-code/subagent-client-stub.js +0 -1
- package/dist/src/integrations/claude-code/subagent-client.js +0 -1
- package/dist/src/integrations/claude-code/task-coordinator.js +0 -1
- package/dist/src/integrations/diffmem/client.js +0 -1
- package/dist/src/integrations/diffmem/config.js +0 -1
- package/dist/src/integrations/diffmem/index.js +0 -1
- package/dist/src/integrations/diffmem/types.js +0 -1
- package/dist/src/integrations/linear/auth.js +0 -1
- package/dist/src/integrations/linear/auto-sync.js +0 -1
- package/dist/src/integrations/linear/client.js +0 -1
- package/dist/src/integrations/linear/config.js +0 -1
- package/dist/src/integrations/linear/migration.js +0 -1
- package/dist/src/integrations/linear/oauth-server.js +0 -1
- package/dist/src/integrations/linear/rest-client.js +0 -1
- package/dist/src/integrations/linear/sync-manager.js +0 -1
- package/dist/src/integrations/linear/sync-service.js +0 -1
- package/dist/src/integrations/linear/sync.js +0 -1
- package/dist/src/integrations/linear/types.js +0 -1
- package/dist/src/integrations/linear/unified-sync.js +0 -1
- package/dist/src/integrations/linear/webhook-handler.js +0 -1
- package/dist/src/integrations/linear/webhook-server.js +0 -1
- package/dist/src/integrations/linear/webhook.js +0 -1
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/context-handlers.js +43 -30
- package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/index.js +1 -3
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +24 -61
- package/dist/src/integrations/mcp/handlers/skill-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -1
- package/dist/src/integrations/mcp/index.js +0 -1
- package/dist/src/integrations/mcp/middleware/tool-scoring.js +3 -2
- package/dist/src/integrations/mcp/pending-utils.js +0 -1
- package/dist/src/integrations/mcp/refactored-server.js +0 -1
- package/dist/src/integrations/mcp/remote-server.js +0 -1
- package/dist/src/integrations/mcp/schemas.js +0 -1
- package/dist/src/integrations/mcp/server.js +20 -24
- package/dist/src/integrations/mcp/tool-definitions-code.js +0 -1
- package/dist/src/integrations/mcp/tool-definitions.js +0 -1
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -1
- package/dist/src/integrations/ralph/context/context-budget-manager.js +0 -1
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +0 -1
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +0 -1
- package/dist/src/integrations/ralph/index.js +0 -1
- package/dist/src/integrations/ralph/learning/pattern-learner.js +0 -1
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +5 -5
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +0 -1
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js +0 -1
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -1
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -1
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +0 -1
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +0 -1
- package/dist/src/integrations/ralph/performance/performance-optimizer.js +0 -1
- package/dist/src/integrations/ralph/recovery/crash-recovery.js +0 -1
- package/dist/src/integrations/ralph/state/state-reconciler.js +25 -9
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +0 -1
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +0 -1
- package/dist/src/integrations/ralph/types.js +0 -1
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js +0 -1
- package/dist/src/mcp/stackmemory-mcp-server.js +0 -1
- package/dist/src/middleware/exponential-rate-limiter.js +0 -1
- package/dist/src/models/user.model.js +0 -1
- package/dist/src/orchestrators/multimodal/constants.js +0 -1
- package/dist/src/orchestrators/multimodal/harness.js +0 -1
- package/dist/src/orchestrators/multimodal/providers.js +0 -1
- package/dist/src/orchestrators/multimodal/types.js +0 -1
- package/dist/src/orchestrators/multimodal/utils.js +0 -1
- package/dist/src/servers/production/auth-middleware.js +0 -1
- package/dist/src/services/config-service.js +0 -1
- package/dist/src/services/context-service.js +0 -1
- package/dist/src/skills/api-discovery.js +0 -1
- package/dist/src/skills/api-skill.js +0 -1
- package/dist/src/skills/claude-skills.js +0 -1
- package/dist/src/skills/dashboard-launcher.js +0 -1
- package/dist/src/skills/linear-task-runner.js +0 -1
- package/dist/src/skills/recursive-agent-orchestrator.js +0 -1
- package/dist/src/skills/repo-ingestion-skill.js +0 -1
- package/dist/src/skills/spec-generator-skill.js +0 -1
- package/dist/src/skills/unified-rlm-orchestrator.js +0 -1
- package/dist/src/types/task.js +0 -1
- package/dist/src/utils/env.js +0 -1
- package/dist/src/utils/formatting.js +0 -1
- package/dist/src/utils/process-cleanup.js +0 -1
- package/package.json +32 -7
- package/dist/scripts/benchmark-performance.js +0 -48
- package/dist/scripts/benchmark-performance.js.map +0 -7
- package/dist/scripts/check-redis.js +0 -42
- package/dist/scripts/check-redis.js.map +0 -7
- package/dist/scripts/initialize.js +0 -183
- package/dist/scripts/initialize.js.map +0 -7
- package/dist/scripts/list-linear-tasks.js +0 -124
- package/dist/scripts/list-linear-tasks.js.map +0 -7
- package/dist/scripts/measure-handoff-impact.js +0 -340
- package/dist/scripts/measure-handoff-impact.js.map +0 -7
- package/dist/scripts/query-chromadb.js +0 -160
- package/dist/scripts/query-chromadb.js.map +0 -7
- package/dist/scripts/show-linear-summary.js +0 -119
- package/dist/scripts/show-linear-summary.js.map +0 -7
- package/dist/scripts/simple-swarm-demo.js +0 -90
- package/dist/scripts/simple-swarm-demo.js.map +0 -7
- package/dist/scripts/status.js +0 -155
- package/dist/scripts/status.js.map +0 -7
- package/dist/scripts/test-chromadb-sync.js +0 -192
- package/dist/scripts/test-chromadb-sync.js.map +0 -7
- package/dist/scripts/test-ralph-iteration-fix.js +0 -86
- package/dist/scripts/test-ralph-iteration-fix.js.map +0 -7
- package/dist/scripts/test-ralph-iterations.js +0 -121
- package/dist/scripts/test-ralph-iterations.js.map +0 -7
- package/dist/scripts/test-redis-storage.js +0 -389
- package/dist/scripts/test-redis-storage.js.map +0 -7
- package/dist/scripts/test-simple-ralph-state-sync.js +0 -115
- package/dist/scripts/test-simple-ralph-state-sync.js.map +0 -7
- package/dist/scripts/test-swarm-fixes.js +0 -125
- package/dist/scripts/test-swarm-fixes.js.map +0 -7
- package/dist/scripts/test-swarm-tui.js +0 -23
- package/dist/scripts/test-swarm-tui.js.map +0 -7
- package/dist/scripts/test-tui-shortcuts.js +0 -52
- package/dist/scripts/test-tui-shortcuts.js.map +0 -7
- package/dist/scripts/validate-tui-shortcuts.js +0 -60
- package/dist/scripts/validate-tui-shortcuts.js.map +0 -7
- package/dist/src/agents/core/agent-task-manager.js.map +0 -7
- package/dist/src/agents/verifiers/base-verifier.js.map +0 -7
- package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -7
- package/dist/src/agents/verifiers/llm-judge.js.map +0 -7
- package/dist/src/cli/auto-detect.js.map +0 -7
- package/dist/src/cli/claude-sm-danger.js.map +0 -7
- package/dist/src/cli/claude-sm.js.map +0 -7
- package/dist/src/cli/codex-sm-danger.js.map +0 -7
- package/dist/src/cli/codex-sm.js.map +0 -7
- package/dist/src/cli/commands/api.js.map +0 -7
- package/dist/src/cli/commands/auto-background.js.map +0 -7
- package/dist/src/cli/commands/cleanup-processes.js.map +0 -7
- package/dist/src/cli/commands/clear.js.map +0 -7
- package/dist/src/cli/commands/config.js.map +0 -7
- package/dist/src/cli/commands/context-rehydrate.js.map +0 -7
- package/dist/src/cli/commands/context.js.map +0 -7
- package/dist/src/cli/commands/daemon.js.map +0 -7
- package/dist/src/cli/commands/dashboard.js.map +0 -7
- package/dist/src/cli/commands/db.js.map +0 -7
- package/dist/src/cli/commands/decision.js.map +0 -7
- package/dist/src/cli/commands/discovery.js.map +0 -7
- package/dist/src/cli/commands/handoff.js.map +0 -7
- package/dist/src/cli/commands/hooks.js.map +0 -7
- package/dist/src/cli/commands/linear.js.map +0 -7
- package/dist/src/cli/commands/log.js.map +0 -7
- package/dist/src/cli/commands/login.js.map +0 -7
- package/dist/src/cli/commands/migrate.js.map +0 -7
- package/dist/src/cli/commands/model.js.map +0 -7
- package/dist/src/cli/commands/onboard.js.map +0 -7
- package/dist/src/cli/commands/ping.js.map +0 -7
- package/dist/src/cli/commands/projects.js.map +0 -7
- package/dist/src/cli/commands/ralph.js.map +0 -7
- package/dist/src/cli/commands/retrieval.js.map +0 -7
- package/dist/src/cli/commands/search.js.map +0 -7
- package/dist/src/cli/commands/service.js.map +0 -7
- package/dist/src/cli/commands/session.js.map +0 -7
- package/dist/src/cli/commands/settings.js +0 -306
- package/dist/src/cli/commands/settings.js.map +0 -7
- package/dist/src/cli/commands/setup.js.map +0 -7
- package/dist/src/cli/commands/shell.js.map +0 -7
- package/dist/src/cli/commands/signup.js.map +0 -7
- package/dist/src/cli/commands/skills.js.map +0 -7
- package/dist/src/cli/commands/sms-notify.js +0 -795
- package/dist/src/cli/commands/sms-notify.js.map +0 -7
- package/dist/src/cli/commands/storage-tier.js.map +0 -7
- package/dist/src/cli/commands/sweep.js.map +0 -7
- package/dist/src/cli/commands/tasks.js.map +0 -7
- package/dist/src/cli/commands/worktree.js.map +0 -7
- package/dist/src/cli/index.js.map +0 -7
- package/dist/src/cli/opencode-sm.js.map +0 -7
- package/dist/src/cli/utils/viewer.js.map +0 -7
- package/dist/src/core/config/config-manager.js.map +0 -7
- package/dist/src/core/config/feature-flags.js.map +0 -7
- package/dist/src/core/config/storage-config.js.map +0 -7
- package/dist/src/core/config/types.js.map +0 -7
- package/dist/src/core/context/auto-context.js.map +0 -7
- package/dist/src/core/context/dual-stack-manager.js.map +0 -7
- package/dist/src/core/context/enhanced-rehydration.js.map +0 -7
- package/dist/src/core/context/frame-database.js.map +0 -7
- package/dist/src/core/context/frame-digest.js.map +0 -7
- package/dist/src/core/context/frame-handoff-manager.js.map +0 -7
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +0 -7
- package/dist/src/core/context/frame-recovery.js.map +0 -7
- package/dist/src/core/context/frame-stack.js.map +0 -7
- package/dist/src/core/context/frame-types.js.map +0 -7
- package/dist/src/core/context/index.js.map +0 -7
- package/dist/src/core/context/permission-manager.js.map +0 -7
- package/dist/src/core/context/recursive-context-manager.js.map +0 -7
- package/dist/src/core/context/refactored-frame-manager.js.map +0 -7
- package/dist/src/core/context/shared-context-layer.js.map +0 -7
- package/dist/src/core/context/stack-merge-resolver.js.map +0 -7
- package/dist/src/core/context/validation.js.map +0 -7
- package/dist/src/core/database/batch-operations.js.map +0 -7
- package/dist/src/core/database/connection-pool.js.map +0 -7
- package/dist/src/core/database/database-adapter.js.map +0 -7
- package/dist/src/core/database/embedding-provider-factory.js.map +0 -7
- package/dist/src/core/database/embedding-provider.js.map +0 -7
- package/dist/src/core/database/migration-manager.js.map +0 -7
- package/dist/src/core/database/ollama-embedding-provider.js.map +0 -7
- package/dist/src/core/database/openai-embedding-provider.js.map +0 -7
- package/dist/src/core/database/query-cache.js.map +0 -7
- package/dist/src/core/database/query-router.js.map +0 -7
- package/dist/src/core/database/sqlite-adapter.js.map +0 -7
- package/dist/src/core/database/transformers-embedding-provider.js.map +0 -7
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -7
- package/dist/src/core/digest/frame-digest-integration.js.map +0 -7
- package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -7
- package/dist/src/core/digest/index.js.map +0 -7
- package/dist/src/core/digest/types.js.map +0 -7
- package/dist/src/core/errors/error-utils.js.map +0 -7
- package/dist/src/core/errors/index.js.map +0 -7
- package/dist/src/core/errors/recovery.js.map +0 -7
- package/dist/src/core/execution/parallel-executor.js.map +0 -7
- package/dist/src/core/extensions/custom-tools.js.map +0 -7
- package/dist/src/core/extensions/index.js.map +0 -7
- package/dist/src/core/extensions/loader.js.map +0 -7
- package/dist/src/core/extensions/plugin-system.js.map +0 -7
- package/dist/src/core/extensions/provider-adapter.js.map +0 -7
- package/dist/src/core/extensions/sandbox-runtime.js.map +0 -7
- package/dist/src/core/extensions/types.js.map +0 -7
- package/dist/src/core/frame/workflow-templates.js.map +0 -7
- package/dist/src/core/merge/conflict-detector.js.map +0 -7
- package/dist/src/core/merge/index.js.map +0 -7
- package/dist/src/core/merge/resolution-engine.js.map +0 -7
- package/dist/src/core/merge/stack-diff.js.map +0 -7
- package/dist/src/core/merge/types.js.map +0 -7
- package/dist/src/core/merge/unified-merge-resolver.js.map +0 -7
- package/dist/src/core/models/fallback-monitor.js.map +0 -7
- package/dist/src/core/models/model-router.js.map +0 -7
- package/dist/src/core/monitoring/error-handler.js.map +0 -7
- package/dist/src/core/monitoring/logger.js.map +0 -7
- package/dist/src/core/monitoring/metrics.js.map +0 -7
- package/dist/src/core/monitoring/progress-tracker.js.map +0 -7
- package/dist/src/core/monitoring/session-monitor.js.map +0 -7
- package/dist/src/core/performance/context-cache.js.map +0 -7
- package/dist/src/core/performance/index.js.map +0 -7
- package/dist/src/core/performance/lazy-context-loader.js.map +0 -7
- package/dist/src/core/performance/monitor.js.map +0 -7
- package/dist/src/core/performance/optimized-frame-context.js.map +0 -7
- package/dist/src/core/performance/performance-benchmark.js.map +0 -7
- package/dist/src/core/performance/performance-profiler.js.map +0 -7
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -7
- package/dist/src/core/persistence/postgres-adapter.js.map +0 -7
- package/dist/src/core/projects/project-isolation.js.map +0 -7
- package/dist/src/core/projects/project-manager.js.map +0 -7
- package/dist/src/core/query/query-parser.js.map +0 -7
- package/dist/src/core/query/query-templates.js.map +0 -7
- package/dist/src/core/retrieval/context-retriever.js.map +0 -7
- package/dist/src/core/retrieval/index.js.map +0 -7
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -7
- package/dist/src/core/retrieval/llm-provider.js.map +0 -7
- package/dist/src/core/retrieval/privacy-filter.js.map +0 -7
- package/dist/src/core/retrieval/retrieval-audit.js.map +0 -7
- package/dist/src/core/retrieval/summary-generator.js.map +0 -7
- package/dist/src/core/retrieval/types.js.map +0 -7
- package/dist/src/core/retrieval/unified-context-assembler.js.map +0 -7
- package/dist/src/core/security/index.js.map +0 -7
- package/dist/src/core/security/input-sanitizer.js.map +0 -7
- package/dist/src/core/session/clear-survival.js.map +0 -7
- package/dist/src/core/session/enhanced-handoff.js.map +0 -7
- package/dist/src/core/session/handoff-generator.js.map +0 -7
- package/dist/src/core/session/index.js.map +0 -7
- package/dist/src/core/session/session-manager.js.map +0 -7
- package/dist/src/core/skills/index.js.map +0 -7
- package/dist/src/core/skills/skill-storage.js.map +0 -7
- package/dist/src/core/skills/types.js.map +0 -7
- package/dist/src/core/storage/chromadb-adapter.js.map +0 -7
- package/dist/src/core/storage/infinite-storage.js.map +0 -7
- package/dist/src/core/storage/project-registry.js.map +0 -7
- package/dist/src/core/storage/remote-storage.js.map +0 -7
- package/dist/src/core/storage/storage-tier-manager.js.map +0 -7
- package/dist/src/core/storage/two-tier-storage.js.map +0 -7
- package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -7
- package/dist/src/core/trace/db-trace-wrapper.js.map +0 -7
- package/dist/src/core/trace/debug-trace.js.map +0 -7
- package/dist/src/core/trace/index.js.map +0 -7
- package/dist/src/core/trace/linear-api-wrapper.js.map +0 -7
- package/dist/src/core/trace/trace-detector.js.map +0 -7
- package/dist/src/core/trace/trace-store.js.map +0 -7
- package/dist/src/core/trace/types.js.map +0 -7
- package/dist/src/core/types.js.map +0 -7
- package/dist/src/core/utils/async-mutex.js.map +0 -7
- package/dist/src/core/utils/compression.js.map +0 -7
- package/dist/src/core/utils/update-checker.js.map +0 -7
- package/dist/src/core/worktree/worktree-manager.js.map +0 -7
- package/dist/src/daemon/daemon-config.js.map +0 -7
- package/dist/src/daemon/services/context-service.js.map +0 -7
- package/dist/src/daemon/services/linear-service.js.map +0 -7
- package/dist/src/daemon/services/maintenance-service.js.map +0 -7
- package/dist/src/daemon/services/memory-service.js.map +0 -7
- package/dist/src/daemon/session-daemon.js.map +0 -7
- package/dist/src/daemon/unified-daemon.js.map +0 -7
- package/dist/src/features/analytics/api/analytics-api.js.map +0 -7
- package/dist/src/features/analytics/core/analytics-service.js.map +0 -7
- package/dist/src/features/analytics/index.js.map +0 -7
- package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -7
- package/dist/src/features/analytics/types/metrics.js.map +0 -7
- package/dist/src/features/browser/browser-mcp.js.map +0 -7
- package/dist/src/features/sweep/index.js.map +0 -7
- package/dist/src/features/sweep/prediction-client.js.map +0 -7
- package/dist/src/features/sweep/prompt-builder.js.map +0 -7
- package/dist/src/features/sweep/pty-wrapper.js.map +0 -7
- package/dist/src/features/sweep/state-watcher.js.map +0 -7
- package/dist/src/features/sweep/status-bar.js.map +0 -7
- package/dist/src/features/sweep/sweep-server-manager.js.map +0 -7
- package/dist/src/features/sweep/tab-interceptor.js.map +0 -7
- package/dist/src/features/sweep/types.js.map +0 -7
- package/dist/src/features/tasks/linear-task-manager.js.map +0 -7
- package/dist/src/features/tasks/task-aware-context.js.map +0 -7
- package/dist/src/features/tui/simple-monitor.js.map +0 -7
- package/dist/src/features/tui/swarm-monitor.js.map +0 -7
- package/dist/src/features/web/client/stores/task-store.js.map +0 -7
- package/dist/src/features/web/server/index.js.map +0 -7
- package/dist/src/features/workers/tmux-manager.js.map +0 -7
- package/dist/src/features/workers/worker-registry.js.map +0 -7
- package/dist/src/hooks/auto-background.js.map +0 -7
- package/dist/src/hooks/claude-code-whatsapp-hook.js +0 -197
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +0 -7
- package/dist/src/hooks/config.js.map +0 -7
- package/dist/src/hooks/daemon.js.map +0 -7
- package/dist/src/hooks/diffmem-hooks.js.map +0 -7
- package/dist/src/hooks/events.js.map +0 -7
- package/dist/src/hooks/index.js.map +0 -7
- package/dist/src/hooks/linear-task-picker.js.map +0 -7
- package/dist/src/hooks/schemas.js.map +0 -7
- package/dist/src/hooks/secure-fs.js.map +0 -7
- package/dist/src/hooks/security-logger.js.map +0 -7
- package/dist/src/hooks/session-summary.js.map +0 -7
- package/dist/src/hooks/sms-action-runner.js +0 -371
- package/dist/src/hooks/sms-action-runner.js.map +0 -7
- package/dist/src/hooks/sms-notify.js +0 -506
- package/dist/src/hooks/sms-notify.js.map +0 -7
- package/dist/src/hooks/sms-watcher.js +0 -93
- package/dist/src/hooks/sms-watcher.js.map +0 -7
- package/dist/src/hooks/sms-webhook.js +0 -555
- package/dist/src/hooks/sms-webhook.js.map +0 -7
- package/dist/src/hooks/whatsapp-commands.js +0 -479
- package/dist/src/hooks/whatsapp-commands.js.map +0 -7
- package/dist/src/hooks/whatsapp-scheduler.js +0 -317
- package/dist/src/hooks/whatsapp-scheduler.js.map +0 -7
- package/dist/src/hooks/whatsapp-sync.js +0 -409
- package/dist/src/hooks/whatsapp-sync.js.map +0 -7
- package/dist/src/index.js.map +0 -7
- package/dist/src/integrations/anthropic/client.js.map +0 -7
- package/dist/src/integrations/claude-code/agent-bridge.js.map +0 -7
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +0 -7
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +0 -7
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +0 -7
- package/dist/src/integrations/claude-code/subagent-client.js.map +0 -7
- package/dist/src/integrations/claude-code/task-coordinator.js.map +0 -7
- package/dist/src/integrations/diffmem/client.js.map +0 -7
- package/dist/src/integrations/diffmem/config.js.map +0 -7
- package/dist/src/integrations/diffmem/index.js.map +0 -7
- package/dist/src/integrations/diffmem/types.js.map +0 -7
- package/dist/src/integrations/linear/auth.js.map +0 -7
- package/dist/src/integrations/linear/auto-sync.js.map +0 -7
- package/dist/src/integrations/linear/client.js.map +0 -7
- package/dist/src/integrations/linear/config.js.map +0 -7
- package/dist/src/integrations/linear/migration.js.map +0 -7
- package/dist/src/integrations/linear/oauth-server.js.map +0 -7
- package/dist/src/integrations/linear/rest-client.js.map +0 -7
- package/dist/src/integrations/linear/sync-manager.js.map +0 -7
- package/dist/src/integrations/linear/sync-service.js.map +0 -7
- package/dist/src/integrations/linear/sync.js.map +0 -7
- package/dist/src/integrations/linear/types.js.map +0 -7
- package/dist/src/integrations/linear/unified-sync.js.map +0 -7
- package/dist/src/integrations/linear/webhook-handler.js.map +0 -7
- package/dist/src/integrations/linear/webhook-server.js.map +0 -7
- package/dist/src/integrations/linear/webhook.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/diffmem-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/index.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/index.js.map +0 -7
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +0 -7
- package/dist/src/integrations/mcp/pending-utils.js.map +0 -7
- package/dist/src/integrations/mcp/refactored-server.js.map +0 -7
- package/dist/src/integrations/mcp/remote-server.js.map +0 -7
- package/dist/src/integrations/mcp/schemas.js.map +0 -7
- package/dist/src/integrations/mcp/server.js.map +0 -7
- package/dist/src/integrations/mcp/tool-definitions-code.js.map +0 -7
- package/dist/src/integrations/mcp/tool-definitions.js.map +0 -7
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +0 -7
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
- package/dist/src/integrations/ralph/index.js.map +0 -7
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +0 -7
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +0 -7
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +0 -7
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +0 -7
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
- package/dist/src/integrations/ralph/types.js.map +0 -7
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
- package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -7
- package/dist/src/middleware/exponential-rate-limiter.js.map +0 -7
- package/dist/src/models/user.model.js.map +0 -7
- package/dist/src/orchestrators/multimodal/constants.js.map +0 -7
- package/dist/src/orchestrators/multimodal/harness.js.map +0 -7
- package/dist/src/orchestrators/multimodal/providers.js.map +0 -7
- package/dist/src/orchestrators/multimodal/types.js.map +0 -7
- package/dist/src/orchestrators/multimodal/utils.js.map +0 -7
- package/dist/src/servers/production/auth-middleware.js.map +0 -7
- package/dist/src/services/config-service.js.map +0 -7
- package/dist/src/services/context-service.js.map +0 -7
- package/dist/src/skills/api-discovery.js.map +0 -7
- package/dist/src/skills/api-skill.js.map +0 -7
- package/dist/src/skills/claude-skills.js.map +0 -7
- package/dist/src/skills/dashboard-launcher.js.map +0 -7
- package/dist/src/skills/linear-task-runner.js.map +0 -7
- package/dist/src/skills/recursive-agent-orchestrator.js.map +0 -7
- package/dist/src/skills/repo-ingestion-skill.js.map +0 -7
- package/dist/src/skills/spec-generator-skill.js.map +0 -7
- package/dist/src/skills/unified-rlm-orchestrator.js.map +0 -7
- package/dist/src/types/task.js.map +0 -7
- package/dist/src/utils/env.js.map +0 -7
- package/dist/src/utils/formatting.js.map +0 -7
- package/dist/src/utils/process-cleanup.js.map +0 -7
- package/scripts/README-TESTING.md +0 -186
- package/scripts/analyze-cli-security.js +0 -288
- package/scripts/archive/add-phase-tasks-to-linear.js +0 -163
- package/scripts/archive/analyze-linear-duplicates.js +0 -214
- package/scripts/archive/analyze-remaining-duplicates.js +0 -230
- package/scripts/archive/analyze-sta-duplicates.js +0 -292
- package/scripts/archive/analyze-sta-graphql.js +0 -399
- package/scripts/archive/cancel-duplicate-tasks.ts +0 -246
- package/scripts/archive/check-all-duplicates.ts +0 -419
- package/scripts/archive/clean-duplicate-tasks.js +0 -114
- package/scripts/archive/cleanup-duplicate-tasks.ts +0 -286
- package/scripts/archive/create-phase-tasks.js +0 -387
- package/scripts/archive/delete-linear-duplicates.js +0 -182
- package/scripts/archive/delete-remaining-duplicates.js +0 -158
- package/scripts/archive/delete-sta-duplicates.js +0 -201
- package/scripts/archive/delete-sta-oauth.js +0 -201
- package/scripts/archive/export-sta-tasks.js +0 -62
- package/scripts/archive/install-auto-sync.js +0 -266
- package/scripts/archive/install-chromadb-hooks.sh +0 -133
- package/scripts/archive/install-enhanced-clear-hooks.sh +0 -431
- package/scripts/archive/install-post-task-hooks.sh +0 -289
- package/scripts/archive/install-stackmemory-hooks.sh +0 -420
- package/scripts/archive/merge-linear-duplicates-safe.ts +0 -362
- package/scripts/archive/merge-linear-duplicates.ts +0 -182
- package/scripts/archive/remove-sta-tasks.js +0 -70
- package/scripts/archive/setup-background-sync.sh +0 -168
- package/scripts/archive/setup-claude-auto-triggers.sh +0 -181
- package/scripts/archive/setup-claude-autostart.sh +0 -305
- package/scripts/archive/setup-git-hooks.sh +0 -25
- package/scripts/archive/setup-linear-oauth.sh +0 -46
- package/scripts/archive/setup-mcp.sh +0 -113
- package/scripts/archive/setup-railway-deployment.sh +0 -81
- package/scripts/auto-handoff.sh +0 -262
- package/scripts/background-sync-manager.js +0 -478
- package/scripts/benchmark-performance.ts +0 -57
- package/scripts/check-redis.ts +0 -48
- package/scripts/chromadb-auto-loader.sh +0 -128
- package/scripts/chromadb-context-loader.js +0 -479
- package/scripts/claude-chromadb-hook.js +0 -460
- package/scripts/claude-linear-skill.js +0 -455
- package/scripts/claude-pre-commit.sh +0 -302
- package/scripts/claude-sm-autostart.js +0 -579
- package/scripts/claude-with-chromadb.sh +0 -69
- package/scripts/clean-linear-backlog.js +0 -273
- package/scripts/cleanup-old-sessions.sh +0 -57
- package/scripts/create-cleanup-issues.js +0 -302
- package/scripts/create-sandbox.sh +0 -269
- package/scripts/debug-linear-update.js +0 -174
- package/scripts/delete-linear-tasks.js +0 -167
- package/scripts/demos/browser-test.ts +0 -39
- package/scripts/demos/ralph-integration-demo.ts +0 -245
- package/scripts/demos/trace-demo.ts +0 -200
- package/scripts/demos/trace-detector.demo.ts +0 -171
- package/scripts/demos/trace-test.ts +0 -79
- package/scripts/deploy-ralph-swarm.sh +0 -365
- package/scripts/deploy.sh +0 -89
- package/scripts/deployment/test-deployment.js +0 -194
- package/scripts/detect-and-rehydrate.js +0 -162
- package/scripts/detect-and-rehydrate.mjs +0 -165
- package/scripts/development/create-demo-tasks.js +0 -143
- package/scripts/development/debug-frame-test.js +0 -16
- package/scripts/development/demo-auto-sync.js +0 -128
- package/scripts/development/fix-all-imports.js +0 -213
- package/scripts/development/fix-imports.js +0 -229
- package/scripts/development/fix-lint-loop.cjs +0 -103
- package/scripts/development/fix-project-id.ts +0 -161
- package/scripts/development/fix-strict-mode-issues.ts +0 -291
- package/scripts/development/reorganize-structure.sh +0 -228
- package/scripts/development/test-persistence-direct.js +0 -148
- package/scripts/development/test-persistence.js +0 -114
- package/scripts/development/test-tasks.js +0 -93
- package/scripts/development/update-imports.js +0 -212
- package/scripts/fetch-linear-status.js +0 -125
- package/scripts/initialize.ts +0 -220
- package/scripts/linear-auto-sync.js +0 -262
- package/scripts/linear-auto-sync.sh +0 -161
- package/scripts/linear-sync-daemon.js +0 -150
- package/scripts/linear-task-review.js +0 -237
- package/scripts/list-linear-tasks.ts +0 -178
- package/scripts/mcp-proxy.js +0 -66
- package/scripts/measure-handoff-impact.mjs +0 -395
- package/scripts/measure-handoff-impact.ts +0 -450
- package/scripts/publish-local.js +0 -74
- package/scripts/query-chromadb.ts +0 -201
- package/scripts/ralph-integration-test.js +0 -274
- package/scripts/reconcile-local-tasks.js +0 -170
- package/scripts/recreate-frames-db.js +0 -89
- package/scripts/show-linear-summary.ts +0 -172
- package/scripts/simple-swarm-demo.ts +0 -114
- package/scripts/stackmemory-auto-handoff.sh +0 -231
- package/scripts/start-linear-sync-daemon.sh +0 -141
- package/scripts/start-temporal-paradox.sh +0 -214
- package/scripts/status.ts +0 -224
- package/scripts/stop-notify-webhook.sh +0 -19
- package/scripts/swarm-monitor.js +0 -509
- package/scripts/sync-and-clean-tasks.js +0 -258
- package/scripts/sync-linear-graphql.js +0 -303
- package/scripts/sync-linear-tasks.js +0 -186
- package/scripts/test-auto-triggers.sh +0 -57
- package/scripts/test-browser-mcp.js +0 -74
- package/scripts/test-chromadb-full.js +0 -115
- package/scripts/test-chromadb-hooks.sh +0 -28
- package/scripts/test-chromadb-sync.ts +0 -245
- package/scripts/test-claude-config.sh +0 -123
- package/scripts/test-cli-security.js +0 -293
- package/scripts/test-code-execution.js +0 -143
- package/scripts/test-hooks-persistence.sh +0 -220
- package/scripts/test-installation-scenarios.sh +0 -359
- package/scripts/test-installation.sh +0 -224
- package/scripts/test-mcp.js +0 -163
- package/scripts/test-parallel-swarms.js +0 -443
- package/scripts/test-pre-publish-quick.sh +0 -69
- package/scripts/test-quality-gates.sh +0 -263
- package/scripts/test-ralph-iteration-fix.ts +0 -118
- package/scripts/test-ralph-iterations.ts +0 -164
- package/scripts/test-redis-storage.ts +0 -490
- package/scripts/test-rlm-basic.sh +0 -122
- package/scripts/test-rlm-comprehensive.sh +0 -260
- package/scripts/test-rlm-e2e.sh +0 -268
- package/scripts/test-rlm-simple.js +0 -90
- package/scripts/test-rlm.js +0 -110
- package/scripts/test-session-handoff.sh +0 -165
- package/scripts/test-setup-e2e.sh +0 -154
- package/scripts/test-shell-integration.sh +0 -275
- package/scripts/test-simple-ralph-state-sync.ts +0 -178
- package/scripts/test-swarm-fixes.ts +0 -161
- package/scripts/test-swarm-git-workflow.js +0 -338
- package/scripts/test-swarm-tui.ts +0 -34
- package/scripts/test-tui-shortcuts.ts +0 -66
- package/scripts/testing/ab-test-runner.ts +0 -510
- package/scripts/testing/collect-metrics.ts +0 -457
- package/scripts/testing/quick-effectiveness-demo.js +0 -187
- package/scripts/testing/ralph-cli-test.js +0 -88
- package/scripts/testing/ralph-integration-validation.js +0 -727
- package/scripts/testing/ralph-swarm-test-scenarios.js +0 -613
- package/scripts/testing/real-performance-test.js +0 -422
- package/scripts/testing/results/real-performance-results.json +0 -90
- package/scripts/testing/run-effectiveness-tests.sh +0 -176
- package/scripts/testing/simple-effectiveness-test.js +0 -310
- package/scripts/testing/test-tier-migration.js +0 -100
- package/scripts/update-linear-status.js +0 -268
- package/scripts/update-linear-tasks-fixed.js +0 -284
- package/scripts/validate-claude-config.sh +0 -155
- package/scripts/validate-swarm-implementation.js +0 -467
- package/scripts/validate-tui-shortcuts.ts +0 -83
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/integrations/claude-code/enhanced-pre-clear-hooks.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Enhanced Pre-Clear Context Preservation System\n * Comprehensive session state capture before /clear or /compact operations\n */\n\nimport { EventEmitter } from 'events';\nimport { ClearSurvival } from '../../core/session/clear-survival';\nimport { HandoffGenerator } from '../../core/session/handoff-generator';\nimport { FrameManager } from '../../core/frame/frame-manager';\nimport { DatabaseManager } from '../../core/storage/database-manager';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { execSync } from 'child_process';\n\nexport interface PreClearContext {\n // Session metadata\n sessionId: string;\n timestamp: string;\n trigger:\n | 'manual_clear'\n | 'auto_compact'\n | 'context_overflow'\n | 'user_request';\n\n // Context analysis\n contextUsage: {\n estimatedTokens: number;\n maxTokens: number;\n percentage: number;\n components: {\n frames: number;\n traces: number;\n conversations: number;\n codeBlocks: number;\n };\n };\n\n // Active work state\n workingState: {\n currentTask: string;\n activeFiles: string[];\n recentCommands: string[];\n pendingActions: string[];\n blockers: string[];\n };\n\n // Conversation state\n conversationState: {\n lastUserMessage: string;\n lastAssistantMessage: string;\n conversationTopic: string;\n messageCount: number;\n recentContext: string[];\n };\n\n // Code context\n codeContext: {\n modifiedFiles: FileContext[];\n gitStatus: GitStatus;\n testResults?: TestResults;\n buildStatus?: BuildStatus;\n dependencies: DependencyInfo[];\n };\n\n // Cognitive state\n cognitiveState: {\n currentFocus: string;\n mentalModel: string[];\n assumptions: string[];\n hypotheses: string[];\n explorationPaths: string[];\n };\n\n // Environment snapshot\n environment: {\n workingDirectory: string;\n gitBranch: string;\n nodeVersion?: string;\n packageJson?: any;\n environmentVars: Record<string, string>;\n };\n}\n\ninterface FileContext {\n path: string;\n lastModified: string;\n changeType: 'created' | 'modified' | 'deleted';\n lineChanges: { added: number; removed: number };\n purpose: string;\n relatedFiles: string[];\n}\n\ninterface GitStatus {\n branch: string;\n ahead: number;\n behind: number;\n staged: string[];\n unstaged: string[];\n untracked: string[];\n lastCommit: {\n hash: string;\n message: string;\n timestamp: string;\n };\n}\n\ninterface TestResults {\n framework: string;\n passed: number;\n failed: number;\n skipped: number;\n coverage?: number;\n failures: string[];\n}\n\ninterface BuildStatus {\n success: boolean;\n errors: string[];\n warnings: string[];\n timestamp: string;\n}\n\ninterface DependencyInfo {\n name: string;\n version: string;\n type: 'dependency' | 'devDependency' | 'global';\n critical: boolean;\n}\n\nexport class EnhancedPreClearHooks extends EventEmitter {\n private frameManager: FrameManager;\n private dbManager: DatabaseManager;\n private clearSurvival: ClearSurvival;\n private handoffGenerator: HandoffGenerator;\n private projectRoot: string;\n\n constructor(\n frameManager: FrameManager,\n dbManager: DatabaseManager,\n clearSurvival: ClearSurvival,\n handoffGenerator: HandoffGenerator,\n projectRoot: string\n ) {\n super();\n this.frameManager = frameManager;\n this.dbManager = dbManager;\n this.clearSurvival = clearSurvival;\n this.handoffGenerator = handoffGenerator;\n this.projectRoot = projectRoot;\n }\n\n /**\n * Comprehensive pre-clear context capture\n */\n async capturePreClearContext(\n trigger: PreClearContext['trigger']\n ): Promise<PreClearContext> {\n console.log('\uD83D\uDD0D Capturing comprehensive session context...');\n\n const context: PreClearContext = {\n sessionId: await this.dbManager.getCurrentSessionId(),\n timestamp: new Date().toISOString(),\n trigger,\n\n contextUsage: await this.analyzeContextUsage(),\n workingState: await this.captureWorkingState(),\n conversationState: await this.captureConversationState(),\n codeContext: await this.captureCodeContext(),\n cognitiveState: await this.captureCognitiveState(),\n environment: await this.captureEnvironment(),\n };\n\n // Save comprehensive context\n await this.saveEnhancedContext(context);\n\n // Emit for other systems to react\n this.emit('context:captured', context);\n\n console.log('\u2705 Comprehensive context captured');\n return context;\n }\n\n /**\n * Analyze current context usage with detailed breakdown\n */\n private async analyzeContextUsage(): Promise<\n PreClearContext['contextUsage']\n > {\n const sessionId = await this.dbManager.getCurrentSessionId();\n const frames = await this.dbManager.getRecentFrames(sessionId, 1000);\n const traces = await this.dbManager.getRecentTraces(sessionId, 1000);\n\n // Estimate token usage by component\n const frameTokens = frames.length * 200; // Average tokens per frame\n const traceTokens = traces.length * 100; // Average tokens per trace\n const conversationTokens = await this.estimateConversationTokens();\n const codeBlockTokens = await this.estimateCodeBlockTokens();\n\n const estimatedTokens =\n frameTokens + traceTokens + conversationTokens + codeBlockTokens;\n const maxTokens = 100000; // Claude's limit\n\n return {\n estimatedTokens,\n maxTokens,\n percentage: estimatedTokens / maxTokens,\n components: {\n frames: frameTokens,\n traces: traceTokens,\n conversations: conversationTokens,\n codeBlocks: codeBlockTokens,\n },\n };\n }\n\n /**\n * Capture current working state\n */\n private async captureWorkingState(): Promise<\n PreClearContext['workingState']\n > {\n const activeFrame = await this.getCurrentActiveFrame();\n const recentTraces = await this.dbManager.getRecentTraces(\n await this.dbManager.getCurrentSessionId(),\n 50\n );\n\n // Extract active files from recent operations\n const activeFiles = this.extractActiveFiles(recentTraces);\n\n // Get recent commands\n const recentCommands = recentTraces\n .filter((t) => t.type === 'bash' || t.type === 'command')\n .map((t) => t.content.command)\n .slice(0, 10);\n\n // Identify pending actions from frame metadata\n const pendingActions = this.extractPendingActions(activeFrame);\n\n // Identify blockers\n const blockers = this.extractBlockers(recentTraces);\n\n return {\n currentTask: activeFrame?.description || 'No active task',\n activeFiles,\n recentCommands,\n pendingActions,\n blockers,\n };\n }\n\n /**\n * Capture conversation state and recent context\n */\n private async captureConversationState(): Promise<\n PreClearContext['conversationState']\n > {\n const sessionId = await this.dbManager.getCurrentSessionId();\n const recentTraces = await this.dbManager.getRecentTraces(sessionId, 100);\n\n // Find last user and assistant messages\n const userMessages = recentTraces\n .filter((t) => t.type === 'user_message' || t.type === 'input')\n .slice(0, 5);\n\n const assistantMessages = recentTraces\n .filter((t) => t.type === 'assistant_message' || t.type === 'response')\n .slice(0, 5);\n\n // Extract conversation topic from recent interactions\n const conversationTopic = this.inferConversationTopic(recentTraces);\n\n // Build recent context summary\n const recentContext = this.buildRecentContextSummary(recentTraces);\n\n return {\n lastUserMessage:\n userMessages[0]?.content.message || 'No recent user message',\n lastAssistantMessage:\n assistantMessages[0]?.content.message || 'No recent assistant message',\n conversationTopic,\n messageCount: userMessages.length + assistantMessages.length,\n recentContext,\n };\n }\n\n /**\n * Capture comprehensive code context\n */\n private async captureCodeContext(): Promise<PreClearContext['codeContext']> {\n const gitStatus = await this.captureGitStatus();\n const modifiedFiles = await this.captureModifiedFiles();\n const testResults = await this.captureTestResults();\n const buildStatus = await this.captureBuildStatus();\n const dependencies = await this.captureDependencies();\n\n return {\n modifiedFiles,\n gitStatus,\n testResults,\n buildStatus,\n dependencies,\n };\n }\n\n /**\n * Capture cognitive state and mental model\n */\n private async captureCognitiveState(): Promise<\n PreClearContext['cognitiveState']\n > {\n const sessionId = await this.dbManager.getCurrentSessionId();\n const recentTraces = await this.dbManager.getRecentTraces(sessionId, 100);\n\n // Extract cognitive elements from traces and frames\n const currentFocus = await this.extractCurrentFocus();\n const mentalModel = this.extractMentalModel(recentTraces);\n const assumptions = this.extractAssumptions(recentTraces);\n const hypotheses = this.extractHypotheses(recentTraces);\n const explorationPaths = this.extractExplorationPaths(recentTraces);\n\n return {\n currentFocus,\n mentalModel,\n assumptions,\n hypotheses,\n explorationPaths,\n };\n }\n\n /**\n * Capture environment snapshot\n */\n private async captureEnvironment(): Promise<PreClearContext['environment']> {\n const gitBranch = await this.getCurrentGitBranch();\n const packageJson = await this.getPackageJson();\n const environmentVars = this.getRelevantEnvVars();\n\n return {\n workingDirectory: this.projectRoot,\n gitBranch,\n nodeVersion: process.version,\n packageJson,\n environmentVars,\n };\n }\n\n /**\n * Save enhanced context to multiple locations for reliability\n */\n private async saveEnhancedContext(context: PreClearContext): Promise<void> {\n const timestamp = context.timestamp.replace(/[:.]/g, '-');\n\n // Save to primary location\n const primaryPath = path.join(\n this.projectRoot,\n '.stackmemory',\n 'pre-clear',\n `context-${timestamp}.json`\n );\n\n // Save to backup location\n const backupPath = path.join(\n this.projectRoot,\n '.stackmemory',\n 'pre-clear',\n 'latest-context.json'\n );\n\n // Create markdown summary\n const markdownPath = path.join(\n this.projectRoot,\n '.stackmemory',\n 'pre-clear',\n `context-${timestamp}.md`\n );\n\n await fs.mkdir(path.dirname(primaryPath), { recursive: true });\n\n // Save JSON\n await fs.writeFile(primaryPath, JSON.stringify(context, null, 2), 'utf-8');\n await fs.writeFile(backupPath, JSON.stringify(context, null, 2), 'utf-8');\n\n // Save markdown summary\n const markdown = this.generateMarkdownSummary(context);\n await fs.writeFile(markdownPath, markdown, 'utf-8');\n\n console.log(\n `\uD83D\uDCC1 Context saved to ${path.relative(this.projectRoot, primaryPath)}`\n );\n }\n\n /**\n * Generate human-readable markdown summary\n */\n private generateMarkdownSummary(context: PreClearContext): string {\n const lines = [\n `# Pre-Clear Context Snapshot`,\n `**Timestamp**: ${new Date(context.timestamp).toLocaleString()}`,\n `**Trigger**: ${context.trigger}`,\n `**Session ID**: ${context.sessionId}`,\n '',\n\n `## \uD83D\uDCCA Context Usage`,\n `- **Total Tokens**: ${context.contextUsage.estimatedTokens.toLocaleString()} / ${context.contextUsage.maxTokens.toLocaleString()} (${Math.round(context.contextUsage.percentage * 100)}%)`,\n `- **Frames**: ${context.contextUsage.components.frames} tokens`,\n `- **Traces**: ${context.contextUsage.components.traces} tokens`,\n `- **Conversations**: ${context.contextUsage.components.conversations} tokens`,\n `- **Code Blocks**: ${context.contextUsage.components.codeBlocks} tokens`,\n '',\n\n `## \uD83C\uDFAF Current Work State`,\n `**Task**: ${context.workingState.currentTask}`,\n `**Active Files** (${context.workingState.activeFiles.length}):`,\n ...context.workingState.activeFiles.slice(0, 10).map((f) => `- ${f}`),\n '',\n `**Recent Commands**:`,\n ...context.workingState.recentCommands\n .slice(0, 5)\n .map((c) => `- \\`${c}\\``),\n '',\n\n `## \uD83D\uDCAC Conversation State`,\n `**Topic**: ${context.conversationState.conversationTopic}`,\n `**Messages**: ${context.conversationState.messageCount}`,\n `**Last User**: ${context.conversationState.lastUserMessage.substring(0, 100)}...`,\n '',\n\n `## \uD83D\uDCDD Code Context`,\n `**Git Branch**: ${context.codeContext.gitStatus.branch}`,\n `**Modified Files**: ${context.codeContext.modifiedFiles.length}`,\n `**Staged**: ${context.codeContext.gitStatus.staged.length}`,\n `**Unstaged**: ${context.codeContext.gitStatus.unstaged.length}`,\n '',\n\n `## \uD83E\uDDE0 Cognitive State`,\n `**Current Focus**: ${context.cognitiveState.currentFocus}`,\n `**Mental Model**:`,\n ...context.cognitiveState.mentalModel.slice(0, 5).map((m) => `- ${m}`),\n '',\n\n `## \uD83C\uDF0D Environment`,\n `**Directory**: ${context.environment.workingDirectory}`,\n `**Node Version**: ${context.environment.nodeVersion}`,\n `**Git Branch**: ${context.environment.gitBranch}`,\n '',\n ];\n\n return lines.filter((l) => l !== undefined).join('\\n');\n }\n\n // Helper methods (simplified implementations)\n\n private async estimateConversationTokens(): Promise<number> {\n // Simplified - would analyze recent conversation history\n return 15000;\n }\n\n private async estimateCodeBlockTokens(): Promise<number> {\n // Simplified - would analyze code blocks in context\n return 8000;\n }\n\n private async getCurrentActiveFrame(): Promise<any> {\n const stack = await this.frameManager.getStack();\n return stack.frames.find((f) => f.status === 'open');\n }\n\n private extractActiveFiles(traces: any[]): string[] {\n const files = new Set<string>();\n traces.forEach((trace) => {\n if (trace.content?.file_path) files.add(trace.content.file_path);\n if (trace.content?.path) files.add(trace.content.path);\n });\n return Array.from(files).slice(0, 20);\n }\n\n private extractPendingActions(frame: any): string[] {\n if (!frame?.metadata?.pendingActions) return [];\n return frame.metadata.pendingActions;\n }\n\n private extractBlockers(traces: any[]): string[] {\n return traces\n .filter((t) => t.type === 'error' && !t.metadata?.resolved)\n .map((t) => t.content.error || 'Unknown error')\n .slice(0, 5);\n }\n\n private inferConversationTopic(traces: any[]): string {\n // Simplified - would use NLP to infer topic\n return 'Code implementation and debugging';\n }\n\n private buildRecentContextSummary(traces: any[]): string[] {\n return traces\n .slice(0, 10)\n .map(\n (t) =>\n `${t.type}: ${t.content.summary || t.content.description || 'No description'}`\n )\n .filter((s) => s.length > 10);\n }\n\n private async captureGitStatus(): Promise<GitStatus> {\n try {\n const branch = execSync('git branch --show-current', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n }).trim();\n const staged = execSync('git diff --cached --name-only', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n })\n .trim()\n .split('\\n')\n .filter(Boolean);\n const unstaged = execSync('git diff --name-only', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n })\n .trim()\n .split('\\n')\n .filter(Boolean);\n const untracked = execSync('git ls-files --others --exclude-standard', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n })\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n return {\n branch,\n ahead: 0, // Would implement git status parsing\n behind: 0,\n staged,\n unstaged,\n untracked,\n lastCommit: {\n hash: 'abc123', // Would get from git log\n message: 'Recent commit',\n timestamp: new Date().toISOString(),\n },\n };\n } catch (error: unknown) {\n return {\n branch: 'unknown',\n ahead: 0,\n behind: 0,\n staged: [],\n unstaged: [],\n untracked: [],\n lastCommit: { hash: '', message: '', timestamp: '' },\n };\n }\n }\n\n private async captureModifiedFiles(): Promise<FileContext[]> {\n try {\n const output = execSync('git diff --name-status', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n });\n return output\n .trim()\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [status, path] = line.split('\\t');\n return {\n path,\n lastModified: new Date().toISOString(),\n changeType:\n status === 'A'\n ? 'created'\n : status === 'D'\n ? 'deleted'\n : 'modified',\n lineChanges: { added: 0, removed: 0 }, // Would get from git diff --stat\n purpose: 'Code changes',\n relatedFiles: [],\n };\n });\n } catch (error: unknown) {\n return [];\n }\n }\n\n private async captureTestResults(): Promise<TestResults | undefined> {\n // Would implement test result parsing\n return undefined;\n }\n\n private async captureBuildStatus(): Promise<BuildStatus | undefined> {\n // Would implement build status checking\n return undefined;\n }\n\n private async captureDependencies(): Promise<DependencyInfo[]> {\n try {\n const packageJsonPath = path.join(this.projectRoot, 'package.json');\n const content = await fs.readFile(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(content);\n\n const deps: DependencyInfo[] = [];\n\n Object.entries(packageJson.dependencies || {}).forEach(\n ([name, version]) => {\n deps.push({\n name,\n version: version as string,\n type: 'dependency',\n critical: ['react', 'express', 'next'].includes(name),\n });\n }\n );\n\n return deps;\n } catch (error: unknown) {\n return [];\n }\n }\n\n private async extractCurrentFocus(): Promise<string> {\n const activeFrame = await this.getCurrentActiveFrame();\n return activeFrame?.description || 'No current focus';\n }\n\n private extractMentalModel(traces: any[]): string[] {\n // Would extract mental model concepts from traces\n return [\n 'Component architecture',\n 'Data flow patterns',\n 'Error handling strategy',\n ];\n }\n\n private extractAssumptions(traces: any[]): string[] {\n // Would extract assumptions from traces\n return [\n 'User input is validated',\n 'Database is available',\n 'Network is stable',\n ];\n }\n\n private extractHypotheses(traces: any[]): string[] {\n // Would extract hypotheses being tested\n return [\n 'Bug is in validation logic',\n 'Performance issue is database-related',\n ];\n }\n\n private extractExplorationPaths(traces: any[]): string[] {\n // Would extract different approaches being explored\n return [\n 'Try different algorithm',\n 'Refactor data structure',\n 'Add caching layer',\n ];\n }\n\n private async getCurrentGitBranch(): Promise<string> {\n try {\n return execSync('git branch --show-current', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n }).trim();\n } catch (error: unknown) {\n return 'unknown';\n }\n }\n\n private async getPackageJson(): Promise<any> {\n try {\n const content = await fs.readFile(\n path.join(this.projectRoot, 'package.json'),\n 'utf-8'\n );\n return JSON.parse(content);\n } catch (error: unknown) {\n return null;\n }\n }\n\n private getRelevantEnvVars(): Record<string, string> {\n const relevantVars = ['NODE_ENV', 'DEBUG', 'PORT', 'DATABASE_URL'];\n const result: Record<string, string> = {};\n\n relevantVars.forEach((varName) => {\n if (process.env[varName]) {\n result[varName] = process.env[varName]!;\n }\n });\n\n return result;\n }\n\n /**\n * Restore context after /clear\n */\n async restoreFromEnhancedContext(): Promise<boolean> {\n const latestPath = path.join(\n this.projectRoot,\n '.stackmemory',\n 'pre-clear',\n 'latest-context.json'\n );\n\n try {\n const content = await fs.readFile(latestPath, 'utf-8');\n const context: PreClearContext = JSON.parse(content);\n\n console.log('\uD83D\uDCDA Restoring enhanced context...');\n console.log(` Session: ${context.sessionId}`);\n console.log(` Task: ${context.workingState.currentTask}`);\n console.log(` Files: ${context.workingState.activeFiles.length}`);\n console.log(` Focus: ${context.cognitiveState.currentFocus}`);\n\n // Restore using existing systems\n await this.clearSurvival.restoreFromLedger();\n\n // Additional restoration logic would go here\n\n return true;\n } catch (error: unknown) {\n console.error('Failed to restore enhanced context:', error);\n return false;\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["path"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/integrations/claude-code/lifecycle-hooks.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Claude Code Lifecycle Hooks for StackMemory\n * Integrates with Claude Code's session lifecycle\n */\n\nimport { SessionMonitor } from '../../core/monitoring/session-monitor';\nimport { FrameManager } from '../../core/frame/frame-manager';\nimport { DatabaseManager } from '../../core/storage/database-manager';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport interface ClaudeCodeHookConfig {\n projectRoot: string;\n autoTriggers: {\n onContextHigh: boolean; // Auto-save at 70%\n onContextCritical: boolean; // Force-save at 85%\n onSessionIdle: boolean; // Handoff on 5min idle\n onSessionEnd: boolean; // Handoff on close\n onClearCommand: boolean; // Save before /clear\n };\n claudeHooksPath?: string; // Path to .claude/hooks\n}\n\nexport class ClaudeCodeLifecycleHooks {\n private monitor?: SessionMonitor;\n private config: ClaudeCodeHookConfig;\n private isActive: boolean = false;\n private hookScripts: Map<string, string> = new Map();\n\n constructor(config: ClaudeCodeHookConfig) {\n this.config = {\n ...config,\n claudeHooksPath:\n config.claudeHooksPath || path.join(os.homedir(), '.claude', 'hooks'),\n };\n }\n\n /**\n * Initialize hooks and start monitoring\n */\n async initialize(): Promise<void> {\n if (this.isActive) return;\n\n // Initialize database and managers\n const dbPath = path.join(\n this.config.projectRoot,\n '.stackmemory',\n 'db',\n 'stackmemory.db'\n );\n const dbManager = new DatabaseManager(dbPath);\n await dbManager.initialize();\n\n const frameManager = new FrameManager(dbManager);\n\n // Create session monitor\n this.monitor = new SessionMonitor(\n frameManager,\n dbManager,\n this.config.projectRoot,\n {\n contextWarningThreshold: 0.6,\n contextCriticalThreshold: 0.7,\n contextAutoSaveThreshold: 0.85,\n idleTimeoutMinutes: 5,\n autoSaveLedger: this.config.autoTriggers.onContextCritical,\n autoGenerateHandoff: this.config.autoTriggers.onSessionIdle,\n sessionEndHandoff: this.config.autoTriggers.onSessionEnd,\n }\n );\n\n // Register event handlers\n this.registerEventHandlers();\n\n // Install Claude Code hooks\n await this.installClaudeHooks();\n\n // Start monitoring\n await this.monitor.start();\n\n this.isActive = true;\n console.log('\u2705 Claude Code lifecycle hooks initialized');\n }\n\n /**\n * Register event handlers for monitor events\n */\n private registerEventHandlers(): void {\n if (!this.monitor) return;\n\n // Context events\n this.monitor.on('context:warning', (data) => {\n console.log(`\u26A0\uFE0F Context at ${Math.round(data.percentage * 100)}%`);\n });\n\n this.monitor.on('context:high', async (data) => {\n if (this.config.autoTriggers.onContextHigh) {\n console.log('\uD83D\uDFE1 High context - preparing auto-save');\n await this.executeHook('on-context-high', data);\n }\n });\n\n this.monitor.on('context:ledger_saved', (data) => {\n console.log(`\u2705 Ledger saved (${data.compression}x compression)`);\n console.log('\uD83D\uDCA1 You can now safely use /clear');\n });\n\n // Handoff events\n this.monitor.on('handoff:generated', (data) => {\n console.log(`\uD83D\uDCCB Handoff saved (trigger: ${data.trigger})`);\n });\n }\n\n /**\n * Install hooks into Claude Code configuration\n */\n private async installClaudeHooks(): Promise<void> {\n // Create hooks directory if it doesn't exist\n await fs.mkdir(this.config.claudeHooksPath!, { recursive: true });\n\n // Install context monitor hook\n await this.installHook(\n 'on-message-submit',\n `\n#!/bin/bash\n# StackMemory Context Monitor Hook\n# Monitors token usage and triggers auto-save when needed\n\n# Get estimated token count from Claude (if available)\nTOKEN_COUNT=\\${CLAUDE_TOKEN_COUNT:-0}\nMAX_TOKENS=\\${CLAUDE_MAX_TOKENS:-100000}\n\nif [ \"\\$TOKEN_COUNT\" -gt 0 ]; then\n USAGE=\\$((TOKEN_COUNT * 100 / MAX_TOKENS))\n \n if [ \"\\$USAGE\" -gt 85 ]; then\n echo \"\uD83D\uDD34 Critical: Context at \\${USAGE}% - Auto-saving...\"\n stackmemory clear --save > /dev/null 2>&1\n echo \"\u2705 Ledger saved. Consider using /clear\"\n elif [ \"\\$USAGE\" -gt 70 ]; then\n echo \"\u26A0\uFE0F Warning: Context at \\${USAGE}%\"\n echo \"\uD83D\uDCA1 Run: stackmemory clear --save\"\n fi\nfi\n\n# Update activity timestamp\nstackmemory monitor --activity 2>/dev/null || true\n`\n );\n\n // Install session end hook\n await this.installHook(\n 'on-session-end',\n `\n#!/bin/bash\n# StackMemory Session End Hook\n# Generates handoff document when session ends\n\necho \"\uD83D\uDCE6 Saving session state...\"\n\n# Generate handoff\nstackmemory capture --no-commit > /dev/null 2>&1 && echo \"\u2705 Handoff saved\"\n\n# Save ledger if context is significant\nCONTEXT_STATUS=$(stackmemory clear --check 2>/dev/null | grep -o '[0-9]\\\\+%' | head -1 | tr -d '%')\nif [ \"\\${CONTEXT_STATUS:-0}\" -gt 30 ]; then\n stackmemory clear --save > /dev/null 2>&1 && echo \"\u2705 Continuity ledger saved\"\nfi\n\necho \"\uD83D\uDC4B Session state preserved for next time\"\n`\n );\n\n // Install clear command interceptor\n await this.installHook(\n 'on-command-clear',\n `\n#!/bin/bash\n# StackMemory Clear Interceptor\n# Saves state before /clear command\n\necho \"\uD83D\uDD04 Preparing for /clear...\"\n\n# Save continuity ledger\nstackmemory clear --save > /dev/null 2>&1\necho \"\u2705 Continuity ledger saved\"\n\n# Generate quick handoff\nstackmemory capture --no-commit > /dev/null 2>&1\necho \"\u2705 Handoff document saved\"\n\necho \"\u2705 Ready for /clear - context will be restored automatically\"\necho \"\uD83D\uDCA1 After /clear, run: stackmemory clear --restore\"\n`\n );\n\n // Install idle detector\n await this.installHook(\n 'on-idle-5min',\n `\n#!/bin/bash\n# StackMemory Idle Detector\n# Generates handoff after 5 minutes of inactivity\n\necho \"\u23F8\uFE0F Session idle - generating handoff...\"\nstackmemory capture --no-commit > /dev/null 2>&1\necho \"\u2705 Handoff saved. Ready to resume anytime.\"\n`\n );\n }\n\n /**\n * Install a specific hook script\n */\n private async installHook(name: string, script: string): Promise<void> {\n const hookPath = path.join(this.config.claudeHooksPath!, name);\n\n // Store script content\n this.hookScripts.set(name, script);\n\n // Write hook file\n await fs.writeFile(hookPath, script.trim(), { mode: 0o755 });\n\n // Make executable\n await fs.chmod(hookPath, 0o755);\n }\n\n /**\n * Execute a hook with context\n */\n private async executeHook(hookName: string, context: any): Promise<void> {\n const hookPath = path.join(this.config.claudeHooksPath!, hookName);\n\n try {\n // Check if hook exists\n await fs.access(hookPath);\n\n // Execute hook with environment variables\n const { exec } = await import('child_process');\n const { promisify } = await import('util');\n const execAsync = promisify(exec);\n\n const env = {\n ...process.env,\n STACKMEMORY_CONTEXT: JSON.stringify(context),\n STACKMEMORY_PROJECT: this.config.projectRoot,\n };\n\n const { stdout, stderr } = await execAsync(hookPath, { env });\n\n if (stdout) console.log(stdout);\n if (stderr) console.error(stderr);\n } catch (error: unknown) {\n // Hook doesn't exist or failed\n console.debug(`Hook ${hookName} not found or failed:`, error);\n }\n }\n\n /**\n * Stop monitoring and cleanup\n */\n async stop(): Promise<void> {\n if (this.monitor) {\n await this.monitor.stop();\n }\n this.isActive = false;\n console.log('\uD83D\uDED1 Claude Code lifecycle hooks stopped');\n }\n\n /**\n * Get current status\n */\n getStatus(): any {\n return {\n isActive: this.isActive,\n monitorStatus: this.monitor?.getStatus(),\n config: this.config,\n installedHooks: Array.from(this.hookScripts.keys()),\n };\n }\n}\n\n/**\n * Global singleton instance\n */\nlet globalInstance: ClaudeCodeLifecycleHooks | undefined;\n\n/**\n * Initialize global hooks\n */\nexport async function initializeClaudeHooks(\n projectRoot?: string\n): Promise<ClaudeCodeLifecycleHooks> {\n if (!projectRoot) {\n projectRoot = process.cwd();\n }\n\n if (!globalInstance) {\n globalInstance = new ClaudeCodeLifecycleHooks({\n projectRoot,\n autoTriggers: {\n onContextHigh: true,\n onContextCritical: true,\n onSessionIdle: true,\n onSessionEnd: true,\n onClearCommand: true,\n },\n });\n\n await globalInstance.initialize();\n }\n\n return globalInstance;\n}\n\n/**\n * Get global instance\n */\nexport function getClaudeHooks(): ClaudeCodeLifecycleHooks | undefined {\n return globalInstance;\n}\n\n/**\n * Stop global hooks\n */\nexport async function stopClaudeHooks(): Promise<void> {\n if (globalInstance) {\n await globalInstance.stop();\n globalInstance = undefined;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/integrations/claude-code/post-task-hooks.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Post-Task Completion Hooks for StackMemory\n * Automatically runs tests and code review after Claude completes tasks\n */\n\nimport { EventEmitter } from 'events';\nimport { execSync } from 'child_process';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { FrameManager } from '../../core/frame/frame-manager';\nimport { DatabaseManager } from '../../core/storage/database-manager';\n\nexport interface PostTaskConfig {\n projectRoot: string;\n qualityGates: {\n runTests: boolean; // Auto-run tests after code changes\n requireTestCoverage: boolean; // Require test coverage for new code\n runCodeReview: boolean; // Auto-trigger code review agent\n runLinter: boolean; // Auto-run linter/formatter\n blockOnFailure: boolean; // Block further work if quality gates fail\n };\n testFrameworks: {\n detected: string[]; // Auto-detected test frameworks\n testCommand?: string; // Custom test command\n coverageCommand?: string; // Custom coverage command\n lintCommand?: string; // Custom lint command\n };\n reviewConfig: {\n reviewOnEveryChange: boolean; // Review every file change\n reviewOnTaskComplete: boolean; // Review when task frame closes\n focusAreas: string[]; // What to focus on in reviews\n skipPatterns: string[]; // Files/patterns to skip review\n };\n}\n\nexport interface TaskCompletionEvent {\n taskType: 'code_change' | 'task_complete' | 'file_modified' | 'frame_closed';\n files: string[];\n frameId: string;\n frameName: string;\n changes: {\n added: number;\n removed: number;\n modified: number;\n };\n metadata: Record<string, any>;\n}\n\nexport interface QualityGateResult {\n gate: string;\n passed: boolean;\n output: string;\n duration: number;\n issues?: QualityIssue[];\n}\n\nexport interface QualityIssue {\n type: 'test_failure' | 'lint_error' | 'coverage_low' | 'review_concern';\n file: string;\n line?: number;\n message: string;\n severity: 'error' | 'warning' | 'info';\n}\n\nexport class PostTaskHooks extends EventEmitter {\n private config: PostTaskConfig;\n private frameManager: FrameManager;\n private dbManager: DatabaseManager;\n private isActive: boolean = false;\n private lastProcessedFrame?: string;\n\n constructor(\n frameManager: FrameManager,\n dbManager: DatabaseManager,\n config: Partial<PostTaskConfig>\n ) {\n super();\n this.frameManager = frameManager;\n this.dbManager = dbManager;\n\n // Default configuration\n this.config = {\n projectRoot: process.cwd(),\n qualityGates: {\n runTests: true,\n requireTestCoverage: false,\n runCodeReview: true,\n runLinter: true,\n blockOnFailure: false,\n },\n testFrameworks: {\n detected: [],\n },\n reviewConfig: {\n reviewOnEveryChange: false,\n reviewOnTaskComplete: true,\n focusAreas: [\n 'security',\n 'performance',\n 'maintainability',\n 'correctness',\n ],\n skipPatterns: ['*.test.ts', '*.spec.js', 'dist/', 'node_modules/'],\n },\n ...config,\n };\n }\n\n /**\n * Initialize post-task hooks\n */\n async initialize(): Promise<void> {\n if (this.isActive) return;\n\n // Detect test frameworks and commands\n await this.detectTestFrameworks();\n\n // Set up frame event listeners\n this.setupFrameListeners();\n\n // Set up file watchers for code changes\n await this.setupFileWatchers();\n\n this.isActive = true;\n console.log('\u2705 Post-task hooks initialized');\n this.emit('initialized', this.config);\n }\n\n /**\n * Detect available test frameworks and commands\n */\n private async detectTestFrameworks(): Promise<void> {\n const packageJsonPath = path.join(this.config.projectRoot, 'package.json');\n\n try {\n const packageJson = JSON.parse(\n await fs.readFile(packageJsonPath, 'utf-8')\n );\n const scripts = packageJson.scripts || {};\n const dependencies = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n // Detect test frameworks\n const frameworks: string[] = [];\n if (dependencies.jest) frameworks.push('jest');\n if (dependencies.vitest) frameworks.push('vitest');\n if (dependencies.mocha) frameworks.push('mocha');\n if (dependencies.playwright) frameworks.push('playwright');\n if (dependencies.cypress) frameworks.push('cypress');\n\n this.config.testFrameworks.detected = frameworks;\n\n // Detect commands\n if (scripts.test) {\n this.config.testFrameworks.testCommand = 'npm test';\n } else if (scripts['test:run']) {\n this.config.testFrameworks.testCommand = 'npm run test:run';\n }\n\n if (scripts.coverage) {\n this.config.testFrameworks.coverageCommand = 'npm run coverage';\n }\n\n if (scripts.lint) {\n this.config.testFrameworks.lintCommand = 'npm run lint';\n }\n } catch (error: unknown) {\n console.warn('Could not detect test frameworks:', error);\n }\n }\n\n /**\n * Set up frame event listeners\n */\n private setupFrameListeners(): void {\n // Listen for frame closures (task completion)\n this.frameManager.on(\n 'frame:closed',\n async (frameId: string, frameData: any) => {\n if (frameData.type === 'task' || frameData.type === 'subtask') {\n await this.handleTaskCompletion({\n taskType: 'task_complete',\n frameId,\n frameName: frameData.name || 'Unnamed task',\n files: this.extractFilesFromFrame(frameData),\n changes: this.calculateChanges(frameData),\n metadata: frameData.metadata || {},\n });\n }\n }\n );\n\n // Listen for significant events\n this.frameManager.on(\n 'frame:event',\n async (frameId: string, eventType: string, data: any) => {\n if (eventType === 'code_change' || eventType === 'file_modified') {\n await this.handleTaskCompletion({\n taskType: 'code_change',\n frameId,\n frameName: data.description || 'Code change',\n files: data.files || [],\n changes: data.changes || { added: 0, removed: 0, modified: 1 },\n metadata: data,\n });\n }\n }\n );\n }\n\n /**\n * Set up file watchers for real-time code change detection\n */\n private async setupFileWatchers(): Promise<void> {\n try {\n const chokidar = await import('chokidar');\n\n const watcher = chokidar.watch(\n [\n '**/*.{ts,js,tsx,jsx,py,go,rs,java,cpp,c}',\n '!node_modules/**',\n '!dist/**',\n '!build/**',\n ],\n {\n cwd: this.config.projectRoot,\n ignored: /node_modules/,\n persistent: true,\n }\n );\n\n let changeQueue: string[] = [];\n let debounceTimer: NodeJS.Timeout | null = null;\n\n watcher.on('change', (filePath: string) => {\n changeQueue.push(filePath);\n\n // Debounce to avoid too many triggers\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(async () => {\n if (changeQueue.length > 0) {\n await this.handleFileChanges([...changeQueue]);\n changeQueue = [];\n }\n }, 2000); // 2 second debounce\n });\n } catch (error: unknown) {\n console.warn('File watching not available:', error);\n }\n }\n\n /**\n * Handle task completion events\n */\n private async handleTaskCompletion(\n event: TaskCompletionEvent\n ): Promise<void> {\n // Avoid duplicate processing\n if (\n this.lastProcessedFrame === event.frameId &&\n event.taskType !== 'code_change'\n ) {\n return;\n }\n\n this.lastProcessedFrame = event.frameId;\n\n console.log(\n `\uD83D\uDD0D Task completed: ${event.frameName} (${event.files.length} files changed)`\n );\n this.emit('task:completed', event);\n\n // Run quality gates\n const results = await this.runQualityGates(event);\n\n // Check if gates passed\n const allPassed = results.every((r) => r.passed);\n\n if (allPassed) {\n console.log('\u2705 All quality gates passed');\n this.emit('quality:passed', { event, results });\n } else {\n console.log('\u26A0\uFE0F Quality gate failures detected');\n this.emit('quality:failed', { event, results });\n\n if (this.config.qualityGates.blockOnFailure) {\n await this.blockFurtherWork(results);\n }\n }\n\n // Record results in frame metadata\n await this.recordQualityResults(event.frameId, results);\n }\n\n /**\n * Handle file changes\n */\n private async handleFileChanges(files: string[]): Promise<void> {\n if (!this.config.reviewConfig.reviewOnEveryChange) return;\n\n // Filter out files that should be skipped\n const filteredFiles = files.filter((file) => {\n return !this.config.reviewConfig.skipPatterns.some((pattern) => {\n return file.includes(pattern.replace('*', ''));\n });\n });\n\n if (filteredFiles.length === 0) return;\n\n await this.handleTaskCompletion({\n taskType: 'file_modified',\n frameId: 'file-watcher',\n frameName: 'File changes detected',\n files: filteredFiles,\n changes: { added: 0, removed: 0, modified: filteredFiles.length },\n metadata: { trigger: 'file_watcher' },\n });\n }\n\n /**\n * Run all configured quality gates\n */\n private async runQualityGates(\n event: TaskCompletionEvent\n ): Promise<QualityGateResult[]> {\n const results: QualityGateResult[] = [];\n\n // Run linter first (fastest)\n if (this.config.qualityGates.runLinter) {\n results.push(await this.runLinter(event.files));\n }\n\n // Run tests (slower)\n if (this.config.qualityGates.runTests) {\n results.push(await this.runTests(event.files));\n }\n\n // Check test coverage\n if (this.config.qualityGates.requireTestCoverage) {\n results.push(await this.checkTestCoverage(event.files));\n }\n\n // Run code review (slowest, most thorough)\n if (this.config.qualityGates.runCodeReview) {\n results.push(await this.runCodeReview(event));\n }\n\n return results;\n }\n\n /**\n * Run linter on changed files\n */\n private async runLinter(files: string[]): Promise<QualityGateResult> {\n const start = Date.now();\n\n try {\n if (!this.config.testFrameworks.lintCommand) {\n return {\n gate: 'linter',\n passed: true,\n output: 'No lint command configured',\n duration: Date.now() - start,\n };\n }\n\n const output = execSync(this.config.testFrameworks.lintCommand, {\n cwd: this.config.projectRoot,\n encoding: 'utf-8',\n timeout: 30000, // 30 second timeout\n });\n\n return {\n gate: 'linter',\n passed: true,\n output,\n duration: Date.now() - start,\n };\n } catch (error: any) {\n return {\n gate: 'linter',\n passed: false,\n output: error.stdout || error.message,\n duration: Date.now() - start,\n issues: this.parseLintErrors(error.stdout || error.message),\n };\n }\n }\n\n /**\n * Run tests\n */\n private async runTests(files: string[]): Promise<QualityGateResult> {\n const start = Date.now();\n\n try {\n if (!this.config.testFrameworks.testCommand) {\n return {\n gate: 'tests',\n passed: true,\n output: 'No test command configured',\n duration: Date.now() - start,\n };\n }\n\n const output = execSync(this.config.testFrameworks.testCommand, {\n cwd: this.config.projectRoot,\n encoding: 'utf-8',\n timeout: 120000, // 2 minute timeout\n });\n\n return {\n gate: 'tests',\n passed: true,\n output,\n duration: Date.now() - start,\n };\n } catch (error: any) {\n return {\n gate: 'tests',\n passed: false,\n output: error.stdout || error.message,\n duration: Date.now() - start,\n issues: this.parseTestFailures(error.stdout || error.message),\n };\n }\n }\n\n /**\n * Check test coverage\n */\n private async checkTestCoverage(files: string[]): Promise<QualityGateResult> {\n const start = Date.now();\n\n try {\n if (!this.config.testFrameworks.coverageCommand) {\n return {\n gate: 'coverage',\n passed: true,\n output: 'No coverage command configured',\n duration: Date.now() - start,\n };\n }\n\n const output = execSync(this.config.testFrameworks.coverageCommand, {\n cwd: this.config.projectRoot,\n encoding: 'utf-8',\n timeout: 120000,\n });\n\n // Parse coverage percentage (simplified)\n const coverageMatch = output.match(/(\\d+\\.?\\d*)%/);\n const coverage = coverageMatch ? parseFloat(coverageMatch[1]) : 0;\n const threshold = 80; // 80% coverage threshold\n\n return {\n gate: 'coverage',\n passed: coverage >= threshold,\n output,\n duration: Date.now() - start,\n issues:\n coverage < threshold\n ? [\n {\n type: 'coverage_low',\n file: 'overall',\n message: `Coverage ${coverage}% is below threshold ${threshold}%`,\n severity: 'warning' as const,\n },\n ]\n : undefined,\n };\n } catch (error: any) {\n return {\n gate: 'coverage',\n passed: false,\n output: error.stdout || error.message,\n duration: Date.now() - start,\n issues: [\n {\n type: 'coverage_low',\n file: 'overall',\n message: 'Coverage check failed',\n severity: 'error' as const,\n },\n ],\n };\n }\n }\n\n /**\n * Run code review using AI agent\n */\n private async runCodeReview(\n event: TaskCompletionEvent\n ): Promise<QualityGateResult> {\n const start = Date.now();\n\n try {\n // This would integrate with the code review agent\n const reviewPrompt = this.generateCodeReviewPrompt(event);\n\n // For now, simulate a review (in real implementation, call agent)\n const review = await this.callCodeReviewAgent(reviewPrompt, event.files);\n\n return {\n gate: 'code_review',\n passed: !review.issues || review.issues.length === 0,\n output: review.summary,\n duration: Date.now() - start,\n issues: review.issues,\n };\n } catch (error: any) {\n return {\n gate: 'code_review',\n passed: false,\n output: `Code review failed: ${error.message}`,\n duration: Date.now() - start,\n };\n }\n }\n\n /**\n * Generate code review prompt\n */\n private generateCodeReviewPrompt(event: TaskCompletionEvent): string {\n return `\nPlease review the following code changes:\n\nTask: ${event.frameName}\nFiles changed: ${event.files.join(', ')}\nChanges: +${event.changes.added}, -${event.changes.removed}, ~${event.changes.modified}\n\nFocus areas: ${this.config.reviewConfig.focusAreas.join(', ')}\n\nPlease check for:\n1. Security vulnerabilities\n2. Performance issues \n3. Code maintainability\n4. Correctness and logic errors\n5. Best practices adherence\n\nProvide specific, actionable feedback.\n`;\n }\n\n /**\n * Call code review agent (placeholder for actual implementation)\n */\n private async callCodeReviewAgent(\n prompt: string,\n files: string[]\n ): Promise<{\n summary: string;\n issues?: QualityIssue[];\n }> {\n // This would integrate with Claude Code's agent system\n // For now, return a mock review\n return {\n summary: `Reviewed ${files.length} files. Code quality looks good.`,\n issues: [],\n };\n }\n\n /**\n * Parse lint errors into structured issues\n */\n private parseLintErrors(output: string): QualityIssue[] {\n const issues: QualityIssue[] = [];\n\n // Simple parser for common lint formats\n const lines = output.split('\\n');\n for (const line of lines) {\n const match = line.match(\n /^(.+?):(\\d+):(\\d+):\\s*(error|warning):\\s*(.+)$/\n );\n if (match) {\n issues.push({\n type: 'lint_error',\n file: match[1],\n line: parseInt(match[2]),\n message: match[5],\n severity: match[4] as 'error' | 'warning',\n });\n }\n }\n\n return issues;\n }\n\n /**\n * Parse test failures into structured issues\n */\n private parseTestFailures(output: string): QualityIssue[] {\n const issues: QualityIssue[] = [];\n\n // Simple parser for test failures\n const lines = output.split('\\n');\n for (const line of lines) {\n if (line.includes('FAIL') || line.includes('\u2717')) {\n issues.push({\n type: 'test_failure',\n file: 'unknown',\n message: line.trim(),\n severity: 'error',\n });\n }\n }\n\n return issues;\n }\n\n /**\n * Block further work when quality gates fail\n */\n private async blockFurtherWork(results: QualityGateResult[]): Promise<void> {\n const failedGates = results.filter((r) => !r.passed);\n\n console.log('\uD83D\uDEAB Quality gates failed - blocking further work:');\n failedGates.forEach((gate) => {\n console.log(` ${gate.gate}: ${gate.output}`);\n if (gate.issues) {\n gate.issues.forEach((issue) => {\n console.log(\n ` - ${issue.severity}: ${issue.message} (${issue.file}:${issue.line || 0})`\n );\n });\n }\n });\n\n console.log('\\n\uD83D\uDD27 Fix these issues before continuing:');\n const allIssues = failedGates.flatMap((g) => g.issues || []);\n allIssues.forEach((issue, i) => {\n console.log(`${i + 1}. ${issue.message}`);\n });\n }\n\n /**\n * Record quality results in frame metadata\n */\n private async recordQualityResults(\n frameId: string,\n results: QualityGateResult[]\n ): Promise<void> {\n try {\n const frame = await this.frameManager.getFrame(frameId);\n if (frame) {\n frame.metadata = {\n ...frame.metadata,\n qualityGates: {\n timestamp: new Date().toISOString(),\n results,\n passed: results.every((r) => r.passed),\n totalDuration: results.reduce((sum, r) => sum + r.duration, 0),\n },\n };\n\n // Update frame with quality results\n await this.frameManager.updateFrame(frameId, frame);\n }\n } catch (error: unknown) {\n console.error('Failed to record quality results:', error);\n }\n }\n\n /**\n * Extract files from frame data\n */\n private extractFilesFromFrame(frameData: any): string[] {\n // Extract file paths from various possible locations\n const files: string[] = [];\n\n if (frameData.metadata?.files) {\n files.push(...frameData.metadata.files);\n }\n\n if (frameData.events) {\n frameData.events.forEach((event: any) => {\n if (event.type === 'file_change' && event.data?.file) {\n files.push(event.data.file);\n }\n });\n }\n\n return [...new Set(files)]; // Remove duplicates\n }\n\n /**\n * Calculate changes from frame data\n */\n private calculateChanges(frameData: any): {\n added: number;\n removed: number;\n modified: number;\n } {\n return {\n added: frameData.metadata?.linesAdded || 0,\n removed: frameData.metadata?.linesRemoved || 0,\n modified: frameData.metadata?.filesModified || 1,\n };\n }\n\n /**\n * Stop post-task hooks\n */\n async stop(): Promise<void> {\n this.isActive = false;\n this.removeAllListeners();\n console.log('\uD83D\uDED1 Post-task hooks stopped');\n }\n\n /**\n * Get current configuration\n */\n getConfig(): PostTaskConfig {\n return { ...this.config };\n }\n\n /**\n * Update configuration\n */\n updateConfig(updates: Partial<PostTaskConfig>): void {\n this.config = { ...this.config, ...updates };\n this.emit('config:updated', this.config);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/integrations/claude-code/subagent-client-stub.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Stub implementation of ClaudeCodeSubagentClient for testing\n * Used when child_process is not available (e.g., in tests)\n */\n\nexport interface SubagentRequest {\n type: string;\n task: string;\n context: Record<string, any>;\n}\n\nexport interface SubagentResponse {\n success: boolean;\n result: any;\n error?: string;\n tokens?: number;\n}\n\nexport class ClaudeCodeSubagentClient {\n async executeSubagent(request: SubagentRequest): Promise<SubagentResponse> {\n // Stub implementation for testing\n return {\n success: true,\n result: {\n message: `Stub execution of ${request.type} agent`,\n task: request.task,\n },\n tokens: 100,\n };\n }\n}"],
|
|
5
|
-
"mappings": ";;;;AAkBO,MAAM,yBAAyB;AAAA,EACpC,MAAM,gBAAgB,SAAqD;AAEzE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,QACN,SAAS,qBAAqB,QAAQ,IAAI;AAAA,QAC1C,MAAM,QAAQ;AAAA,MAChB;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/integrations/claude-code/subagent-client.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Claude Code Subagent Client\n * \n * Uses Claude Code's Task tool to spawn subagents instead of direct API calls\n * This leverages the Claude Code Max plan for unlimited subagent execution\n */\n\nimport { logger } from '../../core/monitoring/logger.js';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nconst execAsync = promisify(exec);\n\nexport interface SubagentRequest {\n type: 'planning' | 'code' | 'testing' | 'linting' | 'review' | 'improve' | 'context' | 'publish';\n task: string;\n context: Record<string, any>;\n systemPrompt?: string;\n files?: string[];\n timeout?: number;\n}\n\nexport interface SubagentResponse {\n success: boolean;\n result: any;\n output?: string;\n error?: string;\n tokens?: number;\n duration: number;\n subagentType: string;\n}\n\n/**\n * Claude Code Subagent Client\n * Spawns subagents using Claude Code's Task tool\n */\nexport class ClaudeCodeSubagentClient {\n private tempDir: string;\n private activeSubagents: Map<string, AbortController> = new Map();\n private mockMode: boolean;\n \n constructor(mockMode: boolean = true) { // Default to mock mode for testing\n this.mockMode = mockMode;\n \n // Create temp directory for subagent communication\n this.tempDir = path.join(os.tmpdir(), 'stackmemory-rlm');\n if (!fs.existsSync(this.tempDir)) {\n fs.mkdirSync(this.tempDir, { recursive: true });\n }\n \n logger.info('Claude Code Subagent Client initialized', {\n tempDir: this.tempDir,\n mockMode: this.mockMode,\n });\n }\n \n /**\n * Execute a subagent task using Claude Code's Task tool\n * This will spawn a new Claude instance with specific instructions\n */\n async executeSubagent(request: SubagentRequest): Promise<SubagentResponse> {\n const startTime = Date.now();\n const subagentId = `${request.type}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n \n logger.info(`Spawning ${request.type} subagent`, {\n subagentId,\n task: request.task.slice(0, 100),\n mockMode: this.mockMode,\n });\n \n // Return mock responses for testing\n if (this.mockMode) {\n return this.getMockResponse(request, startTime, subagentId);\n }\n \n try {\n // Create subagent prompt based on type\n const prompt = this.buildSubagentPrompt(request);\n \n // Write context to temp file for large contexts\n const contextFile = path.join(this.tempDir, `${subagentId}-context.json`);\n await fs.promises.writeFile(\n contextFile,\n JSON.stringify(request.context, null, 2)\n );\n \n // Create result file path\n const resultFile = path.join(this.tempDir, `${subagentId}-result.json`);\n \n // Build the Task tool command\n // The Task tool will spawn a new Claude instance with the specified prompt\n const taskCommand = this.buildTaskCommand(request, prompt, contextFile, resultFile);\n \n // Execute via Claude Code's Task tool\n const result = await this.executeTaskTool(taskCommand, request.timeout);\n \n // Read result from file\n let subagentResult: any = {};\n if (fs.existsSync(resultFile)) {\n const resultContent = await fs.promises.readFile(resultFile, 'utf-8');\n try {\n subagentResult = JSON.parse(resultContent);\n } catch (e) {\n subagentResult = { rawOutput: resultContent };\n }\n }\n \n // Cleanup temp files\n this.cleanup(subagentId);\n \n return {\n success: true,\n result: subagentResult,\n output: result.stdout,\n duration: Date.now() - startTime,\n subagentType: request.type,\n tokens: this.estimateTokens(prompt + JSON.stringify(subagentResult)),\n };\n \n } catch (error: any) {\n logger.error(`Subagent execution failed: ${request.type}`, { error, subagentId });\n \n return {\n success: false,\n result: null,\n error: error.message,\n duration: Date.now() - startTime,\n subagentType: request.type,\n };\n }\n }\n \n /**\n * Execute multiple subagents in parallel\n */\n async executeParallel(requests: SubagentRequest[]): Promise<SubagentResponse[]> {\n logger.info(`Executing ${requests.length} subagents in parallel`);\n \n const promises = requests.map(request => this.executeSubagent(request));\n const results = await Promise.allSettled(promises);\n \n return results.map((result, index) => {\n if (result.status === 'fulfilled') {\n return result.value;\n } else {\n return {\n success: false,\n result: null,\n error: result.reason?.message || 'Unknown error',\n duration: 0,\n subagentType: requests[index].type,\n };\n }\n });\n }\n \n /**\n * Build subagent prompt based on type\n */\n private buildSubagentPrompt(request: SubagentRequest): string {\n const prompts: Record<string, string> = {\n planning: `You are a Planning Subagent. Your role is to decompose complex tasks into manageable subtasks.\n \n Task: ${request.task}\n \n Instructions:\n 1. Analyze the task and identify all components\n 2. Create a dependency graph of subtasks\n 3. Assign appropriate agent types to each subtask\n 4. Consider parallel execution opportunities\n 5. Include comprehensive testing at each stage\n \n Context is available in the provided file.\n \n Output a JSON structure with the task decomposition.`,\n \n code: `You are a Code Generation Subagent. Your role is to implement high-quality, production-ready code.\n \n Task: ${request.task}\n \n Instructions:\n 1. Write clean, maintainable code\n 2. Follow project conventions (check context)\n 3. Include comprehensive error handling\n 4. Add clear comments for complex logic\n 5. Ensure code is testable\n \n Context and requirements are in the provided file.\n \n Output the implementation code.`,\n \n testing: `You are a Testing Subagent specializing in comprehensive test generation.\n \n Task: ${request.task}\n \n Instructions:\n 1. Generate unit tests for all functions/methods\n 2. Create integration tests for API endpoints\n 3. Add E2E tests for critical user flows\n 4. Include edge cases and error scenarios\n 5. Ensure high code coverage (aim for 100%)\n 6. Validate that all tests pass\n \n Context and code to test are in the provided file.\n \n Output a complete test suite.`,\n \n linting: `You are a Linting Subagent ensuring code quality and standards.\n \n Task: ${request.task}\n \n Instructions:\n 1. Check for syntax errors and type issues\n 2. Verify code formatting and style\n 3. Identify security vulnerabilities\n 4. Find performance anti-patterns\n 5. Detect unused imports and dead code\n 6. Provide specific fixes for each issue\n \n Code to analyze is in the context file.\n \n Output a JSON report with issues and fixes.`,\n \n review: `You are a Code Review Subagent performing thorough multi-stage reviews.\n \n Task: ${request.task}\n \n Instructions:\n 1. Evaluate architecture and design patterns\n 2. Assess code quality and maintainability\n 3. Check performance implications\n 4. Review security considerations\n 5. Verify test coverage adequacy\n 6. Suggest specific improvements with examples\n 7. Rate quality on a 0-1 scale\n \n Code and context are in the provided file.\n \n Output a detailed review with quality score and improvements.`,\n \n improve: `You are an Improvement Subagent enhancing code based on reviews.\n \n Task: ${request.task}\n \n Instructions:\n 1. Implement all suggested improvements\n 2. Refactor for better architecture\n 3. Optimize performance bottlenecks\n 4. Enhance error handling\n 5. Improve code clarity and documentation\n 6. Add missing test cases\n 7. Ensure backward compatibility\n \n Review feedback and code are in the context file.\n \n Output the improved code.`,\n \n context: `You are a Context Retrieval Subagent finding relevant information.\n \n Task: ${request.task}\n \n Instructions:\n 1. Search project codebase for relevant code\n 2. Find similar implementations\n 3. Locate relevant documentation\n 4. Identify dependencies and patterns\n 5. Retrieve best practices\n \n Search parameters are in the context file.\n \n Output relevant context snippets.`,\n \n publish: `You are a Publishing Subagent handling releases and deployments.\n \n Task: ${request.task}\n \n Instructions:\n 1. Prepare package for publishing\n 2. Update version numbers\n 3. Generate changelog\n 4. Create GitHub release\n 5. Publish to NPM if applicable\n 6. Update documentation\n \n Release details are in the context file.\n \n Output the release plan and commands.`,\n };\n \n return request.systemPrompt || prompts[request.type] || prompts.planning;\n }\n \n /**\n * Build Task tool command\n * This creates a command that Claude Code's Task tool can execute\n */\n private buildTaskCommand(\n request: SubagentRequest,\n prompt: string,\n contextFile: string,\n resultFile: string\n ): string {\n // Create a script that the subagent will execute\n const scriptContent = `\n#!/bin/bash\n# Subagent execution script for ${request.type}\n\n# Read context\nCONTEXT=$(cat \"${contextFile}\")\n\n# Execute task based on type\ncase \"${request.type}\" in\n \"testing\")\n # For testing subagent, actually run tests\n echo \"Generating and running tests...\"\n # The subagent will generate test files and run them\n ;;\n \"linting\")\n # For linting subagent, run actual linters\n echo \"Running linters...\"\n npm run lint || true\n ;;\n \"code\")\n # For code generation, create implementation files\n echo \"Generating implementation...\"\n ;;\n *)\n # Default behavior\n echo \"Executing ${request.type} task...\"\n ;;\nesac\n\n# Write result\necho '{\"status\": \"completed\", \"type\": \"${request.type}\"}' > \"${resultFile}\"\n`;\n \n const scriptFile = path.join(this.tempDir, `${request.type}-script.sh`);\n fs.writeFileSync(scriptFile, scriptContent);\n fs.chmodSync(scriptFile, '755');\n \n // Return the command that Task tool will execute\n // In practice, this would trigger Claude Code's Task tool\n return scriptFile;\n }\n \n /**\n * Execute via Task tool (simulated for now)\n * In production, this would use Claude Code's actual Task tool API\n */\n private async executeTaskTool(\n command: string,\n timeout?: number\n ): Promise<{ stdout: string; stderr: string }> {\n try {\n // In production, this would call Claude Code's Task tool\n // For now, we simulate with a subprocess\n const result = await execAsync(command, {\n timeout: timeout || 300000, // 5 minutes default\n maxBuffer: 10 * 1024 * 1024, // 10MB buffer\n });\n \n return result;\n } catch (error: any) {\n if (error.killed || error.signal === 'SIGTERM') {\n throw new Error(`Subagent timeout after ${timeout}ms`);\n }\n throw error;\n }\n }\n \n /**\n * Get mock response for testing\n */\n private async getMockResponse(\n request: SubagentRequest, \n startTime: number, \n subagentId: string\n ): Promise<SubagentResponse> {\n // Simulate some processing time\n await new Promise(resolve => setTimeout(resolve, Math.random() * 20 + 10));\n \n const mockResponses: Record<string, any> = {\n planning: {\n tasks: [\n { id: 'task-1', name: 'Analyze requirements', type: 'analysis' },\n { id: 'task-2', name: 'Design solution', type: 'design' },\n { id: 'task-3', name: 'Implement solution', type: 'implementation' },\n ],\n dependencies: [],\n estimated_time: 300,\n },\n \n code: {\n implementation: `function greetUser(name: string): string {\n if (!name || typeof name !== 'string') {\n throw new Error('Invalid name parameter');\n }\n return \\`Hello, \\${name}!\\`;\n}`,\n files_modified: ['src/greet.ts'],\n lines_added: 6,\n lines_removed: 0,\n },\n \n testing: {\n tests: [\n {\n name: 'greetUser should return greeting',\n code: `test('greetUser should return greeting', () => {\n expect(greetUser('Alice')).toBe('Hello, Alice!');\n});`,\n type: 'unit',\n },\n ],\n coverage: { lines: 100, branches: 100, functions: 100 },\n },\n \n linting: {\n issues: [],\n fixes: [],\n passed: true,\n },\n \n review: {\n quality: 0.85,\n issues: [\n 'Consider adding JSDoc comments',\n 'Could add more edge case tests',\n ],\n suggestions: [\n 'Add documentation for the function',\n 'Consider adding internationalization support',\n 'Add performance tests for large inputs',\n ],\n improvements: [],\n },\n \n improve: {\n improved_code: `/**\n * Greets a user with their name\n * @param name - The name of the user to greet\n * @returns A greeting message\n * @throws {Error} If name is invalid\n */\nfunction greetUser(name: string): string {\n if (!name || typeof name !== 'string') {\n throw new Error('Invalid name parameter: name must be a non-empty string');\n }\n return \\`Hello, \\${name}!\\`;\n}`,\n changes_made: [\n 'Added JSDoc documentation',\n 'Improved error message',\n ],\n },\n \n context: {\n relevant_files: ['src/greet.ts', 'test/greet.test.ts'],\n patterns: ['greeting functions', 'input validation'],\n dependencies: [],\n },\n \n publish: {\n version: '1.0.0',\n changelog: 'Initial release',\n published: false,\n reason: 'Mock mode - no actual publishing',\n },\n };\n \n const result = mockResponses[request.type] || {};\n \n return {\n success: true,\n result,\n output: `Mock ${request.type} subagent completed successfully`,\n duration: Date.now() - startTime,\n subagentType: request.type,\n tokens: this.estimateTokens(JSON.stringify(result)),\n };\n }\n \n /**\n * Estimate token usage\n */\n private estimateTokens(text: string): number {\n // Rough estimation: 1 token \u2248 4 characters\n return Math.ceil(text.length / 4);\n }\n \n /**\n * Cleanup temporary files\n */\n private cleanup(subagentId: string): void {\n const patterns = [\n `${subagentId}-context.json`,\n `${subagentId}-result.json`,\n `${subagentId}-script.sh`,\n ];\n \n for (const pattern of patterns) {\n const filePath = path.join(this.tempDir, pattern);\n if (fs.existsSync(filePath)) {\n try {\n fs.unlinkSync(filePath);\n } catch (e) {\n // Ignore cleanup errors\n }\n }\n }\n }\n \n /**\n * Create a mock Task tool response for development\n * This simulates what Claude Code's Task tool would return\n */\n async mockTaskToolExecution(request: SubagentRequest): Promise<SubagentResponse> {\n const startTime = Date.now();\n \n // Simulate processing delay\n await new Promise(resolve => setTimeout(resolve, 1000 + Math.random() * 2000));\n \n // Generate mock responses based on subagent type\n const mockResponses: Record<string, any> = {\n planning: {\n tasks: [\n { id: '1', type: 'analyze', description: 'Analyze requirements' },\n { id: '2', type: 'implement', description: 'Implement solution' },\n { id: '3', type: 'test', description: 'Test implementation' },\n { id: '4', type: 'review', description: 'Review and improve' },\n ],\n dependencies: { '2': ['1'], '3': ['2'], '4': ['3'] },\n },\n code: {\n implementation: `\nexport class Solution {\n constructor(private config: any) {}\n \n async execute(input: string): Promise<string> {\n // Implementation generated by Code subagent\n return this.process(input);\n }\n \n private process(input: string): string {\n return \\`Processed: \\${input}\\`;\n }\n}`,\n files: ['src/solution.ts'],\n },\n testing: {\n tests: `\ndescribe('Solution', () => {\n it('should process input correctly', () => {\n const solution = new Solution({});\n const result = solution.execute('test');\n expect(result).toBe('Processed: test');\n });\n \n it('should handle edge cases', () => {\n // Edge case tests\n });\n});`,\n coverage: { lines: 95, branches: 88, functions: 100 },\n },\n review: {\n quality: 0.82,\n issues: [\n { severity: 'high', message: 'Missing error handling' },\n { severity: 'medium', message: 'Could improve type safety' },\n ],\n suggestions: [\n 'Add try-catch blocks',\n 'Use stricter TypeScript types',\n 'Add input validation',\n ],\n },\n };\n \n return {\n success: true,\n result: mockResponses[request.type] || { status: 'completed' },\n output: `Mock ${request.type} subagent completed successfully`,\n duration: Date.now() - startTime,\n subagentType: request.type,\n tokens: Math.floor(Math.random() * 5000) + 1000,\n };\n }\n \n /**\n * Get active subagent statistics\n */\n getStats() {\n return {\n activeSubagents: this.activeSubagents.size,\n tempDir: this.tempDir,\n };\n }\n \n /**\n * Cleanup all resources\n */\n async cleanupAll(): Promise<void> {\n // Abort all active subagents\n for (const [id, controller] of this.activeSubagents) {\n controller.abort();\n }\n this.activeSubagents.clear();\n \n // Clean temp directory\n if (fs.existsSync(this.tempDir)) {\n const files = await fs.promises.readdir(this.tempDir);\n for (const file of files) {\n await fs.promises.unlink(path.join(this.tempDir, file));\n }\n }\n \n logger.info('Claude Code Subagent Client cleaned up');\n }\n}"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/integrations/claude-code/task-coordinator.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Claude Code Task Coordinator\n *\n * Coordinates task execution between StackMemory and Claude Code's Task tool.\n * Handles agent invocation, result processing, and error recovery.\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { ClaudeCodeAgent } from './agent-bridge.js';\n\nexport interface TaskExecution {\n id: string;\n agentName: string;\n agentType: 'oracle' | 'worker' | 'reviewer';\n prompt: string;\n startTime: number;\n endTime?: number;\n status: 'pending' | 'running' | 'completed' | 'failed';\n result?: string;\n error?: string;\n retryCount: number;\n estimatedCost: number;\n actualTokens?: number;\n}\n\nexport interface CoordinationMetrics {\n totalTasks: number;\n completedTasks: number;\n failedTasks: number;\n averageExecutionTime: number;\n totalCost: number;\n successRate: number;\n agentUtilization: Record<string, number>;\n}\n\n/**\n * Claude Code Task Coordinator\n * Manages task execution and coordination with Claude Code agents\n */\nexport class ClaudeCodeTaskCoordinator {\n private activeTasks: Map<string, TaskExecution> = new Map();\n private completedTasks: TaskExecution[] = [];\n private metrics: CoordinationMetrics;\n\n constructor() {\n this.metrics = {\n totalTasks: 0,\n completedTasks: 0,\n failedTasks: 0,\n averageExecutionTime: 0,\n totalCost: 0,\n successRate: 0,\n agentUtilization: {},\n };\n }\n\n /**\n * Execute task with Claude Code agent\n */\n async executeTask(\n agentName: string,\n agentConfig: ClaudeCodeAgent,\n prompt: string,\n options: {\n maxRetries?: number;\n timeout?: number;\n priority?: 'low' | 'medium' | 'high';\n } = {}\n ): Promise<string> {\n const taskId = uuidv4();\n const { maxRetries = 2, timeout = 300000, priority = 'medium' } = options;\n\n const task: TaskExecution = {\n id: taskId,\n agentName,\n agentType: agentConfig.type,\n prompt,\n startTime: Date.now(),\n status: 'pending',\n retryCount: 0,\n estimatedCost: this.estimateTaskCost(prompt, agentConfig),\n };\n\n this.activeTasks.set(taskId, task);\n this.metrics.totalTasks++;\n\n logger.info('Starting Claude Code task execution', {\n taskId,\n agentName,\n agentType: agentConfig.type,\n promptLength: prompt.length,\n estimatedCost: task.estimatedCost,\n priority,\n });\n\n try {\n // Execute with retries\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n task.retryCount = attempt;\n task.status = 'running';\n\n // Execute the task with timeout\n const result = await this.executeWithTimeout(\n () => this.invokeClaudeCodeAgent(agentName, prompt, agentConfig),\n timeout\n );\n\n // Task completed successfully\n task.status = 'completed';\n task.result = result;\n task.endTime = Date.now();\n task.actualTokens = this.estimateTokenUsage(prompt, result);\n\n this.completeTask(task);\n return result;\n } catch (error) {\n lastError = error as Error;\n task.status = 'failed';\n\n logger.warn(`Claude Code task attempt ${attempt + 1} failed`, {\n taskId,\n agentName,\n error: lastError.message,\n attempt: attempt + 1,\n maxRetries: maxRetries + 1,\n });\n\n // Don't retry if it's the last attempt\n if (attempt === maxRetries) {\n break;\n }\n\n // Wait before retry with exponential backoff\n const backoffMs = Math.min(1000 * Math.pow(2, attempt), 10000);\n await new Promise((resolve) => setTimeout(resolve, backoffMs));\n }\n }\n\n // All retries exhausted\n task.error = lastError?.message || 'Unknown error';\n task.endTime = Date.now();\n this.failTask(task, lastError!);\n throw lastError;\n } finally {\n this.activeTasks.delete(taskId);\n }\n }\n\n /**\n * Execute multiple tasks in parallel with coordination\n */\n async executeParallelTasks(\n tasks: {\n agentName: string;\n agentConfig: ClaudeCodeAgent;\n prompt: string;\n priority?: 'low' | 'medium' | 'high';\n }[]\n ): Promise<{ results: string[]; failures: Error[] }> {\n logger.info('Executing parallel Claude Code tasks', {\n taskCount: tasks.length,\n agents: tasks.map((t) => t.agentName),\n });\n\n // Group tasks by priority\n const priorityGroups = {\n high: tasks.filter((t) => t.priority === 'high'),\n medium: tasks.filter((t) => t.priority === 'medium'),\n low: tasks.filter((t) => t.priority === 'low'),\n };\n\n const results: string[] = [];\n const failures: Error[] = [];\n\n // Execute high priority tasks first\n for (const priorityLevel of ['high', 'medium', 'low'] as const) {\n const priorityTasks = priorityGroups[priorityLevel];\n if (priorityTasks.length === 0) continue;\n\n logger.info(`Executing ${priorityLevel} priority tasks`, {\n count: priorityTasks.length,\n });\n\n // Execute tasks in this priority level concurrently\n const promises = priorityTasks.map(async (task) => {\n try {\n const result = await this.executeTask(\n task.agentName,\n task.agentConfig,\n task.prompt,\n { priority: task.priority }\n );\n return { success: true, result };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n });\n\n const outcomes = await Promise.allSettled(promises);\n\n for (const outcome of outcomes) {\n if (outcome.status === 'fulfilled') {\n if (outcome.value.success) {\n results.push(outcome.value.result);\n } else {\n failures.push(outcome.value.error);\n }\n } else {\n failures.push(new Error(outcome.reason));\n }\n }\n }\n\n logger.info('Parallel task execution completed', {\n totalTasks: tasks.length,\n successful: results.length,\n failed: failures.length,\n successRate: ((results.length / tasks.length) * 100).toFixed(1),\n });\n\n return { results, failures };\n }\n\n /**\n * Get coordination metrics and health status\n */\n getCoordinationMetrics(): CoordinationMetrics & {\n activeTasks: number;\n recentErrors: string[];\n performanceTrend: 'improving' | 'stable' | 'degrading';\n } {\n // Calculate recent error rate for performance trend\n const recentTasks = this.completedTasks.slice(-10);\n const recentErrorRate =\n recentTasks.length > 0\n ? recentTasks.filter((t) => t.status === 'failed').length /\n recentTasks.length\n : 0;\n\n const performanceTrend =\n recentErrorRate < 0.1\n ? 'improving'\n : recentErrorRate < 0.3\n ? 'stable'\n : 'degrading';\n\n const recentErrors = this.completedTasks\n .slice(-5)\n .filter((t) => t.status === 'failed')\n .map((t) => t.error || 'Unknown error');\n\n return {\n ...this.metrics,\n activeTasks: this.activeTasks.size,\n recentErrors,\n performanceTrend,\n };\n }\n\n /**\n * Clean up resources and reset metrics\n */\n async cleanup(): Promise<void> {\n logger.info('Cleaning up Claude Code Task Coordinator', {\n activeTasks: this.activeTasks.size,\n completedTasks: this.completedTasks.length,\n });\n\n // Wait for active tasks to complete or force cleanup after timeout\n if (this.activeTasks.size > 0) {\n const timeoutPromise = new Promise((resolve) =>\n setTimeout(resolve, 30000)\n );\n const completionPromise = this.waitForTaskCompletion();\n\n await Promise.race([completionPromise, timeoutPromise]);\n\n if (this.activeTasks.size > 0) {\n logger.warn('Force terminating active tasks', {\n remainingTasks: this.activeTasks.size,\n });\n }\n }\n\n this.activeTasks.clear();\n this.completedTasks = [];\n this.resetMetrics();\n }\n\n /**\n * Execute with timeout wrapper\n */\n private async executeWithTimeout<T>(\n fn: () => Promise<T>,\n timeoutMs: number\n ): Promise<T> {\n let timer: ReturnType<typeof setTimeout>;\n const timeoutPromise = new Promise<T>((_, reject) => {\n timer = setTimeout(() => {\n reject(new Error(`Task execution timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([fn(), timeoutPromise]);\n } finally {\n clearTimeout(timer!);\n }\n }\n\n /**\n * Invoke Claude Code agent (integration point)\n */\n private async invokeClaudeCodeAgent(\n agentName: string,\n prompt: string,\n agentConfig: ClaudeCodeAgent\n ): Promise<string> {\n logger.debug('Invoking Claude Code agent', {\n agentName,\n agentType: agentConfig.type,\n promptTokens: this.estimateTokenUsage(prompt, ''),\n });\n\n // TODO: Replace with actual Claude Code Task tool invocation\n // This is where we would call Claude Code's Task tool:\n /*\n const result = await claudeCodeTask({\n subagent_type: agentName,\n prompt: prompt,\n description: `${agentConfig.type} task execution`\n });\n \n return result.output;\n */\n\n // For now, simulate the Claude Code agent execution\n return this.simulateClaudeCodeExecution(agentName, prompt, agentConfig);\n }\n\n /**\n * Simulate Claude Code execution (temporary until real integration)\n */\n private simulateClaudeCodeExecution(\n agentName: string,\n prompt: string,\n agentConfig: ClaudeCodeAgent\n ): Promise<string> {\n return new Promise((resolve) => {\n // Simulate execution time based on agent type and complexity\n const executionTime =\n agentConfig.type === 'oracle'\n ? 2000 + Math.random() * 3000 // 2-5 seconds for Oracle\n : 1000 + Math.random() * 2000; // 1-3 seconds for Workers\n\n setTimeout(() => {\n const result = `Claude Code agent '${agentName}' completed task successfully.\n \nAgent Capabilities Used: ${agentConfig.capabilities.slice(0, 3).join(', ')}\nTask Type: ${agentConfig.type}\nSpecializations: ${agentConfig.specializations.join(', ')}\n\nSimulated output based on prompt context: ${prompt.substring(0, 100)}...\n\nThis simulation will be replaced with actual Claude Code Task tool integration.`;\n\n resolve(result);\n }, executionTime);\n });\n }\n\n /**\n * Complete a successful task\n */\n private completeTask(task: TaskExecution): void {\n this.completedTasks.push({ ...task });\n this.metrics.completedTasks++;\n\n // Update metrics\n this.updateExecutionMetrics(task);\n this.updateAgentUtilization(task.agentName);\n this.updateSuccessRate();\n\n logger.info('Claude Code task completed', {\n taskId: task.id,\n agentName: task.agentName,\n executionTime: task.endTime! - task.startTime,\n retries: task.retryCount,\n cost: this.calculateActualCost(task),\n });\n }\n\n /**\n * Handle a failed task\n */\n private failTask(task: TaskExecution, error: Error): void {\n this.completedTasks.push({ ...task });\n this.metrics.failedTasks++;\n\n this.updateExecutionMetrics(task);\n this.updateSuccessRate();\n\n logger.error('Claude Code task failed', {\n taskId: task.id,\n agentName: task.agentName,\n error: error.message,\n retries: task.retryCount,\n executionTime: task.endTime! - task.startTime,\n });\n }\n\n /**\n * Update execution time metrics\n */\n private updateExecutionMetrics(task: TaskExecution): void {\n if (!task.endTime) return;\n\n const executionTime = task.endTime - task.startTime;\n const totalTasks = this.metrics.completedTasks + this.metrics.failedTasks;\n\n if (totalTasks === 1) {\n this.metrics.averageExecutionTime = executionTime;\n } else {\n this.metrics.averageExecutionTime =\n (this.metrics.averageExecutionTime * (totalTasks - 1) + executionTime) /\n totalTasks;\n }\n\n this.metrics.totalCost += this.calculateActualCost(task);\n }\n\n /**\n * Update agent utilization metrics\n */\n private updateAgentUtilization(agentName: string): void {\n this.metrics.agentUtilization[agentName] =\n (this.metrics.agentUtilization[agentName] || 0) + 1;\n }\n\n /**\n * Update success rate\n */\n private updateSuccessRate(): void {\n const total = this.metrics.completedTasks + this.metrics.failedTasks;\n this.metrics.successRate =\n total > 0 ? this.metrics.completedTasks / total : 0;\n }\n\n /**\n * Estimate task cost based on prompt and agent\n */\n private estimateTaskCost(\n prompt: string,\n agentConfig: ClaudeCodeAgent\n ): number {\n const estimatedTokens = this.estimateTokenUsage(prompt, '');\n const baseCost = agentConfig.type === 'oracle' ? 0.015 : 0.00025; // per 1K tokens\n return (estimatedTokens / 1000) * baseCost * agentConfig.costMultiplier;\n }\n\n /**\n * Estimate token usage\n */\n private estimateTokenUsage(prompt: string, response: string): number {\n // Rough estimation: ~4 characters per token\n return Math.ceil((prompt.length + response.length) / 4);\n }\n\n /**\n * Calculate actual task cost\n */\n private calculateActualCost(task: TaskExecution): number {\n if (!task.actualTokens) return task.estimatedCost;\n\n const baseCost = task.agentType === 'oracle' ? 0.015 : 0.00025;\n return (task.actualTokens / 1000) * baseCost;\n }\n\n /**\n * Wait for all active tasks to complete\n */\n private async waitForTaskCompletion(): Promise<void> {\n while (this.activeTasks.size > 0) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n\n /**\n * Reset metrics\n */\n private resetMetrics(): void {\n this.metrics = {\n totalTasks: 0,\n completedTasks: 0,\n failedTasks: 0,\n averageExecutionTime: 0,\n totalCost: 0,\n successRate: 0,\n agentUtilization: {},\n };\n }\n\n /**\n * Get active task status\n */\n getActiveTaskStatus(): {\n taskId: string;\n agentName: string;\n status: string;\n runtime: number;\n }[] {\n return Array.from(this.activeTasks.values()).map((task) => ({\n taskId: task.id,\n agentName: task.agentName,\n status: task.status,\n runtime: Date.now() - task.startTime,\n }));\n }\n\n /**\n * Cancel active task\n */\n async cancelTask(taskId: string): Promise<boolean> {\n const task = this.activeTasks.get(taskId);\n if (!task) return false;\n\n task.status = 'failed';\n task.error = 'Task cancelled by user';\n task.endTime = Date.now();\n\n this.failTask(task, new Error('Task cancelled'));\n this.activeTasks.delete(taskId);\n\n logger.info('Task cancelled', { taskId, agentName: task.agentName });\n return true;\n }\n}\n\nexport default ClaudeCodeTaskCoordinator;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/integrations/diffmem/client.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * DiffMem API Client\n * Handles communication with the DiffMem memory service\n */\n\nimport type {\n UserMemory,\n MemoryQuery,\n LearnedInsight,\n DiffMemStatus,\n} from './types.js';\nimport type { DiffMemIntegrationConfig } from './config.js';\nimport { DEFAULT_DIFFMEM_CONFIG } from './config.js';\n\nexport class DiffMemClientError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n public readonly statusCode?: number\n ) {\n super(message);\n this.name = 'DiffMemClientError';\n }\n}\n\nexport class DiffMemClient {\n private readonly endpoint: string;\n private readonly userId: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n\n constructor(config: Partial<DiffMemIntegrationConfig> = {}) {\n const mergedConfig = { ...DEFAULT_DIFFMEM_CONFIG, ...config };\n this.endpoint = mergedConfig.endpoint.replace(/\\/$/, '');\n this.userId = mergedConfig.userId;\n this.timeout = mergedConfig.timeout;\n this.maxRetries = mergedConfig.maxRetries;\n }\n\n private async request<T>(\n path: string,\n options: RequestInit = {}\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const response = await fetch(`${this.endpoint}${path}`, {\n ...options,\n signal: controller.signal,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => '');\n throw new DiffMemClientError(\n `Request failed: ${response.statusText}`,\n 'HTTP_ERROR',\n response.status\n );\n }\n\n return (await response.json()) as T;\n } catch (error) {\n lastError = error as Error;\n\n if (error instanceof DiffMemClientError) {\n throw error;\n }\n\n if ((error as Error).name === 'AbortError') {\n throw new DiffMemClientError('Request timeout', 'TIMEOUT');\n }\n\n // Retry on network errors\n if (attempt < this.maxRetries) {\n await new Promise((resolve) =>\n setTimeout(resolve, Math.pow(2, attempt) * 100)\n );\n continue;\n }\n }\n }\n\n clearTimeout(timeoutId);\n throw new DiffMemClientError(\n lastError?.message || 'Request failed after retries',\n 'NETWORK_ERROR'\n );\n }\n\n /**\n * Get user context/memories from DiffMem\n * Maps to POST /memory/{user_id}/context\n */\n async getMemories(query: MemoryQuery = {}): Promise<UserMemory[]> {\n try {\n // DiffMem uses conversation-based context retrieval\n const conversation = query.query\n ? [{ role: 'user', content: query.query }]\n : [{ role: 'user', content: 'What do you know about me?' }];\n\n const response = await this.request<{\n status: string;\n context?: string;\n entities?: Array<{ id: string; content: string; score?: number }>;\n }>(`/memory/${this.userId}/context`, {\n method: 'POST',\n body: JSON.stringify({\n conversation,\n depth: 'wide',\n }),\n });\n\n // Transform DiffMem response to UserMemory format\n if (response.entities) {\n return response.entities.slice(0, query.limit || 10).map((entity) => ({\n id: entity.id,\n content: entity.content,\n category: 'project_knowledge' as const,\n confidence: entity.score || 0.7,\n timestamp: Date.now(),\n }));\n }\n\n return [];\n } catch {\n return [];\n }\n }\n\n /**\n * Store an insight/learning in DiffMem\n * Maps to POST /memory/{user_id}/process-and-commit\n */\n async storeInsight(insight: LearnedInsight): Promise<{ id: string }> {\n const response = await this.request<{\n status: string;\n session_id?: string;\n }>(`/memory/${this.userId}/process-and-commit`, {\n method: 'POST',\n body: JSON.stringify({\n memory_input: `[${insight.category}] ${insight.content}`,\n session_id: `sm-${Date.now()}`,\n session_date: new Date().toISOString().split('T')[0],\n }),\n });\n\n return { id: response.session_id || `insight-${Date.now()}` };\n }\n\n /**\n * Search memories in DiffMem\n * Maps to POST /memory/{user_id}/search\n */\n async search(query: MemoryQuery): Promise<UserMemory[]> {\n try {\n const response = await this.request<{\n status: string;\n results?: Array<{\n score: number;\n snippet: { id: string; content: string; file_path?: string };\n }>;\n }>(`/memory/${this.userId}/search`, {\n method: 'POST',\n body: JSON.stringify({\n query: query.query || '',\n k: query.limit || 10,\n }),\n });\n\n if (response.results) {\n return response.results.map((result) => ({\n id: result.snippet.id,\n content: result.snippet.content,\n category: 'project_knowledge' as const,\n confidence: result.score,\n timestamp: Date.now(),\n metadata: { filePath: result.snippet.file_path },\n }));\n }\n\n return [];\n } catch {\n return [];\n }\n }\n\n /**\n * Get DiffMem server status\n * Maps to GET /health\n */\n async getStatus(): Promise<DiffMemStatus> {\n try {\n const health = await this.request<{\n status: string;\n active_contexts?: number;\n version?: string;\n }>('/health', { method: 'GET' });\n\n return {\n connected: health.status === 'healthy',\n memoryCount: health.active_contexts || 0,\n lastSync: Date.now(),\n version: health.version,\n };\n } catch {\n return {\n connected: false,\n memoryCount: 0,\n lastSync: null,\n };\n }\n }\n\n /**\n * Batch sync multiple insights\n * Processes each insight individually since DiffMem doesn't have batch API\n */\n async batchSync(\n insights: LearnedInsight[]\n ): Promise<{ synced: number; failed: number }> {\n if (insights.length === 0) {\n return { synced: 0, failed: 0 };\n }\n\n let synced = 0;\n let failed = 0;\n\n for (const insight of insights) {\n try {\n await this.storeInsight(insight);\n synced++;\n } catch {\n failed++;\n }\n }\n\n return { synced, failed };\n }\n\n /**\n * Onboard a new user in DiffMem\n */\n async onboardUser(userInfo: string): Promise<{ success: boolean }> {\n try {\n const response = await this.request<{ status: string }>(\n `/memory/${this.userId}/onboard`,\n {\n method: 'POST',\n body: JSON.stringify({\n user_info: userInfo,\n session_id: `onboard-${Date.now()}`,\n }),\n }\n );\n\n return { success: response.status === 'success' };\n } catch {\n return { success: false };\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/integrations/diffmem/config.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * DiffMem Integration Configuration\n */\n\nexport interface DiffMemIntegrationConfig {\n endpoint: string;\n userId: string;\n timeout: number;\n maxRetries: number;\n enabled: boolean;\n}\n\nexport const DEFAULT_DIFFMEM_CONFIG: DiffMemIntegrationConfig = {\n endpoint: process.env.DIFFMEM_ENDPOINT || 'http://localhost:8000',\n userId: process.env.DIFFMEM_USER_ID || 'default',\n timeout: 5000,\n maxRetries: 3,\n enabled:\n process.env.DIFFMEM_ENABLED === 'true' || !!process.env.DIFFMEM_ENDPOINT,\n};\n"],
|
|
5
|
-
"mappings": ";;;;AAYO,MAAM,yBAAmD;AAAA,EAC9D,UAAU,QAAQ,IAAI,oBAAoB;AAAA,EAC1C,QAAQ,QAAQ,IAAI,mBAAmB;AAAA,EACvC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SACE,QAAQ,IAAI,oBAAoB,UAAU,CAAC,CAAC,QAAQ,IAAI;AAC5D;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/integrations/diffmem/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * DiffMem Integration\n * User memory management for StackMemory\n */\n\nexport type {\n UserMemory,\n MemoryQuery,\n LearnedInsight,\n DiffMemStatus,\n} from './types.js';\n\nexport type { DiffMemIntegrationConfig } from './config.js';\nexport { DEFAULT_DIFFMEM_CONFIG } from './config.js';\n\nexport { DiffMemClient, DiffMemClientError } from './client.js';\n"],
|
|
5
|
-
"mappings": ";;;;AAaA,SAAS,8BAA8B;AAEvC,SAAS,eAAe,0BAA0B;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/integrations/linear/auth.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Linear OAuth Authentication Setup\n * Handles initial OAuth flow and token management for Linear integration\n */\n\nimport { createHash, randomBytes } from 'crypto';\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { IntegrationError, ErrorCode } from '../../core/errors/index.js';\n\nexport interface LinearAuthConfig {\n clientId: string;\n clientSecret: string;\n redirectUri: string;\n scopes: string[];\n}\n\nexport interface LinearTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt: number; // Unix timestamp\n scope: string[];\n}\n\nexport interface LinearAuthResult {\n accessToken: string;\n refreshToken?: string;\n expiresIn: number;\n scope: string;\n tokenType: string;\n}\n\nexport class LinearAuthManager {\n private configPath: string;\n private tokensPath: string;\n private config?: LinearAuthConfig;\n\n constructor(projectRoot: string) {\n const configDir = join(projectRoot, '.stackmemory');\n this.configPath = join(configDir, 'linear-config.json');\n this.tokensPath = join(configDir, 'linear-tokens.json');\n }\n\n /**\n * Check if Linear integration is configured\n */\n isConfigured(): boolean {\n return existsSync(this.configPath) && existsSync(this.tokensPath);\n }\n\n /**\n * Save OAuth application configuration\n */\n saveConfig(config: LinearAuthConfig): void {\n writeFileSync(this.configPath, JSON.stringify(config, null, 2));\n this.config = config;\n logger.info('Linear OAuth configuration saved');\n }\n\n /**\n * Load OAuth configuration\n */\n loadConfig(): LinearAuthConfig | null {\n if (!existsSync(this.configPath)) {\n return null;\n }\n\n try {\n const configData = readFileSync(this.configPath, 'utf8');\n this.config = JSON.parse(configData);\n return this.config!;\n } catch (error: unknown) {\n logger.error('Failed to load Linear configuration:', error as Error);\n return null;\n }\n }\n\n /**\n * Generate OAuth authorization URL with PKCE\n */\n generateAuthUrl(state?: string): { url: string; codeVerifier: string } {\n if (!this.config) {\n throw new IntegrationError(\n 'Linear OAuth configuration not loaded',\n ErrorCode.LINEAR_AUTH_FAILED\n );\n }\n\n // Generate PKCE parameters\n const codeVerifier = randomBytes(32).toString('base64url');\n const codeChallenge = createHash('sha256')\n .update(codeVerifier)\n .digest('base64url');\n\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n response_type: 'code',\n scope: this.config.scopes.join(' '),\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n actor: 'app', // Enable actor authorization for service accounts\n });\n\n if (state) {\n params.set('state', state);\n }\n\n const authUrl = `https://linear.app/oauth/authorize?${params.toString()}`;\n\n return { url: authUrl, codeVerifier };\n }\n\n /**\n * Exchange authorization code for access token\n */\n async exchangeCodeForToken(\n authCode: string,\n codeVerifier: string\n ): Promise<LinearTokens> {\n if (!this.config) {\n throw new IntegrationError(\n 'Linear OAuth configuration not loaded',\n ErrorCode.LINEAR_AUTH_FAILED\n );\n }\n\n const tokenUrl = 'https://api.linear.app/oauth/token';\n\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n redirect_uri: this.config.redirectUri,\n code: authCode,\n code_verifier: codeVerifier,\n });\n\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new IntegrationError(\n `Token exchange failed: ${response.status}`,\n ErrorCode.LINEAR_AUTH_FAILED,\n { status: response.status, body: errorText }\n );\n }\n\n const result = (await response.json()) as LinearAuthResult;\n\n // Calculate expiration time (tokens expire in 24 hours)\n const expiresAt = Date.now() + result.expiresIn * 1000;\n\n const tokens: LinearTokens = {\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n expiresAt,\n scope: result.scope.split(' '),\n };\n\n this.saveTokens(tokens);\n return tokens;\n }\n\n /**\n * Refresh access token using refresh token\n */\n async refreshAccessToken(): Promise<LinearTokens> {\n if (!this.config) {\n throw new IntegrationError(\n 'Linear OAuth configuration not loaded',\n ErrorCode.LINEAR_AUTH_FAILED\n );\n }\n\n const currentTokens = this.loadTokens();\n if (!currentTokens?.refreshToken) {\n throw new IntegrationError(\n 'No refresh token available',\n ErrorCode.LINEAR_AUTH_FAILED\n );\n }\n\n const tokenUrl = 'https://api.linear.app/oauth/token';\n\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n refresh_token: currentTokens.refreshToken,\n });\n\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new IntegrationError(\n `Token refresh failed: ${response.status}`,\n ErrorCode.LINEAR_AUTH_FAILED,\n { status: response.status, body: errorText }\n );\n }\n\n const result = (await response.json()) as LinearAuthResult;\n\n const tokens: LinearTokens = {\n accessToken: result.accessToken,\n refreshToken: result.refreshToken || currentTokens.refreshToken,\n expiresAt: Date.now() + result.expiresIn * 1000,\n scope: result.scope.split(' '),\n };\n\n this.saveTokens(tokens);\n return tokens;\n }\n\n /**\n * Get valid access token (refresh if needed)\n */\n async getValidToken(): Promise<string> {\n const tokens = this.loadTokens();\n if (!tokens) {\n throw new IntegrationError(\n 'No Linear tokens found. Please complete OAuth setup.',\n ErrorCode.LINEAR_AUTH_FAILED\n );\n }\n\n // Check if token expires in next 5 minutes\n const fiveMinutes = 5 * 60 * 1000;\n if (tokens.expiresAt - Date.now() < fiveMinutes) {\n logger.info('Linear token expiring soon, refreshing...');\n const newTokens = await this.refreshAccessToken();\n return newTokens.accessToken;\n }\n\n return tokens.accessToken;\n }\n\n /**\n * Save tokens to file\n */\n private saveTokens(tokens: LinearTokens): void {\n writeFileSync(this.tokensPath, JSON.stringify(tokens, null, 2));\n logger.info('Linear tokens saved');\n }\n\n /**\n * Load tokens from file\n */\n loadTokens(): LinearTokens | null {\n if (!existsSync(this.tokensPath)) {\n return null;\n }\n\n try {\n const tokensData = readFileSync(this.tokensPath, 'utf8');\n return JSON.parse(tokensData);\n } catch (error: unknown) {\n logger.error('Failed to load Linear tokens:', error as Error);\n return null;\n }\n }\n\n /**\n * Clear stored tokens and config\n */\n clearAuth(): void {\n if (existsSync(this.tokensPath)) {\n writeFileSync(this.tokensPath, '');\n }\n if (existsSync(this.configPath)) {\n writeFileSync(this.configPath, '');\n }\n logger.info('Linear authentication cleared');\n }\n}\n\n/**\n * Default Linear OAuth scopes for task management\n */\nexport const DEFAULT_LINEAR_SCOPES = [\n 'read', // Read issues, projects, teams\n 'write', // Create and update issues\n 'admin', // Manage team settings and workflows\n];\n\n/**\n * Linear OAuth setup helper\n */\nexport class LinearOAuthSetup {\n private authManager: LinearAuthManager;\n\n constructor(projectRoot: string) {\n this.authManager = new LinearAuthManager(projectRoot);\n }\n\n /**\n * Interactive setup for Linear OAuth\n */\n async setupInteractive(): Promise<{\n authUrl: string;\n instructions: string[];\n }> {\n // For now, we'll provide manual setup instructions\n // In a full implementation, this could open a browser or use a local server\n\n const config: LinearAuthConfig = {\n clientId: process.env['LINEAR_CLIENT_ID'] || '',\n clientSecret: process.env['LINEAR_CLIENT_SECRET'] || '',\n redirectUri:\n process.env['LINEAR_REDIRECT_URI'] ||\n 'http://localhost:3456/auth/linear/callback',\n scopes: DEFAULT_LINEAR_SCOPES,\n };\n\n if (!config.clientId || !config.clientSecret) {\n return {\n authUrl: '',\n instructions: [\n '1. Create a Linear OAuth application at https://linear.app/settings/api',\n '2. Set redirect URI to: http://localhost:3456/auth/linear/callback',\n '3. Copy your Client ID and Client Secret',\n '4. Set environment variables:',\n ' export LINEAR_CLIENT_ID=\"your_client_id\"',\n ' export LINEAR_CLIENT_SECRET=\"your_client_secret\"',\n '5. Re-run this setup command',\n ],\n };\n }\n\n this.authManager.saveConfig(config);\n\n const { url, codeVerifier } = this.authManager.generateAuthUrl();\n\n // Store code verifier temporarily (in a real app, this would be in a secure session store)\n process.env['_LINEAR_CODE_VERIFIER'] = codeVerifier;\n\n return {\n authUrl: url,\n instructions: [\n '1. Open this URL in your browser:',\n url,\n '',\n '2. Approve the StackMemory integration',\n '3. Copy the authorization code from the redirect URL',\n '4. Run: stackmemory linear authorize <code>',\n ],\n };\n }\n\n /**\n * Complete OAuth flow with authorization code\n */\n async completeAuth(authCode: string): Promise<boolean> {\n try {\n const codeVerifier = process.env['_LINEAR_CODE_VERIFIER'];\n if (!codeVerifier) {\n throw new IntegrationError(\n 'Code verifier not found. Please restart the setup process.',\n ErrorCode.LINEAR_AUTH_FAILED\n );\n }\n\n await this.authManager.exchangeCodeForToken(authCode, codeVerifier);\n delete process.env['_LINEAR_CODE_VERIFIER'];\n\n logger.info('Linear OAuth setup completed successfully!');\n return true;\n } catch (error: unknown) {\n logger.error('Failed to complete Linear OAuth setup:', error as Error);\n return false;\n }\n }\n\n /**\n * Test the Linear connection\n */\n async testConnection(): Promise<boolean> {\n try {\n const token = await this.authManager.getValidToken();\n\n // Test with a simple GraphQL query\n const response = await fetch('https://api.linear.app/graphql', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query: 'query { viewer { id name email } }',\n }),\n });\n\n if (response.ok) {\n const result = (await response.json()) as {\n data?: { viewer?: { id: string; name: string; email: string } };\n };\n if (result.data?.viewer) {\n logger.info(\n `Connected to Linear as: ${result.data.viewer.name} (${result.data.viewer.email})`\n );\n return true;\n }\n }\n\n return false;\n } catch (error: unknown) {\n logger.error('Linear connection test failed:', error as Error);\n return false;\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/integrations/linear/auto-sync.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Linear Auto-Sync Service\n * Background service for automatic bidirectional synchronization\n */\n\nimport { logger } from '../../core/monitoring/logger.js';\nimport { LinearTaskManager } from '../../features/tasks/linear-task-manager.js';\nimport { LinearAuthManager } from './auth.js';\nimport { LinearSyncEngine, DEFAULT_SYNC_CONFIG, SyncConfig } from './sync.js';\nimport { LinearConfigManager } from './config.js';\nimport { IntegrationError, ErrorCode } from '../../core/errors/index.js';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\nexport interface AutoSyncConfig extends SyncConfig {\n enabled: boolean;\n interval: number; // minutes\n retryAttempts: number;\n retryDelay: number; // milliseconds\n quietHours?: {\n start: number; // hour 0-23\n end: number; // hour 0-23\n };\n}\n\nexport class LinearAutoSyncService {\n private config: AutoSyncConfig;\n private projectRoot: string;\n private configManager: LinearConfigManager;\n private syncEngine?: LinearSyncEngine;\n private intervalId?: NodeJS.Timeout;\n private isRunning = false;\n private lastSyncTime = 0;\n private retryCount = 0;\n\n constructor(projectRoot: string, config?: Partial<AutoSyncConfig>) {\n this.projectRoot = projectRoot;\n this.configManager = new LinearConfigManager(projectRoot);\n\n // Load persisted config or use defaults\n const persistedConfig = this.configManager.loadConfig();\n const baseConfig = persistedConfig\n ? this.configManager.toAutoSyncConfig(persistedConfig)\n : {\n ...DEFAULT_SYNC_CONFIG,\n enabled: true,\n interval: 5,\n retryAttempts: 3,\n retryDelay: 30000,\n autoSync: true,\n direction: 'bidirectional' as const,\n conflictResolution: 'newest_wins' as const,\n quietHours: { start: 22, end: 7 },\n };\n\n this.config = { ...baseConfig, ...config };\n\n // Save any new config updates\n if (config && Object.keys(config).length > 0) {\n this.configManager.saveConfig(config);\n }\n }\n\n /**\n * Start the auto-sync service\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n logger.warn('Linear auto-sync service is already running');\n return;\n }\n\n try {\n // Verify Linear integration is configured\n const authManager = new LinearAuthManager(this.projectRoot);\n if (!authManager.isConfigured()) {\n throw new IntegrationError(\n 'Linear integration not configured. Run \"stackmemory linear setup\" first.',\n ErrorCode.LINEAR_AUTH_FAILED\n );\n }\n\n // Initialize sync engine\n const dbPath = join(this.projectRoot, '.stackmemory', 'context.db');\n if (!existsSync(dbPath)) {\n throw new IntegrationError(\n 'StackMemory not initialized. Run \"stackmemory init\" first.',\n ErrorCode.LINEAR_SYNC_FAILED\n );\n }\n\n const db = new Database(dbPath);\n const taskStore = new LinearTaskManager(this.projectRoot, db);\n\n this.syncEngine = new LinearSyncEngine(\n taskStore,\n authManager,\n this.config\n );\n\n // Test connection before starting\n const token = await authManager.getValidToken();\n if (!token) {\n throw new IntegrationError(\n 'Unable to get valid Linear token. Check authentication.',\n ErrorCode.LINEAR_AUTH_FAILED\n );\n }\n\n this.isRunning = true;\n this.scheduleNextSync();\n\n logger.info('Linear auto-sync service started', {\n interval: this.config.interval,\n direction: this.config.direction,\n conflictResolution: this.config.conflictResolution,\n });\n\n // Perform initial sync\n this.performSync();\n } catch (error: unknown) {\n logger.error('Failed to start Linear auto-sync service:', error as Error);\n throw error;\n }\n }\n\n /**\n * Stop the auto-sync service\n */\n stop(): void {\n if (this.intervalId) {\n clearTimeout(this.intervalId);\n this.intervalId = undefined;\n }\n\n this.isRunning = false;\n logger.info('Linear auto-sync service stopped');\n }\n\n /**\n * Get service status\n */\n getStatus(): {\n running: boolean;\n lastSyncTime: number;\n nextSyncTime?: number;\n retryCount: number;\n config: AutoSyncConfig;\n } {\n const nextSyncTime = this.intervalId\n ? this.lastSyncTime + this.config.interval * 60 * 1000\n : undefined;\n\n return {\n running: this.isRunning,\n lastSyncTime: this.lastSyncTime,\n nextSyncTime,\n retryCount: this.retryCount,\n config: this.config,\n };\n }\n\n /**\n * Update configuration\n */\n updateConfig(newConfig: Partial<AutoSyncConfig>): void {\n this.config = { ...this.config, ...newConfig };\n\n if (this.isRunning) {\n // Restart with new config\n this.stop();\n this.start();\n }\n\n logger.info('Linear auto-sync config updated', newConfig);\n }\n\n /**\n * Force immediate sync\n */\n async forceSync(): Promise<void> {\n if (!this.syncEngine) {\n throw new IntegrationError(\n 'Sync engine not initialized',\n ErrorCode.LINEAR_SYNC_FAILED\n );\n }\n\n logger.info('Forcing immediate Linear sync');\n await this.performSync();\n }\n\n /**\n * Schedule next sync based on configuration\n */\n private scheduleNextSync(): void {\n if (!this.isRunning) return;\n\n const delay = this.config.interval * 60 * 1000; // Convert minutes to milliseconds\n\n this.intervalId = setTimeout(() => {\n if (this.isRunning) {\n this.performSync();\n }\n }, delay);\n }\n\n /**\n * Perform synchronization with error handling and retries\n */\n private async performSync(): Promise<void> {\n if (!this.syncEngine) {\n logger.error('Sync engine not available');\n return;\n }\n\n // Check quiet hours\n if (this.isInQuietHours()) {\n logger.debug('Skipping sync during quiet hours');\n this.scheduleNextSync();\n return;\n }\n\n try {\n logger.debug('Starting Linear auto-sync');\n\n const result = await this.syncEngine.sync();\n\n if (result.success) {\n this.lastSyncTime = Date.now();\n this.retryCount = 0;\n\n // Log sync results\n const hasChanges =\n result.synced.toLinear > 0 ||\n result.synced.fromLinear > 0 ||\n result.synced.updated > 0;\n\n if (hasChanges) {\n logger.info('Linear auto-sync completed with changes', {\n toLinear: result.synced.toLinear,\n fromLinear: result.synced.fromLinear,\n updated: result.synced.updated,\n conflicts: result.conflicts.length,\n });\n } else {\n logger.debug('Linear auto-sync completed - no changes');\n }\n\n // Handle conflicts\n if (result.conflicts.length > 0) {\n logger.warn('Linear sync conflicts detected', {\n count: result.conflicts.length,\n conflicts: result.conflicts.map((c) => ({\n taskId: c.taskId,\n reason: c.reason,\n })),\n });\n }\n } else {\n throw new IntegrationError(\n `Sync failed: ${result.errors.join(', ')}`,\n ErrorCode.LINEAR_SYNC_FAILED\n );\n }\n } catch (error: unknown) {\n logger.error('Linear auto-sync failed:', error as Error);\n\n this.retryCount++;\n\n if (this.retryCount <= this.config.retryAttempts) {\n logger.info(\n `Retrying Linear sync in ${this.config.retryDelay / 1000}s (attempt ${this.retryCount}/${this.config.retryAttempts})`\n );\n\n // Schedule retry\n setTimeout(() => {\n if (this.isRunning) {\n this.performSync();\n }\n }, this.config.retryDelay);\n\n return; // Don't schedule next sync yet\n } else {\n logger.error(\n `Linear auto-sync failed after ${this.config.retryAttempts} attempts, skipping until next interval`\n );\n this.retryCount = 0;\n }\n }\n\n // Schedule next sync\n this.scheduleNextSync();\n }\n\n /**\n * Check if current time is within quiet hours\n */\n private isInQuietHours(): boolean {\n if (!this.config.quietHours) return false;\n\n const now = new Date();\n const currentHour = now.getHours();\n const { start, end } = this.config.quietHours;\n\n if (start < end) {\n // Quiet hours within same day (e.g., 22:00 - 07:00 next day)\n return currentHour >= start || currentHour < end;\n } else {\n // Quiet hours span midnight (e.g., 10:00 - 18:00)\n return currentHour >= start && currentHour < end;\n }\n }\n}\n\n/**\n * Global auto-sync service instance\n */\nlet autoSyncService: LinearAutoSyncService | null = null;\n\n/**\n * Initialize global auto-sync service\n */\nexport function initializeAutoSync(\n projectRoot: string,\n config?: Partial<AutoSyncConfig>\n): LinearAutoSyncService {\n if (autoSyncService) {\n autoSyncService.stop();\n }\n\n autoSyncService = new LinearAutoSyncService(projectRoot, config);\n return autoSyncService;\n}\n\n/**\n * Get global auto-sync service\n */\nexport function getAutoSyncService(): LinearAutoSyncService | null {\n return autoSyncService;\n}\n\n/**\n * Stop global auto-sync service\n */\nexport function stopAutoSync(): void {\n if (autoSyncService) {\n autoSyncService.stop();\n autoSyncService = null;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/integrations/linear/client.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Linear API Client for StackMemory\n * Handles bi-directional sync with Linear's GraphQL API\n */\n\nimport { logger } from '../../core/monitoring/logger.js';\nimport { IntegrationError, ErrorCode } from '../../core/errors/index.js';\n\nexport interface LinearConfig {\n apiKey: string;\n teamId?: string;\n webhookSecret?: string;\n baseUrl?: string;\n // If true, send Authorization header as `Bearer <apiKey>` (OAuth access token)\n useBearer?: boolean;\n // Optional callback to refresh token on 401 and return the new access token\n onUnauthorized?: () => Promise<string>;\n}\n\nexport interface LinearIssue {\n id: string;\n identifier: string; // Like \"SM-123\"\n title: string;\n description?: string;\n state: {\n id: string;\n name: string;\n type: 'backlog' | 'unstarted' | 'started' | 'completed' | 'cancelled';\n };\n priority: number; // 0-4 (0=none, 1=urgent, 2=high, 3=medium, 4=low)\n assignee?: {\n id: string;\n name: string;\n email: string;\n };\n estimate?: number; // Story points\n labels: Array<{\n id: string;\n name: string;\n }>;\n createdAt: string;\n updatedAt: string;\n url: string;\n}\n\nexport interface LinearCreateIssueInput {\n title: string;\n description?: string;\n teamId: string;\n priority?: number;\n estimate?: number;\n labelIds?: string[];\n}\n\ninterface RateLimitState {\n remaining: number;\n resetAt: number;\n retryAfter: number;\n}\n\nexport class LinearClient {\n private config: LinearConfig;\n private baseUrl: string;\n private rateLimitState: RateLimitState = {\n remaining: 1500, // Linear's default limit\n resetAt: Date.now() + 3600000,\n retryAfter: 0,\n };\n private requestQueue: Array<() => Promise<void>> = [];\n private isProcessingQueue = false;\n private minRequestInterval = 100; // Minimum ms between requests\n private lastRequestTime = 0;\n\n constructor(config: LinearConfig) {\n this.config = config;\n this.baseUrl = config.baseUrl || 'https://api.linear.app';\n\n if (!config.apiKey) {\n throw new IntegrationError(\n 'Linear API key is required',\n ErrorCode.LINEAR_AUTH_FAILED\n );\n }\n }\n\n /**\n * Wait for rate limit to reset if needed\n */\n private async waitForRateLimit(): Promise<void> {\n const now = Date.now();\n\n // Check if we're in a retry-after period\n if (this.rateLimitState.retryAfter > now) {\n const waitTime = this.rateLimitState.retryAfter - now;\n logger.warn(`Rate limited, waiting ${Math.ceil(waitTime / 1000)}s`);\n await this.sleep(waitTime);\n }\n\n // Check if we've exhausted our rate limit\n if (this.rateLimitState.remaining <= 5) {\n if (this.rateLimitState.resetAt > now) {\n const waitTime = this.rateLimitState.resetAt - now;\n logger.warn(\n `Rate limit nearly exhausted, waiting ${Math.ceil(waitTime / 1000)}s for reset`\n );\n await this.sleep(Math.min(waitTime, 60000)); // Max 60s wait\n }\n }\n\n // Ensure minimum interval between requests\n const timeSinceLastRequest = now - this.lastRequestTime;\n if (timeSinceLastRequest < this.minRequestInterval) {\n await this.sleep(this.minRequestInterval - timeSinceLastRequest);\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Update rate limit state from response headers\n */\n private updateRateLimitState(response: Response): void {\n const remaining = response.headers.get('x-ratelimit-remaining');\n const reset = response.headers.get('x-ratelimit-reset');\n const retryAfter = response.headers.get('retry-after');\n\n if (remaining !== null) {\n this.rateLimitState.remaining = parseInt(remaining, 10);\n }\n if (reset !== null) {\n this.rateLimitState.resetAt = parseInt(reset, 10) * 1000;\n }\n if (retryAfter !== null) {\n this.rateLimitState.retryAfter =\n Date.now() + parseInt(retryAfter, 10) * 1000;\n }\n }\n\n /**\n * Execute GraphQL query against Linear API with rate limiting\n */\n private async graphql<T>(\n query: string,\n variables?: Record<string, unknown>,\n retries = 3,\n allowAuthRefresh = true\n ): Promise<T> {\n // Wait for rate limit before making request\n await this.waitForRateLimit();\n\n this.lastRequestTime = Date.now();\n\n const authHeader = this.config.useBearer\n ? `Bearer ${this.config.apiKey}`\n : this.config.apiKey;\n\n let response = await fetch(`${this.baseUrl}/graphql`, {\n method: 'POST',\n headers: {\n Authorization: authHeader,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query,\n variables,\n }),\n });\n\n // Update rate limit state from response\n this.updateRateLimitState(response);\n\n // Handle unauthorized (e.g., expired OAuth token)\n if (\n response.status === 401 &&\n this.config.onUnauthorized &&\n allowAuthRefresh\n ) {\n try {\n const newToken = await this.config.onUnauthorized();\n // Update local config and retry once without further auth refresh\n this.config.apiKey = newToken;\n const retryHeader = this.config.useBearer\n ? `Bearer ${newToken}`\n : newToken;\n response = await fetch(`${this.baseUrl}/graphql`, {\n method: 'POST',\n headers: {\n Authorization: retryHeader,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ query, variables }),\n });\n this.updateRateLimitState(response);\n } catch (e: unknown) {\n // Fall through to standard error handling\n }\n }\n\n // Handle rate limiting with exponential backoff\n if (response.status === 429) {\n if (retries > 0) {\n const retryAfter = response.headers.get('retry-after');\n const waitTime = retryAfter ? parseInt(retryAfter, 10) * 1000 : 60000;\n logger.warn(\n `Rate limited (429), retrying in ${waitTime / 1000}s (${retries} retries left)`\n );\n this.rateLimitState.retryAfter = Date.now() + waitTime;\n await this.sleep(waitTime);\n return this.graphql<T>(query, variables, retries - 1, allowAuthRefresh);\n }\n throw new IntegrationError(\n 'Linear API rate limit exceeded after retries',\n ErrorCode.LINEAR_API_ERROR,\n { retries: 0 }\n );\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n // Don't log 401/403 - expected when not authenticated\n if (response.status !== 401 && response.status !== 403) {\n logger.error(\n 'Linear API error response:',\n new Error(`${response.status}: ${errorText}`)\n );\n }\n throw new IntegrationError(\n `Linear API error: ${response.status} ${response.statusText}`,\n ErrorCode.LINEAR_API_ERROR,\n {\n status: response.status,\n statusText: response.statusText,\n body: errorText,\n }\n );\n }\n\n const result = (await response.json()) as {\n data?: T;\n errors?: Array<{ message: string }>;\n };\n\n if (result.errors) {\n // Check for rate limit errors in GraphQL response\n const rateLimitError = result.errors.find(\n (e) =>\n e.message.toLowerCase().includes('rate limit') ||\n e.message.toLowerCase().includes('usage limit')\n );\n\n if (rateLimitError && retries > 0) {\n const waitTime = 60000; // Default 60s wait for GraphQL rate limit errors\n logger.warn(\n `GraphQL rate limit error, retrying in ${waitTime / 1000}s (${retries} retries left)`\n );\n this.rateLimitState.retryAfter = Date.now() + waitTime;\n await this.sleep(waitTime);\n return this.graphql<T>(query, variables, retries - 1);\n }\n\n logger.error('Linear GraphQL errors:', { errors: result.errors });\n throw new IntegrationError(\n `Linear GraphQL error: ${result.errors[0].message}`,\n ErrorCode.LINEAR_API_ERROR,\n { errors: result.errors }\n );\n }\n\n return result.data as T;\n }\n\n /**\n * Create a new issue in Linear\n */\n async createIssue(input: LinearCreateIssueInput): Promise<LinearIssue> {\n const mutation = `\n mutation CreateIssue($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n success\n issue {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n assignee {\n id\n name\n email\n }\n estimate\n labels {\n nodes {\n id\n name\n }\n }\n createdAt\n updatedAt\n url\n }\n }\n }\n `;\n\n const result = await this.graphql<{\n issueCreate: {\n success: boolean;\n issue: LinearIssue;\n };\n }>(mutation, { input });\n\n if (!result.issueCreate.success) {\n throw new IntegrationError(\n 'Failed to create Linear issue',\n ErrorCode.LINEAR_API_ERROR,\n { input }\n );\n }\n\n return result.issueCreate.issue;\n }\n\n /**\n * Update an existing Linear issue\n */\n async updateIssue(\n issueId: string,\n updates: Partial<LinearCreateIssueInput> & { stateId?: string }\n ): Promise<LinearIssue> {\n const mutation = `\n mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) {\n issueUpdate(id: $id, input: $input) {\n success\n issue {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n assignee {\n id\n name\n email\n }\n estimate\n labels {\n nodes {\n id\n name\n }\n }\n createdAt\n updatedAt\n url\n }\n }\n }\n `;\n\n const result = await this.graphql<{\n issueUpdate: {\n success: boolean;\n issue: LinearIssue;\n };\n }>(mutation, { id: issueId, input: updates });\n\n if (!result.issueUpdate.success) {\n throw new IntegrationError(\n `Failed to update Linear issue ${issueId}`,\n ErrorCode.LINEAR_API_ERROR,\n { issueId, updates }\n );\n }\n\n return result.issueUpdate.issue;\n }\n\n /**\n * Get issue by ID\n */\n async getIssue(issueId: string): Promise<LinearIssue | null> {\n const query = `\n query GetIssue($id: String!) {\n issue(id: $id) {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n assignee {\n id\n name\n email\n }\n estimate\n labels {\n nodes {\n id\n name\n }\n }\n createdAt\n updatedAt\n url\n }\n }\n `;\n\n const result = await this.graphql<{\n issue: LinearIssue | null;\n }>(query, { id: issueId });\n\n return result.issue;\n }\n\n /**\n * Search for issues by identifier (e.g., \"SM-123\")\n */\n async findIssueByIdentifier(identifier: string): Promise<LinearIssue | null> {\n const query = `\n query FindIssue($filter: IssueFilter!) {\n issues(filter: $filter, first: 1) {\n nodes {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n assignee {\n id\n name\n email\n }\n estimate\n labels {\n nodes {\n id\n name\n }\n }\n createdAt\n updatedAt\n url\n }\n }\n }\n `;\n\n const result = await this.graphql<{\n issues: {\n nodes: LinearIssue[];\n };\n }>(query, {\n filter: {\n number: {\n eq: parseInt(identifier.split('-')[1] || '0') || 0,\n },\n },\n });\n\n return result.issues.nodes[0] || null;\n }\n\n /**\n * Get team information\n */\n async getTeam(\n teamId?: string\n ): Promise<{ id: string; name: string; key: string }> {\n const query = teamId\n ? `\n query GetTeam($id: String!) {\n team(id: $id) {\n id\n name\n key\n }\n }\n `\n : `\n query GetTeams {\n teams(first: 1) {\n nodes {\n id\n name\n key\n }\n }\n }\n `;\n\n if (teamId) {\n const result = await this.graphql<{\n team: { id: string; name: string; key: string };\n }>(query, { id: teamId });\n if (!result.team) {\n throw new IntegrationError(\n `Team ${teamId} not found`,\n ErrorCode.LINEAR_API_ERROR,\n { teamId }\n );\n }\n return result.team;\n } else {\n const result = await this.graphql<{\n teams: {\n nodes: Array<{ id: string; name: string; key: string }>;\n };\n }>(query);\n\n if (result.teams.nodes.length === 0) {\n throw new IntegrationError(\n 'No teams found',\n ErrorCode.LINEAR_API_ERROR\n );\n }\n\n return result.teams.nodes[0]!;\n }\n }\n\n /**\n * Get workflow states for a team\n */\n async getWorkflowStates(teamId: string): Promise<\n Array<{\n id: string;\n name: string;\n type: 'backlog' | 'unstarted' | 'started' | 'completed' | 'cancelled';\n color: string;\n }>\n > {\n const query = `\n query GetWorkflowStates($teamId: String!) {\n team(id: $teamId) {\n states {\n nodes {\n id\n name\n type\n color\n }\n }\n }\n }\n `;\n\n const result = await this.graphql<{\n team: {\n states: {\n nodes: Array<{\n id: string;\n name: string;\n type:\n | 'backlog'\n | 'unstarted'\n | 'started'\n | 'completed'\n | 'cancelled';\n color: string;\n }>;\n };\n };\n }>(query, { teamId });\n\n return result.team.states.nodes;\n }\n\n /**\n * Get current viewer/user information\n */\n async getViewer(): Promise<{\n id: string;\n name: string;\n email: string;\n }> {\n const query = `\n query GetViewer {\n viewer {\n id\n name\n email\n }\n }\n `;\n\n const result = await this.graphql<{\n viewer: {\n id: string;\n name: string;\n email: string;\n };\n }>(query);\n\n return result.viewer;\n }\n\n /**\n * Get all teams for the organization\n */\n async getTeams(): Promise<\n Array<{\n id: string;\n name: string;\n key: string;\n }>\n > {\n const query = `\n query GetTeams {\n teams(first: 50) {\n nodes {\n id\n name\n key\n }\n }\n }\n `;\n\n const result = await this.graphql<{\n teams: {\n nodes: Array<{\n id: string;\n name: string;\n key: string;\n }>;\n };\n }>(query);\n\n return result.teams.nodes;\n }\n\n /**\n * Get issues with filtering options\n */\n async getIssues(options?: {\n teamId?: string;\n assigneeId?: string;\n stateType?: 'backlog' | 'unstarted' | 'started' | 'completed' | 'cancelled';\n limit?: number;\n }): Promise<LinearIssue[]> {\n const query = `\n query GetIssues($filter: IssueFilter, $first: Int!) {\n issues(filter: $filter, first: $first) {\n nodes {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n assignee {\n id\n name\n email\n }\n estimate\n labels {\n nodes {\n id\n name\n }\n }\n createdAt\n updatedAt\n url\n }\n }\n }\n `;\n\n const filter: Record<string, unknown> = {};\n\n if (options?.teamId) {\n filter.team = { id: { eq: options.teamId } };\n }\n\n if (options?.assigneeId) {\n filter.assignee = { id: { eq: options.assigneeId } };\n }\n\n if (options?.stateType) {\n filter.state = { type: { eq: options.stateType } };\n }\n\n const result = await this.graphql<{\n issues: {\n nodes: LinearIssue[];\n };\n }>(query, {\n filter: Object.keys(filter).length > 0 ? filter : undefined,\n first: options?.limit || 50,\n });\n\n return result.issues.nodes;\n }\n\n /**\n * Assign an issue to a user\n */\n async assignIssue(\n issueId: string,\n assigneeId: string\n ): Promise<{ success: boolean; issue?: LinearIssue }> {\n const mutation = `\n mutation AssignIssue($issueId: String!, $assigneeId: String!) {\n issueUpdate(id: $issueId, input: { assigneeId: $assigneeId }) {\n success\n issue {\n id\n identifier\n title\n assignee {\n id\n name\n }\n }\n }\n }\n `;\n\n const result = await this.graphql<{\n issueUpdate: {\n success: boolean;\n issue?: LinearIssue;\n };\n }>(mutation, { issueId, assigneeId });\n\n return result.issueUpdate;\n }\n\n /**\n * Update issue state (e.g., move to \"In Progress\")\n */\n async updateIssueState(\n issueId: string,\n stateId: string\n ): Promise<{ success: boolean; issue?: LinearIssue }> {\n const mutation = `\n mutation UpdateIssueState($issueId: String!, $stateId: String!) {\n issueUpdate(id: $issueId, input: { stateId: $stateId }) {\n success\n issue {\n id\n identifier\n title\n state {\n id\n name\n type\n }\n }\n }\n }\n `;\n\n const result = await this.graphql<{\n issueUpdate: {\n success: boolean;\n issue?: LinearIssue;\n };\n }>(mutation, { issueId, stateId });\n\n return result.issueUpdate;\n }\n\n /**\n * Get an issue by ID with team info\n */\n async getIssueById(issueId: string): Promise<LinearIssue | null> {\n const query = `\n query GetIssue($issueId: String!) {\n issue(id: $issueId) {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n assignee {\n id\n name\n email\n }\n estimate\n labels {\n nodes {\n id\n name\n }\n }\n team {\n id\n name\n }\n createdAt\n updatedAt\n url\n }\n }\n `;\n\n try {\n const result = await this.graphql<{\n issue: LinearIssue & { team: { id: string; name: string } };\n }>(query, { issueId });\n return result.issue;\n } catch (error: unknown) {\n // Log the error but return null for graceful degradation\n // This allows callers to handle missing issues without crashing\n logger.debug('Failed to fetch issue by ID', {\n issueId,\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n }\n\n /**\n * Start working on an issue (assign to self and move to In Progress)\n */\n async startIssue(issueId: string): Promise<{\n success: boolean;\n issue?: LinearIssue;\n error?: string;\n }> {\n try {\n // Get current user\n const user = await this.getViewer();\n\n // Get the issue to find its team\n const issue = await this.getIssueById(issueId);\n if (!issue) {\n return { success: false, error: 'Issue not found' };\n }\n\n // Assign to self\n const assignResult = await this.assignIssue(issueId, user.id);\n if (!assignResult.success) {\n return { success: false, error: 'Failed to assign issue' };\n }\n\n // Find the \"In Progress\" or \"started\" state for this issue's team\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const teamId = (issue as any).team?.id;\n if (teamId) {\n const states = await this.getWorkflowStates(teamId);\n const inProgressState = states.find(\n (s) =>\n s.type === 'started' || s.name.toLowerCase().includes('progress')\n );\n\n if (inProgressState) {\n await this.updateIssueState(issueId, inProgressState.id);\n }\n }\n\n return { success: true, issue: assignResult.issue };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|