@stackmemoryai/stackmemory 0.2.6 → 0.2.7
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 +245 -83
- package/dist/scripts/cancel-duplicate-tasks.d.ts +7 -0
- package/dist/scripts/cancel-duplicate-tasks.d.ts.map +1 -0
- package/dist/scripts/cancel-duplicate-tasks.js +171 -0
- package/dist/scripts/cancel-duplicate-tasks.js.map +1 -0
- package/dist/scripts/list-linear-tasks.d.ts +6 -0
- package/dist/scripts/list-linear-tasks.d.ts.map +1 -0
- package/dist/scripts/list-linear-tasks.js +122 -0
- package/dist/scripts/list-linear-tasks.js.map +1 -0
- package/dist/scripts/merge-linear-duplicates-safe.d.ts +7 -0
- package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +1 -0
- package/dist/scripts/merge-linear-duplicates-safe.js +265 -0
- package/dist/scripts/merge-linear-duplicates-safe.js.map +1 -0
- package/dist/scripts/merge-linear-duplicates.d.ts +7 -0
- package/dist/scripts/merge-linear-duplicates.d.ts.map +1 -0
- package/dist/scripts/merge-linear-duplicates.js +126 -0
- package/dist/scripts/merge-linear-duplicates.js.map +1 -0
- package/dist/scripts/show-linear-summary.d.ts +6 -0
- package/dist/scripts/show-linear-summary.d.ts.map +1 -0
- package/dist/scripts/show-linear-summary.js +117 -0
- package/dist/scripts/show-linear-summary.js.map +1 -0
- package/dist/src/cli/__tests__/index.test.d.ts +5 -0
- package/dist/src/cli/__tests__/index.test.d.ts.map +1 -0
- package/dist/src/cli/__tests__/index.test.js +726 -0
- package/dist/src/cli/__tests__/index.test.js.map +1 -0
- package/dist/src/cli/auto-detect.d.ts +61 -0
- package/dist/src/cli/auto-detect.d.ts.map +1 -0
- package/dist/src/cli/auto-detect.js +350 -0
- package/dist/src/cli/auto-detect.js.map +1 -0
- package/dist/src/cli/claude-sm.d.ts +7 -0
- package/dist/src/cli/claude-sm.d.ts.map +1 -0
- package/dist/src/cli/claude-sm.js +357 -0
- package/dist/src/cli/claude-sm.js.map +1 -0
- package/dist/src/cli/commands/context.d.ts +7 -0
- package/dist/src/cli/commands/context.d.ts.map +1 -0
- package/dist/src/cli/commands/context.js +365 -0
- package/dist/src/cli/commands/context.js.map +1 -0
- package/dist/src/cli/commands/linear-test.d.ts +6 -0
- package/dist/src/cli/commands/linear-test.d.ts.map +1 -0
- package/dist/src/cli/commands/linear-test.js +123 -0
- package/dist/src/cli/commands/linear-test.js.map +1 -0
- package/dist/src/cli/commands/linear.d.ts +6 -0
- package/dist/src/cli/commands/linear.d.ts.map +1 -0
- package/dist/src/cli/commands/linear.js +317 -0
- package/dist/src/cli/commands/linear.js.map +1 -0
- package/dist/src/cli/commands/log.d.ts +7 -0
- package/dist/src/cli/commands/log.d.ts.map +1 -0
- package/dist/src/cli/commands/log.js +168 -0
- package/dist/src/cli/commands/log.js.map +1 -0
- package/dist/src/cli/commands/onboard.d.ts +8 -0
- package/dist/src/cli/commands/onboard.d.ts.map +1 -0
- package/dist/src/cli/commands/onboard.js +363 -0
- package/dist/src/cli/commands/onboard.js.map +1 -0
- package/dist/src/cli/commands/projects.js +1 -1
- package/dist/src/cli/commands/projects.js.map +1 -1
- package/dist/src/cli/commands/search.d.ts +7 -0
- package/dist/src/cli/commands/search.d.ts.map +1 -0
- package/dist/src/cli/commands/search.js +162 -0
- package/dist/src/cli/commands/search.js.map +1 -0
- package/dist/src/cli/commands/session.d.ts +7 -0
- package/dist/src/cli/commands/session.d.ts.map +1 -0
- package/dist/src/cli/commands/session.js +222 -0
- package/dist/src/cli/commands/session.js.map +1 -0
- package/dist/src/cli/commands/tasks.d.ts +7 -0
- package/dist/src/cli/commands/tasks.d.ts.map +1 -0
- package/dist/src/cli/commands/tasks.js +229 -0
- package/dist/src/cli/commands/tasks.js.map +1 -0
- package/dist/src/cli/commands/webhook.d.ts +3 -0
- package/dist/src/cli/commands/webhook.d.ts.map +1 -0
- package/dist/src/cli/commands/webhook.js +157 -0
- package/dist/src/cli/commands/webhook.js.map +1 -0
- package/dist/src/cli/commands/worktree.d.ts +8 -0
- package/dist/src/cli/commands/worktree.d.ts.map +1 -0
- package/dist/src/cli/commands/worktree.js +339 -0
- package/dist/src/cli/commands/worktree.js.map +1 -0
- package/dist/src/cli/index.d.ts +2 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +290 -50
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/utils/viewer.d.ts.map +1 -1
- package/dist/src/cli/utils/viewer.js +3 -1
- package/dist/src/cli/utils/viewer.js.map +1 -1
- package/dist/src/core/context/__tests__/frame-manager.test.d.ts +5 -0
- package/dist/src/core/context/__tests__/frame-manager.test.d.ts.map +1 -0
- package/dist/src/core/context/__tests__/frame-manager.test.js +892 -0
- package/dist/src/core/context/__tests__/frame-manager.test.js.map +1 -0
- package/dist/src/core/context/auto-context.d.ts +22 -0
- package/dist/src/core/context/auto-context.d.ts.map +1 -0
- package/dist/src/core/context/auto-context.js +77 -0
- package/dist/src/core/context/auto-context.js.map +1 -0
- package/dist/src/core/context/frame-manager.d.ts +4 -0
- package/dist/src/core/context/frame-manager.d.ts.map +1 -1
- package/dist/src/core/context/frame-manager.js +350 -144
- package/dist/src/core/context/frame-manager.js.map +1 -1
- package/dist/src/core/errors/__tests__/error-handling.test.d.ts +5 -0
- package/dist/src/core/errors/__tests__/error-handling.test.d.ts.map +1 -0
- package/dist/src/core/errors/__tests__/error-handling.test.js +239 -0
- package/dist/src/core/errors/__tests__/error-handling.test.js.map +1 -0
- package/dist/src/core/errors/index.d.ts +135 -0
- package/dist/src/core/errors/index.d.ts.map +1 -0
- package/dist/src/core/errors/index.js +274 -0
- package/dist/src/core/errors/index.js.map +1 -0
- package/dist/src/core/errors/recovery.d.ts +86 -0
- package/dist/src/core/errors/recovery.d.ts.map +1 -0
- package/dist/src/core/errors/recovery.js +274 -0
- package/dist/src/core/errors/recovery.js.map +1 -0
- package/dist/src/core/projects/project-manager.d.ts.map +1 -1
- package/dist/src/core/projects/project-manager.js +240 -122
- package/dist/src/core/projects/project-manager.js.map +1 -1
- package/dist/src/core/session/index.d.ts +2 -0
- package/dist/src/core/session/index.d.ts.map +1 -0
- package/dist/src/core/session/index.js +2 -0
- package/dist/src/core/session/index.js.map +1 -0
- package/dist/src/core/session/session-manager.d.ts +69 -0
- package/dist/src/core/session/session-manager.d.ts.map +1 -0
- package/dist/src/core/session/session-manager.js +311 -0
- package/dist/src/core/session/session-manager.js.map +1 -0
- package/dist/src/core/utils/update-checker.d.ts.map +1 -1
- package/dist/src/core/utils/update-checker.js +82 -25
- package/dist/src/core/utils/update-checker.js.map +1 -1
- package/dist/src/core/worktree/worktree-manager.d.ts +110 -0
- package/dist/src/core/worktree/worktree-manager.d.ts.map +1 -0
- package/dist/src/core/worktree/worktree-manager.js +456 -0
- package/dist/src/core/worktree/worktree-manager.js.map +1 -0
- package/dist/src/features/analytics/core/analytics-service.d.ts +6 -0
- package/dist/src/features/analytics/core/analytics-service.d.ts.map +1 -1
- package/dist/src/features/analytics/core/analytics-service.js +125 -10
- package/dist/src/features/analytics/core/analytics-service.js.map +1 -1
- package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +1 -1
- package/dist/src/features/analytics/queries/metrics-queries.js +220 -163
- package/dist/src/features/analytics/queries/metrics-queries.js.map +1 -1
- package/dist/src/features/browser/browser-mcp.d.ts.map +1 -1
- package/dist/src/features/browser/browser-mcp.js +3 -0
- package/dist/src/features/browser/browser-mcp.js.map +1 -1
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts +5 -0
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts.map +1 -0
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js +712 -0
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js.map +1 -0
- package/dist/src/features/tasks/pebbles-task-store.d.ts +4 -0
- package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -1
- package/dist/src/features/tasks/pebbles-task-store.js +299 -141
- package/dist/src/features/tasks/pebbles-task-store.js.map +1 -1
- package/dist/src/integrations/linear/__tests__/auth.test.d.ts +5 -0
- package/dist/src/integrations/linear/__tests__/auth.test.d.ts.map +1 -0
- package/dist/src/integrations/linear/__tests__/auth.test.js +517 -0
- package/dist/src/integrations/linear/__tests__/auth.test.js.map +1 -0
- package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts +5 -0
- package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts.map +1 -0
- package/dist/src/integrations/linear/__tests__/sync-service.test.js +700 -0
- package/dist/src/integrations/linear/__tests__/sync-service.test.js.map +1 -0
- package/dist/src/integrations/linear/client.d.ts +28 -1
- package/dist/src/integrations/linear/client.d.ts.map +1 -1
- package/dist/src/integrations/linear/client.js +87 -0
- package/dist/src/integrations/linear/client.js.map +1 -1
- package/dist/src/integrations/linear/sync-service.d.ts +25 -0
- package/dist/src/integrations/linear/sync-service.d.ts.map +1 -0
- package/dist/src/integrations/linear/sync-service.js +198 -0
- package/dist/src/integrations/linear/sync-service.js.map +1 -0
- package/dist/src/integrations/linear/sync.d.ts +23 -1
- package/dist/src/integrations/linear/sync.d.ts.map +1 -1
- package/dist/src/integrations/linear/sync.js +156 -9
- package/dist/src/integrations/linear/sync.js.map +1 -1
- package/dist/src/integrations/linear/types.d.ts +75 -0
- package/dist/src/integrations/linear/types.d.ts.map +1 -0
- package/dist/src/integrations/linear/types.js +2 -0
- package/dist/src/integrations/linear/types.js.map +1 -0
- package/dist/src/integrations/linear/webhook-server.d.ts +32 -0
- package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -0
- package/dist/src/integrations/linear/webhook-server.js +188 -0
- package/dist/src/integrations/linear/webhook-server.js.map +1 -0
- package/dist/src/integrations/linear/webhook.d.ts +95 -0
- package/dist/src/integrations/linear/webhook.d.ts.map +1 -0
- package/dist/src/integrations/linear/webhook.js +204 -0
- package/dist/src/integrations/linear/webhook.js.map +1 -0
- package/dist/src/integrations/mcp/__tests__/server.test.d.ts +5 -0
- package/dist/src/integrations/mcp/__tests__/server.test.d.ts.map +1 -0
- package/dist/src/integrations/mcp/__tests__/server.test.js +790 -0
- package/dist/src/integrations/mcp/__tests__/server.test.js.map +1 -0
- package/dist/src/integrations/mcp/server.d.ts +6 -0
- package/dist/src/integrations/mcp/server.d.ts.map +1 -1
- package/dist/src/integrations/mcp/server.js +490 -54
- package/dist/src/integrations/mcp/server.js.map +1 -1
- package/dist/src/servers/production/auth-middleware.d.ts +2 -2
- package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
- package/dist/src/servers/production/auth-middleware.js +1 -1
- package/dist/src/servers/production/auth-middleware.js.map +1 -1
- package/dist/src/services/config-service.d.ts +44 -0
- package/dist/src/services/config-service.d.ts.map +1 -0
- package/dist/src/services/config-service.js +61 -0
- package/dist/src/services/config-service.js.map +1 -0
- package/dist/src/services/context-service.d.ts +17 -0
- package/dist/src/services/context-service.d.ts.map +1 -0
- package/dist/src/services/context-service.js +88 -0
- package/dist/src/services/context-service.js.map +1 -0
- package/dist/src/types/task.d.ts +17 -0
- package/dist/src/types/task.d.ts.map +1 -0
- package/dist/src/types/task.js +2 -0
- package/dist/src/types/task.js.map +1 -0
- package/dist/src/utils/logger.d.ts +13 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +52 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/package.json +16 -3
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linear Webhook Handler
|
|
3
|
+
* Processes incoming webhooks from Linear for real-time sync
|
|
4
|
+
*/
|
|
5
|
+
import { LinearSyncEngine } from './sync.js';
|
|
6
|
+
import { PebblesTaskStore } from '../../features/tasks/pebbles-task-store.js';
|
|
7
|
+
export interface LinearWebhookPayload {
|
|
8
|
+
action: 'create' | 'update' | 'remove';
|
|
9
|
+
createdAt: string;
|
|
10
|
+
data: {
|
|
11
|
+
id: string;
|
|
12
|
+
identifier: string;
|
|
13
|
+
title?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
state?: {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
type: string;
|
|
19
|
+
};
|
|
20
|
+
priority?: number;
|
|
21
|
+
assignee?: {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
email: string;
|
|
25
|
+
};
|
|
26
|
+
team?: {
|
|
27
|
+
id: string;
|
|
28
|
+
key: string;
|
|
29
|
+
name: string;
|
|
30
|
+
};
|
|
31
|
+
labels?: Array<{
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
color: string;
|
|
35
|
+
}>;
|
|
36
|
+
dueDate?: string;
|
|
37
|
+
completedAt?: string;
|
|
38
|
+
updatedAt: string;
|
|
39
|
+
};
|
|
40
|
+
type: 'Issue' | 'Comment' | 'Project' | 'Cycle';
|
|
41
|
+
url: string;
|
|
42
|
+
webhookId: string;
|
|
43
|
+
webhookTimestamp: number;
|
|
44
|
+
}
|
|
45
|
+
export declare class LinearWebhookHandler {
|
|
46
|
+
private syncEngine?;
|
|
47
|
+
private taskStore?;
|
|
48
|
+
private webhookSecret?;
|
|
49
|
+
constructor(webhookSecret?: string);
|
|
50
|
+
/**
|
|
51
|
+
* Set the sync engine for processing webhooks
|
|
52
|
+
*/
|
|
53
|
+
setSyncEngine(syncEngine: LinearSyncEngine): void;
|
|
54
|
+
/**
|
|
55
|
+
* Set the task store for direct updates
|
|
56
|
+
*/
|
|
57
|
+
setTaskStore(taskStore: PebblesTaskStore): void;
|
|
58
|
+
/**
|
|
59
|
+
* Verify webhook signature
|
|
60
|
+
*/
|
|
61
|
+
verifySignature(body: string, signature: string): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Process incoming webhook
|
|
64
|
+
*/
|
|
65
|
+
processWebhook(payload: LinearWebhookPayload): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Handle issue created in Linear
|
|
68
|
+
*/
|
|
69
|
+
private handleIssueCreated;
|
|
70
|
+
/**
|
|
71
|
+
* Handle issue updated in Linear
|
|
72
|
+
*/
|
|
73
|
+
private handleIssueUpdated;
|
|
74
|
+
/**
|
|
75
|
+
* Handle issue removed in Linear
|
|
76
|
+
*/
|
|
77
|
+
private handleIssueRemoved;
|
|
78
|
+
/**
|
|
79
|
+
* Check if we should sync this issue
|
|
80
|
+
*/
|
|
81
|
+
private shouldSyncIssue;
|
|
82
|
+
/**
|
|
83
|
+
* Find mapping by Linear ID
|
|
84
|
+
*/
|
|
85
|
+
private findMappingByLinearId;
|
|
86
|
+
/**
|
|
87
|
+
* Map Linear state to StackMemory status
|
|
88
|
+
*/
|
|
89
|
+
private mapLinearStateToStatus;
|
|
90
|
+
/**
|
|
91
|
+
* Map Linear priority to StackMemory priority
|
|
92
|
+
*/
|
|
93
|
+
private mapLinearPriorityToPriority;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../../src/integrations/linear/webhook.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAG9E,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE;YACN,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;QACF,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE;YACT,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;QACF,IAAI,CAAC,EAAE;YACL,EAAE,EAAE,MAAM,CAAC;YACX,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;QACF,MAAM,CAAC,EAAE,KAAK,CAAC;YACb,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;SACf,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAmB;IACtC,OAAO,CAAC,SAAS,CAAC,CAAmB;IACrC,OAAO,CAAC,aAAa,CAAC,CAAS;gBAEnB,aAAa,CAAC,EAAE,MAAM;IAIlC;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI;IAIjD;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAI/C;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAazD;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BlE;;OAEG;YACW,kBAAkB;IAkBhC;;OAEG;YACW,kBAAkB;IAwDhC;;OAEG;YACW,kBAAkB;IAiBhC;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAM7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;OAEG;IACH,OAAO,CAAC,2BAA2B;CAIpC"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linear Webhook Handler
|
|
3
|
+
* Processes incoming webhooks from Linear for real-time sync
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../../core/monitoring/logger.js';
|
|
6
|
+
import crypto from 'crypto';
|
|
7
|
+
export class LinearWebhookHandler {
|
|
8
|
+
syncEngine;
|
|
9
|
+
taskStore;
|
|
10
|
+
webhookSecret;
|
|
11
|
+
constructor(webhookSecret) {
|
|
12
|
+
this.webhookSecret = webhookSecret || process.env.LINEAR_WEBHOOK_SECRET;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Set the sync engine for processing webhooks
|
|
16
|
+
*/
|
|
17
|
+
setSyncEngine(syncEngine) {
|
|
18
|
+
this.syncEngine = syncEngine;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Set the task store for direct updates
|
|
22
|
+
*/
|
|
23
|
+
setTaskStore(taskStore) {
|
|
24
|
+
this.taskStore = taskStore;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Verify webhook signature
|
|
28
|
+
*/
|
|
29
|
+
verifySignature(body, signature) {
|
|
30
|
+
if (!this.webhookSecret) {
|
|
31
|
+
logger.warn('No webhook secret configured, skipping verification');
|
|
32
|
+
return true; // Allow in development
|
|
33
|
+
}
|
|
34
|
+
const hmac = crypto.createHmac('sha256', this.webhookSecret);
|
|
35
|
+
hmac.update(body);
|
|
36
|
+
const expectedSignature = hmac.digest('hex');
|
|
37
|
+
return signature === expectedSignature;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Process incoming webhook
|
|
41
|
+
*/
|
|
42
|
+
async processWebhook(payload) {
|
|
43
|
+
logger.info('Processing Linear webhook', {
|
|
44
|
+
action: payload.action,
|
|
45
|
+
type: payload.type,
|
|
46
|
+
id: payload.data.id
|
|
47
|
+
});
|
|
48
|
+
// Only process Issue webhooks for now
|
|
49
|
+
if (payload.type !== 'Issue') {
|
|
50
|
+
logger.info(`Ignoring webhook for type: ${payload.type}`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
switch (payload.action) {
|
|
54
|
+
case 'create':
|
|
55
|
+
await this.handleIssueCreated(payload);
|
|
56
|
+
break;
|
|
57
|
+
case 'update':
|
|
58
|
+
await this.handleIssueUpdated(payload);
|
|
59
|
+
break;
|
|
60
|
+
case 'remove':
|
|
61
|
+
await this.handleIssueRemoved(payload);
|
|
62
|
+
break;
|
|
63
|
+
default:
|
|
64
|
+
logger.warn(`Unknown webhook action: ${payload.action}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Handle issue created in Linear
|
|
69
|
+
*/
|
|
70
|
+
async handleIssueCreated(payload) {
|
|
71
|
+
logger.info('Linear issue created', { identifier: payload.data.identifier });
|
|
72
|
+
// Check if we should sync this issue
|
|
73
|
+
if (!this.shouldSyncIssue(payload.data)) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// For now, just log it - full implementation would create a StackMemory task
|
|
77
|
+
logger.info('Would create StackMemory task for Linear issue', {
|
|
78
|
+
identifier: payload.data.identifier,
|
|
79
|
+
title: payload.data.title
|
|
80
|
+
});
|
|
81
|
+
// TODO: Implement task creation with proper frame context
|
|
82
|
+
// This would require access to the current FrameManager context
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Handle issue updated in Linear
|
|
86
|
+
*/
|
|
87
|
+
async handleIssueUpdated(payload) {
|
|
88
|
+
logger.info('Linear issue updated', { identifier: payload.data.identifier });
|
|
89
|
+
if (!this.syncEngine) {
|
|
90
|
+
logger.warn('No sync engine configured, cannot process update');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Find mapped StackMemory task
|
|
94
|
+
const mapping = this.findMappingByLinearId(payload.data.id);
|
|
95
|
+
if (!mapping) {
|
|
96
|
+
logger.info('No mapping found for Linear issue', { id: payload.data.id });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Check for conflicts
|
|
100
|
+
const task = this.taskStore?.getTask(mapping.stackmemoryId);
|
|
101
|
+
if (!task) {
|
|
102
|
+
logger.warn('StackMemory task not found', { id: mapping.stackmemoryId });
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Update the task based on Linear changes
|
|
106
|
+
let newStatus;
|
|
107
|
+
if (payload.data.state) {
|
|
108
|
+
const mappedStatus = this.mapLinearStateToStatus(payload.data.state);
|
|
109
|
+
if (mappedStatus !== task.status) {
|
|
110
|
+
newStatus = mappedStatus;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (payload.data.completedAt) {
|
|
114
|
+
newStatus = 'completed';
|
|
115
|
+
}
|
|
116
|
+
// Update status if changed
|
|
117
|
+
if (newStatus) {
|
|
118
|
+
this.taskStore?.updateTaskStatus(mapping.stackmemoryId, newStatus, 'Linear webhook update');
|
|
119
|
+
logger.info('Updated StackMemory task status from webhook', {
|
|
120
|
+
taskId: mapping.stackmemoryId,
|
|
121
|
+
newStatus
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// For other properties, we'd need to implement a more complete update method
|
|
125
|
+
// For now, log what changed
|
|
126
|
+
if (payload.data.title && payload.data.title !== task.title) {
|
|
127
|
+
logger.info('Task title changed in Linear but not updated in StackMemory', {
|
|
128
|
+
taskId: mapping.stackmemoryId,
|
|
129
|
+
oldTitle: task.title,
|
|
130
|
+
newTitle: payload.data.title
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Handle issue removed in Linear
|
|
136
|
+
*/
|
|
137
|
+
async handleIssueRemoved(payload) {
|
|
138
|
+
logger.info('Linear issue removed', { identifier: payload.data.identifier });
|
|
139
|
+
const mapping = this.findMappingByLinearId(payload.data.id);
|
|
140
|
+
if (!mapping) {
|
|
141
|
+
logger.info('No mapping found for removed Linear issue');
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Mark the StackMemory task as cancelled
|
|
145
|
+
this.taskStore?.updateTaskStatus(mapping.stackmemoryId, 'cancelled', 'Linear issue deleted');
|
|
146
|
+
logger.info('Marked StackMemory task as cancelled due to Linear deletion', {
|
|
147
|
+
taskId: mapping.stackmemoryId
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check if we should sync this issue
|
|
152
|
+
*/
|
|
153
|
+
shouldSyncIssue(issue) {
|
|
154
|
+
// Add your filtering logic here
|
|
155
|
+
// For example, only sync issues from specific teams or with certain labels
|
|
156
|
+
// Skip issues without a title
|
|
157
|
+
if (!issue.title) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
// Skip archived/cancelled issues
|
|
161
|
+
if (issue.state?.type === 'canceled' || issue.state?.type === 'archived') {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Find mapping by Linear ID
|
|
168
|
+
*/
|
|
169
|
+
findMappingByLinearId(linearId) {
|
|
170
|
+
// TODO: Implement proper mapping lookup from database
|
|
171
|
+
// For now, return null
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Map Linear state to StackMemory status
|
|
176
|
+
*/
|
|
177
|
+
mapLinearStateToStatus(state) {
|
|
178
|
+
const stateType = state.type?.toLowerCase() || state.name?.toLowerCase();
|
|
179
|
+
switch (stateType) {
|
|
180
|
+
case 'backlog':
|
|
181
|
+
case 'unstarted':
|
|
182
|
+
return 'pending';
|
|
183
|
+
case 'started':
|
|
184
|
+
case 'in progress':
|
|
185
|
+
return 'in_progress';
|
|
186
|
+
case 'completed':
|
|
187
|
+
case 'done':
|
|
188
|
+
return 'completed';
|
|
189
|
+
case 'canceled':
|
|
190
|
+
case 'cancelled':
|
|
191
|
+
return 'cancelled';
|
|
192
|
+
default:
|
|
193
|
+
return 'pending';
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Map Linear priority to StackMemory priority
|
|
198
|
+
*/
|
|
199
|
+
mapLinearPriorityToPriority(priority) {
|
|
200
|
+
// Linear uses 0-4, StackMemory uses 1-5
|
|
201
|
+
return 5 - priority;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../../src/integrations/linear/webhook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../../../../../src/integrations/mcp/__tests__/server.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|