@task-mcp/shared 1.0.22 → 1.0.24

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 (184) hide show
  1. package/dist/algorithms/critical-path.d.ts +47 -0
  2. package/dist/algorithms/critical-path.d.ts.map +1 -0
  3. package/dist/algorithms/critical-path.js +340 -0
  4. package/dist/algorithms/critical-path.js.map +1 -0
  5. package/dist/algorithms/critical-path.test.d.ts +2 -0
  6. package/dist/algorithms/critical-path.test.d.ts.map +1 -0
  7. package/dist/algorithms/critical-path.test.js +184 -0
  8. package/dist/algorithms/critical-path.test.js.map +1 -0
  9. package/dist/algorithms/dependency-integrity.d.ts +81 -0
  10. package/dist/algorithms/dependency-integrity.d.ts.map +1 -0
  11. package/dist/algorithms/dependency-integrity.js +209 -0
  12. package/dist/algorithms/dependency-integrity.js.map +1 -0
  13. package/dist/algorithms/dependency-integrity.test.d.ts +2 -0
  14. package/dist/algorithms/dependency-integrity.test.d.ts.map +1 -0
  15. package/dist/algorithms/dependency-integrity.test.js +296 -0
  16. package/dist/algorithms/dependency-integrity.test.js.map +1 -0
  17. package/dist/algorithms/index.d.ts +5 -0
  18. package/dist/algorithms/index.d.ts.map +1 -0
  19. package/dist/algorithms/index.js +5 -0
  20. package/dist/algorithms/index.js.map +1 -0
  21. package/dist/algorithms/tech-analysis.d.ts +106 -0
  22. package/dist/algorithms/tech-analysis.d.ts.map +1 -0
  23. package/dist/algorithms/tech-analysis.js +351 -0
  24. package/dist/algorithms/tech-analysis.js.map +1 -0
  25. package/dist/algorithms/tech-analysis.test.d.ts +2 -0
  26. package/dist/algorithms/tech-analysis.test.d.ts.map +1 -0
  27. package/dist/algorithms/tech-analysis.test.js +330 -0
  28. package/dist/algorithms/tech-analysis.test.js.map +1 -0
  29. package/dist/algorithms/topological-sort.d.ts +58 -0
  30. package/dist/algorithms/topological-sort.d.ts.map +1 -0
  31. package/dist/algorithms/topological-sort.js +201 -0
  32. package/dist/algorithms/topological-sort.js.map +1 -0
  33. package/dist/algorithms/topological-sort.test.d.ts +2 -0
  34. package/dist/algorithms/topological-sort.test.d.ts.map +1 -0
  35. package/dist/algorithms/topological-sort.test.js +154 -0
  36. package/dist/algorithms/topological-sort.test.js.map +1 -0
  37. package/dist/index.d.ts +4 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +7 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/schemas/inbox.d.ts +55 -0
  42. package/dist/schemas/inbox.d.ts.map +1 -0
  43. package/dist/schemas/inbox.js +25 -0
  44. package/dist/schemas/inbox.js.map +1 -0
  45. package/dist/schemas/index.d.ts +7 -0
  46. package/dist/schemas/index.d.ts.map +1 -0
  47. package/dist/schemas/index.js +17 -0
  48. package/dist/schemas/index.js.map +1 -0
  49. package/dist/schemas/llm-guide.d.ts +147 -0
  50. package/dist/schemas/llm-guide.d.ts.map +1 -0
  51. package/dist/schemas/llm-guide.js +72 -0
  52. package/dist/schemas/llm-guide.js.map +1 -0
  53. package/dist/schemas/project.d.ts +177 -0
  54. package/dist/schemas/project.d.ts.map +1 -0
  55. package/dist/schemas/project.js +56 -0
  56. package/dist/schemas/project.js.map +1 -0
  57. package/dist/schemas/response-format.d.ts +148 -0
  58. package/dist/schemas/response-format.d.ts.map +1 -0
  59. package/dist/schemas/response-format.js +18 -0
  60. package/dist/schemas/response-format.js.map +1 -0
  61. package/dist/schemas/response-schema.d.ts +307 -0
  62. package/dist/schemas/response-schema.d.ts.map +1 -0
  63. package/dist/schemas/response-schema.js +78 -0
  64. package/dist/schemas/response-schema.js.map +1 -0
  65. package/dist/schemas/response-schema.test.d.ts +2 -0
  66. package/dist/schemas/response-schema.test.d.ts.map +1 -0
  67. package/dist/schemas/response-schema.test.js +256 -0
  68. package/dist/schemas/response-schema.test.js.map +1 -0
  69. package/dist/schemas/state.d.ts +17 -0
  70. package/dist/schemas/state.d.ts.map +1 -0
  71. package/dist/schemas/state.js +17 -0
  72. package/dist/schemas/state.js.map +1 -0
  73. package/dist/schemas/task.d.ts +881 -0
  74. package/dist/schemas/task.d.ts.map +1 -0
  75. package/dist/schemas/task.js +177 -0
  76. package/dist/schemas/task.js.map +1 -0
  77. package/dist/schemas/view.d.ts +143 -0
  78. package/dist/schemas/view.d.ts.map +1 -0
  79. package/dist/schemas/view.js +48 -0
  80. package/dist/schemas/view.js.map +1 -0
  81. package/dist/utils/dashboard-renderer.d.ts +93 -0
  82. package/dist/utils/dashboard-renderer.d.ts.map +1 -0
  83. package/dist/utils/dashboard-renderer.js +416 -0
  84. package/dist/utils/dashboard-renderer.js.map +1 -0
  85. package/dist/utils/dashboard-renderer.test.d.ts +2 -0
  86. package/dist/utils/dashboard-renderer.test.d.ts.map +1 -0
  87. package/dist/utils/dashboard-renderer.test.js +772 -0
  88. package/dist/utils/dashboard-renderer.test.js.map +1 -0
  89. package/dist/utils/date.d.ts +94 -0
  90. package/dist/utils/date.d.ts.map +1 -0
  91. package/dist/utils/date.js +323 -0
  92. package/dist/utils/date.js.map +1 -0
  93. package/dist/utils/date.test.d.ts +2 -0
  94. package/dist/utils/date.test.d.ts.map +1 -0
  95. package/dist/utils/date.test.js +276 -0
  96. package/dist/utils/date.test.js.map +1 -0
  97. package/dist/utils/hierarchy.d.ts +102 -0
  98. package/dist/utils/hierarchy.d.ts.map +1 -0
  99. package/dist/utils/hierarchy.js +236 -0
  100. package/dist/utils/hierarchy.js.map +1 -0
  101. package/dist/utils/hierarchy.test.d.ts +2 -0
  102. package/dist/utils/hierarchy.test.d.ts.map +1 -0
  103. package/dist/utils/hierarchy.test.js +423 -0
  104. package/dist/utils/hierarchy.test.js.map +1 -0
  105. package/dist/utils/id.d.ts +60 -0
  106. package/dist/utils/id.d.ts.map +1 -0
  107. package/dist/utils/id.js +118 -0
  108. package/dist/utils/id.js.map +1 -0
  109. package/dist/utils/id.test.d.ts +2 -0
  110. package/dist/utils/id.test.d.ts.map +1 -0
  111. package/dist/utils/id.test.js +193 -0
  112. package/dist/utils/id.test.js.map +1 -0
  113. package/dist/utils/index.d.ts +12 -0
  114. package/dist/utils/index.d.ts.map +1 -0
  115. package/dist/utils/index.js +34 -0
  116. package/dist/utils/index.js.map +1 -0
  117. package/dist/utils/natural-language.d.ts +111 -0
  118. package/dist/utils/natural-language.d.ts.map +1 -0
  119. package/dist/utils/natural-language.js +297 -0
  120. package/dist/utils/natural-language.js.map +1 -0
  121. package/dist/utils/natural-language.test.d.ts +2 -0
  122. package/dist/utils/natural-language.test.d.ts.map +1 -0
  123. package/dist/utils/natural-language.test.js +197 -0
  124. package/dist/utils/natural-language.test.js.map +1 -0
  125. package/dist/utils/priority-queue.d.ts +17 -0
  126. package/dist/utils/priority-queue.d.ts.map +1 -0
  127. package/dist/utils/priority-queue.js +62 -0
  128. package/dist/utils/priority-queue.js.map +1 -0
  129. package/dist/utils/priority-queue.test.d.ts +2 -0
  130. package/dist/utils/priority-queue.test.d.ts.map +1 -0
  131. package/dist/utils/priority-queue.test.js +82 -0
  132. package/dist/utils/priority-queue.test.js.map +1 -0
  133. package/dist/utils/projection.d.ts +65 -0
  134. package/dist/utils/projection.d.ts.map +1 -0
  135. package/dist/utils/projection.js +180 -0
  136. package/dist/utils/projection.js.map +1 -0
  137. package/dist/utils/projection.test.d.ts +2 -0
  138. package/dist/utils/projection.test.d.ts.map +1 -0
  139. package/dist/utils/projection.test.js +341 -0
  140. package/dist/utils/projection.test.js.map +1 -0
  141. package/dist/utils/terminal-ui.d.ts +208 -0
  142. package/dist/utils/terminal-ui.d.ts.map +1 -0
  143. package/dist/utils/terminal-ui.js +614 -0
  144. package/dist/utils/terminal-ui.js.map +1 -0
  145. package/dist/utils/terminal-ui.test.d.ts +2 -0
  146. package/dist/utils/terminal-ui.test.d.ts.map +1 -0
  147. package/dist/utils/terminal-ui.test.js +683 -0
  148. package/dist/utils/terminal-ui.test.js.map +1 -0
  149. package/dist/utils/workspace.d.ts +102 -0
  150. package/dist/utils/workspace.d.ts.map +1 -0
  151. package/dist/utils/workspace.js +183 -0
  152. package/dist/utils/workspace.js.map +1 -0
  153. package/dist/utils/workspace.test.d.ts +2 -0
  154. package/dist/utils/workspace.test.d.ts.map +1 -0
  155. package/dist/utils/workspace.test.js +97 -0
  156. package/dist/utils/workspace.test.js.map +1 -0
  157. package/package.json +5 -1
  158. package/src/algorithms/critical-path.test.ts +227 -0
  159. package/src/algorithms/critical-path.ts +14 -34
  160. package/src/algorithms/dependency-integrity.test.ts +335 -0
  161. package/src/algorithms/dependency-integrity.ts +4 -13
  162. package/src/algorithms/tech-analysis.test.ts +405 -0
  163. package/src/algorithms/tech-analysis.ts +27 -27
  164. package/src/algorithms/topological-sort.test.ts +182 -0
  165. package/src/algorithms/topological-sort.ts +6 -10
  166. package/src/schemas/index.ts +2 -13
  167. package/src/schemas/response-format.ts +6 -6
  168. package/src/schemas/response-schema.test.ts +314 -0
  169. package/src/schemas/response-schema.ts +25 -20
  170. package/src/schemas/task.ts +4 -22
  171. package/src/utils/dashboard-renderer.test.ts +976 -0
  172. package/src/utils/dashboard-renderer.ts +27 -59
  173. package/src/utils/date.test.ts +329 -0
  174. package/src/utils/date.ts +2 -10
  175. package/src/utils/hierarchy.test.ts +488 -0
  176. package/src/utils/hierarchy.ts +4 -5
  177. package/src/utils/id.test.ts +235 -0
  178. package/src/utils/index.ts +7 -1
  179. package/src/utils/natural-language.test.ts +234 -0
  180. package/src/utils/priority-queue.test.ts +103 -0
  181. package/src/utils/projection.test.ts +430 -0
  182. package/src/utils/terminal-ui.test.ts +831 -0
  183. package/src/utils/terminal-ui.ts +53 -54
  184. package/src/utils/workspace.test.ts +125 -0
