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.
Files changed (187) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +275 -0
  4. package/dist/config/pathResolver.d.ts +33 -0
  5. package/dist/config/pathResolver.d.ts.map +1 -0
  6. package/dist/config/pathResolver.js +130 -0
  7. package/dist/config/pathResolver.js.map +1 -0
  8. package/dist/data/fileOperations.d.ts +43 -0
  9. package/dist/data/fileOperations.d.ts.map +1 -0
  10. package/dist/data/fileOperations.js +248 -0
  11. package/dist/data/fileOperations.js.map +1 -0
  12. package/dist/data/memoryStore.d.ts +86 -0
  13. package/dist/data/memoryStore.d.ts.map +1 -0
  14. package/dist/data/memoryStore.js +216 -0
  15. package/dist/data/memoryStore.js.map +1 -0
  16. package/dist/data/rulesStore.d.ts +63 -0
  17. package/dist/data/rulesStore.d.ts.map +1 -0
  18. package/dist/data/rulesStore.js +196 -0
  19. package/dist/data/rulesStore.js.map +1 -0
  20. package/dist/data/schemas.d.ts +840 -0
  21. package/dist/data/schemas.d.ts.map +1 -0
  22. package/dist/data/schemas.js +265 -0
  23. package/dist/data/schemas.js.map +1 -0
  24. package/dist/data/taskSearchService.d.ts +110 -0
  25. package/dist/data/taskSearchService.d.ts.map +1 -0
  26. package/dist/data/taskSearchService.js +165 -0
  27. package/dist/data/taskSearchService.js.map +1 -0
  28. package/dist/data/taskStore.d.ts +192 -0
  29. package/dist/data/taskStore.d.ts.map +1 -0
  30. package/dist/data/taskStore.js +347 -0
  31. package/dist/data/taskStore.js.map +1 -0
  32. package/dist/index.d.ts +23 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +86 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/prompts/index.d.ts +12 -0
  37. package/dist/prompts/index.d.ts.map +1 -0
  38. package/dist/prompts/index.js +17 -0
  39. package/dist/prompts/index.js.map +1 -0
  40. package/dist/prompts/projectPromptBuilder.d.ts +13 -0
  41. package/dist/prompts/projectPromptBuilder.d.ts.map +1 -0
  42. package/dist/prompts/projectPromptBuilder.js +29 -0
  43. package/dist/prompts/projectPromptBuilder.js.map +1 -0
  44. package/dist/prompts/researchPromptBuilder.d.ts +10 -0
  45. package/dist/prompts/researchPromptBuilder.d.ts.map +1 -0
  46. package/dist/prompts/researchPromptBuilder.js +20 -0
  47. package/dist/prompts/researchPromptBuilder.js.map +1 -0
  48. package/dist/prompts/taskPromptBuilders.d.ts +87 -0
  49. package/dist/prompts/taskPromptBuilders.d.ts.map +1 -0
  50. package/dist/prompts/taskPromptBuilders.js +529 -0
  51. package/dist/prompts/taskPromptBuilders.js.map +1 -0
  52. package/dist/prompts/templateEngine.d.ts +102 -0
  53. package/dist/prompts/templateEngine.d.ts.map +1 -0
  54. package/dist/prompts/templateEngine.js +145 -0
  55. package/dist/prompts/templateEngine.js.map +1 -0
  56. package/dist/prompts/templateLoader.d.ts +61 -0
  57. package/dist/prompts/templateLoader.d.ts.map +1 -0
  58. package/dist/prompts/templateLoader.js +129 -0
  59. package/dist/prompts/templateLoader.js.map +1 -0
  60. package/dist/prompts/templates/v1/templates_en/analyzeTask/index.md +65 -0
  61. package/dist/prompts/templates/v1/templates_en/analyzeTask/iteration.md +12 -0
  62. package/dist/prompts/templates/v1/templates_en/clearAllTasks/backupInfo.md +1 -0
  63. package/dist/prompts/templates/v1/templates_en/clearAllTasks/cancel.md +7 -0
  64. package/dist/prompts/templates/v1/templates_en/clearAllTasks/empty.md +5 -0
  65. package/dist/prompts/templates/v1/templates_en/clearAllTasks/index.md +5 -0
  66. package/dist/prompts/templates/v1/templates_en/clearAllTasks/result.md +7 -0
  67. package/dist/prompts/templates/v1/templates_en/clearAllTasks/success.md +5 -0
  68. package/dist/prompts/templates/v1/templates_en/deleteTask/completed.md +5 -0
  69. package/dist/prompts/templates/v1/templates_en/deleteTask/index.md +5 -0
  70. package/dist/prompts/templates/v1/templates_en/deleteTask/notFound.md +5 -0
  71. package/dist/prompts/templates/v1/templates_en/deleteTask/result.md +5 -0
  72. package/dist/prompts/templates/v1/templates_en/deleteTask/success.md +5 -0
  73. package/dist/prompts/templates/v1/templates_en/executeTask/analysisResult.md +3 -0
  74. package/dist/prompts/templates/v1/templates_en/executeTask/complexity.md +15 -0
  75. package/dist/prompts/templates/v1/templates_en/executeTask/dependencies.md +3 -0
  76. package/dist/prompts/templates/v1/templates_en/executeTask/dependencyTasks.md +3 -0
  77. package/dist/prompts/templates/v1/templates_en/executeTask/implementationGuide.md +3 -0
  78. package/dist/prompts/templates/v1/templates_en/executeTask/index.md +39 -0
  79. package/dist/prompts/templates/v1/templates_en/executeTask/notes.md +1 -0
  80. package/dist/prompts/templates/v1/templates_en/executeTask/relatedFilesSummary.md +5 -0
  81. package/dist/prompts/templates/v1/templates_en/executeTask/verificationCriteria.md +3 -0
  82. package/dist/prompts/templates/v1/templates_en/getTaskDetail/complatedSummary.md +5 -0
  83. package/dist/prompts/templates/v1/templates_en/getTaskDetail/dependencies.md +1 -0
  84. package/dist/prompts/templates/v1/templates_en/getTaskDetail/error.md +3 -0
  85. package/dist/prompts/templates/v1/templates_en/getTaskDetail/implementationGuide.md +3 -0
  86. package/dist/prompts/templates/v1/templates_en/getTaskDetail/index.md +25 -0
  87. package/dist/prompts/templates/v1/templates_en/getTaskDetail/notFound.md +3 -0
  88. package/dist/prompts/templates/v1/templates_en/getTaskDetail/notes.md +1 -0
  89. package/dist/prompts/templates/v1/templates_en/getTaskDetail/relatedFiles.md +3 -0
  90. package/dist/prompts/templates/v1/templates_en/getTaskDetail/verificationCriteria.md +3 -0
  91. package/dist/prompts/templates/v1/templates_en/initProjectRules/index.md +81 -0
  92. package/dist/prompts/templates/v1/templates_en/listTasks/index.md +7 -0
  93. package/dist/prompts/templates/v1/templates_en/listTasks/notFound.md +3 -0
  94. package/dist/prompts/templates/v1/templates_en/listTasks/taskDetails.md +13 -0
  95. package/dist/prompts/templates/v1/templates_en/planTask/hasThought.md +4 -0
  96. package/dist/prompts/templates/v1/templates_en/planTask/index.md +96 -0
  97. package/dist/prompts/templates/v1/templates_en/planTask/noThought.md +4 -0
  98. package/dist/prompts/templates/v1/templates_en/planTask/tasks.md +17 -0
  99. package/dist/prompts/templates/v1/templates_en/processThought/complatedThought.md +6 -0
  100. package/dist/prompts/templates/v1/templates_en/processThought/index.md +13 -0
  101. package/dist/prompts/templates/v1/templates_en/processThought/moreThought.md +1 -0
  102. package/dist/prompts/templates/v1/templates_en/queryTask/index.md +24 -0
  103. package/dist/prompts/templates/v1/templates_en/queryTask/notFound.md +15 -0
  104. package/dist/prompts/templates/v1/templates_en/queryTask/taskDetails.md +5 -0
  105. package/dist/prompts/templates/v1/templates_en/reflectTask/index.md +57 -0
  106. package/dist/prompts/templates/v1/templates_en/researchMode/index.md +95 -0
  107. package/dist/prompts/templates/v1/templates_en/researchMode/previousState.md +9 -0
  108. package/dist/prompts/templates/v1/templates_en/splitTasks/index.md +34 -0
  109. package/dist/prompts/templates/v1/templates_en/splitTasks/taskDetails.md +12 -0
  110. package/dist/prompts/templates/v1/templates_en/tests/basic.md +1 -0
  111. package/dist/prompts/templates/v1/templates_en/toolsDescription/analyzeTask.md +1 -0
  112. package/dist/prompts/templates/v1/templates_en/toolsDescription/clearAllTasks.md +1 -0
  113. package/dist/prompts/templates/v1/templates_en/toolsDescription/deleteTask.md +1 -0
  114. package/dist/prompts/templates/v1/templates_en/toolsDescription/executeTask.md +1 -0
  115. package/dist/prompts/templates/v1/templates_en/toolsDescription/getTaskDetail.md +1 -0
  116. package/dist/prompts/templates/v1/templates_en/toolsDescription/initProjectRules.md +1 -0
  117. package/dist/prompts/templates/v1/templates_en/toolsDescription/listTasks.md +1 -0
  118. package/dist/prompts/templates/v1/templates_en/toolsDescription/planTask.md +3 -0
  119. package/dist/prompts/templates/v1/templates_en/toolsDescription/processThought.md +1 -0
  120. package/dist/prompts/templates/v1/templates_en/toolsDescription/queryTask.md +1 -0
  121. package/dist/prompts/templates/v1/templates_en/toolsDescription/reflectTask.md +1 -0
  122. package/dist/prompts/templates/v1/templates_en/toolsDescription/researchMode.md +1 -0
  123. package/dist/prompts/templates/v1/templates_en/toolsDescription/splitTasks.md +83 -0
  124. package/dist/prompts/templates/v1/templates_en/toolsDescription/updateTask.md +1 -0
  125. package/dist/prompts/templates/v1/templates_en/toolsDescription/verifyTask.md +37 -0
  126. package/dist/prompts/templates/v1/templates_en/updateTaskContent/emptyUpdate.md +5 -0
  127. package/dist/prompts/templates/v1/templates_en/updateTaskContent/fileDetails.md +1 -0
  128. package/dist/prompts/templates/v1/templates_en/updateTaskContent/index.md +7 -0
  129. package/dist/prompts/templates/v1/templates_en/updateTaskContent/notFound.md +5 -0
  130. package/dist/prompts/templates/v1/templates_en/updateTaskContent/success.md +9 -0
  131. package/dist/prompts/templates/v1/templates_en/updateTaskContent/successDetails.md +3 -0
  132. package/dist/prompts/templates/v1/templates_en/updateTaskContent/validation.md +5 -0
  133. package/dist/prompts/templates/v1/templates_en/verifyTask/index.md +19 -0
  134. package/dist/prompts/templates/v1/templates_en/verifyTask/noPass.md +12 -0
  135. package/dist/prompts/thoughtPromptBuilder.d.ts +11 -0
  136. package/dist/prompts/thoughtPromptBuilder.d.ts.map +1 -0
  137. package/dist/prompts/thoughtPromptBuilder.js +30 -0
  138. package/dist/prompts/thoughtPromptBuilder.js.map +1 -0
  139. package/dist/server/container.d.ts +111 -0
  140. package/dist/server/container.d.ts.map +1 -0
  141. package/dist/server/container.js +135 -0
  142. package/dist/server/container.js.map +1 -0
  143. package/dist/server/logger.d.ts +98 -0
  144. package/dist/server/logger.d.ts.map +1 -0
  145. package/dist/server/logger.js +295 -0
  146. package/dist/server/logger.js.map +1 -0
  147. package/dist/server/mcpServer.d.ts +162 -0
  148. package/dist/server/mcpServer.d.ts.map +1 -0
  149. package/dist/server/mcpServer.js +236 -0
  150. package/dist/server/mcpServer.js.map +1 -0
  151. package/dist/tools/project/index.d.ts +7 -0
  152. package/dist/tools/project/index.d.ts.map +1 -0
  153. package/dist/tools/project/index.js +7 -0
  154. package/dist/tools/project/index.js.map +1 -0
  155. package/dist/tools/project/projectTools.d.ts +17 -0
  156. package/dist/tools/project/projectTools.d.ts.map +1 -0
  157. package/dist/tools/project/projectTools.js +73 -0
  158. package/dist/tools/project/projectTools.js.map +1 -0
  159. package/dist/tools/research/index.d.ts +7 -0
  160. package/dist/tools/research/index.d.ts.map +1 -0
  161. package/dist/tools/research/index.js +7 -0
  162. package/dist/tools/research/index.js.map +1 -0
  163. package/dist/tools/research/researchTools.d.ts +16 -0
  164. package/dist/tools/research/researchTools.d.ts.map +1 -0
  165. package/dist/tools/research/researchTools.js +41 -0
  166. package/dist/tools/research/researchTools.js.map +1 -0
  167. package/dist/tools/task/index.d.ts +8 -0
  168. package/dist/tools/task/index.d.ts.map +1 -0
  169. package/dist/tools/task/index.js +8 -0
  170. package/dist/tools/task/index.js.map +1 -0
  171. package/dist/tools/task/taskTools.d.ts +32 -0
  172. package/dist/tools/task/taskTools.d.ts.map +1 -0
  173. package/dist/tools/task/taskTools.js +542 -0
  174. package/dist/tools/task/taskTools.js.map +1 -0
  175. package/dist/tools/thought/index.d.ts +7 -0
  176. package/dist/tools/thought/index.d.ts.map +1 -0
  177. package/dist/tools/thought/index.js +7 -0
  178. package/dist/tools/thought/index.js.map +1 -0
  179. package/dist/tools/thought/thoughtTools.d.ts +16 -0
  180. package/dist/tools/thought/thoughtTools.d.ts.map +1 -0
  181. package/dist/tools/thought/thoughtTools.js +47 -0
  182. package/dist/tools/thought/thoughtTools.js.map +1 -0
  183. package/docs/API.md +32 -0
  184. package/docs/ARCHITECTURE.md +44 -0
  185. package/docs/COMPATIBILITY_REPORT.md +26 -0
  186. package/docs/PERFORMANCE.md +66 -0
  187. package/package.json +77 -0
