@stackmemoryai/stackmemory 0.2.3 → 0.2.6
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 +108 -0
- package/dist/index.js +382 -0
- package/dist/src/analytics/api/analytics-api.d.ts +24 -0
- package/dist/src/analytics/api/analytics-api.d.ts.map +1 -0
- package/dist/src/analytics/api/analytics-api.js +279 -0
- package/dist/src/analytics/api/analytics-api.js.map +1 -0
- package/dist/src/analytics/core/analytics-service.d.ts +23 -0
- package/dist/src/analytics/core/analytics-service.d.ts.map +1 -0
- package/dist/src/analytics/core/analytics-service.js +160 -0
- package/dist/src/analytics/core/analytics-service.js.map +1 -0
- package/dist/src/analytics/index.d.ts +12 -0
- package/dist/src/analytics/index.d.ts.map +1 -0
- package/dist/src/analytics/index.js +11 -0
- package/dist/src/analytics/index.js.map +1 -0
- package/dist/src/analytics/queries/metrics-queries.d.ts +11 -0
- package/dist/src/analytics/queries/metrics-queries.d.ts.map +1 -0
- package/dist/src/analytics/queries/metrics-queries.js +179 -0
- package/dist/src/analytics/queries/metrics-queries.js.map +1 -0
- package/dist/src/analytics/types/metrics.d.ts +60 -0
- package/dist/src/analytics/types/metrics.d.ts.map +1 -0
- package/dist/src/analytics/types/metrics.js +2 -0
- package/dist/src/analytics/types/metrics.js.map +1 -0
- package/dist/src/cli/analytics-viewer.d.ts +3 -0
- package/dist/src/cli/analytics-viewer.d.ts.map +1 -0
- package/dist/src/cli/analytics-viewer.js +89 -0
- package/dist/src/cli/analytics-viewer.js.map +1 -0
- package/dist/src/cli/browser-test.d.ts +6 -0
- package/dist/src/cli/browser-test.d.ts.map +1 -0
- package/dist/src/cli/browser-test.js +32 -0
- package/dist/src/cli/browser-test.js.map +1 -0
- package/dist/src/cli/cli.js +233 -1
- package/dist/src/cli/cli.js.map +1 -1
- package/dist/src/cli/commands/projects.d.ts +8 -0
- package/dist/src/cli/commands/projects.d.ts.map +1 -0
- package/dist/src/cli/commands/projects.js +220 -0
- package/dist/src/cli/commands/projects.js.map +1 -0
- package/dist/src/cli/index.d.ts +7 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +704 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/project-commands.d.ts +8 -0
- package/dist/src/cli/project-commands.d.ts.map +1 -0
- package/dist/src/cli/project-commands.js +212 -0
- package/dist/src/cli/project-commands.js.map +1 -0
- package/dist/src/cli/utils/viewer.d.ts +3 -0
- package/dist/src/cli/utils/viewer.d.ts.map +1 -0
- package/dist/src/cli/utils/viewer.js +89 -0
- package/dist/src/cli/utils/viewer.js.map +1 -0
- package/dist/src/core/context/frame-manager.d.ts +106 -0
- package/dist/src/core/context/frame-manager.d.ts.map +1 -0
- package/dist/src/core/context/frame-manager.js +387 -0
- package/dist/src/core/context/frame-manager.js.map +1 -0
- package/dist/src/core/logger.test.js +1 -1
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/monitoring/error-handler.d.ts +46 -0
- package/dist/src/core/monitoring/error-handler.d.ts.map +1 -0
- package/dist/src/core/monitoring/error-handler.js +212 -0
- package/dist/src/core/monitoring/error-handler.js.map +1 -0
- package/dist/src/core/monitoring/logger.d.ts +24 -0
- package/dist/src/core/monitoring/logger.d.ts.map +1 -0
- package/dist/src/core/monitoring/logger.js +121 -0
- package/dist/src/core/monitoring/logger.js.map +1 -0
- package/dist/src/core/monitoring/metrics.d.ts +7 -0
- package/dist/src/core/monitoring/metrics.d.ts.map +1 -0
- package/dist/src/core/monitoring/metrics.js +13 -0
- package/dist/src/core/monitoring/metrics.js.map +1 -0
- package/dist/src/core/monitoring/progress-tracker.d.ts +95 -0
- package/dist/src/core/monitoring/progress-tracker.d.ts.map +1 -0
- package/dist/src/core/monitoring/progress-tracker.js +178 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +1 -0
- package/dist/src/core/progress-tracker.d.ts +95 -0
- package/dist/src/core/progress-tracker.d.ts.map +1 -0
- package/dist/src/core/progress-tracker.js +178 -0
- package/dist/src/core/progress-tracker.js.map +1 -0
- package/dist/src/core/project-manager.d.ts +130 -0
- package/dist/src/core/project-manager.d.ts.map +1 -0
- package/dist/src/core/project-manager.js +582 -0
- package/dist/src/core/project-manager.js.map +1 -0
- package/dist/src/core/projects/project-manager.d.ts +130 -0
- package/dist/src/core/projects/project-manager.d.ts.map +1 -0
- package/dist/src/core/projects/project-manager.js +591 -0
- package/dist/src/core/projects/project-manager.js.map +1 -0
- package/dist/src/core/update-checker.d.ts +38 -0
- package/dist/src/core/update-checker.d.ts.map +1 -0
- package/dist/src/core/update-checker.js +156 -0
- package/dist/src/core/update-checker.js.map +1 -0
- package/dist/src/core/utils/update-checker.d.ts +38 -0
- package/dist/src/core/utils/update-checker.d.ts.map +1 -0
- package/dist/src/core/utils/update-checker.js +156 -0
- package/dist/src/core/utils/update-checker.js.map +1 -0
- package/dist/src/features/analytics/api/analytics-api.d.ts +24 -0
- package/dist/src/features/analytics/api/analytics-api.d.ts.map +1 -0
- package/dist/src/features/analytics/api/analytics-api.js +289 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +1 -0
- package/dist/src/features/analytics/core/analytics-service.d.ts +23 -0
- package/dist/src/features/analytics/core/analytics-service.d.ts.map +1 -0
- package/dist/src/features/analytics/core/analytics-service.js +160 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +1 -0
- package/dist/src/features/analytics/index.d.ts +12 -0
- package/dist/src/features/analytics/index.d.ts.map +1 -0
- package/dist/src/features/analytics/index.js +11 -0
- package/dist/src/features/analytics/index.js.map +1 -0
- package/dist/src/features/analytics/queries/metrics-queries.d.ts +11 -0
- package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +1 -0
- package/dist/src/features/analytics/queries/metrics-queries.js +183 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +1 -0
- package/dist/src/features/analytics/types/metrics.d.ts +60 -0
- package/dist/src/features/analytics/types/metrics.d.ts.map +1 -0
- package/dist/src/features/analytics/types/metrics.js +2 -0
- package/dist/src/features/analytics/types/metrics.js.map +1 -0
- package/dist/src/features/browser/browser-mcp.d.ts +94 -0
- package/dist/src/features/browser/browser-mcp.d.ts.map +1 -0
- package/dist/src/features/browser/browser-mcp.js +456 -0
- package/dist/src/features/browser/browser-mcp.js.map +1 -0
- package/dist/src/features/tasks/pebbles-task-store.d.ts +117 -0
- package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -0
- package/dist/src/features/tasks/pebbles-task-store.js +335 -0
- package/dist/src/features/tasks/pebbles-task-store.js.map +1 -0
- package/dist/src/features/tasks/task-aware-context.d.ts +103 -0
- package/dist/src/features/tasks/task-aware-context.d.ts.map +1 -0
- package/dist/src/features/tasks/task-aware-context.js +412 -0
- package/dist/src/features/tasks/task-aware-context.js.map +1 -0
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/integrations/browser-mcp.d.ts +94 -0
- package/dist/src/integrations/browser-mcp.d.ts.map +1 -0
- package/dist/src/integrations/browser-mcp.js +431 -0
- package/dist/src/integrations/browser-mcp.js.map +1 -0
- package/dist/src/integrations/linear/auth.d.ts +99 -0
- package/dist/src/integrations/linear/auth.d.ts.map +1 -0
- package/dist/src/integrations/linear/auth.js +319 -0
- package/dist/src/integrations/linear/auth.js.map +1 -0
- package/dist/src/integrations/linear/auto-sync.d.ts +77 -0
- package/dist/src/integrations/linear/auto-sync.d.ts.map +1 -0
- package/dist/src/integrations/linear/auto-sync.js +268 -0
- package/dist/src/integrations/linear/auto-sync.js.map +1 -0
- package/dist/src/integrations/linear/client.d.ts +86 -0
- package/dist/src/integrations/linear/client.d.ts.map +1 -0
- package/dist/src/integrations/linear/client.js +277 -0
- package/dist/src/integrations/linear/client.js.map +1 -0
- package/dist/src/integrations/linear/config.d.ts +51 -0
- package/dist/src/integrations/linear/config.d.ts.map +1 -0
- package/dist/src/integrations/linear/config.js +103 -0
- package/dist/src/integrations/linear/config.js.map +1 -0
- package/dist/src/integrations/linear/sync.d.ts +97 -0
- package/dist/src/integrations/linear/sync.d.ts.map +1 -0
- package/dist/src/integrations/linear/sync.js +391 -0
- package/dist/src/integrations/linear/sync.js.map +1 -0
- package/dist/src/integrations/mcp/server.d.ts +40 -0
- package/dist/src/integrations/mcp/server.d.ts.map +1 -0
- package/dist/src/integrations/mcp/server.js +828 -0
- package/dist/src/integrations/mcp/server.js.map +1 -0
- package/dist/src/mcp/mcp-server.d.ts +2 -0
- package/dist/src/mcp/mcp-server.d.ts.map +1 -1
- package/dist/src/mcp/mcp-server.js +16 -0
- package/dist/src/mcp/mcp-server.js.map +1 -1
- package/dist/src/railway/index.d.ts +7 -0
- package/dist/src/railway/index.d.ts.map +1 -0
- package/dist/src/railway/index.js +401 -0
- package/dist/src/railway/index.js.map +1 -0
- package/dist/src/runway/auth/auth-middleware.d.ts +66 -0
- package/dist/src/runway/auth/auth-middleware.d.ts.map +1 -0
- package/dist/src/runway/auth/auth-middleware.js +337 -0
- package/dist/src/runway/auth/auth-middleware.js.map +1 -0
- package/dist/src/runway/server/runway-mcp-server.d.ts +46 -0
- package/dist/src/runway/server/runway-mcp-server.d.ts.map +1 -0
- package/dist/src/runway/server/runway-mcp-server.js +601 -0
- package/dist/src/runway/server/runway-mcp-server.js.map +1 -0
- package/dist/src/runway.bak/auth/auth-middleware.d.ts +66 -0
- package/dist/src/runway.bak/auth/auth-middleware.d.ts.map +1 -0
- package/dist/src/runway.bak/auth/auth-middleware.js +337 -0
- package/dist/src/runway.bak/auth/auth-middleware.js.map +1 -0
- package/dist/src/runway.bak/server/runway-mcp-server.d.ts +46 -0
- package/dist/src/runway.bak/server/runway-mcp-server.d.ts.map +1 -0
- package/dist/src/runway.bak/server/runway-mcp-server.js +601 -0
- package/dist/src/runway.bak/server/runway-mcp-server.js.map +1 -0
- package/dist/src/servers/production/auth-middleware.d.ts +66 -0
- package/dist/src/servers/production/auth-middleware.d.ts.map +1 -0
- package/dist/src/servers/production/auth-middleware.js +346 -0
- package/dist/src/servers/production/auth-middleware.js.map +1 -0
- package/dist/src/servers/railway/index.d.ts +7 -0
- package/dist/src/servers/railway/index.d.ts.map +1 -0
- package/dist/src/servers/railway/index.js +401 -0
- package/dist/src/servers/railway/index.js.map +1 -0
- package/package.json +27 -5
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linear Bi-directional Sync Engine
|
|
3
|
+
* Handles syncing tasks between StackMemory and Linear
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../../core/monitoring/logger.js';
|
|
6
|
+
import { LinearClient } from './client.js';
|
|
7
|
+
export class LinearSyncEngine {
|
|
8
|
+
taskStore;
|
|
9
|
+
linearClient;
|
|
10
|
+
authManager;
|
|
11
|
+
config;
|
|
12
|
+
mappings = new Map();
|
|
13
|
+
constructor(taskStore, authManager, config) {
|
|
14
|
+
this.taskStore = taskStore;
|
|
15
|
+
this.authManager = authManager;
|
|
16
|
+
this.config = config;
|
|
17
|
+
// Check for API key from environment variable first
|
|
18
|
+
const apiKey = process.env.LINEAR_API_KEY;
|
|
19
|
+
if (apiKey) {
|
|
20
|
+
// Use API key from environment
|
|
21
|
+
this.linearClient = new LinearClient({
|
|
22
|
+
apiKey: apiKey,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Fall back to OAuth tokens
|
|
27
|
+
const tokens = this.authManager.loadTokens();
|
|
28
|
+
if (!tokens) {
|
|
29
|
+
throw new Error('Linear API key or authentication tokens not found. Set LINEAR_API_KEY environment variable or run "stackmemory linear setup" first.');
|
|
30
|
+
}
|
|
31
|
+
this.linearClient = new LinearClient({
|
|
32
|
+
apiKey: tokens.accessToken,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
this.loadMappings();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Perform bi-directional sync
|
|
39
|
+
*/
|
|
40
|
+
async sync() {
|
|
41
|
+
if (!this.config.enabled) {
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
synced: { toLinear: 0, fromLinear: 0, updated: 0 },
|
|
45
|
+
conflicts: [],
|
|
46
|
+
errors: ['Sync is disabled'],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const result = {
|
|
50
|
+
success: true,
|
|
51
|
+
synced: { toLinear: 0, fromLinear: 0, updated: 0 },
|
|
52
|
+
conflicts: [],
|
|
53
|
+
errors: [],
|
|
54
|
+
};
|
|
55
|
+
try {
|
|
56
|
+
// Update client with valid token if not using environment API key
|
|
57
|
+
const apiKey = process.env.LINEAR_API_KEY;
|
|
58
|
+
if (!apiKey) {
|
|
59
|
+
const token = await this.authManager.getValidToken();
|
|
60
|
+
this.linearClient = new LinearClient({ apiKey: token });
|
|
61
|
+
}
|
|
62
|
+
// Get team info if not configured
|
|
63
|
+
if (!this.config.defaultTeamId) {
|
|
64
|
+
const team = await this.linearClient.getTeam();
|
|
65
|
+
this.config.defaultTeamId = team.id;
|
|
66
|
+
logger.info(`Using Linear team: ${team.name} (${team.key})`);
|
|
67
|
+
}
|
|
68
|
+
// Sync in both directions based on configuration
|
|
69
|
+
if (this.config.direction === 'bidirectional' ||
|
|
70
|
+
this.config.direction === 'to_linear') {
|
|
71
|
+
const toLinearResult = await this.syncToLinear();
|
|
72
|
+
result.synced.toLinear = toLinearResult.created;
|
|
73
|
+
result.synced.updated += toLinearResult.updated;
|
|
74
|
+
result.errors.push(...toLinearResult.errors);
|
|
75
|
+
}
|
|
76
|
+
if (this.config.direction === 'bidirectional' ||
|
|
77
|
+
this.config.direction === 'from_linear') {
|
|
78
|
+
const fromLinearResult = await this.syncFromLinear();
|
|
79
|
+
result.synced.fromLinear = fromLinearResult.created;
|
|
80
|
+
result.synced.updated += fromLinearResult.updated;
|
|
81
|
+
result.conflicts.push(...fromLinearResult.conflicts);
|
|
82
|
+
result.errors.push(...fromLinearResult.errors);
|
|
83
|
+
}
|
|
84
|
+
this.saveMappings();
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
result.success = false;
|
|
88
|
+
result.errors.push(`Sync failed: ${String(error)}`);
|
|
89
|
+
logger.error('Linear sync failed:', error);
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Sync tasks from StackMemory to Linear
|
|
95
|
+
*/
|
|
96
|
+
async syncToLinear() {
|
|
97
|
+
const result = { created: 0, updated: 0, errors: [] };
|
|
98
|
+
// Get unsynced tasks from StackMemory
|
|
99
|
+
const unsyncedTasks = this.getUnsyncedTasks();
|
|
100
|
+
for (const task of unsyncedTasks) {
|
|
101
|
+
try {
|
|
102
|
+
const linearIssue = await this.createLinearIssueFromTask(task);
|
|
103
|
+
// Create mapping
|
|
104
|
+
const mapping = {
|
|
105
|
+
stackmemoryId: task.id,
|
|
106
|
+
linearId: linearIssue.id,
|
|
107
|
+
linearIdentifier: linearIssue.identifier,
|
|
108
|
+
lastSyncTimestamp: Date.now(),
|
|
109
|
+
lastLinearUpdate: linearIssue.updatedAt,
|
|
110
|
+
lastStackMemoryUpdate: task.timestamp * 1000,
|
|
111
|
+
};
|
|
112
|
+
this.mappings.set(task.id, mapping);
|
|
113
|
+
// Update task with Linear reference
|
|
114
|
+
this.updateTaskWithLinearRef(task.id, linearIssue);
|
|
115
|
+
result.created++;
|
|
116
|
+
logger.info(`Synced task to Linear: ${task.title} → ${linearIssue.identifier}`);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
result.errors.push(`Failed to sync task ${task.id}: ${String(error)}`);
|
|
120
|
+
logger.error(`Failed to sync task ${task.id} to Linear:`, error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Update existing Linear issues for modified StackMemory tasks
|
|
124
|
+
const modifiedTasks = this.getModifiedTasks();
|
|
125
|
+
for (const task of modifiedTasks) {
|
|
126
|
+
try {
|
|
127
|
+
const mapping = this.mappings.get(task.id);
|
|
128
|
+
if (!mapping)
|
|
129
|
+
continue;
|
|
130
|
+
await this.updateLinearIssueFromTask(task, mapping);
|
|
131
|
+
mapping.lastSyncTimestamp = Date.now();
|
|
132
|
+
mapping.lastStackMemoryUpdate = task.timestamp * 1000;
|
|
133
|
+
result.updated++;
|
|
134
|
+
logger.info(`Updated Linear issue: ${mapping.linearIdentifier}`);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
result.errors.push(`Failed to update Linear issue for task ${task.id}: ${String(error)}`);
|
|
138
|
+
logger.error(`Failed to update Linear issue for task ${task.id}:`, error);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Sync tasks from Linear to StackMemory
|
|
145
|
+
*/
|
|
146
|
+
async syncFromLinear() {
|
|
147
|
+
const result = {
|
|
148
|
+
created: 0,
|
|
149
|
+
updated: 0,
|
|
150
|
+
conflicts: [],
|
|
151
|
+
errors: [],
|
|
152
|
+
};
|
|
153
|
+
// For now, we'll focus on updating existing mapped tasks
|
|
154
|
+
// Creating new StackMemory tasks from Linear issues would require frame context
|
|
155
|
+
for (const [taskId, mapping] of this.mappings) {
|
|
156
|
+
try {
|
|
157
|
+
const linearIssue = await this.linearClient.getIssue(mapping.linearId);
|
|
158
|
+
if (!linearIssue) {
|
|
159
|
+
result.errors.push(`Linear issue ${mapping.linearId} not found`);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
// Check if Linear issue was updated since last sync
|
|
163
|
+
const linearUpdateTime = new Date(linearIssue.updatedAt).getTime();
|
|
164
|
+
if (linearUpdateTime <= mapping.lastSyncTimestamp) {
|
|
165
|
+
continue; // No changes in Linear
|
|
166
|
+
}
|
|
167
|
+
// Check for conflicts
|
|
168
|
+
const task = this.taskStore.getTask(taskId);
|
|
169
|
+
if (!task) {
|
|
170
|
+
result.errors.push(`StackMemory task ${taskId} not found`);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const stackMemoryUpdateTime = task.timestamp * 1000;
|
|
174
|
+
if (stackMemoryUpdateTime > mapping.lastSyncTimestamp &&
|
|
175
|
+
linearUpdateTime > mapping.lastSyncTimestamp) {
|
|
176
|
+
// Conflict: both sides updated since last sync
|
|
177
|
+
result.conflicts.push({
|
|
178
|
+
taskId,
|
|
179
|
+
linearId: mapping.linearId,
|
|
180
|
+
reason: 'Both StackMemory and Linear were updated since last sync',
|
|
181
|
+
});
|
|
182
|
+
if (this.config.conflictResolution === 'manual') {
|
|
183
|
+
continue; // Skip, let user resolve manually
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Apply conflict resolution
|
|
187
|
+
const shouldUpdateFromLinear = this.shouldUpdateFromLinear(task, linearIssue, mapping, stackMemoryUpdateTime, linearUpdateTime);
|
|
188
|
+
if (shouldUpdateFromLinear) {
|
|
189
|
+
this.updateTaskFromLinearIssue(task, linearIssue);
|
|
190
|
+
mapping.lastSyncTimestamp = Date.now();
|
|
191
|
+
mapping.lastLinearUpdate = linearIssue.updatedAt;
|
|
192
|
+
result.updated++;
|
|
193
|
+
logger.info(`Updated StackMemory task from Linear: ${task.title}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
result.errors.push(`Failed to sync from Linear for task ${taskId}: ${String(error)}`);
|
|
198
|
+
logger.error(`Failed to sync from Linear for task ${taskId}:`, error);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Create Linear issue from StackMemory task
|
|
205
|
+
*/
|
|
206
|
+
async createLinearIssueFromTask(task) {
|
|
207
|
+
const input = {
|
|
208
|
+
title: task.title,
|
|
209
|
+
description: this.formatDescriptionForLinear(task),
|
|
210
|
+
teamId: this.config.defaultTeamId,
|
|
211
|
+
priority: this.mapPriorityToLinear(task.priority),
|
|
212
|
+
estimate: task.estimated_effort
|
|
213
|
+
? Math.ceil(task.estimated_effort / 60)
|
|
214
|
+
: undefined, // Convert minutes to hours
|
|
215
|
+
labelIds: this.mapTagsToLinear(task.tags),
|
|
216
|
+
};
|
|
217
|
+
return await this.linearClient.createIssue(input);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Update Linear issue from StackMemory task
|
|
221
|
+
*/
|
|
222
|
+
async updateLinearIssueFromTask(task, mapping) {
|
|
223
|
+
const updates = {
|
|
224
|
+
title: task.title,
|
|
225
|
+
description: this.formatDescriptionForLinear(task),
|
|
226
|
+
priority: this.mapPriorityToLinear(task.priority),
|
|
227
|
+
estimate: task.estimated_effort
|
|
228
|
+
? Math.ceil(task.estimated_effort / 60)
|
|
229
|
+
: undefined,
|
|
230
|
+
stateId: await this.mapStatusToLinearState(task.status),
|
|
231
|
+
};
|
|
232
|
+
await this.linearClient.updateIssue(mapping.linearId, updates);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Update StackMemory task from Linear issue
|
|
236
|
+
*/
|
|
237
|
+
updateTaskFromLinearIssue(task, linearIssue) {
|
|
238
|
+
// Map Linear state to StackMemory status
|
|
239
|
+
const newStatus = this.mapLinearStateToStatus(linearIssue.state.type);
|
|
240
|
+
if (newStatus !== task.status) {
|
|
241
|
+
this.taskStore.updateTaskStatus(task.id, newStatus, 'Updated from Linear');
|
|
242
|
+
}
|
|
243
|
+
// Note: Other fields like title, description could be updated here
|
|
244
|
+
// but require careful consideration of conflict resolution
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Check if task should be updated from Linear based on conflict resolution strategy
|
|
248
|
+
*/
|
|
249
|
+
shouldUpdateFromLinear(task, linearIssue, mapping, stackMemoryUpdateTime, linearUpdateTime) {
|
|
250
|
+
switch (this.config.conflictResolution) {
|
|
251
|
+
case 'linear_wins':
|
|
252
|
+
return true;
|
|
253
|
+
case 'stackmemory_wins':
|
|
254
|
+
return false;
|
|
255
|
+
case 'newest_wins':
|
|
256
|
+
return linearUpdateTime > stackMemoryUpdateTime;
|
|
257
|
+
case 'manual':
|
|
258
|
+
return false;
|
|
259
|
+
default:
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get tasks that haven't been synced to Linear yet
|
|
265
|
+
*/
|
|
266
|
+
getUnsyncedTasks() {
|
|
267
|
+
const activeTasks = this.taskStore.getActiveTasks();
|
|
268
|
+
return activeTasks.filter((task) => !this.mappings.has(task.id) && !task.external_refs?.linear);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Get tasks that have been modified since last sync
|
|
272
|
+
*/
|
|
273
|
+
getModifiedTasks() {
|
|
274
|
+
const tasks = [];
|
|
275
|
+
for (const [taskId, mapping] of this.mappings) {
|
|
276
|
+
const task = this.taskStore.getTask(taskId);
|
|
277
|
+
if (task && task.timestamp * 1000 > mapping.lastSyncTimestamp) {
|
|
278
|
+
tasks.push(task);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return tasks;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Update task with Linear reference
|
|
285
|
+
*/
|
|
286
|
+
updateTaskWithLinearRef(taskId, linearIssue) {
|
|
287
|
+
const task = this.taskStore.getTask(taskId);
|
|
288
|
+
if (!task)
|
|
289
|
+
return;
|
|
290
|
+
// This would need a method in PebblesTaskStore to update external_refs
|
|
291
|
+
// For now, we'll track this in our mappings
|
|
292
|
+
logger.info(`Task ${taskId} mapped to Linear ${linearIssue.identifier}`);
|
|
293
|
+
}
|
|
294
|
+
// Mapping utilities
|
|
295
|
+
formatDescriptionForLinear(task) {
|
|
296
|
+
let description = task.description || '';
|
|
297
|
+
description += `\n\n---\n**StackMemory Context:**\n`;
|
|
298
|
+
description += `- Task ID: ${task.id}\n`;
|
|
299
|
+
description += `- Frame: ${task.frame_id}\n`;
|
|
300
|
+
description += `- Created: ${new Date(task.created_at * 1000).toISOString()}\n`;
|
|
301
|
+
if (task.tags.length > 0) {
|
|
302
|
+
description += `- Tags: ${task.tags.join(', ')}\n`;
|
|
303
|
+
}
|
|
304
|
+
if (task.depends_on.length > 0) {
|
|
305
|
+
description += `- Dependencies: ${task.depends_on.join(', ')}\n`;
|
|
306
|
+
}
|
|
307
|
+
return description;
|
|
308
|
+
}
|
|
309
|
+
mapPriorityToLinear(priority) {
|
|
310
|
+
const map = {
|
|
311
|
+
low: 1, // Low priority in Linear
|
|
312
|
+
medium: 2, // Medium priority in Linear
|
|
313
|
+
high: 3, // High priority in Linear
|
|
314
|
+
urgent: 4, // Urgent priority in Linear
|
|
315
|
+
};
|
|
316
|
+
return map[priority] || 2;
|
|
317
|
+
}
|
|
318
|
+
mapTagsToLinear(_tags) {
|
|
319
|
+
// In a full implementation, this would map StackMemory tags to Linear label IDs
|
|
320
|
+
// For now, return undefined to skip label assignment
|
|
321
|
+
return undefined;
|
|
322
|
+
}
|
|
323
|
+
mapLinearStateToStatus(linearStateType) {
|
|
324
|
+
switch (linearStateType) {
|
|
325
|
+
case 'backlog':
|
|
326
|
+
case 'unstarted':
|
|
327
|
+
return 'pending';
|
|
328
|
+
case 'started':
|
|
329
|
+
return 'in_progress';
|
|
330
|
+
case 'completed':
|
|
331
|
+
return 'completed';
|
|
332
|
+
case 'cancelled':
|
|
333
|
+
return 'cancelled';
|
|
334
|
+
default:
|
|
335
|
+
return 'pending';
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
async mapStatusToLinearState(status) {
|
|
339
|
+
// Get available states for the team
|
|
340
|
+
try {
|
|
341
|
+
const team = await this.linearClient.getTeam();
|
|
342
|
+
const states = await this.linearClient.getWorkflowStates(team.id);
|
|
343
|
+
// Map StackMemory status to Linear state types
|
|
344
|
+
const targetStateType = this.getLinearStateTypeFromStatus(status);
|
|
345
|
+
// Find the first state that matches the target type
|
|
346
|
+
const matchingState = states.find((state) => state.type === targetStateType);
|
|
347
|
+
return matchingState?.id;
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
logger.warn('Failed to map status to Linear state:', error);
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
getLinearStateTypeFromStatus(status) {
|
|
355
|
+
switch (status) {
|
|
356
|
+
case 'pending':
|
|
357
|
+
return 'unstarted';
|
|
358
|
+
case 'in_progress':
|
|
359
|
+
return 'started';
|
|
360
|
+
case 'completed':
|
|
361
|
+
return 'completed';
|
|
362
|
+
case 'cancelled':
|
|
363
|
+
return 'cancelled';
|
|
364
|
+
case 'blocked':
|
|
365
|
+
return 'unstarted'; // Map blocked to unstarted in Linear
|
|
366
|
+
default:
|
|
367
|
+
return 'unstarted';
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// Persistence for mappings
|
|
371
|
+
loadMappings() {
|
|
372
|
+
// In a full implementation, this would load from a file or database
|
|
373
|
+
// For now, start with empty mappings
|
|
374
|
+
this.mappings.clear();
|
|
375
|
+
}
|
|
376
|
+
saveMappings() {
|
|
377
|
+
// In a full implementation, this would save to a file or database
|
|
378
|
+
logger.info(`Saved ${this.mappings.size} task mappings`);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Default sync configuration
|
|
383
|
+
*/
|
|
384
|
+
export const DEFAULT_SYNC_CONFIG = {
|
|
385
|
+
enabled: false,
|
|
386
|
+
direction: 'bidirectional',
|
|
387
|
+
autoSync: false,
|
|
388
|
+
conflictResolution: 'newest_wins',
|
|
389
|
+
syncInterval: 15, // minutes
|
|
390
|
+
};
|
|
391
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../../src/integrations/linear/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* StackMemory MCP Server - Local Instance
|
|
4
|
+
* This runs locally and provides context to Claude Code
|
|
5
|
+
*/
|
|
6
|
+
declare class LocalStackMemoryMCP {
|
|
7
|
+
private server;
|
|
8
|
+
private db;
|
|
9
|
+
private projectRoot;
|
|
10
|
+
private frameManager;
|
|
11
|
+
private taskStore;
|
|
12
|
+
private projectId;
|
|
13
|
+
private contexts;
|
|
14
|
+
private browserMCP;
|
|
15
|
+
constructor();
|
|
16
|
+
private findProjectRoot;
|
|
17
|
+
private initDB;
|
|
18
|
+
private loadInitialContext;
|
|
19
|
+
private getProjectId;
|
|
20
|
+
private getProjectInfo;
|
|
21
|
+
private addContext;
|
|
22
|
+
private loadStoredContexts;
|
|
23
|
+
private setupHandlers;
|
|
24
|
+
private handleGetContext;
|
|
25
|
+
private handleAddDecision;
|
|
26
|
+
private handleStartFrame;
|
|
27
|
+
private handleCloseFrame;
|
|
28
|
+
private handleAddAnchor;
|
|
29
|
+
private handleGetHotStack;
|
|
30
|
+
private logAttention;
|
|
31
|
+
private handleCreateTask;
|
|
32
|
+
private handleUpdateTaskStatus;
|
|
33
|
+
private handleGetActiveTasks;
|
|
34
|
+
private handleGetTaskMetrics;
|
|
35
|
+
private handleAddTaskDependency;
|
|
36
|
+
start(): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
export default LocalStackMemoryMCP;
|
|
39
|
+
export declare function runMCPServer(): Promise<void>;
|
|
40
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/integrations/mcp/server.ts"],"names":[],"mappings":";AACA;;;GAGG;AAyBH,cAAM,mBAAmB;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAmB;IAIpC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,UAAU,CAAwB;;IAiE1C,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,MAAM;IA8Bd,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,aAAa;YAmSP,gBAAgB;YA6ChB,iBAAiB;YAejB,gBAAgB;YAqChB,gBAAgB;YAoChB,eAAe;YAuBf,iBAAiB;IA8D/B,OAAO,CAAC,YAAY;YAYN,gBAAgB;YA4ChB,sBAAsB;YAkCtB,oBAAoB;YA2CpB,oBAAoB;YAmCpB,uBAAuB;IAiC/B,KAAK;CAKZ;AAGD,eAAe,mBAAmB,CAAC;AAGnC,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD"}
|