@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.
Files changed (203) hide show
  1. package/README.md +245 -83
  2. package/dist/scripts/cancel-duplicate-tasks.d.ts +7 -0
  3. package/dist/scripts/cancel-duplicate-tasks.d.ts.map +1 -0
  4. package/dist/scripts/cancel-duplicate-tasks.js +171 -0
  5. package/dist/scripts/cancel-duplicate-tasks.js.map +1 -0
  6. package/dist/scripts/list-linear-tasks.d.ts +6 -0
  7. package/dist/scripts/list-linear-tasks.d.ts.map +1 -0
  8. package/dist/scripts/list-linear-tasks.js +122 -0
  9. package/dist/scripts/list-linear-tasks.js.map +1 -0
  10. package/dist/scripts/merge-linear-duplicates-safe.d.ts +7 -0
  11. package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +1 -0
  12. package/dist/scripts/merge-linear-duplicates-safe.js +265 -0
  13. package/dist/scripts/merge-linear-duplicates-safe.js.map +1 -0
  14. package/dist/scripts/merge-linear-duplicates.d.ts +7 -0
  15. package/dist/scripts/merge-linear-duplicates.d.ts.map +1 -0
  16. package/dist/scripts/merge-linear-duplicates.js +126 -0
  17. package/dist/scripts/merge-linear-duplicates.js.map +1 -0
  18. package/dist/scripts/show-linear-summary.d.ts +6 -0
  19. package/dist/scripts/show-linear-summary.d.ts.map +1 -0
  20. package/dist/scripts/show-linear-summary.js +117 -0
  21. package/dist/scripts/show-linear-summary.js.map +1 -0
  22. package/dist/src/cli/__tests__/index.test.d.ts +5 -0
  23. package/dist/src/cli/__tests__/index.test.d.ts.map +1 -0
  24. package/dist/src/cli/__tests__/index.test.js +726 -0
  25. package/dist/src/cli/__tests__/index.test.js.map +1 -0
  26. package/dist/src/cli/auto-detect.d.ts +61 -0
  27. package/dist/src/cli/auto-detect.d.ts.map +1 -0
  28. package/dist/src/cli/auto-detect.js +350 -0
  29. package/dist/src/cli/auto-detect.js.map +1 -0
  30. package/dist/src/cli/claude-sm.d.ts +7 -0
  31. package/dist/src/cli/claude-sm.d.ts.map +1 -0
  32. package/dist/src/cli/claude-sm.js +357 -0
  33. package/dist/src/cli/claude-sm.js.map +1 -0
  34. package/dist/src/cli/commands/context.d.ts +7 -0
  35. package/dist/src/cli/commands/context.d.ts.map +1 -0
  36. package/dist/src/cli/commands/context.js +365 -0
  37. package/dist/src/cli/commands/context.js.map +1 -0
  38. package/dist/src/cli/commands/linear-test.d.ts +6 -0
  39. package/dist/src/cli/commands/linear-test.d.ts.map +1 -0
  40. package/dist/src/cli/commands/linear-test.js +123 -0
  41. package/dist/src/cli/commands/linear-test.js.map +1 -0
  42. package/dist/src/cli/commands/linear.d.ts +6 -0
  43. package/dist/src/cli/commands/linear.d.ts.map +1 -0
  44. package/dist/src/cli/commands/linear.js +317 -0
  45. package/dist/src/cli/commands/linear.js.map +1 -0
  46. package/dist/src/cli/commands/log.d.ts +7 -0
  47. package/dist/src/cli/commands/log.d.ts.map +1 -0
  48. package/dist/src/cli/commands/log.js +168 -0
  49. package/dist/src/cli/commands/log.js.map +1 -0
  50. package/dist/src/cli/commands/onboard.d.ts +8 -0
  51. package/dist/src/cli/commands/onboard.d.ts.map +1 -0
  52. package/dist/src/cli/commands/onboard.js +363 -0
  53. package/dist/src/cli/commands/onboard.js.map +1 -0
  54. package/dist/src/cli/commands/projects.js +1 -1
  55. package/dist/src/cli/commands/projects.js.map +1 -1
  56. package/dist/src/cli/commands/search.d.ts +7 -0
  57. package/dist/src/cli/commands/search.d.ts.map +1 -0
  58. package/dist/src/cli/commands/search.js +162 -0
  59. package/dist/src/cli/commands/search.js.map +1 -0
  60. package/dist/src/cli/commands/session.d.ts +7 -0
  61. package/dist/src/cli/commands/session.d.ts.map +1 -0
  62. package/dist/src/cli/commands/session.js +222 -0
  63. package/dist/src/cli/commands/session.js.map +1 -0
  64. package/dist/src/cli/commands/tasks.d.ts +7 -0
  65. package/dist/src/cli/commands/tasks.d.ts.map +1 -0
  66. package/dist/src/cli/commands/tasks.js +229 -0
  67. package/dist/src/cli/commands/tasks.js.map +1 -0
  68. package/dist/src/cli/commands/webhook.d.ts +3 -0
  69. package/dist/src/cli/commands/webhook.d.ts.map +1 -0
  70. package/dist/src/cli/commands/webhook.js +157 -0
  71. package/dist/src/cli/commands/webhook.js.map +1 -0
  72. package/dist/src/cli/commands/worktree.d.ts +8 -0
  73. package/dist/src/cli/commands/worktree.d.ts.map +1 -0
  74. package/dist/src/cli/commands/worktree.js +339 -0
  75. package/dist/src/cli/commands/worktree.js.map +1 -0
  76. package/dist/src/cli/index.d.ts +2 -1
  77. package/dist/src/cli/index.d.ts.map +1 -1
  78. package/dist/src/cli/index.js +290 -50
  79. package/dist/src/cli/index.js.map +1 -1
  80. package/dist/src/cli/utils/viewer.d.ts.map +1 -1
  81. package/dist/src/cli/utils/viewer.js +3 -1
  82. package/dist/src/cli/utils/viewer.js.map +1 -1
  83. package/dist/src/core/context/__tests__/frame-manager.test.d.ts +5 -0
  84. package/dist/src/core/context/__tests__/frame-manager.test.d.ts.map +1 -0
  85. package/dist/src/core/context/__tests__/frame-manager.test.js +892 -0
  86. package/dist/src/core/context/__tests__/frame-manager.test.js.map +1 -0
  87. package/dist/src/core/context/auto-context.d.ts +22 -0
  88. package/dist/src/core/context/auto-context.d.ts.map +1 -0
  89. package/dist/src/core/context/auto-context.js +77 -0
  90. package/dist/src/core/context/auto-context.js.map +1 -0
  91. package/dist/src/core/context/frame-manager.d.ts +4 -0
  92. package/dist/src/core/context/frame-manager.d.ts.map +1 -1
  93. package/dist/src/core/context/frame-manager.js +350 -144
  94. package/dist/src/core/context/frame-manager.js.map +1 -1
  95. package/dist/src/core/errors/__tests__/error-handling.test.d.ts +5 -0
  96. package/dist/src/core/errors/__tests__/error-handling.test.d.ts.map +1 -0
  97. package/dist/src/core/errors/__tests__/error-handling.test.js +239 -0
  98. package/dist/src/core/errors/__tests__/error-handling.test.js.map +1 -0
  99. package/dist/src/core/errors/index.d.ts +135 -0
  100. package/dist/src/core/errors/index.d.ts.map +1 -0
  101. package/dist/src/core/errors/index.js +274 -0
  102. package/dist/src/core/errors/index.js.map +1 -0
  103. package/dist/src/core/errors/recovery.d.ts +86 -0
  104. package/dist/src/core/errors/recovery.d.ts.map +1 -0
  105. package/dist/src/core/errors/recovery.js +274 -0
  106. package/dist/src/core/errors/recovery.js.map +1 -0
  107. package/dist/src/core/projects/project-manager.d.ts.map +1 -1
  108. package/dist/src/core/projects/project-manager.js +240 -122
  109. package/dist/src/core/projects/project-manager.js.map +1 -1
  110. package/dist/src/core/session/index.d.ts +2 -0
  111. package/dist/src/core/session/index.d.ts.map +1 -0
  112. package/dist/src/core/session/index.js +2 -0
  113. package/dist/src/core/session/index.js.map +1 -0
  114. package/dist/src/core/session/session-manager.d.ts +69 -0
  115. package/dist/src/core/session/session-manager.d.ts.map +1 -0
  116. package/dist/src/core/session/session-manager.js +311 -0
  117. package/dist/src/core/session/session-manager.js.map +1 -0
  118. package/dist/src/core/utils/update-checker.d.ts.map +1 -1
  119. package/dist/src/core/utils/update-checker.js +82 -25
  120. package/dist/src/core/utils/update-checker.js.map +1 -1
  121. package/dist/src/core/worktree/worktree-manager.d.ts +110 -0
  122. package/dist/src/core/worktree/worktree-manager.d.ts.map +1 -0
  123. package/dist/src/core/worktree/worktree-manager.js +456 -0
  124. package/dist/src/core/worktree/worktree-manager.js.map +1 -0
  125. package/dist/src/features/analytics/core/analytics-service.d.ts +6 -0
  126. package/dist/src/features/analytics/core/analytics-service.d.ts.map +1 -1
  127. package/dist/src/features/analytics/core/analytics-service.js +125 -10
  128. package/dist/src/features/analytics/core/analytics-service.js.map +1 -1
  129. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +1 -1
  130. package/dist/src/features/analytics/queries/metrics-queries.js +220 -163
  131. package/dist/src/features/analytics/queries/metrics-queries.js.map +1 -1
  132. package/dist/src/features/browser/browser-mcp.d.ts.map +1 -1
  133. package/dist/src/features/browser/browser-mcp.js +3 -0
  134. package/dist/src/features/browser/browser-mcp.js.map +1 -1
  135. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts +5 -0
  136. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts.map +1 -0
  137. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js +712 -0
  138. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js.map +1 -0
  139. package/dist/src/features/tasks/pebbles-task-store.d.ts +4 -0
  140. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -1
  141. package/dist/src/features/tasks/pebbles-task-store.js +299 -141
  142. package/dist/src/features/tasks/pebbles-task-store.js.map +1 -1
  143. package/dist/src/integrations/linear/__tests__/auth.test.d.ts +5 -0
  144. package/dist/src/integrations/linear/__tests__/auth.test.d.ts.map +1 -0
  145. package/dist/src/integrations/linear/__tests__/auth.test.js +517 -0
  146. package/dist/src/integrations/linear/__tests__/auth.test.js.map +1 -0
  147. package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts +5 -0
  148. package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts.map +1 -0
  149. package/dist/src/integrations/linear/__tests__/sync-service.test.js +700 -0
  150. package/dist/src/integrations/linear/__tests__/sync-service.test.js.map +1 -0
  151. package/dist/src/integrations/linear/client.d.ts +28 -1
  152. package/dist/src/integrations/linear/client.d.ts.map +1 -1
  153. package/dist/src/integrations/linear/client.js +87 -0
  154. package/dist/src/integrations/linear/client.js.map +1 -1
  155. package/dist/src/integrations/linear/sync-service.d.ts +25 -0
  156. package/dist/src/integrations/linear/sync-service.d.ts.map +1 -0
  157. package/dist/src/integrations/linear/sync-service.js +198 -0
  158. package/dist/src/integrations/linear/sync-service.js.map +1 -0
  159. package/dist/src/integrations/linear/sync.d.ts +23 -1
  160. package/dist/src/integrations/linear/sync.d.ts.map +1 -1
  161. package/dist/src/integrations/linear/sync.js +156 -9
  162. package/dist/src/integrations/linear/sync.js.map +1 -1
  163. package/dist/src/integrations/linear/types.d.ts +75 -0
  164. package/dist/src/integrations/linear/types.d.ts.map +1 -0
  165. package/dist/src/integrations/linear/types.js +2 -0
  166. package/dist/src/integrations/linear/types.js.map +1 -0
  167. package/dist/src/integrations/linear/webhook-server.d.ts +32 -0
  168. package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -0
  169. package/dist/src/integrations/linear/webhook-server.js +188 -0
  170. package/dist/src/integrations/linear/webhook-server.js.map +1 -0
  171. package/dist/src/integrations/linear/webhook.d.ts +95 -0
  172. package/dist/src/integrations/linear/webhook.d.ts.map +1 -0
  173. package/dist/src/integrations/linear/webhook.js +204 -0
  174. package/dist/src/integrations/linear/webhook.js.map +1 -0
  175. package/dist/src/integrations/mcp/__tests__/server.test.d.ts +5 -0
  176. package/dist/src/integrations/mcp/__tests__/server.test.d.ts.map +1 -0
  177. package/dist/src/integrations/mcp/__tests__/server.test.js +790 -0
  178. package/dist/src/integrations/mcp/__tests__/server.test.js.map +1 -0
  179. package/dist/src/integrations/mcp/server.d.ts +6 -0
  180. package/dist/src/integrations/mcp/server.d.ts.map +1 -1
  181. package/dist/src/integrations/mcp/server.js +490 -54
  182. package/dist/src/integrations/mcp/server.js.map +1 -1
  183. package/dist/src/servers/production/auth-middleware.d.ts +2 -2
  184. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
  185. package/dist/src/servers/production/auth-middleware.js +1 -1
  186. package/dist/src/servers/production/auth-middleware.js.map +1 -1
  187. package/dist/src/services/config-service.d.ts +44 -0
  188. package/dist/src/services/config-service.d.ts.map +1 -0
  189. package/dist/src/services/config-service.js +61 -0
  190. package/dist/src/services/config-service.js.map +1 -0
  191. package/dist/src/services/context-service.d.ts +17 -0
  192. package/dist/src/services/context-service.d.ts.map +1 -0
  193. package/dist/src/services/context-service.js +88 -0
  194. package/dist/src/services/context-service.js.map +1 -0
  195. package/dist/src/types/task.d.ts +17 -0
  196. package/dist/src/types/task.d.ts.map +1 -0
  197. package/dist/src/types/task.js +2 -0
  198. package/dist/src/types/task.js.map +1 -0
  199. package/dist/src/utils/logger.d.ts +13 -0
  200. package/dist/src/utils/logger.d.ts.map +1 -0
  201. package/dist/src/utils/logger.js +52 -0
  202. package/dist/src/utils/logger.js.map +1 -0
  203. package/package.json +16 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel-duplicate-tasks.js","sourceRoot":"","sources":["../../scripts/cancel-duplicate-tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ts-node