@@ -0,0 +1,192 @@
1
+ /**
2
+ * TaskStore - CRUD operations for task management
3
+ *
4
+ * Provides thread-safe task operations with:
5
+ * - Atomic read-modify-write pattern
6
+ * - Dependency resolution (by ID or name)
7
+ * - Automatic timestamp management
8
+ * - Event notifications
9
+ */
10
+ import { type TaskItem } from './schemas.js';
11
+ /**
12
+ * Related file type enumeration
13
+ */
14
+ export type RelatedFileType = 'TO_MODIFY' | 'REFERENCE' | 'CREATE' | 'DEPENDENCY' | 'OTHER';
15
+ /**
16
+ * Related file information for a task
17
+ */
18
+ export interface RelatedFileInfo {
19
+ path: string;
20
+ type: RelatedFileType;
21
+ description?: string | null;
22
+ lineStart?: number | null;
23
+ lineEnd?: number | null;
24
+ }
25
+ /**
26
+ * Fields that can be set when creating a task
27
+ * Excludes auto-generated fields (id, timestamps, status, summary)
28
+ */
29
+ type TaskCreatableFields = Pick<TaskItem, 'name' | 'description' | 'notes' | 'analysisResult' | 'agent' | 'implementationGuide' | 'verificationCriteria'>;
30
+ /**
31
+ * Request to create a new task
32
+ *
33
+ * Allows creating a task with user-provided fields.
34
+ * Dependencies can be specified by ID or name (resolved at creation time).
35
+ */
36
+ export interface TaskCreateRequest extends TaskCreatableFields {
37
+ /** Task dependencies (IDs or names) */
38
+ dependencies?: string[];
39
+ /** Related files for the task */
40
+ relatedFiles?: RelatedFileInfo[];
41
+ }
42
+ /**
43
+ * Fields that can be updated on an existing task
44
+ * All fields are optional and nullable (undefined = keep existing, null = clear)
45
+ */
46
+ type TaskUpdatableFields = Partial<Pick<TaskItem, 'name' | 'description' | 'notes' | 'status' | 'summary' | 'analysisResult' | 'agent' | 'implementationGuide' | 'verificationCriteria'>>;
47
+ /**
48
+ * Request to update an existing task
49
+ *
50
+ * Three-way null handling:
51
+ * - `undefined` (field omitted) = keep existing value
52
+ * - `null` = clear the field
53
+ * - value = update to new value
54
+ */
55
+ export interface TaskUpdateRequest extends TaskUpdatableFields {
56
+ /** Updated dependencies (IDs or names), or null to clear */
57
+ dependencies?: string[] | null;
58
+ /** Updated related files, or null to clear */
59
+ relatedFiles?: RelatedFileInfo[] | null;
60
+ }
61
+ /**
62
+ * Result of clearing all tasks
63
+ */
64
+ export interface ClearAllResult {
65
+ success: boolean;
66
+ message: string;
67
+ backupFile?: string | null;
68
+ }
69
+ /**
70
+ * Task change event types
71
+ */
72
+ export type TaskChangeEvent = {
73
+ type: 'created';
74
+ task: TaskItem;
75
+ } | {
76
+ type: 'updated';
77
+ task: TaskItem;
78
+ } | {
79
+ type: 'deleted';
80
+ task: TaskItem;
81
+ } | {
82
+ type: 'cleared';
83
+ };
84
+ /**
85
+ * Task change event handler
86
+ */
87
+ export type TaskChangeHandler = (event: TaskChangeEvent) => void;
88
+ /**
89
+ * TaskStore - Main storage for task data
90
+ *
91
+ * This class provides CRUD operations with:
92
+ * - Atomic file operations to prevent corruption
93
+ * - Dependency resolution (supports both task IDs and task names)
94
+ * - Automatic timestamp management
95
+ * - Event notifications for changes
96
+ */
97
+ export declare class TaskStore {
98
+ private readonly tasksFilePath;
99
+ private readonly handlers;
100
+ private writeQueue;
101
+ private cachedDocument;
102
+ private cachedMtimeMs;
103
+ /**
104
+ * Create a new TaskStore
105
+ *
106
+ * @param dataDir - Optional data directory override (for testing)
107
+ */
108
+ constructor(dataDir?: string);
109
+ /**
110
+ * Subscribe to task change events
111
+ *
112
+ * @param handler - Function to call when tasks change
113
+ * @returns Unsubscribe function
114
+ */
115
+ onTaskChanged(handler: TaskChangeHandler): () => void;
116
+ /**
117
+ * Get all tasks
118
+ *
119
+ * @returns Array of all tasks
120
+ */
121
+ getAllAsync(): Promise<TaskItem[]>;
122
+ /**
123
+ * Get a single task by ID
124
+ *
125
+ * @param taskId - UUID of the task
126
+ * @returns Task if found, null otherwise
127
+ */
128
+ getByIdAsync(taskId: string): Promise<TaskItem | null>;
129
+ /**
130
+ * Create a new task
131
+ *
132
+ * @param request - Task creation data
133
+ * @returns Newly created task
134
+ */
135
+ createAsync(request: TaskCreateRequest): Promise<TaskItem>;
136
+ /**
137
+ * Update an existing task
138
+ *
139
+ * @param taskId - UUID of the task to update
140
+ * @param request - Update data
141
+ * @returns Updated task if found, null otherwise
142
+ */
143
+ updateAsync(taskId: string, request: TaskUpdateRequest): Promise<TaskItem | null>;
144
+ /**
145
+ * Delete a task by ID
146
+ *
147
+ * @param taskId - UUID of the task to delete
148
+ * @returns True if deleted, false if not found
149
+ */
150
+ deleteAsync(taskId: string): Promise<boolean>;
151
+ /**
152
+ * Clear all tasks (with backup of completed tasks)
153
+ *
154
+ * @returns Result with backup file path
155
+ */
156
+ clearAllAsync(): Promise<ClearAllResult>;
157
+ /**
158
+ * Read task document from disk
159
+ * Creates empty document if file doesn't exist
160
+ */
161
+ private readDocumentAsync;
162
+ /**
163
+ * Write task document to disk atomically
164
+ */
165
+ private writeDocumentAsync;
166
+ /**
167
+ * Find task index by ID
168
+ */
169
+ private findTaskIndex;
170
+ /**
171
+ * Apply updates to an existing task
172
+ * Handles status transitions and automatic timestamp management
173
+ */
174
+ private applyUpdates;
175
+ /**
176
+ * Convert dependency strings to TaskDependency objects
177
+ * Supports both task IDs (UUIDs) and task names
178
+ *
179
+ * Resolution logic:
180
+ * 1. Try exact UUID match
181
+ * 2. Try case-sensitive name match
182
+ * 3. Skip if no match found
183
+ */
184
+ private toDependencies;
185
+ /**
186
+ * Notify all registered handlers of a task change
187
+ */
188
+ private notifyHandlers;
189
+ private withWriteLock;
190
+ }
191
+ export {};
192
+ //# sourceMappingURL=taskStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskStore.d.ts","sourceRoot":"","sources":["../../src/data/taskStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,347 @@
1
+ /**
2
+ * TaskStore - CRUD operations for task management
3
+ *
4
+ * Provides thread-safe task operations with:
5
+ * - Atomic read-modify-write pattern
6
+ * - Dependency resolution (by ID or name)
7
+ * - Automatic timestamp management
8
+ * - Event notifications
9
+ */
10
+ import { writeJsonFile, readJsonFileOrDefault, } from './fileOperations.js';
11
+ import fs from 'fs/promises';
12
+ import { TaskDocumentSchema, TaskItemSchema, } from './schemas.js';
13
+ import { getDataPath } from '../config/pathResolver.js';
14
+ import { randomUUID } from 'crypto';
15
+ /**
16
+ * TaskStore - Main storage for task data
17
+ *
18
+ * This class provides CRUD operations with:
19
+ * - Atomic file operations to prevent corruption
20
+ * - Dependency resolution (supports both task IDs and task names)
21
+ * - Automatic timestamp management
22
+ * - Event notifications for changes
23
+ */
24
+ export class TaskStore {
25
+ tasksFilePath;
26
+ handlers = [];
27
+ writeQueue = Promise.resolve();
28
+ cachedDocument = null;
29
+ cachedMtimeMs = null;
30
+ /**
31
+ * Create a new TaskStore
32
+ *
33
+ * @param dataDir - Optional data directory override (for testing)
34
+ */
35
+ constructor(dataDir) {
36
+ this.tasksFilePath = getDataPath('tasks.json', dataDir);
37
+ }
38
+ /**
39
+ * Subscribe to task change events
40
+ *
41
+ * @param handler - Function to call when tasks change
42
+ * @returns Unsubscribe function
43
+ */
44
+ onTaskChanged(handler) {
45
+ this.handlers.push(handler);
46
+ return () => {
47
+ const index = this.handlers.indexOf(handler);
48
+ if (index >= 0) {
49
+ this.handlers.splice(index, 1);
50
+ }
51
+ };
52
+ }
53
+ /**
54
+ * Get all tasks
55
+ *
56
+ * @returns Array of all tasks
57
+ */
58
+ async getAllAsync() {
59
+ const document = await this.readDocumentAsync();
60
+ return document.tasks;
61
+ }
62
+ /**
63
+ * Get a single task by ID
64
+ *
65
+ * @param taskId - UUID of the task
66
+ * @returns Task if found, null otherwise
67
+ */
68
+ async getByIdAsync(taskId) {
69
+ const document = await this.readDocumentAsync();
70
+ return document.tasks.find(task => task.id === taskId) ?? null;
71
+ }
72
+ /**
73
+ * Create a new task
74
+ *
75
+ * @param request - Task creation data
76
+ * @returns Newly created task
77
+ */
78
+ async createAsync(request) {
79
+ return await this.withWriteLock(async () => {
80
+ const document = await this.readDocumentAsync();
81
+ const now = new Date().toISOString();
82
+ const task = {
83
+ id: randomUUID(),
84
+ name: request.name,
85
+ description: request.description,
86
+ notes: request.notes ?? null,
87
+ status: 'pending',
88
+ dependencies: this.toDependencies(request.dependencies ?? [], document.tasks),
89
+ createdAt: now,
90
+ updatedAt: now,
91
+ completedAt: null,
92
+ summary: null,
93
+ relatedFiles: request.relatedFiles ?? [],
94
+ analysisResult: request.analysisResult ?? null,
95
+ agent: request.agent ?? null,
96
+ implementationGuide: request.implementationGuide ?? null,
97
+ verificationCriteria: request.verificationCriteria ?? null,
98
+ };
99
+ // Validate the task matches schema
100
+ TaskItemSchema.parse(task);
101
+ const updatedDocument = {
102
+ version: document.version,
103
+ tasks: [...document.tasks, task],
104
+ };
105
+ await this.writeDocumentAsync(updatedDocument);
106
+ this.notifyHandlers({ type: 'created', task });
107
+ return task;
108
+ });
109
+ }
110
+ /**
111
+ * Update an existing task
112
+ *
113
+ * @param taskId - UUID of the task to update
114
+ * @param request - Update data
115
+ * @returns Updated task if found, null otherwise
116
+ */
117
+ async updateAsync(taskId, request) {
118
+ return await this.withWriteLock(async () => {
119
+ const document = await this.readDocumentAsync();
120
+ const index = this.findTaskIndex(document.tasks, taskId);
121
+ if (index < 0) {
122
+ return null;
123
+ }
124
+ const now = new Date().toISOString();
125
+ // eslint-disable-next-line security/detect-object-injection
126
+ const existing = document.tasks[index]; // Safe: index validated above
127
+ const updated = this.applyUpdates(existing, request, now, document.tasks);
128
+ const updatedTasks = [...document.tasks];
129
+ // eslint-disable-next-line security/detect-object-injection
130
+ updatedTasks[index] = updated;
131
+ const updatedDocument = {
132
+ version: document.version,
133
+ tasks: updatedTasks,
134
+ };
135
+ await this.writeDocumentAsync(updatedDocument);
136
+ this.notifyHandlers({ type: 'updated', task: updated });
137
+ return updated;
138
+ });
139
+ }
140
+ /**
141
+ * Delete a task by ID
142
+ *
143
+ * @param taskId - UUID of the task to delete
144
+ * @returns True if deleted, false if not found
145
+ */
146
+ async deleteAsync(taskId) {
147
+ return await this.withWriteLock(async () => {
148
+ const document = await this.readDocumentAsync();
149
+ const index = this.findTaskIndex(document.tasks, taskId);
150
+ if (index < 0) {
151
+ return false;
152
+ }
153
+ // eslint-disable-next-line security/detect-object-injection
154
+ const deletedTask = document.tasks[index]; // Safe: index validated above
155
+ const updatedTasks = [...document.tasks];
156
+ updatedTasks.splice(index, 1);
157
+ const updatedDocument = {
158
+ version: document.version,
159
+ tasks: updatedTasks,
160
+ };
161
+ await this.writeDocumentAsync(updatedDocument);
162
+ this.notifyHandlers({ type: 'deleted', task: deletedTask });
163
+ return true;
164
+ });
165
+ }
166
+ /**
167
+ * Clear all tasks (with backup of completed tasks)
168
+ *
169
+ * @returns Result with backup file path
170
+ */
171
+ async clearAllAsync() {
172
+ return await this.withWriteLock(async () => {
173
+ const document = await this.readDocumentAsync();
174
+ if (document.tasks.length === 0) {
175
+ return {
176
+ success: true,
177
+ message: 'No tasks to clear.',
178
+ backupFile: null,
179
+ };
180
+ }
181
+ // TODO: Implement backup functionality when MemoryStore is available
182
+ // For now, just clear tasks
183
+ const emptyDocument = {
184
+ version: '1.0',
185
+ tasks: [],
186
+ };
187
+ await this.writeDocumentAsync(emptyDocument);
188
+ this.notifyHandlers({ type: 'cleared' });
189
+ return {
190
+ success: true,
191
+ message: `Cleared ${document.tasks.length} task(s).`,
192
+ backupFile: null,
193
+ };
194
+ });
195
+ }
196
+ /**
197
+ * Read task document from disk
198
+ * Creates empty document if file doesn't exist
199
+ */
200
+ async readDocumentAsync() {
201
+ const defaultDocument = {
202
+ version: '1.0',
203
+ tasks: [],
204
+ };
205
+ let stats = null;
206
+ try {
207
+ stats = await fs.stat(this.tasksFilePath);
208
+ if (this.cachedDocument && this.cachedMtimeMs === stats.mtimeMs) {
209
+ return this.cachedDocument;
210
+ }
211
+ }
212
+ catch (error) {
213
+ const code = error.code;
214
+ if (code !== 'ENOENT') {
215
+ console.warn('Failed to stat tasks file:', error);
216
+ }
217
+ }
218
+ const document = await readJsonFileOrDefault(this.tasksFilePath, TaskDocumentSchema, defaultDocument);
219
+ this.cachedDocument = document;
220
+ this.cachedMtimeMs = stats?.mtimeMs ?? null;
221
+ // Schema defaults ensure arrays are never undefined, but TypeScript needs assertion
222
+ return document;
223
+ }
224
+ /**
225
+ * Write task document to disk atomically
226
+ */
227
+ async writeDocumentAsync(document) {
228
+ await writeJsonFile(this.tasksFilePath, document, TaskDocumentSchema);
229
+ this.cachedDocument = document;
230
+ try {
231
+ const stats = await fs.stat(this.tasksFilePath);
232
+ this.cachedMtimeMs = stats.mtimeMs;
233
+ }
234
+ catch (error) {
235
+ this.cachedMtimeMs = null;
236
+ console.warn('Failed to stat tasks file after write:', error);
237
+ }
238
+ }
239
+ /**
240
+ * Find task index by ID
241
+ */
242
+ findTaskIndex(tasks, taskId) {
243
+ return tasks.findIndex(task => task.id === taskId);
244
+ }
245
+ /**
246
+ * Apply updates to an existing task
247
+ * Handles status transitions and automatic timestamp management
248
+ */
249
+ applyUpdates(existing, request, now, allTasks) {
250
+ const status = request.status ?? existing.status;
251
+ const completedAt = status === 'completed'
252
+ ? (existing.completedAt ?? now)
253
+ : null;
254
+ const updated = {
255
+ ...existing,
256
+ name: request.name ?? existing.name,
257
+ description: request.description ?? existing.description,
258
+ notes: request.notes !== undefined ? request.notes : existing.notes,
259
+ status,
260
+ dependencies: request.dependencies !== undefined
261
+ ? this.toDependencies(request.dependencies ?? [], allTasks)
262
+ : existing.dependencies,
263
+ relatedFiles: request.relatedFiles ?? existing.relatedFiles,
264
+ summary: request.summary !== undefined ? request.summary : existing.summary,
265
+ analysisResult: request.analysisResult !== undefined
266
+ ? request.analysisResult
267
+ : existing.analysisResult,
268
+ agent: request.agent !== undefined ? request.agent : existing.agent,
269
+ implementationGuide: request.implementationGuide !== undefined
270
+ ? request.implementationGuide
271
+ : existing.implementationGuide,
272
+ verificationCriteria: request.verificationCriteria !== undefined
273
+ ? request.verificationCriteria
274
+ : existing.verificationCriteria,
275
+ updatedAt: now,
276
+ completedAt,
277
+ };
278
+ // Validate updated task
279
+ TaskItemSchema.parse(updated);
280
+ return updated;
281
+ }
282
+ /**
283
+ * Convert dependency strings to TaskDependency objects
284
+ * Supports both task IDs (UUIDs) and task names
285
+ *
286
+ * Resolution logic:
287
+ * 1. Try exact UUID match
288
+ * 2. Try case-sensitive name match
289
+ * 3. Skip if no match found
290
+ */
291
+ toDependencies(dependencyStrings, allTasks) {
292
+ const dependencies = [];
293
+ for (const depStr of dependencyStrings) {
294
+ if (!depStr || depStr.trim().length === 0) {
295
+ continue;
296
+ }
297
+ const trimmed = depStr.trim();
298
+ // Try UUID match first (exact ID)
299
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
300
+ if (uuidRegex.test(trimmed)) {
301
+ const taskById = allTasks.find(t => t.id === trimmed);
302
+ if (taskById) {
303
+ dependencies.push({ taskId: taskById.id });
304
+ continue;
305
+ }
306
+ }
307
+ // Try name match (case-sensitive)
308
+ const taskByName = allTasks.find(t => t.name === trimmed);
309
+ if (taskByName) {
310
+ dependencies.push({ taskId: taskByName.id });
311
+ continue;
312
+ }
313
+ // If no match found, skip this dependency
314
+ // This prevents invalid dependencies from being created
315
+ }
316
+ return dependencies;
317
+ }
318
+ /**
319
+ * Notify all registered handlers of a task change
320
+ */
321
+ notifyHandlers(event) {
322
+ for (const handler of this.handlers) {
323
+ try {
324
+ handler(event);
325
+ }
326
+ catch (error) {
327
+ // Don't let handler errors break the store
328
+ console.error('Error in task change handler:', error);
329
+ }
330
+ }
331
+ }
332
+ async withWriteLock(fn) {
333
+ const previous = this.writeQueue;
334
+ let release;
335
+ this.writeQueue = new Promise((resolve) => {
336
+ release = resolve;
337
+ });
338
+ await previous;
339
+ try {
340
+ return await fn();
341
+ }
342
+ finally {
343
+ release();
344
+ }
345
+ }
346
+ }
347
+ //# sourceMappingURL=taskStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskStore.js","sourceRoot":"","sources":["../../src/data/taskStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,aAAa,EACb,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAEL,kBAAkB,EAElB,cAAc,GAEf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAuGpC;;;;;;;;GAQG;AACH,MAAM,OAAO,SAAS;IACH,aAAa,CAAS;IACtB,QAAQ,GAAwB,EAAE,CAAC;IAC5C,UAAU,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9C,cAAc,GAAwB,IAAI,CAAC;IAC3C,aAAa,GAAkB,IAAI,CAAC;IAE5C;;;;OAIG;IACH,YAAY,OAAgB;QAC1B,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;OAKG;IACI,aAAa,CAAC,OAA0B;QAC7C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,GAAG,EAAE;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,WAAW;QACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChD,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,YAAY,CAAC,MAAc;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC;IACjE,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,WAAW,CAAC,OAA0B;QACjD,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;YACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAChD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAErC,MAAM,IAAI,GAAa;gBACrB,EAAE,EAAE,UAAU,EAAE;gBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;gBAC5B,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC;gBAC7E,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;gBACd,WAAW,EAAE,IAAI;gBACjB,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;gBACxC,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI;gBAC9C,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;gBAC5B,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,IAAI,IAAI;gBACxD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,IAAI;aAC3D,CAAC;YAEF,mCAAmC;YACnC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAE3B,MAAM,eAAe,GAAiB;gBACpC,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;aACjC,CAAC;YAEF,MAAM,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;YAC/C,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,WAAW,CACtB,MAAc,EACd,OAA0B;QAE1B,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;YACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEzD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,4DAA4D;YAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC,8BAA8B;YACvE,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAE1E,MAAM,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YACzC,4DAA4D;YAC5D,YAAY,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;YAE9B,MAAM,eAAe,GAAiB;gBACpC,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,KAAK,EAAE,YAAY;aACpB,CAAC;YAEF,MAAM,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;YAC/C,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACxD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,WAAW,CAAC,MAAc;QACrC,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;YACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEzD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,OAAO,KAAK,CAAC;YACf,CAAC;YAED,4DAA4D;YAC5D,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC,8BAA8B;YAC1E,MAAM,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YACzC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAE9B,MAAM,eAAe,GAAiB;gBACpC,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,KAAK,EAAE,YAAY;aACpB,CAAC;YAEF,MAAM,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;YAC/C,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,aAAa;QACxB,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;YACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAEhD,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,oBAAoB;oBAC7B,UAAU,EAAE,IAAI;iBACjB,CAAC;YACJ,CAAC;YAED,qEAAqE;YACrE,4BAA4B;YAC5B,MAAM,aAAa,GAAiB;gBAClC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE;aACV,CAAC;YAEF,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;YAC7C,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAEzC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,WAAW,QAAQ,CAAC,KAAK,CAAC,MAAM,WAAW;gBACpD,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,iBAAiB;QAC7B,MAAM,eAAe,GAAiB;YACpC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE;SACV,CAAC;QAEF,IAAI,KAAK,GAA+B,IAAI,CAAC;QAC7C,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1C,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChE,OAAO,IAAI,CAAC,cAAc,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;YACnD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAC1C,IAAI,CAAC,aAAa,EAClB,kBAAkB,EAClB,eAAe,CAChB,CAAC;QAEF,IAAI,CAAC,cAAc,GAAG,QAAwB,CAAC;QAC/C,IAAI,CAAC,aAAa,GAAG,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC;QAE5C,oFAAoF;QACpF,OAAO,QAAwB,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAAC,QAAsB;QACrD,MAAM,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QACtE,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,KAAiB,EAAE,MAAc;QACrD,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACK,YAAY,CAClB,QAAkB,EAClB,OAA0B,EAC1B,GAAW,EACX,QAAoB;QAEpB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC;QACjD,MAAM,WAAW,GAAG,MAAM,KAAK,WAAW;YACxC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,IAAI,GAAG,CAAC;YAC/B,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,OAAO,GAAa;YACxB,GAAG,QAAQ;YACX,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;YACnC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW;YACxD,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK;YACnE,MAAM;YACN,YAAY,EAAE,OAAO,CAAC,YAAY,KAAK,SAAS;gBAC9C,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,EAAE,QAAQ,CAAC;gBAC3D,CAAC,CAAC,QAAQ,CAAC,YAAY;YACzB,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY;YAC3D,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO;YAC3E,cAAc,EAAE,OAAO,CAAC,cAAc,KAAK,SAAS;gBAClD,CAAC,CAAC,OAAO,CAAC,cAAc;gBACxB,CAAC,CAAC,QAAQ,CAAC,cAAc;YAC3B,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK;YACnE,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,KAAK,SAAS;gBAC5D,CAAC,CAAC,OAAO,CAAC,mBAAmB;gBAC7B,CAAC,CAAC,QAAQ,CAAC,mBAAmB;YAChC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,KAAK,SAAS;gBAC9D,CAAC,CAAC,OAAO,CAAC,oBAAoB;gBAC9B,CAAC,CAAC,QAAQ,CAAC,oBAAoB;YACjC,SAAS,EAAE,GAAG;YACd,WAAW;SACZ,CAAC;QAEF,wBAAwB;QACxB,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;;OAQG;IACK,cAAc,CACpB,iBAA2B,EAC3B,QAAoB;QAEpB,MAAM,YAAY,GAAqB,EAAE,CAAC;QAE1C,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1C,SAAS;YACX,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAE9B,kCAAkC;YAClC,MAAM,SAAS,GAAG,iEAAiE,CAAC;YACpF,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;gBACtD,IAAI,QAAQ,EAAE,CAAC;oBACb,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC3C,SAAS;gBACX,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;YAC1D,IAAI,UAAU,EAAE,CAAC;gBACf,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7C,SAAS;YACX,CAAC;YAED,0CAA0C;YAC1C,wDAAwD;QAC1D,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAsB;QAC3C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,2CAA2C;gBAC3C,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAI,EAAoB;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;QACjC,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC9C,OAAO,GAAG,OAAO,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,CAAC;QACf,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Entry Point for MCP Task and Research Server
4
+ *
5
+ * This file serves as the main entry point for the MCP server.
6
+ * It handles:
7
+ * - Environment configuration (DATA_DIR, LOG_LEVEL, NODE_ENV)
8
+ * - Server initialization and startup
9
+ * - Global error handling
10
+ * - Process lifecycle management
11
+ *
12
+ * The server uses STDIO transport, so:
13
+ * - stdin: Receives JSON-RPC requests from MCP client
14
+ * - stdout: Sends JSON-RPC responses to MCP client
15
+ * - stderr: Logs (don't pollute stdout!)
16
+ *
17
+ * Environment Variables:
18
+ * - DATA_DIR: Directory for task data (default: .mcp-tasks in workspace)
19
+ * - LOG_LEVEL: Log verbosity (trace, debug, info, warn, error)
20
+ * - NODE_ENV: Environment (development, production)
21
+ */
22
+ export {};
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG"}
package/dist/index.js ADDED
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Entry Point for MCP Task and Research Server
4
+ *
5
+ * This file serves as the main entry point for the MCP server.
6
+ * It handles:
7
+ * - Environment configuration (DATA_DIR, LOG_LEVEL, NODE_ENV)
8
+ * - Server initialization and startup
9
+ * - Global error handling
10
+ * - Process lifecycle management
11
+ *
12
+ * The server uses STDIO transport, so:
13
+ * - stdin: Receives JSON-RPC requests from MCP client
14
+ * - stdout: Sends JSON-RPC responses to MCP client
15
+ * - stderr: Logs (don't pollute stdout!)
16
+ *
17
+ * Environment Variables:
18
+ * - DATA_DIR: Directory for task data (default: .mcp-tasks in workspace)
19
+ * - LOG_LEVEL: Log verbosity (trace, debug, info, warn, error)
20
+ * - NODE_ENV: Environment (development, production)
21
+ */
22
+ import { getLogger } from './server/logger.js';
23
+ import { createMcpServer } from './server/mcpServer.js';
24
+ import { initializeGlobalContainer } from './server/container.js';
25
+ import pino from 'pino';
26
+ /**
27
+ * Main entry point
28
+ *
29
+ * Handles server lifecycle:
30
+ * 1. Configure logging (silent in production, verbose in dev)
31
+ * 2. Initialize dependency injection container
32
+ * 3. Create and configure MCP server
33
+ * 4. Start STDIO transport
34
+ * 5. Handle uncaught errors gracefully
35
+ */
36
+ async function main() {
37
+ const isProduction = process.env['NODE_ENV'] === 'production';
38
+ let logger = getLogger();
39
+ if (isProduction && !process.env['LOG_LEVEL']) {
40
+ logger = pino({ level: 'error' });
41
+ }
42
+ try {
43
+ // Log startup (to stderr, won't interfere with STDIO transport)
44
+ logger.info({
45
+ nodeVersion: process.version,
46
+ platform: process.platform,
47
+ dataDir: process.env['DATA_DIR'] ?? '.mcp-tasks',
48
+ }, 'Starting MCP Task and Research Server');
49
+ // Initialize dependency injection container
50
+ // This is the "Composition Root" - where all services are wired together
51
+ const container = initializeGlobalContainer({
52
+ dataDir: process.env['DATA_DIR'],
53
+ });
54
+ // Create and start server with container
55
+ const server = createMcpServer(container);
56
+ await server.start();
57
+ // Server is now running and processing requests via STDIO
58
+ // It will continue until SIGINT/SIGTERM is received
59
+ }
60
+ catch (error) {
61
+ logger.error({ err: error }, 'Failed to start MCP server');
62
+ process.exit(1);
63
+ }
64
+ }
65
+ /**
66
+ * Global error handlers
67
+ *
68
+ * Ensures that uncaught errors are logged before process termination
69
+ * This prevents silent failures in production
70
+ */
71
+ process.on('uncaughtException', (error) => {
72
+ const logger = getLogger();
73
+ logger.fatal({ err: error }, 'Uncaught exception');
74
+ process.exit(1);
75
+ });
76
+ process.on('unhandledRejection', (reason) => {
77
+ const logger = getLogger();
78
+ logger.fatal({ err: reason }, 'Unhandled promise rejection');
79
+ process.exit(1);
80
+ });
81
+ // Start the server
82
+ main().catch((error) => {
83
+ console.error('Fatal error:', error);
84
+ process.exit(1);
85
+ });
86
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;;;;;;GASG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,YAAY,CAAC;IAE9D,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,YAAY,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC;QACH,gEAAgE;QAChE,MAAM,CAAC,IAAI,CACT;YACE,WAAW,EAAE,OAAO,CAAC,OAAO;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,YAAY;SACjD,EACD,uCAAuC,CACxC,CAAC;QAEF,4CAA4C;QAC5C,yEAAyE;QACzE,MAAM,SAAS,GAAG,yBAAyB,CAAC;YAC1C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;SACjC,CAAC,CAAC;QAEH,yCAAyC;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAErB,0DAA0D;QAC1D,oDAAoD;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,4BAA4B,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAY,EAAE,EAAE;IAC/C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,oBAAoB,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAe,EAAE,EAAE;IACnD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,6BAA6B,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}