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.
Files changed (111) hide show
  1. package/README.md +49 -0
  2. package/api/spec-workflow.openapi.yaml +1305 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +151 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/features/check/analyzeStage.d.ts +20 -0
  8. package/dist/features/check/analyzeStage.d.ts.map +1 -0
  9. package/dist/features/check/analyzeStage.js +114 -0
  10. package/dist/features/check/analyzeStage.js.map +1 -0
  11. package/dist/features/check/checkWorkflow.d.ts +10 -0
  12. package/dist/features/check/checkWorkflow.d.ts.map +1 -0
  13. package/dist/features/check/checkWorkflow.js +92 -0
  14. package/dist/features/check/checkWorkflow.js.map +1 -0
  15. package/dist/features/check/generateNextDocument.d.ts +14 -0
  16. package/dist/features/check/generateNextDocument.d.ts.map +1 -0
  17. package/dist/features/check/generateNextDocument.js +64 -0
  18. package/dist/features/check/generateNextDocument.js.map +1 -0
  19. package/dist/features/confirm/confirmStage.d.ts +9 -0
  20. package/dist/features/confirm/confirmStage.d.ts.map +1 -0
  21. package/dist/features/confirm/confirmStage.js +101 -0
  22. package/dist/features/confirm/confirmStage.js.map +1 -0
  23. package/dist/features/executeWorkflow.d.ts +15 -0
  24. package/dist/features/executeWorkflow.d.ts.map +1 -0
  25. package/dist/features/executeWorkflow.js +97 -0
  26. package/dist/features/executeWorkflow.js.map +1 -0
  27. package/dist/features/init/createRequirementsDoc.d.ts +11 -0
  28. package/dist/features/init/createRequirementsDoc.d.ts.map +1 -0
  29. package/dist/features/init/createRequirementsDoc.js +36 -0
  30. package/dist/features/init/createRequirementsDoc.js.map +1 -0
  31. package/dist/features/init/initWorkflow.d.ts +12 -0
  32. package/dist/features/init/initWorkflow.d.ts.map +1 -0
  33. package/dist/features/init/initWorkflow.js +103 -0
  34. package/dist/features/init/initWorkflow.js.map +1 -0
  35. package/dist/features/shared/SpecManager.d.ts +33 -0
  36. package/dist/features/shared/SpecManager.d.ts.map +1 -0
  37. package/dist/features/shared/SpecManager.js +103 -0
  38. package/dist/features/shared/SpecManager.js.map +1 -0
  39. package/dist/features/shared/confirmationStatus.d.ts +24 -0
  40. package/dist/features/shared/confirmationStatus.d.ts.map +1 -0
  41. package/dist/features/shared/confirmationStatus.js +69 -0
  42. package/dist/features/shared/confirmationStatus.js.map +1 -0
  43. package/dist/features/shared/documentAnalyzer.d.ts +18 -0
  44. package/dist/features/shared/documentAnalyzer.d.ts.map +1 -0
  45. package/dist/features/shared/documentAnalyzer.js +34 -0
  46. package/dist/features/shared/documentAnalyzer.js.map +1 -0
  47. package/dist/features/shared/documentStatus.d.ts +18 -0
  48. package/dist/features/shared/documentStatus.d.ts.map +1 -0
  49. package/dist/features/shared/documentStatus.js +66 -0
  50. package/dist/features/shared/documentStatus.js.map +1 -0
  51. package/dist/features/shared/documentTemplates.d.ts +8 -0
  52. package/dist/features/shared/documentTemplates.d.ts.map +1 -0
  53. package/dist/features/shared/documentTemplates.js +89 -0
  54. package/dist/features/shared/documentTemplates.js.map +1 -0
  55. package/dist/features/shared/documentUtils.d.ts +9 -0
  56. package/dist/features/shared/documentUtils.d.ts.map +1 -0
  57. package/dist/features/shared/documentUtils.js +38 -0
  58. package/dist/features/shared/documentUtils.js.map +1 -0
  59. package/dist/features/shared/mcpTypes.d.ts +83 -0
  60. package/dist/features/shared/mcpTypes.d.ts.map +1 -0
  61. package/dist/features/shared/mcpTypes.js +41 -0
  62. package/dist/features/shared/mcpTypes.js.map +1 -0
  63. package/dist/features/shared/openApiLoader.d.ts +88 -0
  64. package/dist/features/shared/openApiLoader.d.ts.map +1 -0
  65. package/dist/features/shared/openApiLoader.js +166 -0
  66. package/dist/features/shared/openApiLoader.js.map +1 -0
  67. package/dist/features/shared/openApiTypes.d.ts +101 -0
  68. package/dist/features/shared/openApiTypes.d.ts.map +1 -0
  69. package/dist/features/shared/openApiTypes.js +4 -0
  70. package/dist/features/shared/openApiTypes.js.map +1 -0
  71. package/dist/features/shared/progressCalculator.d.ts +22 -0
  72. package/dist/features/shared/progressCalculator.d.ts.map +1 -0
  73. package/dist/features/shared/progressCalculator.js +45 -0
  74. package/dist/features/shared/progressCalculator.js.map +1 -0
  75. package/dist/features/shared/responseBuilder.d.ts +13 -0
  76. package/dist/features/shared/responseBuilder.d.ts.map +1 -0
  77. package/dist/features/shared/responseBuilder.js +303 -0
  78. package/dist/features/shared/responseBuilder.js.map +1 -0
  79. package/dist/features/shared/taskGuidanceTemplate.d.ts +22 -0
  80. package/dist/features/shared/taskGuidanceTemplate.d.ts.map +1 -0
  81. package/dist/features/shared/taskGuidanceTemplate.js +145 -0
  82. package/dist/features/shared/taskGuidanceTemplate.js.map +1 -0
  83. package/dist/features/shared/taskParser.d.ts +17 -0
  84. package/dist/features/shared/taskParser.d.ts.map +1 -0
  85. package/dist/features/shared/taskParser.js +259 -0
  86. package/dist/features/shared/taskParser.js.map +1 -0
  87. package/dist/features/shared/typeGuards.d.ts +54 -0
  88. package/dist/features/shared/typeGuards.d.ts.map +1 -0
  89. package/dist/features/shared/typeGuards.js +96 -0
  90. package/dist/features/shared/typeGuards.js.map +1 -0
  91. package/dist/features/skip/skipStage.d.ts +9 -0
  92. package/dist/features/skip/skipStage.d.ts.map +1 -0
  93. package/dist/features/skip/skipStage.js +122 -0
  94. package/dist/features/skip/skipStage.js.map +1 -0
  95. package/dist/features/task/completeTask.d.ts +13 -0
  96. package/dist/features/task/completeTask.d.ts.map +1 -0
  97. package/dist/features/task/completeTask.js +362 -0
  98. package/dist/features/task/completeTask.js.map +1 -0
  99. package/dist/index.d.ts +7 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +51 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/logger.d.ts +6 -0
  104. package/dist/logger.d.ts.map +1 -0
  105. package/dist/logger.js +23 -0
  106. package/dist/logger.js.map +1 -0
  107. package/dist/tools/specTools.d.ts +3 -0
  108. package/dist/tools/specTools.d.ts.map +1 -0
  109. package/dist/tools/specTools.js +107 -0
  110. package/dist/tools/specTools.js.map +1 -0
  111. package/package.json +44 -0
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Skip current stage
3
+ */
4
+ import { existsSync, writeFileSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { getWorkflowStatus, getCurrentStage, getNextStage, getStageName, getStageFileName } from '../shared/documentStatus.js';
7
+ import { getSkippedTemplate, getDesignTemplate, getTasksTemplate } from '../shared/documentTemplates.js';
8
+ import { updateStageConfirmation, updateStageSkipped } from '../shared/confirmationStatus.js';
9
+ import { responseBuilder } from '../shared/responseBuilder.js';
10
+ import { extractDocumentInfo } from '../shared/documentUtils.js';
11
+ import { calculateWorkflowProgress } from '../shared/progressCalculator.js';
12
+ export async function skipStage(options) {
13
+ const { path } = options;
14
+ if (!existsSync(path)) {
15
+ return {
16
+ displayText: responseBuilder.buildErrorResponse('invalidPath', { path }),
17
+ data: {
18
+ success: false,
19
+ error: 'Directory does not exist'
20
+ }
21
+ };
22
+ }
23
+ const status = getWorkflowStatus(path);
24
+ const currentStage = getCurrentStage(status, path);
25
+ if (currentStage === 'completed') {
26
+ return {
27
+ displayText: 'āœ… All stages completed, no need to skip',
28
+ data: {
29
+ success: false,
30
+ reason: 'All stages completed'
31
+ }
32
+ };
33
+ }
34
+ // Get document information
35
+ const documentInfo = extractDocumentInfo(join(path, 'requirements.md'));
36
+ // Create document for skipped stage
37
+ createSkippedDocument(path, currentStage, documentInfo.featureName);
38
+ // Mark current stage as skipped
39
+ updateStageSkipped(path, currentStage, true);
40
+ // For tasks stage, don't mark as confirmed when skipping
41
+ // since it's essential for development
42
+ if (currentStage !== 'tasks') {
43
+ updateStageConfirmation(path, currentStage, true);
44
+ }
45
+ // Generate next document (if needed)
46
+ const nextStage = getNextStage(currentStage);
47
+ if (nextStage !== 'completed') {
48
+ createNextStageDocument(path, nextStage, documentInfo.featureName);
49
+ // Initialize next stage confirmation status as unconfirmed
50
+ updateStageConfirmation(path, nextStage, false);
51
+ }
52
+ // Calculate progress after skip
53
+ const updatedStatus = getWorkflowStatus(path);
54
+ const progress = calculateWorkflowProgress(path, updatedStatus);
55
+ return responseBuilder.buildSkipResponse(currentStage, path, progress);
56
+ }
57
+ function createSkippedDocument(path, stage, featureName) {
58
+ const fileName = getStageFileName(stage);
59
+ const filePath = join(path, fileName);
60
+ // If document already exists, don't overwrite
61
+ if (existsSync(filePath)) {
62
+ return {
63
+ created: false,
64
+ fileName,
65
+ message: `${fileName} already exists, keeping original content`
66
+ };
67
+ }
68
+ const content = getSkippedTemplate(getStageName(stage), featureName);
69
+ try {
70
+ writeFileSync(filePath, content, 'utf-8');
71
+ return {
72
+ created: true,
73
+ fileName,
74
+ message: `Created skip marker document: ${fileName}`
75
+ };
76
+ }
77
+ catch (error) {
78
+ return {
79
+ created: false,
80
+ fileName,
81
+ message: `Failed to create skip document: ${error}`
82
+ };
83
+ }
84
+ }
85
+ function createNextStageDocument(path, stage, featureName) {
86
+ const fileName = getStageFileName(stage);
87
+ const filePath = join(path, fileName);
88
+ if (existsSync(filePath)) {
89
+ return {
90
+ created: false,
91
+ fileName,
92
+ message: `${fileName} already exists`
93
+ };
94
+ }
95
+ let content;
96
+ switch (stage) {
97
+ case 'design':
98
+ content = getDesignTemplate(featureName);
99
+ break;
100
+ case 'tasks':
101
+ content = getTasksTemplate(featureName);
102
+ break;
103
+ default:
104
+ return null;
105
+ }
106
+ try {
107
+ writeFileSync(filePath, content, 'utf-8');
108
+ return {
109
+ created: true,
110
+ fileName,
111
+ message: `Created next stage document: ${fileName}`
112
+ };
113
+ }
114
+ catch (error) {
115
+ return {
116
+ created: false,
117
+ fileName,
118
+ message: `Failed to create document: ${error}`
119
+ };
120
+ }
121
+ }
122
+ //# sourceMappingURL=skipStage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skipStage.js","sourceRoot":"","sources":["../../../src/features/skip/skipStage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Complete task - ē»Ÿäø€ä½æē”Øę‰¹é‡å®Œęˆé€»č¾‘
3
+ */
4
+ export interface WorkflowResult {
5
+ displayText: string;
6
+ data?: any;
7
+ }
8
+ export interface CompleteTaskOptions {
9
+ path: string;
10
+ taskNumber: string | string[];
11
+ }
12
+ export declare function completeTask(options: CompleteTaskOptions): Promise<WorkflowResult>;
13
+ //# sourceMappingURL=completeTask.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,362 @@
1
+ /**
2
+ * Complete task - ē»Ÿäø€ä½æē”Øę‰¹é‡å®Œęˆé€»č¾‘
3
+ */
4
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { parseTasksFromContent, getFirstUncompletedTask, formatTaskForFullDisplay } from '../shared/taskParser.js';
7
+ import { TaskGuidanceExtractor } from '../shared/taskGuidanceTemplate.js';
8
+ export async function completeTask(options) {
9
+ const { path, taskNumber } = options;
10
+ // ē»Ÿäø€č½¬ę¢äøŗę•°ē»„ę ¼å¼čæ›č”Œę‰¹é‡å¤„ē†
11
+ const taskNumbers = Array.isArray(taskNumber) ? taskNumber : [taskNumber];
12
+ 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
+ };
20
+ }
21
+ const tasksPath = join(path, 'tasks.md');
22
+ 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
+ };
30
+ }
31
+ // ē»Ÿäø€ä½æē”Øę‰¹é‡å¤„ē†é€»č¾‘
32
+ const batchResult = await completeBatchTasks(tasksPath, taskNumbers);
33
+ return {
34
+ displayText: batchResult.displayText,
35
+ data: { ...batchResult }
36
+ };
37
+ }
38
+ /**
39
+ * Complete multiple tasks in batch
40
+ */
41
+ async function completeBatchTasks(tasksPath, taskNumbers) {
42
+ // Read tasks file
43
+ const originalContent = readFileSync(tasksPath, 'utf-8');
44
+ const tasks = parseTasksFromContent(originalContent);
45
+ // Categorize tasks: already completed, can be completed, cannot be completed
46
+ const alreadyCompleted = [];
47
+ 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
+ });
56
+ }
57
+ else if (targetTask.checked) {
58
+ alreadyCompleted.push(taskNum);
59
+ }
60
+ else if (targetTask.subtasks && targetTask.subtasks.some(s => !s.checked)) {
61
+ cannotBeCompleted.push({
62
+ taskNumber: taskNum,
63
+ reason: 'Has uncompleted subtasks'
64
+ });
65
+ }
66
+ else {
67
+ canBeCompleted.push(taskNum);
68
+ }
69
+ }
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');
75
+ return {
76
+ success: false,
77
+ 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.`
81
+ };
82
+ }
83
+ // If no tasks can be completed but there are already completed tasks, still return success
84
+ 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')}`;
91
+ return {
92
+ success: true,
93
+ completedTasks: [],
94
+ alreadyCompleted,
95
+ nextTask: nextTask ? {
96
+ number: nextTask.number,
97
+ description: nextTask.description
98
+ } : undefined,
99
+ hasNextTask: nextTask !== null,
100
+ displayText
101
+ };
102
+ }
103
+ // Execution phase: complete tasks in dependency order
104
+ let currentContent = originalContent;
105
+ const actuallyCompleted = [];
106
+ const results = [];
107
+ 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
+ }
144
+ // 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;
241
+ }
242
+ else {
243
+ displayText += '\n\n' + TaskGuidanceExtractor.getCompletionMessage('allCompleted');
244
+ }
245
+ return {
246
+ success: true,
247
+ completedTasks: actuallyCompleted,
248
+ alreadyCompleted,
249
+ failedTasks: [],
250
+ results,
251
+ nextTask: nextTask ? {
252
+ number: nextTask.number,
253
+ description: nextTask.description
254
+ } : undefined,
255
+ hasNextTask: nextTask !== null,
256
+ displayText
257
+ };
258
+ }
259
+ 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
+ }
322
+ }
323
+ return found ? lines.join('\n') : null;
324
+ }
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
+ }
359
+ }
360
+ return null;
361
+ }
362
+ //# sourceMappingURL=completeTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completeTask.js","sourceRoot":"","sources":["../../../src/features/task/completeTask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP specification workflow server
4
+ * Standard implementation based on MCP SDK
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
package/dist/index.js ADDED
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP specification workflow server
4
+ * Standard implementation based on MCP SDK
5
+ */
6
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
+ import { registerSpecTools } from './tools/specTools.js';
9
+ import { openApiLoader } from './features/shared/openApiLoader.js';
10
+ import { readFileSync } from 'fs';
11
+ import { fileURLToPath } from 'url';
12
+ import { dirname, join } from 'path';
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = dirname(__filename);
15
+ const packageJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
16
+ // Create server instance
17
+ const server = new McpServer({
18
+ name: 'spec-cli',
19
+ version: packageJson.version
20
+ });
21
+ // Register tools
22
+ registerSpecTools(server);
23
+ // Start server
24
+ async function main() {
25
+ try {
26
+ // Initialize OpenAPI loader to ensure examples are cached
27
+ openApiLoader.loadSpec();
28
+ const transport = new StdioServerTransport();
29
+ await server.connect(transport);
30
+ // eslint-disable-next-line no-console
31
+ console.error('✨ MCP specification workflow server started');
32
+ // eslint-disable-next-line no-console
33
+ console.error(`šŸ“ Version: ${packageJson.version} (Fully compliant with MCP best practices)`);
34
+ }
35
+ catch (error) {
36
+ // eslint-disable-next-line no-console
37
+ console.error('āŒ Startup failed:', error);
38
+ // eslint-disable-next-line no-undef
39
+ process.exit(1);
40
+ }
41
+ }
42
+ // Graceful shutdown
43
+ // eslint-disable-next-line no-undef
44
+ process.on('SIGINT', () => {
45
+ // eslint-disable-next-line no-console
46
+ console.error('\nšŸ‘‹ Server shutdown');
47
+ // eslint-disable-next-line no-undef
48
+ process.exit(0);
49
+ });
50
+ main();
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAC7D,CAAC;AAEF,yBAAyB;AACzB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,WAAW,CAAC,OAAO;CAC7B,CAAC,CAAC;AAEH,iBAAiB;AACjB,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAE1B,eAAe;AACf,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,0DAA0D;QAC1D,aAAa,CAAC,QAAQ,EAAE,CAAC;QAEzB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC7D,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,eAAe,WAAW,CAAC,OAAO,4CAA4C,CAAC,CAAC;IAEhG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAC1C,oCAAoC;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,oBAAoB;AACpB,oCAAoC;AACpC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACtC,oCAAoC;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,IAAI,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare class Logger {
2
+ private static LOG_DIR;
3
+ private static LOG_FILE;
4
+ static logCommand(command: string, args: string[], output: string): void;
5
+ }
6
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IAEtC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAmBzE"}
package/dist/logger.js ADDED
@@ -0,0 +1,23 @@
1
+ import { appendFileSync, existsSync, mkdirSync } from 'fs';
2
+ import { join } from 'path';
3
+ export class Logger {
4
+ static LOG_DIR = '.agent_logs';
5
+ static LOG_FILE = 'audit.log';
6
+ static logCommand(command, args, output) {
7
+ const baseDir = process.cwd();
8
+ const logDirPath = join(baseDir, this.LOG_DIR);
9
+ if (!existsSync(logDirPath)) {
10
+ mkdirSync(logDirPath, { recursive: true });
11
+ }
12
+ const logFilePath = join(logDirPath, this.LOG_FILE);
13
+ const timestamp = new Date().toISOString();
14
+ const logEntry = `[${timestamp}] COMMAND: ${command} ${args.join(' ')}\nOUTPUT:\n${output}\n---\n`;
15
+ try {
16
+ appendFileSync(logFilePath, logEntry, 'utf-8');
17
+ }
18
+ catch (e) {
19
+ console.error('Failed to write to audit log', e);
20
+ }
21
+ }
22
+ }
23
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,OAAO,MAAM;IACT,MAAM,CAAC,OAAO,GAAG,aAAa,CAAC;IAC/B,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC;IAEtC,MAAM,CAAC,UAAU,CAAC,OAAe,EAAE,IAAc,EAAE,MAAc;QAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAE/C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE3C,MAAM,QAAQ,GAAG,IAAI,SAAS,cAAc,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,MAAM,SAAS,CAAC;QAEnG,IAAI,CAAC;YACH,cAAc,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerSpecTools(server: McpServer): void;
3
+ //# sourceMappingURL=specTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specTools.d.ts","sourceRoot":"","sources":["../../src/tools/specTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgCpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyFzD"}