@stackmemoryai/stackmemory 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/scripts/initialize.js +15 -15
  2. package/dist/scripts/initialize.js.map +1 -1
  3. package/dist/scripts/status.js +21 -11
  4. package/dist/scripts/status.js.map +1 -1
  5. package/dist/src/beads/beads-task-store.d.ts +117 -0
  6. package/dist/src/beads/beads-task-store.d.ts.map +1 -0
  7. package/dist/src/beads/beads-task-store.js +318 -0
  8. package/dist/src/beads/beads-task-store.js.map +1 -0
  9. package/dist/src/beads/task-aware-context.d.ts +103 -0
  10. package/dist/src/beads/task-aware-context.d.ts.map +1 -0
  11. package/dist/src/beads/task-aware-context.js +395 -0
  12. package/dist/src/beads/task-aware-context.js.map +1 -0
  13. package/dist/src/beads-task-store.d.ts +117 -0
  14. package/dist/src/beads-task-store.d.ts.map +1 -0
  15. package/dist/src/beads-task-store.js +318 -0
  16. package/dist/src/beads-task-store.js.map +1 -0
  17. package/dist/src/cli/cli.d.ts +7 -0
  18. package/dist/src/cli/cli.d.ts.map +1 -0
  19. package/dist/src/cli/cli.js +471 -0
  20. package/dist/src/cli/cli.js.map +1 -0
  21. package/dist/src/core/error-handler.d.ts +46 -0
  22. package/dist/src/core/error-handler.d.ts.map +1 -0
  23. package/dist/src/core/error-handler.js +212 -0
  24. package/dist/src/core/error-handler.js.map +1 -0
  25. package/dist/src/core/frame-manager.d.ts +106 -0
  26. package/dist/src/core/frame-manager.d.ts.map +1 -0
  27. package/dist/src/core/frame-manager.js +387 -0
  28. package/dist/src/core/frame-manager.js.map +1 -0
  29. package/dist/src/core/logger.d.ts +24 -0
  30. package/dist/src/core/logger.d.ts.map +1 -0
  31. package/dist/src/core/logger.js +121 -0
  32. package/dist/src/core/logger.js.map +1 -0
  33. package/dist/src/core/logger.test.d.ts +2 -0
  34. package/dist/src/core/logger.test.d.ts.map +1 -0
  35. package/dist/src/core/logger.test.js +31 -0
  36. package/dist/src/core/logger.test.js.map +1 -0
  37. package/dist/src/index.d.ts +4 -4
  38. package/dist/src/index.d.ts.map +1 -1
  39. package/dist/src/index.js +4 -4
  40. package/dist/src/index.js.map +1 -1
  41. package/dist/src/integrations/linear-auth.d.ts +99 -0
  42. package/dist/src/integrations/linear-auth.d.ts.map +1 -0
  43. package/dist/src/integrations/linear-auth.js +319 -0
  44. package/dist/src/integrations/linear-auth.js.map +1 -0
  45. package/dist/src/integrations/linear-auto-sync.d.ts +77 -0
  46. package/dist/src/integrations/linear-auto-sync.d.ts.map +1 -0
  47. package/dist/src/integrations/linear-auto-sync.js +268 -0
  48. package/dist/src/integrations/linear-auto-sync.js.map +1 -0
  49. package/dist/src/integrations/linear-client.d.ts +86 -0
  50. package/dist/src/integrations/linear-client.d.ts.map +1 -0
  51. package/dist/src/integrations/linear-client.js +275 -0
  52. package/dist/src/integrations/linear-client.js.map +1 -0
  53. package/dist/src/integrations/linear-config.d.ts +51 -0
  54. package/dist/src/integrations/linear-config.d.ts.map +1 -0
  55. package/dist/src/integrations/linear-config.js +103 -0
  56. package/dist/src/integrations/linear-config.js.map +1 -0
  57. package/dist/src/integrations/linear-sync.d.ts +95 -0
  58. package/dist/src/integrations/linear-sync.d.ts.map +1 -0
  59. package/dist/src/integrations/linear-sync.js +340 -0
  60. package/dist/src/integrations/linear-sync.js.map +1 -0
  61. package/dist/src/mcp/mcp-server.d.ts +38 -0
  62. package/dist/src/mcp/mcp-server.d.ts.map +1 -0
  63. package/dist/src/mcp/mcp-server.js +812 -0
  64. package/dist/src/mcp/mcp-server.js.map +1 -0
  65. package/dist/src/pebbles/pebbles-task-store.d.ts +117 -0
  66. package/dist/src/pebbles/pebbles-task-store.d.ts.map +1 -0
  67. package/dist/src/pebbles/pebbles-task-store.js +335 -0
  68. package/dist/src/pebbles/pebbles-task-store.js.map +1 -0
  69. package/dist/src/pebbles/task-aware-context.d.ts +103 -0
  70. package/dist/src/pebbles/task-aware-context.d.ts.map +1 -0
  71. package/dist/src/pebbles/task-aware-context.js +412 -0
  72. package/dist/src/pebbles/task-aware-context.js.map +1 -0
  73. package/dist/src/task-aware-context.d.ts +103 -0
  74. package/dist/src/task-aware-context.d.ts.map +1 -0
  75. package/dist/src/task-aware-context.js +395 -0
  76. package/dist/src/task-aware-context.js.map +1 -0
  77. package/package.json +40 -9
