@stackmemoryai/stackmemory 0.2.7 ā 0.2.8
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 +25 -8
- package/dist/scripts/cancel-duplicate-tasks.js +2 -1
- package/dist/scripts/cancel-duplicate-tasks.js.map +1 -1
- package/dist/scripts/list-linear-tasks.js +3 -4
- package/dist/scripts/list-linear-tasks.js.map +1 -1
- package/dist/scripts/merge-linear-duplicates-safe.js +4 -2
- package/dist/scripts/merge-linear-duplicates-safe.js.map +1 -1
- package/dist/scripts/show-linear-summary.js +4 -1
- package/dist/scripts/show-linear-summary.js.map +1 -1
- package/dist/scripts/status.js +6 -2
- package/dist/scripts/status.js.map +1 -1
- package/dist/src/cli/auto-detect.js.map +1 -1
- package/dist/src/cli/claude-sm.js.map +1 -1
- package/dist/src/cli/commands/config.d.ts +6 -0
- package/dist/src/cli/commands/config.d.ts.map +1 -0
- package/dist/src/cli/commands/config.js +224 -0
- package/dist/src/cli/commands/config.js.map +1 -0
- package/dist/src/cli/commands/linear.d.ts.map +1 -1
- package/dist/src/cli/commands/linear.js +123 -47
- package/dist/src/cli/commands/linear.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +48 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/config/config-manager.d.ts +95 -0
- package/dist/src/core/config/config-manager.d.ts.map +1 -0
- package/dist/src/core/config/config-manager.js +359 -0
- package/dist/src/core/config/config-manager.js.map +1 -0
- package/dist/src/core/config/types.d.ts +72 -0
- package/dist/src/core/config/types.d.ts.map +1 -0
- package/dist/src/core/config/types.js +127 -0
- package/dist/src/core/config/types.js.map +1 -0
- package/dist/src/core/context/compaction-handler.d.ts +119 -0
- package/dist/src/core/context/compaction-handler.d.ts.map +1 -0
- package/dist/src/core/context/compaction-handler.js +306 -0
- package/dist/src/core/context/compaction-handler.js.map +1 -0
- package/dist/src/core/context/model-aware-compaction.d.ts +101 -0
- package/dist/src/core/context/model-aware-compaction.d.ts.map +1 -0
- package/dist/src/core/context/model-aware-compaction.js +616 -0
- package/dist/src/core/context/model-aware-compaction.js.map +1 -0
- package/dist/src/core/query/query-parser.d.ts +104 -0
- package/dist/src/core/query/query-parser.d.ts.map +1 -0
- package/dist/src/core/query/query-parser.js +347 -0
- package/dist/src/core/query/query-parser.js.map +1 -0
- package/dist/src/core/retrieval/index.d.ts +8 -0
- package/dist/src/core/retrieval/index.d.ts.map +1 -0
- package/dist/src/core/retrieval/index.js +8 -0
- package/dist/src/core/retrieval/index.js.map +1 -0
- package/dist/src/core/retrieval/llm-context-retrieval.d.ts +71 -0
- package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +1 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js +545 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +1 -0
- package/dist/src/core/retrieval/summary-generator.d.ts +63 -0
- package/dist/src/core/retrieval/summary-generator.d.ts.map +1 -0
- package/dist/src/core/retrieval/summary-generator.js +622 -0
- package/dist/src/core/retrieval/summary-generator.js.map +1 -0
- package/dist/src/core/retrieval/types.d.ts +257 -0
- package/dist/src/core/retrieval/types.d.ts.map +1 -0
- package/dist/src/core/retrieval/types.js +18 -0
- package/dist/src/core/retrieval/types.js.map +1 -0
- package/dist/src/core/trace/trace-detector.d.ts +108 -0
- package/dist/src/core/trace/trace-detector.d.ts.map +1 -0
- package/dist/src/core/trace/trace-detector.demo.d.ts +5 -0
- package/dist/src/core/trace/trace-detector.demo.d.ts.map +1 -0
- package/dist/src/core/trace/trace-detector.demo.js +145 -0
- package/dist/src/core/trace/trace-detector.demo.js.map +1 -0
- package/dist/src/core/trace/trace-detector.js +425 -0
- package/dist/src/core/trace/trace-detector.js.map +1 -0
- package/dist/src/core/trace/trace-store.d.ts +60 -0
- package/dist/src/core/trace/trace-store.d.ts.map +1 -0
- package/dist/src/core/trace/trace-store.js +323 -0
- package/dist/src/core/trace/trace-store.js.map +1 -0
- package/dist/src/core/trace/types.d.ts +81 -0
- package/dist/src/core/trace/types.d.ts.map +1 -0
- package/dist/src/core/trace/types.js +70 -0
- package/dist/src/core/trace/types.js.map +1 -0
- package/dist/src/integrations/linear/sync-manager.d.ts +76 -0
- package/dist/src/integrations/linear/sync-manager.d.ts.map +1 -0
- package/dist/src/integrations/linear/sync-manager.js +223 -0
- package/dist/src/integrations/linear/sync-manager.js.map +1 -0
- package/dist/src/integrations/mcp/server.d.ts +8 -0
- package/dist/src/integrations/mcp/server.d.ts.map +1 -1
- package/dist/src/integrations/mcp/server.js +368 -16
- package/dist/src/integrations/mcp/server.js.map +1 -1
- package/dist/src/integrations/mcp/trace-test.d.ts +5 -0
- package/dist/src/integrations/mcp/trace-test.d.ts.map +1 -0
- package/dist/src/integrations/mcp/trace-test.js +54 -0
- package/dist/src/integrations/mcp/trace-test.js.map +1 -0
- package/dist/src/services/config-service.d.ts +1 -1
- package/dist/src/services/config-service.d.ts.map +1 -1
- package/dist/src/services/config-service.js.map +1 -1
- package/dist/src/types/task.d.ts +11 -1
- package/dist/src/types/task.d.ts.map +1 -1
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.d.ts.map +1 -1
- package/dist/src/utils/logger.js.map +1 -1
- package/package.json +9 -8
- package/dist/attention-scoring/src/attention-tracker.d.ts +0 -79
- package/dist/attention-scoring/src/attention-tracker.d.ts.map +0 -1
- package/dist/attention-scoring/src/attention-tracker.js +0 -488
- package/dist/attention-scoring/src/attention-tracker.js.map +0 -1
- package/dist/attention-scoring/src/mcp-integration.d.ts +0 -56
- package/dist/attention-scoring/src/mcp-integration.d.ts.map +0 -1
- package/dist/attention-scoring/src/mcp-integration.js +0 -369
- package/dist/attention-scoring/src/mcp-integration.js.map +0 -1
- package/dist/index.js +0 -382
- package/dist/p2p-sync/src/p2p-sync.d.ts +0 -81
- package/dist/p2p-sync/src/p2p-sync.d.ts.map +0 -1
- package/dist/p2p-sync/src/p2p-sync.js +0 -457
- package/dist/p2p-sync/src/p2p-sync.js.map +0 -1
- package/dist/p2p-sync/src/team-context-sync.d.ts +0 -99
- package/dist/p2p-sync/src/team-context-sync.d.ts.map +0 -1
- package/dist/p2p-sync/src/team-context-sync.js +0 -491
- package/dist/p2p-sync/src/team-context-sync.js.map +0 -1
- package/dist/scripts/merge-linear-duplicates.d.ts +0 -7
- package/dist/scripts/merge-linear-duplicates.d.ts.map +0 -1
- package/dist/scripts/merge-linear-duplicates.js +0 -126
- package/dist/scripts/merge-linear-duplicates.js.map +0 -1
- package/dist/src/analytics/api/analytics-api.d.ts +0 -24
- package/dist/src/analytics/api/analytics-api.d.ts.map +0 -1
- package/dist/src/analytics/api/analytics-api.js +0 -279
- package/dist/src/analytics/api/analytics-api.js.map +0 -1
- package/dist/src/analytics/core/analytics-service.d.ts +0 -23
- package/dist/src/analytics/core/analytics-service.d.ts.map +0 -1
- package/dist/src/analytics/core/analytics-service.js +0 -160
- package/dist/src/analytics/core/analytics-service.js.map +0 -1
- package/dist/src/analytics/index.d.ts +0 -12
- package/dist/src/analytics/index.d.ts.map +0 -1
- package/dist/src/analytics/index.js +0 -11
- package/dist/src/analytics/index.js.map +0 -1
- package/dist/src/analytics/queries/metrics-queries.d.ts +0 -11
- package/dist/src/analytics/queries/metrics-queries.d.ts.map +0 -1
- package/dist/src/analytics/queries/metrics-queries.js +0 -179
- package/dist/src/analytics/queries/metrics-queries.js.map +0 -1
- package/dist/src/analytics/types/metrics.d.ts +0 -60
- package/dist/src/analytics/types/metrics.d.ts.map +0 -1
- package/dist/src/analytics/types/metrics.js +0 -2
- package/dist/src/analytics/types/metrics.js.map +0 -1
- package/dist/src/beads/beads-task-store.d.ts +0 -117
- package/dist/src/beads/beads-task-store.d.ts.map +0 -1
- package/dist/src/beads/beads-task-store.js +0 -318
- package/dist/src/beads/beads-task-store.js.map +0 -1
- package/dist/src/beads/task-aware-context.d.ts +0 -103
- package/dist/src/beads/task-aware-context.d.ts.map +0 -1
- package/dist/src/beads/task-aware-context.js +0 -395
- package/dist/src/beads/task-aware-context.js.map +0 -1
- package/dist/src/beads-task-store.d.ts +0 -117
- package/dist/src/beads-task-store.d.ts.map +0 -1
- package/dist/src/beads-task-store.js +0 -318
- package/dist/src/beads-task-store.js.map +0 -1
- package/dist/src/cli/__tests__/index.test.d.ts +0 -5
- package/dist/src/cli/__tests__/index.test.d.ts.map +0 -1
- package/dist/src/cli/__tests__/index.test.js +0 -726
- package/dist/src/cli/__tests__/index.test.js.map +0 -1
- package/dist/src/cli/analytics-viewer.d.ts +0 -3
- package/dist/src/cli/analytics-viewer.d.ts.map +0 -1
- package/dist/src/cli/analytics-viewer.js +0 -89
- package/dist/src/cli/analytics-viewer.js.map +0 -1
- package/dist/src/cli/cli.d.ts +0 -7
- package/dist/src/cli/cli.d.ts.map +0 -1
- package/dist/src/cli/cli.js +0 -704
- package/dist/src/cli/cli.js.map +0 -1
- package/dist/src/cli/project-commands.d.ts +0 -8
- package/dist/src/cli/project-commands.d.ts.map +0 -1
- package/dist/src/cli/project-commands.js +0 -212
- package/dist/src/cli/project-commands.js.map +0 -1
- package/dist/src/cli.d.ts +0 -7
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/cli.js +0 -73
- package/dist/src/cli.js.map +0 -1
- package/dist/src/core/context/__tests__/frame-manager.test.d.ts +0 -5
- package/dist/src/core/context/__tests__/frame-manager.test.d.ts.map +0 -1
- package/dist/src/core/context/__tests__/frame-manager.test.js +0 -892
- package/dist/src/core/context/__tests__/frame-manager.test.js.map +0 -1
- package/dist/src/core/error-handler.d.ts +0 -46
- package/dist/src/core/error-handler.d.ts.map +0 -1
- package/dist/src/core/error-handler.js +0 -212
- package/dist/src/core/error-handler.js.map +0 -1
- package/dist/src/core/errors/__tests__/error-handling.test.d.ts +0 -5
- package/dist/src/core/errors/__tests__/error-handling.test.d.ts.map +0 -1
- package/dist/src/core/errors/__tests__/error-handling.test.js +0 -239
- package/dist/src/core/errors/__tests__/error-handling.test.js.map +0 -1
- package/dist/src/core/frame-manager.d.ts +0 -106
- package/dist/src/core/frame-manager.d.ts.map +0 -1
- package/dist/src/core/frame-manager.js +0 -387
- package/dist/src/core/frame-manager.js.map +0 -1
- package/dist/src/core/logger.d.ts +0 -24
- package/dist/src/core/logger.d.ts.map +0 -1
- package/dist/src/core/logger.js +0 -121
- package/dist/src/core/logger.js.map +0 -1
- package/dist/src/core/logger.test.d.ts +0 -2
- package/dist/src/core/logger.test.d.ts.map +0 -1
- package/dist/src/core/logger.test.js +0 -31
- package/dist/src/core/logger.test.js.map +0 -1
- package/dist/src/core/progress-tracker.d.ts +0 -95
- package/dist/src/core/progress-tracker.d.ts.map +0 -1
- package/dist/src/core/progress-tracker.js +0 -178
- package/dist/src/core/progress-tracker.js.map +0 -1
- package/dist/src/core/project-manager.d.ts +0 -130
- package/dist/src/core/project-manager.d.ts.map +0 -1
- package/dist/src/core/project-manager.js +0 -582
- package/dist/src/core/project-manager.js.map +0 -1
- package/dist/src/core/update-checker.d.ts +0 -38
- package/dist/src/core/update-checker.d.ts.map +0 -1
- package/dist/src/core/update-checker.js +0 -156
- package/dist/src/core/update-checker.js.map +0 -1
- package/dist/src/error-handler.d.ts +0 -42
- package/dist/src/error-handler.d.ts.map +0 -1
- package/dist/src/error-handler.js +0 -155
- package/dist/src/error-handler.js.map +0 -1
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts +0 -5
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts.map +0 -1
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js +0 -712
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js.map +0 -1
- package/dist/src/frame-manager.d.ts +0 -106
- package/dist/src/frame-manager.d.ts.map +0 -1
- package/dist/src/frame-manager.js +0 -361
- package/dist/src/frame-manager.js.map +0 -1
- package/dist/src/integrations/browser-mcp.d.ts +0 -94
- package/dist/src/integrations/browser-mcp.d.ts.map +0 -1
- package/dist/src/integrations/browser-mcp.js +0 -431
- package/dist/src/integrations/browser-mcp.js.map +0 -1
- package/dist/src/integrations/linear/__tests__/auth.test.d.ts +0 -5
- package/dist/src/integrations/linear/__tests__/auth.test.d.ts.map +0 -1
- package/dist/src/integrations/linear/__tests__/auth.test.js +0 -517
- package/dist/src/integrations/linear/__tests__/auth.test.js.map +0 -1
- package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts +0 -5
- package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts.map +0 -1
- package/dist/src/integrations/linear/__tests__/sync-service.test.js +0 -700
- package/dist/src/integrations/linear/__tests__/sync-service.test.js.map +0 -1
- package/dist/src/integrations/linear-auth.d.ts +0 -99
- package/dist/src/integrations/linear-auth.d.ts.map +0 -1
- package/dist/src/integrations/linear-auth.js +0 -319
- package/dist/src/integrations/linear-auth.js.map +0 -1
- package/dist/src/integrations/linear-auto-sync.d.ts +0 -77
- package/dist/src/integrations/linear-auto-sync.d.ts.map +0 -1
- package/dist/src/integrations/linear-auto-sync.js +0 -268
- package/dist/src/integrations/linear-auto-sync.js.map +0 -1
- package/dist/src/integrations/linear-client.d.ts +0 -86
- package/dist/src/integrations/linear-client.d.ts.map +0 -1
- package/dist/src/integrations/linear-client.js +0 -277
- package/dist/src/integrations/linear-client.js.map +0 -1
- package/dist/src/integrations/linear-config.d.ts +0 -51
- package/dist/src/integrations/linear-config.d.ts.map +0 -1
- package/dist/src/integrations/linear-config.js +0 -103
- package/dist/src/integrations/linear-config.js.map +0 -1
- package/dist/src/integrations/linear-sync.d.ts +0 -97
- package/dist/src/integrations/linear-sync.d.ts.map +0 -1
- package/dist/src/integrations/linear-sync.js +0 -391
- package/dist/src/integrations/linear-sync.js.map +0 -1
- package/dist/src/integrations/mcp/__tests__/server.test.d.ts +0 -5
- package/dist/src/integrations/mcp/__tests__/server.test.d.ts.map +0 -1
- package/dist/src/integrations/mcp/__tests__/server.test.js +0 -790
- package/dist/src/integrations/mcp/__tests__/server.test.js.map +0 -1
- package/dist/src/logger.d.ts +0 -24
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/logger.js +0 -120
- package/dist/src/logger.js.map +0 -1
- package/dist/src/mcp/mcp-server.d.ts +0 -40
- package/dist/src/mcp/mcp-server.d.ts.map +0 -1
- package/dist/src/mcp/mcp-server.js +0 -828
- package/dist/src/mcp/mcp-server.js.map +0 -1
- package/dist/src/mcp-server.d.ts +0 -32
- package/dist/src/mcp-server.d.ts.map +0 -1
- package/dist/src/mcp-server.js +0 -441
- package/dist/src/mcp-server.js.map +0 -1
- package/dist/src/pebbles/pebbles-task-store.d.ts +0 -117
- package/dist/src/pebbles/pebbles-task-store.d.ts.map +0 -1
- package/dist/src/pebbles/pebbles-task-store.js +0 -335
- package/dist/src/pebbles/pebbles-task-store.js.map +0 -1
- package/dist/src/pebbles/task-aware-context.d.ts +0 -103
- package/dist/src/pebbles/task-aware-context.d.ts.map +0 -1
- package/dist/src/pebbles/task-aware-context.js +0 -412
- package/dist/src/pebbles/task-aware-context.js.map +0 -1
- package/dist/src/railway/index.d.ts +0 -7
- package/dist/src/railway/index.d.ts.map +0 -1
- package/dist/src/railway/index.js +0 -401
- package/dist/src/railway/index.js.map +0 -1
- package/dist/src/runway/auth/auth-middleware.d.ts +0 -66
- package/dist/src/runway/auth/auth-middleware.d.ts.map +0 -1
- package/dist/src/runway/auth/auth-middleware.js +0 -337
- package/dist/src/runway/auth/auth-middleware.js.map +0 -1
- package/dist/src/runway/server/runway-mcp-server.d.ts +0 -46
- package/dist/src/runway/server/runway-mcp-server.d.ts.map +0 -1
- package/dist/src/runway/server/runway-mcp-server.js +0 -601
- package/dist/src/runway/server/runway-mcp-server.js.map +0 -1
- package/dist/src/runway.bak/auth/auth-middleware.d.ts +0 -66
- package/dist/src/runway.bak/auth/auth-middleware.d.ts.map +0 -1
- package/dist/src/runway.bak/auth/auth-middleware.js +0 -337
- package/dist/src/runway.bak/auth/auth-middleware.js.map +0 -1
- package/dist/src/runway.bak/server/runway-mcp-server.d.ts +0 -46
- package/dist/src/runway.bak/server/runway-mcp-server.d.ts.map +0 -1
- package/dist/src/runway.bak/server/runway-mcp-server.js +0 -601
- package/dist/src/runway.bak/server/runway-mcp-server.js.map +0 -1
- package/dist/src/task-aware-context.d.ts +0 -103
- package/dist/src/task-aware-context.d.ts.map +0 -1
- package/dist/src/task-aware-context.js +0 -395
- package/dist/src/task-aware-context.js.map +0 -1
|
@@ -1,491 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Team Shared Context Management
|
|
3
|
-
*
|
|
4
|
-
* Per-project shared context that syncs across team members
|
|
5
|
-
* Optimized for LLM context windows and collaborative AI coding
|
|
6
|
-
*/
|
|
7
|
-
import { P2PSync } from './p2p-sync';
|
|
8
|
-
import Database from 'better-sqlite3';
|
|
9
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
10
|
-
import { createHash } from 'crypto';
|
|
11
|
-
// ============================================
|
|
12
|
-
// Team Context Manager
|
|
13
|
-
// ============================================
|
|
14
|
-
export class TeamContextManager {
|
|
15
|
-
p2pSync;
|
|
16
|
-
db;
|
|
17
|
-
projectId;
|
|
18
|
-
teamId;
|
|
19
|
-
userId;
|
|
20
|
-
// Context layers
|
|
21
|
-
sharedContext;
|
|
22
|
-
personalContext;
|
|
23
|
-
activeFrames = new Map();
|
|
24
|
-
constructor(config) {
|
|
25
|
-
this.projectId = config.projectId;
|
|
26
|
-
this.teamId = config.teamId;
|
|
27
|
-
this.userId = config.userId;
|
|
28
|
-
this.db = new Database(config.dbPath || `.stackmemory/${this.projectId}/context.db`);
|
|
29
|
-
this.initDB();
|
|
30
|
-
// Initialize P2P sync for team
|
|
31
|
-
this.p2pSync = new P2PSync({
|
|
32
|
-
userId: this.userId,
|
|
33
|
-
teamId: this.teamId,
|
|
34
|
-
signalingServer: config.signalingServer || 'wss://signal.stackmemory.dev',
|
|
35
|
-
dbPath: `.stackmemory/${this.projectId}/sync.db`
|
|
36
|
-
});
|
|
37
|
-
this.sharedContext = new SharedContext(this.db, this.p2pSync);
|
|
38
|
-
this.personalContext = new PersonalContext(this.db);
|
|
39
|
-
this.setupSyncHandlers();
|
|
40
|
-
}
|
|
41
|
-
// ============================================
|
|
42
|
-
// Database Schema
|
|
43
|
-
// ============================================
|
|
44
|
-
initDB() {
|
|
45
|
-
this.db.exec(`
|
|
46
|
-
-- Shared context visible to all team members
|
|
47
|
-
CREATE TABLE IF NOT EXISTS shared_context (
|
|
48
|
-
context_id TEXT PRIMARY KEY,
|
|
49
|
-
project_id TEXT NOT NULL,
|
|
50
|
-
type TEXT NOT NULL, -- 'decision', 'constraint', 'architecture', 'learning'
|
|
51
|
-
content TEXT NOT NULL,
|
|
52
|
-
importance REAL DEFAULT 0.5,
|
|
53
|
-
author_id TEXT NOT NULL,
|
|
54
|
-
created_at INTEGER DEFAULT (unixepoch()),
|
|
55
|
-
updated_at INTEGER DEFAULT (unixepoch()),
|
|
56
|
-
vector_clock TEXT NOT NULL,
|
|
57
|
-
active BOOLEAN DEFAULT TRUE
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
-- Personal context (not shared)
|
|
61
|
-
CREATE TABLE IF NOT EXISTS personal_context (
|
|
62
|
-
context_id TEXT PRIMARY KEY,
|
|
63
|
-
user_id TEXT NOT NULL,
|
|
64
|
-
project_id TEXT NOT NULL,
|
|
65
|
-
type TEXT NOT NULL,
|
|
66
|
-
content TEXT NOT NULL,
|
|
67
|
-
importance REAL DEFAULT 0.5,
|
|
68
|
-
created_at INTEGER DEFAULT (unixepoch())
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
-- Active working frames (ephemeral, shared during collaboration)
|
|
72
|
-
CREATE TABLE IF NOT EXISTS active_frames (
|
|
73
|
-
frame_id TEXT PRIMARY KEY,
|
|
74
|
-
project_id TEXT NOT NULL,
|
|
75
|
-
user_id TEXT NOT NULL,
|
|
76
|
-
task TEXT NOT NULL,
|
|
77
|
-
status TEXT DEFAULT 'active', -- 'active', 'paused', 'completed'
|
|
78
|
-
context_snapshot TEXT, -- Compressed context at frame creation
|
|
79
|
-
started_at INTEGER DEFAULT (unixepoch()),
|
|
80
|
-
last_activity INTEGER DEFAULT (unixepoch())
|
|
81
|
-
);
|
|
82
|
-
|
|
83
|
-
-- Project-level aggregated knowledge
|
|
84
|
-
CREATE TABLE IF NOT EXISTS project_knowledge (
|
|
85
|
-
knowledge_id TEXT PRIMARY KEY,
|
|
86
|
-
project_id TEXT NOT NULL,
|
|
87
|
-
category TEXT NOT NULL, -- 'patterns', 'gotchas', 'conventions', 'dependencies'
|
|
88
|
-
title TEXT NOT NULL,
|
|
89
|
-
content TEXT NOT NULL,
|
|
90
|
-
confidence REAL DEFAULT 0.5,
|
|
91
|
-
usage_count INTEGER DEFAULT 0,
|
|
92
|
-
last_used INTEGER DEFAULT (unixepoch())
|
|
93
|
-
);
|
|
94
|
-
|
|
95
|
-
-- Context importance decay tracking
|
|
96
|
-
CREATE TABLE IF NOT EXISTS context_decay (
|
|
97
|
-
context_id TEXT PRIMARY KEY,
|
|
98
|
-
last_accessed INTEGER DEFAULT (unixepoch()),
|
|
99
|
-
access_count INTEGER DEFAULT 1,
|
|
100
|
-
decay_rate REAL DEFAULT 0.1
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
-- Indexes for performance
|
|
104
|
-
CREATE INDEX IF NOT EXISTS idx_shared_project ON shared_context(project_id, importance DESC);
|
|
105
|
-
CREATE INDEX IF NOT EXISTS idx_shared_type ON shared_context(type, active);
|
|
106
|
-
CREATE INDEX IF NOT EXISTS idx_personal_user ON personal_context(user_id, project_id);
|
|
107
|
-
CREATE INDEX IF NOT EXISTS idx_frames_active ON active_frames(project_id, status);
|
|
108
|
-
CREATE INDEX IF NOT EXISTS idx_knowledge_category ON project_knowledge(project_id, category);
|
|
109
|
-
`);
|
|
110
|
-
}
|
|
111
|
-
// ============================================
|
|
112
|
-
// Context Management
|
|
113
|
-
// ============================================
|
|
114
|
-
/**
|
|
115
|
-
* Add a decision or constraint that should be shared with the team
|
|
116
|
-
*/
|
|
117
|
-
addSharedContext(type, content, importance = 0.5) {
|
|
118
|
-
const contextId = this.generateContextId(content);
|
|
119
|
-
// Check if similar context exists
|
|
120
|
-
const existing = this.findSimilarContext(content);
|
|
121
|
-
if (existing) {
|
|
122
|
-
this.reinforceContext(existing.context_id);
|
|
123
|
-
return existing.context_id;
|
|
124
|
-
}
|
|
125
|
-
// Add to shared context
|
|
126
|
-
const vectorClock = this.p2pSync.incrementClock();
|
|
127
|
-
this.db.prepare(`
|
|
128
|
-
INSERT INTO shared_context
|
|
129
|
-
(context_id, project_id, type, content, importance, author_id, vector_clock)
|
|
130
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
131
|
-
`).run(contextId, this.projectId, type, content, importance, this.userId, JSON.stringify(vectorClock));
|
|
132
|
-
// Broadcast to team
|
|
133
|
-
this.p2pSync.createFrame({
|
|
134
|
-
id: contextId,
|
|
135
|
-
type: 'shared_context',
|
|
136
|
-
content: {
|
|
137
|
-
type,
|
|
138
|
-
content,
|
|
139
|
-
importance,
|
|
140
|
-
author_id: this.userId
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
return contextId;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Add personal context (not shared with team)
|
|
147
|
-
*/
|
|
148
|
-
addPersonalContext(type, content) {
|
|
149
|
-
const contextId = this.generateContextId(content);
|
|
150
|
-
this.db.prepare(`
|
|
151
|
-
INSERT INTO personal_context
|
|
152
|
-
(context_id, user_id, project_id, type, content)
|
|
153
|
-
VALUES (?, ?, ?, ?, ?)
|
|
154
|
-
`).run(contextId, this.userId, this.projectId, type, content);
|
|
155
|
-
return contextId;
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Start a new working frame (task/feature/debug session)
|
|
159
|
-
*/
|
|
160
|
-
startFrame(task) {
|
|
161
|
-
const frameId = uuidv4();
|
|
162
|
-
// Capture current context snapshot
|
|
163
|
-
const snapshot = this.captureContextSnapshot();
|
|
164
|
-
this.db.prepare(`
|
|
165
|
-
INSERT INTO active_frames
|
|
166
|
-
(frame_id, project_id, user_id, task, context_snapshot)
|
|
167
|
-
VALUES (?, ?, ?, ?, ?)
|
|
168
|
-
`).run(frameId, this.projectId, this.userId, task, JSON.stringify(snapshot));
|
|
169
|
-
// Share frame with team (they see you're working on this)
|
|
170
|
-
this.p2pSync.createFrame({
|
|
171
|
-
id: frameId,
|
|
172
|
-
type: 'active_frame',
|
|
173
|
-
content: {
|
|
174
|
-
task,
|
|
175
|
-
user_id: this.userId,
|
|
176
|
-
started_at: Date.now()
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
this.activeFrames.set(frameId, {
|
|
180
|
-
id: frameId,
|
|
181
|
-
task,
|
|
182
|
-
startedAt: Date.now(),
|
|
183
|
-
context: snapshot
|
|
184
|
-
});
|
|
185
|
-
return frameId;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Complete a frame and extract learnings
|
|
189
|
-
*/
|
|
190
|
-
completeFrame(frameId, summary, learnings) {
|
|
191
|
-
const frame = this.activeFrames.get(frameId);
|
|
192
|
-
if (!frame)
|
|
193
|
-
return;
|
|
194
|
-
// Update frame status
|
|
195
|
-
this.db.prepare(`
|
|
196
|
-
UPDATE active_frames
|
|
197
|
-
SET status = 'completed', last_activity = unixepoch()
|
|
198
|
-
WHERE frame_id = ?
|
|
199
|
-
`).run(frameId);
|
|
200
|
-
// Extract and share important learnings
|
|
201
|
-
learnings.forEach(learning => {
|
|
202
|
-
this.addSharedContext('learning', learning, 0.7);
|
|
203
|
-
});
|
|
204
|
-
// Add to project knowledge if significant
|
|
205
|
-
if (learnings.length > 0) {
|
|
206
|
-
this.addProjectKnowledge('patterns', frame.task, summary);
|
|
207
|
-
}
|
|
208
|
-
// Notify team of completion
|
|
209
|
-
this.p2pSync.updateFrame(frameId, {
|
|
210
|
-
content: {
|
|
211
|
-
...this.p2pSync.getFrame(frameId)?.content,
|
|
212
|
-
status: 'completed',
|
|
213
|
-
summary,
|
|
214
|
-
learnings,
|
|
215
|
-
completed_at: Date.now()
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
this.activeFrames.delete(frameId);
|
|
219
|
-
}
|
|
220
|
-
// ============================================
|
|
221
|
-
// Context Assembly for LLM
|
|
222
|
-
// ============================================
|
|
223
|
-
/**
|
|
224
|
-
* Get optimized context bundle for LLM
|
|
225
|
-
*/
|
|
226
|
-
async getContextBundle(intent, tokenBudget = 8000) {
|
|
227
|
-
const bundle = {
|
|
228
|
-
shared: [],
|
|
229
|
-
personal: [],
|
|
230
|
-
active: [],
|
|
231
|
-
knowledge: [],
|
|
232
|
-
stats: {
|
|
233
|
-
tokenCount: 0,
|
|
234
|
-
sources: 0
|
|
235
|
-
}
|
|
236
|
-
};
|
|
237
|
-
let tokensUsed = 0;
|
|
238
|
-
const maxTokens = tokenBudget;
|
|
239
|
-
// 1. Critical shared context (30% budget)
|
|
240
|
-
const criticalShared = this.db.prepare(`
|
|
241
|
-
SELECT * FROM shared_context
|
|
242
|
-
WHERE project_id = ? AND active = TRUE
|
|
243
|
-
ORDER BY importance DESC, updated_at DESC
|
|
244
|
-
LIMIT 20
|
|
245
|
-
`).all(this.projectId);
|
|
246
|
-
for (const ctx of criticalShared) {
|
|
247
|
-
const tokens = this.estimateTokens(ctx.content);
|
|
248
|
-
if (tokensUsed + tokens > maxTokens * 0.3)
|
|
249
|
-
break;
|
|
250
|
-
bundle.shared.push({
|
|
251
|
-
type: ctx.type,
|
|
252
|
-
content: ctx.content,
|
|
253
|
-
author: ctx.author_id,
|
|
254
|
-
importance: ctx.importance
|
|
255
|
-
});
|
|
256
|
-
tokensUsed += tokens;
|
|
257
|
-
}
|
|
258
|
-
// 2. Active team frames (20% budget)
|
|
259
|
-
const activeFrames = this.db.prepare(`
|
|
260
|
-
SELECT * FROM active_frames
|
|
261
|
-
WHERE project_id = ? AND status = 'active'
|
|
262
|
-
ORDER BY last_activity DESC
|
|
263
|
-
LIMIT 10
|
|
264
|
-
`).all(this.projectId);
|
|
265
|
-
for (const frame of activeFrames) {
|
|
266
|
-
const tokens = this.estimateTokens(frame.task);
|
|
267
|
-
if (tokensUsed + tokens > maxTokens * 0.5)
|
|
268
|
-
break;
|
|
269
|
-
bundle.active.push({
|
|
270
|
-
user: frame.user_id,
|
|
271
|
-
task: frame.task,
|
|
272
|
-
duration: Date.now() - frame.started_at * 1000
|
|
273
|
-
});
|
|
274
|
-
tokensUsed += tokens;
|
|
275
|
-
}
|
|
276
|
-
// 3. Relevant project knowledge (30% budget)
|
|
277
|
-
const knowledge = this.db.prepare(`
|
|
278
|
-
SELECT * FROM project_knowledge
|
|
279
|
-
WHERE project_id = ?
|
|
280
|
-
ORDER BY confidence DESC, usage_count DESC
|
|
281
|
-
LIMIT 15
|
|
282
|
-
`).all(this.projectId);
|
|
283
|
-
for (const k of knowledge) {
|
|
284
|
-
const tokens = this.estimateTokens(k.content);
|
|
285
|
-
if (tokensUsed + tokens > maxTokens * 0.8)
|
|
286
|
-
break;
|
|
287
|
-
bundle.knowledge.push({
|
|
288
|
-
category: k.category,
|
|
289
|
-
title: k.title,
|
|
290
|
-
content: k.content,
|
|
291
|
-
confidence: k.confidence
|
|
292
|
-
});
|
|
293
|
-
tokensUsed += tokens;
|
|
294
|
-
}
|
|
295
|
-
// 4. Personal context (remaining budget)
|
|
296
|
-
const personal = this.db.prepare(`
|
|
297
|
-
SELECT * FROM personal_context
|
|
298
|
-
WHERE user_id = ? AND project_id = ?
|
|
299
|
-
ORDER BY created_at DESC
|
|
300
|
-
LIMIT 10
|
|
301
|
-
`).all(this.userId, this.projectId);
|
|
302
|
-
for (const p of personal) {
|
|
303
|
-
const tokens = this.estimateTokens(p.content);
|
|
304
|
-
if (tokensUsed + tokens > maxTokens * 0.95)
|
|
305
|
-
break;
|
|
306
|
-
bundle.personal.push({
|
|
307
|
-
type: p.type,
|
|
308
|
-
content: p.content
|
|
309
|
-
});
|
|
310
|
-
tokensUsed += tokens;
|
|
311
|
-
}
|
|
312
|
-
bundle.stats.tokenCount = tokensUsed;
|
|
313
|
-
bundle.stats.sources = bundle.shared.length + bundle.personal.length +
|
|
314
|
-
bundle.active.length + bundle.knowledge.length;
|
|
315
|
-
return bundle;
|
|
316
|
-
}
|
|
317
|
-
// ============================================
|
|
318
|
-
// Knowledge Extraction & Learning
|
|
319
|
-
// ============================================
|
|
320
|
-
addProjectKnowledge(category, title, content) {
|
|
321
|
-
const knowledgeId = this.generateContextId(content);
|
|
322
|
-
this.db.prepare(`
|
|
323
|
-
INSERT OR REPLACE INTO project_knowledge
|
|
324
|
-
(knowledge_id, project_id, category, title, content, confidence)
|
|
325
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
326
|
-
`).run(knowledgeId, this.projectId, category, title, content, 0.5);
|
|
327
|
-
// Share significant knowledge with team
|
|
328
|
-
this.p2pSync.createFrame({
|
|
329
|
-
id: knowledgeId,
|
|
330
|
-
type: 'project_knowledge',
|
|
331
|
-
content: {
|
|
332
|
-
category,
|
|
333
|
-
title,
|
|
334
|
-
content
|
|
335
|
-
}
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
findSimilarContext(content) {
|
|
339
|
-
// Simple similarity check - in production use embeddings
|
|
340
|
-
const words = content.toLowerCase().split(/\s+/);
|
|
341
|
-
const results = this.db.prepare(`
|
|
342
|
-
SELECT * FROM shared_context
|
|
343
|
-
WHERE project_id = ? AND active = TRUE
|
|
344
|
-
`).all(this.projectId);
|
|
345
|
-
for (const ctx of results) {
|
|
346
|
-
const ctxWords = ctx.content.toLowerCase().split(/\s+/);
|
|
347
|
-
const overlap = words.filter(w => ctxWords.includes(w)).length;
|
|
348
|
-
if (overlap / words.length > 0.7) {
|
|
349
|
-
return ctx;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
return null;
|
|
353
|
-
}
|
|
354
|
-
reinforceContext(contextId) {
|
|
355
|
-
// Increase importance when context is referenced again
|
|
356
|
-
this.db.prepare(`
|
|
357
|
-
UPDATE shared_context
|
|
358
|
-
SET importance = MIN(1.0, importance + 0.1),
|
|
359
|
-
updated_at = unixepoch()
|
|
360
|
-
WHERE context_id = ?
|
|
361
|
-
`).run(contextId);
|
|
362
|
-
// Update decay tracking
|
|
363
|
-
this.db.prepare(`
|
|
364
|
-
INSERT INTO context_decay (context_id, last_accessed, access_count)
|
|
365
|
-
VALUES (?, unixepoch(), 1)
|
|
366
|
-
ON CONFLICT(context_id) DO UPDATE SET
|
|
367
|
-
last_accessed = unixepoch(),
|
|
368
|
-
access_count = access_count + 1
|
|
369
|
-
`).run(contextId);
|
|
370
|
-
}
|
|
371
|
-
// ============================================
|
|
372
|
-
// Sync Handlers
|
|
373
|
-
// ============================================
|
|
374
|
-
setupSyncHandlers() {
|
|
375
|
-
// Listen for shared context updates from team
|
|
376
|
-
setInterval(() => {
|
|
377
|
-
this.syncSharedContext();
|
|
378
|
-
}, 5000);
|
|
379
|
-
// Decay old context importance
|
|
380
|
-
setInterval(() => {
|
|
381
|
-
this.decayOldContext();
|
|
382
|
-
}, 3600000); // Every hour
|
|
383
|
-
}
|
|
384
|
-
async syncSharedContext() {
|
|
385
|
-
// P2P sync handles the actual synchronization
|
|
386
|
-
// This method processes received updates
|
|
387
|
-
const stats = await this.p2pSync.sync();
|
|
388
|
-
console.log(`Synced with ${stats.connectedPeers} peers`);
|
|
389
|
-
}
|
|
390
|
-
decayOldContext() {
|
|
391
|
-
// Reduce importance of unused context
|
|
392
|
-
this.db.prepare(`
|
|
393
|
-
UPDATE shared_context
|
|
394
|
-
SET importance = importance * 0.95
|
|
395
|
-
WHERE project_id = ?
|
|
396
|
-
AND updated_at < unixepoch() - 86400 * 7 -- 7 days old
|
|
397
|
-
AND importance > 0.1
|
|
398
|
-
`).run(this.projectId);
|
|
399
|
-
}
|
|
400
|
-
// ============================================
|
|
401
|
-
// Utilities
|
|
402
|
-
// ============================================
|
|
403
|
-
generateContextId(content) {
|
|
404
|
-
return createHash('sha256')
|
|
405
|
-
.update(content)
|
|
406
|
-
.digest('hex')
|
|
407
|
-
.substring(0, 12);
|
|
408
|
-
}
|
|
409
|
-
estimateTokens(text) {
|
|
410
|
-
// Rough estimate: 1 token per 4 characters
|
|
411
|
-
return Math.ceil(text.length / 4);
|
|
412
|
-
}
|
|
413
|
-
captureContextSnapshot() {
|
|
414
|
-
const shared = this.db.prepare(`
|
|
415
|
-
SELECT type, content, importance FROM shared_context
|
|
416
|
-
WHERE project_id = ? AND active = TRUE
|
|
417
|
-
ORDER BY importance DESC
|
|
418
|
-
LIMIT 10
|
|
419
|
-
`).all(this.projectId);
|
|
420
|
-
const personal = this.db.prepare(`
|
|
421
|
-
SELECT type, content FROM personal_context
|
|
422
|
-
WHERE user_id = ? AND project_id = ?
|
|
423
|
-
ORDER BY created_at DESC
|
|
424
|
-
LIMIT 5
|
|
425
|
-
`).all(this.userId, this.projectId);
|
|
426
|
-
return {
|
|
427
|
-
timestamp: Date.now(),
|
|
428
|
-
shared: shared,
|
|
429
|
-
personal: personal
|
|
430
|
-
};
|
|
431
|
-
}
|
|
432
|
-
// ============================================
|
|
433
|
-
// Public API
|
|
434
|
-
// ============================================
|
|
435
|
-
getTeamActivity() {
|
|
436
|
-
const activeFrames = this.db.prepare(`
|
|
437
|
-
SELECT user_id, task, started_at FROM active_frames
|
|
438
|
-
WHERE project_id = ? AND status = 'active'
|
|
439
|
-
`).all(this.projectId);
|
|
440
|
-
const recentContext = this.db.prepare(`
|
|
441
|
-
SELECT type, COUNT(*) as count FROM shared_context
|
|
442
|
-
WHERE project_id = ? AND created_at > unixepoch() - 3600
|
|
443
|
-
GROUP BY type
|
|
444
|
-
`).all(this.projectId);
|
|
445
|
-
return {
|
|
446
|
-
activeUsers: [...new Set(activeFrames.map(f => f.user_id))],
|
|
447
|
-
activeFrames: activeFrames.map(f => ({
|
|
448
|
-
user: f.user_id,
|
|
449
|
-
task: f.task,
|
|
450
|
-
duration: Date.now() - f.started_at * 1000
|
|
451
|
-
})),
|
|
452
|
-
recentContext: recentContext
|
|
453
|
-
};
|
|
454
|
-
}
|
|
455
|
-
exportContext() {
|
|
456
|
-
const shared = this.db.prepare(`
|
|
457
|
-
SELECT * FROM shared_context WHERE project_id = ?
|
|
458
|
-
`).all(this.projectId);
|
|
459
|
-
const knowledge = this.db.prepare(`
|
|
460
|
-
SELECT * FROM project_knowledge WHERE project_id = ?
|
|
461
|
-
`).all(this.projectId);
|
|
462
|
-
return JSON.stringify({
|
|
463
|
-
projectId: this.projectId,
|
|
464
|
-
exported: Date.now(),
|
|
465
|
-
sharedContext: shared,
|
|
466
|
-
projectKnowledge: knowledge
|
|
467
|
-
}, null, 2);
|
|
468
|
-
}
|
|
469
|
-
disconnect() {
|
|
470
|
-
this.p2pSync.disconnect();
|
|
471
|
-
this.db.close();
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
// ============================================
|
|
475
|
-
// Helper Classes
|
|
476
|
-
// ============================================
|
|
477
|
-
class SharedContext {
|
|
478
|
-
db;
|
|
479
|
-
p2pSync;
|
|
480
|
-
constructor(db, p2pSync) {
|
|
481
|
-
this.db = db;
|
|
482
|
-
this.p2pSync = p2pSync;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
class PersonalContext {
|
|
486
|
-
db;
|
|
487
|
-
constructor(db) {
|
|
488
|
-
this.db = db;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
//# sourceMappingURL=team-context-sync.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"team-context-sync.js","sourceRoot":"","sources":["../../../p2p-sync/src/team-context-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge-linear-duplicates.d.ts","sourceRoot":"","sources":["../../scripts/merge-linear-duplicates.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Script to merge duplicate Linear tasks
|
|
4
|
-
* Keeps the lowest-numbered task as primary and marks others as duplicates
|
|
5
|
-
*/
|
|
6
|
-
import { LinearClient } from '@linear/sdk';
|
|
7
|
-
import { readFileSync } from 'fs';
|
|
8
|
-
import { join } from 'path';
|
|
9
|
-
const duplicateGroups = [
|
|
10
|
-
{
|
|
11
|
-
name: 'Linear API Integration',
|
|
12
|
-
taskIds: ['STA-88', 'STA-74', 'STA-61', 'STA-46', 'STA-32', 'STA-9'],
|
|
13
|
-
primaryId: 'STA-9',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: 'Performance Optimization',
|
|
17
|
-
taskIds: ['STA-87', 'STA-73', 'STA-60', 'STA-45', 'STA-31', 'STA-13', 'STA-21', 'STA-35', 'STA-50', 'STA-63', 'STA-77'],
|
|
18
|
-
primaryId: 'STA-13',
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
name: 'Security Audit and Input Validation',
|
|
22
|
-
taskIds: ['STA-85', 'STA-71', 'STA-58', 'STA-43', 'STA-29'],
|
|
23
|
-
primaryId: 'STA-29',
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
name: 'Implement Proper Error Handling',
|
|
27
|
-
taskIds: ['STA-84', 'STA-70', 'STA-57', 'STA-42', 'STA-28'],
|
|
28
|
-
primaryId: 'STA-28',
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
name: 'Implement Comprehensive Testing Suite',
|
|
32
|
-
taskIds: ['STA-83', 'STA-69', 'STA-56', 'STA-41', 'STA-27'],
|
|
33
|
-
primaryId: 'STA-27',
|
|
34
|
-
},
|
|
35
|
-
];
|
|
36
|
-
async function mergeDuplicateTasks() {
|
|
37
|
-
console.log('š Starting Linear duplicate task merge...\n');
|
|
38
|
-
// Load Linear tokens
|
|
39
|
-
const tokensPath = join(process.cwd(), '.stackmemory', 'linear-tokens.json');
|
|
40
|
-
let accessToken;
|
|
41
|
-
try {
|
|
42
|
-
const tokensData = readFileSync(tokensPath, 'utf8');
|
|
43
|
-
const tokens = JSON.parse(tokensData);
|
|
44
|
-
accessToken = tokens.accessToken;
|
|
45
|
-
console.log('ā
Loaded Linear authentication tokens\n');
|
|
46
|
-
}
|
|
47
|
-
catch (error) {
|
|
48
|
-
console.error('ā Failed to load Linear tokens. Please run: stackmemory linear setup');
|
|
49
|
-
process.exit(1);
|
|
50
|
-
}
|
|
51
|
-
// Initialize Linear client
|
|
52
|
-
const client = new LinearClient({
|
|
53
|
-
apiKey: accessToken,
|
|
54
|
-
});
|
|
55
|
-
// Process each duplicate group
|
|
56
|
-
for (const group of duplicateGroups) {
|
|
57
|
-
console.log(`\nš Processing: ${group.name}`);
|
|
58
|
-
console.log(` Primary: ${group.primaryId}`);
|
|
59
|
-
console.log(` Duplicates: ${group.taskIds.filter(id => id !== group.primaryId).join(', ')}`);
|
|
60
|
-
try {
|
|
61
|
-
// Get the primary issue
|
|
62
|
-
const primaryIssue = await client.issue(group.primaryId);
|
|
63
|
-
if (!primaryIssue) {
|
|
64
|
-
console.log(` ā ļø Primary issue ${group.primaryId} not found, skipping group`);
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
// Collect descriptions from all duplicates
|
|
68
|
-
let combinedDescription = primaryIssue.description || '';
|
|
69
|
-
const duplicateIds = group.taskIds.filter(id => id !== group.primaryId);
|
|
70
|
-
for (const duplicateId of duplicateIds) {
|
|
71
|
-
try {
|
|
72
|
-
const duplicateIssue = await client.issue(duplicateId);
|
|
73
|
-
if (!duplicateIssue) {
|
|
74
|
-
console.log(` ā ļø Issue ${duplicateId} not found, skipping`);
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
// Add duplicate's description if it exists and differs
|
|
78
|
-
if (duplicateIssue.description &&
|
|
79
|
-
duplicateIssue.description !== primaryIssue.description) {
|
|
80
|
-
combinedDescription += `\n\n---\n[Merged from ${duplicateId}]\n${duplicateIssue.description}`;
|
|
81
|
-
}
|
|
82
|
-
// Get the canceled state for the team
|
|
83
|
-
const team = await duplicateIssue.team;
|
|
84
|
-
const states = await team.states();
|
|
85
|
-
const canceledState = states.nodes.find(s => s.type === 'canceled');
|
|
86
|
-
if (!canceledState) {
|
|
87
|
-
console.log(` ā ļø No 'canceled' state found for team, skipping ${duplicateId}`);
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
// Update duplicate to canceled state with reference to primary
|
|
91
|
-
await duplicateIssue.update({
|
|
92
|
-
stateId: canceledState.id,
|
|
93
|
-
description: `Duplicate of ${group.primaryId}\n\n${duplicateIssue.description || ''}`,
|
|
94
|
-
});
|
|
95
|
-
console.log(` ā
Marked ${duplicateId} as duplicate of ${group.primaryId}`);
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
console.log(` ā Failed to process ${duplicateId}: ${error.message}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// Update primary issue with combined description if changed
|
|
102
|
-
if (combinedDescription !== primaryIssue.description) {
|
|
103
|
-
await primaryIssue.update({
|
|
104
|
-
description: combinedDescription,
|
|
105
|
-
});
|
|
106
|
-
console.log(` ā
Updated ${group.primaryId} with merged descriptions`);
|
|
107
|
-
}
|
|
108
|
-
console.log(` ā
Group "${group.name}" processed successfully`);
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
console.error(` ā Error processing group: ${error.message}`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
console.log('\n⨠Duplicate merge complete!');
|
|
115
|
-
console.log('\nš Summary:');
|
|
116
|
-
console.log(` Groups processed: ${duplicateGroups.length}`);
|
|
117
|
-
console.log(` Total tasks affected: ${duplicateGroups.reduce((acc, g) => acc + g.taskIds.length, 0)}`);
|
|
118
|
-
console.log(` Primary tasks kept: ${duplicateGroups.length}`);
|
|
119
|
-
console.log(` Tasks marked as duplicate: ${duplicateGroups.reduce((acc, g) => acc + g.taskIds.length - 1, 0)}`);
|
|
120
|
-
}
|
|
121
|
-
// Run the merge
|
|
122
|
-
mergeDuplicateTasks().catch((error) => {
|
|
123
|
-
console.error('ā Fatal error:', error);
|
|
124
|
-
process.exit(1);
|
|
125
|
-
});
|
|
126
|
-
//# sourceMappingURL=merge-linear-duplicates.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge-linear-duplicates.js","sourceRoot":"","sources":["../../scripts/merge-linear-duplicates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Router } from 'express';
|
|
2
|
-
import { Server } from 'http';
|
|
3
|
-
export declare class AnalyticsAPI {
|
|
4
|
-
private router;
|
|
5
|
-
private analyticsService;
|
|
6
|
-
private wss?;
|
|
7
|
-
constructor(projectPath?: string);
|
|
8
|
-
private setupRoutes;
|
|
9
|
-
private getMetrics;
|
|
10
|
-
private getTasks;
|
|
11
|
-
private getTeamMetrics;
|
|
12
|
-
private addTask;
|
|
13
|
-
private updateTask;
|
|
14
|
-
private syncLinear;
|
|
15
|
-
private exportMetrics;
|
|
16
|
-
private parseQuery;
|
|
17
|
-
private getPresetTimeRange;
|
|
18
|
-
private convertToCSV;
|
|
19
|
-
private handleError;
|
|
20
|
-
setupWebSocket(server: Server): void;
|
|
21
|
-
getRouter(): Router;
|
|
22
|
-
close(): void;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=analytics-api.d.ts.map
|