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,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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|