@@ -0,0 +1,81 @@
1
+ import type { Task } from "../schemas/task.js";
2
+ /**
3
+ * Error codes for dependency validation failures
4
+ */
5
+ export declare enum DependencyErrorCode {
6
+ SELF_DEPENDENCY = "SELF_DEPENDENCY",
7
+ TASK_NOT_FOUND = "TASK_NOT_FOUND",
8
+ BLOCKER_NOT_FOUND = "BLOCKER_NOT_FOUND",
9
+ CIRCULAR_DEPENDENCY = "CIRCULAR_DEPENDENCY",
10
+ DUPLICATE_DEPENDENCY = "DUPLICATE_DEPENDENCY"
11
+ }
12
+ /**
13
+ * Result of dependency validation
14
+ */
15
+ export interface DependencyValidationResult {
16
+ valid: boolean;
17
+ errorCode?: DependencyErrorCode;
18
+ errorMessage?: string;
19
+ suggestion?: string;
20
+ }
21
+ /**
22
+ * Options for dependency validation
23
+ */
24
+ export interface ValidateDependencyOptions {
25
+ taskId: string;
26
+ blockedBy: string;
27
+ tasks: Task[];
28
+ checkDuplicates?: boolean;
29
+ }
30
+ /**
31
+ * Validates if a dependency can be added between two tasks
32
+ */
33
+ export declare function validateDependency(options: ValidateDependencyOptions): DependencyValidationResult;
34
+ /**
35
+ * Invalid dependency reference
36
+ */
37
+ export interface InvalidDependencyReference {
38
+ taskId: string;
39
+ taskTitle: string;
40
+ invalidDependencyId: string;
41
+ type: "blocked_by" | "blocks" | "related";
42
+ }
43
+ /**
44
+ * Find all invalid dependency references (orphaned references)
45
+ */
46
+ export declare function findInvalidDependencies(tasks: Task[]): InvalidDependencyReference[];
47
+ /**
48
+ * Find tasks with self-dependencies
49
+ */
50
+ export declare function findSelfDependencies(tasks: Task[]): string[];
51
+ /**
52
+ * Detect all circular dependency chains
53
+ *
54
+ * Optimized DFS-based cycle detection:
55
+ * - Uses index map instead of path.indexOf() for O(1) cycle start lookup
56
+ * - Reuses single path array instead of copying on each recursion
57
+ * - Uses Set with canonical key for O(1) cycle deduplication
58
+ *
59
+ * Time: O(V + E + c * k log k) where c = cycles, k = avg cycle length
60
+ * Space: O(V + c * k)
61
+ */
62
+ export declare function detectCircularDependencies(tasks: Task[]): string[][];
63
+ /**
64
+ * Comprehensive dependency integrity report
65
+ */
66
+ export interface DependencyIntegrityReport {
67
+ valid: boolean;
68
+ totalTasks: number;
69
+ totalDependencies: number;
70
+ issues: {
71
+ selfDependencies: string[];
72
+ invalidReferences: InvalidDependencyReference[];
73
+ circularDependencies: string[][];
74
+ };
75
+ summary: string;
76
+ }
77
+ /**
78
+ * Check overall dependency integrity of a project
79
+ */
80
+ export declare function checkDependencyIntegrity(tasks: Task[]): DependencyIntegrityReport;
81
+ //# sourceMappingURL=dependency-integrity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-integrity.d.ts","sourceRoot":"","sources":["../../src/algorithms/dependency-integrity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAG/C;;GAEG;AACH,oBAAY,mBAAmB;IAC7B,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;IACjC,iBAAiB,sBAAsB;IACvC,mBAAmB,wBAAwB;IAC3C,oBAAoB,yBAAyB;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,0BAA0B,CAiEjG;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,0BAA0B,EAAE,CAmBnF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAW5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,EAAE,CAuDpE;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE;QACN,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,iBAAiB,EAAE,0BAA0B,EAAE,CAAC;QAChD,oBAAoB,EAAE,MAAM,EAAE,EAAE,CAAC;KAClC,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,yBAAyB,CAsCjF"}
@@ -0,0 +1,209 @@
1
+ import { wouldCreateCycle } from "./topological-sort.js";
2
+ /**
3
+ * Error codes for dependency validation failures
4
+ */
5
+ export var DependencyErrorCode;
6
+ (function (DependencyErrorCode) {
7
+ DependencyErrorCode["SELF_DEPENDENCY"] = "SELF_DEPENDENCY";
8
+ DependencyErrorCode["TASK_NOT_FOUND"] = "TASK_NOT_FOUND";
9
+ DependencyErrorCode["BLOCKER_NOT_FOUND"] = "BLOCKER_NOT_FOUND";
10
+ DependencyErrorCode["CIRCULAR_DEPENDENCY"] = "CIRCULAR_DEPENDENCY";
11
+ DependencyErrorCode["DUPLICATE_DEPENDENCY"] = "DUPLICATE_DEPENDENCY";
12
+ })(DependencyErrorCode || (DependencyErrorCode = {}));
13
+ /**
14
+ * Validates if a dependency can be added between two tasks
15
+ */
16
+ export function validateDependency(options) {
17
+ const { taskId, blockedBy, tasks, checkDuplicates = true } = options;
18
+ // 1. Self-dependency check
19
+ if (taskId === blockedBy) {
20
+ return {
21
+ valid: false,
22
+ errorCode: DependencyErrorCode.SELF_DEPENDENCY,
23
+ errorMessage: `Task "${taskId}" cannot depend on itself`,
24
+ suggestion: "Specify a different blocker task",
25
+ };
26
+ }
27
+ // Build taskMap once for O(1) lookups
28
+ const taskMap = new Map(tasks.map((t) => [t.id, t]));
29
+ // 2. Task existence check
30
+ const task = taskMap.get(taskId);
31
+ if (!task) {
32
+ return {
33
+ valid: false,
34
+ errorCode: DependencyErrorCode.TASK_NOT_FOUND,
35
+ errorMessage: `Task not found: "${taskId}"`,
36
+ suggestion: "Use task_list to find available tasks",
37
+ };
38
+ }
39
+ // 3. Blocker task existence check
40
+ const blocker = taskMap.get(blockedBy);
41
+ if (!blocker) {
42
+ return {
43
+ valid: false,
44
+ errorCode: DependencyErrorCode.BLOCKER_NOT_FOUND,
45
+ errorMessage: `Blocking task not found: "${blockedBy}"`,
46
+ suggestion: "Use task_list to find available tasks",
47
+ };
48
+ }
49
+ // 4. Duplicate dependency check
50
+ if (checkDuplicates) {
51
+ const existingDeps = task.dependencies ?? [];
52
+ const alreadyExists = existingDeps.some((d) => d.taskId === blockedBy && d.type === "blocked_by");
53
+ if (alreadyExists) {
54
+ return {
55
+ valid: false,
56
+ errorCode: DependencyErrorCode.DUPLICATE_DEPENDENCY,
57
+ errorMessage: `"${task.title}" is already blocked by "${blocker.title}"`,
58
+ suggestion: "This dependency already exists",
59
+ };
60
+ }
61
+ }
62
+ // 5. Circular dependency check
63
+ if (wouldCreateCycle(tasks, taskId, blockedBy)) {
64
+ return {
65
+ valid: false,
66
+ errorCode: DependencyErrorCode.CIRCULAR_DEPENDENCY,
67
+ errorMessage: "Adding this dependency would create a cycle",
68
+ suggestion: `"${blocker.title}" depends on "${task.title}". Use dependency_remove to break existing dependencies.`,
69
+ };
70
+ }
71
+ return { valid: true };
72
+ }
73
+ /**
74
+ * Find all invalid dependency references (orphaned references)
75
+ */
76
+ export function findInvalidDependencies(tasks) {
77
+ const taskIds = new Set(tasks.map((t) => t.id));
78
+ const invalid = [];
79
+ for (const task of tasks) {
80
+ const deps = task.dependencies ?? [];
81
+ for (const dep of deps) {
82
+ if (!taskIds.has(dep.taskId)) {
83
+ invalid.push({
84
+ taskId: task.id,
85
+ taskTitle: task.title,
86
+ invalidDependencyId: dep.taskId,
87
+ type: dep.type,
88
+ });
89
+ }
90
+ }
91
+ }
92
+ return invalid;
93
+ }
94
+ /**
95
+ * Find tasks with self-dependencies
96
+ */
97
+ export function findSelfDependencies(tasks) {
98
+ const selfDeps = [];
99
+ for (const task of tasks) {
100
+ const deps = task.dependencies ?? [];
101
+ if (deps.some((d) => d.taskId === task.id)) {
102
+ selfDeps.push(task.id);
103
+ }
104
+ }
105
+ return selfDeps;
106
+ }
107
+ /**
108
+ * Detect all circular dependency chains
109
+ *
110
+ * Optimized DFS-based cycle detection:
111
+ * - Uses index map instead of path.indexOf() for O(1) cycle start lookup
112
+ * - Reuses single path array instead of copying on each recursion
113
+ * - Uses Set with canonical key for O(1) cycle deduplication
114
+ *
115
+ * Time: O(V + E + c * k log k) where c = cycles, k = avg cycle length
116
+ * Space: O(V + c * k)
117
+ */
118
+ export function detectCircularDependencies(tasks) {
119
+ const taskMap = new Map(tasks.map((t) => [t.id, t]));
120
+ const visited = new Set();
121
+ const recStack = new Map(); // taskId -> index in path
122
+ const path = [];
123
+ const cycleKeys = new Set();
124
+ const cycles = [];
125
+ function dfs(taskId) {
126
+ visited.add(taskId);
127
+ recStack.set(taskId, path.length);
128
+ path.push(taskId);
129
+ const task = taskMap.get(taskId);
130
+ if (task) {
131
+ const deps = task.dependencies;
132
+ if (deps) {
133
+ for (let i = 0; i < deps.length; i++) {
134
+ const dep = deps[i];
135
+ if (dep.type !== "blocked_by")
136
+ continue;
137
+ const depId = dep.taskId;
138
+ if (!taskMap.has(depId))
139
+ continue;
140
+ if (!visited.has(depId)) {
141
+ dfs(depId);
142
+ }
143
+ else {
144
+ const cycleStart = recStack.get(depId);
145
+ if (cycleStart !== undefined) {
146
+ // Found cycle: extract and deduplicate
147
+ const cycle = path.slice(cycleStart);
148
+ // Canonical key: sort cycle members for deduplication
149
+ const cycleKey = cycle.slice().sort().join(",");
150
+ if (!cycleKeys.has(cycleKey)) {
151
+ cycleKeys.add(cycleKey);
152
+ cycles.push(cycle.slice()); // Store a copy
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+ path.pop();
160
+ recStack.delete(taskId);
161
+ }
162
+ for (let i = 0; i < tasks.length; i++) {
163
+ const task = tasks[i];
164
+ if (!visited.has(task.id)) {
165
+ dfs(task.id);
166
+ }
167
+ }
168
+ return cycles;
169
+ }
170
+ /**
171
+ * Check overall dependency integrity of a project
172
+ */
173
+ export function checkDependencyIntegrity(tasks) {
174
+ const selfDeps = findSelfDependencies(tasks);
175
+ const invalidRefs = findInvalidDependencies(tasks);
176
+ const cycles = detectCircularDependencies(tasks);
177
+ const totalDependencies = tasks.reduce((sum, t) => sum + (t.dependencies?.length ?? 0), 0);
178
+ const issueCount = selfDeps.length + invalidRefs.length + cycles.length;
179
+ const valid = issueCount === 0;
180
+ let summary;
181
+ if (valid) {
182
+ summary = `All ${totalDependencies} dependencies across ${tasks.length} tasks are valid.`;
183
+ }
184
+ else {
185
+ const parts = [];
186
+ if (selfDeps.length > 0) {
187
+ parts.push(`${selfDeps.length} self-dependencies`);
188
+ }
189
+ if (invalidRefs.length > 0) {
190
+ parts.push(`${invalidRefs.length} invalid references`);
191
+ }
192
+ if (cycles.length > 0) {
193
+ parts.push(`${cycles.length} circular dependency chains`);
194
+ }
195
+ summary = `Found ${issueCount} issue(s): ${parts.join(", ")}.`;
196
+ }
197
+ return {
198
+ valid,
199
+ totalTasks: tasks.length,
200
+ totalDependencies,
201
+ issues: {
202
+ selfDependencies: selfDeps,
203
+ invalidReferences: invalidRefs,
204
+ circularDependencies: cycles,
205
+ },
206
+ summary,
207
+ };
208
+ }
209
+ //# sourceMappingURL=dependency-integrity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-integrity.js","sourceRoot":"","sources":["../../src/algorithms/dependency-integrity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dependency-integrity.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-integrity.test.d.ts","sourceRoot":"","sources":["../../src/algorithms/dependency-integrity.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,296 @@
1
+ import { describe, test, expect } from "bun:test";
2
+ import { DependencyErrorCode, validateDependency, findInvalidDependencies, findSelfDependencies, detectCircularDependencies, checkDependencyIntegrity, } from "./dependency-integrity.js";
3
+ // Helper to create mock tasks
4
+ function createTask(id, title = `Task ${id}`, deps = []) {
5
+ return {
6
+ id,
7
+ title,
8
+ status: "pending",
9
+ priority: "medium",
10
+ workspace: "test-workspace",
11
+ createdAt: new Date().toISOString(),
12
+ updatedAt: new Date().toISOString(),
13
+ dependencies: deps,
14
+ };
15
+ }
16
+ describe("validateDependency", () => {
17
+ test("returns valid for a valid dependency", () => {
18
+ const tasks = [createTask("A"), createTask("B")];
19
+ const result = validateDependency({
20
+ taskId: "B",
21
+ blockedBy: "A",
22
+ tasks,
23
+ });
24
+ expect(result.valid).toBe(true);
25
+ expect(result.errorCode).toBeUndefined();
26
+ });
27
+ test("rejects self-dependency", () => {
28
+ const tasks = [createTask("A")];
29
+ const result = validateDependency({
30
+ taskId: "A",
31
+ blockedBy: "A",
32
+ tasks,
33
+ });
34
+ expect(result.valid).toBe(false);
35
+ expect(result.errorCode).toBe(DependencyErrorCode.SELF_DEPENDENCY);
36
+ expect(result.errorMessage).toContain("cannot depend on itself");
37
+ expect(result.suggestion).toBeDefined();
38
+ });
39
+ test("rejects when task not found", () => {
40
+ const tasks = [createTask("A")];
41
+ const result = validateDependency({
42
+ taskId: "B",
43
+ blockedBy: "A",
44
+ tasks,
45
+ });
46
+ expect(result.valid).toBe(false);
47
+ expect(result.errorCode).toBe(DependencyErrorCode.TASK_NOT_FOUND);
48
+ expect(result.errorMessage).toContain("Task not found");
49
+ });
50
+ test("rejects when blocker not found", () => {
51
+ const tasks = [createTask("A")];
52
+ const result = validateDependency({
53
+ taskId: "A",
54
+ blockedBy: "B",
55
+ tasks,
56
+ });
57
+ expect(result.valid).toBe(false);
58
+ expect(result.errorCode).toBe(DependencyErrorCode.BLOCKER_NOT_FOUND);
59
+ expect(result.errorMessage).toContain("Blocking task not found");
60
+ });
61
+ test("rejects duplicate dependency", () => {
62
+ const tasks = [
63
+ createTask("A"),
64
+ createTask("B", "Task B", [{ taskId: "A", type: "blocked_by" }]),
65
+ ];
66
+ const result = validateDependency({
67
+ taskId: "B",
68
+ blockedBy: "A",
69
+ tasks,
70
+ });
71
+ expect(result.valid).toBe(false);
72
+ expect(result.errorCode).toBe(DependencyErrorCode.DUPLICATE_DEPENDENCY);
73
+ expect(result.errorMessage).toContain("already blocked by");
74
+ });
75
+ test("allows duplicate when checkDuplicates is false", () => {
76
+ const tasks = [
77
+ createTask("A"),
78
+ createTask("B", "Task B", [{ taskId: "A", type: "blocked_by" }]),
79
+ ];
80
+ const result = validateDependency({
81
+ taskId: "B",
82
+ blockedBy: "A",
83
+ tasks,
84
+ checkDuplicates: false,
85
+ });
86
+ expect(result.valid).toBe(true);
87
+ });
88
+ test("rejects circular dependency", () => {
89
+ const tasks = [
90
+ createTask("A", "Task A", [{ taskId: "B", type: "blocked_by" }]),
91
+ createTask("B"),
92
+ ];
93
+ // B is blocking A, so A blocking B would create a cycle
94
+ const result = validateDependency({
95
+ taskId: "B",
96
+ blockedBy: "A",
97
+ tasks,
98
+ });
99
+ expect(result.valid).toBe(false);
100
+ expect(result.errorCode).toBe(DependencyErrorCode.CIRCULAR_DEPENDENCY);
101
+ expect(result.errorMessage).toContain("cycle");
102
+ expect(result.suggestion).toContain("depends on");
103
+ });
104
+ test("rejects indirect circular dependency", () => {
105
+ const tasks = [
106
+ createTask("A", "Task A", [{ taskId: "B", type: "blocked_by" }]),
107
+ createTask("B", "Task B", [{ taskId: "C", type: "blocked_by" }]),
108
+ createTask("C"),
109
+ ];
110
+ // A <- B <- C, adding C <- A would create cycle
111
+ const result = validateDependency({
112
+ taskId: "C",
113
+ blockedBy: "A",
114
+ tasks,
115
+ });
116
+ expect(result.valid).toBe(false);
117
+ expect(result.errorCode).toBe(DependencyErrorCode.CIRCULAR_DEPENDENCY);
118
+ });
119
+ });
120
+ describe("findInvalidDependencies", () => {
121
+ test("returns empty array when all dependencies are valid", () => {
122
+ const tasks = [
123
+ createTask("A"),
124
+ createTask("B", "Task B", [{ taskId: "A", type: "blocked_by" }]),
125
+ ];
126
+ const result = findInvalidDependencies(tasks);
127
+ expect(result).toEqual([]);
128
+ });
129
+ test("finds orphaned dependency references", () => {
130
+ const tasks = [createTask("A", "Task A", [{ taskId: "non-existent", type: "blocked_by" }])];
131
+ const result = findInvalidDependencies(tasks);
132
+ expect(result.length).toBe(1);
133
+ expect(result[0].taskId).toBe("A");
134
+ expect(result[0].taskTitle).toBe("Task A");
135
+ expect(result[0].invalidDependencyId).toBe("non-existent");
136
+ expect(result[0].type).toBe("blocked_by");
137
+ });
138
+ test("finds multiple invalid references across tasks", () => {
139
+ const tasks = [
140
+ createTask("A", "Task A", [{ taskId: "deleted-1", type: "blocked_by" }]),
141
+ createTask("B", "Task B", [
142
+ { taskId: "A", type: "blocked_by" },
143
+ { taskId: "deleted-2", type: "blocks" },
144
+ ]),
145
+ ];
146
+ const result = findInvalidDependencies(tasks);
147
+ expect(result.length).toBe(2);
148
+ expect(result.map((r) => r.invalidDependencyId).sort()).toEqual(["deleted-1", "deleted-2"]);
149
+ });
150
+ test("returns empty array for tasks without dependencies", () => {
151
+ const tasks = [createTask("A"), createTask("B")];
152
+ const result = findInvalidDependencies(tasks);
153
+ expect(result).toEqual([]);
154
+ });
155
+ });
156
+ describe("findSelfDependencies", () => {
157
+ test("returns empty array when no self-dependencies exist", () => {
158
+ const tasks = [
159
+ createTask("A"),
160
+ createTask("B", "Task B", [{ taskId: "A", type: "blocked_by" }]),
161
+ ];
162
+ const result = findSelfDependencies(tasks);
163
+ expect(result).toEqual([]);
164
+ });
165
+ test("finds task with self-dependency", () => {
166
+ const tasks = [createTask("A", "Task A", [{ taskId: "A", type: "blocked_by" }])];
167
+ const result = findSelfDependencies(tasks);
168
+ expect(result).toEqual(["A"]);
169
+ });
170
+ test("finds multiple self-dependencies", () => {
171
+ const tasks = [
172
+ createTask("A", "Task A", [{ taskId: "A", type: "blocked_by" }]),
173
+ createTask("B"),
174
+ createTask("C", "Task C", [{ taskId: "C", type: "blocks" }]),
175
+ ];
176
+ const result = findSelfDependencies(tasks);
177
+ expect(result.sort()).toEqual(["A", "C"]);
178
+ });
179
+ });
180
+ describe("detectCircularDependencies", () => {
181
+ test("returns empty array when no cycles exist", () => {
182
+ const tasks = [
183
+ createTask("A"),
184
+ createTask("B", "Task B", [{ taskId: "A", type: "blocked_by" }]),
185
+ createTask("C", "Task C", [{ taskId: "B", type: "blocked_by" }]),
186
+ ];
187
+ const result = detectCircularDependencies(tasks);
188
+ expect(result).toEqual([]);
189
+ });
190
+ test("detects direct circular dependency (A -> B -> A)", () => {
191
+ const tasks = [
192
+ createTask("A", "Task A", [{ taskId: "B", type: "blocked_by" }]),
193
+ createTask("B", "Task B", [{ taskId: "A", type: "blocked_by" }]),
194
+ ];
195
+ const result = detectCircularDependencies(tasks);
196
+ expect(result.length).toBe(1);
197
+ expect(result[0].sort()).toEqual(["A", "B"]);
198
+ });
199
+ test("detects longer cycle (A -> B -> C -> A)", () => {
200
+ const tasks = [
201
+ createTask("A", "Task A", [{ taskId: "B", type: "blocked_by" }]),
202
+ createTask("B", "Task B", [{ taskId: "C", type: "blocked_by" }]),
203
+ createTask("C", "Task C", [{ taskId: "A", type: "blocked_by" }]),
204
+ ];
205
+ const result = detectCircularDependencies(tasks);
206
+ expect(result.length).toBe(1);
207
+ expect(result[0].sort()).toEqual(["A", "B", "C"]);
208
+ });
209
+ test("ignores non-blocking dependency types for cycle detection", () => {
210
+ const tasks = [
211
+ createTask("A", "Task A", [{ taskId: "B", type: "related" }]),
212
+ createTask("B", "Task B", [{ taskId: "A", type: "related" }]),
213
+ ];
214
+ const result = detectCircularDependencies(tasks);
215
+ expect(result).toEqual([]);
216
+ });
217
+ test("handles tasks with missing dependency targets", () => {
218
+ const tasks = [createTask("A", "Task A", [{ taskId: "non-existent", type: "blocked_by" }])];
219
+ const result = detectCircularDependencies(tasks);
220
+ expect(result).toEqual([]);
221
+ });
222
+ });
223
+ describe("checkDependencyIntegrity", () => {
224
+ test("returns valid for healthy task set", () => {
225
+ const tasks = [
226
+ createTask("A"),
227
+ createTask("B", "Task B", [{ taskId: "A", type: "blocked_by" }]),
228
+ createTask("C", "Task C", [{ taskId: "B", type: "blocked_by" }]),
229
+ ];
230
+ const result = checkDependencyIntegrity(tasks);
231
+ expect(result.valid).toBe(true);
232
+ expect(result.totalTasks).toBe(3);
233
+ expect(result.totalDependencies).toBe(2);
234
+ expect(result.issues.selfDependencies).toEqual([]);
235
+ expect(result.issues.invalidReferences).toEqual([]);
236
+ expect(result.issues.circularDependencies).toEqual([]);
237
+ expect(result.summary).toContain("All 2 dependencies");
238
+ expect(result.summary).toContain("valid");
239
+ });
240
+ test("detects self-dependency issues", () => {
241
+ const tasks = [createTask("A", "Task A", [{ taskId: "A", type: "blocked_by" }])];
242
+ const result = checkDependencyIntegrity(tasks);
243
+ expect(result.valid).toBe(false);
244
+ expect(result.issues.selfDependencies).toEqual(["A"]);
245
+ expect(result.summary).toContain("self-dependencies");
246
+ });
247
+ test("detects invalid reference issues", () => {
248
+ const tasks = [createTask("A", "Task A", [{ taskId: "deleted", type: "blocked_by" }])];
249
+ const result = checkDependencyIntegrity(tasks);
250
+ expect(result.valid).toBe(false);
251
+ expect(result.issues.invalidReferences.length).toBe(1);
252
+ expect(result.summary).toContain("invalid references");
253
+ });
254
+ test("detects circular dependency issues", () => {
255
+ const tasks = [
256
+ createTask("A", "Task A", [{ taskId: "B", type: "blocked_by" }]),
257
+ createTask("B", "Task B", [{ taskId: "A", type: "blocked_by" }]),
258
+ ];
259
+ const result = checkDependencyIntegrity(tasks);
260
+ expect(result.valid).toBe(false);
261
+ expect(result.issues.circularDependencies.length).toBe(1);
262
+ expect(result.summary).toContain("circular dependency");
263
+ });
264
+ test("reports multiple issue types", () => {
265
+ const tasks = [
266
+ createTask("A", "Task A", [
267
+ { taskId: "A", type: "blocked_by" }, // self-dependency
268
+ { taskId: "deleted", type: "blocked_by" }, // invalid reference
269
+ ]),
270
+ createTask("B", "Task B", [{ taskId: "C", type: "blocked_by" }]),
271
+ createTask("C", "Task C", [{ taskId: "B", type: "blocked_by" }]), // circular
272
+ ];
273
+ const result = checkDependencyIntegrity(tasks);
274
+ expect(result.valid).toBe(false);
275
+ expect(result.issues.selfDependencies.length).toBeGreaterThan(0);
276
+ expect(result.issues.invalidReferences.length).toBeGreaterThan(0);
277
+ expect(result.issues.circularDependencies.length).toBeGreaterThan(0);
278
+ expect(result.summary).toContain("self-dependencies");
279
+ expect(result.summary).toContain("invalid references");
280
+ expect(result.summary).toContain("circular dependency");
281
+ });
282
+ test("handles empty task array", () => {
283
+ const result = checkDependencyIntegrity([]);
284
+ expect(result.valid).toBe(true);
285
+ expect(result.totalTasks).toBe(0);
286
+ expect(result.totalDependencies).toBe(0);
287
+ });
288
+ test("handles tasks with no dependencies", () => {
289
+ const tasks = [createTask("A"), createTask("B"), createTask("C")];
290
+ const result = checkDependencyIntegrity(tasks);
291
+ expect(result.valid).toBe(true);
292
+ expect(result.totalTasks).toBe(3);
293
+ expect(result.totalDependencies).toBe(0);
294
+ });
295
+ });
296
+ //# sourceMappingURL=dependency-integrity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-integrity.test.js","sourceRoot":"","sources":["../../src/algorithms/dependency-integrity.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { topologicalSort, wouldCreateCycle, findDependents, findDependencies, priorityToNumber, taskToNode, type TaskNode, } from "./topological-sort.js";
2
+ export { criticalPathAnalysis, findParallelTasks, suggestNextTask, type CPMTask, type CPMResult, } from "./critical-path.js";
3
+ export { suggestSafeOrder, findBreakingChanges, findHighRiskTasks, groupByTechArea, getComplexitySummary, getTechStackSummary, suggestSubtaskCount, type SafeOrderResult, type SafeOrderPhase, type ComplexityDistribution, type ComplexitySummary, type TechStackSummary, } from "./tech-analysis.js";
4
+ export { validateDependency, findInvalidDependencies, findSelfDependencies, detectCircularDependencies, checkDependencyIntegrity, DependencyErrorCode, type DependencyValidationResult, type ValidateDependencyOptions, type InvalidDependencyReference, type DependencyIntegrityReport, } from "./dependency-integrity.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/algorithms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,KAAK,QAAQ,GACd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,KAAK,OAAO,EACZ,KAAK,SAAS,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,GAC/B,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { topologicalSort, wouldCreateCycle, findDependents, findDependencies, priorityToNumber, taskToNode, } from "./topological-sort.js";
2
+ export { criticalPathAnalysis, findParallelTasks, suggestNextTask, } from "./critical-path.js";
3
+ export { suggestSafeOrder, findBreakingChanges, findHighRiskTasks, groupByTechArea, getComplexitySummary, getTechStackSummary, suggestSubtaskCount, } from "./tech-analysis.js";
4
+ export { validateDependency, findInvalidDependencies, findSelfDependencies, detectCircularDependencies, checkDependencyIntegrity, DependencyErrorCode, } from "./dependency-integrity.js";
5
+ //# sourceMappingURL=index.js.map