@task-mcp/shared 1.0.20 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -6
- package/dist/algorithms/critical-path.d.ts +0 -46
- package/dist/algorithms/critical-path.d.ts.map +0 -1
- package/dist/algorithms/critical-path.js +0 -320
- package/dist/algorithms/critical-path.js.map +0 -1
- package/dist/algorithms/critical-path.test.d.ts +0 -2
- package/dist/algorithms/critical-path.test.d.ts.map +0 -1
- package/dist/algorithms/critical-path.test.js +0 -194
- package/dist/algorithms/critical-path.test.js.map +0 -1
- package/dist/algorithms/dependency-integrity.d.ts +0 -81
- package/dist/algorithms/dependency-integrity.d.ts.map +0 -1
- package/dist/algorithms/dependency-integrity.js +0 -207
- package/dist/algorithms/dependency-integrity.js.map +0 -1
- package/dist/algorithms/dependency-integrity.test.d.ts +0 -2
- package/dist/algorithms/dependency-integrity.test.d.ts.map +0 -1
- package/dist/algorithms/dependency-integrity.test.js +0 -309
- package/dist/algorithms/dependency-integrity.test.js.map +0 -1
- package/dist/algorithms/index.d.ts +0 -5
- package/dist/algorithms/index.d.ts.map +0 -1
- package/dist/algorithms/index.js +0 -5
- package/dist/algorithms/index.js.map +0 -1
- package/dist/algorithms/tech-analysis.d.ts +0 -106
- package/dist/algorithms/tech-analysis.d.ts.map +0 -1
- package/dist/algorithms/tech-analysis.js +0 -344
- package/dist/algorithms/tech-analysis.js.map +0 -1
- package/dist/algorithms/tech-analysis.test.d.ts +0 -2
- package/dist/algorithms/tech-analysis.test.d.ts.map +0 -1
- package/dist/algorithms/tech-analysis.test.js +0 -338
- package/dist/algorithms/tech-analysis.test.js.map +0 -1
- package/dist/algorithms/topological-sort.d.ts +0 -41
- package/dist/algorithms/topological-sort.d.ts.map +0 -1
- package/dist/algorithms/topological-sort.js +0 -165
- package/dist/algorithms/topological-sort.js.map +0 -1
- package/dist/algorithms/topological-sort.test.d.ts +0 -2
- package/dist/algorithms/topological-sort.test.d.ts.map +0 -1
- package/dist/algorithms/topological-sort.test.js +0 -162
- package/dist/algorithms/topological-sort.test.js.map +0 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -7
- package/dist/index.js.map +0 -1
- package/dist/schemas/inbox.d.ts +0 -55
- package/dist/schemas/inbox.d.ts.map +0 -1
- package/dist/schemas/inbox.js +0 -25
- package/dist/schemas/inbox.js.map +0 -1
- package/dist/schemas/index.d.ts +0 -7
- package/dist/schemas/index.d.ts.map +0 -1
- package/dist/schemas/index.js +0 -17
- package/dist/schemas/index.js.map +0 -1
- package/dist/schemas/project.d.ts +0 -177
- package/dist/schemas/project.d.ts.map +0 -1
- package/dist/schemas/project.js +0 -56
- package/dist/schemas/project.js.map +0 -1
- package/dist/schemas/response-format.d.ts +0 -148
- package/dist/schemas/response-format.d.ts.map +0 -1
- package/dist/schemas/response-format.js +0 -18
- package/dist/schemas/response-format.js.map +0 -1
- package/dist/schemas/response-schema.d.ts +0 -307
- package/dist/schemas/response-schema.d.ts.map +0 -1
- package/dist/schemas/response-schema.js +0 -75
- package/dist/schemas/response-schema.js.map +0 -1
- package/dist/schemas/response-schema.test.d.ts +0 -2
- package/dist/schemas/response-schema.test.d.ts.map +0 -1
- package/dist/schemas/response-schema.test.js +0 -256
- package/dist/schemas/response-schema.test.js.map +0 -1
- package/dist/schemas/state.d.ts +0 -17
- package/dist/schemas/state.d.ts.map +0 -1
- package/dist/schemas/state.js +0 -17
- package/dist/schemas/state.js.map +0 -1
- package/dist/schemas/task.d.ts +0 -881
- package/dist/schemas/task.d.ts.map +0 -1
- package/dist/schemas/task.js +0 -189
- package/dist/schemas/task.js.map +0 -1
- package/dist/schemas/view.d.ts +0 -143
- package/dist/schemas/view.d.ts.map +0 -1
- package/dist/schemas/view.js +0 -48
- package/dist/schemas/view.js.map +0 -1
- package/dist/utils/dashboard-renderer.d.ts +0 -93
- package/dist/utils/dashboard-renderer.d.ts.map +0 -1
- package/dist/utils/dashboard-renderer.js +0 -424
- package/dist/utils/dashboard-renderer.js.map +0 -1
- package/dist/utils/dashboard-renderer.test.d.ts +0 -2
- package/dist/utils/dashboard-renderer.test.d.ts.map +0 -1
- package/dist/utils/dashboard-renderer.test.js +0 -774
- package/dist/utils/dashboard-renderer.test.js.map +0 -1
- package/dist/utils/date.d.ts +0 -94
- package/dist/utils/date.d.ts.map +0 -1
- package/dist/utils/date.js +0 -323
- package/dist/utils/date.js.map +0 -1
- package/dist/utils/date.test.d.ts +0 -2
- package/dist/utils/date.test.d.ts.map +0 -1
- package/dist/utils/date.test.js +0 -276
- package/dist/utils/date.test.js.map +0 -1
- package/dist/utils/hierarchy.d.ts +0 -102
- package/dist/utils/hierarchy.d.ts.map +0 -1
- package/dist/utils/hierarchy.js +0 -236
- package/dist/utils/hierarchy.js.map +0 -1
- package/dist/utils/hierarchy.test.d.ts +0 -2
- package/dist/utils/hierarchy.test.d.ts.map +0 -1
- package/dist/utils/hierarchy.test.js +0 -436
- package/dist/utils/hierarchy.test.js.map +0 -1
- package/dist/utils/id.d.ts +0 -60
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js +0 -118
- package/dist/utils/id.js.map +0 -1
- package/dist/utils/id.test.d.ts +0 -2
- package/dist/utils/id.test.d.ts.map +0 -1
- package/dist/utils/id.test.js +0 -193
- package/dist/utils/id.test.js.map +0 -1
- package/dist/utils/index.d.ts +0 -12
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -34
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/natural-language.d.ts +0 -57
- package/dist/utils/natural-language.d.ts.map +0 -1
- package/dist/utils/natural-language.js +0 -211
- package/dist/utils/natural-language.js.map +0 -1
- package/dist/utils/natural-language.test.d.ts +0 -2
- package/dist/utils/natural-language.test.d.ts.map +0 -1
- package/dist/utils/natural-language.test.js +0 -197
- package/dist/utils/natural-language.test.js.map +0 -1
- package/dist/utils/priority-queue.d.ts +0 -17
- package/dist/utils/priority-queue.d.ts.map +0 -1
- package/dist/utils/priority-queue.js +0 -62
- package/dist/utils/priority-queue.js.map +0 -1
- package/dist/utils/priority-queue.test.d.ts +0 -2
- package/dist/utils/priority-queue.test.d.ts.map +0 -1
- package/dist/utils/priority-queue.test.js +0 -82
- package/dist/utils/priority-queue.test.js.map +0 -1
- package/dist/utils/projection.d.ts +0 -65
- package/dist/utils/projection.d.ts.map +0 -1
- package/dist/utils/projection.js +0 -180
- package/dist/utils/projection.js.map +0 -1
- package/dist/utils/projection.test.d.ts +0 -2
- package/dist/utils/projection.test.d.ts.map +0 -1
- package/dist/utils/projection.test.js +0 -336
- package/dist/utils/projection.test.js.map +0 -1
- package/dist/utils/terminal-ui.d.ts +0 -208
- package/dist/utils/terminal-ui.d.ts.map +0 -1
- package/dist/utils/terminal-ui.js +0 -611
- package/dist/utils/terminal-ui.js.map +0 -1
- package/dist/utils/terminal-ui.test.d.ts +0 -2
- package/dist/utils/terminal-ui.test.d.ts.map +0 -1
- package/dist/utils/terminal-ui.test.js +0 -683
- package/dist/utils/terminal-ui.test.js.map +0 -1
- package/dist/utils/workspace.d.ts +0 -100
- package/dist/utils/workspace.d.ts.map +0 -1
- package/dist/utils/workspace.js +0 -173
- package/dist/utils/workspace.js.map +0 -1
- package/dist/utils/workspace.test.d.ts +0 -2
- package/dist/utils/workspace.test.d.ts.map +0 -1
- package/dist/utils/workspace.test.js +0 -97
- package/dist/utils/workspace.test.js.map +0 -1
- package/src/algorithms/critical-path.test.ts +0 -241
- package/src/algorithms/dependency-integrity.test.ts +0 -348
- package/src/algorithms/tech-analysis.test.ts +0 -413
- package/src/algorithms/topological-sort.test.ts +0 -190
- package/src/schemas/response-schema.test.ts +0 -314
- package/src/utils/dashboard-renderer.test.ts +0 -983
- package/src/utils/date.test.ts +0 -329
- package/src/utils/hierarchy.test.ts +0 -505
- package/src/utils/id.test.ts +0 -235
- package/src/utils/natural-language.test.ts +0 -242
- package/src/utils/priority-queue.test.ts +0 -103
- package/src/utils/projection.test.ts +0 -425
- package/src/utils/terminal-ui.test.ts +0 -831
- package/src/utils/workspace.test.ts +0 -125
|
@@ -1,436 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect } from "bun:test";
|
|
2
|
-
import { MAX_HIERARCHY_DEPTH, getTaskLevel, validateHierarchyDepth, getAncestorIds, getDescendantIds, getChildTasks, getRootTask, buildTaskTree, validateHierarchy, } from "./hierarchy.js";
|
|
3
|
-
// Helper to create mock tasks
|
|
4
|
-
function createTask(id, parentId, overrides = {}) {
|
|
5
|
-
return {
|
|
6
|
-
id,
|
|
7
|
-
title: `Task ${id}`,
|
|
8
|
-
status: "pending",
|
|
9
|
-
priority: "medium",
|
|
10
|
-
workspace: "test-workspace",
|
|
11
|
-
createdAt: new Date().toISOString(),
|
|
12
|
-
updatedAt: new Date().toISOString(),
|
|
13
|
-
parentId,
|
|
14
|
-
...overrides,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
describe("MAX_HIERARCHY_DEPTH", () => {
|
|
18
|
-
test("is set to 3", () => {
|
|
19
|
-
expect(MAX_HIERARCHY_DEPTH).toBe(3);
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
describe("getTaskLevel", () => {
|
|
23
|
-
test("returns -1 for non-existent task", () => {
|
|
24
|
-
const tasks = [createTask("A")];
|
|
25
|
-
expect(getTaskLevel(tasks, "nonexistent")).toBe(-1);
|
|
26
|
-
});
|
|
27
|
-
test("returns 0 for root task (no parent)", () => {
|
|
28
|
-
const tasks = [createTask("A")];
|
|
29
|
-
expect(getTaskLevel(tasks, "A")).toBe(0);
|
|
30
|
-
});
|
|
31
|
-
test("returns 1 for direct child", () => {
|
|
32
|
-
const tasks = [createTask("A"), createTask("B", "A")];
|
|
33
|
-
expect(getTaskLevel(tasks, "B")).toBe(1);
|
|
34
|
-
});
|
|
35
|
-
test("returns 2 for grandchild", () => {
|
|
36
|
-
const tasks = [createTask("A"), createTask("B", "A"), createTask("C", "B")];
|
|
37
|
-
expect(getTaskLevel(tasks, "C")).toBe(2);
|
|
38
|
-
});
|
|
39
|
-
test("returns 3 for great-grandchild", () => {
|
|
40
|
-
const tasks = [
|
|
41
|
-
createTask("A"),
|
|
42
|
-
createTask("B", "A"),
|
|
43
|
-
createTask("C", "B"),
|
|
44
|
-
createTask("D", "C"),
|
|
45
|
-
];
|
|
46
|
-
expect(getTaskLevel(tasks, "D")).toBe(3);
|
|
47
|
-
});
|
|
48
|
-
test("handles missing parent gracefully", () => {
|
|
49
|
-
// Task B references non-existent parent "missing"
|
|
50
|
-
const tasks = [createTask("A"), createTask("B", "missing")];
|
|
51
|
-
// Should return 0 since parent lookup fails immediately
|
|
52
|
-
expect(getTaskLevel(tasks, "B")).toBe(0);
|
|
53
|
-
});
|
|
54
|
-
test("handles broken chain (middle parent missing)", () => {
|
|
55
|
-
// C -> B -> A, but B is missing
|
|
56
|
-
const tasks = [createTask("A"), createTask("C", "B")];
|
|
57
|
-
// C's parent "B" doesn't exist, so level stays 0
|
|
58
|
-
expect(getTaskLevel(tasks, "C")).toBe(0);
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
describe("validateHierarchyDepth", () => {
|
|
62
|
-
test("returns false for non-existent parent", () => {
|
|
63
|
-
const tasks = [createTask("A")];
|
|
64
|
-
expect(validateHierarchyDepth(tasks, "nonexistent")).toBe(false);
|
|
65
|
-
});
|
|
66
|
-
test("returns true when parent is at level 0", () => {
|
|
67
|
-
const tasks = [createTask("A")];
|
|
68
|
-
// Can add child at level 1
|
|
69
|
-
expect(validateHierarchyDepth(tasks, "A")).toBe(true);
|
|
70
|
-
});
|
|
71
|
-
test("returns true when parent is at level 1", () => {
|
|
72
|
-
const tasks = [createTask("A"), createTask("B", "A")];
|
|
73
|
-
// Can add child at level 2
|
|
74
|
-
expect(validateHierarchyDepth(tasks, "B")).toBe(true);
|
|
75
|
-
});
|
|
76
|
-
test("returns true when parent is at level 2", () => {
|
|
77
|
-
const tasks = [createTask("A"), createTask("B", "A"), createTask("C", "B")];
|
|
78
|
-
// Can add child at level 3 (MAX_HIERARCHY_DEPTH)
|
|
79
|
-
expect(validateHierarchyDepth(tasks, "C")).toBe(true);
|
|
80
|
-
});
|
|
81
|
-
test("returns false when parent is at level 3 (max depth)", () => {
|
|
82
|
-
const tasks = [
|
|
83
|
-
createTask("A"),
|
|
84
|
-
createTask("B", "A"),
|
|
85
|
-
createTask("C", "B"),
|
|
86
|
-
createTask("D", "C"),
|
|
87
|
-
];
|
|
88
|
-
// D is at level 3, cannot add child at level 4
|
|
89
|
-
expect(validateHierarchyDepth(tasks, "D")).toBe(false);
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
describe("getAncestorIds", () => {
|
|
93
|
-
test("returns empty array for non-existent task", () => {
|
|
94
|
-
const tasks = [createTask("A")];
|
|
95
|
-
expect(getAncestorIds(tasks, "nonexistent")).toEqual([]);
|
|
96
|
-
});
|
|
97
|
-
test("returns empty array for root task", () => {
|
|
98
|
-
const tasks = [createTask("A")];
|
|
99
|
-
expect(getAncestorIds(tasks, "A")).toEqual([]);
|
|
100
|
-
});
|
|
101
|
-
test("returns single ancestor for direct child", () => {
|
|
102
|
-
const tasks = [createTask("A"), createTask("B", "A")];
|
|
103
|
-
expect(getAncestorIds(tasks, "B")).toEqual(["A"]);
|
|
104
|
-
});
|
|
105
|
-
test("returns ancestors ordered from immediate parent to root", () => {
|
|
106
|
-
const tasks = [
|
|
107
|
-
createTask("A"),
|
|
108
|
-
createTask("B", "A"),
|
|
109
|
-
createTask("C", "B"),
|
|
110
|
-
createTask("D", "C"),
|
|
111
|
-
];
|
|
112
|
-
expect(getAncestorIds(tasks, "D")).toEqual(["C", "B", "A"]);
|
|
113
|
-
});
|
|
114
|
-
test("handles missing ancestor in chain", () => {
|
|
115
|
-
// C -> B -> missing
|
|
116
|
-
const tasks = [createTask("B", "missing"), createTask("C", "B")];
|
|
117
|
-
// Returns B and "missing" (the parentId), then stops when "missing" lookup fails
|
|
118
|
-
expect(getAncestorIds(tasks, "C")).toEqual(["B", "missing"]);
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
describe("getDescendantIds", () => {
|
|
122
|
-
test("returns empty array for task with no children", () => {
|
|
123
|
-
const tasks = [createTask("A"), createTask("B")];
|
|
124
|
-
expect(getDescendantIds(tasks, "A")).toEqual([]);
|
|
125
|
-
});
|
|
126
|
-
test("returns direct children", () => {
|
|
127
|
-
const tasks = [createTask("A"), createTask("B", "A"), createTask("C", "A")];
|
|
128
|
-
const descendants = getDescendantIds(tasks, "A");
|
|
129
|
-
expect(descendants.sort()).toEqual(["B", "C"]);
|
|
130
|
-
});
|
|
131
|
-
test("returns all descendants (children and grandchildren)", () => {
|
|
132
|
-
const tasks = [
|
|
133
|
-
createTask("A"),
|
|
134
|
-
createTask("B", "A"),
|
|
135
|
-
createTask("C", "A"),
|
|
136
|
-
createTask("D", "B"),
|
|
137
|
-
createTask("E", "B"),
|
|
138
|
-
];
|
|
139
|
-
const descendants = getDescendantIds(tasks, "A");
|
|
140
|
-
expect(descendants.sort()).toEqual(["B", "C", "D", "E"]);
|
|
141
|
-
});
|
|
142
|
-
test("returns descendants in BFS order", () => {
|
|
143
|
-
const tasks = [
|
|
144
|
-
createTask("A"),
|
|
145
|
-
createTask("B", "A"),
|
|
146
|
-
createTask("C", "A"),
|
|
147
|
-
createTask("D", "B"),
|
|
148
|
-
];
|
|
149
|
-
const descendants = getDescendantIds(tasks, "A");
|
|
150
|
-
// BFS: first level (B, C), then second level (D)
|
|
151
|
-
// B and C come before D
|
|
152
|
-
const dIndex = descendants.indexOf("D");
|
|
153
|
-
const bIndex = descendants.indexOf("B");
|
|
154
|
-
const cIndex = descendants.indexOf("C");
|
|
155
|
-
expect(bIndex).toBeLessThan(dIndex);
|
|
156
|
-
expect(cIndex).toBeLessThan(dIndex);
|
|
157
|
-
});
|
|
158
|
-
test("returns empty array for non-existent task", () => {
|
|
159
|
-
const tasks = [createTask("A")];
|
|
160
|
-
expect(getDescendantIds(tasks, "nonexistent")).toEqual([]);
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
describe("getChildTasks", () => {
|
|
164
|
-
test("returns empty array for task with no children", () => {
|
|
165
|
-
const tasks = [createTask("A"), createTask("B")];
|
|
166
|
-
expect(getChildTasks(tasks, "A")).toEqual([]);
|
|
167
|
-
});
|
|
168
|
-
test("returns only direct children", () => {
|
|
169
|
-
const tasks = [
|
|
170
|
-
createTask("A"),
|
|
171
|
-
createTask("B", "A"),
|
|
172
|
-
createTask("C", "A"),
|
|
173
|
-
createTask("D", "B"), // grandchild, should not be included
|
|
174
|
-
];
|
|
175
|
-
const children = getChildTasks(tasks, "A");
|
|
176
|
-
expect(children.map((t) => t.id).sort()).toEqual(["B", "C"]);
|
|
177
|
-
});
|
|
178
|
-
test("returns empty array for non-existent parent", () => {
|
|
179
|
-
const tasks = [createTask("A")];
|
|
180
|
-
expect(getChildTasks(tasks, "nonexistent")).toEqual([]);
|
|
181
|
-
});
|
|
182
|
-
test("returns full task objects", () => {
|
|
183
|
-
const tasks = [createTask("A"), createTask("B", "A", { title: "Custom Title" })];
|
|
184
|
-
const children = getChildTasks(tasks, "A");
|
|
185
|
-
expect(children.length).toBe(1);
|
|
186
|
-
expect(children[0].id).toBe("B");
|
|
187
|
-
expect(children[0].title).toBe("Custom Title");
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
describe("getRootTask", () => {
|
|
191
|
-
test("returns null for non-existent task", () => {
|
|
192
|
-
const tasks = [createTask("A")];
|
|
193
|
-
expect(getRootTask(tasks, "nonexistent")).toBeNull();
|
|
194
|
-
});
|
|
195
|
-
test("returns the task itself if it has no parent", () => {
|
|
196
|
-
const tasks = [createTask("A")];
|
|
197
|
-
const root = getRootTask(tasks, "A");
|
|
198
|
-
expect(root?.id).toBe("A");
|
|
199
|
-
});
|
|
200
|
-
test("returns root for direct child", () => {
|
|
201
|
-
const tasks = [createTask("A"), createTask("B", "A")];
|
|
202
|
-
const root = getRootTask(tasks, "B");
|
|
203
|
-
expect(root?.id).toBe("A");
|
|
204
|
-
});
|
|
205
|
-
test("returns root for deeply nested task", () => {
|
|
206
|
-
const tasks = [
|
|
207
|
-
createTask("A"),
|
|
208
|
-
createTask("B", "A"),
|
|
209
|
-
createTask("C", "B"),
|
|
210
|
-
createTask("D", "C"),
|
|
211
|
-
];
|
|
212
|
-
const root = getRootTask(tasks, "D");
|
|
213
|
-
expect(root?.id).toBe("A");
|
|
214
|
-
});
|
|
215
|
-
test("handles broken chain (returns earliest found task)", () => {
|
|
216
|
-
// C -> B -> missing
|
|
217
|
-
const tasks = [createTask("B", "missing"), createTask("C", "B")];
|
|
218
|
-
const root = getRootTask(tasks, "C");
|
|
219
|
-
// B's parent "missing" doesn't exist, so B is the root
|
|
220
|
-
expect(root?.id).toBe("B");
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
describe("buildTaskTree", () => {
|
|
224
|
-
test("returns empty array for empty task list", () => {
|
|
225
|
-
expect(buildTaskTree([])).toEqual([]);
|
|
226
|
-
});
|
|
227
|
-
test("returns single root task as tree", () => {
|
|
228
|
-
const tasks = [createTask("A")];
|
|
229
|
-
const tree = buildTaskTree(tasks);
|
|
230
|
-
expect(tree.length).toBe(1);
|
|
231
|
-
expect(tree[0].task.id).toBe("A");
|
|
232
|
-
expect(tree[0].children).toEqual([]);
|
|
233
|
-
});
|
|
234
|
-
test("builds tree with children", () => {
|
|
235
|
-
const tasks = [createTask("A"), createTask("B", "A"), createTask("C", "A")];
|
|
236
|
-
const tree = buildTaskTree(tasks);
|
|
237
|
-
expect(tree.length).toBe(1);
|
|
238
|
-
expect(tree[0].task.id).toBe("A");
|
|
239
|
-
expect(tree[0].children.length).toBe(2);
|
|
240
|
-
expect(tree[0].children.map((c) => c.task.id).sort()).toEqual(["B", "C"]);
|
|
241
|
-
});
|
|
242
|
-
test("builds nested tree structure", () => {
|
|
243
|
-
const tasks = [
|
|
244
|
-
createTask("A"),
|
|
245
|
-
createTask("B", "A"),
|
|
246
|
-
createTask("C", "B"),
|
|
247
|
-
createTask("D", "C"),
|
|
248
|
-
];
|
|
249
|
-
const tree = buildTaskTree(tasks);
|
|
250
|
-
expect(tree.length).toBe(1);
|
|
251
|
-
expect(tree[0].task.id).toBe("A");
|
|
252
|
-
expect(tree[0].children.length).toBe(1);
|
|
253
|
-
expect(tree[0].children[0].task.id).toBe("B");
|
|
254
|
-
expect(tree[0].children[0].children.length).toBe(1);
|
|
255
|
-
expect(tree[0].children[0].children[0].task.id).toBe("C");
|
|
256
|
-
expect(tree[0].children[0].children[0].children.length).toBe(1);
|
|
257
|
-
expect(tree[0].children[0].children[0].children[0].task.id).toBe("D");
|
|
258
|
-
});
|
|
259
|
-
test("returns multiple root tasks", () => {
|
|
260
|
-
const tasks = [createTask("A"), createTask("B"), createTask("C")];
|
|
261
|
-
const tree = buildTaskTree(tasks);
|
|
262
|
-
expect(tree.length).toBe(3);
|
|
263
|
-
expect(tree.map((n) => n.task.id).sort()).toEqual(["A", "B", "C"]);
|
|
264
|
-
});
|
|
265
|
-
test("builds tree from specific root", () => {
|
|
266
|
-
const tasks = [
|
|
267
|
-
createTask("A"),
|
|
268
|
-
createTask("B", "A"),
|
|
269
|
-
createTask("C", "B"),
|
|
270
|
-
createTask("X"),
|
|
271
|
-
createTask("Y", "X"),
|
|
272
|
-
];
|
|
273
|
-
const tree = buildTaskTree(tasks, "A");
|
|
274
|
-
expect(tree.length).toBe(1);
|
|
275
|
-
expect(tree[0].task.id).toBe("A");
|
|
276
|
-
expect(tree[0].children.length).toBe(1);
|
|
277
|
-
expect(tree[0].children[0].task.id).toBe("B");
|
|
278
|
-
});
|
|
279
|
-
test("returns empty array for non-existent root", () => {
|
|
280
|
-
const tasks = [createTask("A")];
|
|
281
|
-
const tree = buildTaskTree(tasks, "nonexistent");
|
|
282
|
-
expect(tree).toEqual([]);
|
|
283
|
-
});
|
|
284
|
-
test("can build subtree from middle of hierarchy", () => {
|
|
285
|
-
const tasks = [
|
|
286
|
-
createTask("A"),
|
|
287
|
-
createTask("B", "A"),
|
|
288
|
-
createTask("C", "B"),
|
|
289
|
-
createTask("D", "B"),
|
|
290
|
-
];
|
|
291
|
-
const tree = buildTaskTree(tasks, "B");
|
|
292
|
-
expect(tree.length).toBe(1);
|
|
293
|
-
expect(tree[0].task.id).toBe("B");
|
|
294
|
-
expect(tree[0].children.length).toBe(2);
|
|
295
|
-
expect(tree[0].children.map((c) => c.task.id).sort()).toEqual(["C", "D"]);
|
|
296
|
-
});
|
|
297
|
-
test("respects maxDepth parameter", () => {
|
|
298
|
-
const tasks = [
|
|
299
|
-
createTask("A"),
|
|
300
|
-
createTask("B", "A"),
|
|
301
|
-
createTask("C", "B"),
|
|
302
|
-
createTask("D", "C"),
|
|
303
|
-
];
|
|
304
|
-
// maxDepth of 2 should include A (depth 0), B (depth 1), but stop children at C
|
|
305
|
-
const tree = buildTaskTree(tasks, "A", 2);
|
|
306
|
-
expect(tree.length).toBe(1);
|
|
307
|
-
expect(tree[0].task.id).toBe("A");
|
|
308
|
-
expect(tree[0].children.length).toBe(1);
|
|
309
|
-
expect(tree[0].children[0].task.id).toBe("B");
|
|
310
|
-
// C should be included but with no children (depth 2 is the limit)
|
|
311
|
-
expect(tree[0].children[0].children.length).toBe(1);
|
|
312
|
-
expect(tree[0].children[0].children[0].task.id).toBe("C");
|
|
313
|
-
expect(tree[0].children[0].children[0].children).toEqual([]);
|
|
314
|
-
});
|
|
315
|
-
test("handles circular references gracefully", () => {
|
|
316
|
-
// Create tasks with circular reference: A -> B -> C -> A
|
|
317
|
-
const taskA = createTask("A", "C");
|
|
318
|
-
const taskB = createTask("B", "A");
|
|
319
|
-
const taskC = createTask("C", "B");
|
|
320
|
-
const tasks = [taskA, taskB, taskC];
|
|
321
|
-
// Should not throw or hang - circular ref is detected
|
|
322
|
-
const tree = buildTaskTree(tasks);
|
|
323
|
-
// All tasks have parents, so no "root" tasks exist
|
|
324
|
-
expect(tree).toEqual([]);
|
|
325
|
-
});
|
|
326
|
-
test("handles self-referencing task", () => {
|
|
327
|
-
// Task references itself as parent
|
|
328
|
-
const selfRef = createTask("A", "A");
|
|
329
|
-
const tasks = [selfRef];
|
|
330
|
-
// No root tasks (A has parent), should return empty
|
|
331
|
-
const tree = buildTaskTree(tasks);
|
|
332
|
-
expect(tree).toEqual([]);
|
|
333
|
-
});
|
|
334
|
-
test("handles circular reference when building from specific root", () => {
|
|
335
|
-
// A -> B -> A (circular)
|
|
336
|
-
const taskA = createTask("A");
|
|
337
|
-
const taskB = createTask("B", "A");
|
|
338
|
-
// Manually create circular: make A's children include B which points back
|
|
339
|
-
// by creating a scenario where childrenMap would loop
|
|
340
|
-
const tasks = [taskA, taskB];
|
|
341
|
-
// Simulate circular by modifying childrenMap behavior won't work directly,
|
|
342
|
-
// but we can test that visited set prevents infinite recursion
|
|
343
|
-
// Let's create a more direct test case
|
|
344
|
-
const tree = buildTaskTree(tasks, "A");
|
|
345
|
-
expect(tree.length).toBe(1);
|
|
346
|
-
expect(tree[0].task.id).toBe("A");
|
|
347
|
-
expect(tree[0].children.length).toBe(1);
|
|
348
|
-
expect(tree[0].children[0].task.id).toBe("B");
|
|
349
|
-
});
|
|
350
|
-
});
|
|
351
|
-
describe("validateHierarchy", () => {
|
|
352
|
-
test("returns valid for empty task list", () => {
|
|
353
|
-
const result = validateHierarchy([]);
|
|
354
|
-
expect(result.valid).toBe(true);
|
|
355
|
-
expect(result.orphanedReferences).toEqual([]);
|
|
356
|
-
expect(result.circularReferences).toEqual([]);
|
|
357
|
-
expect(result.maxDepthExceeded).toEqual([]);
|
|
358
|
-
});
|
|
359
|
-
test("returns valid for healthy hierarchy", () => {
|
|
360
|
-
const tasks = [
|
|
361
|
-
createTask("A"),
|
|
362
|
-
createTask("B", "A"),
|
|
363
|
-
createTask("C", "B"),
|
|
364
|
-
];
|
|
365
|
-
const result = validateHierarchy(tasks);
|
|
366
|
-
expect(result.valid).toBe(true);
|
|
367
|
-
expect(result.orphanedReferences).toEqual([]);
|
|
368
|
-
expect(result.circularReferences).toEqual([]);
|
|
369
|
-
expect(result.maxDepthExceeded).toEqual([]);
|
|
370
|
-
});
|
|
371
|
-
test("detects orphaned parent references", () => {
|
|
372
|
-
const tasks = [
|
|
373
|
-
createTask("A"),
|
|
374
|
-
createTask("B", "nonexistent"),
|
|
375
|
-
];
|
|
376
|
-
const result = validateHierarchy(tasks);
|
|
377
|
-
expect(result.valid).toBe(false);
|
|
378
|
-
expect(result.orphanedReferences).toEqual([
|
|
379
|
-
{ taskId: "B", parentId: "nonexistent" },
|
|
380
|
-
]);
|
|
381
|
-
});
|
|
382
|
-
test("detects multiple orphaned references", () => {
|
|
383
|
-
const tasks = [
|
|
384
|
-
createTask("A"),
|
|
385
|
-
createTask("B", "missing1"),
|
|
386
|
-
createTask("C", "missing2"),
|
|
387
|
-
];
|
|
388
|
-
const result = validateHierarchy(tasks);
|
|
389
|
-
expect(result.valid).toBe(false);
|
|
390
|
-
expect(result.orphanedReferences.length).toBe(2);
|
|
391
|
-
expect(result.orphanedReferences).toContainEqual({ taskId: "B", parentId: "missing1" });
|
|
392
|
-
expect(result.orphanedReferences).toContainEqual({ taskId: "C", parentId: "missing2" });
|
|
393
|
-
});
|
|
394
|
-
test("detects circular references (self-reference)", () => {
|
|
395
|
-
const tasks = [createTask("A", "A")];
|
|
396
|
-
const result = validateHierarchy(tasks);
|
|
397
|
-
expect(result.valid).toBe(false);
|
|
398
|
-
expect(result.circularReferences).toContain("A");
|
|
399
|
-
});
|
|
400
|
-
test("detects circular references (A -> B -> A)", () => {
|
|
401
|
-
const taskA = createTask("A", "B");
|
|
402
|
-
const taskB = createTask("B", "A");
|
|
403
|
-
const tasks = [taskA, taskB];
|
|
404
|
-
const result = validateHierarchy(tasks);
|
|
405
|
-
expect(result.valid).toBe(false);
|
|
406
|
-
expect(result.circularReferences.length).toBeGreaterThan(0);
|
|
407
|
-
});
|
|
408
|
-
test("detects max depth exceeded", () => {
|
|
409
|
-
// Create chain: A -> B -> C -> D -> E (E at level 4, exceeds MAX_HIERARCHY_DEPTH of 3)
|
|
410
|
-
const tasks = [
|
|
411
|
-
createTask("A"),
|
|
412
|
-
createTask("B", "A"),
|
|
413
|
-
createTask("C", "B"),
|
|
414
|
-
createTask("D", "C"),
|
|
415
|
-
createTask("E", "D"),
|
|
416
|
-
];
|
|
417
|
-
const result = validateHierarchy(tasks);
|
|
418
|
-
expect(result.valid).toBe(false);
|
|
419
|
-
expect(result.maxDepthExceeded).toContainEqual({ taskId: "E", depth: 4 });
|
|
420
|
-
});
|
|
421
|
-
test("returns all issues when multiple problems exist", () => {
|
|
422
|
-
const tasks = [
|
|
423
|
-
createTask("A"),
|
|
424
|
-
createTask("B", "A"),
|
|
425
|
-
createTask("C", "B"),
|
|
426
|
-
createTask("D", "C"),
|
|
427
|
-
createTask("E", "D"), // Level 4, exceeds max
|
|
428
|
-
createTask("F", "nonexistent"), // Orphaned
|
|
429
|
-
];
|
|
430
|
-
const result = validateHierarchy(tasks);
|
|
431
|
-
expect(result.valid).toBe(false);
|
|
432
|
-
expect(result.orphanedReferences.length).toBeGreaterThan(0);
|
|
433
|
-
expect(result.maxDepthExceeded.length).toBeGreaterThan(0);
|
|
434
|
-
});
|
|
435
|
-
});
|
|
436
|
-
//# sourceMappingURL=hierarchy.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchy.test.js","sourceRoot":"","sources":["../../src/utils/hierarchy.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/id.d.ts
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generate a unique ID with optional prefix.
|
|
3
|
-
* Uses crypto.randomUUID for secure, collision-resistant ID generation.
|
|
4
|
-
*/
|
|
5
|
-
export declare function generateId(prefix?: string): string;
|
|
6
|
-
/**
|
|
7
|
-
* Generate a task ID
|
|
8
|
-
*/
|
|
9
|
-
export declare function generateTaskId(): string;
|
|
10
|
-
/**
|
|
11
|
-
* Generate a view ID
|
|
12
|
-
*/
|
|
13
|
-
export declare function generateViewId(): string;
|
|
14
|
-
/**
|
|
15
|
-
* Validate a task ID format
|
|
16
|
-
* @returns true if valid format (task_[alphanumeric])
|
|
17
|
-
*/
|
|
18
|
-
export declare function isValidTaskId(id: string): boolean;
|
|
19
|
-
/**
|
|
20
|
-
* Generate an inbox item ID
|
|
21
|
-
*/
|
|
22
|
-
export declare function generateInboxId(): string;
|
|
23
|
-
/**
|
|
24
|
-
* Validate an inbox ID format
|
|
25
|
-
* @returns true if valid format (inbox_[alphanumeric])
|
|
26
|
-
*/
|
|
27
|
-
export declare function isValidInboxId(id: string): boolean;
|
|
28
|
-
/**
|
|
29
|
-
* ID validation error with detailed context
|
|
30
|
-
*/
|
|
31
|
-
export declare class InvalidIdError extends Error {
|
|
32
|
-
readonly idType: "task" | "inbox" | "view";
|
|
33
|
-
readonly invalidValue: unknown;
|
|
34
|
-
readonly reason: string;
|
|
35
|
-
constructor(idType: "task" | "inbox" | "view", invalidValue: unknown, reason: string);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Validation result with reason if invalid
|
|
39
|
-
*/
|
|
40
|
-
export interface IdValidationResult {
|
|
41
|
-
valid: boolean;
|
|
42
|
-
reason?: string;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Validate task ID with detailed error information
|
|
46
|
-
*/
|
|
47
|
-
export declare function validateTaskId(id: unknown): IdValidationResult;
|
|
48
|
-
/**
|
|
49
|
-
* Validate inbox ID with detailed error information
|
|
50
|
-
*/
|
|
51
|
-
export declare function validateInboxId(id: unknown): IdValidationResult;
|
|
52
|
-
/**
|
|
53
|
-
* Assert valid task ID, throw if invalid
|
|
54
|
-
*/
|
|
55
|
-
export declare function assertValidTaskId(id: unknown): asserts id is string;
|
|
56
|
-
/**
|
|
57
|
-
* Assert valid inbox ID, throw if invalid
|
|
58
|
-
*/
|
|
59
|
-
export declare function assertValidInboxId(id: unknown): asserts id is string;
|
|
60
|
-
//# sourceMappingURL=id.d.ts.map
|
package/dist/utils/id.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAKtD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;aAErB,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM;aACjC,YAAY,EAAE,OAAO;aACrB,MAAM,EAAE,MAAM;gBAFd,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EACjC,YAAY,EAAE,OAAO,EACrB,MAAM,EAAE,MAAM;CAKjC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,kBAAkB,CAiB9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,kBAAkB,CAiB/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,EAAE,IAAI,MAAM,CAKnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,EAAE,IAAI,MAAM,CAKpE"}
|
package/dist/utils/id.js
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generate a unique ID with optional prefix.
|
|
3
|
-
* Uses crypto.randomUUID for secure, collision-resistant ID generation.
|
|
4
|
-
*/
|
|
5
|
-
export function generateId(prefix = "") {
|
|
6
|
-
// Use crypto.randomUUID for better randomness and collision resistance
|
|
7
|
-
// Format: prefix_xxxxxxxxxxxx (12 chars from UUID, sufficient for local uniqueness)
|
|
8
|
-
const uuid = crypto.randomUUID().replace(/-/g, "").slice(0, 12);
|
|
9
|
-
return prefix ? `${prefix}_${uuid}` : uuid;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Generate a task ID
|
|
13
|
-
*/
|
|
14
|
-
export function generateTaskId() {
|
|
15
|
-
return generateId("task");
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Generate a view ID
|
|
19
|
-
*/
|
|
20
|
-
export function generateViewId() {
|
|
21
|
-
return generateId("view");
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Validate a task ID format
|
|
25
|
-
* @returns true if valid format (task_[alphanumeric])
|
|
26
|
-
*/
|
|
27
|
-
export function isValidTaskId(id) {
|
|
28
|
-
return /^task_[a-z0-9]+$/.test(id);
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Generate an inbox item ID
|
|
32
|
-
*/
|
|
33
|
-
export function generateInboxId() {
|
|
34
|
-
return generateId("inbox");
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Validate an inbox ID format
|
|
38
|
-
* @returns true if valid format (inbox_[alphanumeric])
|
|
39
|
-
*/
|
|
40
|
-
export function isValidInboxId(id) {
|
|
41
|
-
return /^inbox_[a-z0-9]+$/.test(id);
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* ID validation error with detailed context
|
|
45
|
-
*/
|
|
46
|
-
export class InvalidIdError extends Error {
|
|
47
|
-
idType;
|
|
48
|
-
invalidValue;
|
|
49
|
-
reason;
|
|
50
|
-
constructor(idType, invalidValue, reason) {
|
|
51
|
-
super(`Invalid ${idType} ID: ${reason}`);
|
|
52
|
-
this.idType = idType;
|
|
53
|
-
this.invalidValue = invalidValue;
|
|
54
|
-
this.reason = reason;
|
|
55
|
-
this.name = "InvalidIdError";
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Validate task ID with detailed error information
|
|
60
|
-
*/
|
|
61
|
-
export function validateTaskId(id) {
|
|
62
|
-
if (id === null || id === undefined) {
|
|
63
|
-
return { valid: false, reason: "Task ID is required" };
|
|
64
|
-
}
|
|
65
|
-
if (typeof id !== "string") {
|
|
66
|
-
return { valid: false, reason: `Task ID must be a string (received ${typeof id})` };
|
|
67
|
-
}
|
|
68
|
-
if (id.length === 0) {
|
|
69
|
-
return { valid: false, reason: "Task ID cannot be empty" };
|
|
70
|
-
}
|
|
71
|
-
if (!id.startsWith("task_")) {
|
|
72
|
-
return { valid: false, reason: "Task ID must start with 'task_' prefix" };
|
|
73
|
-
}
|
|
74
|
-
if (!/^task_[a-z0-9]+$/.test(id)) {
|
|
75
|
-
return { valid: false, reason: "Task ID contains invalid characters" };
|
|
76
|
-
}
|
|
77
|
-
return { valid: true };
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Validate inbox ID with detailed error information
|
|
81
|
-
*/
|
|
82
|
-
export function validateInboxId(id) {
|
|
83
|
-
if (id === null || id === undefined) {
|
|
84
|
-
return { valid: false, reason: "Inbox ID is required" };
|
|
85
|
-
}
|
|
86
|
-
if (typeof id !== "string") {
|
|
87
|
-
return { valid: false, reason: `Inbox ID must be a string (received ${typeof id})` };
|
|
88
|
-
}
|
|
89
|
-
if (id.length === 0) {
|
|
90
|
-
return { valid: false, reason: "Inbox ID cannot be empty" };
|
|
91
|
-
}
|
|
92
|
-
if (!id.startsWith("inbox_")) {
|
|
93
|
-
return { valid: false, reason: "Inbox ID must start with 'inbox_' prefix" };
|
|
94
|
-
}
|
|
95
|
-
if (!/^inbox_[a-z0-9]+$/.test(id)) {
|
|
96
|
-
return { valid: false, reason: "Inbox ID contains invalid characters" };
|
|
97
|
-
}
|
|
98
|
-
return { valid: true };
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Assert valid task ID, throw if invalid
|
|
102
|
-
*/
|
|
103
|
-
export function assertValidTaskId(id) {
|
|
104
|
-
const result = validateTaskId(id);
|
|
105
|
-
if (!result.valid) {
|
|
106
|
-
throw new InvalidIdError("task", id, result.reason);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Assert valid inbox ID, throw if invalid
|
|
111
|
-
*/
|
|
112
|
-
export function assertValidInboxId(id) {
|
|
113
|
-
const result = validateInboxId(id);
|
|
114
|
-
if (!result.valid) {
|
|
115
|
-
throw new InvalidIdError("inbox", id, result.reason);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=id.js.map
|
package/dist/utils/id.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"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"}
|