mcp-taskflow 0.1.0
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/CHANGELOG.md +13 -0
- package/LICENSE.md +21 -0
- package/README.md +275 -0
- package/dist/config/pathResolver.d.ts +33 -0
- package/dist/config/pathResolver.d.ts.map +1 -0
- package/dist/config/pathResolver.js +130 -0
- package/dist/config/pathResolver.js.map +1 -0
- package/dist/data/fileOperations.d.ts +43 -0
- package/dist/data/fileOperations.d.ts.map +1 -0
- package/dist/data/fileOperations.js +248 -0
- package/dist/data/fileOperations.js.map +1 -0
- package/dist/data/memoryStore.d.ts +86 -0
- package/dist/data/memoryStore.d.ts.map +1 -0
- package/dist/data/memoryStore.js +216 -0
- package/dist/data/memoryStore.js.map +1 -0
- package/dist/data/rulesStore.d.ts +63 -0
- package/dist/data/rulesStore.d.ts.map +1 -0
- package/dist/data/rulesStore.js +196 -0
- package/dist/data/rulesStore.js.map +1 -0
- package/dist/data/schemas.d.ts +840 -0
- package/dist/data/schemas.d.ts.map +1 -0
- package/dist/data/schemas.js +265 -0
- package/dist/data/schemas.js.map +1 -0
- package/dist/data/taskSearchService.d.ts +110 -0
- package/dist/data/taskSearchService.d.ts.map +1 -0
- package/dist/data/taskSearchService.js +165 -0
- package/dist/data/taskSearchService.js.map +1 -0
- package/dist/data/taskStore.d.ts +192 -0
- package/dist/data/taskStore.d.ts.map +1 -0
- package/dist/data/taskStore.js +347 -0
- package/dist/data/taskStore.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +12 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +17 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/projectPromptBuilder.d.ts +13 -0
- package/dist/prompts/projectPromptBuilder.d.ts.map +1 -0
- package/dist/prompts/projectPromptBuilder.js +29 -0
- package/dist/prompts/projectPromptBuilder.js.map +1 -0
- package/dist/prompts/researchPromptBuilder.d.ts +10 -0
- package/dist/prompts/researchPromptBuilder.d.ts.map +1 -0
- package/dist/prompts/researchPromptBuilder.js +20 -0
- package/dist/prompts/researchPromptBuilder.js.map +1 -0
- package/dist/prompts/taskPromptBuilders.d.ts +87 -0
- package/dist/prompts/taskPromptBuilders.d.ts.map +1 -0
- package/dist/prompts/taskPromptBuilders.js +529 -0
- package/dist/prompts/taskPromptBuilders.js.map +1 -0
- package/dist/prompts/templateEngine.d.ts +102 -0
- package/dist/prompts/templateEngine.d.ts.map +1 -0
- package/dist/prompts/templateEngine.js +145 -0
- package/dist/prompts/templateEngine.js.map +1 -0
- package/dist/prompts/templateLoader.d.ts +61 -0
- package/dist/prompts/templateLoader.d.ts.map +1 -0
- package/dist/prompts/templateLoader.js +129 -0
- package/dist/prompts/templateLoader.js.map +1 -0
- package/dist/prompts/templates/v1/templates_en/analyzeTask/index.md +65 -0
- package/dist/prompts/templates/v1/templates_en/analyzeTask/iteration.md +12 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/backupInfo.md +1 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/cancel.md +7 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/empty.md +5 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/index.md +5 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/result.md +7 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/success.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/completed.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/index.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/notFound.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/result.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/success.md +5 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/analysisResult.md +3 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/complexity.md +15 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/dependencies.md +3 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/dependencyTasks.md +3 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/implementationGuide.md +3 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/index.md +39 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/notes.md +1 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/relatedFilesSummary.md +5 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/verificationCriteria.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/complatedSummary.md +5 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/dependencies.md +1 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/error.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/implementationGuide.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/index.md +25 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/notFound.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/notes.md +1 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/relatedFiles.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/verificationCriteria.md +3 -0
- package/dist/prompts/templates/v1/templates_en/initProjectRules/index.md +81 -0
- package/dist/prompts/templates/v1/templates_en/listTasks/index.md +7 -0
- package/dist/prompts/templates/v1/templates_en/listTasks/notFound.md +3 -0
- package/dist/prompts/templates/v1/templates_en/listTasks/taskDetails.md +13 -0
- package/dist/prompts/templates/v1/templates_en/planTask/hasThought.md +4 -0
- package/dist/prompts/templates/v1/templates_en/planTask/index.md +96 -0
- package/dist/prompts/templates/v1/templates_en/planTask/noThought.md +4 -0
- package/dist/prompts/templates/v1/templates_en/planTask/tasks.md +17 -0
- package/dist/prompts/templates/v1/templates_en/processThought/complatedThought.md +6 -0
- package/dist/prompts/templates/v1/templates_en/processThought/index.md +13 -0
- package/dist/prompts/templates/v1/templates_en/processThought/moreThought.md +1 -0
- package/dist/prompts/templates/v1/templates_en/queryTask/index.md +24 -0
- package/dist/prompts/templates/v1/templates_en/queryTask/notFound.md +15 -0
- package/dist/prompts/templates/v1/templates_en/queryTask/taskDetails.md +5 -0
- package/dist/prompts/templates/v1/templates_en/reflectTask/index.md +57 -0
- package/dist/prompts/templates/v1/templates_en/researchMode/index.md +95 -0
- package/dist/prompts/templates/v1/templates_en/researchMode/previousState.md +9 -0
- package/dist/prompts/templates/v1/templates_en/splitTasks/index.md +34 -0
- package/dist/prompts/templates/v1/templates_en/splitTasks/taskDetails.md +12 -0
- package/dist/prompts/templates/v1/templates_en/tests/basic.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/analyzeTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/clearAllTasks.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/deleteTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/executeTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/getTaskDetail.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/initProjectRules.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/listTasks.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/planTask.md +3 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/processThought.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/queryTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/reflectTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/researchMode.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/splitTasks.md +83 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/updateTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/verifyTask.md +37 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/emptyUpdate.md +5 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/fileDetails.md +1 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/index.md +7 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/notFound.md +5 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/success.md +9 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/successDetails.md +3 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/validation.md +5 -0
- package/dist/prompts/templates/v1/templates_en/verifyTask/index.md +19 -0
- package/dist/prompts/templates/v1/templates_en/verifyTask/noPass.md +12 -0
- package/dist/prompts/thoughtPromptBuilder.d.ts +11 -0
- package/dist/prompts/thoughtPromptBuilder.d.ts.map +1 -0
- package/dist/prompts/thoughtPromptBuilder.js +30 -0
- package/dist/prompts/thoughtPromptBuilder.js.map +1 -0
- package/dist/server/container.d.ts +111 -0
- package/dist/server/container.d.ts.map +1 -0
- package/dist/server/container.js +135 -0
- package/dist/server/container.js.map +1 -0
- package/dist/server/logger.d.ts +98 -0
- package/dist/server/logger.d.ts.map +1 -0
- package/dist/server/logger.js +295 -0
- package/dist/server/logger.js.map +1 -0
- package/dist/server/mcpServer.d.ts +162 -0
- package/dist/server/mcpServer.d.ts.map +1 -0
- package/dist/server/mcpServer.js +236 -0
- package/dist/server/mcpServer.js.map +1 -0
- package/dist/tools/project/index.d.ts +7 -0
- package/dist/tools/project/index.d.ts.map +1 -0
- package/dist/tools/project/index.js +7 -0
- package/dist/tools/project/index.js.map +1 -0
- package/dist/tools/project/projectTools.d.ts +17 -0
- package/dist/tools/project/projectTools.d.ts.map +1 -0
- package/dist/tools/project/projectTools.js +73 -0
- package/dist/tools/project/projectTools.js.map +1 -0
- package/dist/tools/research/index.d.ts +7 -0
- package/dist/tools/research/index.d.ts.map +1 -0
- package/dist/tools/research/index.js +7 -0
- package/dist/tools/research/index.js.map +1 -0
- package/dist/tools/research/researchTools.d.ts +16 -0
- package/dist/tools/research/researchTools.d.ts.map +1 -0
- package/dist/tools/research/researchTools.js +41 -0
- package/dist/tools/research/researchTools.js.map +1 -0
- package/dist/tools/task/index.d.ts +8 -0
- package/dist/tools/task/index.d.ts.map +1 -0
- package/dist/tools/task/index.js +8 -0
- package/dist/tools/task/index.js.map +1 -0
- package/dist/tools/task/taskTools.d.ts +32 -0
- package/dist/tools/task/taskTools.d.ts.map +1 -0
- package/dist/tools/task/taskTools.js +542 -0
- package/dist/tools/task/taskTools.js.map +1 -0
- package/dist/tools/thought/index.d.ts +7 -0
- package/dist/tools/thought/index.d.ts.map +1 -0
- package/dist/tools/thought/index.js +7 -0
- package/dist/tools/thought/index.js.map +1 -0
- package/dist/tools/thought/thoughtTools.d.ts +16 -0
- package/dist/tools/thought/thoughtTools.d.ts.map +1 -0
- package/dist/tools/thought/thoughtTools.js +47 -0
- package/dist/tools/thought/thoughtTools.js.map +1 -0
- package/docs/API.md +32 -0
- package/docs/ARCHITECTURE.md +44 -0
- package/docs/COMPATIBILITY_REPORT.md +26 -0
- package/docs/PERFORMANCE.md +66 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/data/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod schemas for runtime validation
|
|
3
|
+
*
|
|
4
|
+
* These schemas validate all external input from MCP clients.
|
|
5
|
+
* TypeScript types alone provide no runtime protection!
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
/**
|
|
9
|
+
* Task status validation
|
|
10
|
+
* Allowlist validation - only these 4 values permitted.
|
|
11
|
+
*/
|
|
12
|
+
export const TaskStatusSchema = z.enum(['pending', 'in_progress', 'completed', 'blocked']);
|
|
13
|
+
/**
|
|
14
|
+
* Task dependency schema
|
|
15
|
+
* NOTE: The 'name' field is computed at runtime for display purposes
|
|
16
|
+
*/
|
|
17
|
+
export const TaskDependencySchema = z.object({
|
|
18
|
+
taskId: z.string().uuid(), // Validate GUID format to prevent injection
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Related file type enum
|
|
22
|
+
* Allowlist validation - only permitted file relationship types.
|
|
23
|
+
*/
|
|
24
|
+
export const RelatedFileTypeSchema = z.enum(['TO_MODIFY', 'REFERENCE', 'CREATE', 'DEPENDENCY', 'OTHER']);
|
|
25
|
+
/**
|
|
26
|
+
* Related file schema
|
|
27
|
+
* Note: Paths will be sanitized separately before file operations.
|
|
28
|
+
*/
|
|
29
|
+
export const RelatedFileSchema = z.object({
|
|
30
|
+
path: z.string().min(1).max(1000), // Max path length prevents DoS
|
|
31
|
+
type: RelatedFileTypeSchema,
|
|
32
|
+
description: z.string().max(1000).optional().nullable(),
|
|
33
|
+
lineStart: z.number().int().min(1).optional().nullable(),
|
|
34
|
+
lineEnd: z.number().int().min(1).optional().nullable(),
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* Main task item schema
|
|
38
|
+
* Validates all task fields with strict limits to prevent malformed data.
|
|
39
|
+
*/
|
|
40
|
+
export const TaskItemSchema = z.object({
|
|
41
|
+
id: z.string().uuid(),
|
|
42
|
+
name: z.string().min(1, 'Task name cannot be empty').max(500, 'Task name too long'),
|
|
43
|
+
description: z.string().max(5000, 'Description too long'),
|
|
44
|
+
notes: z.string().max(5000).optional().nullable(),
|
|
45
|
+
status: TaskStatusSchema,
|
|
46
|
+
dependencies: z.array(TaskDependencySchema).default([]),
|
|
47
|
+
createdAt: z.string().datetime(), // ISO 8601 format
|
|
48
|
+
updatedAt: z.string().datetime(), // ISO 8601 format
|
|
49
|
+
completedAt: z.string().datetime().optional().nullable(),
|
|
50
|
+
summary: z.string().max(5000).optional().nullable(),
|
|
51
|
+
relatedFiles: z.array(RelatedFileSchema).default([]),
|
|
52
|
+
analysisResult: z.string().max(20000).optional().nullable(),
|
|
53
|
+
agent: z.string().max(200).optional().nullable(),
|
|
54
|
+
implementationGuide: z.string().max(10000).optional().nullable(),
|
|
55
|
+
verificationCriteria: z.string().max(5000).optional().nullable(),
|
|
56
|
+
});
|
|
57
|
+
/**
|
|
58
|
+
* Task document schema (root JSON structure)
|
|
59
|
+
* Version field used for schema migration support.
|
|
60
|
+
*/
|
|
61
|
+
export const TaskDocumentSchema = z.object({
|
|
62
|
+
version: z.string().regex(/^\d+\.\d+$/, 'Version must be format X.Y'),
|
|
63
|
+
tasks: z.array(TaskItemSchema).default([]),
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* Update mode validation
|
|
67
|
+
*/
|
|
68
|
+
export const UpdateModeSchema = z.enum(['append', 'overwrite', 'selective', 'clearAllTasks']);
|
|
69
|
+
// ============================================================================
|
|
70
|
+
// MCP Tool Parameter Schemas (Input Validation)
|
|
71
|
+
// ============================================================================
|
|
72
|
+
/**
|
|
73
|
+
* create_task / plan_task parameters
|
|
74
|
+
* Strict validation on input to ensure data integrity.
|
|
75
|
+
*/
|
|
76
|
+
export const CreateTaskParamsSchema = z.object({
|
|
77
|
+
name: z.string()
|
|
78
|
+
.min(1, 'Task name required')
|
|
79
|
+
.max(500, 'Task name exceeds maximum length of 500 characters'),
|
|
80
|
+
description: z.string()
|
|
81
|
+
.min(1, 'Task description required')
|
|
82
|
+
.max(5000, 'Description exceeds maximum length of 5000 characters'),
|
|
83
|
+
dependencies: z.array(z.string().max(500)).optional(),
|
|
84
|
+
relatedFiles: z.array(RelatedFileSchema).optional(),
|
|
85
|
+
implementationGuide: z.string().max(10000).optional().nullable(),
|
|
86
|
+
verificationCriteria: z.string().max(5000).optional().nullable(),
|
|
87
|
+
notes: z.string().max(5000).optional().nullable(),
|
|
88
|
+
agent: z.string().max(200).optional().nullable(),
|
|
89
|
+
});
|
|
90
|
+
/**
|
|
91
|
+
* update_task parameters
|
|
92
|
+
* Validates task ID is GUID, all fields optional for partial update.
|
|
93
|
+
*/
|
|
94
|
+
export const UpdateTaskParamsSchema = z.object({
|
|
95
|
+
taskId: z.string().uuid('Task ID must be a valid GUID'),
|
|
96
|
+
name: z.string().min(1).max(500).optional().nullable(),
|
|
97
|
+
description: z.string().max(5000).optional().nullable(),
|
|
98
|
+
dependencies: z.array(z.string().max(500)).optional().nullable(),
|
|
99
|
+
relatedFiles: z.array(RelatedFileSchema).optional().nullable(),
|
|
100
|
+
implementationGuide: z.string().max(10000).optional().nullable(),
|
|
101
|
+
verificationCriteria: z.string().max(5000).optional().nullable(),
|
|
102
|
+
notes: z.string().max(5000).optional().nullable(),
|
|
103
|
+
});
|
|
104
|
+
/**
|
|
105
|
+
* split_tasks parameters
|
|
106
|
+
* Validates array of tasks and update mode.
|
|
107
|
+
*/
|
|
108
|
+
export const SplitTasksParamsSchema = z.object({
|
|
109
|
+
updateMode: UpdateModeSchema,
|
|
110
|
+
tasks: z.array(CreateTaskParamsSchema)
|
|
111
|
+
.min(1, 'At least one task required')
|
|
112
|
+
.max(100, 'Maximum 100 tasks per split operation'),
|
|
113
|
+
globalAnalysisResult: z.string().max(20000).optional().nullable(),
|
|
114
|
+
});
|
|
115
|
+
/**
|
|
116
|
+
* list_tasks parameters
|
|
117
|
+
*/
|
|
118
|
+
export const ListTasksParamsSchema = z.object({
|
|
119
|
+
status: z.enum(['all', 'pending', 'in_progress', 'completed', 'blocked']).default('all'),
|
|
120
|
+
});
|
|
121
|
+
/**
|
|
122
|
+
* query_task parameters
|
|
123
|
+
* Pagination limits prevent excessive result sets.
|
|
124
|
+
*/
|
|
125
|
+
export const QueryTaskParamsSchema = z.object({
|
|
126
|
+
query: z.string().min(1, 'Query cannot be empty').max(500),
|
|
127
|
+
isId: z.boolean().default(false),
|
|
128
|
+
page: z.number().int().min(1).default(1),
|
|
129
|
+
pageSize: z.number().int().min(1).max(100).default(10), // Max 100 per page prevents DoS
|
|
130
|
+
});
|
|
131
|
+
/**
|
|
132
|
+
* get_task_detail parameters
|
|
133
|
+
*/
|
|
134
|
+
export const GetTaskDetailParamsSchema = z.object({
|
|
135
|
+
taskId: z.string().uuid('Task ID must be a valid GUID'),
|
|
136
|
+
});
|
|
137
|
+
/**
|
|
138
|
+
* execute_task parameters
|
|
139
|
+
*/
|
|
140
|
+
export const ExecuteTaskParamsSchema = z.object({
|
|
141
|
+
taskId: z.string().uuid('Task ID must be a valid GUID'),
|
|
142
|
+
});
|
|
143
|
+
/**
|
|
144
|
+
* verify_task parameters
|
|
145
|
+
*/
|
|
146
|
+
export const VerifyTaskParamsSchema = z.object({
|
|
147
|
+
taskId: z.string().uuid('Task ID must be a valid GUID'),
|
|
148
|
+
score: z.number().int().min(0).max(100, 'Score must be between 0-100'),
|
|
149
|
+
summary: z.string().min(1).max(2000),
|
|
150
|
+
});
|
|
151
|
+
/**
|
|
152
|
+
* delete_task parameters
|
|
153
|
+
*/
|
|
154
|
+
export const DeleteTaskParamsSchema = z.object({
|
|
155
|
+
taskId: z.string().uuid('Task ID must be a valid GUID'),
|
|
156
|
+
});
|
|
157
|
+
/**
|
|
158
|
+
* clear_all_tasks parameters
|
|
159
|
+
*/
|
|
160
|
+
export const ClearAllTasksParamsSchema = z.object({
|
|
161
|
+
confirm: z.boolean().default(false),
|
|
162
|
+
});
|
|
163
|
+
/**
|
|
164
|
+
* analyze_task parameters
|
|
165
|
+
*/
|
|
166
|
+
export const AnalyzeTaskParamsSchema = z.object({
|
|
167
|
+
summary: z.string().min(1).max(5000, 'Summary exceeds maximum length'),
|
|
168
|
+
initialConcept: z.string().min(1).max(20000, 'Initial concept exceeds maximum length'),
|
|
169
|
+
previousAnalysis: z.string().max(20000).optional().nullable(),
|
|
170
|
+
});
|
|
171
|
+
/**
|
|
172
|
+
* reflect_task parameters
|
|
173
|
+
*/
|
|
174
|
+
export const ReflectTaskParamsSchema = z.object({
|
|
175
|
+
summary: z.string().min(1).max(5000, 'Summary exceeds maximum length'),
|
|
176
|
+
analysis: z.string().min(1).max(20000, 'Analysis exceeds maximum length'),
|
|
177
|
+
});
|
|
178
|
+
/**
|
|
179
|
+
* plan_task parameters
|
|
180
|
+
*/
|
|
181
|
+
export const PlanTaskParamsSchema = z.object({
|
|
182
|
+
description: z.string().min(1, 'Description required').max(10000),
|
|
183
|
+
requirements: z.string().max(10000).optional().nullable(),
|
|
184
|
+
existingTasksReference: z.boolean().default(false),
|
|
185
|
+
});
|
|
186
|
+
/**
|
|
187
|
+
* research_mode parameters
|
|
188
|
+
*/
|
|
189
|
+
export const ResearchModeParamsSchema = z.object({
|
|
190
|
+
topic: z.string().min(1, 'Topic required').max(1000),
|
|
191
|
+
previousState: z.string().max(20000),
|
|
192
|
+
currentState: z.string().min(1, 'Current state required').max(20000),
|
|
193
|
+
nextSteps: z.string().min(1, 'Next steps required').max(20000),
|
|
194
|
+
});
|
|
195
|
+
/**
|
|
196
|
+
* process_thought parameters
|
|
197
|
+
*/
|
|
198
|
+
export const ProcessThoughtParamsSchema = z.object({
|
|
199
|
+
thought: z.string().min(1, 'Thought content required').max(5000),
|
|
200
|
+
thoughtNumber: z.number().int().min(1),
|
|
201
|
+
totalThoughts: z.number().int().min(1),
|
|
202
|
+
stage: z.string().min(1).max(100),
|
|
203
|
+
tags: z.array(z.string().max(50)).max(20).optional().nullable(),
|
|
204
|
+
axiomsUsed: z.array(z.string().max(200)).max(10).optional().nullable(),
|
|
205
|
+
assumptionsChallenged: z.array(z.string().max(200)).max(10).optional().nullable(),
|
|
206
|
+
nextThoughtNeeded: z.boolean().default(false),
|
|
207
|
+
}).refine(data => data.thoughtNumber <= data.totalThoughts, {
|
|
208
|
+
message: 'Thought number cannot exceed total thoughts',
|
|
209
|
+
path: ['thoughtNumber'],
|
|
210
|
+
});
|
|
211
|
+
/**
|
|
212
|
+
* init_project_rules parameters
|
|
213
|
+
*/
|
|
214
|
+
export const InitProjectRulesParamsSchema = z.object({
|
|
215
|
+
// No parameters - this tool initializes default rules
|
|
216
|
+
});
|
|
217
|
+
/**
|
|
218
|
+
* get_server_info parameters
|
|
219
|
+
*/
|
|
220
|
+
export const GetServerInfoParamsSchema = z.object({
|
|
221
|
+
// No parameters - returns server metadata
|
|
222
|
+
});
|
|
223
|
+
// ============================================================================
|
|
224
|
+
// Validation Helper Functions
|
|
225
|
+
// ============================================================================
|
|
226
|
+
/**
|
|
227
|
+
* Validate and parse a task document from unknown data
|
|
228
|
+
* Use this for all JSON file reads to ensure data integrity.
|
|
229
|
+
*
|
|
230
|
+
* @param data - Unknown data from file or external source
|
|
231
|
+
* @returns Validated TaskDocument
|
|
232
|
+
* @throws ZodError if validation fails
|
|
233
|
+
*/
|
|
234
|
+
export function validateTaskDocument(data) {
|
|
235
|
+
return TaskDocumentSchema.parse(data);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Safely validate a task document, returning success/error result
|
|
239
|
+
*
|
|
240
|
+
* @param data - Unknown data from file or external source
|
|
241
|
+
* @returns { success: true, data: TaskDocument } or { success: false, error: ZodError }
|
|
242
|
+
*/
|
|
243
|
+
export function safeValidateTaskDocument(data) {
|
|
244
|
+
return TaskDocumentSchema.safeParse(data);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Validate a single task item
|
|
248
|
+
*
|
|
249
|
+
* @param data - Unknown data
|
|
250
|
+
* @returns Validated TaskItem
|
|
251
|
+
* @throws ZodError if validation fails
|
|
252
|
+
*/
|
|
253
|
+
export function validateTaskItem(data) {
|
|
254
|
+
return TaskItemSchema.parse(data);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Create an empty task document
|
|
258
|
+
*/
|
|
259
|
+
export function createEmptyTaskDocument() {
|
|
260
|
+
return {
|
|
261
|
+
version: '1.0',
|
|
262
|
+
tasks: [],
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/data/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskSearchService - Search and query functionality for tasks
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - Full-text search across task fields
|
|
6
|
+
* - Filtering by status
|
|
7
|
+
* - Pagination with offset/limit
|
|
8
|
+
* - Multiple sorting options
|
|
9
|
+
* - Regex safety
|
|
10
|
+
*/
|
|
11
|
+
import { type TaskItem, type TaskStatus } from './schemas.js';
|
|
12
|
+
/**
|
|
13
|
+
* Sort field options
|
|
14
|
+
*/
|
|
15
|
+
export type SortField = 'name' | 'createdAt' | 'updatedAt' | 'status';
|
|
16
|
+
/**
|
|
17
|
+
* Sort direction
|
|
18
|
+
*/
|
|
19
|
+
export type SortDirection = 'asc' | 'desc';
|
|
20
|
+
/**
|
|
21
|
+
* Search query parameters
|
|
22
|
+
*/
|
|
23
|
+
export interface SearchQuery {
|
|
24
|
+
/** Text to search for in name, description, notes */
|
|
25
|
+
query?: string | null;
|
|
26
|
+
/** Filter by task status */
|
|
27
|
+
status?: TaskStatus | null;
|
|
28
|
+
/** Page number (1-based) */
|
|
29
|
+
page?: number;
|
|
30
|
+
/** Items per page (default: 10, max: 1000) */
|
|
31
|
+
pageSize?: number;
|
|
32
|
+
/** Field to sort by */
|
|
33
|
+
sortBy?: SortField;
|
|
34
|
+
/** Sort direction */
|
|
35
|
+
sortDirection?: SortDirection;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Paginated search results
|
|
39
|
+
*/
|
|
40
|
+
export interface SearchResults {
|
|
41
|
+
/** Tasks matching the query */
|
|
42
|
+
tasks: TaskItem[];
|
|
43
|
+
/** Total number of matching tasks (before pagination) */
|
|
44
|
+
total: number;
|
|
45
|
+
/** Current page number (1-based) */
|
|
46
|
+
page: number;
|
|
47
|
+
/** Items per page */
|
|
48
|
+
pageSize: number;
|
|
49
|
+
/** Total number of pages */
|
|
50
|
+
totalPages: number;
|
|
51
|
+
/** Whether there are more pages */
|
|
52
|
+
hasMore: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* TaskSearchService - Provides search and query functionality
|
|
56
|
+
*
|
|
57
|
+
* Input validation and safe regex usage.
|
|
58
|
+
*/
|
|
59
|
+
export declare class TaskSearchService {
|
|
60
|
+
/**
|
|
61
|
+
* Search tasks with filtering, pagination, and sorting
|
|
62
|
+
*
|
|
63
|
+
* @param tasks - All tasks to search
|
|
64
|
+
* @param query - Search parameters
|
|
65
|
+
* @returns Paginated search results
|
|
66
|
+
*/
|
|
67
|
+
search(tasks: TaskItem[], query?: SearchQuery): SearchResults;
|
|
68
|
+
/**
|
|
69
|
+
* Filter tasks by text query (case-insensitive search across name, description, notes)
|
|
70
|
+
*
|
|
71
|
+
* @param tasks - Tasks to filter
|
|
72
|
+
* @param query - Search query string
|
|
73
|
+
* @returns Filtered tasks
|
|
74
|
+
*/
|
|
75
|
+
private filterByQuery;
|
|
76
|
+
/**
|
|
77
|
+
* Filter tasks by status
|
|
78
|
+
*
|
|
79
|
+
* @param tasks - Tasks to filter
|
|
80
|
+
* @param status - Status to filter by
|
|
81
|
+
* @returns Filtered tasks
|
|
82
|
+
*/
|
|
83
|
+
private filterByStatus;
|
|
84
|
+
/**
|
|
85
|
+
* Sort tasks by specified field and direction
|
|
86
|
+
*
|
|
87
|
+
* @param tasks - Tasks to sort
|
|
88
|
+
* @param sortBy - Field to sort by
|
|
89
|
+
* @param direction - Sort direction
|
|
90
|
+
* @returns Sorted tasks (new array)
|
|
91
|
+
*/
|
|
92
|
+
private sortTasks;
|
|
93
|
+
/**
|
|
94
|
+
* Paginate tasks
|
|
95
|
+
*
|
|
96
|
+
* @param tasks - Sorted tasks to paginate
|
|
97
|
+
* @param page - Page number (1-based)
|
|
98
|
+
* @param pageSize - Items per page
|
|
99
|
+
* @returns Slice of tasks for the requested page
|
|
100
|
+
*/
|
|
101
|
+
private paginate;
|
|
102
|
+
/**
|
|
103
|
+
* Validate and normalize page size
|
|
104
|
+
*
|
|
105
|
+
* @param pageSize - Requested page size
|
|
106
|
+
* @returns Validated page size (within bounds)
|
|
107
|
+
*/
|
|
108
|
+
private validatePageSize;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=taskSearchService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskSearchService.d.ts","sourceRoot":"","sources":["../../src/data/taskSearchService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEtE;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC3B,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,qBAAqB;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;CAClB;AAiBD;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,GAAE,WAAgB,GAAG,aAAa;IA+BxE;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IA8BrB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAItB;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;IAgCjB;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ;IAMhB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;CAiBzB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskSearchService - Search and query functionality for tasks
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - Full-text search across task fields
|
|
6
|
+
* - Filtering by status
|
|
7
|
+
* - Pagination with offset/limit
|
|
8
|
+
* - Multiple sorting options
|
|
9
|
+
* - Regex safety
|
|
10
|
+
*/
|
|
11
|
+
import {} from './schemas.js';
|
|
12
|
+
/**
|
|
13
|
+
* Maximum results to prevent memory exhaustion
|
|
14
|
+
*/
|
|
15
|
+
const MAX_PAGE_SIZE = 1000;
|
|
16
|
+
/**
|
|
17
|
+
* Default page size
|
|
18
|
+
*/
|
|
19
|
+
const DEFAULT_PAGE_SIZE = 10;
|
|
20
|
+
/**
|
|
21
|
+
* Maximum query length to keep search bounded
|
|
22
|
+
*/
|
|
23
|
+
const MAX_PATTERN_LENGTH = 100;
|
|
24
|
+
/**
|
|
25
|
+
* TaskSearchService - Provides search and query functionality
|
|
26
|
+
*
|
|
27
|
+
* Input validation and safe regex usage.
|
|
28
|
+
*/
|
|
29
|
+
export class TaskSearchService {
|
|
30
|
+
/**
|
|
31
|
+
* Search tasks with filtering, pagination, and sorting
|
|
32
|
+
*
|
|
33
|
+
* @param tasks - All tasks to search
|
|
34
|
+
* @param query - Search parameters
|
|
35
|
+
* @returns Paginated search results
|
|
36
|
+
*/
|
|
37
|
+
search(tasks, query = {}) {
|
|
38
|
+
// Step 1: Filter by query string (if provided)
|
|
39
|
+
let filtered = query.query
|
|
40
|
+
? this.filterByQuery(tasks, query.query)
|
|
41
|
+
: tasks;
|
|
42
|
+
// Step 2: Filter by status (if provided)
|
|
43
|
+
if (query.status) {
|
|
44
|
+
filtered = this.filterByStatus(filtered, query.status);
|
|
45
|
+
}
|
|
46
|
+
// Step 3: Sort results
|
|
47
|
+
const sortBy = query.sortBy ?? 'createdAt';
|
|
48
|
+
const sortDirection = query.sortDirection ?? 'desc';
|
|
49
|
+
const sorted = this.sortTasks(filtered, sortBy, sortDirection);
|
|
50
|
+
// Step 4: Paginate results
|
|
51
|
+
const page = Math.max(1, query.page ?? 1);
|
|
52
|
+
const pageSize = this.validatePageSize(query.pageSize);
|
|
53
|
+
const paginated = this.paginate(sorted, page, pageSize);
|
|
54
|
+
return {
|
|
55
|
+
tasks: paginated,
|
|
56
|
+
total: sorted.length,
|
|
57
|
+
page,
|
|
58
|
+
pageSize,
|
|
59
|
+
totalPages: Math.ceil(sorted.length / pageSize),
|
|
60
|
+
hasMore: page * pageSize < sorted.length,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Filter tasks by text query (case-insensitive search across name, description, notes)
|
|
65
|
+
*
|
|
66
|
+
* @param tasks - Tasks to filter
|
|
67
|
+
* @param query - Search query string
|
|
68
|
+
* @returns Filtered tasks
|
|
69
|
+
*/
|
|
70
|
+
filterByQuery(tasks, query) {
|
|
71
|
+
const trimmed = query.trim();
|
|
72
|
+
if (trimmed.length === 0) {
|
|
73
|
+
return tasks;
|
|
74
|
+
}
|
|
75
|
+
// Validate query length
|
|
76
|
+
if (trimmed.length > MAX_PATTERN_LENGTH) {
|
|
77
|
+
throw new Error(`Search query too long (max ${MAX_PATTERN_LENGTH} characters)`);
|
|
78
|
+
}
|
|
79
|
+
const normalizedQuery = trimmed.toLowerCase();
|
|
80
|
+
// Filter tasks that match in name, description, or notes
|
|
81
|
+
return tasks.filter(task => {
|
|
82
|
+
const searchableText = [
|
|
83
|
+
task.name,
|
|
84
|
+
task.description,
|
|
85
|
+
task.notes ?? '',
|
|
86
|
+
]
|
|
87
|
+
.join(' ')
|
|
88
|
+
.toLowerCase();
|
|
89
|
+
return searchableText.includes(normalizedQuery);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Filter tasks by status
|
|
94
|
+
*
|
|
95
|
+
* @param tasks - Tasks to filter
|
|
96
|
+
* @param status - Status to filter by
|
|
97
|
+
* @returns Filtered tasks
|
|
98
|
+
*/
|
|
99
|
+
filterByStatus(tasks, status) {
|
|
100
|
+
return tasks.filter(task => task.status === status);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Sort tasks by specified field and direction
|
|
104
|
+
*
|
|
105
|
+
* @param tasks - Tasks to sort
|
|
106
|
+
* @param sortBy - Field to sort by
|
|
107
|
+
* @param direction - Sort direction
|
|
108
|
+
* @returns Sorted tasks (new array)
|
|
109
|
+
*/
|
|
110
|
+
sortTasks(tasks, sortBy, direction) {
|
|
111
|
+
// Create copy to avoid mutating input
|
|
112
|
+
const sorted = [...tasks];
|
|
113
|
+
sorted.sort((a, b) => {
|
|
114
|
+
let comparison = 0;
|
|
115
|
+
switch (sortBy) {
|
|
116
|
+
case 'name':
|
|
117
|
+
comparison = a.name.localeCompare(b.name);
|
|
118
|
+
break;
|
|
119
|
+
case 'createdAt':
|
|
120
|
+
comparison = a.createdAt.localeCompare(b.createdAt);
|
|
121
|
+
break;
|
|
122
|
+
case 'updatedAt':
|
|
123
|
+
comparison = a.updatedAt.localeCompare(b.updatedAt);
|
|
124
|
+
break;
|
|
125
|
+
case 'status':
|
|
126
|
+
comparison = a.status.localeCompare(b.status);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
return direction === 'asc' ? comparison : -comparison;
|
|
130
|
+
});
|
|
131
|
+
return sorted;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Paginate tasks
|
|
135
|
+
*
|
|
136
|
+
* @param tasks - Sorted tasks to paginate
|
|
137
|
+
* @param page - Page number (1-based)
|
|
138
|
+
* @param pageSize - Items per page
|
|
139
|
+
* @returns Slice of tasks for the requested page
|
|
140
|
+
*/
|
|
141
|
+
paginate(tasks, page, pageSize) {
|
|
142
|
+
const startIndex = (page - 1) * pageSize;
|
|
143
|
+
const endIndex = startIndex + pageSize;
|
|
144
|
+
return tasks.slice(startIndex, endIndex);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Validate and normalize page size
|
|
148
|
+
*
|
|
149
|
+
* @param pageSize - Requested page size
|
|
150
|
+
* @returns Validated page size (within bounds)
|
|
151
|
+
*/
|
|
152
|
+
validatePageSize(pageSize) {
|
|
153
|
+
if (pageSize === undefined || pageSize === null) {
|
|
154
|
+
return DEFAULT_PAGE_SIZE;
|
|
155
|
+
}
|
|
156
|
+
if (pageSize < 1) {
|
|
157
|
+
return DEFAULT_PAGE_SIZE;
|
|
158
|
+
}
|
|
159
|
+
if (pageSize > MAX_PAGE_SIZE) {
|
|
160
|
+
return MAX_PAGE_SIZE;
|
|
161
|
+
}
|
|
162
|
+
return Math.floor(pageSize);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=taskSearchService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskSearchService.js","sourceRoot":"","sources":["../../src/data/taskSearchService.ts"],"names":[],"mappings":"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"}
|