mcp-spec-cli 1.1.0 → 1.2.1

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 (68) hide show
  1. package/api/spec-workflow.openapi.yaml +31 -23
  2. package/dist/cli.js +25 -14
  3. package/dist/cli.js.map +1 -1
  4. package/dist/features/shared/MarkdownTaskUpdater.d.ts +14 -0
  5. package/dist/features/shared/MarkdownTaskUpdater.d.ts.map +1 -0
  6. package/dist/features/shared/MarkdownTaskUpdater.js +75 -0
  7. package/dist/features/shared/MarkdownTaskUpdater.js.map +1 -0
  8. package/dist/features/shared/SpecManager.d.ts +4 -1
  9. package/dist/features/shared/SpecManager.d.ts.map +1 -1
  10. package/dist/features/shared/SpecManager.js +16 -16
  11. package/dist/features/shared/SpecManager.js.map +1 -1
  12. package/dist/features/shared/TaskGuidanceRepository.d.ts +36 -0
  13. package/dist/features/shared/TaskGuidanceRepository.d.ts.map +1 -0
  14. package/dist/features/shared/TaskGuidanceRepository.js +23 -0
  15. package/dist/features/shared/TaskGuidanceRepository.js.map +1 -0
  16. package/dist/features/shared/TaskLexer.d.ts +18 -0
  17. package/dist/features/shared/TaskLexer.d.ts.map +1 -0
  18. package/dist/features/shared/TaskLexer.js +60 -0
  19. package/dist/features/shared/TaskLexer.js.map +1 -0
  20. package/dist/features/shared/TemplateRepository.d.ts +14 -0
  21. package/dist/features/shared/TemplateRepository.d.ts.map +1 -0
  22. package/dist/features/shared/TemplateRepository.js +40 -0
  23. package/dist/features/shared/TemplateRepository.js.map +1 -0
  24. package/dist/features/shared/WorkflowStateRepository.d.ts +18 -0
  25. package/dist/features/shared/WorkflowStateRepository.d.ts.map +1 -0
  26. package/dist/features/shared/WorkflowStateRepository.js +30 -0
  27. package/dist/features/shared/WorkflowStateRepository.js.map +1 -0
  28. package/dist/features/shared/markdownTaskUpdater.d.ts +14 -0
  29. package/dist/features/shared/markdownTaskUpdater.d.ts.map +1 -0
  30. package/dist/features/shared/markdownTaskUpdater.js +75 -0
  31. package/dist/features/shared/markdownTaskUpdater.js.map +1 -0
  32. package/dist/features/shared/openApiLoader.d.ts +37 -42
  33. package/dist/features/shared/openApiLoader.d.ts.map +1 -1
  34. package/dist/features/shared/openApiLoader.js +13 -127
  35. package/dist/features/shared/openApiLoader.js.map +1 -1
  36. package/dist/features/shared/taskGuidanceRepository.d.ts +36 -0
  37. package/dist/features/shared/taskGuidanceRepository.d.ts.map +1 -0
  38. package/dist/features/shared/taskGuidanceRepository.js +23 -0
  39. package/dist/features/shared/taskGuidanceRepository.js.map +1 -0
  40. package/dist/features/shared/taskLexer.d.ts +18 -0
  41. package/dist/features/shared/taskLexer.d.ts.map +1 -0
  42. package/dist/features/shared/taskLexer.js +66 -0
  43. package/dist/features/shared/taskLexer.js.map +1 -0
  44. package/dist/features/shared/taskParser.d.ts +32 -13
  45. package/dist/features/shared/taskParser.d.ts.map +1 -1
  46. package/dist/features/shared/taskParser.js +72 -240
  47. package/dist/features/shared/taskParser.js.map +1 -1
  48. package/dist/features/shared/templateRepository.d.ts +14 -0
  49. package/dist/features/shared/templateRepository.d.ts.map +1 -0
  50. package/dist/features/shared/templateRepository.js +40 -0
  51. package/dist/features/shared/templateRepository.js.map +1 -0
  52. package/dist/features/shared/workflowStateRepository.d.ts +18 -0
  53. package/dist/features/shared/workflowStateRepository.d.ts.map +1 -0
  54. package/dist/features/shared/workflowStateRepository.js +30 -0
  55. package/dist/features/shared/workflowStateRepository.js.map +1 -0
  56. package/dist/features/task/TaskGuidancePresenter.d.ts +20 -0
  57. package/dist/features/task/TaskGuidancePresenter.d.ts.map +1 -0
  58. package/dist/features/task/TaskGuidancePresenter.js +84 -0
  59. package/dist/features/task/TaskGuidancePresenter.js.map +1 -0
  60. package/dist/features/task/completeTask.d.ts +3 -3
  61. package/dist/features/task/completeTask.d.ts.map +1 -1
  62. package/dist/features/task/completeTask.js +63 -309
  63. package/dist/features/task/completeTask.js.map +1 -1
  64. package/dist/features/task/taskGuidancePresenter.d.ts +20 -0
  65. package/dist/features/task/taskGuidancePresenter.d.ts.map +1 -0
  66. package/dist/features/task/taskGuidancePresenter.js +84 -0
  67. package/dist/features/task/taskGuidancePresenter.js.map +1 -0
  68. package/package.json +3 -2