@@ -0,0 +1,395 @@
1
+ /**
2
+ * Task-Aware Context Assembly
3
+ * Intelligently selects context based on active tasks and their relationships
4
+ */
5
+ import { logger } from './logger.js';
6
+ export class TaskAwareContextManager {
7
+ db;
8
+ frameManager;
9
+ projectId;
10
+ constructor(db, frameManager, projectId) {
11
+ this.db = db;
12
+ this.frameManager = frameManager;
13
+ this.projectId = projectId;
14
+ this.initializeTaskSchema();
15
+ }
16
+ initializeTaskSchema() {
17
+ this.db.exec(`
18
+ CREATE TABLE IF NOT EXISTS tasks (
19
+ task_id TEXT PRIMARY KEY,
20
+ frame_id TEXT NOT NULL,
21
+ anchor_id TEXT,
22
+ name TEXT NOT NULL,
23
+ description TEXT,
24
+ status TEXT DEFAULT 'pending',
25
+ priority TEXT DEFAULT 'medium',
26
+ parent_task_id TEXT,
27
+ depends_on TEXT DEFAULT '[]',
28
+ assigned_to TEXT,
29
+ estimated_effort INTEGER,
30
+ actual_effort INTEGER,
31
+ created_at INTEGER DEFAULT (unixepoch()),
32
+ started_at INTEGER,
33
+ completed_at INTEGER,
34
+ blocked_reason TEXT,
35
+ context_tags TEXT DEFAULT '[]',
36
+ metadata TEXT DEFAULT '{}',
37
+ FOREIGN KEY(frame_id) REFERENCES frames(frame_id),
38
+ FOREIGN KEY(anchor_id) REFERENCES anchors(anchor_id),
39
+ FOREIGN KEY(parent_task_id) REFERENCES tasks(task_id)
40
+ );
41
+
42
+ CREATE TABLE IF NOT EXISTS task_dependencies (
43
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
44
+ task_id TEXT NOT NULL,
45
+ depends_on_task_id TEXT NOT NULL,
46
+ dependency_type TEXT DEFAULT 'blocks',
47
+ created_at INTEGER DEFAULT (unixepoch()),
48
+ FOREIGN KEY(task_id) REFERENCES tasks(task_id),
49
+ FOREIGN KEY(depends_on_task_id) REFERENCES tasks(task_id)
50
+ );
51
+
52
+ CREATE TABLE IF NOT EXISTS context_access_log (
53
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
54
+ request_id TEXT NOT NULL,
55
+ task_ids TEXT, -- JSON array of relevant task IDs
56
+ context_items TEXT, -- JSON array of included context items
57
+ relevance_scores TEXT, -- JSON object of item -> score mappings
58
+ total_tokens INTEGER,
59
+ query_hash TEXT,
60
+ timestamp INTEGER DEFAULT (unixepoch())
61
+ );
62
+
63
+ CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
64
+ CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);
65
+ CREATE INDEX IF NOT EXISTS idx_tasks_frame ON tasks(frame_id);
66
+ CREATE INDEX IF NOT EXISTS idx_task_deps ON task_dependencies(task_id);
67
+ `);
68
+ }
69
+ /**
70
+ * Create task from TODO anchor or standalone
71
+ */
72
+ createTask(options) {
73
+ const taskId = `task_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
74
+ const frameId = options.frameId || this.frameManager.getCurrentFrameId();
75
+ if (!frameId) {
76
+ throw new Error('No active frame for task creation');
77
+ }
78
+ const task = {
79
+ task_id: taskId,
80
+ frame_id: frameId,
81
+ anchor_id: options.anchorId,
82
+ name: options.name,
83
+ description: options.description,
84
+ status: 'pending',
85
+ priority: options.priority || 'medium',
86
+ parent_task_id: options.parentTaskId,
87
+ depends_on: options.dependsOn || [],
88
+ estimated_effort: options.estimatedEffort,
89
+ created_at: Math.floor(Date.now() / 1000),
90
+ context_tags: options.contextTags || [],
91
+ metadata: options.metadata || {}
92
+ };
93
+ // Insert task
94
+ this.db.prepare(`
95
+ INSERT INTO tasks (
96
+ task_id, frame_id, anchor_id, name, description, status, priority,
97
+ parent_task_id, depends_on, estimated_effort, created_at, context_tags, metadata
98
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
99
+ `).run(task.task_id, task.frame_id, task.anchor_id, task.name, task.description, task.status, task.priority, task.parent_task_id, JSON.stringify(task.depends_on), task.estimated_effort, task.created_at, JSON.stringify(task.context_tags), JSON.stringify(task.metadata));
100
+ // Create dependency relationships
101
+ if (task.depends_on.length > 0) {
102
+ const dependencyStmt = this.db.prepare(`
103
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (?, ?)
104
+ `);
105
+ task.depends_on.forEach(depTaskId => {
106
+ dependencyStmt.run(taskId, depTaskId);
107
+ });
108
+ }
109
+ // Log event
110
+ this.frameManager.addEvent('decision', {
111
+ action: 'create_task',
112
+ task_id: taskId,
113
+ name: task.name,
114
+ priority: task.priority
115
+ });
116
+ logger.info('Created task', { taskId, name: task.name, frameId });
117
+ return taskId;
118
+ }
119
+ /**
120
+ * Update task status with automatic time tracking
121
+ */
122
+ updateTaskStatus(taskId, newStatus, reason) {
123
+ const task = this.getTask(taskId);
124
+ if (!task)
125
+ throw new Error(`Task not found: ${taskId}`);
126
+ const now = Math.floor(Date.now() / 1000);
127
+ const updates = { status: newStatus };
128
+ // Automatic time tracking
129
+ if (newStatus === 'in_progress' && task.status === 'pending') {
130
+ updates.started_at = now;
131
+ }
132
+ else if (newStatus === 'completed' && task.status === 'in_progress') {
133
+ updates.completed_at = now;
134
+ if (task.started_at) {
135
+ updates.actual_effort = now - task.started_at;
136
+ }
137
+ }
138
+ else if (newStatus === 'blocked') {
139
+ updates.blocked_reason = reason || 'No reason provided';
140
+ }
141
+ // Build dynamic update query
142
+ const setClause = Object.keys(updates).map(key => `${key} = ?`).join(', ');
143
+ const values = Object.values(updates);
144
+ this.db.prepare(`UPDATE tasks SET ${setClause} WHERE task_id = ?`)
145
+ .run(...values, taskId);
146
+ // Log status change
147
+ this.frameManager.addEvent('observation', {
148
+ action: 'task_status_change',
149
+ task_id: taskId,
150
+ old_status: task.status,
151
+ new_status: newStatus,
152
+ reason
153
+ });
154
+ logger.info('Updated task status', { taskId, oldStatus: task.status, newStatus });
155
+ }
156
+ /**
157
+ * Assemble context optimized for active tasks and query
158
+ */
159
+ assembleTaskAwareContext(request) {
160
+ const startTime = Date.now();
161
+ // 1. Get active and relevant tasks
162
+ const activeTasks = this.getActiveTasks(request.taskFocus);
163
+ const blockedTasks = this.getBlockedTasks();
164
+ // 2. Score and select relevant context
165
+ const contextItems = this.selectRelevantContext(activeTasks, request);
166
+ // 3. Assemble final context with smart ordering
167
+ const { context, totalTokens, relevanceScores } = this.buildContextString(contextItems, activeTasks, request.maxTokens || 4000);
168
+ // 4. Log context access for learning
169
+ this.logContextAccess({
170
+ taskIds: activeTasks.map(t => t.task_id),
171
+ contextItems: contextItems.map(item => item.id),
172
+ relevanceScores,
173
+ totalTokens,
174
+ query: request.query || ''
175
+ });
176
+ const metadata = {
177
+ includedTasks: activeTasks,
178
+ contextSources: contextItems.map(item => `${item.type}:${item.id}`),
179
+ totalTokens,
180
+ relevanceScores
181
+ };
182
+ logger.info('Assembled task-aware context', {
183
+ activeTasks: activeTasks.length,
184
+ blockedTasks: blockedTasks.length,
185
+ contextItems: contextItems.length,
186
+ totalTokens,
187
+ assemblyTimeMs: Date.now() - startTime
188
+ });
189
+ return { context, metadata };
190
+ }
191
+ /**
192
+ * Get tasks that are currently active or should be in context
193
+ */
194
+ getActiveTasks(taskFocus) {
195
+ let query = `
196
+ SELECT * FROM tasks
197
+ WHERE status IN ('in_progress', 'pending')
198
+ `;
199
+ let params = [];
200
+ if (taskFocus && taskFocus.length > 0) {
201
+ query += ` AND task_id IN (${taskFocus.map(() => '?').join(',')})`;
202
+ params = taskFocus;
203
+ }
204
+ query += ` ORDER BY priority DESC, created_at ASC`;
205
+ const rows = this.db.prepare(query).all(...params);
206
+ return this.hydrateTasks(rows);
207
+ }
208
+ getBlockedTasks() {
209
+ const rows = this.db.prepare(`
210
+ SELECT * FROM tasks WHERE status = 'blocked' ORDER BY priority DESC
211
+ `).all();
212
+ return this.hydrateTasks(rows);
213
+ }
214
+ /**
215
+ * Select context items relevant to active tasks
216
+ */
217
+ selectRelevantContext(activeTasks, request) {
218
+ const contextItems = [];
219
+ // Get frames for active tasks
220
+ const frameIds = [...new Set(activeTasks.map(t => t.frame_id))];
221
+ frameIds.forEach(frameId => {
222
+ const frame = this.frameManager.getFrame(frameId);
223
+ if (frame) {
224
+ const score = this.calculateFrameRelevance(frame, activeTasks, request.query);
225
+ contextItems.push({
226
+ id: frameId,
227
+ type: 'frame',
228
+ content: `Frame: ${frame.name} (${frame.type})`,
229
+ relevanceScore: score,
230
+ tokenEstimate: frame.name.length + 20
231
+ });
232
+ }
233
+ });
234
+ // Get relevant anchors
235
+ const anchors = this.getRelevantAnchors(frameIds, request);
236
+ anchors.forEach(anchor => {
237
+ const score = this.calculateAnchorRelevance(anchor, activeTasks, request.query);
238
+ contextItems.push({
239
+ id: anchor.anchor_id,
240
+ type: 'anchor',
241
+ content: `${anchor.type}: ${anchor.text}`,
242
+ relevanceScore: score,
243
+ tokenEstimate: anchor.text.length + 10
244
+ });
245
+ });
246
+ // Get recent events from active frames
247
+ if (request.includeHistory) {
248
+ frameIds.forEach(frameId => {
249
+ const events = this.frameManager.getFrameEvents(frameId, 5);
250
+ events.forEach(event => {
251
+ const score = this.calculateEventRelevance(event, activeTasks, request.query);
252
+ if (score > 0.3) {
253
+ contextItems.push({
254
+ id: event.event_id,
255
+ type: 'event',
256
+ content: `Event: ${event.event_type}`,
257
+ relevanceScore: score,
258
+ tokenEstimate: 30
259
+ });
260
+ }
261
+ });
262
+ });
263
+ }
264
+ // Sort by relevance score
265
+ return contextItems.sort((a, b) => b.relevanceScore - a.relevanceScore);
266
+ }
267
+ buildContextString(contextItems, activeTasks, maxTokens) {
268
+ let context = "# Active Task Context\n\n";
269
+ let totalTokens = 20; // Header estimate
270
+ const relevanceScores = {};
271
+ // Always include active tasks summary
272
+ context += "## Current Tasks\n";
273
+ activeTasks.forEach(task => {
274
+ const line = `- [${task.status.toUpperCase()}] ${task.name} (${task.priority})\n`;
275
+ context += line;
276
+ totalTokens += line.length / 4; // Rough token estimate
277
+ relevanceScores[task.task_id] = 1.0;
278
+ });
279
+ context += "\n";
280
+ // Add context items within token budget
281
+ context += "## Relevant Context\n";
282
+ for (const item of contextItems) {
283
+ if (totalTokens + item.tokenEstimate > maxTokens)
284
+ break;
285
+ context += `${item.content}\n`;
286
+ totalTokens += item.tokenEstimate;
287
+ relevanceScores[item.id] = item.relevanceScore;
288
+ }
289
+ return { context, totalTokens, relevanceScores };
290
+ }
291
+ // Relevance scoring methods
292
+ calculateFrameRelevance(frame, activeTasks, query) {
293
+ let score = 0.5; // Base relevance
294
+ // Higher score if frame contains active tasks
295
+ if (activeTasks.some(t => t.frame_id === frame.frame_id)) {
296
+ score += 0.4;
297
+ }
298
+ // Query matching
299
+ if (query) {
300
+ const queryLower = query.toLowerCase();
301
+ if (frame.name.toLowerCase().includes(queryLower)) {
302
+ score += 0.3;
303
+ }
304
+ }
305
+ // Recent frames get boost
306
+ const ageHours = (Date.now() / 1000 - frame.created_at) / 3600;
307
+ if (ageHours < 24)
308
+ score += 0.2;
309
+ return Math.min(score, 1.0);
310
+ }
311
+ calculateAnchorRelevance(anchor, activeTasks, query) {
312
+ let score = 0.3; // Base relevance
313
+ // Task-related anchors get priority
314
+ if (anchor.type === 'TODO')
315
+ score += 0.4;
316
+ if (anchor.type === 'DECISION')
317
+ score += 0.3;
318
+ if (anchor.type === 'CONSTRAINT')
319
+ score += 0.2;
320
+ // Priority-based boost
321
+ score += (anchor.priority / 10) * 0.2;
322
+ // Query matching
323
+ if (query) {
324
+ const queryLower = query.toLowerCase();
325
+ if (anchor.text.toLowerCase().includes(queryLower)) {
326
+ score += 0.3;
327
+ }
328
+ }
329
+ return Math.min(score, 1.0);
330
+ }
331
+ calculateEventRelevance(event, activeTasks, query) {
332
+ let score = 0.1; // Base relevance
333
+ // Event type relevance
334
+ if (event.event_type === 'decision')
335
+ score += 0.4;
336
+ if (event.event_type === 'tool_call')
337
+ score += 0.3;
338
+ if (event.event_type === 'observation')
339
+ score += 0.2;
340
+ // Recent events get boost
341
+ const ageHours = (Date.now() / 1000 - event.ts) / 3600;
342
+ if (ageHours < 1)
343
+ score += 0.3;
344
+ else if (ageHours < 6)
345
+ score += 0.2;
346
+ return Math.min(score, 1.0);
347
+ }
348
+ // Helper methods
349
+ getTask(taskId) {
350
+ const row = this.db.prepare(`SELECT * FROM tasks WHERE task_id = ?`).get(taskId);
351
+ return row ? this.hydrateTask(row) : undefined;
352
+ }
353
+ getRelevantAnchors(frameIds, request) {
354
+ if (frameIds.length === 0)
355
+ return [];
356
+ const placeholders = frameIds.map(() => '?').join(',');
357
+ const rows = this.db.prepare(`
358
+ SELECT * FROM anchors
359
+ WHERE frame_id IN (${placeholders})
360
+ ORDER BY priority DESC, created_at DESC
361
+ LIMIT 20
362
+ `).all(...frameIds);
363
+ return rows.map(row => ({
364
+ ...row,
365
+ metadata: JSON.parse(row.metadata || '{}')
366
+ }));
367
+ }
368
+ hydrateTasks(rows) {
369
+ return rows.map(this.hydrateTask);
370
+ }
371
+ hydrateTask = (row) => ({
372
+ ...row,
373
+ depends_on: JSON.parse(row.depends_on || '[]'),
374
+ context_tags: JSON.parse(row.context_tags || '[]'),
375
+ metadata: JSON.parse(row.metadata || '{}')
376
+ });
377
+ logContextAccess(data) {
378
+ const requestId = `ctx_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;
379
+ this.db.prepare(`
380
+ INSERT INTO context_access_log (
381
+ request_id, task_ids, context_items, relevance_scores, total_tokens, query_hash
382
+ ) VALUES (?, ?, ?, ?, ?, ?)
383
+ `).run(requestId, JSON.stringify(data.taskIds), JSON.stringify(data.contextItems), JSON.stringify(data.relevanceScores), data.totalTokens, this.hashString(data.query));
384
+ }
385
+ hashString(str) {
386
+ let hash = 0;
387
+ for (let i = 0; i < str.length; i++) {
388
+ const char = str.charCodeAt(i);
389
+ hash = ((hash << 5) - hash) + char;
390
+ hash = hash & hash; // Convert to 32-bit integer
391
+ }
392
+ return hash.toString(16);
393
+ }
394
+ }
395
+ //# sourceMappingURL=task-aware-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-aware-context.js","sourceRoot":"","sources":["../../src/task-aware-context.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@stackmemoryai/stackmemory",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Lossless, project-scoped memory for AI tools",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
7
7
  "bin": {
8
- "stackmemory": "dist/src/cli.js"
8
+ "stackmemory": "dist/src/cli/cli.js"
9
9
  },
10
10
  "types": "dist/src/index.d.ts",
11
11
  "files": [
@@ -37,13 +37,25 @@
37
37
  "setup": "npm install && npm run build && npm run init",
38
38
  "init": "node dist/scripts/initialize.js",
39
39
  "build": "tsc",
40
+ "lint": "eslint src/**/*.ts scripts/**/*.ts",
41
+ "lint:fix": "eslint src/**/*.ts scripts/**/*.ts --fix",
42
+ "lint:autofix": "node scripts/fix-lint-loop.cjs",
43
+ "format": "prettier --write src/**/*.ts scripts/**/*.ts",
44
+ "test": "vitest",
45
+ "test:ui": "vitest --ui",
46
+ "test:run": "vitest run",
40
47
  "prepublishOnly": "npm run build",
41
- "dev": "tsx watch src/mcp-server.ts",
42
- "mcp:start": "node dist/mcp-server.js",
43
- "mcp:dev": "tsx src/mcp-server.ts",
44
- "test:attention": "tsx scripts/test-attention.ts",
45
- "analyze": "tsx scripts/analyze-context.ts",
46
- "status": "tsx scripts/status.ts"
48
+ "quality": "npm run lint && npm run test:run && npm run build",
49
+ "dev": "tsx watch src/mcp/mcp-server.ts",
50
+ "mcp:start": "node dist/src/mcp/mcp-server.js",
51
+ "mcp:dev": "tsx src/mcp/mcp-server.ts",
52
+ "status": "node dist/scripts/status.js",
53
+ "status:dev": "tsx scripts/status.ts",
54
+ "linear:setup": "node dist/src/cli/cli.js linear setup",
55
+ "linear:status": "node dist/src/cli/cli.js linear status",
56
+ "linear:config": "node dist/src/cli/cli.js linear config --show",
57
+ "linear:auto-sync": "node dist/src/cli/cli.js linear auto-sync --start",
58
+ "prepare": "husky"
47
59
  },
48
60
  "dependencies": {
49
61
  "@modelcontextprotocol/sdk": "^0.5.0",
@@ -63,7 +75,26 @@
63
75
  "@types/node": "^20.10.6",
64
76
  "@types/simple-peer": "^9.11.8",
65
77
  "@types/uuid": "^10.0.0",
78
+ "@typescript-eslint/eslint-plugin": "^8.50.1",
79
+ "@typescript-eslint/parser": "^8.50.1",
80
+ "@vitest/ui": "^4.0.16",
81
+ "eslint": "^9.39.2",
82
+ "eslint-config-prettier": "^10.1.8",
83
+ "eslint-plugin-prettier": "^5.5.4",
84
+ "husky": "^9.1.7",
85
+ "lint-staged": "^16.2.7",
86
+ "prettier": "^3.7.4",
66
87
  "tsx": "^4.7.0",
67
- "typescript": "^5.3.3"
88
+ "typescript": "^5.3.3",
89
+ "vitest": "^4.0.16"
90
+ },
91
+ "lint-staged": {
92
+ "*.{ts,js}": [
93
+ "npm run lint:autofix",
94
+ "prettier --write"
95
+ ],
96
+ "*.ts": [
97
+ "vitest related --run"
98
+ ]
68
99
  }
69
100
  }