@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,329 +0,0 @@
1
- import { describe, test, expect } from "bun:test";
2
- import {
3
- now,
4
- parseRelativeDate,
5
- parseRelativeDateSafe,
6
- parseDateString,
7
- formatDate,
8
- formatDisplayDate,
9
- isToday,
10
- isPastDue,
11
- isWithinDays,
12
- isValidDate,
13
- DateParseError,
14
- } from "./date.js";
15
-
16
- describe("now", () => {
17
- test("returns ISO timestamp string", () => {
18
- const result = now();
19
- expect(typeof result).toBe("string");
20
- expect(result).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/);
21
- });
22
-
23
- test("returns current time within tolerance", () => {
24
- const before = Date.now();
25
- const result = now();
26
- const after = Date.now();
27
-
28
- const resultTime = new Date(result).getTime();
29
- expect(resultTime).toBeGreaterThanOrEqual(before);
30
- expect(resultTime).toBeLessThanOrEqual(after);
31
- });
32
- });
33
-
34
- describe("parseRelativeDate", () => {
35
- test("parses 'today'", () => {
36
- const result = parseRelativeDate("today");
37
- expect(result).not.toBeNull();
38
- const today = new Date();
39
- expect(result!.getDate()).toBe(today.getDate());
40
- });
41
-
42
- test("parses '오늘' (Korean today)", () => {
43
- const result = parseRelativeDate("오늘");
44
- expect(result).not.toBeNull();
45
- const today = new Date();
46
- expect(result!.getDate()).toBe(today.getDate());
47
- });
48
-
49
- test("parses 'tomorrow'", () => {
50
- const result = parseRelativeDate("tomorrow");
51
- expect(result).not.toBeNull();
52
- const tomorrow = new Date();
53
- tomorrow.setDate(tomorrow.getDate() + 1);
54
- expect(result!.getDate()).toBe(tomorrow.getDate());
55
- });
56
-
57
- test("parses '내일' (Korean tomorrow)", () => {
58
- const result = parseRelativeDate("내일");
59
- expect(result).not.toBeNull();
60
- const tomorrow = new Date();
61
- tomorrow.setDate(tomorrow.getDate() + 1);
62
- expect(result!.getDate()).toBe(tomorrow.getDate());
63
- });
64
-
65
- test("parses 'yesterday'", () => {
66
- const result = parseRelativeDate("yesterday");
67
- expect(result).not.toBeNull();
68
- const yesterday = new Date();
69
- yesterday.setDate(yesterday.getDate() - 1);
70
- expect(result!.getDate()).toBe(yesterday.getDate());
71
- });
72
-
73
- test("parses 'next week'", () => {
74
- const result = parseRelativeDate("next week");
75
- expect(result).not.toBeNull();
76
- const nextWeek = new Date();
77
- nextWeek.setDate(nextWeek.getDate() + 7);
78
- expect(result!.getDate()).toBe(nextWeek.getDate());
79
- });
80
-
81
- test("parses 'in 3 days'", () => {
82
- const result = parseRelativeDate("in 3 days");
83
- expect(result).not.toBeNull();
84
- const future = new Date();
85
- future.setDate(future.getDate() + 3);
86
- expect(result!.getDate()).toBe(future.getDate());
87
- });
88
-
89
- test("parses '5일 후' (Korean days later)", () => {
90
- const result = parseRelativeDate("5일 후");
91
- expect(result).not.toBeNull();
92
- const future = new Date();
93
- future.setDate(future.getDate() + 5);
94
- expect(result!.getDate()).toBe(future.getDate());
95
- });
96
-
97
- test("parses weekday names", () => {
98
- const result = parseRelativeDate("monday");
99
- expect(result).not.toBeNull();
100
- expect(result!.getDay()).toBe(1); // Monday = 1
101
- });
102
-
103
- test("parses ISO date string", () => {
104
- const result = parseRelativeDate("2025-12-31");
105
- expect(result).not.toBeNull();
106
- expect(result!.getFullYear()).toBe(2025);
107
- expect(result!.getMonth()).toBe(11); // December = 11
108
- expect(result!.getDate()).toBe(31);
109
- });
110
-
111
- test("returns null for invalid input", () => {
112
- const result = parseRelativeDate("invalid date string");
113
- expect(result).toBeNull();
114
- });
115
- });
116
-
117
- describe("parseRelativeDateSafe", () => {
118
- test("returns success result for valid date", () => {
119
- const result = parseRelativeDateSafe("tomorrow");
120
- expect(result.success).toBe(true);
121
- if (result.success === true) {
122
- const tomorrow = new Date();
123
- tomorrow.setDate(tomorrow.getDate() + 1);
124
- expect(result.date.getDate()).toBe(tomorrow.getDate());
125
- }
126
- });
127
-
128
- test("returns error for empty input", () => {
129
- const result = parseRelativeDateSafe("");
130
- expect(result.success).toBe(false);
131
- if (result.success === false) {
132
- expect(result.reason).toBe("empty_input");
133
- expect(result.error).toContain("empty");
134
- }
135
- });
136
-
137
- test("returns error for whitespace-only input", () => {
138
- const result = parseRelativeDateSafe(" ");
139
- expect(result.success).toBe(false);
140
- if (result.success === false) {
141
- expect(result.reason).toBe("empty_input");
142
- }
143
- });
144
-
145
- test("returns error for invalid date format", () => {
146
- const result = parseRelativeDateSafe("not a date");
147
- expect(result.success).toBe(false);
148
- if (result.success === false) {
149
- expect(result.reason).toBe("invalid_format");
150
- expect(result.error).toContain("Supported formats");
151
- }
152
- });
153
-
154
- test("returns error for malformed ISO date", () => {
155
- const result = parseRelativeDateSafe("2025-1-5");
156
- expect(result.success).toBe(false);
157
- if (result.success === false) {
158
- expect(result.reason).toBe("invalid_format");
159
- expect(result.error).toContain("zero-padded");
160
- }
161
- });
162
-
163
- test("returns error for invalid date like Feb 30", () => {
164
- const result = parseRelativeDateSafe("2025-02-30");
165
- expect(result.success).toBe(false);
166
- if (result.success === false) {
167
- expect(result.reason).toBe("invalid_date");
168
- expect(result.error).toContain("February 30");
169
- }
170
- });
171
-
172
- test("returns error for year out of range", () => {
173
- const result = parseRelativeDateSafe("1800-01-01");
174
- expect(result.success).toBe(false);
175
- if (result.success === false) {
176
- expect(result.reason).toBe("out_of_range");
177
- expect(result.error).toContain("1900-2100");
178
- }
179
- });
180
-
181
- test("returns error for excessive day offset", () => {
182
- const result = parseRelativeDateSafe("in 5000 days");
183
- expect(result.success).toBe(false);
184
- if (result.success === false) {
185
- expect(result.reason).toBe("out_of_range");
186
- expect(result.error).toContain("3650");
187
- }
188
- });
189
- });
190
-
191
- describe("isValidDate", () => {
192
- test("returns true for valid Date", () => {
193
- expect(isValidDate(new Date())).toBe(true);
194
- expect(isValidDate(new Date("2025-01-01"))).toBe(true);
195
- });
196
-
197
- test("returns false for Invalid Date", () => {
198
- expect(isValidDate(new Date("invalid"))).toBe(false);
199
- expect(isValidDate(new Date(NaN))).toBe(false);
200
- });
201
- });
202
-
203
- describe("parseDateString", () => {
204
- test("parses valid date string", () => {
205
- const result = parseDateString("2025-01-15");
206
- expect(result).toBeInstanceOf(Date);
207
- expect(result.getFullYear()).toBe(2025);
208
- });
209
-
210
- test("throws DateParseError for empty string", () => {
211
- expect(() => parseDateString("")).toThrow(DateParseError);
212
- try {
213
- parseDateString("");
214
- } catch (e) {
215
- expect(e).toBeInstanceOf(DateParseError);
216
- expect((e as DateParseError).reason).toBe("empty_input");
217
- }
218
- });
219
-
220
- test("throws DateParseError for invalid string", () => {
221
- expect(() => parseDateString("not a date")).toThrow(DateParseError);
222
- try {
223
- parseDateString("not a date");
224
- } catch (e) {
225
- expect(e).toBeInstanceOf(DateParseError);
226
- expect((e as DateParseError).reason).toBe("invalid_format");
227
- expect((e as DateParseError).input).toBe("not a date");
228
- }
229
- });
230
- });
231
-
232
- describe("formatDisplayDate error handling", () => {
233
- test("throws DateParseError for invalid string", () => {
234
- expect(() => formatDisplayDate("invalid")).toThrow(DateParseError);
235
- });
236
-
237
- test("throws DateParseError for Invalid Date object", () => {
238
- expect(() => formatDisplayDate(new Date("invalid"))).toThrow(DateParseError);
239
- });
240
-
241
- test("formats valid string date", () => {
242
- const result = formatDisplayDate("2025-06-15");
243
- expect(typeof result).toBe("string");
244
- expect(result).toMatch(/\d+\/\d+\/\d+/);
245
- });
246
- });
247
-
248
- describe("formatDate", () => {
249
- test("formats date as YYYY-MM-DD", () => {
250
- const date = new Date("2025-06-15T10:30:00");
251
- expect(formatDate(date)).toBe("2025-06-15");
252
- });
253
- });
254
-
255
- describe("isToday", () => {
256
- test("returns true for today", () => {
257
- expect(isToday(new Date())).toBe(true);
258
- });
259
-
260
- test("returns false for tomorrow", () => {
261
- const tomorrow = new Date();
262
- tomorrow.setDate(tomorrow.getDate() + 1);
263
- expect(isToday(tomorrow)).toBe(false);
264
- });
265
-
266
- test("accepts string input", () => {
267
- expect(isToday(new Date().toISOString())).toBe(true);
268
- });
269
-
270
- test("returns false for invalid date string", () => {
271
- expect(isToday("invalid")).toBe(false);
272
- });
273
-
274
- test("returns false for Invalid Date object", () => {
275
- expect(isToday(new Date("invalid"))).toBe(false);
276
- });
277
- });
278
-
279
- describe("isPastDue", () => {
280
- test("returns true for yesterday", () => {
281
- const yesterday = new Date();
282
- yesterday.setDate(yesterday.getDate() - 1);
283
- expect(isPastDue(yesterday)).toBe(true);
284
- });
285
-
286
- test("returns false for tomorrow", () => {
287
- const tomorrow = new Date();
288
- tomorrow.setDate(tomorrow.getDate() + 1);
289
- expect(isPastDue(tomorrow)).toBe(false);
290
- });
291
-
292
- test("returns false for invalid date", () => {
293
- expect(isPastDue("invalid")).toBe(false);
294
- expect(isPastDue(new Date("invalid"))).toBe(false);
295
- });
296
- });
297
-
298
- describe("isWithinDays", () => {
299
- test("returns true for date within range", () => {
300
- const inThreeDays = new Date();
301
- inThreeDays.setDate(inThreeDays.getDate() + 3);
302
- expect(isWithinDays(inThreeDays, 7)).toBe(true);
303
- });
304
-
305
- test("returns false for date outside range", () => {
306
- const inTenDays = new Date();
307
- inTenDays.setDate(inTenDays.getDate() + 10);
308
- expect(isWithinDays(inTenDays, 7)).toBe(false);
309
- });
310
-
311
- test("returns false for past date", () => {
312
- const yesterday = new Date();
313
- yesterday.setDate(yesterday.getDate() - 1);
314
- expect(isWithinDays(yesterday, 7)).toBe(false);
315
- });
316
-
317
- test("returns false for invalid date", () => {
318
- expect(isWithinDays("invalid", 7)).toBe(false);
319
- expect(isWithinDays(new Date("invalid"), 7)).toBe(false);
320
- });
321
-
322
- test("returns false for invalid days parameter", () => {
323
- const tomorrow = new Date();
324
- tomorrow.setDate(tomorrow.getDate() + 1);
325
- expect(isWithinDays(tomorrow, -1)).toBe(false);
326
- expect(isWithinDays(tomorrow, NaN)).toBe(false);
327
- expect(isWithinDays(tomorrow, Infinity)).toBe(false);
328
- });
329
- });