@stackmemoryai/stackmemory 0.5.59 → 0.5.61
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/README.md +105 -1
- package/dist/src/cli/claude-sm.js +130 -50
- package/dist/src/cli/claude-sm.js.map +2 -2
- package/dist/src/cli/index.js +18 -3
- package/dist/src/cli/index.js.map +3 -3
- package/dist/src/core/extensions/custom-tools.js +567 -0
- package/dist/src/core/extensions/custom-tools.js.map +7 -0
- package/dist/src/core/extensions/index.js +55 -0
- package/dist/src/core/extensions/index.js.map +7 -0
- package/dist/src/core/extensions/loader.js +709 -0
- package/dist/src/core/extensions/loader.js.map +7 -0
- package/dist/src/core/extensions/plugin-system.js +506 -0
- package/dist/src/core/extensions/plugin-system.js.map +7 -0
- package/dist/src/core/extensions/provider-adapter.js +617 -0
- package/dist/src/core/extensions/provider-adapter.js.map +7 -0
- package/dist/src/core/extensions/sandbox-runtime.js +664 -0
- package/dist/src/core/extensions/sandbox-runtime.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +32 -6
- package/dist/src/core/storage/chromadb-adapter.js.map +2 -2
- package/dist/src/skills/repo-ingestion-skill.js +35 -12
- package/dist/src/skills/repo-ingestion-skill.js.map +2 -2
- package/package.json +11 -7
- package/scripts/background-sync-manager.js +145 -83
- package/scripts/claude-sm-autostart.js +17 -12
- package/scripts/gepa/README.md +275 -0
- package/scripts/gepa/config.json +53 -0
- package/scripts/gepa/evals/coding-tasks.jsonl +5 -0
- package/scripts/gepa/evals/fixtures/buggy-loop.js +18 -0
- package/scripts/gepa/evals/fixtures/callback-hell.js +53 -0
- package/scripts/gepa/generations/gen-000/baseline.md +124 -0
- package/scripts/gepa/hooks/auto-optimize.js +494 -0
- package/scripts/gepa/hooks/eval-tracker.js +203 -0
- package/scripts/gepa/hooks/reflect.js +311 -0
- package/scripts/gepa/optimize.js +611 -0
- package/scripts/gepa/state.json +14 -0
- package/scripts/test-pre-publish-quick.sh +1 -1
- package/dist/agents/core/agent-task-manager.js +0 -527
- package/dist/agents/core/agent-task-manager.js.map +0 -7
- package/dist/agents/testing-agent.js +0 -614
- package/dist/agents/testing-agent.js.map +0 -7
- package/dist/agents/verifiers/base-verifier.js +0 -133
- package/dist/agents/verifiers/base-verifier.js.map +0 -7
- package/dist/agents/verifiers/formatter-verifier.js +0 -130
- package/dist/agents/verifiers/formatter-verifier.js.map +0 -7
- package/dist/agents/verifiers/llm-judge.js +0 -252
- package/dist/agents/verifiers/llm-judge.js.map +0 -7
- package/dist/cli/auto-detect.js +0 -321
- package/dist/cli/auto-detect.js.map +0 -7
- package/dist/cli/browser-test.js +0 -33
- package/dist/cli/browser-test.js.map +0 -7
- package/dist/cli/claude-sm-danger.js +0 -21
- package/dist/cli/claude-sm-danger.js.map +0 -7
- package/dist/cli/claude-sm.js +0 -1156
- package/dist/cli/claude-sm.js.map +0 -7
- package/dist/cli/codex-sm-danger.js +0 -21
- package/dist/cli/codex-sm-danger.js.map +0 -7
- package/dist/cli/codex-sm.js +0 -349
- package/dist/cli/codex-sm.js.map +0 -7
- package/dist/cli/commands/api.js +0 -232
- package/dist/cli/commands/api.js.map +0 -7
- package/dist/cli/commands/auto-background.js +0 -180
- package/dist/cli/commands/auto-background.js.map +0 -7
- package/dist/cli/commands/cleanup-processes.js +0 -68
- package/dist/cli/commands/cleanup-processes.js.map +0 -7
- package/dist/cli/commands/clear.js +0 -202
- package/dist/cli/commands/clear.js.map +0 -7
- package/dist/cli/commands/config.js +0 -445
- package/dist/cli/commands/config.js.map +0 -7
- package/dist/cli/commands/context-rehydrate.js +0 -751
- package/dist/cli/commands/context-rehydrate.js.map +0 -7
- package/dist/cli/commands/context.js +0 -343
- package/dist/cli/commands/context.js.map +0 -7
- package/dist/cli/commands/daemon.js +0 -392
- package/dist/cli/commands/daemon.js.map +0 -7
- package/dist/cli/commands/dashboard.js +0 -210
- package/dist/cli/commands/dashboard.js.map +0 -7
- package/dist/cli/commands/db.js +0 -147
- package/dist/cli/commands/db.js.map +0 -7
- package/dist/cli/commands/decision.js +0 -266
- package/dist/cli/commands/decision.js.map +0 -7
- package/dist/cli/commands/discovery.js +0 -279
- package/dist/cli/commands/discovery.js.map +0 -7
- package/dist/cli/commands/handoff.js +0 -624
- package/dist/cli/commands/handoff.js.map +0 -7
- package/dist/cli/commands/hooks.js +0 -298
- package/dist/cli/commands/hooks.js.map +0 -7
- package/dist/cli/commands/linear-unified.js +0 -353
- package/dist/cli/commands/linear-unified.js.map +0 -7
- package/dist/cli/commands/linear.js +0 -529
- package/dist/cli/commands/linear.js.map +0 -7
- package/dist/cli/commands/log.js +0 -169
- package/dist/cli/commands/log.js.map +0 -7
- package/dist/cli/commands/login.js +0 -172
- package/dist/cli/commands/login.js.map +0 -7
- package/dist/cli/commands/migrate.js +0 -240
- package/dist/cli/commands/migrate.js.map +0 -7
- package/dist/cli/commands/model.js +0 -533
- package/dist/cli/commands/model.js.map +0 -7
- package/dist/cli/commands/monitor.js +0 -313
- package/dist/cli/commands/monitor.js.map +0 -7
- package/dist/cli/commands/onboard.js +0 -536
- package/dist/cli/commands/onboard.js.map +0 -7
- package/dist/cli/commands/projects.js +0 -199
- package/dist/cli/commands/projects.js.map +0 -7
- package/dist/cli/commands/quality.js +0 -413
- package/dist/cli/commands/quality.js.map +0 -7
- package/dist/cli/commands/ralph.js +0 -909
- package/dist/cli/commands/ralph.js.map +0 -7
- package/dist/cli/commands/retrieval.js +0 -248
- package/dist/cli/commands/retrieval.js.map +0 -7
- package/dist/cli/commands/search.js +0 -173
- package/dist/cli/commands/search.js.map +0 -7
- package/dist/cli/commands/service.js +0 -749
- package/dist/cli/commands/service.js.map +0 -7
- package/dist/cli/commands/session.js +0 -200
- package/dist/cli/commands/session.js.map +0 -7
- package/dist/cli/commands/settings.js +0 -306
- package/dist/cli/commands/settings.js.map +0 -7
- package/dist/cli/commands/setup.js +0 -701
- package/dist/cli/commands/setup.js.map +0 -7
- package/dist/cli/commands/shell.js +0 -249
- package/dist/cli/commands/shell.js.map +0 -7
- package/dist/cli/commands/signup.js +0 -50
- package/dist/cli/commands/signup.js.map +0 -7
- package/dist/cli/commands/skills.js +0 -470
- package/dist/cli/commands/skills.js.map +0 -7
- package/dist/cli/commands/sms-notify.js +0 -795
- package/dist/cli/commands/sms-notify.js.map +0 -7
- package/dist/cli/commands/storage-tier.js +0 -183
- package/dist/cli/commands/storage-tier.js.map +0 -7
- package/dist/cli/commands/storage.js +0 -360
- package/dist/cli/commands/storage.js.map +0 -7
- package/dist/cli/commands/sweep.js +0 -249
- package/dist/cli/commands/sweep.js.map +0 -7
- package/dist/cli/commands/tasks.js +0 -213
- package/dist/cli/commands/tasks.js.map +0 -7
- package/dist/cli/commands/test.js +0 -286
- package/dist/cli/commands/test.js.map +0 -7
- package/dist/cli/commands/workflow.js +0 -142
- package/dist/cli/commands/workflow.js.map +0 -7
- package/dist/cli/commands/worktree.js +0 -319
- package/dist/cli/commands/worktree.js.map +0 -7
- package/dist/cli/index.js +0 -594
- package/dist/cli/index.js.map +0 -7
- package/dist/cli/opencode-sm.js +0 -448
- package/dist/cli/opencode-sm.js.map +0 -7
- package/dist/cli/utils/viewer.js +0 -96
- package/dist/cli/utils/viewer.js.map +0 -7
- package/dist/core/analytics/team-analytics.js +0 -378
- package/dist/core/analytics/team-analytics.js.map +0 -7
- package/dist/core/config/config-manager.js +0 -398
- package/dist/core/config/config-manager.js.map +0 -7
- package/dist/core/config/feature-flags.js +0 -76
- package/dist/core/config/feature-flags.js.map +0 -7
- package/dist/core/config/storage-config.js +0 -115
- package/dist/core/config/storage-config.js.map +0 -7
- package/dist/core/config/types.js +0 -144
- package/dist/core/config/types.js.map +0 -7
- package/dist/core/context/auto-context.js +0 -80
- package/dist/core/context/auto-context.js.map +0 -7
- package/dist/core/context/dual-stack-manager.js +0 -870
- package/dist/core/context/dual-stack-manager.js.map +0 -7
- package/dist/core/context/enhanced-rehydration.js +0 -994
- package/dist/core/context/enhanced-rehydration.js.map +0 -7
- package/dist/core/context/frame-database.js +0 -479
- package/dist/core/context/frame-database.js.map +0 -7
- package/dist/core/context/frame-digest.js +0 -250
- package/dist/core/context/frame-digest.js.map +0 -7
- package/dist/core/context/frame-handoff-manager.js +0 -778
- package/dist/core/context/frame-handoff-manager.js.map +0 -7
- package/dist/core/context/frame-lifecycle-hooks.js +0 -119
- package/dist/core/context/frame-lifecycle-hooks.js.map +0 -7
- package/dist/core/context/frame-manager.js +0 -1069
- package/dist/core/context/frame-manager.js.map +0 -7
- package/dist/core/context/frame-recovery.js +0 -302
- package/dist/core/context/frame-recovery.js.map +0 -7
- package/dist/core/context/frame-stack.js +0 -314
- package/dist/core/context/frame-stack.js.map +0 -7
- package/dist/core/context/frame-types.js +0 -5
- package/dist/core/context/frame-types.js.map +0 -7
- package/dist/core/context/incremental-gc.js +0 -290
- package/dist/core/context/incremental-gc.js.map +0 -7
- package/dist/core/context/index.js +0 -25
- package/dist/core/context/index.js.map +0 -7
- package/dist/core/context/model-aware-compaction.js +0 -623
- package/dist/core/context/model-aware-compaction.js.map +0 -7
- package/dist/core/context/permission-manager.js +0 -185
- package/dist/core/context/permission-manager.js.map +0 -7
- package/dist/core/context/recursive-context-manager.js +0 -592
- package/dist/core/context/recursive-context-manager.js.map +0 -7
- package/dist/core/context/refactored-frame-manager.js +0 -754
- package/dist/core/context/refactored-frame-manager.js.map +0 -7
- package/dist/core/context/shared-context-layer.js +0 -621
- package/dist/core/context/shared-context-layer.js.map +0 -7
- package/dist/core/context/stack-merge-resolver.js +0 -749
- package/dist/core/context/stack-merge-resolver.js.map +0 -7
- package/dist/core/context/validation.js +0 -130
- package/dist/core/context/validation.js.map +0 -7
- package/dist/core/database/batch-operations.js +0 -384
- package/dist/core/database/batch-operations.js.map +0 -7
- package/dist/core/database/connection-pool.js +0 -330
- package/dist/core/database/connection-pool.js.map +0 -7
- package/dist/core/database/database-adapter.js +0 -60
- package/dist/core/database/database-adapter.js.map +0 -7
- package/dist/core/database/migration-manager.js +0 -614
- package/dist/core/database/migration-manager.js.map +0 -7
- package/dist/core/database/paradedb-adapter.js +0 -990
- package/dist/core/database/paradedb-adapter.js.map +0 -7
- package/dist/core/database/query-cache.js +0 -298
- package/dist/core/database/query-cache.js.map +0 -7
- package/dist/core/database/query-router.js +0 -430
- package/dist/core/database/query-router.js.map +0 -7
- package/dist/core/database/sqlite-adapter.js +0 -738
- package/dist/core/database/sqlite-adapter.js.map +0 -7
- package/dist/core/digest/enhanced-hybrid-digest.js +0 -277
- package/dist/core/digest/enhanced-hybrid-digest.js.map +0 -7
- package/dist/core/digest/frame-digest-integration.js +0 -176
- package/dist/core/digest/frame-digest-integration.js.map +0 -7
- package/dist/core/digest/hybrid-digest-generator.js +0 -553
- package/dist/core/digest/hybrid-digest-generator.js.map +0 -7
- package/dist/core/digest/index.js +0 -9
- package/dist/core/digest/index.js.map +0 -7
- package/dist/core/digest/types.js +0 -25
- package/dist/core/digest/types.js.map +0 -7
- package/dist/core/errors/error-utils.js +0 -208
- package/dist/core/errors/error-utils.js.map +0 -7
- package/dist/core/errors/index.js +0 -521
- package/dist/core/errors/index.js.map +0 -7
- package/dist/core/errors/recovery.js +0 -269
- package/dist/core/errors/recovery.js.map +0 -7
- package/dist/core/execution/parallel-executor.js +0 -258
- package/dist/core/execution/parallel-executor.js.map +0 -7
- package/dist/core/frame/workflow-templates.js +0 -319
- package/dist/core/frame/workflow-templates.js.map +0 -7
- package/dist/core/merge/conflict-detector.js +0 -431
- package/dist/core/merge/conflict-detector.js.map +0 -7
- package/dist/core/merge/index.js +0 -9
- package/dist/core/merge/index.js.map +0 -7
- package/dist/core/merge/resolution-engine.js +0 -558
- package/dist/core/merge/resolution-engine.js.map +0 -7
- package/dist/core/merge/stack-diff.js +0 -532
- package/dist/core/merge/stack-diff.js.map +0 -7
- package/dist/core/merge/unified-merge-resolver.js +0 -303
- package/dist/core/merge/unified-merge-resolver.js.map +0 -7
- package/dist/core/models/fallback-monitor.js +0 -232
- package/dist/core/models/fallback-monitor.js.map +0 -7
- package/dist/core/models/model-router.js +0 -340
- package/dist/core/models/model-router.js.map +0 -7
- package/dist/core/monitoring/error-handler.js +0 -49
- package/dist/core/monitoring/error-handler.js.map +0 -7
- package/dist/core/monitoring/logger.js +0 -202
- package/dist/core/monitoring/logger.js.map +0 -7
- package/dist/core/monitoring/metrics.js +0 -172
- package/dist/core/monitoring/metrics.js.map +0 -7
- package/dist/core/monitoring/progress-tracker.js +0 -189
- package/dist/core/monitoring/progress-tracker.js.map +0 -7
- package/dist/core/monitoring/session-monitor.js +0 -300
- package/dist/core/monitoring/session-monitor.js.map +0 -7
- package/dist/core/performance/context-cache.js +0 -273
- package/dist/core/performance/context-cache.js.map +0 -7
- package/dist/core/performance/index.js +0 -11
- package/dist/core/performance/index.js.map +0 -7
- package/dist/core/performance/lazy-context-loader.js +0 -327
- package/dist/core/performance/lazy-context-loader.js.map +0 -7
- package/dist/core/performance/monitor.js +0 -221
- package/dist/core/performance/monitor.js.map +0 -7
- package/dist/core/performance/optimized-frame-context.js +0 -345
- package/dist/core/performance/optimized-frame-context.js.map +0 -7
- package/dist/core/performance/performance-benchmark.js +0 -277
- package/dist/core/performance/performance-benchmark.js.map +0 -7
- package/dist/core/performance/performance-profiler.js +0 -370
- package/dist/core/performance/performance-profiler.js.map +0 -7
- package/dist/core/performance/streaming-jsonl-parser.js +0 -195
- package/dist/core/performance/streaming-jsonl-parser.js.map +0 -7
- package/dist/core/persistence/postgres-adapter.js +0 -349
- package/dist/core/persistence/postgres-adapter.js.map +0 -7
- package/dist/core/projects/project-isolation.js +0 -201
- package/dist/core/projects/project-isolation.js.map +0 -7
- package/dist/core/projects/project-manager.js +0 -697
- package/dist/core/projects/project-manager.js.map +0 -7
- package/dist/core/query/query-parser.js +0 -370
- package/dist/core/query/query-parser.js.map +0 -7
- package/dist/core/query/query-templates.js +0 -321
- package/dist/core/query/query-templates.js.map +0 -7
- package/dist/core/retrieval/context-retriever.js +0 -479
- package/dist/core/retrieval/context-retriever.js.map +0 -7
- package/dist/core/retrieval/graph-retrieval.js +0 -662
- package/dist/core/retrieval/graph-retrieval.js.map +0 -7
- package/dist/core/retrieval/hierarchical-retrieval.js +0 -656
- package/dist/core/retrieval/hierarchical-retrieval.js.map +0 -7
- package/dist/core/retrieval/index.js +0 -8
- package/dist/core/retrieval/index.js.map +0 -7
- package/dist/core/retrieval/llm-context-retrieval.js +0 -613
- package/dist/core/retrieval/llm-context-retrieval.js.map +0 -7
- package/dist/core/retrieval/llm-provider.js +0 -151
- package/dist/core/retrieval/llm-provider.js.map +0 -7
- package/dist/core/retrieval/retrieval-audit.js +0 -236
- package/dist/core/retrieval/retrieval-audit.js.map +0 -7
- package/dist/core/retrieval/retrieval-benchmarks.js +0 -521
- package/dist/core/retrieval/retrieval-benchmarks.js.map +0 -7
- package/dist/core/retrieval/summary-generator.js +0 -589
- package/dist/core/retrieval/summary-generator.js.map +0 -7
- package/dist/core/retrieval/types.js +0 -21
- package/dist/core/retrieval/types.js.map +0 -7
- package/dist/core/security/index.js +0 -35
- package/dist/core/security/index.js.map +0 -7
- package/dist/core/security/input-sanitizer.js +0 -321
- package/dist/core/security/input-sanitizer.js.map +0 -7
- package/dist/core/session/clear-survival.js +0 -465
- package/dist/core/session/clear-survival.js.map +0 -7
- package/dist/core/session/enhanced-handoff.js +0 -792
- package/dist/core/session/enhanced-handoff.js.map +0 -7
- package/dist/core/session/handoff-generator.js +0 -343
- package/dist/core/session/handoff-generator.js.map +0 -7
- package/dist/core/session/index.js +0 -15
- package/dist/core/session/index.js.map +0 -7
- package/dist/core/session/session-manager.js +0 -347
- package/dist/core/session/session-manager.js.map +0 -7
- package/dist/core/skills/index.js +0 -7
- package/dist/core/skills/index.js.map +0 -7
- package/dist/core/skills/skill-storage.js +0 -764
- package/dist/core/skills/skill-storage.js.map +0 -7
- package/dist/core/skills/types.js +0 -193
- package/dist/core/skills/types.js.map +0 -7
- package/dist/core/storage/chromadb-adapter.js +0 -354
- package/dist/core/storage/chromadb-adapter.js.map +0 -7
- package/dist/core/storage/infinite-storage.js +0 -510
- package/dist/core/storage/infinite-storage.js.map +0 -7
- package/dist/core/storage/railway-optimized-storage.js +0 -591
- package/dist/core/storage/railway-optimized-storage.js.map +0 -7
- package/dist/core/storage/remote-storage.js +0 -489
- package/dist/core/storage/remote-storage.js.map +0 -7
- package/dist/core/storage/two-tier-storage.js +0 -766
- package/dist/core/storage/two-tier-storage.js.map +0 -7
- package/dist/core/trace/cli-trace-wrapper.js +0 -132
- package/dist/core/trace/cli-trace-wrapper.js.map +0 -7
- package/dist/core/trace/db-trace-wrapper.js +0 -247
- package/dist/core/trace/db-trace-wrapper.js.map +0 -7
- package/dist/core/trace/debug-trace.js +0 -417
- package/dist/core/trace/debug-trace.js.map +0 -7
- package/dist/core/trace/index.js +0 -109
- package/dist/core/trace/index.js.map +0 -7
- package/dist/core/trace/linear-api-wrapper.js +0 -178
- package/dist/core/trace/linear-api-wrapper.js.map +0 -7
- package/dist/core/trace/trace-demo.js +0 -154
- package/dist/core/trace/trace-demo.js.map +0 -7
- package/dist/core/trace/trace-detector.demo.js +0 -142
- package/dist/core/trace/trace-detector.demo.js.map +0 -7
- package/dist/core/trace/trace-detector.js +0 -528
- package/dist/core/trace/trace-detector.js.map +0 -7
- package/dist/core/trace/trace-store.js +0 -345
- package/dist/core/trace/trace-store.js.map +0 -7
- package/dist/core/trace/types.js +0 -77
- package/dist/core/trace/types.js.map +0 -7
- package/dist/core/types.js +0 -5
- package/dist/core/types.js.map +0 -7
- package/dist/core/utils/async-mutex.js +0 -114
- package/dist/core/utils/async-mutex.js.map +0 -7
- package/dist/core/utils/compression.js +0 -83
- package/dist/core/utils/compression.js.map +0 -7
- package/dist/core/utils/update-checker.js +0 -218
- package/dist/core/utils/update-checker.js.map +0 -7
- package/dist/core/worktree/worktree-manager.js +0 -465
- package/dist/core/worktree/worktree-manager.js.map +0 -7
- package/dist/daemon/daemon-config.js +0 -149
- package/dist/daemon/daemon-config.js.map +0 -7
- package/dist/daemon/services/context-service.js +0 -122
- package/dist/daemon/services/context-service.js.map +0 -7
- package/dist/daemon/services/linear-service.js +0 -136
- package/dist/daemon/services/linear-service.js.map +0 -7
- package/dist/daemon/session-daemon.js +0 -312
- package/dist/daemon/session-daemon.js.map +0 -7
- package/dist/daemon/unified-daemon.js +0 -276
- package/dist/daemon/unified-daemon.js.map +0 -7
- package/dist/features/analytics/api/analytics-api.js +0 -287
- package/dist/features/analytics/api/analytics-api.js.map +0 -7
- package/dist/features/analytics/core/analytics-service.js +0 -282
- package/dist/features/analytics/core/analytics-service.js.map +0 -7
- package/dist/features/analytics/index.js +0 -18
- package/dist/features/analytics/index.js.map +0 -7
- package/dist/features/analytics/queries/metrics-queries.js +0 -277
- package/dist/features/analytics/queries/metrics-queries.js.map +0 -7
- package/dist/features/analytics/types/metrics.js +0 -5
- package/dist/features/analytics/types/metrics.js.map +0 -7
- package/dist/features/browser/browser-mcp.js +0 -492
- package/dist/features/browser/browser-mcp.js.map +0 -7
- package/dist/features/sweep/index.js +0 -20
- package/dist/features/sweep/index.js.map +0 -7
- package/dist/features/sweep/prediction-client.js +0 -155
- package/dist/features/sweep/prediction-client.js.map +0 -7
- package/dist/features/sweep/prompt-builder.js +0 -85
- package/dist/features/sweep/prompt-builder.js.map +0 -7
- package/dist/features/sweep/pty-wrapper.js +0 -171
- package/dist/features/sweep/pty-wrapper.js.map +0 -7
- package/dist/features/sweep/state-watcher.js +0 -87
- package/dist/features/sweep/state-watcher.js.map +0 -7
- package/dist/features/sweep/status-bar.js +0 -88
- package/dist/features/sweep/status-bar.js.map +0 -7
- package/dist/features/sweep/sweep-server-manager.js +0 -226
- package/dist/features/sweep/sweep-server-manager.js.map +0 -7
- package/dist/features/sweep/tab-interceptor.js +0 -38
- package/dist/features/sweep/tab-interceptor.js.map +0 -7
- package/dist/features/sweep/types.js +0 -18
- package/dist/features/sweep/types.js.map +0 -7
- package/dist/features/tasks/linear-task-manager.js +0 -487
- package/dist/features/tasks/linear-task-manager.js.map +0 -7
- package/dist/features/tasks/task-aware-context.js +0 -410
- package/dist/features/tasks/task-aware-context.js.map +0 -7
- package/dist/features/tui/simple-monitor.js +0 -116
- package/dist/features/tui/simple-monitor.js.map +0 -7
- package/dist/features/tui/swarm-monitor.js +0 -648
- package/dist/features/tui/swarm-monitor.js.map +0 -7
- package/dist/features/web/client/stores/task-store.js +0 -26
- package/dist/features/web/client/stores/task-store.js.map +0 -7
- package/dist/features/web/server/index.js +0 -194
- package/dist/features/web/server/index.js.map +0 -7
- package/dist/hooks/auto-background.js +0 -151
- package/dist/hooks/auto-background.js.map +0 -7
- package/dist/hooks/claude-code-whatsapp-hook.js +0 -197
- package/dist/hooks/claude-code-whatsapp-hook.js.map +0 -7
- package/dist/hooks/config.js +0 -150
- package/dist/hooks/config.js.map +0 -7
- package/dist/hooks/daemon.js +0 -364
- package/dist/hooks/daemon.js.map +0 -7
- package/dist/hooks/events.js +0 -58
- package/dist/hooks/events.js.map +0 -7
- package/dist/hooks/index.js +0 -12
- package/dist/hooks/index.js.map +0 -7
- package/dist/hooks/linear-task-picker.js +0 -186
- package/dist/hooks/linear-task-picker.js.map +0 -7
- package/dist/hooks/schemas.js +0 -197
- package/dist/hooks/schemas.js.map +0 -7
- package/dist/hooks/secure-fs.js +0 -49
- package/dist/hooks/secure-fs.js.map +0 -7
- package/dist/hooks/security-logger.js +0 -155
- package/dist/hooks/security-logger.js.map +0 -7
- package/dist/hooks/session-summary.js +0 -222
- package/dist/hooks/session-summary.js.map +0 -7
- package/dist/hooks/sms-action-runner.js +0 -371
- package/dist/hooks/sms-action-runner.js.map +0 -7
- package/dist/hooks/sms-notify.js +0 -506
- package/dist/hooks/sms-notify.js.map +0 -7
- package/dist/hooks/sms-watcher.js +0 -93
- package/dist/hooks/sms-watcher.js.map +0 -7
- package/dist/hooks/sms-webhook.js +0 -555
- package/dist/hooks/sms-webhook.js.map +0 -7
- package/dist/hooks/whatsapp-commands.js +0 -479
- package/dist/hooks/whatsapp-commands.js.map +0 -7
- package/dist/hooks/whatsapp-scheduler.js +0 -317
- package/dist/hooks/whatsapp-scheduler.js.map +0 -7
- package/dist/hooks/whatsapp-sync.js +0 -409
- package/dist/hooks/whatsapp-sync.js.map +0 -7
- package/dist/index.js +0 -25
- package/dist/index.js.map +0 -7
- package/dist/integrations/anthropic/client.js +0 -263
- package/dist/integrations/anthropic/client.js.map +0 -7
- package/dist/integrations/claude-code/agent-bridge.js +0 -768
- package/dist/integrations/claude-code/agent-bridge.js.map +0 -7
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +0 -459
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
- package/dist/integrations/claude-code/lifecycle-hooks.js +0 -254
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +0 -7
- package/dist/integrations/claude-code/post-task-hooks.js +0 -545
- package/dist/integrations/claude-code/post-task-hooks.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client-stub.js +0 -20
- package/dist/integrations/claude-code/subagent-client-stub.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client.js +0 -511
- package/dist/integrations/claude-code/subagent-client.js.map +0 -7
- package/dist/integrations/claude-code/task-coordinator.js +0 -360
- package/dist/integrations/claude-code/task-coordinator.js.map +0 -7
- package/dist/integrations/linear/auth.js +0 -337
- package/dist/integrations/linear/auth.js.map +0 -7
- package/dist/integrations/linear/auto-sync.js +0 -258
- package/dist/integrations/linear/auto-sync.js.map +0 -7
- package/dist/integrations/linear/client.js +0 -634
- package/dist/integrations/linear/client.js.map +0 -7
- package/dist/integrations/linear/config.js +0 -130
- package/dist/integrations/linear/config.js.map +0 -7
- package/dist/integrations/linear/migration.js +0 -361
- package/dist/integrations/linear/migration.js.map +0 -7
- package/dist/integrations/linear/oauth-server.js +0 -454
- package/dist/integrations/linear/oauth-server.js.map +0 -7
- package/dist/integrations/linear/rest-client.js +0 -213
- package/dist/integrations/linear/rest-client.js.map +0 -7
- package/dist/integrations/linear/sync-manager.js +0 -236
- package/dist/integrations/linear/sync-manager.js.map +0 -7
- package/dist/integrations/linear/sync-service.js +0 -231
- package/dist/integrations/linear/sync-service.js.map +0 -7
- package/dist/integrations/linear/sync.js +0 -782
- package/dist/integrations/linear/sync.js.map +0 -7
- package/dist/integrations/linear/types.js +0 -5
- package/dist/integrations/linear/types.js.map +0 -7
- package/dist/integrations/linear/unified-sync.js +0 -589
- package/dist/integrations/linear/unified-sync.js.map +0 -7
- package/dist/integrations/linear/webhook-handler.js +0 -219
- package/dist/integrations/linear/webhook-handler.js.map +0 -7
- package/dist/integrations/linear/webhook-server.js +0 -218
- package/dist/integrations/linear/webhook-server.js.map +0 -7
- package/dist/integrations/linear/webhook.js +0 -291
- package/dist/integrations/linear/webhook.js.map +0 -7
- package/dist/integrations/mcp/handlers/code-execution-handlers.js +0 -266
- package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/context-handlers.js +0 -257
- package/dist/integrations/mcp/handlers/context-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/discovery-handlers.js +0 -497
- package/dist/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/index.js +0 -166
- package/dist/integrations/mcp/handlers/index.js.map +0 -7
- package/dist/integrations/mcp/handlers/linear-handlers.js +0 -247
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/skill-handlers.js +0 -529
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/task-handlers.js +0 -239
- package/dist/integrations/mcp/handlers/task-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/trace-handlers.js +0 -308
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +0 -7
- package/dist/integrations/mcp/index.js +0 -23
- package/dist/integrations/mcp/index.js.map +0 -7
- package/dist/integrations/mcp/middleware/tool-scoring.js +0 -356
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +0 -7
- package/dist/integrations/mcp/refactored-server.js +0 -374
- package/dist/integrations/mcp/refactored-server.js.map +0 -7
- package/dist/integrations/mcp/remote-server.js +0 -682
- package/dist/integrations/mcp/remote-server.js.map +0 -7
- package/dist/integrations/mcp/schemas.js +0 -147
- package/dist/integrations/mcp/schemas.js.map +0 -7
- package/dist/integrations/mcp/server.js +0 -1975
- package/dist/integrations/mcp/server.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions-code.js +0 -125
- package/dist/integrations/mcp/tool-definitions-code.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions.js +0 -702
- package/dist/integrations/mcp/tool-definitions.js.map +0 -7
- package/dist/integrations/mcp/trace-test.js +0 -48
- package/dist/integrations/mcp/trace-test.js.map +0 -7
- package/dist/integrations/pg-aiguide/embedding-provider.js +0 -189
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +0 -7
- package/dist/integrations/pg-aiguide/semantic-search.js +0 -187
- package/dist/integrations/pg-aiguide/semantic-search.js.map +0 -7
- package/dist/integrations/pg-aiguide/timescale-analytics.js +0 -224
- package/dist/integrations/pg-aiguide/timescale-analytics.js.map +0 -7
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -860
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
- package/dist/integrations/ralph/context/context-budget-manager.js +0 -301
- package/dist/integrations/ralph/context/context-budget-manager.js.map +0 -7
- package/dist/integrations/ralph/context/stackmemory-context-loader.js +0 -360
- package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
- package/dist/integrations/ralph/coordination/enhanced-coordination.js +0 -410
- package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
- package/dist/integrations/ralph/index.js +0 -18
- package/dist/integrations/ralph/index.js.map +0 -7
- package/dist/integrations/ralph/learning/pattern-learner.js +0 -401
- package/dist/integrations/ralph/learning/pattern-learner.js.map +0 -7
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js +0 -448
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js +0 -294
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-registry.js +0 -108
- package/dist/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -463
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -400
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js +0 -473
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js +0 -388
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
- package/dist/integrations/ralph/performance/performance-optimizer.js +0 -358
- package/dist/integrations/ralph/performance/performance-optimizer.js.map +0 -7
- package/dist/integrations/ralph/ralph-integration-demo.js +0 -182
- package/dist/integrations/ralph/ralph-integration-demo.js.map +0 -7
- package/dist/integrations/ralph/recovery/crash-recovery.js +0 -462
- package/dist/integrations/ralph/recovery/crash-recovery.js.map +0 -7
- package/dist/integrations/ralph/state/state-reconciler.js +0 -404
- package/dist/integrations/ralph/state/state-reconciler.js.map +0 -7
- package/dist/integrations/ralph/swarm/git-workflow-manager.js +0 -428
- package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
- package/dist/integrations/ralph/swarm/swarm-coordinator.js +0 -996
- package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
- package/dist/integrations/ralph/types.js +0 -5
- package/dist/integrations/ralph/types.js.map +0 -7
- package/dist/integrations/ralph/visualization/ralph-debugger.js +0 -585
- package/dist/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
- package/dist/mcp/stackmemory-mcp-server.js +0 -554
- package/dist/mcp/stackmemory-mcp-server.js.map +0 -7
- package/dist/middleware/exponential-rate-limiter.js +0 -289
- package/dist/middleware/exponential-rate-limiter.js.map +0 -7
- package/dist/models/user.model.js +0 -358
- package/dist/models/user.model.js.map +0 -7
- package/dist/servers/production/auth-middleware.js +0 -528
- package/dist/servers/production/auth-middleware.js.map +0 -7
- package/dist/servers/railway/config.js +0 -55
- package/dist/servers/railway/config.js.map +0 -7
- package/dist/servers/railway/index-enhanced.js +0 -160
- package/dist/servers/railway/index-enhanced.js.map +0 -7
- package/dist/servers/railway/index.js +0 -1349
- package/dist/servers/railway/index.js.map +0 -7
- package/dist/servers/railway/simple.js +0 -64
- package/dist/servers/railway/simple.js.map +0 -7
- package/dist/servers/railway/storage-test.js +0 -459
- package/dist/servers/railway/storage-test.js.map +0 -7
- package/dist/services/config-service.js +0 -65
- package/dist/services/config-service.js.map +0 -7
- package/dist/services/context-service.js +0 -194
- package/dist/services/context-service.js.map +0 -7
- package/dist/skills/api-discovery.js +0 -354
- package/dist/skills/api-discovery.js.map +0 -7
- package/dist/skills/api-skill.js +0 -475
- package/dist/skills/api-skill.js.map +0 -7
- package/dist/skills/claude-skills.js +0 -1061
- package/dist/skills/claude-skills.js.map +0 -7
- package/dist/skills/dashboard-launcher.js +0 -216
- package/dist/skills/dashboard-launcher.js.map +0 -7
- package/dist/skills/recursive-agent-orchestrator.js +0 -575
- package/dist/skills/recursive-agent-orchestrator.js.map +0 -7
- package/dist/skills/repo-ingestion-skill.js +0 -609
- package/dist/skills/repo-ingestion-skill.js.map +0 -7
- package/dist/skills/security-secrets-scanner.js +0 -284
- package/dist/skills/security-secrets-scanner.js.map +0 -7
- package/dist/skills/unified-rlm-orchestrator.js +0 -404
- package/dist/skills/unified-rlm-orchestrator.js.map +0 -7
- package/dist/types/task.js +0 -5
- package/dist/types/task.js.map +0 -7
- package/dist/utils/env.js +0 -50
- package/dist/utils/env.js.map +0 -7
- package/dist/utils/formatting.js +0 -62
- package/dist/utils/formatting.js.map +0 -7
- package/dist/utils/process-cleanup.js +0 -136
- package/dist/utils/process-cleanup.js.map +0 -7
- package/dist/validation/schemas.js +0 -222
- package/dist/validation/schemas.js.map +0 -7
- /package/dist/{core/merge → src/core/extensions}/types.js +0 -0
- /package/dist/{core/merge → src/core/extensions}/types.js.map +0 -0
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
-
import { dirname as __pathDirname } from 'path';
|
|
3
|
-
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
-
const __dirname = __pathDirname(__filename);
|
|
5
|
-
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
6
|
-
import { join } from "path";
|
|
7
|
-
import { logger } from "../../core/monitoring/logger.js";
|
|
8
|
-
import { ProjectIsolationManager } from "../../core/projects/project-isolation.js";
|
|
9
|
-
class LinearConfigManager {
|
|
10
|
-
configPath;
|
|
11
|
-
projectRoot;
|
|
12
|
-
isolationManager;
|
|
13
|
-
constructor(projectRoot) {
|
|
14
|
-
this.projectRoot = projectRoot;
|
|
15
|
-
this.configPath = join(
|
|
16
|
-
projectRoot,
|
|
17
|
-
".stackmemory",
|
|
18
|
-
"linear-auto-sync.json"
|
|
19
|
-
);
|
|
20
|
-
this.isolationManager = ProjectIsolationManager.getInstance();
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Load configuration from file
|
|
24
|
-
*/
|
|
25
|
-
loadConfig() {
|
|
26
|
-
if (!existsSync(this.configPath)) {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
try {
|
|
30
|
-
const configData = readFileSync(this.configPath, "utf8");
|
|
31
|
-
return JSON.parse(configData);
|
|
32
|
-
} catch (error) {
|
|
33
|
-
logger.error(
|
|
34
|
-
"Failed to load Linear auto-sync configuration:",
|
|
35
|
-
error
|
|
36
|
-
);
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Save configuration to file
|
|
42
|
-
*/
|
|
43
|
-
saveConfig(config) {
|
|
44
|
-
const existingConfig = this.loadConfig() || this.getDefaultConfig();
|
|
45
|
-
const updatedConfig = {
|
|
46
|
-
...existingConfig,
|
|
47
|
-
...config,
|
|
48
|
-
lastUpdated: Date.now()
|
|
49
|
-
};
|
|
50
|
-
try {
|
|
51
|
-
writeFileSync(this.configPath, JSON.stringify(updatedConfig, null, 2));
|
|
52
|
-
logger.info("Linear auto-sync configuration saved");
|
|
53
|
-
} catch (error) {
|
|
54
|
-
logger.error(
|
|
55
|
-
"Failed to save Linear auto-sync configuration:",
|
|
56
|
-
error
|
|
57
|
-
);
|
|
58
|
-
throw error;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Get default configuration with project isolation
|
|
63
|
-
*/
|
|
64
|
-
getDefaultConfig() {
|
|
65
|
-
const projectId = this.isolationManager.getProjectIdentification(this.projectRoot);
|
|
66
|
-
return {
|
|
67
|
-
enabled: true,
|
|
68
|
-
interval: 5,
|
|
69
|
-
// 5 minutes
|
|
70
|
-
direction: "bidirectional",
|
|
71
|
-
conflictResolution: "newest_wins",
|
|
72
|
-
retryAttempts: 3,
|
|
73
|
-
retryDelay: 3e4,
|
|
74
|
-
// 30 seconds
|
|
75
|
-
quietHours: {
|
|
76
|
-
start: 22,
|
|
77
|
-
// 10 PM
|
|
78
|
-
end: 7
|
|
79
|
-
// 7 AM
|
|
80
|
-
},
|
|
81
|
-
// Project isolation from stable identification
|
|
82
|
-
teamId: projectId.linearTeamId,
|
|
83
|
-
organization: projectId.linearOrganization,
|
|
84
|
-
workspaceFilter: projectId.workspaceFilter,
|
|
85
|
-
projectPrefix: projectId.projectPrefix,
|
|
86
|
-
lastUpdated: Date.now()
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Convert to AutoSyncConfig format
|
|
91
|
-
*/
|
|
92
|
-
toAutoSyncConfig(config) {
|
|
93
|
-
const persistedConfig = config || this.loadConfig() || this.getDefaultConfig();
|
|
94
|
-
return {
|
|
95
|
-
enabled: persistedConfig.enabled,
|
|
96
|
-
direction: persistedConfig.direction,
|
|
97
|
-
defaultTeamId: void 0,
|
|
98
|
-
// Will be set by sync engine
|
|
99
|
-
autoSync: true,
|
|
100
|
-
conflictResolution: persistedConfig.conflictResolution,
|
|
101
|
-
syncInterval: persistedConfig.interval,
|
|
102
|
-
interval: persistedConfig.interval,
|
|
103
|
-
retryAttempts: persistedConfig.retryAttempts,
|
|
104
|
-
retryDelay: persistedConfig.retryDelay,
|
|
105
|
-
quietHours: persistedConfig.quietHours
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Update specific configuration values
|
|
110
|
-
*/
|
|
111
|
-
updateConfig(updates) {
|
|
112
|
-
this.saveConfig(updates);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Check if configuration exists
|
|
116
|
-
*/
|
|
117
|
-
hasConfig() {
|
|
118
|
-
return existsSync(this.configPath);
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Reset to default configuration
|
|
122
|
-
*/
|
|
123
|
-
resetConfig() {
|
|
124
|
-
this.saveConfig(this.getDefaultConfig());
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
export {
|
|
128
|
-
LinearConfigManager
|
|
129
|
-
};
|
|
130
|
-
//# sourceMappingURL=config.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/integrations/linear/config.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Linear Auto-Sync Configuration Management\n * Handles persistent configuration for auto-sync service\n */\n\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { AutoSyncConfig } from './auto-sync.js';\nimport { ProjectIsolationManager } from '../../core/projects/project-isolation.js';\n\nexport interface PersistedSyncConfig {\n enabled: boolean;\n interval: number;\n direction: 'bidirectional' | 'to_linear' | 'from_linear';\n conflictResolution:\n | 'linear_wins'\n | 'stackmemory_wins'\n | 'manual'\n | 'newest_wins';\n retryAttempts: number;\n retryDelay: number;\n quietHours?: {\n start: number;\n end: number;\n };\n // Project isolation settings\n teamId?: string;\n organization?: string;\n workspaceFilter?: string;\n projectPrefix?: string;\n lastUpdated: number;\n}\n\nexport class LinearConfigManager {\n private configPath: string;\n private projectRoot: string;\n private isolationManager: ProjectIsolationManager;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n this.configPath = join(\n projectRoot,\n '.stackmemory',\n 'linear-auto-sync.json'\n );\n this.isolationManager = ProjectIsolationManager.getInstance();\n }\n\n /**\n * Load configuration from file\n */\n loadConfig(): PersistedSyncConfig | null {\n if (!existsSync(this.configPath)) {\n return null;\n }\n\n try {\n const configData = readFileSync(this.configPath, 'utf8');\n return JSON.parse(configData);\n } catch (error: unknown) {\n logger.error(\n 'Failed to load Linear auto-sync configuration:',\n error as Error\n );\n return null;\n }\n }\n\n /**\n * Save configuration to file\n */\n saveConfig(config: Partial<PersistedSyncConfig>): void {\n const existingConfig = this.loadConfig() || this.getDefaultConfig();\n\n const updatedConfig: PersistedSyncConfig = {\n ...existingConfig,\n ...config,\n lastUpdated: Date.now(),\n };\n\n try {\n writeFileSync(this.configPath, JSON.stringify(updatedConfig, null, 2));\n logger.info('Linear auto-sync configuration saved');\n } catch (error: unknown) {\n logger.error(\n 'Failed to save Linear auto-sync configuration:',\n error as Error\n );\n throw error;\n }\n }\n\n /**\n * Get default configuration with project isolation\n */\n getDefaultConfig(): PersistedSyncConfig {\n // Get stable project identification\n const projectId = this.isolationManager.getProjectIdentification(this.projectRoot);\n \n return {\n enabled: true,\n interval: 5, // 5 minutes\n direction: 'bidirectional',\n conflictResolution: 'newest_wins',\n retryAttempts: 3,\n retryDelay: 30000, // 30 seconds\n quietHours: {\n start: 22, // 10 PM\n end: 7, // 7 AM\n },\n // Project isolation from stable identification\n teamId: projectId.linearTeamId,\n organization: projectId.linearOrganization,\n workspaceFilter: projectId.workspaceFilter,\n projectPrefix: projectId.projectPrefix,\n lastUpdated: Date.now(),\n };\n }\n\n /**\n * Convert to AutoSyncConfig format\n */\n toAutoSyncConfig(config?: PersistedSyncConfig): AutoSyncConfig {\n const persistedConfig =\n config || this.loadConfig() || this.getDefaultConfig();\n\n return {\n enabled: persistedConfig.enabled,\n direction: persistedConfig.direction,\n defaultTeamId: undefined, // Will be set by sync engine\n autoSync: true,\n conflictResolution: persistedConfig.conflictResolution,\n syncInterval: persistedConfig.interval,\n interval: persistedConfig.interval,\n retryAttempts: persistedConfig.retryAttempts,\n retryDelay: persistedConfig.retryDelay,\n quietHours: persistedConfig.quietHours,\n };\n }\n\n /**\n * Update specific configuration values\n */\n updateConfig(updates: Partial<PersistedSyncConfig>): void {\n this.saveConfig(updates);\n }\n\n /**\n * Check if configuration exists\n */\n hasConfig(): boolean {\n return existsSync(this.configPath);\n }\n\n /**\n * Reset to default configuration\n */\n resetConfig(): void {\n this.saveConfig(this.getDefaultConfig());\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;AAKA,SAAS,cAAc,eAAe,kBAAkB;AACxD,SAAS,YAAY;AACrB,SAAS,cAAc;AAEvB,SAAS,+BAA+B;AAyBjC,MAAM,oBAAoB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,aAAqB;AAC/B,SAAK,cAAc;AACnB,SAAK,aAAa;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,mBAAmB,wBAAwB,YAAY;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,aAAyC;AACvC,QAAI,CAAC,WAAW,KAAK,UAAU,GAAG;AAChC,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,aAAa,aAAa,KAAK,YAAY,MAAM;AACvD,aAAO,KAAK,MAAM,UAAU;AAAA,IAC9B,SAAS,OAAgB;AACvB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAA4C;AACrD,UAAM,iBAAiB,KAAK,WAAW,KAAK,KAAK,iBAAiB;AAElE,UAAM,gBAAqC;AAAA,MACzC,GAAG;AAAA,MACH,GAAG;AAAA,MACH,aAAa,KAAK,IAAI;AAAA,IACxB;AAEA,QAAI;AACF,oBAAc,KAAK,YAAY,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;AACrE,aAAO,KAAK,sCAAsC;AAAA,IACpD,SAAS,OAAgB;AACvB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAwC;AAEtC,UAAM,YAAY,KAAK,iBAAiB,yBAAyB,KAAK,WAAW;AAEjF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA;AAAA,MACV,WAAW;AAAA,MACX,oBAAoB;AAAA,MACpB,eAAe;AAAA,MACf,YAAY;AAAA;AAAA,MACZ,YAAY;AAAA,QACV,OAAO;AAAA;AAAA,QACP,KAAK;AAAA;AAAA,MACP;AAAA;AAAA,MAEA,QAAQ,UAAU;AAAA,MAClB,cAAc,UAAU;AAAA,MACxB,iBAAiB,UAAU;AAAA,MAC3B,eAAe,UAAU;AAAA,MACzB,aAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAA8C;AAC7D,UAAM,kBACJ,UAAU,KAAK,WAAW,KAAK,KAAK,iBAAiB;AAEvD,WAAO;AAAA,MACL,SAAS,gBAAgB;AAAA,MACzB,WAAW,gBAAgB;AAAA,MAC3B,eAAe;AAAA;AAAA,MACf,UAAU;AAAA,MACV,oBAAoB,gBAAgB;AAAA,MACpC,cAAc,gBAAgB;AAAA,MAC9B,UAAU,gBAAgB;AAAA,MAC1B,eAAe,gBAAgB;AAAA,MAC/B,YAAY,gBAAgB;AAAA,MAC5B,YAAY,gBAAgB;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAA6C;AACxD,SAAK,WAAW,OAAO;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,WAAW,KAAK,UAAU;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAoB;AAClB,SAAK,WAAW,KAAK,iBAAiB,CAAC;AAAA,EACzC;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
-
import { dirname as __pathDirname } from 'path';
|
|
3
|
-
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
-
const __dirname = __pathDirname(__filename);
|
|
5
|
-
import { LinearRestClient } from "./rest-client.js";
|
|
6
|
-
import { logger } from "../../core/monitoring/logger.js";
|
|
7
|
-
import { IntegrationError, ErrorCode } from "../../core/errors/index.js";
|
|
8
|
-
import chalk from "chalk";
|
|
9
|
-
class LinearMigrator {
|
|
10
|
-
sourceClient;
|
|
11
|
-
targetClient;
|
|
12
|
-
config;
|
|
13
|
-
constructor(config) {
|
|
14
|
-
this.config = config;
|
|
15
|
-
this.sourceClient = new LinearRestClient(config.sourceApiKey);
|
|
16
|
-
this.targetClient = new LinearRestClient(config.targetApiKey);
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Test connections to both workspaces
|
|
20
|
-
*/
|
|
21
|
-
async testConnections() {
|
|
22
|
-
const result = {
|
|
23
|
-
source: { success: false },
|
|
24
|
-
target: { success: false }
|
|
25
|
-
};
|
|
26
|
-
try {
|
|
27
|
-
const sourceViewer = await this.sourceClient.getViewer();
|
|
28
|
-
const sourceTeam = await this.sourceClient.getTeam();
|
|
29
|
-
result.source = {
|
|
30
|
-
success: true,
|
|
31
|
-
info: {
|
|
32
|
-
user: sourceViewer,
|
|
33
|
-
team: sourceTeam
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
} catch (error) {
|
|
37
|
-
result.source = {
|
|
38
|
-
success: false,
|
|
39
|
-
error: error.message
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
try {
|
|
43
|
-
const targetViewer = await this.targetClient.getViewer();
|
|
44
|
-
const targetTeam = await this.targetClient.getTeam();
|
|
45
|
-
result.target = {
|
|
46
|
-
success: true,
|
|
47
|
-
info: {
|
|
48
|
-
user: targetViewer,
|
|
49
|
-
team: targetTeam
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
} catch (error) {
|
|
53
|
-
result.target = {
|
|
54
|
-
success: false,
|
|
55
|
-
error: error.message
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
return result;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Migrate all tasks from source to target workspace
|
|
62
|
-
*/
|
|
63
|
-
async migrate() {
|
|
64
|
-
const result = {
|
|
65
|
-
totalTasks: 0,
|
|
66
|
-
exported: 0,
|
|
67
|
-
imported: 0,
|
|
68
|
-
failed: 0,
|
|
69
|
-
deleted: 0,
|
|
70
|
-
deleteFailed: 0,
|
|
71
|
-
errors: [],
|
|
72
|
-
taskMappings: []
|
|
73
|
-
};
|
|
74
|
-
try {
|
|
75
|
-
console.log(chalk.yellow("Starting Linear workspace migration..."));
|
|
76
|
-
const sourceTasks = await this.sourceClient.getAllTasks(true);
|
|
77
|
-
result.totalTasks = sourceTasks.length;
|
|
78
|
-
console.log(
|
|
79
|
-
chalk.cyan(`Found ${sourceTasks.length} tasks in source workspace`)
|
|
80
|
-
);
|
|
81
|
-
let tasksToMigrate = sourceTasks;
|
|
82
|
-
if (this.config.taskPrefix) {
|
|
83
|
-
tasksToMigrate = sourceTasks.filter(
|
|
84
|
-
(task) => task.identifier.startsWith(this.config.taskPrefix)
|
|
85
|
-
);
|
|
86
|
-
console.log(
|
|
87
|
-
chalk.cyan(
|
|
88
|
-
`Filtered to ${tasksToMigrate.length} tasks with prefix "${this.config.taskPrefix}"`
|
|
89
|
-
)
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
if (this.config.includeStates?.length) {
|
|
93
|
-
tasksToMigrate = tasksToMigrate.filter(
|
|
94
|
-
(task) => this.config.includeStates.includes(task.state.type)
|
|
95
|
-
);
|
|
96
|
-
const stateStr = this.config.includeStates.join(", ");
|
|
97
|
-
console.log(
|
|
98
|
-
chalk.cyan(
|
|
99
|
-
`Further filtered to ${tasksToMigrate.length} tasks matching states: ${stateStr}`
|
|
100
|
-
)
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
result.exported = tasksToMigrate.length;
|
|
104
|
-
if (this.config.dryRun) {
|
|
105
|
-
console.log(chalk.yellow("DRY RUN - No tasks will be created"));
|
|
106
|
-
tasksToMigrate.forEach((task) => {
|
|
107
|
-
result.taskMappings.push({
|
|
108
|
-
sourceId: task.id,
|
|
109
|
-
sourceIdentifier: task.identifier,
|
|
110
|
-
targetId: "DRY_RUN",
|
|
111
|
-
targetIdentifier: "DRY_RUN"
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
result.imported = tasksToMigrate.length;
|
|
115
|
-
return result;
|
|
116
|
-
}
|
|
117
|
-
const targetTeam = await this.targetClient.getTeam();
|
|
118
|
-
console.log(
|
|
119
|
-
chalk.cyan(`Target team: ${targetTeam.name} (${targetTeam.key})`)
|
|
120
|
-
);
|
|
121
|
-
const batchSize = this.config.batchSize || 5;
|
|
122
|
-
const delayMs = this.config.delayMs || 2e3;
|
|
123
|
-
for (let i = 0; i < tasksToMigrate.length; i += batchSize) {
|
|
124
|
-
const batch = tasksToMigrate.slice(i, i + batchSize);
|
|
125
|
-
console.log(
|
|
126
|
-
chalk.yellow(
|
|
127
|
-
`Processing batch ${Math.floor(i / batchSize) + 1}/${Math.ceil(tasksToMigrate.length / batchSize)}`
|
|
128
|
-
)
|
|
129
|
-
);
|
|
130
|
-
for (const task of batch) {
|
|
131
|
-
try {
|
|
132
|
-
const newTask = await this.migrateTask(task, targetTeam.id);
|
|
133
|
-
const mapping = {
|
|
134
|
-
sourceId: task.id,
|
|
135
|
-
sourceIdentifier: task.identifier,
|
|
136
|
-
targetId: newTask.id,
|
|
137
|
-
targetIdentifier: newTask.identifier,
|
|
138
|
-
deleted: false
|
|
139
|
-
};
|
|
140
|
-
result.imported++;
|
|
141
|
-
console.log(
|
|
142
|
-
chalk.green(
|
|
143
|
-
`${task.identifier} \u2192 ${newTask.identifier}: ${task.title}`
|
|
144
|
-
)
|
|
145
|
-
);
|
|
146
|
-
if (this.config.deleteFromSource) {
|
|
147
|
-
try {
|
|
148
|
-
await this.deleteTask(task.id);
|
|
149
|
-
mapping.deleted = true;
|
|
150
|
-
result.deleted++;
|
|
151
|
-
console.log(
|
|
152
|
-
chalk.gray(`Deleted ${task.identifier} from source`)
|
|
153
|
-
);
|
|
154
|
-
} catch (deleteError) {
|
|
155
|
-
result.deleteFailed++;
|
|
156
|
-
result.errors.push(
|
|
157
|
-
`Delete failed for ${task.identifier}: ${deleteError.message}`
|
|
158
|
-
);
|
|
159
|
-
console.log(
|
|
160
|
-
chalk.yellow(
|
|
161
|
-
`Failed to delete ${task.identifier} from source: ${deleteError.message}`
|
|
162
|
-
)
|
|
163
|
-
);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
result.taskMappings.push(mapping);
|
|
167
|
-
} catch (error) {
|
|
168
|
-
const errorMsg = error.message;
|
|
169
|
-
result.errors.push(`${task.identifier}: ${errorMsg}`);
|
|
170
|
-
result.taskMappings.push({
|
|
171
|
-
sourceId: task.id,
|
|
172
|
-
sourceIdentifier: task.identifier,
|
|
173
|
-
error: errorMsg
|
|
174
|
-
});
|
|
175
|
-
result.failed++;
|
|
176
|
-
console.log(chalk.red(`${task.identifier}: ${errorMsg}`));
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
if (i + batchSize < tasksToMigrate.length) {
|
|
180
|
-
console.log(chalk.gray(`Waiting ${delayMs}ms before next batch...`));
|
|
181
|
-
await this.delay(delayMs);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
} catch (error) {
|
|
185
|
-
result.errors.push(`Migration failed: ${error.message}`);
|
|
186
|
-
logger.error("Migration failed:", error);
|
|
187
|
-
}
|
|
188
|
-
return result;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Migrate a single task
|
|
192
|
-
*/
|
|
193
|
-
async migrateTask(sourceTask, targetTeamId) {
|
|
194
|
-
const stateMapping = {
|
|
195
|
-
backlog: "backlog",
|
|
196
|
-
unstarted: "unstarted",
|
|
197
|
-
started: "started",
|
|
198
|
-
completed: "completed",
|
|
199
|
-
canceled: "canceled"
|
|
200
|
-
};
|
|
201
|
-
const createTaskQuery = `
|
|
202
|
-
mutation CreateIssue($input: IssueCreateInput!) {
|
|
203
|
-
issueCreate(input: $input) {
|
|
204
|
-
success
|
|
205
|
-
issue {
|
|
206
|
-
id
|
|
207
|
-
identifier
|
|
208
|
-
title
|
|
209
|
-
description
|
|
210
|
-
state {
|
|
211
|
-
id
|
|
212
|
-
name
|
|
213
|
-
type
|
|
214
|
-
}
|
|
215
|
-
priority
|
|
216
|
-
createdAt
|
|
217
|
-
updatedAt
|
|
218
|
-
url
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
`;
|
|
223
|
-
const taskInput = {
|
|
224
|
-
title: `[MIGRATED] ${sourceTask.title}`,
|
|
225
|
-
description: this.formatMigratedDescription(sourceTask),
|
|
226
|
-
teamId: targetTeamId,
|
|
227
|
-
priority: this.mapPriority(sourceTask.priority)
|
|
228
|
-
};
|
|
229
|
-
const response = await this.targetClient.makeRequest(createTaskQuery, { input: taskInput });
|
|
230
|
-
if (!response.data?.issueCreate?.success) {
|
|
231
|
-
throw new IntegrationError(
|
|
232
|
-
"Failed to create task in target workspace",
|
|
233
|
-
ErrorCode.LINEAR_SYNC_FAILED,
|
|
234
|
-
{ sourceTaskId: sourceTask.id, sourceIdentifier: sourceTask.identifier }
|
|
235
|
-
);
|
|
236
|
-
}
|
|
237
|
-
return response.data.issueCreate.issue;
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Format description with migration context
|
|
241
|
-
*/
|
|
242
|
-
formatMigratedDescription(sourceTask) {
|
|
243
|
-
let description = sourceTask.description || "";
|
|
244
|
-
description += `
|
|
245
|
-
|
|
246
|
-
---
|
|
247
|
-
**Migration Info:**
|
|
248
|
-
`;
|
|
249
|
-
description += `- Original ID: ${sourceTask.identifier}
|
|
250
|
-
`;
|
|
251
|
-
description += `- Migrated: ${(/* @__PURE__ */ new Date()).toISOString()}
|
|
252
|
-
`;
|
|
253
|
-
description += `- Original State: ${sourceTask.state.name}
|
|
254
|
-
`;
|
|
255
|
-
if (sourceTask.assignee) {
|
|
256
|
-
description += `- Original Assignee: ${sourceTask.assignee.name}
|
|
257
|
-
`;
|
|
258
|
-
}
|
|
259
|
-
if (sourceTask.estimate) {
|
|
260
|
-
description += `- Original Estimate: ${sourceTask.estimate} points
|
|
261
|
-
`;
|
|
262
|
-
}
|
|
263
|
-
return description;
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Map priority values
|
|
267
|
-
*/
|
|
268
|
-
mapPriority(priority) {
|
|
269
|
-
return priority || 0;
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* Delete a task from the source workspace
|
|
273
|
-
*/
|
|
274
|
-
async deleteTask(taskId) {
|
|
275
|
-
const deleteQuery = `
|
|
276
|
-
mutation DeleteIssue($id: String!) {
|
|
277
|
-
issueDelete(id: $id) {
|
|
278
|
-
success
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
`;
|
|
282
|
-
const response = await this.sourceClient.makeRequest(deleteQuery, {
|
|
283
|
-
id: taskId
|
|
284
|
-
});
|
|
285
|
-
if (!response.data?.issueDelete?.success) {
|
|
286
|
-
throw new IntegrationError(
|
|
287
|
-
"Failed to delete task from source workspace",
|
|
288
|
-
ErrorCode.LINEAR_SYNC_FAILED,
|
|
289
|
-
{ taskId }
|
|
290
|
-
);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Delay helper
|
|
295
|
-
*/
|
|
296
|
-
delay(ms) {
|
|
297
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
async function runMigration(config) {
|
|
301
|
-
const migrator = new LinearMigrator(config);
|
|
302
|
-
console.log(chalk.blue("Testing connections..."));
|
|
303
|
-
const connectionTest = await migrator.testConnections();
|
|
304
|
-
if (!connectionTest.source.success) {
|
|
305
|
-
console.error(
|
|
306
|
-
chalk.red(`Source connection failed: ${connectionTest.source.error}`)
|
|
307
|
-
);
|
|
308
|
-
return;
|
|
309
|
-
}
|
|
310
|
-
if (!connectionTest.target.success) {
|
|
311
|
-
console.error(
|
|
312
|
-
chalk.red(`Target connection failed: ${connectionTest.target.error}`)
|
|
313
|
-
);
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
console.log(chalk.green("Both connections successful"));
|
|
317
|
-
console.log(
|
|
318
|
-
chalk.cyan(
|
|
319
|
-
`Source: ${connectionTest.source.info.user.name} @ ${connectionTest.source.info.team.name}`
|
|
320
|
-
)
|
|
321
|
-
);
|
|
322
|
-
console.log(
|
|
323
|
-
chalk.cyan(
|
|
324
|
-
`Target: ${connectionTest.target.info.user.name} @ ${connectionTest.target.info.team.name}`
|
|
325
|
-
)
|
|
326
|
-
);
|
|
327
|
-
const result = await migrator.migrate();
|
|
328
|
-
console.log(chalk.blue("\nMigration Summary:"));
|
|
329
|
-
console.log(` Total tasks: ${result.totalTasks}`);
|
|
330
|
-
console.log(` Exported: ${result.exported}`);
|
|
331
|
-
console.log(chalk.green(` Imported: ${result.imported}`));
|
|
332
|
-
console.log(chalk.red(` Failed: ${result.failed}`));
|
|
333
|
-
if (config.deleteFromSource) {
|
|
334
|
-
console.log(chalk.gray(` Deleted: ${result.deleted}`));
|
|
335
|
-
if (result.deleteFailed > 0) {
|
|
336
|
-
console.log(chalk.yellow(` Delete failed: ${result.deleteFailed}`));
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
if (result.errors.length > 0) {
|
|
340
|
-
console.log(chalk.red("\nErrors:"));
|
|
341
|
-
result.errors.forEach((error) => console.log(chalk.red(` - ${error}`)));
|
|
342
|
-
}
|
|
343
|
-
if (result.imported > 0) {
|
|
344
|
-
console.log(
|
|
345
|
-
chalk.green(
|
|
346
|
-
`
|
|
347
|
-
Migration completed! ${result.imported} tasks migrated successfully.`
|
|
348
|
-
)
|
|
349
|
-
);
|
|
350
|
-
if (config.deleteFromSource && result.deleted > 0) {
|
|
351
|
-
console.log(
|
|
352
|
-
chalk.gray(` ${result.deleted} tasks deleted from source workspace.`)
|
|
353
|
-
);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
export {
|
|
358
|
-
LinearMigrator,
|
|
359
|
-
runMigration
|
|
360
|
-
};
|
|
361
|
-
//# sourceMappingURL=migration.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/integrations/linear/migration.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Linear Workspace Migration Tool\n * Migrates all tasks from one Linear workspace to another\n */\n\nimport { LinearRestClient } from './rest-client.js';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { IntegrationError, ErrorCode } from '../../core/errors/index.js';\nimport chalk from 'chalk';\n\nexport interface MigrationConfig {\n sourceApiKey: string;\n targetApiKey: string;\n dryRun?: boolean;\n includeStates?: string[]; // Filter by state\n taskPrefix?: string; // Only migrate tasks with this identifier prefix (e.g., \"STA-\")\n deleteFromSource?: boolean; // Delete tasks from source after successful migration\n batchSize?: number;\n delayMs?: number; // Delay between API calls\n}\n\nexport interface MigrationResult {\n totalTasks: number;\n exported: number;\n imported: number;\n failed: number;\n deleted: number;\n deleteFailed: number;\n errors: string[];\n taskMappings: Array<{\n sourceId: string;\n sourceIdentifier: string;\n targetId?: string;\n targetIdentifier?: string;\n deleted?: boolean;\n error?: string;\n }>;\n}\n\nexport class LinearMigrator {\n private sourceClient: LinearRestClient;\n private targetClient: LinearRestClient;\n private config: MigrationConfig;\n\n constructor(config: MigrationConfig) {\n this.config = config;\n this.sourceClient = new LinearRestClient(config.sourceApiKey);\n this.targetClient = new LinearRestClient(config.targetApiKey);\n }\n\n /**\n * Test connections to both workspaces\n */\n async testConnections(): Promise<{\n source: { success: boolean; info?: any; error?: string };\n target: { success: boolean; info?: any; error?: string };\n }> {\n const result = {\n source: { success: false } as any,\n target: { success: false } as any,\n };\n\n // Test source connection\n try {\n const sourceViewer = await this.sourceClient.getViewer();\n const sourceTeam = await this.sourceClient.getTeam();\n result.source = {\n success: true,\n info: {\n user: sourceViewer,\n team: sourceTeam,\n },\n };\n } catch (error: unknown) {\n result.source = {\n success: false,\n error: (error as Error).message,\n };\n }\n\n // Test target connection\n try {\n const targetViewer = await this.targetClient.getViewer();\n const targetTeam = await this.targetClient.getTeam();\n result.target = {\n success: true,\n info: {\n user: targetViewer,\n team: targetTeam,\n },\n };\n } catch (error: unknown) {\n result.target = {\n success: false,\n error: (error as Error).message,\n };\n }\n\n return result;\n }\n\n /**\n * Migrate all tasks from source to target workspace\n */\n async migrate(): Promise<MigrationResult> {\n const result: MigrationResult = {\n totalTasks: 0,\n exported: 0,\n imported: 0,\n failed: 0,\n deleted: 0,\n deleteFailed: 0,\n errors: [],\n taskMappings: [],\n };\n\n try {\n console.log(chalk.yellow('Starting Linear workspace migration...'));\n\n // Get all tasks from source\n const sourceTasks = await this.sourceClient.getAllTasks(true); // Force refresh\n result.totalTasks = sourceTasks.length;\n console.log(\n chalk.cyan(`Found ${sourceTasks.length} tasks in source workspace`)\n );\n\n // Filter by prefix (e.g., \"STA-\" tasks only)\n let tasksToMigrate = sourceTasks;\n if (this.config.taskPrefix) {\n tasksToMigrate = sourceTasks.filter((task: any) =>\n task.identifier.startsWith(this.config.taskPrefix!)\n );\n console.log(\n chalk.cyan(\n `Filtered to ${tasksToMigrate.length} tasks with prefix \"${this.config.taskPrefix}\"`\n )\n );\n }\n\n // Filter by states if specified\n if (this.config.includeStates?.length) {\n tasksToMigrate = tasksToMigrate.filter((task: any) =>\n this.config.includeStates!.includes(task.state.type)\n );\n const stateStr = this.config.includeStates.join(', ');\n console.log(\n chalk.cyan(\n `Further filtered to ${tasksToMigrate.length} tasks matching states: ${stateStr}`\n )\n );\n }\n\n result.exported = tasksToMigrate.length;\n\n if (this.config.dryRun) {\n console.log(chalk.yellow('DRY RUN - No tasks will be created'));\n tasksToMigrate.forEach((task) => {\n result.taskMappings.push({\n sourceId: task.id,\n sourceIdentifier: task.identifier,\n targetId: 'DRY_RUN',\n targetIdentifier: 'DRY_RUN',\n });\n });\n result.imported = tasksToMigrate.length;\n return result;\n }\n\n // Get target team info\n const targetTeam = await this.targetClient.getTeam();\n console.log(\n chalk.cyan(`Target team: ${targetTeam.name} (${targetTeam.key})`)\n );\n\n // Migrate tasks in batches\n const batchSize = this.config.batchSize || 5;\n const delayMs = this.config.delayMs || 2000;\n\n for (let i = 0; i < tasksToMigrate.length; i += batchSize) {\n const batch = tasksToMigrate.slice(i, i + batchSize);\n console.log(\n chalk.yellow(\n `Processing batch ${Math.floor(i / batchSize) + 1}/${Math.ceil(tasksToMigrate.length / batchSize)}`\n )\n );\n\n for (const task of batch) {\n try {\n const newTask = await this.migrateTask(task, targetTeam.id);\n const mapping = {\n sourceId: task.id,\n sourceIdentifier: task.identifier,\n targetId: newTask.id,\n targetIdentifier: newTask.identifier,\n deleted: false,\n };\n\n result.imported++;\n console.log(\n chalk.green(\n `${task.identifier} \u2192 ${newTask.identifier}: ${task.title}`\n )\n );\n\n // Delete from source if configured\n if (this.config.deleteFromSource) {\n try {\n await this.deleteTask(task.id);\n mapping.deleted = true;\n result.deleted++;\n console.log(\n chalk.gray(`Deleted ${task.identifier} from source`)\n );\n } catch (deleteError: unknown) {\n result.deleteFailed++;\n result.errors.push(\n `Delete failed for ${task.identifier}: ${(deleteError as Error).message}`\n );\n console.log(\n chalk.yellow(\n `Failed to delete ${task.identifier} from source: ${(deleteError as Error).message}`\n )\n );\n }\n }\n\n result.taskMappings.push(mapping);\n } catch (error: unknown) {\n const errorMsg = (error as Error).message;\n result.errors.push(`${task.identifier}: ${errorMsg}`);\n result.taskMappings.push({\n sourceId: task.id,\n sourceIdentifier: task.identifier,\n error: errorMsg,\n });\n result.failed++;\n console.log(chalk.red(`${task.identifier}: ${errorMsg}`));\n }\n }\n\n // Delay between batches to avoid rate limits\n if (i + batchSize < tasksToMigrate.length) {\n console.log(chalk.gray(`Waiting ${delayMs}ms before next batch...`));\n await this.delay(delayMs);\n }\n }\n } catch (error: unknown) {\n result.errors.push(`Migration failed: ${(error as Error).message}`);\n logger.error('Migration failed:', error as Error);\n }\n\n return result;\n }\n\n /**\n * Migrate a single task\n */\n private async migrateTask(\n sourceTask: any,\n targetTeamId: string\n ): Promise<any> {\n // Map states from source to target format\n const stateMapping: Record<string, string> = {\n backlog: 'backlog',\n unstarted: 'unstarted',\n started: 'started',\n completed: 'completed',\n canceled: 'canceled',\n };\n\n // Create task in target workspace using GraphQL\n const createTaskQuery = `\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 createdAt\n updatedAt\n url\n }\n }\n }\n `;\n\n // Prepare task input\n const taskInput = {\n title: `[MIGRATED] ${sourceTask.title}`,\n description: this.formatMigratedDescription(sourceTask),\n teamId: targetTeamId,\n priority: this.mapPriority(sourceTask.priority),\n };\n\n const response = await this.targetClient.makeRequest<{\n data: {\n issueCreate: {\n success: boolean;\n issue: any;\n };\n };\n }>(createTaskQuery, { input: taskInput });\n\n if (!response.data?.issueCreate?.success) {\n throw new IntegrationError(\n 'Failed to create task in target workspace',\n ErrorCode.LINEAR_SYNC_FAILED,\n { sourceTaskId: sourceTask.id, sourceIdentifier: sourceTask.identifier }\n );\n }\n\n return response.data.issueCreate.issue;\n }\n\n /**\n * Format description with migration context\n */\n private formatMigratedDescription(sourceTask: any): string {\n let description = sourceTask.description || '';\n\n description += `\\n\\n---\\n**Migration Info:**\\n`;\n description += `- Original ID: ${sourceTask.identifier}\\n`;\n description += `- Migrated: ${new Date().toISOString()}\\n`;\n description += `- Original State: ${sourceTask.state.name}\\n`;\n\n if (sourceTask.assignee) {\n description += `- Original Assignee: ${sourceTask.assignee.name}\\n`;\n }\n\n if (sourceTask.estimate) {\n description += `- Original Estimate: ${sourceTask.estimate} points\\n`;\n }\n\n return description;\n }\n\n /**\n * Map priority values\n */\n private mapPriority(priority?: number): number {\n // Linear priorities: 0=none, 1=urgent, 2=high, 3=medium, 4=low\n return priority || 0;\n }\n\n /**\n * Delete a task from the source workspace\n */\n private async deleteTask(taskId: string): Promise<void> {\n const deleteQuery = `\n mutation DeleteIssue($id: String!) {\n issueDelete(id: $id) {\n success\n }\n }\n `;\n\n const response = await (this.sourceClient as any).makeRequest(deleteQuery, {\n id: taskId,\n });\n\n if (!response.data?.issueDelete?.success) {\n throw new IntegrationError(\n 'Failed to delete task from source workspace',\n ErrorCode.LINEAR_SYNC_FAILED,\n { taskId }\n );\n }\n }\n\n /**\n * Delay helper\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * CLI function to run migration\n */\nexport async function runMigration(config: MigrationConfig): Promise<void> {\n const migrator = new LinearMigrator(config);\n\n console.log(chalk.blue('Testing connections...'));\n const connectionTest = await migrator.testConnections();\n\n if (!connectionTest.source.success) {\n console.error(\n chalk.red(`Source connection failed: ${connectionTest.source.error}`)\n );\n return;\n }\n\n if (!connectionTest.target.success) {\n console.error(\n chalk.red(`Target connection failed: ${connectionTest.target.error}`)\n );\n return;\n }\n\n console.log(chalk.green('Both connections successful'));\n console.log(\n chalk.cyan(\n `Source: ${connectionTest.source.info.user.name} @ ${connectionTest.source.info.team.name}`\n )\n );\n console.log(\n chalk.cyan(\n `Target: ${connectionTest.target.info.user.name} @ ${connectionTest.target.info.team.name}`\n )\n );\n\n const result = await migrator.migrate();\n\n console.log(chalk.blue('\\nMigration Summary:'));\n console.log(` Total tasks: ${result.totalTasks}`);\n console.log(` Exported: ${result.exported}`);\n console.log(chalk.green(` Imported: ${result.imported}`));\n console.log(chalk.red(` Failed: ${result.failed}`));\n if (config.deleteFromSource) {\n console.log(chalk.gray(` Deleted: ${result.deleted}`));\n if (result.deleteFailed > 0) {\n console.log(chalk.yellow(` Delete failed: ${result.deleteFailed}`));\n }\n }\n\n if (result.errors.length > 0) {\n console.log(chalk.red('\\nErrors:'));\n result.errors.forEach((error) => console.log(chalk.red(` - ${error}`)));\n }\n\n if (result.imported > 0) {\n console.log(\n chalk.green(\n `\\nMigration completed! ${result.imported} tasks migrated successfully.`\n )\n );\n if (config.deleteFromSource && result.deleted > 0) {\n console.log(\n chalk.gray(` ${result.deleted} tasks deleted from source workspace.`)\n );\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|