@task-mcp/shared 1.0.4 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/algorithms/critical-path.d.ts.map +1 -1
- package/dist/algorithms/critical-path.js +50 -26
- package/dist/algorithms/critical-path.js.map +1 -1
- package/dist/algorithms/dependency-integrity.d.ts +73 -0
- package/dist/algorithms/dependency-integrity.d.ts.map +1 -0
- package/dist/algorithms/dependency-integrity.js +189 -0
- package/dist/algorithms/dependency-integrity.js.map +1 -0
- package/dist/algorithms/index.d.ts +2 -0
- package/dist/algorithms/index.d.ts.map +1 -1
- package/dist/algorithms/index.js +2 -0
- package/dist/algorithms/index.js.map +1 -1
- package/dist/algorithms/tech-analysis.d.ts +106 -0
- package/dist/algorithms/tech-analysis.d.ts.map +1 -0
- package/dist/algorithms/tech-analysis.js +296 -0
- package/dist/algorithms/tech-analysis.js.map +1 -0
- package/dist/algorithms/tech-analysis.test.d.ts +2 -0
- package/dist/algorithms/tech-analysis.test.d.ts.map +1 -0
- package/dist/algorithms/tech-analysis.test.js +338 -0
- package/dist/algorithms/tech-analysis.test.js.map +1 -0
- package/dist/algorithms/topological-sort.d.ts.map +1 -1
- package/dist/algorithms/topological-sort.js +60 -8
- package/dist/algorithms/topological-sort.js.map +1 -1
- package/dist/schemas/inbox.d.ts +55 -0
- package/dist/schemas/inbox.d.ts.map +1 -0
- package/dist/schemas/inbox.js +25 -0
- package/dist/schemas/inbox.js.map +1 -0
- package/dist/schemas/index.d.ts +3 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +9 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/project.d.ts +154 -41
- package/dist/schemas/project.d.ts.map +1 -1
- package/dist/schemas/project.js +38 -33
- package/dist/schemas/project.js.map +1 -1
- package/dist/schemas/response-format.d.ts +80 -0
- package/dist/schemas/response-format.d.ts.map +1 -0
- package/dist/schemas/response-format.js +17 -0
- package/dist/schemas/response-format.js.map +1 -0
- package/dist/schemas/task.d.ts +592 -94
- package/dist/schemas/task.d.ts.map +1 -1
- package/dist/schemas/task.js +124 -64
- package/dist/schemas/task.js.map +1 -1
- package/dist/schemas/view.d.ts +128 -37
- package/dist/schemas/view.d.ts.map +1 -1
- package/dist/schemas/view.js +38 -24
- package/dist/schemas/view.js.map +1 -1
- package/dist/utils/date.d.ts.map +1 -1
- package/dist/utils/date.js +17 -2
- package/dist/utils/date.js.map +1 -1
- package/dist/utils/hierarchy.d.ts +75 -0
- package/dist/utils/hierarchy.d.ts.map +1 -0
- package/dist/utils/hierarchy.js +179 -0
- package/dist/utils/hierarchy.js.map +1 -0
- package/dist/utils/id.d.ts +51 -1
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +124 -4
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/id.test.d.ts +2 -0
- package/dist/utils/id.test.d.ts.map +1 -0
- package/dist/utils/id.test.js +228 -0
- package/dist/utils/id.test.js.map +1 -0
- package/dist/utils/index.d.ts +4 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +7 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/natural-language.d.ts +45 -0
- package/dist/utils/natural-language.d.ts.map +1 -1
- package/dist/utils/natural-language.js +86 -0
- package/dist/utils/natural-language.js.map +1 -1
- package/dist/utils/projection.d.ts +65 -0
- package/dist/utils/projection.d.ts.map +1 -0
- package/dist/utils/projection.js +181 -0
- package/dist/utils/projection.js.map +1 -0
- package/dist/utils/projection.test.d.ts +2 -0
- package/dist/utils/projection.test.d.ts.map +1 -0
- package/dist/utils/projection.test.js +400 -0
- package/dist/utils/projection.test.js.map +1 -0
- package/package.json +2 -2
- package/src/algorithms/critical-path.ts +56 -24
- package/src/algorithms/dependency-integrity.ts +270 -0
- package/src/algorithms/index.ts +28 -0
- package/src/algorithms/tech-analysis.test.ts +413 -0
- package/src/algorithms/tech-analysis.ts +412 -0
- package/src/algorithms/topological-sort.ts +66 -9
- package/src/schemas/inbox.ts +32 -0
- package/src/schemas/index.ts +31 -0
- package/src/schemas/project.ts +43 -40
- package/src/schemas/response-format.ts +108 -0
- package/src/schemas/task.ts +145 -77
- package/src/schemas/view.ts +43 -33
- package/src/utils/date.ts +18 -2
- package/src/utils/hierarchy.ts +224 -0
- package/src/utils/id.test.ts +281 -0
- package/src/utils/id.ts +139 -4
- package/src/utils/index.ts +46 -2
- package/src/utils/natural-language.ts +113 -0
- package/src/utils/projection.test.ts +505 -0
- package/src/utils/projection.ts +251 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { describe, test, expect } from "bun:test";
|
|
2
|
+
import { generateId, generateTaskId, generateProjectId, generateInboxId, isValidTaskId, isValidProjectId, isValidInboxId, validateTaskId, validateProjectId, validateInboxId, assertValidTaskId, assertValidProjectId, assertValidInboxId, InvalidIdError, } from "./id.js";
|
|
3
|
+
describe("ID Generation", () => {
|
|
4
|
+
describe("generateId", () => {
|
|
5
|
+
test("generates ID without prefix", () => {
|
|
6
|
+
const id = generateId();
|
|
7
|
+
expect(id.length).toBe(12);
|
|
8
|
+
expect(/^[a-z0-9]+$/.test(id)).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
test("generates ID with prefix", () => {
|
|
11
|
+
const id = generateId("test");
|
|
12
|
+
expect(id).toMatch(/^test_[a-z0-9]+$/);
|
|
13
|
+
});
|
|
14
|
+
test("generates unique IDs", () => {
|
|
15
|
+
const ids = new Set(Array.from({ length: 100 }, () => generateId("test")));
|
|
16
|
+
expect(ids.size).toBe(100);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
describe("generateTaskId", () => {
|
|
20
|
+
test("generates task ID with correct prefix", () => {
|
|
21
|
+
const id = generateTaskId();
|
|
22
|
+
expect(id).toMatch(/^task_[a-z0-9]+$/);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe("generateProjectId", () => {
|
|
26
|
+
test("generates project ID with correct prefix", () => {
|
|
27
|
+
const id = generateProjectId();
|
|
28
|
+
expect(id).toMatch(/^proj_[a-z0-9]+$/);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe("generateInboxId", () => {
|
|
32
|
+
test("generates inbox ID with correct prefix", () => {
|
|
33
|
+
const id = generateInboxId();
|
|
34
|
+
expect(id).toMatch(/^inbox_[a-z0-9]+$/);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe("Simple ID Validation (boolean)", () => {
|
|
39
|
+
describe("isValidTaskId", () => {
|
|
40
|
+
test("returns true for valid task IDs", () => {
|
|
41
|
+
expect(isValidTaskId("task_abc123")).toBe(true);
|
|
42
|
+
expect(isValidTaskId("task_a")).toBe(true);
|
|
43
|
+
expect(isValidTaskId("task_123")).toBe(true);
|
|
44
|
+
expect(isValidTaskId("task_abc123def456")).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
test("returns false for invalid task IDs", () => {
|
|
47
|
+
expect(isValidTaskId("")).toBe(false);
|
|
48
|
+
expect(isValidTaskId("task_")).toBe(false);
|
|
49
|
+
expect(isValidTaskId("abc123")).toBe(false);
|
|
50
|
+
expect(isValidTaskId("proj_abc123")).toBe(false);
|
|
51
|
+
expect(isValidTaskId("task_ABC123")).toBe(false);
|
|
52
|
+
expect(isValidTaskId("task_abc-123")).toBe(false);
|
|
53
|
+
expect(isValidTaskId("task_abc.123")).toBe(false);
|
|
54
|
+
expect(isValidTaskId("task_abc/123")).toBe(false);
|
|
55
|
+
expect(isValidTaskId("task_abc 123")).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe("isValidProjectId", () => {
|
|
59
|
+
test("returns true for valid project IDs", () => {
|
|
60
|
+
expect(isValidProjectId("proj_abc123")).toBe(true);
|
|
61
|
+
expect(isValidProjectId("proj_a")).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
test("returns false for invalid project IDs", () => {
|
|
64
|
+
expect(isValidProjectId("")).toBe(false);
|
|
65
|
+
expect(isValidProjectId("project_abc123")).toBe(false);
|
|
66
|
+
expect(isValidProjectId("task_abc123")).toBe(false);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("isValidInboxId", () => {
|
|
70
|
+
test("returns true for valid inbox IDs", () => {
|
|
71
|
+
expect(isValidInboxId("inbox_abc123")).toBe(true);
|
|
72
|
+
expect(isValidInboxId("inbox_a")).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
test("returns false for invalid inbox IDs", () => {
|
|
75
|
+
expect(isValidInboxId("")).toBe(false);
|
|
76
|
+
expect(isValidInboxId("in_abc123")).toBe(false);
|
|
77
|
+
expect(isValidInboxId("task_abc123")).toBe(false);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe("Detailed ID Validation", () => {
|
|
82
|
+
describe("validateTaskId", () => {
|
|
83
|
+
test("returns valid: true for valid task IDs", () => {
|
|
84
|
+
expect(validateTaskId("task_abc123")).toEqual({ valid: true });
|
|
85
|
+
expect(validateTaskId("task_a1b2c3")).toEqual({ valid: true });
|
|
86
|
+
});
|
|
87
|
+
test("returns error for null/undefined", () => {
|
|
88
|
+
const result = validateTaskId(null);
|
|
89
|
+
expect(result.valid).toBe(false);
|
|
90
|
+
expect(result.reason).toContain("required");
|
|
91
|
+
const result2 = validateTaskId(undefined);
|
|
92
|
+
expect(result2.valid).toBe(false);
|
|
93
|
+
});
|
|
94
|
+
test("returns error for non-string", () => {
|
|
95
|
+
const result = validateTaskId(123);
|
|
96
|
+
expect(result.valid).toBe(false);
|
|
97
|
+
expect(result.reason).toContain("string");
|
|
98
|
+
expect(result.reason).toContain("number");
|
|
99
|
+
});
|
|
100
|
+
test("returns error for empty string", () => {
|
|
101
|
+
const result = validateTaskId("");
|
|
102
|
+
expect(result.valid).toBe(false);
|
|
103
|
+
expect(result.reason).toContain("empty");
|
|
104
|
+
});
|
|
105
|
+
test("returns error for missing prefix", () => {
|
|
106
|
+
const result = validateTaskId("abc123");
|
|
107
|
+
expect(result.valid).toBe(false);
|
|
108
|
+
expect(result.reason).toContain("task_");
|
|
109
|
+
});
|
|
110
|
+
test("returns error for wrong prefix", () => {
|
|
111
|
+
const result = validateTaskId("proj_abc123");
|
|
112
|
+
expect(result.valid).toBe(false);
|
|
113
|
+
expect(result.reason).toContain("task_");
|
|
114
|
+
});
|
|
115
|
+
test("returns error for invalid characters", () => {
|
|
116
|
+
const result = validateTaskId("task_abc-123");
|
|
117
|
+
expect(result.valid).toBe(false);
|
|
118
|
+
expect(result.reason).toContain("invalid characters");
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe("validateProjectId", () => {
|
|
122
|
+
test("returns valid: true for valid project IDs", () => {
|
|
123
|
+
expect(validateProjectId("proj_abc123")).toEqual({ valid: true });
|
|
124
|
+
});
|
|
125
|
+
test("returns error for missing prefix", () => {
|
|
126
|
+
const result = validateProjectId("project_abc");
|
|
127
|
+
expect(result.valid).toBe(false);
|
|
128
|
+
expect(result.reason).toContain("proj_");
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe("validateInboxId", () => {
|
|
132
|
+
test("returns valid: true for valid inbox IDs", () => {
|
|
133
|
+
expect(validateInboxId("inbox_abc123")).toEqual({ valid: true });
|
|
134
|
+
});
|
|
135
|
+
test("returns error for missing prefix", () => {
|
|
136
|
+
const result = validateInboxId("in_abc");
|
|
137
|
+
expect(result.valid).toBe(false);
|
|
138
|
+
expect(result.reason).toContain("inbox_");
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
describe("Assert Functions", () => {
|
|
143
|
+
describe("assertValidTaskId", () => {
|
|
144
|
+
test("does not throw for valid ID", () => {
|
|
145
|
+
expect(() => assertValidTaskId("task_abc123")).not.toThrow();
|
|
146
|
+
});
|
|
147
|
+
test("throws InvalidIdError for invalid ID", () => {
|
|
148
|
+
expect(() => assertValidTaskId("")).toThrow(InvalidIdError);
|
|
149
|
+
expect(() => assertValidTaskId("abc123")).toThrow(InvalidIdError);
|
|
150
|
+
expect(() => assertValidTaskId(null)).toThrow(InvalidIdError);
|
|
151
|
+
});
|
|
152
|
+
test("InvalidIdError contains correct properties", () => {
|
|
153
|
+
try {
|
|
154
|
+
assertValidTaskId("invalid");
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
expect(error).toBeInstanceOf(InvalidIdError);
|
|
158
|
+
if (error instanceof InvalidIdError) {
|
|
159
|
+
expect(error.idType).toBe("task");
|
|
160
|
+
expect(error.invalidValue).toBe("invalid");
|
|
161
|
+
expect(error.reason).toBeDefined();
|
|
162
|
+
expect(error.message).toContain("task");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
describe("assertValidProjectId", () => {
|
|
168
|
+
test("does not throw for valid ID", () => {
|
|
169
|
+
expect(() => assertValidProjectId("proj_abc123")).not.toThrow();
|
|
170
|
+
});
|
|
171
|
+
test("throws InvalidIdError for invalid ID", () => {
|
|
172
|
+
expect(() => assertValidProjectId("project_abc")).toThrow(InvalidIdError);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe("assertValidInboxId", () => {
|
|
176
|
+
test("does not throw for valid ID", () => {
|
|
177
|
+
expect(() => assertValidInboxId("inbox_abc123")).not.toThrow();
|
|
178
|
+
});
|
|
179
|
+
test("throws InvalidIdError for invalid ID", () => {
|
|
180
|
+
expect(() => assertValidInboxId("in_abc")).toThrow(InvalidIdError);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
describe("InvalidIdError", () => {
|
|
185
|
+
test("extends Error", () => {
|
|
186
|
+
const error = new InvalidIdError("task", "bad_id", "test reason");
|
|
187
|
+
expect(error).toBeInstanceOf(Error);
|
|
188
|
+
expect(error).toBeInstanceOf(InvalidIdError);
|
|
189
|
+
});
|
|
190
|
+
test("has correct name", () => {
|
|
191
|
+
const error = new InvalidIdError("task", "bad_id", "test reason");
|
|
192
|
+
expect(error.name).toBe("InvalidIdError");
|
|
193
|
+
});
|
|
194
|
+
test("has correct message format", () => {
|
|
195
|
+
const error = new InvalidIdError("task", "bad_id", "test reason");
|
|
196
|
+
expect(error.message).toBe("Invalid task ID: test reason");
|
|
197
|
+
});
|
|
198
|
+
test("exposes idType, invalidValue, and reason", () => {
|
|
199
|
+
const error = new InvalidIdError("project", "wrong", "missing prefix");
|
|
200
|
+
expect(error.idType).toBe("project");
|
|
201
|
+
expect(error.invalidValue).toBe("wrong");
|
|
202
|
+
expect(error.reason).toBe("missing prefix");
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
describe("Security: ID Injection Prevention", () => {
|
|
206
|
+
test("rejects path traversal attempts", () => {
|
|
207
|
+
expect(validateTaskId("task_../etc/passwd").valid).toBe(false);
|
|
208
|
+
expect(validateTaskId("task_..%2F..%2Fetc").valid).toBe(false);
|
|
209
|
+
});
|
|
210
|
+
test("rejects null bytes", () => {
|
|
211
|
+
expect(validateTaskId("task_abc\0def").valid).toBe(false);
|
|
212
|
+
});
|
|
213
|
+
test("rejects SQL injection attempts", () => {
|
|
214
|
+
expect(validateTaskId("task_'; DROP TABLE tasks;--").valid).toBe(false);
|
|
215
|
+
expect(validateTaskId("task_1 OR 1=1").valid).toBe(false);
|
|
216
|
+
});
|
|
217
|
+
test("rejects script injection attempts", () => {
|
|
218
|
+
expect(validateTaskId("task_<script>alert(1)</script>").valid).toBe(false);
|
|
219
|
+
});
|
|
220
|
+
test("only allows safe alphanumeric characters", () => {
|
|
221
|
+
// The regex ^task_[a-z0-9]+$ only allows lowercase letters and numbers
|
|
222
|
+
expect(validateTaskId("task_abc123").valid).toBe(true);
|
|
223
|
+
expect(validateTaskId("task_UPPERCASE").valid).toBe(false);
|
|
224
|
+
expect(validateTaskId("task_with_underscore").valid).toBe(false);
|
|
225
|
+
expect(validateTaskId("task_with-dash").valid).toBe(false);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
//# sourceMappingURL=id.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.test.js","sourceRoot":"","sources":["../../src/utils/id.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
export { generateId, generateTaskId, generateProjectId, generateViewId, isValidProjectId, isValidTaskId } from "./id.js";
|
|
1
|
+
export { generateId, generateTaskId, generateProjectId, generateViewId, isValidProjectId, isValidTaskId, generateInboxId, isValidInboxId, InvalidIdError, type IdValidationResult, validateTaskId, validateProjectId, validateInboxId, assertValidTaskId, assertValidProjectId, assertValidInboxId, } from "./id.js";
|
|
2
2
|
export { now, parseRelativeDate, formatDate, formatDisplayDate, isToday, isPastDue, isWithinDays } from "./date.js";
|
|
3
|
-
export { parseTaskInput } from "./natural-language.js";
|
|
3
|
+
export { parseTaskInput, parseInboxInput, parseInput, type ParseTarget, type ParsedInput } from "./natural-language.js";
|
|
4
|
+
export { MAX_HIERARCHY_DEPTH, getTaskLevel, validateHierarchyDepth, getAncestorIds, getDescendantIds, getChildTasks, getRootTask, buildTaskTree, type TaskTreeNode, } from "./hierarchy.js";
|
|
5
|
+
export { projectTask, projectTasks, projectTasksPaginated, projectProject, projectProjects, projectInboxItem, projectInboxItems, formatResponse, applyPagination, truncate, summarizeList, } from "./projection.js";
|
|
4
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,cAAc,EAEd,cAAc,EACd,KAAK,kBAAkB,EACvB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACxH,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,aAAa,EACb,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,QAAQ,EACR,aAAa,GACd,MAAM,iBAAiB,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
export { generateId, generateTaskId, generateProjectId, generateViewId, isValidProjectId, isValidTaskId
|
|
1
|
+
export { generateId, generateTaskId, generateProjectId, generateViewId, isValidProjectId, isValidTaskId, generateInboxId, isValidInboxId,
|
|
2
|
+
// Validation utilities with detailed error information
|
|
3
|
+
InvalidIdError, validateTaskId, validateProjectId, validateInboxId, assertValidTaskId, assertValidProjectId, assertValidInboxId, } from "./id.js";
|
|
2
4
|
export { now, parseRelativeDate, formatDate, formatDisplayDate, isToday, isPastDue, isWithinDays } from "./date.js";
|
|
3
|
-
export { parseTaskInput } from "./natural-language.js";
|
|
5
|
+
export { parseTaskInput, parseInboxInput, parseInput } from "./natural-language.js";
|
|
6
|
+
export { MAX_HIERARCHY_DEPTH, getTaskLevel, validateHierarchyDepth, getAncestorIds, getDescendantIds, getChildTasks, getRootTask, buildTaskTree, } from "./hierarchy.js";
|
|
7
|
+
// Projection utilities (token optimization)
|
|
8
|
+
export { projectTask, projectTasks, projectTasksPaginated, projectProject, projectProjects, projectInboxItem, projectInboxItems, formatResponse, applyPagination, truncate, summarizeList, } from "./projection.js";
|
|
4
9
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,cAAc;AACd,uDAAuD;AACvD,cAAc,EAEd,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAsC,MAAM,uBAAuB,CAAC;AACxH,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,aAAa,GAEd,MAAM,gBAAgB,CAAC;AAExB,4CAA4C;AAC5C,OAAO,EACL,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,QAAQ,EACR,aAAa,GACd,MAAM,iBAAiB,CAAC"}
|
|
@@ -1,4 +1,49 @@
|
|
|
1
1
|
import type { TaskCreateInput } from "../schemas/task.js";
|
|
2
|
+
import type { InboxCreateInput } from "../schemas/inbox.js";
|
|
3
|
+
/**
|
|
4
|
+
* Maximum allowed input length for natural language parsing.
|
|
5
|
+
* Prevents DoS attacks from extremely long input strings.
|
|
6
|
+
*/
|
|
7
|
+
export declare const MAX_INPUT_LENGTH = 1000;
|
|
8
|
+
/**
|
|
9
|
+
* Error thrown when input validation fails
|
|
10
|
+
*/
|
|
11
|
+
export declare class InputValidationError extends Error {
|
|
12
|
+
constructor(message: string);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Target type for parsed input
|
|
16
|
+
*/
|
|
17
|
+
export type ParseTarget = "task" | "inbox";
|
|
18
|
+
/**
|
|
19
|
+
* Extended parse result with target information
|
|
20
|
+
*/
|
|
21
|
+
export interface ParsedInput {
|
|
22
|
+
target: ParseTarget;
|
|
23
|
+
task?: TaskCreateInput;
|
|
24
|
+
inbox?: InboxCreateInput;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse natural language input with target detection
|
|
28
|
+
*
|
|
29
|
+
* Target keywords:
|
|
30
|
+
* - >>inbox, >>메모, >>아이디어 → capture to inbox
|
|
31
|
+
* - >>task, >>태스크 (default) → create task
|
|
32
|
+
*
|
|
33
|
+
* Examples:
|
|
34
|
+
* - "API 리팩토링 아이디어 >>inbox #backend"
|
|
35
|
+
* - "Review PR tomorrow #dev !high" (default: task)
|
|
36
|
+
* - "새 기능 구상 >>메모"
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseInput(input: string): ParsedInput;
|
|
39
|
+
/**
|
|
40
|
+
* Parse natural language inbox input
|
|
41
|
+
*
|
|
42
|
+
* Examples:
|
|
43
|
+
* - "GraphQL 도입 검토 #backend #연구"
|
|
44
|
+
* - "성능 개선 아이디어 #performance"
|
|
45
|
+
*/
|
|
46
|
+
export declare function parseInboxInput(input: string): InboxCreateInput;
|
|
2
47
|
/**
|
|
3
48
|
* Parse natural language task input
|
|
4
49
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"natural-language.d.ts","sourceRoot":"","sources":["../../src/utils/natural-language.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"natural-language.d.ts","sourceRoot":"","sources":["../../src/utils/natural-language.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D;;;GAGG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAcD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA4BrD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAkB/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CA8F7D"}
|
|
@@ -1,4 +1,89 @@
|
|
|
1
1
|
import { parseRelativeDate, formatDate } from "./date.js";
|
|
2
|
+
/**
|
|
3
|
+
* Maximum allowed input length for natural language parsing.
|
|
4
|
+
* Prevents DoS attacks from extremely long input strings.
|
|
5
|
+
*/
|
|
6
|
+
export const MAX_INPUT_LENGTH = 1000;
|
|
7
|
+
/**
|
|
8
|
+
* Error thrown when input validation fails
|
|
9
|
+
*/
|
|
10
|
+
export class InputValidationError extends Error {
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "InputValidationError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Validates input string length
|
|
18
|
+
* @throws {InputValidationError} if input exceeds MAX_INPUT_LENGTH
|
|
19
|
+
*/
|
|
20
|
+
function validateInputLength(input) {
|
|
21
|
+
if (input.length > MAX_INPUT_LENGTH) {
|
|
22
|
+
throw new InputValidationError(`Input exceeds maximum length of ${MAX_INPUT_LENGTH} characters (received ${input.length})`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse natural language input with target detection
|
|
27
|
+
*
|
|
28
|
+
* Target keywords:
|
|
29
|
+
* - >>inbox, >>메모, >>아이디어 → capture to inbox
|
|
30
|
+
* - >>task, >>태스크 (default) → create task
|
|
31
|
+
*
|
|
32
|
+
* Examples:
|
|
33
|
+
* - "API 리팩토링 아이디어 >>inbox #backend"
|
|
34
|
+
* - "Review PR tomorrow #dev !high" (default: task)
|
|
35
|
+
* - "새 기능 구상 >>메모"
|
|
36
|
+
*/
|
|
37
|
+
export function parseInput(input) {
|
|
38
|
+
validateInputLength(input);
|
|
39
|
+
let remaining = input.trim();
|
|
40
|
+
let target = "task";
|
|
41
|
+
// Detect target keywords (>>inbox, >>task, >>메모, >>아이디어, >>태스크)
|
|
42
|
+
const targetMatch = remaining.match(/>>(inbox|task|메모|아이디어|태스크)/i);
|
|
43
|
+
if (targetMatch) {
|
|
44
|
+
const keyword = targetMatch[1].toLowerCase();
|
|
45
|
+
if (keyword === "inbox" || keyword === "메모" || keyword === "아이디어") {
|
|
46
|
+
target = "inbox";
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
target = "task";
|
|
50
|
+
}
|
|
51
|
+
remaining = remaining.replace(targetMatch[0], "").trim();
|
|
52
|
+
}
|
|
53
|
+
if (target === "inbox") {
|
|
54
|
+
return {
|
|
55
|
+
target: "inbox",
|
|
56
|
+
inbox: parseInboxInput(remaining),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
target: "task",
|
|
61
|
+
task: parseTaskInput(remaining),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Parse natural language inbox input
|
|
66
|
+
*
|
|
67
|
+
* Examples:
|
|
68
|
+
* - "GraphQL 도입 검토 #backend #연구"
|
|
69
|
+
* - "성능 개선 아이디어 #performance"
|
|
70
|
+
*/
|
|
71
|
+
export function parseInboxInput(input) {
|
|
72
|
+
validateInputLength(input);
|
|
73
|
+
let remaining = input.trim();
|
|
74
|
+
const result = { content: "" };
|
|
75
|
+
// Extract tags (#dev, #backend, #개발)
|
|
76
|
+
const tagMatches = remaining.match(/#([\p{L}\p{N}_]+)/gu);
|
|
77
|
+
if (tagMatches) {
|
|
78
|
+
result.tags = tagMatches.map((m) => m.slice(1));
|
|
79
|
+
for (const match of tagMatches) {
|
|
80
|
+
remaining = remaining.replace(match, "").trim();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Clean up and set content
|
|
84
|
+
result.content = remaining.replace(/\s+/g, " ").trim();
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
2
87
|
/**
|
|
3
88
|
* Parse natural language task input
|
|
4
89
|
*
|
|
@@ -9,6 +94,7 @@ import { parseRelativeDate, formatDate } from "./date.js";
|
|
|
9
94
|
* - "Write tests every Monday #testing"
|
|
10
95
|
*/
|
|
11
96
|
export function parseTaskInput(input) {
|
|
97
|
+
validateInputLength(input);
|
|
12
98
|
let remaining = input.trim();
|
|
13
99
|
const result = { title: "" };
|
|
14
100
|
// Extract priority (!high, !critical, !medium, !low, !높음, !보통, !낮음)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"natural-language.js","sourceRoot":"","sources":["../../src/utils/natural-language.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"natural-language.js","sourceRoot":"","sources":["../../src/utils/natural-language.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Projection Utilities
|
|
3
|
+
*
|
|
4
|
+
* Transform full objects into token-efficient projections.
|
|
5
|
+
* Reduces token usage by 70-88% for list operations.
|
|
6
|
+
*/
|
|
7
|
+
import type { Task } from "../schemas/task.js";
|
|
8
|
+
import type { Project } from "../schemas/project.js";
|
|
9
|
+
import type { InboxItem } from "../schemas/inbox.js";
|
|
10
|
+
import type { ResponseFormat, TaskSummary, TaskPreview, ProjectSummary, ProjectPreview, InboxSummary, InboxPreview, PaginatedResponse } from "../schemas/response-format.js";
|
|
11
|
+
/**
|
|
12
|
+
* Project a single task to the specified format
|
|
13
|
+
*/
|
|
14
|
+
export declare function projectTask(task: Task, format: ResponseFormat): TaskSummary | TaskPreview | Task;
|
|
15
|
+
/**
|
|
16
|
+
* Project multiple tasks with optional limit
|
|
17
|
+
*/
|
|
18
|
+
export declare function projectTasks(tasks: Task[], format: ResponseFormat, limit?: number): (TaskSummary | TaskPreview | Task)[];
|
|
19
|
+
/**
|
|
20
|
+
* Project tasks with pagination
|
|
21
|
+
*/
|
|
22
|
+
export declare function projectTasksPaginated(tasks: Task[], format: ResponseFormat, limit?: number, offset?: number): PaginatedResponse<TaskSummary | TaskPreview | Task>;
|
|
23
|
+
/**
|
|
24
|
+
* Project a single project to the specified format
|
|
25
|
+
*/
|
|
26
|
+
export declare function projectProject(project: Project, format: ResponseFormat): ProjectSummary | ProjectPreview | Project;
|
|
27
|
+
/**
|
|
28
|
+
* Project multiple projects with optional limit
|
|
29
|
+
*/
|
|
30
|
+
export declare function projectProjects(projects: Project[], format: ResponseFormat, limit?: number): (ProjectSummary | ProjectPreview | Project)[];
|
|
31
|
+
/**
|
|
32
|
+
* Project a single inbox item to the specified format
|
|
33
|
+
*/
|
|
34
|
+
export declare function projectInboxItem(item: InboxItem, format: ResponseFormat): InboxSummary | InboxPreview | InboxItem;
|
|
35
|
+
/**
|
|
36
|
+
* Project multiple inbox items with optional limit
|
|
37
|
+
*/
|
|
38
|
+
export declare function projectInboxItems(items: InboxItem[], format: ResponseFormat, limit?: number): (InboxSummary | InboxPreview | InboxItem)[];
|
|
39
|
+
/**
|
|
40
|
+
* Format response based on format type
|
|
41
|
+
* - concise/standard: JSON string for machine processing
|
|
42
|
+
* - detailed: Human-readable text
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatResponse<T>(data: T | T[], format: ResponseFormat, detailedFormatter?: (data: T | T[]) => string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Apply pagination parameters
|
|
47
|
+
*/
|
|
48
|
+
export declare function applyPagination<T>(items: T[], limit?: number, offset?: number): {
|
|
49
|
+
items: T[];
|
|
50
|
+
hasMore: boolean;
|
|
51
|
+
total: number;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Truncate string for token efficiency
|
|
55
|
+
*/
|
|
56
|
+
export declare function truncate(str: string, maxLength?: number): string;
|
|
57
|
+
/**
|
|
58
|
+
* Summarize a list of items for token efficiency
|
|
59
|
+
*/
|
|
60
|
+
export declare function summarizeList<T>(items: T[], maxDisplay: number | undefined, getId: (item: T) => string): {
|
|
61
|
+
displayed: T[];
|
|
62
|
+
remaining: number;
|
|
63
|
+
remainingIds: string[];
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../src/utils/projection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,WAAW,EACX,cAAc,EACd,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAGlB,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,GAAG,WAAW,GAAG,WAAW,GAAG,IAAI,CA0BhG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,EAAE,cAAc,EACtB,KAAK,CAAC,EAAE,MAAM,GACb,CAAC,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC,EAAE,CAGtC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,EAAE,cAAc,EACtB,KAAK,GAAE,MAAW,EAClB,MAAM,GAAE,MAAU,GACjB,iBAAiB,CAAC,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC,CAYrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,cAAc,GACrB,cAAc,GAAG,cAAc,GAAG,OAAO,CAuC3C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,cAAc,EACtB,KAAK,CAAC,EAAE,MAAM,GACb,CAAC,cAAc,GAAG,cAAc,GAAG,OAAO,CAAC,EAAE,CAG/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,cAAc,GACrB,YAAY,GAAG,YAAY,GAAG,SAAS,CAsBzC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAAE,EAClB,MAAM,EAAE,cAAc,EACtB,KAAK,CAAC,EAAE,MAAM,GACb,CAAC,YAAY,GAAG,YAAY,GAAG,SAAS,CAAC,EAAE,CAG7C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EACb,MAAM,EAAE,cAAc,EACtB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM,GAC5C,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,GAAE,MAAW,EAClB,MAAM,GAAE,MAAU,GACjB;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAUjD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAGrE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,EAAE,EACV,UAAU,EAAE,MAAM,YAAI,EACtB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GACzB;IAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAS/D"}
|