mcp-spec-cli 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -0
- package/api/spec-workflow.openapi.yaml +1305 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +151 -0
- package/dist/cli.js.map +1 -0
- package/dist/features/check/analyzeStage.d.ts +20 -0
- package/dist/features/check/analyzeStage.d.ts.map +1 -0
- package/dist/features/check/analyzeStage.js +114 -0
- package/dist/features/check/analyzeStage.js.map +1 -0
- package/dist/features/check/checkWorkflow.d.ts +10 -0
- package/dist/features/check/checkWorkflow.d.ts.map +1 -0
- package/dist/features/check/checkWorkflow.js +92 -0
- package/dist/features/check/checkWorkflow.js.map +1 -0
- package/dist/features/check/generateNextDocument.d.ts +14 -0
- package/dist/features/check/generateNextDocument.d.ts.map +1 -0
- package/dist/features/check/generateNextDocument.js +64 -0
- package/dist/features/check/generateNextDocument.js.map +1 -0
- package/dist/features/confirm/confirmStage.d.ts +9 -0
- package/dist/features/confirm/confirmStage.d.ts.map +1 -0
- package/dist/features/confirm/confirmStage.js +101 -0
- package/dist/features/confirm/confirmStage.js.map +1 -0
- package/dist/features/executeWorkflow.d.ts +15 -0
- package/dist/features/executeWorkflow.d.ts.map +1 -0
- package/dist/features/executeWorkflow.js +97 -0
- package/dist/features/executeWorkflow.js.map +1 -0
- package/dist/features/init/createRequirementsDoc.d.ts +11 -0
- package/dist/features/init/createRequirementsDoc.d.ts.map +1 -0
- package/dist/features/init/createRequirementsDoc.js +36 -0
- package/dist/features/init/createRequirementsDoc.js.map +1 -0
- package/dist/features/init/initWorkflow.d.ts +12 -0
- package/dist/features/init/initWorkflow.d.ts.map +1 -0
- package/dist/features/init/initWorkflow.js +103 -0
- package/dist/features/init/initWorkflow.js.map +1 -0
- package/dist/features/shared/SpecManager.d.ts +33 -0
- package/dist/features/shared/SpecManager.d.ts.map +1 -0
- package/dist/features/shared/SpecManager.js +103 -0
- package/dist/features/shared/SpecManager.js.map +1 -0
- package/dist/features/shared/confirmationStatus.d.ts +24 -0
- package/dist/features/shared/confirmationStatus.d.ts.map +1 -0
- package/dist/features/shared/confirmationStatus.js +69 -0
- package/dist/features/shared/confirmationStatus.js.map +1 -0
- package/dist/features/shared/documentAnalyzer.d.ts +18 -0
- package/dist/features/shared/documentAnalyzer.d.ts.map +1 -0
- package/dist/features/shared/documentAnalyzer.js +34 -0
- package/dist/features/shared/documentAnalyzer.js.map +1 -0
- package/dist/features/shared/documentStatus.d.ts +18 -0
- package/dist/features/shared/documentStatus.d.ts.map +1 -0
- package/dist/features/shared/documentStatus.js +66 -0
- package/dist/features/shared/documentStatus.js.map +1 -0
- package/dist/features/shared/documentTemplates.d.ts +8 -0
- package/dist/features/shared/documentTemplates.d.ts.map +1 -0
- package/dist/features/shared/documentTemplates.js +89 -0
- package/dist/features/shared/documentTemplates.js.map +1 -0
- package/dist/features/shared/documentUtils.d.ts +9 -0
- package/dist/features/shared/documentUtils.d.ts.map +1 -0
- package/dist/features/shared/documentUtils.js +38 -0
- package/dist/features/shared/documentUtils.js.map +1 -0
- package/dist/features/shared/mcpTypes.d.ts +83 -0
- package/dist/features/shared/mcpTypes.d.ts.map +1 -0
- package/dist/features/shared/mcpTypes.js +41 -0
- package/dist/features/shared/mcpTypes.js.map +1 -0
- package/dist/features/shared/openApiLoader.d.ts +88 -0
- package/dist/features/shared/openApiLoader.d.ts.map +1 -0
- package/dist/features/shared/openApiLoader.js +166 -0
- package/dist/features/shared/openApiLoader.js.map +1 -0
- package/dist/features/shared/openApiTypes.d.ts +101 -0
- package/dist/features/shared/openApiTypes.d.ts.map +1 -0
- package/dist/features/shared/openApiTypes.js +4 -0
- package/dist/features/shared/openApiTypes.js.map +1 -0
- package/dist/features/shared/progressCalculator.d.ts +22 -0
- package/dist/features/shared/progressCalculator.d.ts.map +1 -0
- package/dist/features/shared/progressCalculator.js +45 -0
- package/dist/features/shared/progressCalculator.js.map +1 -0
- package/dist/features/shared/responseBuilder.d.ts +13 -0
- package/dist/features/shared/responseBuilder.d.ts.map +1 -0
- package/dist/features/shared/responseBuilder.js +303 -0
- package/dist/features/shared/responseBuilder.js.map +1 -0
- package/dist/features/shared/taskGuidanceTemplate.d.ts +22 -0
- package/dist/features/shared/taskGuidanceTemplate.d.ts.map +1 -0
- package/dist/features/shared/taskGuidanceTemplate.js +145 -0
- package/dist/features/shared/taskGuidanceTemplate.js.map +1 -0
- package/dist/features/shared/taskParser.d.ts +17 -0
- package/dist/features/shared/taskParser.d.ts.map +1 -0
- package/dist/features/shared/taskParser.js +259 -0
- package/dist/features/shared/taskParser.js.map +1 -0
- package/dist/features/shared/typeGuards.d.ts +54 -0
- package/dist/features/shared/typeGuards.d.ts.map +1 -0
- package/dist/features/shared/typeGuards.js +96 -0
- package/dist/features/shared/typeGuards.js.map +1 -0
- package/dist/features/skip/skipStage.d.ts +9 -0
- package/dist/features/skip/skipStage.d.ts.map +1 -0
- package/dist/features/skip/skipStage.js +122 -0
- package/dist/features/skip/skipStage.js.map +1 -0
- package/dist/features/task/completeTask.d.ts +13 -0
- package/dist/features/task/completeTask.d.ts.map +1 -0
- package/dist/features/task/completeTask.js +362 -0
- package/dist/features/task/completeTask.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +6 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +23 -0
- package/dist/logger.js.map +1 -0
- package/dist/tools/specTools.d.ts +3 -0
- package/dist/tools/specTools.d.ts.map +1 -0
- package/dist/tools/specTools.js +107 -0
- package/dist/tools/specTools.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task guidance template extractor
|
|
3
|
+
* Reads task completion guidance text templates from OpenAPI specification
|
|
4
|
+
*/
|
|
5
|
+
import { openApiLoader, OpenApiLoader } from './openApiLoader.js';
|
|
6
|
+
export class TaskGuidanceExtractor {
|
|
7
|
+
static _template;
|
|
8
|
+
static get template() {
|
|
9
|
+
if (!this._template) {
|
|
10
|
+
// Lazy loading to ensure OpenAPI spec is loaded
|
|
11
|
+
openApiLoader.loadSpec();
|
|
12
|
+
this._template = openApiLoader.getTaskGuidanceTemplate();
|
|
13
|
+
}
|
|
14
|
+
return this._template;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build task guidance text
|
|
18
|
+
* Read templates from OpenAPI spec and assemble them
|
|
19
|
+
*/
|
|
20
|
+
static buildGuidanceText(nextTaskContent, firstSubtask, taskNumber, isFirstTask = false) {
|
|
21
|
+
const template = this.template;
|
|
22
|
+
if (!template) {
|
|
23
|
+
throw new Error('Failed to load task guidance template from OpenAPI specification');
|
|
24
|
+
}
|
|
25
|
+
const parts = [];
|
|
26
|
+
// Add separator line
|
|
27
|
+
parts.push(template.separator);
|
|
28
|
+
parts.push('');
|
|
29
|
+
// Add task header
|
|
30
|
+
parts.push(template.header);
|
|
31
|
+
parts.push(nextTaskContent);
|
|
32
|
+
parts.push('');
|
|
33
|
+
// Add model instructions
|
|
34
|
+
parts.push(template.instructions.prefix);
|
|
35
|
+
const taskFocusText = OpenApiLoader.replaceVariables(template.instructions.taskFocus, { firstSubtask });
|
|
36
|
+
parts.push(taskFocusText);
|
|
37
|
+
parts.push('');
|
|
38
|
+
parts.push(template.instructions.progressTracking);
|
|
39
|
+
parts.push(template.instructions.workflow);
|
|
40
|
+
parts.push('');
|
|
41
|
+
// Add model prompt based on scenario
|
|
42
|
+
let prompt;
|
|
43
|
+
if (isFirstTask) {
|
|
44
|
+
// Replace firstSubtask placeholder in firstTask prompt
|
|
45
|
+
prompt = OpenApiLoader.replaceVariables(template.prompts.firstTask, { firstSubtask });
|
|
46
|
+
}
|
|
47
|
+
else if (taskNumber) {
|
|
48
|
+
// Determine if it's a new task or continuation
|
|
49
|
+
if (taskNumber.includes('.')) {
|
|
50
|
+
// Subtask, use continuation prompt
|
|
51
|
+
prompt = OpenApiLoader.replaceVariables(template.prompts.continueTask, { taskNumber, firstSubtask });
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// Main task, use new task prompt
|
|
55
|
+
prompt = OpenApiLoader.replaceVariables(template.prompts.nextTask, { taskNumber, firstSubtask });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Batch completion scenario, no specific task number
|
|
60
|
+
prompt = OpenApiLoader.replaceVariables(template.prompts.batchContinue, { firstSubtask });
|
|
61
|
+
}
|
|
62
|
+
parts.push(prompt);
|
|
63
|
+
return parts.join('\n');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Extract the first uncompleted task with its context
|
|
67
|
+
*/
|
|
68
|
+
static extractFirstSubtask(taskContent) {
|
|
69
|
+
const taskLines = taskContent.split('\n');
|
|
70
|
+
let firstSubtaskFound = false;
|
|
71
|
+
let firstSubtaskLines = [];
|
|
72
|
+
let currentIndent = '';
|
|
73
|
+
for (let i = 0; i < taskLines.length; i++) {
|
|
74
|
+
const line = taskLines[i];
|
|
75
|
+
// 忽略空行(但在收集过程中保留)
|
|
76
|
+
if (!line.trim()) {
|
|
77
|
+
if (firstSubtaskFound) {
|
|
78
|
+
firstSubtaskLines.push(line);
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// 寻找第一个包含 [ ] 的行(未完成任务)
|
|
83
|
+
if (line.includes('[ ]') && !firstSubtaskFound) {
|
|
84
|
+
// 提取任务号验证这是一个子任务(包含点号)
|
|
85
|
+
const taskMatch = line.match(/(\d+(?:\.\d+)+)\./);
|
|
86
|
+
if (taskMatch) {
|
|
87
|
+
firstSubtaskFound = true;
|
|
88
|
+
firstSubtaskLines.push(line);
|
|
89
|
+
currentIndent = line.match(/^(\s*)/)?.[1] || '';
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// 如果已经找到第一个子任务,继续收集其详细内容
|
|
94
|
+
if (firstSubtaskFound) {
|
|
95
|
+
const lineIndent = line.match(/^(\s*)/)?.[1] || '';
|
|
96
|
+
// 如果遇到同级或更高级的任务,停止收集
|
|
97
|
+
if (line.includes('[ ]') && lineIndent.length <= currentIndent.length) {
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
// 如果是更深层次的缩进内容,继续收集
|
|
101
|
+
if (lineIndent.length > currentIndent.length || line.trim().startsWith('-') || line.trim().startsWith('*')) {
|
|
102
|
+
firstSubtaskLines.push(line);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// 遇到非缩进内容,停止收集
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// 如果找到了第一个子任务,返回其完整内容
|
|
111
|
+
if (firstSubtaskLines.length > 0) {
|
|
112
|
+
return firstSubtaskLines.join('\n').trim();
|
|
113
|
+
}
|
|
114
|
+
// 如果没有找到子任务,尝试找第一个未完成的任务
|
|
115
|
+
for (const line of taskLines) {
|
|
116
|
+
if (!line.trim())
|
|
117
|
+
continue;
|
|
118
|
+
if (line.includes('[ ]')) {
|
|
119
|
+
const taskMatch = line.match(/(\d+(?:\.\d+)*)\.\s*(.+)/);
|
|
120
|
+
if (taskMatch) {
|
|
121
|
+
const taskNumber = taskMatch[1];
|
|
122
|
+
const taskDesc = taskMatch[2].replace(/\*\*|\*/g, '').trim();
|
|
123
|
+
return `${taskNumber}. ${taskDesc}`;
|
|
124
|
+
}
|
|
125
|
+
return line.replace(/[-[\]\s]/g, '').replace(/\*\*|\*/g, '').trim();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return 'Next task';
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get completion message
|
|
132
|
+
*/
|
|
133
|
+
static getCompletionMessage(type, taskNumber) {
|
|
134
|
+
const template = this.template;
|
|
135
|
+
if (!template) {
|
|
136
|
+
throw new Error('Failed to load task guidance template from OpenAPI specification');
|
|
137
|
+
}
|
|
138
|
+
const message = template.completionMessages[type];
|
|
139
|
+
if (taskNumber && message.includes('${taskNumber}')) {
|
|
140
|
+
return OpenApiLoader.replaceVariables(message, { taskNumber });
|
|
141
|
+
}
|
|
142
|
+
return message;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=taskGuidanceTemplate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskGuidanceTemplate.js","sourceRoot":"","sources":["../../../src/features/shared/taskGuidanceTemplate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse tasks from tasks.md file
|
|
3
|
+
*/
|
|
4
|
+
export interface Task {
|
|
5
|
+
number: string;
|
|
6
|
+
description: string;
|
|
7
|
+
checked: boolean;
|
|
8
|
+
subtasks?: Task[];
|
|
9
|
+
isVirtual?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function parseTasksFile(path: string): Task[];
|
|
12
|
+
export declare function parseTasksFromContent(content: string): Task[];
|
|
13
|
+
export declare function getFirstUncompletedTask(tasks: Task[]): Task | null;
|
|
14
|
+
export declare function formatTaskForDisplay(task: Task): string;
|
|
15
|
+
export declare function formatTaskForFullDisplay(task: Task, content: string): string;
|
|
16
|
+
export declare function formatTaskListOverview(path: string): string;
|
|
17
|
+
//# sourceMappingURL=taskParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskParser.d.ts","sourceRoot":"","sources":["../../../src/features/shared/taskParser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAmBnD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,CAqH7D;AAuBD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAyBlE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAYvD;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAyD5E;AAGD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgB3D"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse tasks from tasks.md file
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
export function parseTasksFile(path) {
|
|
7
|
+
try {
|
|
8
|
+
const tasksPath = join(path, 'tasks.md');
|
|
9
|
+
const content = readFileSync(tasksPath, 'utf-8');
|
|
10
|
+
// Remove template marker blocks
|
|
11
|
+
const cleanContent = content
|
|
12
|
+
.replace(/<!--\s*SPEC-MARKER[\s\S]*?-->/g, '') // Compatible with old format
|
|
13
|
+
.replace(/<template-tasks>[\s\S]*?<\/template-tasks>/g, '') // Match actual task template markers
|
|
14
|
+
.trim();
|
|
15
|
+
if (!cleanContent) {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
return parseTasksFromContent(cleanContent);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function parseTasksFromContent(content) {
|
|
25
|
+
const lines = content.split('\n');
|
|
26
|
+
const allTasks = [];
|
|
27
|
+
// Phase 1: Collect all tasks with checkboxes
|
|
28
|
+
for (let i = 0; i < lines.length; i++) {
|
|
29
|
+
const line = lines[i];
|
|
30
|
+
// Find checkbox pattern
|
|
31
|
+
const checkboxMatch = line.match(/\[([xX ])\]/);
|
|
32
|
+
if (!checkboxMatch)
|
|
33
|
+
continue;
|
|
34
|
+
// Extract task number (flexible matching)
|
|
35
|
+
const numberMatch = line.match(/(\d+(?:\.\d+)*)/);
|
|
36
|
+
if (!numberMatch)
|
|
37
|
+
continue;
|
|
38
|
+
const taskNumber = numberMatch[1];
|
|
39
|
+
const isChecked = checkboxMatch[1].toLowerCase() === 'x';
|
|
40
|
+
// Extract description (remove task number and checkbox)
|
|
41
|
+
let description = line
|
|
42
|
+
.replace(/\[([xX ])\]/, '') // Remove checkbox
|
|
43
|
+
.replace(/(\d+(?:\.\d+)*)\s*[.:\-)]?/, '') // Remove task number
|
|
44
|
+
.replace(/^[\s\-*]+/, '') // Remove leading symbols
|
|
45
|
+
.trim();
|
|
46
|
+
// If description is empty, try to get from next line
|
|
47
|
+
if (!description && i + 1 < lines.length) {
|
|
48
|
+
const nextLine = lines[i + 1].trim();
|
|
49
|
+
if (nextLine && !nextLine.match(/\[([xX ])\]/) && !nextLine.match(/^#/)) {
|
|
50
|
+
description = nextLine;
|
|
51
|
+
i++; // Skip next line
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (!description)
|
|
55
|
+
continue;
|
|
56
|
+
allTasks.push({
|
|
57
|
+
number: taskNumber,
|
|
58
|
+
description: description,
|
|
59
|
+
checked: isChecked
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
// Phase 2: Build hierarchy structure
|
|
63
|
+
const taskMap = new Map();
|
|
64
|
+
const rootTasks = [];
|
|
65
|
+
// Infer main tasks from task numbers
|
|
66
|
+
for (const task of allTasks) {
|
|
67
|
+
if (!task.number.includes('.')) {
|
|
68
|
+
// Top-level task
|
|
69
|
+
taskMap.set(task.number, task);
|
|
70
|
+
rootTasks.push(task);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Process subtasks
|
|
74
|
+
for (const task of allTasks) {
|
|
75
|
+
if (task.number.includes('.')) {
|
|
76
|
+
const parts = task.number.split('.');
|
|
77
|
+
const parentNumber = parts[0];
|
|
78
|
+
// If main task doesn't exist, create virtual parent task
|
|
79
|
+
if (!taskMap.has(parentNumber)) {
|
|
80
|
+
// Try to find better title from document
|
|
81
|
+
const betterTitle = findMainTaskTitle(lines, parentNumber);
|
|
82
|
+
const virtualParent = {
|
|
83
|
+
number: parentNumber,
|
|
84
|
+
description: betterTitle || `Task Group ${parentNumber}`,
|
|
85
|
+
checked: false,
|
|
86
|
+
subtasks: [],
|
|
87
|
+
isVirtual: true // 标记为虚拟任务
|
|
88
|
+
};
|
|
89
|
+
taskMap.set(parentNumber, virtualParent);
|
|
90
|
+
rootTasks.push(virtualParent);
|
|
91
|
+
}
|
|
92
|
+
// Add subtask to main task
|
|
93
|
+
const parent = taskMap.get(parentNumber);
|
|
94
|
+
if (!parent.subtasks) {
|
|
95
|
+
parent.subtasks = [];
|
|
96
|
+
}
|
|
97
|
+
parent.subtasks.push(task);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Update main task completion status (only when all subtasks are completed)
|
|
101
|
+
for (const task of rootTasks) {
|
|
102
|
+
if (task.subtasks && task.subtasks.length > 0) {
|
|
103
|
+
task.checked = task.subtasks.every(st => st.checked);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Sort by task number
|
|
107
|
+
rootTasks.sort((a, b) => {
|
|
108
|
+
const numA = parseInt(a.number);
|
|
109
|
+
const numB = parseInt(b.number);
|
|
110
|
+
return numA - numB;
|
|
111
|
+
});
|
|
112
|
+
// Sort subtasks
|
|
113
|
+
for (const task of rootTasks) {
|
|
114
|
+
if (task.subtasks) {
|
|
115
|
+
task.subtasks.sort((a, b) => {
|
|
116
|
+
const partsA = a.number.split('.').map(n => parseInt(n));
|
|
117
|
+
const partsB = b.number.split('.').map(n => parseInt(n));
|
|
118
|
+
for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
|
|
119
|
+
const diff = (partsA[i] || 0) - (partsB[i] || 0);
|
|
120
|
+
if (diff !== 0)
|
|
121
|
+
return diff;
|
|
122
|
+
}
|
|
123
|
+
return 0;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return rootTasks;
|
|
128
|
+
}
|
|
129
|
+
// Find main task title (from headers or other places)
|
|
130
|
+
function findMainTaskTitle(lines, taskNumber) {
|
|
131
|
+
// Look for lines like "### 1. Title" or "## 1. Title"
|
|
132
|
+
for (const line of lines) {
|
|
133
|
+
const headerMatch = line.match(/^#+\s*(\d+)\.\s*(.+)$/);
|
|
134
|
+
if (headerMatch && headerMatch[1] === taskNumber) {
|
|
135
|
+
return headerMatch[2].trim();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Also support other formats like "1. **Title**"
|
|
139
|
+
for (const line of lines) {
|
|
140
|
+
const boldMatch = line.match(/^(\d+)\.\s*\*\*(.+?)\*\*$/);
|
|
141
|
+
if (boldMatch && boldMatch[1] === taskNumber) {
|
|
142
|
+
return boldMatch[2].trim();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
export function getFirstUncompletedTask(tasks) {
|
|
148
|
+
for (const task of tasks) {
|
|
149
|
+
// 如果任务有子任务,优先检查子任务
|
|
150
|
+
if (task.subtasks && task.subtasks.length > 0) {
|
|
151
|
+
// 检查是否有未完成的子任务
|
|
152
|
+
const firstUncompletedSubtask = task.subtasks.find(subtask => !subtask.checked);
|
|
153
|
+
if (firstUncompletedSubtask) {
|
|
154
|
+
// 无论是虚拟主任务还是真实主任务,都返回第一个未完成的子任务
|
|
155
|
+
return firstUncompletedSubtask;
|
|
156
|
+
}
|
|
157
|
+
// 如果所有子任务都完成了,但主任务未完成,返回主任务
|
|
158
|
+
if (!task.checked) {
|
|
159
|
+
return task;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
// 没有子任务的情况,直接检查主任务
|
|
164
|
+
if (!task.checked) {
|
|
165
|
+
return task;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
export function formatTaskForDisplay(task) {
|
|
172
|
+
let display = `📋 Task ${task.number}: ${task.description}`;
|
|
173
|
+
if (task.subtasks && task.subtasks.length > 0) {
|
|
174
|
+
display += '\n\nSubtasks:';
|
|
175
|
+
for (const subtask of task.subtasks) {
|
|
176
|
+
const status = subtask.checked ? '✓' : '☐';
|
|
177
|
+
display += `\n ${status} ${subtask.number}. ${subtask.description}`;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return display;
|
|
181
|
+
}
|
|
182
|
+
export function formatTaskForFullDisplay(task, content) {
|
|
183
|
+
const lines = content.split('\n');
|
|
184
|
+
const taskLines = [];
|
|
185
|
+
let capturing = false;
|
|
186
|
+
let indent = '';
|
|
187
|
+
for (const line of lines) {
|
|
188
|
+
// Find task start (supports two formats: `1. - [ ] task` or `- [ ] 1. task`)
|
|
189
|
+
const taskPattern1 = new RegExp(`^(\\s*)${task.number}\\.\\s*-\\s*\\[[ x]\\]\\s*`);
|
|
190
|
+
const taskPattern2 = new RegExp(`^(\\s*)-\\s*\\[[ x]\\]\\s*${task.number}\\.\\s*`);
|
|
191
|
+
if (line.match(taskPattern1) || line.match(taskPattern2)) {
|
|
192
|
+
capturing = true;
|
|
193
|
+
taskLines.push(line);
|
|
194
|
+
indent = line.match(/^(\s*)/)?.[1] || '';
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
// If capturing task content
|
|
198
|
+
if (capturing) {
|
|
199
|
+
// Check if reached next task at same or higher level
|
|
200
|
+
const nextTaskPattern = /^(\s*)-\s*\[[ x]\]\s*\d+(\.\d+)*\.\s*/;
|
|
201
|
+
const nextMatch = line.match(nextTaskPattern);
|
|
202
|
+
if (nextMatch) {
|
|
203
|
+
const nextIndent = nextMatch[1] || '';
|
|
204
|
+
if (nextIndent.length <= indent.length) {
|
|
205
|
+
break; // Found same or higher level task, stop capturing
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Continue capturing content belonging to current task
|
|
209
|
+
if (line.trim() === '') {
|
|
210
|
+
taskLines.push(line);
|
|
211
|
+
}
|
|
212
|
+
else if (line.startsWith(indent + ' ') || line.startsWith(indent + '\t')) {
|
|
213
|
+
// Deeper indented content belongs to current task
|
|
214
|
+
taskLines.push(line);
|
|
215
|
+
}
|
|
216
|
+
else if (line.match(/^#+\s/)) {
|
|
217
|
+
// Found header, stop capturing
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
else if (line.match(/^\d+\.\s*-\s*\[[ x]\]/)) {
|
|
221
|
+
// Found other top-level task, stop
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// Other cases continue capturing (might be continuation of task description)
|
|
226
|
+
const isTaskLine = line.match(/^(\s*)-\s*\[[ x]\]/) || line.match(/^(\s*)\d+(\.\d+)*\.\s*-\s*\[[ x]\]/);
|
|
227
|
+
if (isTaskLine) {
|
|
228
|
+
break; // Found other task, stop
|
|
229
|
+
}
|
|
230
|
+
else if (line.match(/^\s/) && !line.match(/^\s{8,}/)) {
|
|
231
|
+
// If indented but not too deep, might still be current task content
|
|
232
|
+
taskLines.push(line);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
break; // Otherwise stop
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return taskLines.join('\n').trimEnd();
|
|
241
|
+
}
|
|
242
|
+
// Format task list overview for display
|
|
243
|
+
export function formatTaskListOverview(path) {
|
|
244
|
+
try {
|
|
245
|
+
const tasks = parseTasksFile(path);
|
|
246
|
+
if (tasks.length === 0) {
|
|
247
|
+
return 'No tasks found.';
|
|
248
|
+
}
|
|
249
|
+
const taskItems = tasks.map(task => {
|
|
250
|
+
const status = task.checked ? '[x]' : '[ ]';
|
|
251
|
+
return `- ${status} ${task.number}. ${task.description}`;
|
|
252
|
+
});
|
|
253
|
+
return taskItems.join('\n');
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return 'Error loading tasks list.';
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=taskParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskParser.js","sourceRoot":"","sources":["../../../src/features/shared/taskParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 类型守卫和类型验证工具
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 检查值是否为对象(非 null)
|
|
6
|
+
*/
|
|
7
|
+
export declare function isObject(value: unknown): value is Record<string, unknown>;
|
|
8
|
+
/**
|
|
9
|
+
* 检查值是否为字符串
|
|
10
|
+
*/
|
|
11
|
+
export declare function isString(value: unknown): value is string;
|
|
12
|
+
/**
|
|
13
|
+
* 检查值是否为数字
|
|
14
|
+
*/
|
|
15
|
+
export declare function isNumber(value: unknown): value is number;
|
|
16
|
+
/**
|
|
17
|
+
* 检查值是否为布尔值
|
|
18
|
+
*/
|
|
19
|
+
export declare function isBoolean(value: unknown): value is boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 检查值是否为数组
|
|
22
|
+
*/
|
|
23
|
+
export declare function isArray(value: unknown): value is unknown[];
|
|
24
|
+
/**
|
|
25
|
+
* 安全地获取对象属性
|
|
26
|
+
*/
|
|
27
|
+
export declare function getProperty<T>(obj: unknown, key: string, validator?: (value: unknown) => value is T): T | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* 检查对象是否具有特定属性
|
|
30
|
+
*/
|
|
31
|
+
export declare function hasProperty(obj: unknown, key: string): obj is Record<string, unknown>;
|
|
32
|
+
/**
|
|
33
|
+
* 验证对象具有必需的属性
|
|
34
|
+
*/
|
|
35
|
+
export declare function hasRequiredProperties(obj: unknown, properties: string[]): obj is Record<string, unknown>;
|
|
36
|
+
/**
|
|
37
|
+
* 类型断言辅助函数
|
|
38
|
+
*/
|
|
39
|
+
export declare function assertType<T>(value: unknown, validator: (value: unknown) => value is T, errorMessage: string): T;
|
|
40
|
+
/**
|
|
41
|
+
* 安全的 JSON 解析
|
|
42
|
+
*/
|
|
43
|
+
export declare function safeJsonParse(json: string): unknown;
|
|
44
|
+
/**
|
|
45
|
+
* 将 unknown 类型转换为 Record<string, unknown>
|
|
46
|
+
* 如果不是对象,返回空对象
|
|
47
|
+
*/
|
|
48
|
+
export declare function toRecord(value: unknown): Record<string, unknown>;
|
|
49
|
+
/**
|
|
50
|
+
* 将 unknown 类型转换为数组
|
|
51
|
+
* 如果不是数组,返回空数组
|
|
52
|
+
*/
|
|
53
|
+
export declare function toArray(value: unknown): unknown[];
|
|
54
|
+
//# sourceMappingURL=typeGuards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeGuards.d.ts","sourceRoot":"","sources":["../../../src/features/shared/typeGuards.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,EAAE,CAE1D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,GACzC,CAAC,GAAG,SAAS,CAYf;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,MAAM,GACV,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEhC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE,MAAM,EAAE,GACnB,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMhC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,EACzC,YAAY,EAAE,MAAM,GACnB,CAAC,CAKH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMnD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEhE;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,CAEjD"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 类型守卫和类型验证工具
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 检查值是否为对象(非 null)
|
|
6
|
+
*/
|
|
7
|
+
export function isObject(value) {
|
|
8
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 检查值是否为字符串
|
|
12
|
+
*/
|
|
13
|
+
export function isString(value) {
|
|
14
|
+
return typeof value === 'string';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 检查值是否为数字
|
|
18
|
+
*/
|
|
19
|
+
export function isNumber(value) {
|
|
20
|
+
return typeof value === 'number';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 检查值是否为布尔值
|
|
24
|
+
*/
|
|
25
|
+
export function isBoolean(value) {
|
|
26
|
+
return typeof value === 'boolean';
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 检查值是否为数组
|
|
30
|
+
*/
|
|
31
|
+
export function isArray(value) {
|
|
32
|
+
return Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 安全地获取对象属性
|
|
36
|
+
*/
|
|
37
|
+
export function getProperty(obj, key, validator) {
|
|
38
|
+
if (!isObject(obj)) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
const value = obj[key];
|
|
42
|
+
if (validator) {
|
|
43
|
+
return validator(value) ? value : undefined;
|
|
44
|
+
}
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 检查对象是否具有特定属性
|
|
49
|
+
*/
|
|
50
|
+
export function hasProperty(obj, key) {
|
|
51
|
+
return isObject(obj) && key in obj;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 验证对象具有必需的属性
|
|
55
|
+
*/
|
|
56
|
+
export function hasRequiredProperties(obj, properties) {
|
|
57
|
+
if (!isObject(obj)) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return properties.every(prop => prop in obj);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 类型断言辅助函数
|
|
64
|
+
*/
|
|
65
|
+
export function assertType(value, validator, errorMessage) {
|
|
66
|
+
if (!validator(value)) {
|
|
67
|
+
throw new TypeError(errorMessage);
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 安全的 JSON 解析
|
|
73
|
+
*/
|
|
74
|
+
export function safeJsonParse(json) {
|
|
75
|
+
try {
|
|
76
|
+
return JSON.parse(json);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 将 unknown 类型转换为 Record<string, unknown>
|
|
84
|
+
* 如果不是对象,返回空对象
|
|
85
|
+
*/
|
|
86
|
+
export function toRecord(value) {
|
|
87
|
+
return isObject(value) ? value : {};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 将 unknown 类型转换为数组
|
|
91
|
+
* 如果不是数组,返回空数组
|
|
92
|
+
*/
|
|
93
|
+
export function toArray(value) {
|
|
94
|
+
return isArray(value) ? value : [];
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=typeGuards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeGuards.js","sourceRoot":"","sources":["../../../src/features/shared/typeGuards.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,GAAY,EACZ,GAAW,EACX,SAA0C;IAE1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAEvB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9C,CAAC;IAED,OAAO,KAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,GAAY,EACZ,GAAW;IAEX,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAY,EACZ,UAAoB;IAEpB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAc,EACd,SAAyC,EACzC,YAAoB;IAEpB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skip current stage
|
|
3
|
+
*/
|
|
4
|
+
import { WorkflowResult } from '../shared/mcpTypes.js';
|
|
5
|
+
export interface SkipOptions {
|
|
6
|
+
path: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function skipStage(options: SkipOptions): Promise<WorkflowResult>;
|
|
9
|
+
//# sourceMappingURL=skipStage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skipStage.d.ts","sourceRoot":"","sources":["../../../src/features/skip/skipStage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAsD7E"}
|