@@ -0,0 +1,30 @@
1
+ import { openApiLoader } from './openApiLoader.js';
2
+ /**
3
+ * WorkflowStateRepository manages progress rules, stage names, and file mapping.
4
+ */
5
+ export class WorkflowStateRepository {
6
+ /**
7
+ * Gets the display name for a given stage.
8
+ */
9
+ static getStageDisplayName(stage) {
10
+ openApiLoader.loadSpec();
11
+ const stageNames = openApiLoader.getStageNames();
12
+ return stageNames[stage] || stage;
13
+ }
14
+ /**
15
+ * Gets the file name associated with a stage.
16
+ */
17
+ static getStageFileName(stage) {
18
+ openApiLoader.loadSpec();
19
+ const fileNames = openApiLoader.getFileNames();
20
+ return fileNames[stage] || `${stage}.md`;
21
+ }
22
+ /**
23
+ * Calculates overall progress based on the state of each stage.
24
+ */
25
+ static calculateOverallProgress(requirementsStatus, designStatus, tasksStatus) {
26
+ // Current simple logic, could be moved to spec later
27
+ return Math.round((requirementsStatus + designStatus + tasksStatus) / 3);
28
+ }
29
+ }
30
+ //# sourceMappingURL=workflowStateRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflowStateRepository.js","sourceRoot":"","sources":["../../../src/features/shared/workflowStateRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAClC;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,KAAa;QACtC,aAAa,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC;QACjD,OAAQ,UAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAa;QACnC,aAAa,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC;QAC/C,OAAQ,SAAiB,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,KAAK,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,wBAAwB,CAAC,kBAA0B,EAAE,YAAoB,EAAE,WAAmB;QACnG,qDAAqD;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,GAAG,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3E,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * TaskGuidancePresenter handles the construction of complex UI guidance strings
3
+ * for "Next Step" and model prompts during task implementation.
4
+ */
5
+ export declare class TaskGuidancePresenter {
6
+ private static get template();
7
+ /**
8
+ * Build task guidance text after task completion.
9
+ */
10
+ static buildNextStepGuidance(tasksContent: string, completedTaskNumber?: string, isFirstTask?: boolean): string;
11
+ /**
12
+ * Extract the first uncompleted task with its context using TaskLexer.
13
+ */
14
+ static extractFirstUncompletedSubtask(tasksContent: string): string;
15
+ /**
16
+ * Get formatted completion message.
17
+ */
18
+ static getCompletionMessage(type: 'taskCompleted' | 'allCompleted' | 'alreadyCompleted' | 'batchSucceeded' | 'batchCompleted', taskNumber?: string): string;
19
+ }
20
+ //# sourceMappingURL=TaskGuidancePresenter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskGuidancePresenter.d.ts","sourceRoot":"","sources":["../../../src/features/task/TaskGuidancePresenter.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,KAAK,QAAQ,GAG1B;IAED;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAC1B,YAAY,EAAE,MAAM,EACpB,mBAAmB,CAAC,EAAE,MAAM,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM;IA8CT;;OAEG;IACH,MAAM,CAAC,8BAA8B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAcnE;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,gBAAgB,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;CAY5J"}
@@ -0,0 +1,84 @@
1
+ import { openApiLoader, OpenApiLoader } from '../shared/openApiLoader.js';
2
+ import { TaskLexer } from '../shared/TaskLexer.js';
3
+ /**
4
+ * TaskGuidancePresenter handles the construction of complex UI guidance strings
5
+ * for "Next Step" and model prompts during task implementation.
6
+ */
7
+ export class TaskGuidancePresenter {
8
+ static get template() {
9
+ openApiLoader.loadSpec();
10
+ return openApiLoader.getTaskGuidanceTemplate();
11
+ }
12
+ /**
13
+ * Build task guidance text after task completion.
14
+ */
15
+ static buildNextStepGuidance(tasksContent, completedTaskNumber, isFirstTask = false) {
16
+ const template = this.template;
17
+ if (!template) {
18
+ throw new Error('Failed to load task guidance template from OpenAPI specification');
19
+ }
20
+ const firstSubtask = this.extractFirstUncompletedSubtask(tasksContent);
21
+ const parts = [];
22
+ // Add separator line
23
+ parts.push(template.separator);
24
+ parts.push('');
25
+ // Add task header
26
+ parts.push(template.header);
27
+ parts.push(tasksContent);
28
+ parts.push('');
29
+ // Add model instructions
30
+ parts.push(template.instructions.prefix);
31
+ const taskFocusText = OpenApiLoader.replaceVariables(template.instructions.taskFocus, { firstSubtask });
32
+ parts.push(taskFocusText);
33
+ parts.push('');
34
+ parts.push(template.instructions.progressTracking);
35
+ parts.push(template.instructions.workflow);
36
+ parts.push('');
37
+ // Add model prompt based on scenario
38
+ let prompt;
39
+ if (isFirstTask) {
40
+ prompt = OpenApiLoader.replaceVariables(template.prompts.firstTask, { firstSubtask });
41
+ }
42
+ else if (completedTaskNumber) {
43
+ if (completedTaskNumber.includes('.')) {
44
+ prompt = OpenApiLoader.replaceVariables(template.prompts.continueTask, { taskNumber: completedTaskNumber, firstSubtask });
45
+ }
46
+ else {
47
+ prompt = OpenApiLoader.replaceVariables(template.prompts.nextTask, { taskNumber: completedTaskNumber, firstSubtask });
48
+ }
49
+ }
50
+ else {
51
+ prompt = OpenApiLoader.replaceVariables(template.prompts.batchContinue, { firstSubtask });
52
+ }
53
+ parts.push(prompt);
54
+ return parts.join('\n');
55
+ }
56
+ /**
57
+ * Extract the first uncompleted task with its context using TaskLexer.
58
+ */
59
+ static extractFirstUncompletedSubtask(tasksContent) {
60
+ const tokens = TaskLexer.lex(tasksContent);
61
+ // Find the first list item that is NOT checked
62
+ const uncompletedTaskToken = tokens.find(token => token.type === 'list_item' && !token.checked);
63
+ if (uncompletedTaskToken) {
64
+ // Clean the text to return only the task description
65
+ return uncompletedTaskToken.text.replace(/\[\s?\]\s*/, '').trim();
66
+ }
67
+ return 'Next task';
68
+ }
69
+ /**
70
+ * Get formatted completion message.
71
+ */
72
+ static getCompletionMessage(type, taskNumber) {
73
+ const template = this.template;
74
+ if (!template) {
75
+ throw new Error('Failed to load task guidance template from OpenAPI specification');
76
+ }
77
+ const message = template.completionMessages[type];
78
+ if (taskNumber && message.includes('${taskNumber}')) {
79
+ return OpenApiLoader.replaceVariables(message, { taskNumber });
80
+ }
81
+ return message;
82
+ }
83
+ }
84
+ //# sourceMappingURL=TaskGuidancePresenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskGuidancePresenter.js","sourceRoot":"","sources":["../../../src/features/task/TaskGuidancePresenter.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,3 @@
1
- /**
2
- * Complete task - 统一使用批量完成逻辑
3
- */
4
1
  export interface WorkflowResult {
5
2
  displayText: string;
6
3
  data?: any;
@@ -9,5 +6,8 @@ export interface CompleteTaskOptions {
9
6
  path: string;
10
7
  taskNumber: string | string[];
11
8
  }
9
+ /**
10
+ * Orchestrates task completion.
11
+ */
12
12
  export declare function completeTask(options: CompleteTaskOptions): Promise<WorkflowResult>;
13
13
  //# sourceMappingURL=completeTask.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"completeTask.d.ts","sourceRoot":"","sources":["../../../src/features/task/completeTask.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAGD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC/B;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiCxF"}
1
+ {"version":3,"file":"completeTask.d.ts","sourceRoot":"","sources":["../../../src/features/task/completeTask.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAexF"}
@@ -1,361 +1,115 @@
1
- /**
2
- * Complete task - 统一使用批量完成逻辑
3
- */
4
1
  import { existsSync, readFileSync, writeFileSync } from 'fs';
5
2
  import { join } from 'path';
6
- import { parseTasksFromContent, getFirstUncompletedTask, formatTaskForFullDisplay } from '../shared/taskParser.js';
7
- import { TaskGuidanceExtractor } from '../shared/taskGuidanceTemplate.js';
3
+ import { TaskParser, TaskPresenter } from '../shared/taskParser.js';
4
+ import { MarkdownTaskUpdater } from '../shared/markdownTaskUpdater.js';
5
+ import { TaskGuidancePresenter } from './taskGuidancePresenter.js';
6
+ import { WorkflowStateRepository } from '../shared/workflowStateRepository.js';
7
+ /**
8
+ * Orchestrates task completion.
9
+ */
8
10
  export async function completeTask(options) {
9
11
  const { path, taskNumber } = options;
10
- // 统一转换为数组格式进行批量处理
11
12
  const taskNumbers = Array.isArray(taskNumber) ? taskNumber : [taskNumber];
12
13
  if (!existsSync(path)) {
13
- return {
14
- displayText: '❌ Error: Directory does not exist',
15
- data: {
16
- success: false,
17
- error: 'Directory does not exist'
18
- }
19
- };
14
+ return { displayText: '❌ Error: Directory does not exist', data: { success: false, error: 'Directory does not exist' } };
20
15
  }
21
- const tasksPath = join(path, 'tasks.md');
16
+ const tasksPath = join(path, WorkflowStateRepository.getStageFileName('tasks'));
22
17
  if (!existsSync(tasksPath)) {
23
- return {
24
- displayText: '❌ Error: tasks.md file does not exist\n\nPlease complete writing the tasks document first.',
25
- data: {
26
- success: false,
27
- error: 'tasks.md does not exist'
28
- }
29
- };
18
+ return { displayText: `❌ Error: ${WorkflowStateRepository.getStageFileName('tasks')} file does not exist\n\nPlease complete writing the tasks document first.`, data: { success: false, error: `${WorkflowStateRepository.getStageFileName('tasks')} does not exist` } };
30
19
  }
31
- // 统一使用批量处理逻辑
32
20
  const batchResult = await completeBatchTasks(tasksPath, taskNumbers);
33
- return {
34
- displayText: batchResult.displayText,
35
- data: { ...batchResult }
36
- };
21
+ return { displayText: batchResult.displayText, data: { ...batchResult } };
37
22
  }
38
23
  /**
39
- * Complete multiple tasks in batch
24
+ * Handles batch completion of tasks.
40
25
  */
41
26
  async function completeBatchTasks(tasksPath, taskNumbers) {
42
- // Read tasks file
43
27
  const originalContent = readFileSync(tasksPath, 'utf-8');
44
- const tasks = parseTasksFromContent(originalContent);
45
- // Categorize tasks: already completed, can be completed, cannot be completed
28
+ const allTasks = TaskParser.parse(originalContent);
46
29
  const alreadyCompleted = [];
47
30
  const canBeCompleted = [];
48
- const cannotBeCompleted = [];
49
- for (const taskNum of taskNumbers) {
50
- const targetTask = findTaskByNumber(tasks, taskNum);
51
- if (!targetTask) {
52
- cannotBeCompleted.push({
53
- taskNumber: taskNum,
54
- reason: 'Task does not exist'
55
- });
31
+ const failedTasks = [];
32
+ // Recursively find a task by its ID
33
+ const findTask = (id, tasks) => {
34
+ for (const t of tasks) {
35
+ if (t.id === id)
36
+ return t;
37
+ const found = findTask(id, t.children);
38
+ if (found)
39
+ return found;
56
40
  }
57
- else if (targetTask.checked) {
58
- alreadyCompleted.push(taskNum);
41
+ return null;
42
+ };
43
+ for (const id of taskNumbers) {
44
+ const task = findTask(id, allTasks);
45
+ if (!task) {
46
+ failedTasks.push({ taskNumber: id, reason: 'Task does not exist' });
59
47
  }
60
- else if (targetTask.subtasks && targetTask.subtasks.some(s => !s.checked)) {
61
- cannotBeCompleted.push({
62
- taskNumber: taskNum,
63
- reason: 'Has uncompleted subtasks'
64
- });
48
+ else if (task.completed) {
49
+ alreadyCompleted.push(id);
50
+ }
51
+ else if (task.children.some(child => !child.completed)) {
52
+ failedTasks.push({ taskNumber: id, reason: 'Has uncompleted subtasks' });
65
53
  }
66
54
  else {
67
- canBeCompleted.push(taskNum);
55
+ canBeCompleted.push(id);
68
56
  }
69
57
  }
70
- // If there are tasks that cannot be completed (excluding already completed), return error
71
- if (cannotBeCompleted.length > 0) {
72
- const errorMessages = cannotBeCompleted
73
- .map(v => `- ${v.taskNumber}: ${v.reason}`)
74
- .join('\n');
58
+ if (failedTasks.length > 0) {
75
59
  return {
76
60
  success: false,
77
61
  completedTasks: [],
78
- alreadyCompleted: [],
79
- failedTasks: cannotBeCompleted,
80
- displayText: `❌ Batch task completion failed\n\nThe following tasks cannot be completed:\n${errorMessages}\n\nPlease resolve these issues and try again.`
62
+ alreadyCompleted,
63
+ failedTasks,
64
+ displayText: `❌ Batch task completion failed\n\nThe following tasks cannot be completed:\n${failedTasks.map(f => `- ${f.taskNumber}: ${f.reason}`).join('\n')}`
81
65
  };
82
66
  }
83
- // If no tasks can be completed but there are already completed tasks, still return success
84
67
  if (canBeCompleted.length === 0 && alreadyCompleted.length > 0) {
85
- const allTasks = parseTasksFromContent(originalContent);
86
- const nextTask = getFirstUncompletedTask(allTasks);
87
- const alreadyCompletedText = alreadyCompleted
88
- .map(t => `- ${t} (already completed)`)
89
- .join('\n');
90
- const displayText = `${TaskGuidanceExtractor.getCompletionMessage('batchCompleted')}\n\nThe following tasks were already completed:\n${alreadyCompletedText}\n\n${nextTask ? `Next task: ${nextTask.number}. ${nextTask.description}` : TaskGuidanceExtractor.getCompletionMessage('allCompleted')}`;
68
+ const nextTask = allTasks.find(t => !t.completed); // Simplified next task search
91
69
  return {
92
70
  success: true,
93
71
  completedTasks: [],
94
72
  alreadyCompleted,
95
- nextTask: nextTask ? {
96
- number: nextTask.number,
97
- description: nextTask.description
98
- } : undefined,
99
- hasNextTask: nextTask !== null,
100
- displayText
73
+ displayText: `${TaskGuidancePresenter.getCompletionMessage('batchCompleted')}\n\nTasks already completed:\n${alreadyCompleted.map(t => `- ${t}`).join('\n')}\n\n${nextTask ? `Next task: ${nextTask.id}. ${nextTask.text}` : TaskGuidancePresenter.getCompletionMessage('allCompleted')}`
101
74
  };
102
75
  }
103
- // Execution phase: complete tasks in dependency order
104
- let currentContent = originalContent;
105
- const actuallyCompleted = [];
106
- const results = [];
107
76
  try {
108
- // Sort by task number, ensure parent tasks are processed after subtasks (avoid dependency conflicts)
109
- const sortedTaskNumbers = [...canBeCompleted].sort((a, b) => {
110
- // Subtasks first (numbers with more dots have priority)
111
- const aDepth = a.split('.').length;
112
- const bDepth = b.split('.').length;
113
- if (aDepth !== bDepth) {
114
- return bDepth - aDepth; // Process deeper levels first
115
- }
116
- return a.localeCompare(b); // Same depth, sort by string
117
- });
118
- for (const taskNum of sortedTaskNumbers) {
119
- const updatedContent = markTaskAsCompleted(currentContent, taskNum);
120
- if (!updatedContent) {
121
- // This should not happen as we have already validated
122
- throw new Error(`Unexpected error: Task ${taskNum} could not be marked`);
123
- }
124
- currentContent = updatedContent;
125
- actuallyCompleted.push(taskNum);
126
- results.push({
127
- taskNumber: taskNum,
128
- success: true,
129
- status: 'completed'
130
- });
131
- }
132
- // Add results for already completed tasks
133
- for (const taskNum of alreadyCompleted) {
134
- results.push({
135
- taskNumber: taskNum,
136
- success: true,
137
- status: 'already_completed'
138
- });
139
- }
140
- // All tasks completed successfully, save file
141
- if (actuallyCompleted.length > 0) {
142
- writeFileSync(tasksPath, currentContent, 'utf-8');
143
- }
77
+ // Perform updates
78
+ const updatedContent = MarkdownTaskUpdater.updateBatchTaskStatus(originalContent, canBeCompleted, true);
79
+ writeFileSync(tasksPath, updatedContent, 'utf-8');
144
80
  // Build success response
145
- const allTasks = parseTasksFromContent(currentContent);
146
- const nextTask = getFirstUncompletedTask(allTasks);
147
- // Build detailed completion information
148
- let completedInfo = '';
149
- if (actuallyCompleted.length > 0) {
150
- completedInfo += 'Newly completed tasks:\n' + actuallyCompleted.map(t => `- ${t}`).join('\n');
151
- }
152
- if (alreadyCompleted.length > 0) {
153
- if (completedInfo)
154
- completedInfo += '\n\n';
155
- completedInfo += 'Already completed tasks:\n' + alreadyCompleted.map(t => `- ${t} (already completed)`).join('\n');
156
- }
157
- let displayText = `${TaskGuidanceExtractor.getCompletionMessage('batchSucceeded')}\n\n${completedInfo}`;
158
- // Add enhanced guidance for next task
159
- if (nextTask) {
160
- // 获取主任务的完整内容用于显示任务块
161
- let mainTask = nextTask;
162
- let mainTaskContent = '';
163
- // 如果当前是子任务,需要找到对应的主任务
164
- if (nextTask.number.includes('.')) {
165
- const mainTaskNumber = nextTask.number.split('.')[0];
166
- const mainTaskObj = allTasks.find(task => task.number === mainTaskNumber);
167
- if (mainTaskObj) {
168
- mainTask = mainTaskObj;
169
- mainTaskContent = formatTaskForFullDisplay(mainTask, currentContent);
170
- }
171
- else {
172
- // 如果找不到主任务,使用当前任务
173
- mainTaskContent = formatTaskForFullDisplay(nextTask, currentContent);
174
- }
175
- }
176
- else {
177
- // 如果本身就是主任务,直接使用
178
- mainTaskContent = formatTaskForFullDisplay(nextTask, currentContent);
179
- }
180
- // 构建下一个具体子任务的描述(用于指导文本)
181
- let effectiveFirstSubtask;
182
- let actualNextSubtask = null;
183
- if (nextTask.number.includes('.')) {
184
- // 如果下一个任务是子任务,直接使用
185
- actualNextSubtask = nextTask;
186
- }
187
- else {
188
- // 如果下一个任务是主任务,找到第一个未完成的子任务
189
- if (mainTask.subtasks && mainTask.subtasks.length > 0) {
190
- actualNextSubtask = mainTask.subtasks.find(subtask => !subtask.checked) || null;
191
- }
192
- }
193
- if (actualNextSubtask) {
194
- // 使用具体的子任务构建指导文本,包含完整内容
195
- const nextSubtaskContent = formatTaskForFullDisplay(actualNextSubtask, currentContent);
196
- if (nextSubtaskContent.trim()) {
197
- // 如果能获取到完整内容,直接使用
198
- effectiveFirstSubtask = nextSubtaskContent.trim();
199
- }
200
- else {
201
- // 如果获取不到完整内容,手动构建
202
- effectiveFirstSubtask = `- [ ] ${actualNextSubtask.number} ${actualNextSubtask.description}`;
203
- // 从主任务内容中提取这个子任务的详细信息
204
- const mainTaskLines = mainTaskContent.split('\n');
205
- let capturing = false;
206
- let taskIndent = '';
207
- for (const line of mainTaskLines) {
208
- // 找到目标子任务的开始
209
- if (line.includes(`${actualNextSubtask.number} ${actualNextSubtask.description}`) ||
210
- line.includes(`${actualNextSubtask.number}. ${actualNextSubtask.description}`)) {
211
- capturing = true;
212
- taskIndent = line.match(/^(\s*)/)?.[1] || '';
213
- continue;
214
- }
215
- // 如果正在捕获内容
216
- if (capturing) {
217
- const lineIndent = line.match(/^(\s*)/)?.[1] || '';
218
- // 如果遇到下一个任务(同级或更高级),停止捕获
219
- if (line.includes('[ ]') && lineIndent.length <= taskIndent.length) {
220
- break;
221
- }
222
- // 如果是更深层次的内容,添加到结果中
223
- if (lineIndent.length > taskIndent.length && line.trim()) {
224
- effectiveFirstSubtask += `\n${line}`;
225
- }
226
- }
227
- }
228
- }
229
- }
230
- else {
231
- // 如果找不到具体的子任务,使用主任务
232
- effectiveFirstSubtask = `${nextTask.number}. ${nextTask.description}`;
233
- }
234
- // Build guidance text using the template
235
- const guidanceText = TaskGuidanceExtractor.buildGuidanceText(mainTaskContent, // 显示主任务块
236
- effectiveFirstSubtask, // 用于指导文本的具体子任务
237
- undefined, // no specific task number for batch
238
- false // not first task
239
- );
240
- displayText += '\n\n' + guidanceText;
81
+ const updatedTasks = TaskParser.parse(updatedContent);
82
+ const nextUncompleted = findFirstUncompleted(updatedTasks);
83
+ let displayText = `${TaskGuidancePresenter.getCompletionMessage('batchSucceeded')}\n\nNewly completed tasks:\n${canBeCompleted.map(t => `- ${t}`).join('\n')}`;
84
+ if (nextUncompleted) {
85
+ // Find parent context for guidance
86
+ const parentId = nextUncompleted.id.split('.')[0];
87
+ const parentTask = findTask(parentId, updatedTasks) || nextUncompleted;
88
+ const mainTaskContent = TaskPresenter.formatFullDisplay([parentTask]);
89
+ displayText += '\n\n' + TaskGuidancePresenter.buildNextStepGuidance(mainTaskContent, canBeCompleted[canBeCompleted.length - 1]);
241
90
  }
242
91
  else {
243
- displayText += '\n\n' + TaskGuidanceExtractor.getCompletionMessage('allCompleted');
92
+ displayText += '\n\n' + TaskGuidancePresenter.getCompletionMessage('allCompleted');
244
93
  }
245
94
  return {
246
95
  success: true,
247
- completedTasks: actuallyCompleted,
96
+ completedTasks: canBeCompleted,
248
97
  alreadyCompleted,
249
- failedTasks: [],
250
- results,
251
- nextTask: nextTask ? {
252
- number: nextTask.number,
253
- description: nextTask.description
254
- } : undefined,
255
- hasNextTask: nextTask !== null,
98
+ nextTask: nextUncompleted ? { number: nextUncompleted.id, description: nextUncompleted.text } : undefined,
256
99
  displayText
257
100
  };
258
101
  }
259
102
  catch (error) {
260
- // Execution failed, need to rollback to original state
261
- if (actuallyCompleted.length > 0) {
262
- writeFileSync(tasksPath, originalContent, 'utf-8');
263
- }
264
- return {
265
- success: false,
266
- completedTasks: [],
267
- alreadyCompleted: [],
268
- failedTasks: [{
269
- taskNumber: 'batch',
270
- reason: error instanceof Error ? error.message : String(error)
271
- }],
272
- results,
273
- displayText: `❌ Batch task execution failed\n\nError: ${error instanceof Error ? error.message : String(error)}\n\nRolled back to original state.`
274
- };
275
- }
276
- }
277
- /**
278
- * Mark task as completed
279
- */
280
- function markTaskAsCompleted(content, taskNumber) {
281
- const lines = content.split('\n');
282
- const tasks = parseTasksFromContent(content);
283
- let found = false;
284
- // Find target task (including subtasks)
285
- const targetTask = findTaskByNumber(tasks, taskNumber);
286
- if (!targetTask) {
287
- return null;
288
- }
289
- // Build set of task numbers to mark
290
- const numbersToMark = new Set();
291
- numbersToMark.add(taskNumber);
292
- // If it's a leaf task, check if parent task should be auto-marked
293
- const parentNumber = taskNumber.substring(0, taskNumber.lastIndexOf('.'));
294
- if (parentNumber && taskNumber.includes('.')) {
295
- const parentTask = findTaskByNumber(tasks, parentNumber);
296
- if (parentTask && parentTask.subtasks) {
297
- // Check if all sibling tasks are completed
298
- const allSiblingsCompleted = parentTask.subtasks
299
- .filter(s => s.number !== taskNumber)
300
- .every(s => s.checked);
301
- if (allSiblingsCompleted) {
302
- numbersToMark.add(parentNumber);
303
- }
304
- }
305
- }
306
- // Mark all related tasks
307
- for (let i = 0; i < lines.length; i++) {
308
- const line = lines[i];
309
- // Skip already completed tasks
310
- if (!line.includes('[ ]'))
311
- continue;
312
- // Check if line contains task number to mark
313
- for (const num of numbersToMark) {
314
- // More robust matching strategy: as long as the line contains both task number and checkbox
315
- // Don't care about their relative position and format details
316
- if (containsTaskNumber(line, num)) {
317
- lines[i] = line.replace('[ ]', '[x]');
318
- found = true;
319
- break;
320
- }
321
- }
103
+ return { success: false, error: error instanceof Error ? error.message : String(error), displayText: `❌ Error: ${error instanceof Error ? error.message : String(error)}` };
322
104
  }
323
- return found ? lines.join('\n') : null;
324
105
  }
325
- /**
326
- * Check if line contains specified task number
327
- * Use flexible matching strategy, ignore format details
328
- */
329
- function containsTaskNumber(line, taskNumber) {
330
- // Remove checkbox part to avoid interference with matching
331
- const lineWithoutCheckbox = line.replace(/\[[xX ]\]/g, '');
332
- // Use word boundary to ensure matching complete task number
333
- // For example: won't mistakenly match "11.1" as "1.1"
334
- const escapedNumber = escapeRegExp(taskNumber);
335
- const regex = new RegExp(`\\b${escapedNumber}\\b`);
336
- return regex.test(lineWithoutCheckbox);
337
- }
338
- /**
339
- * Escape regex special characters
340
- */
341
- function escapeRegExp(string) {
342
- return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
343
- }
344
- /**
345
- * Recursively find task (including subtasks)
346
- */
347
- function findTaskByNumber(tasks, targetNumber) {
348
- for (const task of tasks) {
349
- if (task.number === targetNumber) {
350
- return task;
351
- }
352
- // Recursively search subtasks
353
- if (task.subtasks) {
354
- const found = findTaskByNumber(task.subtasks, targetNumber);
355
- if (found) {
356
- return found;
357
- }
358
- }
106
+ function findFirstUncompleted(tasks) {
107
+ for (const t of tasks) {
108
+ if (!t.completed)
109
+ return t;
110
+ const found = findFirstUncompleted(t.children);
111
+ if (found)
112
+ return found;
359
113
  }
360
114
  return null;
361
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"completeTask.js","sourceRoot":"","sources":["../../../src/features/task/completeTask.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"completeTask.js","sourceRoot":"","sources":["../../../src/features/task/completeTask.ts"],"names":[],"mappings":"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"}