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,529 @@
1
+ /**
2
+ * Prompt builders for task management tools.
3
+ * Each builder generates formatted prompts by combining templates with runtime data.
4
+ *
5
+ * Architecture:
6
+ * - Builder per tool (separation of concerns)
7
+ * - Template loading via TemplateLoader (caching)
8
+ * - Rendering via TemplateEngine (safe string replacement)
9
+ * - Conditional rendering logic in code (not templates)
10
+ *
11
+ * @module prompts/taskPromptBuilders
12
+ */
13
+ import { loadTemplate } from './templateLoader.js';
14
+ import { render } from './templateEngine.js';
15
+ // ============================================================================
16
+ // Helper Functions
17
+ // ============================================================================
18
+ /**
19
+ * Truncates text to max length with ellipsis.
20
+ */
21
+ function truncate(text, maxLength) {
22
+ if (text.length <= maxLength) {
23
+ return text;
24
+ }
25
+ return text.substring(0, maxLength) + '...';
26
+ }
27
+ /**
28
+ * Formats a timestamp in a human-readable format.
29
+ */
30
+ function formatDate(dateString) {
31
+ const date = new Date(dateString);
32
+ return date.toLocaleDateString('en-US', {
33
+ weekday: 'long',
34
+ day: 'numeric',
35
+ month: 'long',
36
+ year: 'numeric',
37
+ hour: '2-digit',
38
+ minute: '2-digit'
39
+ });
40
+ }
41
+ /**
42
+ * Converts task status string to serialized value (pass-through for now).
43
+ */
44
+ function taskStatusToString(status) {
45
+ return status;
46
+ }
47
+ /**
48
+ * Formats task dependencies as markdown list.
49
+ */
50
+ function formatDependencies(dependencies) {
51
+ if (dependencies.length === 0) {
52
+ return '';
53
+ }
54
+ const list = dependencies.map(dep => `\`${dep.taskId}\``).join(', ');
55
+ return ` - dependencies: ${list}\n`;
56
+ }
57
+ // ============================================================================
58
+ // AnalyzeTaskPromptBuilder
59
+ // ============================================================================
60
+ export class AnalyzeTaskPromptBuilder {
61
+ async build(summary, initialConcept, previousAnalysis) {
62
+ const iterationPrompt = await this.buildIteration(previousAnalysis);
63
+ const template = await loadTemplate('analyzeTask/index.md');
64
+ return render(template, {
65
+ summary,
66
+ initialConcept,
67
+ iterationPrompt
68
+ });
69
+ }
70
+ async buildIteration(previousAnalysis) {
71
+ if (!previousAnalysis || previousAnalysis.trim() === '') {
72
+ return '';
73
+ }
74
+ const template = await loadTemplate('analyzeTask/iteration.md');
75
+ return render(template, { previousAnalysis });
76
+ }
77
+ }
78
+ // ============================================================================
79
+ // ReflectTaskPromptBuilder
80
+ // ============================================================================
81
+ export class ReflectTaskPromptBuilder {
82
+ async build(summary, analysis) {
83
+ const template = await loadTemplate('reflectTask/index.md');
84
+ return render(template, { summary, analysis });
85
+ }
86
+ }
87
+ // ============================================================================
88
+ // PlanTaskPromptBuilder
89
+ // ============================================================================
90
+ export class PlanTaskPromptBuilder {
91
+ static COMPLETED_TASK_LIMIT = 10;
92
+ async build(description, requirements, existingTasksReference, completedTasks, pendingTasks, memoryDir, rulesPath) {
93
+ const tasksTemplate = await this.buildTasksTemplate(existingTasksReference, completedTasks, pendingTasks);
94
+ const thoughtTemplate = await this.loadThoughtTemplate();
95
+ const template = await loadTemplate('planTask/index.md');
96
+ return render(template, {
97
+ description,
98
+ requirements: requirements || 'No requirements',
99
+ tasksTemplate,
100
+ rulesPath,
101
+ memoryDir,
102
+ thoughtTemplate
103
+ });
104
+ }
105
+ async buildTasksTemplate(existingTasksReference, completedTasks, pendingTasks) {
106
+ if (!existingTasksReference) {
107
+ return '';
108
+ }
109
+ const totalCount = completedTasks.length + pendingTasks.length;
110
+ if (totalCount === 0) {
111
+ return '';
112
+ }
113
+ const template = await loadTemplate('planTask/tasks.md');
114
+ return render(template, {
115
+ completedTasks: this.buildCompletedTasksContent(completedTasks),
116
+ unfinishedTasks: this.buildPendingTasksContent(pendingTasks)
117
+ });
118
+ }
119
+ buildCompletedTasksContent(completedTasks) {
120
+ if (completedTasks.length === 0) {
121
+ return 'no completed tasks';
122
+ }
123
+ const sorted = [...completedTasks].sort((a, b) => {
124
+ const aTime = Date.parse(a.completedAt ?? a.updatedAt ?? a.createdAt);
125
+ const bTime = Date.parse(b.completedAt ?? b.updatedAt ?? b.createdAt);
126
+ return (Number.isNaN(bTime) ? 0 : bTime) - (Number.isNaN(aTime) ? 0 : aTime);
127
+ });
128
+ const limited = sorted.slice(0, 10);
129
+ const items = limited.map((task, index) => this.formatCompletedTask(index + 1, task));
130
+ return items.join('\n\n');
131
+ }
132
+ buildPendingTasksContent(pendingTasks) {
133
+ if (pendingTasks.length === 0) {
134
+ return 'no pending tasks';
135
+ }
136
+ const items = pendingTasks.map((task, index) => this.formatPendingTask(index + 1, task));
137
+ return items.join('\n\n');
138
+ }
139
+ formatCompletedTask(index, task) {
140
+ const description = truncate(task.description, 100);
141
+ const completedAt = task.completedAt
142
+ ? ` - completedAt: ${formatDate(task.completedAt)}\n`
143
+ : '';
144
+ return `${index}. **${task.name}** (ID: \`${task.id}\`)\n - description: ${description}\n${completedAt}`;
145
+ }
146
+ formatPendingTask(index, task) {
147
+ const description = truncate(task.description, 150);
148
+ const dependencies = formatDependencies(task.dependencies);
149
+ return (`${index}. **${task.name}** (ID: \`${task.id}\`)\n` +
150
+ ` - description: ${description}\n` +
151
+ ` - status: ${taskStatusToString(task.status)}\n` +
152
+ `${dependencies}`);
153
+ }
154
+ async loadThoughtTemplate() {
155
+ const thoughtEnabled = process.env['ENABLE_THOUGHT_CHAIN'];
156
+ const templatePath = thoughtEnabled?.toLowerCase() === 'false'
157
+ ? 'planTask/noThought.md'
158
+ : 'planTask/hasThought.md';
159
+ return await loadTemplate(templatePath);
160
+ }
161
+ }
162
+ // ============================================================================
163
+ // SplitTasksPromptBuilder
164
+ // ============================================================================
165
+ export class SplitTasksPromptBuilder {
166
+ async build(updateMode, createdTasks, allTasks) {
167
+ const taskDetailsTemplate = await loadTemplate('splitTasks/taskDetails.md');
168
+ const tasksContent = this.buildTasksContent(taskDetailsTemplate, createdTasks, allTasks);
169
+ const indexTemplate = await loadTemplate('splitTasks/index.md');
170
+ return render(indexTemplate, {
171
+ updateMode,
172
+ tasksContent
173
+ });
174
+ }
175
+ buildTasksContent(taskDetailsTemplate, createdTasks, allTasks) {
176
+ const items = createdTasks.map((task, index) => {
177
+ const taskData = {
178
+ index: index + 1,
179
+ id: task.id,
180
+ name: task.name,
181
+ description: task.description,
182
+ dependencies: this.formatTaskDependencies(task.dependencies, allTasks),
183
+ implementationGuide: task.implementationGuide || '',
184
+ verificationCriteria: task.verificationCriteria || '',
185
+ notes: task.notes || ''
186
+ };
187
+ return render(taskDetailsTemplate, taskData);
188
+ });
189
+ return items.join('\n\n');
190
+ }
191
+ formatTaskDependencies(dependencies, allTasks) {
192
+ if (dependencies.length === 0) {
193
+ return 'none';
194
+ }
195
+ return dependencies
196
+ .map(dep => {
197
+ const task = allTasks.find(t => t.id === dep.taskId);
198
+ return task ? `\`${task.name}\`` : `\`${dep.taskId}\``;
199
+ })
200
+ .join(', ');
201
+ }
202
+ }
203
+ // ============================================================================
204
+ // ListTasksPromptBuilder
205
+ // ============================================================================
206
+ export class ListTasksPromptBuilder {
207
+ async build(tasks, statusFilter) {
208
+ const statusCounts = this.calculateStatusCounts(tasks);
209
+ const tasksByStatus = this.groupTasksByStatus(tasks, statusFilter);
210
+ const taskDetailsTemplate = this.buildTaskDetails(tasksByStatus);
211
+ const template = await loadTemplate('listTasks/index.md');
212
+ return render(template, {
213
+ statusCount: this.formatStatusCounts(statusCounts),
214
+ taskDetailsTemplate
215
+ });
216
+ }
217
+ calculateStatusCounts(tasks) {
218
+ const counts = {
219
+ pending: 0,
220
+ in_progress: 0,
221
+ completed: 0,
222
+ blocked: 0
223
+ };
224
+ for (const task of tasks) {
225
+ const status = taskStatusToString(task.status);
226
+ if (status in counts) {
227
+ // eslint-disable-next-line security/detect-object-injection
228
+ counts[status]++;
229
+ }
230
+ }
231
+ return counts;
232
+ }
233
+ groupTasksByStatus(tasks, statusFilter) {
234
+ if (statusFilter !== undefined) {
235
+ return tasks.filter(t => t.status === statusFilter);
236
+ }
237
+ return tasks;
238
+ }
239
+ formatStatusCounts(counts) {
240
+ return Object.entries(counts)
241
+ .map(([status, count]) => `- **${status}**: ${count} tasks`)
242
+ .join('\n');
243
+ }
244
+ buildTaskDetails(tasks) {
245
+ if (tasks.length === 0) {
246
+ return 'No tasks found.';
247
+ }
248
+ const items = [];
249
+ for (const task of tasks) {
250
+ const summary = truncate(task.description, 200);
251
+ const deps = task.dependencies.length > 0
252
+ ? `\n\n**Dependencies:** ${formatDependencies(task.dependencies)}`
253
+ : '';
254
+ const completed = task.completedAt
255
+ ? `\n\n**Completed:** ${formatDate(task.completedAt)}`
256
+ : '';
257
+ items.push(`### ${task.name}\n\n` +
258
+ `**ID:** \`${task.id}\`\n\n` +
259
+ `**Description:** ${summary}\n\n` +
260
+ `${deps}${completed}\n\n` +
261
+ `**Creation Time:** ${formatDate(task.createdAt)}\n`);
262
+ }
263
+ return items.join('\n\n');
264
+ }
265
+ }
266
+ // ============================================================================
267
+ // QueryTaskPromptBuilder
268
+ // ============================================================================
269
+ export class QueryTaskPromptBuilder {
270
+ async build(query, tasks, page, pageSize, totalTasks) {
271
+ const totalPages = Math.ceil(totalTasks / pageSize);
272
+ const tasksContent = this.buildTasksContent(tasks);
273
+ const template = await loadTemplate('queryTask/index.md');
274
+ return render(template, {
275
+ query,
276
+ tasksContent,
277
+ page,
278
+ pageSize,
279
+ totalPages,
280
+ totalTasks
281
+ });
282
+ }
283
+ buildTasksContent(tasks) {
284
+ if (tasks.length === 0) {
285
+ return 'No tasks found matching the query.';
286
+ }
287
+ const items = tasks.map(task => {
288
+ const summary = truncate(task.description, 150);
289
+ return (`### ${task.name} (ID: ${task.id})\n\n` +
290
+ `- Status: ${taskStatusToString(task.status)}\n` +
291
+ `- Description: ${summary}\n` +
292
+ `- Creation Time: ${formatDate(task.createdAt)}\n`);
293
+ });
294
+ return items.join('\n\n');
295
+ }
296
+ }
297
+ // ============================================================================
298
+ // GetTaskDetailPromptBuilder
299
+ // ============================================================================
300
+ export class GetTaskDetailPromptBuilder {
301
+ async build(task, allTasks) {
302
+ const template = await loadTemplate('getTaskDetail/index.md');
303
+ return render(template, {
304
+ id: task.id,
305
+ name: task.name,
306
+ description: task.description,
307
+ dependenciesPrompt: await this.buildDependenciesPrompt(task.dependencies, allTasks),
308
+ implementationGuidePrompt: this.buildImplementationGuidePrompt(task.implementationGuide ?? undefined),
309
+ verificationCriteriaPrompt: this.buildVerificationCriteriaPrompt(task.verificationCriteria ?? undefined),
310
+ notesPrompt: this.buildNotesPrompt(task.notes ?? undefined),
311
+ relatedFilesSummaryPrompt: await this.buildRelatedFilesPrompt(task.relatedFiles),
312
+ completedSummaryPrompt: await this.buildCompletedSummaryPrompt(task)
313
+ });
314
+ }
315
+ async buildDependenciesPrompt(dependencies, allTasks) {
316
+ if (dependencies.length === 0) {
317
+ return '';
318
+ }
319
+ const template = await loadTemplate('getTaskDetail/dependencies.md');
320
+ const depTasks = dependencies
321
+ .map(dep => allTasks.find(t => t.id === dep.taskId))
322
+ .filter((t) => t !== undefined);
323
+ const list = depTasks.map(t => `\`${t.id}\``).join(', ');
324
+ return render(template, { dependencies: list });
325
+ }
326
+ buildImplementationGuidePrompt(guide) {
327
+ return guide ? `\n\n**Implementation Guide:**\n\n${guide}\n` : '';
328
+ }
329
+ buildVerificationCriteriaPrompt(criteria) {
330
+ return criteria ? `\n\n**Verification Criteria:**\n\n${criteria}\n` : '';
331
+ }
332
+ buildNotesPrompt(notes) {
333
+ return notes ? `\n\n**Notes:** ${notes}\n` : '';
334
+ }
335
+ async buildRelatedFilesPrompt(relatedFiles) {
336
+ if (relatedFiles.length === 0) {
337
+ return '';
338
+ }
339
+ const template = await loadTemplate('getTaskDetail/relatedFiles.md');
340
+ const grouped = this.groupFilesByType(relatedFiles);
341
+ const filesList = Object.entries(grouped)
342
+ .map(([type, files]) => {
343
+ const paths = files.map(f => `\`${f.path}\``).join(', ');
344
+ return `- **${type}**: ${paths}`;
345
+ })
346
+ .join('\n');
347
+ return render(template, { filesList });
348
+ }
349
+ groupFilesByType(files) {
350
+ const grouped = {};
351
+ for (const file of files) {
352
+ if (!grouped[file.type]) {
353
+ grouped[file.type] = [];
354
+ }
355
+ grouped[file.type].push(file);
356
+ }
357
+ return grouped;
358
+ }
359
+ async buildCompletedSummaryPrompt(task) {
360
+ if (!task.completedAt) {
361
+ return '';
362
+ }
363
+ const template = await loadTemplate('getTaskDetail/completed.md');
364
+ return render(template, {
365
+ completedAt: formatDate(task.completedAt),
366
+ completedSummary: task.summary || 'No summary provided'
367
+ });
368
+ }
369
+ }
370
+ // ============================================================================
371
+ // ExecuteTaskPromptBuilder
372
+ // ============================================================================
373
+ export class ExecuteTaskPromptBuilder {
374
+ async build(task, dependencyTasks, complexity, analysisResult) {
375
+ const dependencyTasksTemplate = await this.buildDependencyTasksTemplate(dependencyTasks);
376
+ const complexityTemplate = await this.buildComplexityTemplate(complexity);
377
+ const analysisResultTemplate = this.buildAnalysisResultTemplate(analysisResult);
378
+ const template = await loadTemplate('executeTask/index.md');
379
+ return render(template, {
380
+ id: task.id,
381
+ name: task.name,
382
+ description: task.description,
383
+ dependencyTasksTemplate,
384
+ implementationGuideTemplate: task.implementationGuide || '',
385
+ verificationCriteriaTemplate: task.verificationCriteria || '',
386
+ notesTemplate: task.notes || '',
387
+ relatedFilesSummaryTemplate: this.buildRelatedFilesSection(task.relatedFiles),
388
+ complexityTemplate,
389
+ analysisResultTemplate
390
+ });
391
+ }
392
+ async buildDependencyTasksTemplate(tasks) {
393
+ if (tasks.length === 0) {
394
+ return '';
395
+ }
396
+ const template = await loadTemplate('executeTask/dependencies.md');
397
+ const list = tasks.map(t => `\`${t.id}\``).join(', ');
398
+ return render(template, { dependencies: list });
399
+ }
400
+ async buildComplexityTemplate(complexity) {
401
+ const levelLabels = {
402
+ LOW: 'low',
403
+ MEDIUM: 'moderate',
404
+ HIGH: 'high',
405
+ VERY_HIGH: 'extremely complex'
406
+ };
407
+ const template = await loadTemplate('executeTask/complexity.md');
408
+ // eslint-disable-next-line security/detect-object-injection
409
+ const level = levelLabels[complexity];
410
+ return render(template, {
411
+ level,
412
+ recommendation: this.getComplexityRecommendation(complexity)
413
+ });
414
+ }
415
+ getComplexityRecommendation(complexity) {
416
+ if (complexity === 'MEDIUM') {
417
+ return 'TIP: This task has moderate complexity.';
418
+ }
419
+ else if (complexity === 'HIGH') {
420
+ return 'WARNING: This task has high complexity.';
421
+ }
422
+ else if (complexity === 'VERY_HIGH') {
423
+ return 'WARNING: This task is extremely complex.';
424
+ }
425
+ return '';
426
+ }
427
+ buildAnalysisResultTemplate(analysisResult) {
428
+ return analysisResult ? `\n\n## Analysis Background\n\n${analysisResult}\n` : '';
429
+ }
430
+ buildRelatedFilesSection(files) {
431
+ if (files.length === 0) {
432
+ return '';
433
+ }
434
+ return files.map(f => `- \`${f.path}\` (${f.type})`).join('\n');
435
+ }
436
+ }
437
+ // ============================================================================
438
+ // VerifyTaskPromptBuilder
439
+ // ============================================================================
440
+ export class VerifyTaskPromptBuilder {
441
+ async build(task) {
442
+ const template = await loadTemplate('verifyTask/index.md');
443
+ return render(template, {
444
+ taskId: task.id,
445
+ taskName: task.name,
446
+ taskSummary: task.summary || 'No summary provided'
447
+ });
448
+ }
449
+ }
450
+ // ============================================================================
451
+ // UpdateTaskPromptBuilder
452
+ // ============================================================================
453
+ export class UpdateTaskPromptBuilder {
454
+ async buildResult(task, updatedFields) {
455
+ const successDetails = await this.buildSuccessDetails(updatedFields);
456
+ const relatedFilesContent = this.buildRelatedFilesContent(task.relatedFiles);
457
+ const template = await loadTemplate('updateTaskContent/index.md');
458
+ return render(template, {
459
+ taskId: task.id,
460
+ taskName: task.name,
461
+ successDetails,
462
+ relatedFilesContent
463
+ });
464
+ }
465
+ async buildNotFound(taskId) {
466
+ const template = await loadTemplate('updateTaskContent/notFound.md');
467
+ return render(template, { taskId });
468
+ }
469
+ async buildEmptyUpdate() {
470
+ return await loadTemplate('updateTaskContent/emptyUpdate.md');
471
+ }
472
+ async buildValidation(errors) {
473
+ const template = await loadTemplate('updateTaskContent/validation.md');
474
+ return render(template, { errors: errors.join('\n') });
475
+ }
476
+ async buildSuccessDetails(fields) {
477
+ const template = await loadTemplate('updateTaskContent/successDetails.md');
478
+ const fieldsList = fields.map(f => `- ${f}`).join('\n');
479
+ return render(template, { fields: fieldsList });
480
+ }
481
+ buildRelatedFilesContent(files) {
482
+ if (files.length === 0) {
483
+ return '';
484
+ }
485
+ return '\n\n**Related Files:**\n' +
486
+ files.map(f => `- \`${f.path}\` (${f.type})`).join('\n');
487
+ }
488
+ }
489
+ // ============================================================================
490
+ // DeleteTaskPromptBuilder
491
+ // ============================================================================
492
+ export class DeleteTaskPromptBuilder {
493
+ async buildResult(taskName) {
494
+ const template = await loadTemplate('deleteTask/result.md');
495
+ return render(template, { taskName });
496
+ }
497
+ async buildNotFound(taskId) {
498
+ const template = await loadTemplate('deleteTask/notFound.md');
499
+ return render(template, { taskId });
500
+ }
501
+ async buildCompleted(taskId) {
502
+ const template = await loadTemplate('deleteTask/completed.md');
503
+ return render(template, { taskId });
504
+ }
505
+ }
506
+ // ============================================================================
507
+ // ClearAllTasksPromptBuilder
508
+ // ============================================================================
509
+ export class ClearAllTasksPromptBuilder {
510
+ async buildResult(deletedCount, backupPath) {
511
+ const backupInfo = await this.buildBackupInfo(backupPath);
512
+ const template = await loadTemplate('clearAllTasks/result.md');
513
+ return render(template, {
514
+ count: deletedCount,
515
+ backupInfo
516
+ });
517
+ }
518
+ async buildEmpty() {
519
+ return await loadTemplate('clearAllTasks/empty.md');
520
+ }
521
+ async buildCancel() {
522
+ return await loadTemplate('clearAllTasks/cancel.md');
523
+ }
524
+ async buildBackupInfo(backupPath) {
525
+ const template = await loadTemplate('clearAllTasks/backupInfo.md');
526
+ return render(template, { backupPath });
527
+ }
528
+ }
529
+ //# sourceMappingURL=taskPromptBuilders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskPromptBuilders.js","sourceRoot":"","sources":["../../src/prompts/taskPromptBuilders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Lightweight template engine for rendering prompt templates with variable substitution.
3
+ *
4
+ * Design:
5
+ * - Matches the reference prompt rendering behavior
6
+ * - Simple token replacement: {{key}}, {{ key }}, {key}
7
+ * - Logic handled in code, not templates (separation of concerns)
8
+ * - Zero external dependencies
9
+ *
10
+ * @module prompts/templateEngine
11
+ */
12
+ /**
13
+ * Template parameters - string keys to any values.
14
+ * Values will be converted to string via .toString() or empty string for null/undefined.
15
+ */
16
+ export type TemplateParameters = Readonly<Record<string, unknown>>;
17
+ /**
18
+ * Renders a template string by replacing tokens with provided parameter values.
19
+ *
20
+ * Supported token formats (case-sensitive):
21
+ * - {{key}} - standard Handlebars/Mustache style
22
+ * - {{ key }} - with spaces
23
+ * - {key} - simple braces (for compatibility)
24
+ *
25
+ * Performance: O(n*m) where n = template length, m = number of parameters.
26
+ * For 1000 renders: ~5-10ms (much faster than Handlebars compilation)
27
+ *
28
+ * @param template - The template string with tokens to replace
29
+ * @param parameters - Key-value pairs for token replacement
30
+ * @returns Rendered template with tokens replaced
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * const template = "Hello {{name}}, you have {{count}} messages!";
35
+ * const result = render(template, { name: "Alice", count: 5 });
36
+ * // Returns: "Hello Alice, you have 5 messages!"
37
+ * ```
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * // Nested template composition (logic in code, not template)
42
+ * const partial = render("Task: {{taskName}}", { taskName: "Deploy" });
43
+ * const full = render("{{header}}\n{{body}}", { header: "# Tasks", body: partial });
44
+ * ```
45
+ */
46
+ export declare function render(template: string, parameters?: TemplateParameters | null): string;
47
+ /**
48
+ * Template engine for batch rendering multiple templates efficiently.
49
+ * Useful for rendering template partials and composing complex prompts.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * const engine = new TemplateEngine();
54
+ * const header = engine.render("# {{title}}", { title: "Tasks" });
55
+ * const body = engine.render("Count: {{count}}", { count: 42 });
56
+ * const full = engine.render("{{header}}\n{{body}}", { header, body });
57
+ * ```
58
+ */
59
+ export declare class TemplateEngine {
60
+ /**
61
+ * Renders a template with parameters.
62
+ * Convenience method that delegates to the `render` function.
63
+ *
64
+ * @param template - Template string
65
+ * @param parameters - Replacement parameters
66
+ * @returns Rendered result
67
+ */
68
+ render(template: string, parameters?: TemplateParameters | null): string;
69
+ /**
70
+ * Renders multiple templates in sequence, passing results as parameters.
71
+ * Useful for composing nested templates.
72
+ *
73
+ * @param templates - Array of {template, parameters} objects
74
+ * @returns Array of rendered results
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const engine = new TemplateEngine();
79
+ * const results = engine.renderBatch([
80
+ * { template: "Name: {{name}}", parameters: { name: "Alice" } },
81
+ * { template: "Age: {{age}}", parameters: { age: 30 } }
82
+ * ]);
83
+ * // Returns: ["Name: Alice", "Age: 30"]
84
+ * ```
85
+ */
86
+ renderBatch(templates: ReadonlyArray<{
87
+ template: string;
88
+ parameters?: TemplateParameters | null;
89
+ }>): string[];
90
+ }
91
+ /**
92
+ * Default template engine instance for convenience.
93
+ * Use this for simple one-off rendering operations.
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * import { defaultEngine } from './templateEngine.js';
98
+ * const result = defaultEngine.render("Hello {{name}}", { name: "World" });
99
+ * ```
100
+ */
101
+ export declare const defaultEngine: TemplateEngine;
102
+ //# sourceMappingURL=templateEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateEngine.d.ts","sourceRoot":"","sources":["../../src/prompts/templateEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,MAAM,CACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,kBAAkB,GAAG,IAAI,GACrC,MAAM,CAwBR;AAyCD;;;;;;;;;;;GAWG;AACH,qBAAa,cAAc;IACzB;;;;;;;OAOG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,kBAAkB,GAAG,IAAI,GAAG,MAAM;IAIxE;;;;;;;;;;;;;;;;OAgBG;IACH,WAAW,CACT,SAAS,EAAE,aAAa,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;KACxC,CAAC,GACD,MAAM,EAAE;CAKZ;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,gBAAuB,CAAC"}