@task-mcp/shared 1.0.20 → 1.0.22

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 (175) hide show
  1. package/README.md +122 -0
  2. package/package.json +1 -6
  3. package/src/algorithms/critical-path.ts +31 -6
  4. package/src/algorithms/dependency-integrity.ts +5 -2
  5. package/src/algorithms/topological-sort.ts +66 -17
  6. package/src/utils/index.ts +5 -5
  7. package/src/utils/natural-language.ts +210 -83
  8. package/src/utils/projection.ts +8 -8
  9. package/src/utils/workspace.ts +16 -4
  10. package/dist/algorithms/critical-path.d.ts +0 -46
  11. package/dist/algorithms/critical-path.d.ts.map +0 -1
  12. package/dist/algorithms/critical-path.js +0 -320
  13. package/dist/algorithms/critical-path.js.map +0 -1
  14. package/dist/algorithms/critical-path.test.d.ts +0 -2
  15. package/dist/algorithms/critical-path.test.d.ts.map +0 -1
  16. package/dist/algorithms/critical-path.test.js +0 -194
  17. package/dist/algorithms/critical-path.test.js.map +0 -1
  18. package/dist/algorithms/dependency-integrity.d.ts +0 -81
  19. package/dist/algorithms/dependency-integrity.d.ts.map +0 -1
  20. package/dist/algorithms/dependency-integrity.js +0 -207
  21. package/dist/algorithms/dependency-integrity.js.map +0 -1
  22. package/dist/algorithms/dependency-integrity.test.d.ts +0 -2
  23. package/dist/algorithms/dependency-integrity.test.d.ts.map +0 -1
  24. package/dist/algorithms/dependency-integrity.test.js +0 -309
  25. package/dist/algorithms/dependency-integrity.test.js.map +0 -1
  26. package/dist/algorithms/index.d.ts +0 -5
  27. package/dist/algorithms/index.d.ts.map +0 -1
  28. package/dist/algorithms/index.js +0 -5
  29. package/dist/algorithms/index.js.map +0 -1
  30. package/dist/algorithms/tech-analysis.d.ts +0 -106
  31. package/dist/algorithms/tech-analysis.d.ts.map +0 -1
  32. package/dist/algorithms/tech-analysis.js +0 -344
  33. package/dist/algorithms/tech-analysis.js.map +0 -1
  34. package/dist/algorithms/tech-analysis.test.d.ts +0 -2
  35. package/dist/algorithms/tech-analysis.test.d.ts.map +0 -1
  36. package/dist/algorithms/tech-analysis.test.js +0 -338
  37. package/dist/algorithms/tech-analysis.test.js.map +0 -1
  38. package/dist/algorithms/topological-sort.d.ts +0 -41
  39. package/dist/algorithms/topological-sort.d.ts.map +0 -1
  40. package/dist/algorithms/topological-sort.js +0 -165
  41. package/dist/algorithms/topological-sort.js.map +0 -1
  42. package/dist/algorithms/topological-sort.test.d.ts +0 -2
  43. package/dist/algorithms/topological-sort.test.d.ts.map +0 -1
  44. package/dist/algorithms/topological-sort.test.js +0 -162
  45. package/dist/algorithms/topological-sort.test.js.map +0 -1
  46. package/dist/index.d.ts +0 -4
  47. package/dist/index.d.ts.map +0 -1
  48. package/dist/index.js +0 -7
  49. package/dist/index.js.map +0 -1
  50. package/dist/schemas/inbox.d.ts +0 -55
  51. package/dist/schemas/inbox.d.ts.map +0 -1
  52. package/dist/schemas/inbox.js +0 -25
  53. package/dist/schemas/inbox.js.map +0 -1
  54. package/dist/schemas/index.d.ts +0 -7
  55. package/dist/schemas/index.d.ts.map +0 -1
  56. package/dist/schemas/index.js +0 -17
  57. package/dist/schemas/index.js.map +0 -1
  58. package/dist/schemas/project.d.ts +0 -177
  59. package/dist/schemas/project.d.ts.map +0 -1
  60. package/dist/schemas/project.js +0 -56
  61. package/dist/schemas/project.js.map +0 -1
  62. package/dist/schemas/response-format.d.ts +0 -148
  63. package/dist/schemas/response-format.d.ts.map +0 -1
  64. package/dist/schemas/response-format.js +0 -18
  65. package/dist/schemas/response-format.js.map +0 -1
  66. package/dist/schemas/response-schema.d.ts +0 -307
  67. package/dist/schemas/response-schema.d.ts.map +0 -1
  68. package/dist/schemas/response-schema.js +0 -75
  69. package/dist/schemas/response-schema.js.map +0 -1
  70. package/dist/schemas/response-schema.test.d.ts +0 -2
  71. package/dist/schemas/response-schema.test.d.ts.map +0 -1
  72. package/dist/schemas/response-schema.test.js +0 -256
  73. package/dist/schemas/response-schema.test.js.map +0 -1
  74. package/dist/schemas/state.d.ts +0 -17
  75. package/dist/schemas/state.d.ts.map +0 -1
  76. package/dist/schemas/state.js +0 -17
  77. package/dist/schemas/state.js.map +0 -1
  78. package/dist/schemas/task.d.ts +0 -881
  79. package/dist/schemas/task.d.ts.map +0 -1
  80. package/dist/schemas/task.js +0 -189
  81. package/dist/schemas/task.js.map +0 -1
  82. package/dist/schemas/view.d.ts +0 -143
  83. package/dist/schemas/view.d.ts.map +0 -1
  84. package/dist/schemas/view.js +0 -48
  85. package/dist/schemas/view.js.map +0 -1
  86. package/dist/utils/dashboard-renderer.d.ts +0 -93
  87. package/dist/utils/dashboard-renderer.d.ts.map +0 -1
  88. package/dist/utils/dashboard-renderer.js +0 -424
  89. package/dist/utils/dashboard-renderer.js.map +0 -1
  90. package/dist/utils/dashboard-renderer.test.d.ts +0 -2
  91. package/dist/utils/dashboard-renderer.test.d.ts.map +0 -1
  92. package/dist/utils/dashboard-renderer.test.js +0 -774
  93. package/dist/utils/dashboard-renderer.test.js.map +0 -1
  94. package/dist/utils/date.d.ts +0 -94
  95. package/dist/utils/date.d.ts.map +0 -1
  96. package/dist/utils/date.js +0 -323
  97. package/dist/utils/date.js.map +0 -1
  98. package/dist/utils/date.test.d.ts +0 -2
  99. package/dist/utils/date.test.d.ts.map +0 -1
  100. package/dist/utils/date.test.js +0 -276
  101. package/dist/utils/date.test.js.map +0 -1
  102. package/dist/utils/hierarchy.d.ts +0 -102
  103. package/dist/utils/hierarchy.d.ts.map +0 -1
  104. package/dist/utils/hierarchy.js +0 -236
  105. package/dist/utils/hierarchy.js.map +0 -1
  106. package/dist/utils/hierarchy.test.d.ts +0 -2
  107. package/dist/utils/hierarchy.test.d.ts.map +0 -1
  108. package/dist/utils/hierarchy.test.js +0 -436
  109. package/dist/utils/hierarchy.test.js.map +0 -1
  110. package/dist/utils/id.d.ts +0 -60
  111. package/dist/utils/id.d.ts.map +0 -1
  112. package/dist/utils/id.js +0 -118
  113. package/dist/utils/id.js.map +0 -1
  114. package/dist/utils/id.test.d.ts +0 -2
  115. package/dist/utils/id.test.d.ts.map +0 -1
  116. package/dist/utils/id.test.js +0 -193
  117. package/dist/utils/id.test.js.map +0 -1
  118. package/dist/utils/index.d.ts +0 -12
  119. package/dist/utils/index.d.ts.map +0 -1
  120. package/dist/utils/index.js +0 -34
  121. package/dist/utils/index.js.map +0 -1
  122. package/dist/utils/natural-language.d.ts +0 -57
  123. package/dist/utils/natural-language.d.ts.map +0 -1
  124. package/dist/utils/natural-language.js +0 -211
  125. package/dist/utils/natural-language.js.map +0 -1
  126. package/dist/utils/natural-language.test.d.ts +0 -2
  127. package/dist/utils/natural-language.test.d.ts.map +0 -1
  128. package/dist/utils/natural-language.test.js +0 -197
  129. package/dist/utils/natural-language.test.js.map +0 -1
  130. package/dist/utils/priority-queue.d.ts +0 -17
  131. package/dist/utils/priority-queue.d.ts.map +0 -1
  132. package/dist/utils/priority-queue.js +0 -62
  133. package/dist/utils/priority-queue.js.map +0 -1
  134. package/dist/utils/priority-queue.test.d.ts +0 -2
  135. package/dist/utils/priority-queue.test.d.ts.map +0 -1
  136. package/dist/utils/priority-queue.test.js +0 -82
  137. package/dist/utils/priority-queue.test.js.map +0 -1
  138. package/dist/utils/projection.d.ts +0 -65
  139. package/dist/utils/projection.d.ts.map +0 -1
  140. package/dist/utils/projection.js +0 -180
  141. package/dist/utils/projection.js.map +0 -1
  142. package/dist/utils/projection.test.d.ts +0 -2
  143. package/dist/utils/projection.test.d.ts.map +0 -1
  144. package/dist/utils/projection.test.js +0 -336
  145. package/dist/utils/projection.test.js.map +0 -1
  146. package/dist/utils/terminal-ui.d.ts +0 -208
  147. package/dist/utils/terminal-ui.d.ts.map +0 -1
  148. package/dist/utils/terminal-ui.js +0 -611
  149. package/dist/utils/terminal-ui.js.map +0 -1
  150. package/dist/utils/terminal-ui.test.d.ts +0 -2
  151. package/dist/utils/terminal-ui.test.d.ts.map +0 -1
  152. package/dist/utils/terminal-ui.test.js +0 -683
  153. package/dist/utils/terminal-ui.test.js.map +0 -1
  154. package/dist/utils/workspace.d.ts +0 -100
  155. package/dist/utils/workspace.d.ts.map +0 -1
  156. package/dist/utils/workspace.js +0 -173
  157. package/dist/utils/workspace.js.map +0 -1
  158. package/dist/utils/workspace.test.d.ts +0 -2
  159. package/dist/utils/workspace.test.d.ts.map +0 -1
  160. package/dist/utils/workspace.test.js +0 -97
  161. package/dist/utils/workspace.test.js.map +0 -1
  162. package/src/algorithms/critical-path.test.ts +0 -241
  163. package/src/algorithms/dependency-integrity.test.ts +0 -348
  164. package/src/algorithms/tech-analysis.test.ts +0 -413
  165. package/src/algorithms/topological-sort.test.ts +0 -190
  166. package/src/schemas/response-schema.test.ts +0 -314
  167. package/src/utils/dashboard-renderer.test.ts +0 -983
  168. package/src/utils/date.test.ts +0 -329
  169. package/src/utils/hierarchy.test.ts +0 -505
  170. package/src/utils/id.test.ts +0 -235
  171. package/src/utils/natural-language.test.ts +0 -242
  172. package/src/utils/priority-queue.test.ts +0 -103
  173. package/src/utils/projection.test.ts +0 -425
  174. package/src/utils/terminal-ui.test.ts +0 -831
  175. package/src/utils/workspace.test.ts +0 -125