2
+ /**
3
+ * Standalone script to list all Linear tasks grouped by status
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=list-linear-tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-linear-tasks.d.ts","sourceRoot":"","sources":["../../scripts/list-linear-tasks.ts"],"names":[],"mappings":";AAEA;;GAEG"}
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env ts-node
2
+ /**
3
+ * Standalone script to list all Linear tasks grouped by status
4
+ */
5
+ import { LinearClient } from '../src/integrations/linear/client.js';
6
+ import { LinearAuthManager } from '../src/integrations/linear/auth.js';
7
+ import chalk from 'chalk';
8
+ async function main() {
9
+ try {
10
+ console.log(chalk.cyan('šŸ” Fetching Linear tasks...\n'));
11
+ // Try to get authentication
12
+ const authManager = new LinearAuthManager(process.cwd());
13
+ const tokens = authManager.loadTokens();
14
+ const apiKey = process.env.LINEAR_API_KEY;
15
+ if (!tokens && !apiKey) {
16
+ console.log(chalk.red('āŒ Not authenticated with Linear'));
17
+ console.log('Run: node dist/src/cli/index.js linear setup');
18
+ process.exit(1);
19
+ }
20
+ // Create client
21
+ const client = apiKey
22
+ ? new LinearClient({ apiKey })
23
+ : new LinearClient({
24
+ apiKey: tokens.accessToken,
25
+ });
26
+ // Get all issues (increase limit to get more tasks)
27
+ console.log(chalk.gray('Fetching issues...'));
28
+ const issues = await client.getIssues({ limit: 200 });
29
+ if (!issues || issues.length === 0) {
30
+ console.log(chalk.gray('No issues found'));
31
+ return;
32
+ }
33
+ console.log(chalk.green(`āœ“ Found ${issues.length} tasks`));
34
+ // Group tasks by status
35
+ const tasksByStatus = {};
36
+ issues.forEach((issue) => {
37
+ const statusType = issue.state.type;
38
+ const statusName = issue.state.name;
39
+ const key = `${statusType} (${statusName})`;
40
+ if (!tasksByStatus[key]) {
41
+ tasksByStatus[key] = [];
42
+ }
43
+ tasksByStatus[key].push({
44
+ identifier: issue.identifier,
45
+ title: issue.title,
46
+ priority: issue.priority,
47
+ assignee: issue.assignee?.name,
48
+ url: issue.url,
49
+ });
50
+ });
51
+ // Define status order for display
52
+ const statusOrder = [
53
+ 'backlog',
54
+ 'unstarted',
55
+ 'started',
56
+ 'completed',
57
+ 'cancelled',
58
+ ];
59
+ // Display results grouped by status
60
+ console.log(chalk.cyan('\nšŸ“‹ Linear Tasks by Status:\n'));
61
+ statusOrder.forEach((statusType) => {
62
+ // Find all status keys that match this type
63
+ const matchingKeys = Object.keys(tasksByStatus).filter((key) => key.startsWith(statusType));
64
+ matchingKeys.forEach((statusKey) => {
65
+ const tasks = tasksByStatus[statusKey];
66
+ if (tasks.length === 0)
67
+ return;
68
+ // Status header with count
69
+ console.log(chalk.bold.white(`\n${getStatusEmoji(statusType)} ${statusKey} (${tasks.length} tasks)`));
70
+ console.log(chalk.gray(''.padEnd(60, '─')));
71
+ // List tasks
72
+ tasks.forEach((task) => {
73
+ const priorityStr = task.priority > 0
74
+ ? chalk.yellow(`P${task.priority}`)
75
+ : chalk.gray('--');
76
+ const assigneeStr = task.assignee
77
+ ? chalk.blue(task.assignee)
78
+ : chalk.gray('Unassigned');
79
+ const titleStr = task.title.length > 50
80
+ ? task.title.substring(0, 47) + '...'
81
+ : task.title;
82
+ console.log(` ${chalk.cyan(task.identifier.padEnd(8))} ${titleStr.padEnd(50)} ${priorityStr.padEnd(8)} ${assigneeStr}`);
83
+ });
84
+ });
85
+ });
86
+ // Summary
87
+ const totalTasks = issues.length;
88
+ const statusCounts = Object.entries(tasksByStatus).map(([status, tasks]) => ({
89
+ status,
90
+ count: tasks.length,
91
+ }));
92
+ console.log(chalk.cyan('\nšŸ“Š Summary:'));
93
+ statusCounts.forEach(({ status, count }) => {
94
+ console.log(chalk.gray(` ${status}: ${count} tasks`));
95
+ });
96
+ console.log(chalk.bold(` Total: ${totalTasks} tasks`));
97
+ }
98
+ catch (error) {
99
+ console.error(chalk.red('āŒ Error:'), error.message);
100
+ process.exit(1);
101
+ }
102
+ }
103
+ function getStatusEmoji(statusType) {
104
+ switch (statusType) {
105
+ case 'backlog':
106
+ return 'šŸ“‹';
107
+ case 'unstarted':
108
+ return 'šŸ“';
109
+ case 'started':
110
+ return 'ā³';
111
+ case 'completed':
112
+ return 'āœ…';
113
+ case 'cancelled':
114
+ return 'āŒ';
115
+ default:
116
+ return 'šŸ“„';
117
+ }
118
+ }
119
+ if (require.main === module) {
120
+ main();
121
+ }
122
+ //# sourceMappingURL=list-linear-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-linear-tasks.js","sourceRoot":"","sources":["../../scripts/list-linear-tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Script to merge duplicate Linear tasks (with dry-run option)
4
+ * Keeps the lowest-numbered task as primary and marks others as duplicates
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=merge-linear-duplicates-safe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-linear-duplicates-safe.d.ts","sourceRoot":"","sources":["../../scripts/merge-linear-duplicates-safe.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
@@ -0,0 +1,265 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Script to merge duplicate Linear tasks (with dry-run option)
4
+ * Keeps the lowest-numbered task as primary and marks others as duplicates
5
+ */
6
+ import { readFileSync } from 'fs';
7
+ import { join } from 'path';
8
+ const duplicateGroups = [
9
+ {
10
+ name: 'Linear API Integration',
11
+ taskIds: ['STA-88', 'STA-74', 'STA-61', 'STA-46', 'STA-32', 'STA-9'],
12
+ primaryId: 'STA-9',
13
+ },
14
+ {
15
+ name: 'Performance Optimization',
16
+ taskIds: [
17
+ 'STA-87',
18
+ 'STA-73',
19
+ 'STA-60',
20
+ 'STA-45',
21
+ 'STA-31',
22
+ 'STA-13',
23
+ 'STA-21',
24
+ 'STA-35',
25
+ 'STA-50',
26
+ 'STA-63',
27
+ 'STA-77',
28
+ ],
29
+ primaryId: 'STA-13',
30
+ },
31
+ {
32
+ name: 'Security Audit and Input Validation',
33
+ taskIds: ['STA-85', 'STA-71', 'STA-58', 'STA-43', 'STA-29'],
34
+ primaryId: 'STA-29',
35
+ },
36
+ {
37
+ name: 'Implement Proper Error Handling',
38
+ taskIds: ['STA-84', 'STA-70', 'STA-57', 'STA-42', 'STA-28'],
39
+ primaryId: 'STA-28',
40
+ },
41
+ {
42
+ name: 'Implement Comprehensive Testing Suite',
43
+ taskIds: ['STA-83', 'STA-69', 'STA-56', 'STA-41', 'STA-27'],
44
+ primaryId: 'STA-27',
45
+ },
46
+ ];
47
+ async function mergeDuplicateTasks(dryRun = true) {
48
+ const mode = dryRun ? 'šŸ” DRY RUN MODE' : '⚔ LIVE MODE';
49
+ console.log(`\n${mode} - Linear duplicate task merge\n`);
50
+ console.log('='.repeat(60));
51
+ // Load Linear tokens
52
+ const tokensPath = join(process.cwd(), '.stackmemory', 'linear-tokens.json');
53
+ let accessToken;
54
+ try {
55
+ const tokensData = readFileSync(tokensPath, 'utf8');
56
+ const tokens = JSON.parse(tokensData);
57
+ accessToken = tokens.accessToken;
58
+ console.log('āœ… Loaded Linear authentication tokens\n');
59
+ }
60
+ catch {
61
+ console.error('āŒ Failed to load Linear tokens. Please run: stackmemory linear setup');
62
+ process.exit(1);
63
+ }
64
+ // Initialize Linear client using GraphQL directly
65
+ const linearApiUrl = 'https://api.linear.app/graphql';
66
+ async function graphqlRequest(query, variables = {}) {
67
+ const response = await fetch(linearApiUrl, {
68
+ method: 'POST',
69
+ headers: {
70
+ Authorization: `Bearer ${accessToken}`,
71
+ 'Content-Type': 'application/json',
72
+ },
73
+ body: JSON.stringify({ query, variables }),
74
+ });
75
+ if (!response.ok) {
76
+ throw new Error(`Linear API error: ${response.status} ${response.statusText}`);
77
+ }
78
+ const result = (await response.json());
79
+ if (result.errors) {
80
+ throw new Error(`GraphQL errors: ${JSON.stringify(result.errors)}`);
81
+ }
82
+ return result.data;
83
+ }
84
+ // Get team and workflow states
85
+ console.log('Fetching team information...');
86
+ const teamQuery = `
87
+ query {
88
+ teams {
89
+ nodes {
90
+ id
91
+ key
92
+ name
93
+ states {
94
+ nodes {
95
+ id
96
+ name
97
+ type
98
+ }
99
+ }
100
+ }
101
+ }
102
+ }
103
+ `;
104
+ const teamData = (await graphqlRequest(teamQuery));
105
+ const team = teamData.teams.nodes[0];
106
+ if (!team) {
107
+ console.error('āŒ No team found');
108
+ process.exit(1);
109
+ }
110
+ const canceledState = team.states.nodes.find((s) => s.type === 'canceled');
111
+ if (!canceledState) {
112
+ console.error('āŒ No canceled state found in team workflow');
113
+ process.exit(1);
114
+ }
115
+ console.log(`āœ… Found team: ${team.name} (${team.key})`);
116
+ console.log(`āœ… Canceled state ID: ${canceledState.id}\n`);
117
+ // Process each duplicate group
118
+ let totalUpdates = 0;
119
+ let totalCanceled = 0;
120
+ for (const group of duplicateGroups) {
121
+ console.log(`\nšŸ“‹ Processing: ${group.name}`);
122
+ console.log(` Primary: ${group.primaryId}`);
123
+ console.log(` Will cancel: ${group.taskIds.filter((id) => id !== group.primaryId).join(', ')}`);
124
+ if (dryRun) {
125
+ console.log(' šŸ” [DRY RUN] Would:');
126
+ console.log(` - Keep ${group.primaryId} as primary`);
127
+ console.log(` - Cancel ${group.taskIds.length - 1} duplicates`);
128
+ console.log(` - Merge any unique descriptions into primary`);
129
+ totalCanceled += group.taskIds.length - 1;
130
+ }
131
+ else {
132
+ try {
133
+ // Get all issues in the group
134
+ const issueQuery = `
135
+ query GetIssue($identifier: String!) {
136
+ issue(id: $identifier) {
137
+ id
138
+ identifier
139
+ title
140
+ description
141
+ state {
142
+ id
143
+ name
144
+ type
145
+ }
146
+ }
147
+ }
148
+ `;
149
+ // Get primary issue
150
+ const primaryData = (await graphqlRequest(issueQuery, {
151
+ identifier: group.primaryId,
152
+ }));
153
+ const primaryIssue = primaryData.issue;
154
+ if (!primaryIssue) {
155
+ console.log(` āš ļø Primary issue ${group.primaryId} not found, skipping group`);
156
+ continue;
157
+ }
158
+ // Process duplicates
159
+ const duplicateIds = group.taskIds.filter((id) => id !== group.primaryId);
160
+ const mergedDescriptions = [];
161
+ for (const duplicateId of duplicateIds) {
162
+ try {
163
+ const dupData = (await graphqlRequest(issueQuery, {
164
+ identifier: duplicateId,
165
+ }));
166
+ const duplicateIssue = dupData.issue;
167
+ if (!duplicateIssue) {
168
+ console.log(` āš ļø Issue ${duplicateId} not found, skipping`);
169
+ continue;
170
+ }
171
+ // Collect unique descriptions
172
+ if (duplicateIssue.description &&
173
+ duplicateIssue.description !== primaryIssue.description) {
174
+ mergedDescriptions.push(`[Merged from ${duplicateId}]\n${duplicateIssue.description}`);
175
+ }
176
+ // Cancel the duplicate
177
+ const updateMutation = `
178
+ mutation UpdateIssue($id: String!, $stateId: String!, $description: String!) {
179
+ issueUpdate(
180
+ id: $id,
181
+ input: {
182
+ stateId: $stateId,
183
+ description: $description
184
+ }
185
+ ) {
186
+ success
187
+ issue {
188
+ identifier
189
+ state {
190
+ name
191
+ type
192
+ }
193
+ }
194
+ }
195
+ }
196
+ `;
197
+ await graphqlRequest(updateMutation, {
198
+ id: duplicateIssue.id,
199
+ stateId: canceledState.id,
200
+ description: `Duplicate of ${group.primaryId}\n\n${duplicateIssue.description || ''}`,
201
+ });
202
+ console.log(` āœ… Canceled ${duplicateId} as duplicate`);
203
+ totalCanceled++;
204
+ }
205
+ catch (error) {
206
+ console.log(` āŒ Failed to process ${duplicateId}: ${error.message}`);
207
+ }
208
+ }
209
+ // Update primary with merged descriptions if any
210
+ if (mergedDescriptions.length > 0) {
211
+ const newDescription = [
212
+ primaryIssue.description || '',
213
+ '',
214
+ '--- Merged Content ---',
215
+ ...mergedDescriptions,
216
+ ]
217
+ .filter(Boolean)
218
+ .join('\n\n');
219
+ const updatePrimaryMutation = `
220
+ mutation UpdatePrimaryIssue($id: String!, $description: String!) {
221
+ issueUpdate(
222
+ id: $id,
223
+ input: {
224
+ description: $description
225
+ }
226
+ ) {
227
+ success
228
+ }
229
+ }
230
+ `;
231
+ await graphqlRequest(updatePrimaryMutation, {
232
+ id: primaryIssue.id,
233
+ description: newDescription,
234
+ });
235
+ console.log(` āœ… Updated ${group.primaryId} with merged descriptions`);
236
+ totalUpdates++;
237
+ }
238
+ }
239
+ catch (error) {
240
+ console.error(` āŒ Error processing group: ${error.message}`);
241
+ }
242
+ }
243
+ }
244
+ // Summary
245
+ console.log('\n' + '='.repeat(60));
246
+ console.log(`\n✨ ${dryRun ? 'DRY RUN' : 'MERGE'} COMPLETE!\n`);
247
+ console.log('šŸ“Š Summary:');
248
+ console.log(` Groups processed: ${duplicateGroups.length}`);
249
+ console.log(` Primary tasks kept: ${duplicateGroups.length}`);
250
+ console.log(` Tasks ${dryRun ? 'to cancel' : 'canceled'}: ${dryRun ? duplicateGroups.reduce((acc, g) => acc + g.taskIds.length - 1, 0) : totalCanceled}`);
251
+ if (!dryRun) {
252
+ console.log(` Primary tasks updated: ${totalUpdates}`);
253
+ }
254
+ if (dryRun) {
255
+ console.log('\nšŸ’” To execute these changes, run with --execute flag');
256
+ }
257
+ }
258
+ // Parse command line arguments
259
+ const isDryRun = !process.argv.includes('--execute');
260
+ // Run the merge
261
+ mergeDuplicateTasks(isDryRun).catch((error) => {
262
+ console.error('āŒ Fatal error:', error);
263
+ process.exit(1);
264
+ });
265
+ //# sourceMappingURL=merge-linear-duplicates-safe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-linear-duplicates-safe.js","sourceRoot":"","sources":["../../scripts/merge-linear-duplicates-safe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
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
+ export {};
7
+ //# sourceMappingURL=merge-linear-duplicates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-linear-duplicates.d.ts","sourceRoot":"","sources":["../../scripts/merge-linear-duplicates.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
@@ -0,0 +1,126 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-linear-duplicates.js","sourceRoot":"","sources":["../../scripts/merge-linear-duplicates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Show Linear task summary with all statuses
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=show-linear-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show-linear-summary.d.ts","sourceRoot":"","sources":["../../scripts/show-linear-summary.ts"],"names":[],"mappings":";AAEA;;GAEG"}