@@ -1,338 +0,0 @@
1
- import { describe, test, expect } from "bun:test";
2
- import { suggestSafeOrder, findBreakingChanges, findHighRiskTasks, groupByTechArea, getComplexitySummary, getTechStackSummary, suggestSubtaskCount, } from "./tech-analysis.js";
3
- // Helper to create mock tasks with tech stack analysis
4
- function createTask(id, options = {}) {
5
- const task = {
6
- id,
7
- title: `Task ${id}`,
8
- status: options.status ?? "pending",
9
- priority: options.priority ?? "medium",
10
- workspace: "test-workspace",
11
- createdAt: new Date().toISOString(),
12
- updatedAt: new Date().toISOString(),
13
- };
14
- if (options.areas || options.riskLevel !== undefined || options.hasBreakingChange !== undefined) {
15
- task.techStack = {};
16
- if (options.areas) {
17
- task.techStack.areas = options.areas;
18
- }
19
- if (options.riskLevel !== undefined) {
20
- task.techStack.riskLevel = options.riskLevel;
21
- }
22
- if (options.hasBreakingChange !== undefined) {
23
- task.techStack.hasBreakingChange = options.hasBreakingChange;
24
- }
25
- }
26
- if (options.complexityScore !== undefined) {
27
- task.complexity = {
28
- score: options.complexityScore,
29
- };
30
- }
31
- return task;
32
- }
33
- describe("suggestSafeOrder", () => {
34
- test("returns empty result for empty input", () => {
35
- const result = suggestSafeOrder([]);
36
- expect(result.orderedTasks).toEqual([]);
37
- expect(result.phases).toEqual([]);
38
- expect(result.summary.totalTasks).toBe(0);
39
- });
40
- test("returns empty for all completed tasks", () => {
41
- const tasks = [createTask("A", { status: "completed" })];
42
- const result = suggestSafeOrder(tasks);
43
- expect(result.orderedTasks).toEqual([]);
44
- });
45
- test("orders by tech level (schema before backend)", () => {
46
- const tasks = [
47
- createTask("backend-task", { areas: ["backend"] }),
48
- createTask("schema-task", { areas: ["schema"] }),
49
- ];
50
- const result = suggestSafeOrder(tasks);
51
- expect(result.orderedTasks[0].id).toBe("schema-task");
52
- expect(result.orderedTasks[1].id).toBe("backend-task");
53
- });
54
- test("orders by tech level (full chain)", () => {
55
- const tasks = [
56
- createTask("frontend", { areas: ["frontend"] }),
57
- createTask("backend", { areas: ["backend"] }),
58
- createTask("schema", { areas: ["schema"] }),
59
- createTask("test", { areas: ["test"] }),
60
- createTask("devops", { areas: ["devops"] }),
61
- ];
62
- const result = suggestSafeOrder(tasks);
63
- const order = result.orderedTasks.map((t) => t.id);
64
- expect(order).toEqual(["schema", "devops", "backend", "frontend", "test"]);
65
- });
66
- test("orders by risk level within same tech level", () => {
67
- const tasks = [
68
- createTask("high-risk", { areas: ["backend"], riskLevel: "high" }),
69
- createTask("low-risk", { areas: ["backend"], riskLevel: "low" }),
70
- createTask("medium-risk", { areas: ["backend"], riskLevel: "medium" }),
71
- ];
72
- const result = suggestSafeOrder(tasks);
73
- const order = result.orderedTasks.map((t) => t.id);
74
- expect(order).toEqual(["low-risk", "medium-risk", "high-risk"]);
75
- });
76
- test("puts breaking changes last within same tech/risk level", () => {
77
- const tasks = [
78
- createTask("breaking", { areas: ["backend"], riskLevel: "low", hasBreakingChange: true }),
79
- createTask("safe", { areas: ["backend"], riskLevel: "low", hasBreakingChange: false }),
80
- ];
81
- const result = suggestSafeOrder(tasks);
82
- expect(result.orderedTasks[0].id).toBe("safe");
83
- expect(result.orderedTasks[1].id).toBe("breaking");
84
- });
85
- test("uses priority as tiebreaker", () => {
86
- const tasks = [
87
- createTask("low-priority", { areas: ["backend"], priority: "low" }),
88
- createTask("high-priority", { areas: ["backend"], priority: "high" }),
89
- ];
90
- const result = suggestSafeOrder(tasks);
91
- expect(result.orderedTasks[0].id).toBe("high-priority");
92
- expect(result.orderedTasks[1].id).toBe("low-priority");
93
- });
94
- test("groups tasks into phases by tech level", () => {
95
- const tasks = [
96
- createTask("schema1", { areas: ["schema"] }),
97
- createTask("schema2", { areas: ["schema"] }),
98
- createTask("backend1", { areas: ["backend"] }),
99
- ];
100
- const result = suggestSafeOrder(tasks);
101
- expect(result.phases.length).toBe(2);
102
- expect(result.phases[0].primaryArea).toBe("schema");
103
- expect(result.phases[0].tasks.length).toBe(2);
104
- expect(result.phases[1].primaryArea).toBe("backend");
105
- expect(result.phases[1].tasks.length).toBe(1);
106
- });
107
- test("calculates summary statistics correctly", () => {
108
- const tasks = [
109
- createTask("t1", { areas: ["backend"], hasBreakingChange: true }),
110
- createTask("t2", { areas: ["backend"], riskLevel: "high" }),
111
- createTask("t3", { areas: ["backend"], riskLevel: "critical" }),
112
- createTask("t4", { areas: ["backend"] }),
113
- ];
114
- const result = suggestSafeOrder(tasks);
115
- expect(result.summary.totalTasks).toBe(4);
116
- expect(result.summary.breakingChanges).toBe(1);
117
- expect(result.summary.highRiskCount).toBe(2);
118
- });
119
- });
120
- describe("findBreakingChanges", () => {
121
- test("returns empty for no breaking changes", () => {
122
- const tasks = [
123
- createTask("t1", { areas: ["backend"], hasBreakingChange: false }),
124
- createTask("t2", { areas: ["backend"] }),
125
- ];
126
- const result = findBreakingChanges(tasks);
127
- expect(result).toEqual([]);
128
- });
129
- test("finds tasks with breaking changes", () => {
130
- const tasks = [
131
- createTask("t1", { areas: ["backend"], hasBreakingChange: true }),
132
- createTask("t2", { areas: ["backend"], hasBreakingChange: false }),
133
- createTask("t3", { areas: ["schema"], hasBreakingChange: true }),
134
- ];
135
- const result = findBreakingChanges(tasks);
136
- expect(result.length).toBe(2);
137
- expect(result.map((t) => t.id).sort()).toEqual(["t1", "t3"]);
138
- });
139
- test("excludes completed tasks", () => {
140
- const tasks = [
141
- createTask("t1", { status: "completed", areas: ["backend"], hasBreakingChange: true }),
142
- createTask("t2", { status: "pending", areas: ["backend"], hasBreakingChange: true }),
143
- ];
144
- const result = findBreakingChanges(tasks);
145
- expect(result.length).toBe(1);
146
- expect(result[0].id).toBe("t2");
147
- });
148
- });
149
- describe("findHighRiskTasks", () => {
150
- test("returns empty for no high-risk tasks", () => {
151
- const tasks = [
152
- createTask("t1", { areas: ["backend"], riskLevel: "low" }),
153
- createTask("t2", { areas: ["backend"], riskLevel: "medium" }),
154
- ];
155
- const result = findHighRiskTasks(tasks);
156
- expect(result).toEqual([]);
157
- });
158
- test("finds high and critical risk tasks", () => {
159
- const tasks = [
160
- createTask("t1", { areas: ["backend"], riskLevel: "low" }),
161
- createTask("t2", { areas: ["backend"], riskLevel: "high" }),
162
- createTask("t3", { areas: ["backend"], riskLevel: "critical" }),
163
- ];
164
- const result = findHighRiskTasks(tasks);
165
- expect(result.length).toBe(2);
166
- expect(result.map((t) => t.id).sort()).toEqual(["t2", "t3"]);
167
- });
168
- });
169
- describe("groupByTechArea", () => {
170
- test("returns all areas with empty arrays for empty input", () => {
171
- const result = groupByTechArea([]);
172
- expect(result.get("schema")).toEqual([]);
173
- expect(result.get("backend")).toEqual([]);
174
- expect(result.get("frontend")).toEqual([]);
175
- });
176
- test("groups tasks by their tech areas", () => {
177
- const tasks = [
178
- createTask("t1", { areas: ["backend"] }),
179
- createTask("t2", { areas: ["backend"] }),
180
- createTask("t3", { areas: ["frontend"] }),
181
- ];
182
- const result = groupByTechArea(tasks);
183
- expect(result.get("backend").length).toBe(2);
184
- expect(result.get("frontend").length).toBe(1);
185
- expect(result.get("schema").length).toBe(0);
186
- });
187
- test("task appears in multiple groups if it spans multiple areas", () => {
188
- const tasks = [
189
- createTask("fullstack", { areas: ["backend", "frontend"] }),
190
- ];
191
- const result = groupByTechArea(tasks);
192
- expect(result.get("backend").length).toBe(1);
193
- expect(result.get("frontend").length).toBe(1);
194
- expect(result.get("backend")[0].id).toBe("fullstack");
195
- });
196
- test("defaults to backend if no area specified", () => {
197
- const tasks = [createTask("t1", {})];
198
- const result = groupByTechArea(tasks);
199
- expect(result.get("backend").length).toBe(1);
200
- });
201
- test("excludes completed tasks", () => {
202
- const tasks = [
203
- createTask("t1", { status: "completed", areas: ["backend"] }),
204
- createTask("t2", { status: "pending", areas: ["backend"] }),
205
- ];
206
- const result = groupByTechArea(tasks);
207
- expect(result.get("backend").length).toBe(1);
208
- });
209
- });
210
- describe("getComplexitySummary", () => {
211
- test("returns empty summary for no tasks", () => {
212
- const result = getComplexitySummary([]);
213
- expect(result.distribution).toEqual({ low: 0, medium: 0, high: 0 });
214
- expect(result.needsBreakdown).toEqual([]);
215
- expect(result.averageScore).toBe(0);
216
- expect(result.unanalyzed).toEqual([]);
217
- });
218
- test("calculates distribution correctly", () => {
219
- const tasks = [
220
- createTask("t1", { complexityScore: 2 }), // low
221
- createTask("t2", { complexityScore: 3 }), // low
222
- createTask("t3", { complexityScore: 5 }), // medium
223
- createTask("t4", { complexityScore: 8 }), // high
224
- ];
225
- const result = getComplexitySummary(tasks);
226
- expect(result.distribution.low).toBe(2);
227
- expect(result.distribution.medium).toBe(1);
228
- expect(result.distribution.high).toBe(1);
229
- });
230
- test("identifies tasks needing breakdown (score >= 7)", () => {
231
- const tasks = [
232
- createTask("t1", { complexityScore: 6 }),
233
- createTask("t2", { complexityScore: 7 }),
234
- createTask("t3", { complexityScore: 9 }),
235
- ];
236
- const result = getComplexitySummary(tasks);
237
- expect(result.needsBreakdown.length).toBe(2);
238
- expect(result.needsBreakdown.map((t) => t.id).sort()).toEqual(["t2", "t3"]);
239
- });
240
- test("calculates average score correctly", () => {
241
- const tasks = [
242
- createTask("t1", { complexityScore: 2 }),
243
- createTask("t2", { complexityScore: 6 }),
244
- createTask("t3", { complexityScore: 10 }),
245
- ];
246
- const result = getComplexitySummary(tasks);
247
- expect(result.averageScore).toBe(6); // (2+6+10)/3
248
- });
249
- test("identifies unanalyzed tasks", () => {
250
- const tasks = [
251
- createTask("analyzed", { complexityScore: 5 }),
252
- createTask("not-analyzed", {}),
253
- ];
254
- const result = getComplexitySummary(tasks);
255
- expect(result.unanalyzed.length).toBe(1);
256
- expect(result.unanalyzed[0].id).toBe("not-analyzed");
257
- });
258
- test("excludes completed tasks", () => {
259
- const tasks = [
260
- createTask("t1", { status: "completed", complexityScore: 10 }),
261
- createTask("t2", { status: "pending", complexityScore: 5 }),
262
- ];
263
- const result = getComplexitySummary(tasks);
264
- expect(result.distribution.high).toBe(0);
265
- expect(result.distribution.medium).toBe(1);
266
- });
267
- });
268
- describe("getTechStackSummary", () => {
269
- test("returns empty summary for no tasks", () => {
270
- const result = getTechStackSummary([]);
271
- expect(result.areaCounts.schema).toBe(0);
272
- expect(result.breakingChanges).toEqual([]);
273
- expect(result.unanalyzed).toEqual([]);
274
- });
275
- test("counts tasks by area correctly", () => {
276
- const tasks = [
277
- createTask("t1", { areas: ["backend"] }),
278
- createTask("t2", { areas: ["backend", "frontend"] }),
279
- createTask("t3", { areas: ["schema"] }),
280
- ];
281
- const result = getTechStackSummary(tasks);
282
- expect(result.areaCounts.backend).toBe(2);
283
- expect(result.areaCounts.frontend).toBe(1);
284
- expect(result.areaCounts.schema).toBe(1);
285
- });
286
- test("tracks risk distribution", () => {
287
- const tasks = [
288
- createTask("t1", { areas: ["backend"], riskLevel: "low" }),
289
- createTask("t2", { areas: ["backend"], riskLevel: "medium" }),
290
- createTask("t3", { areas: ["backend"], riskLevel: "high" }),
291
- ];
292
- const result = getTechStackSummary(tasks);
293
- expect(result.riskDistribution.low).toBe(1);
294
- expect(result.riskDistribution.medium).toBe(1);
295
- expect(result.riskDistribution.high).toBe(1);
296
- });
297
- test("identifies breaking changes", () => {
298
- const tasks = [
299
- createTask("t1", { areas: ["backend"], hasBreakingChange: true }),
300
- createTask("t2", { areas: ["backend"], hasBreakingChange: false }),
301
- ];
302
- const result = getTechStackSummary(tasks);
303
- expect(result.breakingChanges.length).toBe(1);
304
- expect(result.breakingChanges[0].id).toBe("t1");
305
- });
306
- test("identifies unanalyzed tasks", () => {
307
- const tasks = [
308
- createTask("analyzed", { areas: ["backend"] }),
309
- createTask("not-analyzed", {}),
310
- ];
311
- const result = getTechStackSummary(tasks);
312
- expect(result.unanalyzed.length).toBe(1);
313
- expect(result.unanalyzed[0].id).toBe("not-analyzed");
314
- });
315
- });
316
- describe("suggestSubtaskCount", () => {
317
- test("returns 0 for very low complexity (1-2)", () => {
318
- expect(suggestSubtaskCount(1)).toBe(0);
319
- expect(suggestSubtaskCount(2)).toBe(0);
320
- });
321
- test("returns 2 for low complexity (3-4)", () => {
322
- expect(suggestSubtaskCount(3)).toBe(2);
323
- expect(suggestSubtaskCount(4)).toBe(2);
324
- });
325
- test("returns 3-4 for medium complexity (5-6)", () => {
326
- expect(suggestSubtaskCount(5)).toBe(4);
327
- expect(suggestSubtaskCount(6)).toBe(4);
328
- });
329
- test("returns 5-6 for high complexity (7-8)", () => {
330
- expect(suggestSubtaskCount(7)).toBe(6);
331
- expect(suggestSubtaskCount(8)).toBe(6);
332
- });
333
- test("returns 7-10 for very high complexity (9-10)", () => {
334
- expect(suggestSubtaskCount(9)).toBe(9);
335
- expect(suggestSubtaskCount(10)).toBe(10);
336
- });
337
- });
338
- //# sourceMappingURL=tech-analysis.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tech-analysis.test.js","sourceRoot":"","sources":["../../src/algorithms/tech-analysis.test.ts"],"names":[],"mappings":"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"}
@@ -1,41 +0,0 @@
1
- import type { Task } from "../schemas/task.js";
2
- /**
3
- * Node representation for graph algorithms
4
- */
5
- export interface TaskNode {
6
- id: string;
7
- dependencies: string[];
8
- priority: number;
9
- estimate: number;
10
- }
11
- /**
12
- * Convert priority string to numeric value
13
- */
14
- export declare function priorityToNumber(priority: string): number;
15
- /**
16
- * Convert Task to TaskNode
17
- */
18
- export declare function taskToNode(task: Task): TaskNode;
19
- /**
20
- * Topological sort using Kahn's algorithm with priority tie-breaking
21
- *
22
- * Returns tasks in optimal execution order:
23
- * 1. Respects dependencies (blocked_by relationships)
24
- * 2. Higher priority tasks come first when dependencies allow
25
- *
26
- * @throws Error if circular dependency detected
27
- */
28
- export declare function topologicalSort(tasks: Task[]): Task[];
29
- /**
30
- * Detect if adding a dependency would create a cycle
31
- */
32
- export declare function wouldCreateCycle(tasks: Task[], fromId: string, toId: string): boolean;
33
- /**
34
- * Find all tasks that depend on a given task (directly or transitively)
35
- */
36
- export declare function findDependents(tasks: Task[], taskId: string): Task[];
37
- /**
38
- * Find all tasks that a given task depends on (directly or transitively)
39
- */
40
- export declare function findDependencies(tasks: Task[], taskId: string): Task[];
41
- //# sourceMappingURL=topological-sort.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"topological-sort.d.ts","sourceRoot":"","sources":["../../src/algorithms/topological-sort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAG/C;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,CAS/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CA+DrD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAqBT;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,CAoBpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,CA2BtE"}
@@ -1,165 +0,0 @@
1
- import { PriorityQueue } from "../utils/priority-queue.js";
2
- /**
3
- * Convert priority string to numeric value
4
- */
5
- export function priorityToNumber(priority) {
6
- const map = {
7
- critical: 4,
8
- high: 3,
9
- medium: 2,
10
- low: 1,
11
- };
12
- return map[priority] ?? 2;
13
- }
14
- /**
15
- * Convert Task to TaskNode
16
- */
17
- export function taskToNode(task) {
18
- return {
19
- id: task.id,
20
- dependencies: (task.dependencies ?? [])
21
- .filter((d) => d.type === "blocked_by")
22
- .map((d) => d.taskId),
23
- priority: priorityToNumber(task.priority),
24
- estimate: task.estimate?.expected ?? 0,
25
- };
26
- }
27
- /**
28
- * Topological sort using Kahn's algorithm with priority tie-breaking
29
- *
30
- * Returns tasks in optimal execution order:
31
- * 1. Respects dependencies (blocked_by relationships)
32
- * 2. Higher priority tasks come first when dependencies allow
33
- *
34
- * @throws Error if circular dependency detected
35
- */
36
- export function topologicalSort(tasks) {
37
- const nodes = tasks.map(taskToNode);
38
- const nodeMap = new Map(nodes.map((n) => [n.id, n]));
39
- const taskMap = new Map(tasks.map((t) => [t.id, t]));
40
- // Calculate in-degree for each node
41
- const inDegree = new Map();
42
- const adjacency = new Map();
43
- for (const node of nodes) {
44
- inDegree.set(node.id, 0);
45
- adjacency.set(node.id, []);
46
- }
47
- // Build graph: if A is blocked_by B, then B -> A (B must come before A)
48
- for (const node of nodes) {
49
- for (const depId of node.dependencies) {
50
- if (nodeMap.has(depId)) {
51
- const adj = adjacency.get(depId);
52
- if (adj)
53
- adj.push(node.id);
54
- inDegree.set(node.id, (inDegree.get(node.id) ?? 0) + 1);
55
- }
56
- }
57
- }
58
- // Initialize priority queue with nodes that have no dependencies
59
- // Using max-heap: higher priority comes out first
60
- const queue = new PriorityQueue((a, b) => a.priority - b.priority);
61
- for (const node of nodes) {
62
- if (inDegree.get(node.id) === 0) {
63
- queue.push(node);
64
- }
65
- }
66
- const result = [];
67
- while (queue.length > 0) {
68
- const current = queue.pop();
69
- const task = taskMap.get(current.id);
70
- if (task) {
71
- result.push(task);
72
- }
73
- // Update neighbors
74
- for (const neighborId of adjacency.get(current.id)) {
75
- const newDegree = inDegree.get(neighborId) - 1;
76
- inDegree.set(neighborId, newDegree);
77
- if (newDegree === 0) {
78
- const neighborNode = nodeMap.get(neighborId);
79
- queue.push(neighborNode); // O(log n) insertion maintains heap property
80
- }
81
- }
82
- }
83
- // Check for cycles
84
- if (result.length !== tasks.length) {
85
- const remaining = tasks.filter((t) => !result.some((r) => r.id === t.id));
86
- const cycleIds = remaining.map((t) => t.id).join(", ");
87
- throw new Error(`Circular dependency detected among tasks: ${cycleIds}`);
88
- }
89
- return result;
90
- }
91
- /**
92
- * Detect if adding a dependency would create a cycle
93
- */
94
- export function wouldCreateCycle(tasks, fromId, toId) {
95
- // Create a temporary task list with the new dependency
96
- const tempTasks = tasks.map((t) => {
97
- if (t.id === fromId) {
98
- return {
99
- ...t,
100
- dependencies: [
101
- ...(t.dependencies ?? []),
102
- { taskId: toId, type: "blocked_by" },
103
- ],
104
- };
105
- }
106
- return t;
107
- });
108
- try {
109
- topologicalSort(tempTasks);
110
- return false;
111
- }
112
- catch {
113
- return true;
114
- }
115
- }
116
- /**
117
- * Find all tasks that depend on a given task (directly or transitively)
118
- */
119
- export function findDependents(tasks, taskId) {
120
- const visited = new Set();
121
- const result = [];
122
- function dfs(id) {
123
- for (const task of tasks) {
124
- const deps = (task.dependencies ?? [])
125
- .filter((d) => d.type === "blocked_by")
126
- .map((d) => d.taskId);
127
- if (deps.includes(id) && !visited.has(task.id)) {
128
- visited.add(task.id);
129
- result.push(task);
130
- dfs(task.id);
131
- }
132
- }
133
- }
134
- dfs(taskId);
135
- return result;
136
- }
137
- /**
138
- * Find all tasks that a given task depends on (directly or transitively)
139
- */
140
- export function findDependencies(tasks, taskId) {
141
- const taskMap = new Map(tasks.map((t) => [t.id, t]));
142
- const visited = new Set();
143
- const result = [];
144
- function dfs(id) {
145
- const task = taskMap.get(id);
146
- if (!task)
147
- return;
148
- const deps = (task.dependencies ?? [])
149
- .filter((d) => d.type === "blocked_by")
150
- .map((d) => d.taskId);
151
- for (const depId of deps) {
152
- if (!visited.has(depId)) {
153
- visited.add(depId);
154
- const depTask = taskMap.get(depId);
155
- if (depTask) {
156
- result.push(depTask);
157
- dfs(depId);
158
- }
159
- }
160
- }
161
- }
162
- dfs(taskId);
163
- return result;
164
- }
165
- //# sourceMappingURL=topological-sort.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"topological-sort.js","sourceRoot":"","sources":["../../src/algorithms/topological-sort.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=topological-sort.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"topological-sort.test.d.ts","sourceRoot":"","sources":["../../src/algorithms/topological-sort.test.ts"],"names":[],"mappings":""}