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
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { parseArgs } from 'util';
|
|
5
|
+
import { SpecManager } from './features/shared/SpecManager.js';
|
|
6
|
+
import { getRequirementsTemplate, getDesignTemplate, getTasksTemplate } from './features/shared/documentTemplates.js';
|
|
7
|
+
import { completeTask } from './features/task/completeTask.js';
|
|
8
|
+
import { Logger } from './logger.js';
|
|
9
|
+
const { positionals, values } = parseArgs({
|
|
10
|
+
args: process.argv.slice(2),
|
|
11
|
+
options: {
|
|
12
|
+
feature: { type: 'string' },
|
|
13
|
+
instruction: { type: 'string' },
|
|
14
|
+
name: { type: 'string' },
|
|
15
|
+
description: { type: 'string' },
|
|
16
|
+
id: { type: 'string' },
|
|
17
|
+
help: { type: 'boolean' }
|
|
18
|
+
},
|
|
19
|
+
allowPositionals: true
|
|
20
|
+
});
|
|
21
|
+
const command = positionals[0];
|
|
22
|
+
const subcommand = positionals[1];
|
|
23
|
+
async function main() {
|
|
24
|
+
let output = '';
|
|
25
|
+
try {
|
|
26
|
+
const baseDir = process.cwd();
|
|
27
|
+
if (command === 'help' || values.help) {
|
|
28
|
+
output = `
|
|
29
|
+
Usage: spec-cli <command> [subcommand] [options]
|
|
30
|
+
|
|
31
|
+
Commands:
|
|
32
|
+
status Get a health check of the active project
|
|
33
|
+
help [topic] Show help documentation
|
|
34
|
+
exec init Initialize a new feature
|
|
35
|
+
exec plan Progress the workflow state
|
|
36
|
+
exec todo <action> Manage tasks (list, start, complete)
|
|
37
|
+
verify Verify current state
|
|
38
|
+
|
|
39
|
+
Options:
|
|
40
|
+
--feature <name> Feature name
|
|
41
|
+
--instruction <text> Instructions or updates
|
|
42
|
+
--name <name> Feature or project name (for init)
|
|
43
|
+
--description <text> Optional description (for init)
|
|
44
|
+
--id <id> Task ID (for todo)
|
|
45
|
+
`;
|
|
46
|
+
console.log(output);
|
|
47
|
+
Logger.logCommand(process.argv.slice(2).join(' '), [], output);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (command === 'status') {
|
|
51
|
+
output = SpecManager.getStatusSummary(baseDir, values.feature);
|
|
52
|
+
console.log(output);
|
|
53
|
+
}
|
|
54
|
+
else if (command === 'verify') {
|
|
55
|
+
output = "Project state verified.\n\n" + SpecManager.getStatusSummary(baseDir, values.feature);
|
|
56
|
+
console.log(output);
|
|
57
|
+
}
|
|
58
|
+
else if (command === 'exec') {
|
|
59
|
+
if (subcommand === 'init') {
|
|
60
|
+
const featureName = values.name || values.feature;
|
|
61
|
+
if (!featureName)
|
|
62
|
+
throw new Error('--name or --feature is required for init');
|
|
63
|
+
const featurePath = join(baseDir, featureName);
|
|
64
|
+
if (!existsSync(featurePath)) {
|
|
65
|
+
mkdirSync(featurePath, { recursive: true });
|
|
66
|
+
}
|
|
67
|
+
SpecManager.resolveFeaturePath(baseDir, featureName);
|
|
68
|
+
const reqPath = join(featurePath, 'requirements.md');
|
|
69
|
+
if (!existsSync(reqPath)) {
|
|
70
|
+
const content = getRequirementsTemplate(featureName, values.description || 'Initial requirements');
|
|
71
|
+
writeFileSync(reqPath, content, 'utf-8');
|
|
72
|
+
}
|
|
73
|
+
output = SpecManager.getStatusSummary(baseDir, featureName);
|
|
74
|
+
console.log(output);
|
|
75
|
+
}
|
|
76
|
+
else if (subcommand === 'plan') {
|
|
77
|
+
const featurePath = SpecManager.resolveFeaturePath(baseDir, values.feature);
|
|
78
|
+
const state = SpecManager.getWorkflowState(featurePath);
|
|
79
|
+
let message = '';
|
|
80
|
+
if (!state.requirements.exists) {
|
|
81
|
+
const content = getRequirementsTemplate(featurePath.split('/').pop() || 'feature', values.instruction || '');
|
|
82
|
+
writeFileSync(join(featurePath, 'requirements.md'), content, 'utf-8');
|
|
83
|
+
message = 'Initialized requirements.md.';
|
|
84
|
+
}
|
|
85
|
+
else if (!state.requirements.edited) {
|
|
86
|
+
message = 'Please finish editing requirements.md (remove all <template> tags) before advancing.';
|
|
87
|
+
if (values.instruction)
|
|
88
|
+
message += `\n> Reminder instruction: ${values.instruction}`;
|
|
89
|
+
}
|
|
90
|
+
else if (!state.design.exists) {
|
|
91
|
+
let content = getDesignTemplate(featurePath.split('/').pop() || 'feature');
|
|
92
|
+
if (values.instruction)
|
|
93
|
+
content += `\n\n> **Guidance:** ${values.instruction}`;
|
|
94
|
+
writeFileSync(join(featurePath, 'design.md'), content, 'utf-8');
|
|
95
|
+
message = 'Requirements complete. Scaffolding design.md.';
|
|
96
|
+
}
|
|
97
|
+
else if (!state.design.edited) {
|
|
98
|
+
message = 'Please finish editing design.md (remove all <template> tags) before advancing.';
|
|
99
|
+
if (values.instruction)
|
|
100
|
+
message += `\n> Reminder instruction: ${values.instruction}`;
|
|
101
|
+
}
|
|
102
|
+
else if (!state.tasks.exists) {
|
|
103
|
+
let content = getTasksTemplate(featurePath.split('/').pop() || 'feature');
|
|
104
|
+
if (values.instruction)
|
|
105
|
+
content += `\n\n> **Guidance:** ${values.instruction}`;
|
|
106
|
+
writeFileSync(join(featurePath, 'tasks.md'), content, 'utf-8');
|
|
107
|
+
message = 'Design complete. Scaffolding tasks.md.';
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
message = 'All documents exist. Proceed with `exec todo`.';
|
|
111
|
+
if (values.instruction)
|
|
112
|
+
message += `\n> Received instruction: ${values.instruction}`;
|
|
113
|
+
}
|
|
114
|
+
output = `${message}\n\n${SpecManager.getStatusSummary(baseDir, values.feature)}`;
|
|
115
|
+
console.log(output);
|
|
116
|
+
}
|
|
117
|
+
else if (subcommand === 'todo') {
|
|
118
|
+
const action = positionals[2];
|
|
119
|
+
const featurePath = SpecManager.resolveFeaturePath(baseDir, values.feature);
|
|
120
|
+
if (action === 'list') {
|
|
121
|
+
output = SpecManager.getStatusSummary(baseDir, values.feature);
|
|
122
|
+
console.log(output);
|
|
123
|
+
}
|
|
124
|
+
else if (action === 'complete' && values.id) {
|
|
125
|
+
const result = await completeTask({ path: featurePath, taskNumber: values.id });
|
|
126
|
+
output = `${result.displayText}\n\n${SpecManager.getStatusSummary(baseDir, values.feature)}`;
|
|
127
|
+
console.log(output);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
output = `Action ${action} on id ${values.id} acknowledged.\n\n${SpecManager.getStatusSummary(baseDir, values.feature)}`;
|
|
131
|
+
console.log(output);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
throw new Error('Unknown exec subcommand');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
throw new Error(`Unknown command: ${command}`);
|
|
140
|
+
}
|
|
141
|
+
Logger.logCommand(process.argv.slice(2).join(' '), [], output);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
output = `Error: ${error.message}`;
|
|
145
|
+
console.error(output);
|
|
146
|
+
Logger.logCommand(process.argv.slice(2).join(' '), [], output);
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
main();
|
|
151
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analyze workflow stage
|
|
3
|
+
*/
|
|
4
|
+
import { WorkflowStatus, WorkflowStage } from '../shared/documentStatus.js';
|
|
5
|
+
export interface StageAnalysis {
|
|
6
|
+
canProceed: boolean;
|
|
7
|
+
needsConfirmation: boolean;
|
|
8
|
+
reason?: string;
|
|
9
|
+
suggestions: string[];
|
|
10
|
+
guide?: unknown;
|
|
11
|
+
}
|
|
12
|
+
export interface StageStatus {
|
|
13
|
+
exists: boolean;
|
|
14
|
+
confirmed: boolean;
|
|
15
|
+
skipped: boolean;
|
|
16
|
+
displayStatus: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function analyzeStage(path: string, stage: WorkflowStage, status: WorkflowStatus): StageAnalysis;
|
|
19
|
+
export declare function getStageStatus(stage: string, status: WorkflowStatus, path: string): StageStatus;
|
|
20
|
+
//# sourceMappingURL=analyzeStage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzeStage.d.ts","sourceRoot":"","sources":["../../../src/features/check/analyzeStage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAkC,MAAM,6BAA6B,CAAC;AAM5G,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,GACrB,aAAa,CA+Df;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,GACX,WAAW,CAgCb"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analyze workflow stage
|
|
3
|
+
*/
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { getStageFileName, getStageName } from '../shared/documentStatus.js';
|
|
6
|
+
import { isStageConfirmed, isStageSkipped } from '../shared/confirmationStatus.js';
|
|
7
|
+
import { openApiLoader } from '../shared/openApiLoader.js';
|
|
8
|
+
import { isDocumentEdited } from '../shared/documentAnalyzer.js';
|
|
9
|
+
import { isObject, hasProperty } from '../shared/typeGuards.js';
|
|
10
|
+
export function analyzeStage(path, stage, status) {
|
|
11
|
+
if (stage === 'completed') {
|
|
12
|
+
return {
|
|
13
|
+
canProceed: false,
|
|
14
|
+
needsConfirmation: false,
|
|
15
|
+
reason: 'All stages completed',
|
|
16
|
+
suggestions: []
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const stageData = status[stage];
|
|
20
|
+
// Type guard to handle 'completed' stage
|
|
21
|
+
const isCompletedStage = (s) => s === 'completed';
|
|
22
|
+
const confirmed = isCompletedStage(stage) ? false : isStageConfirmed(path, stage);
|
|
23
|
+
const skipped = isCompletedStage(stage) ? false : isStageSkipped(path, stage);
|
|
24
|
+
// If stage is skipped or confirmed, can proceed
|
|
25
|
+
if (confirmed || skipped) {
|
|
26
|
+
return {
|
|
27
|
+
canProceed: true,
|
|
28
|
+
needsConfirmation: false,
|
|
29
|
+
suggestions: [`${getStageName(stage)} completed, can proceed to next stage`]
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// Check if document exists
|
|
33
|
+
if (!stageData || !stageData.exists) {
|
|
34
|
+
return {
|
|
35
|
+
canProceed: false,
|
|
36
|
+
needsConfirmation: false,
|
|
37
|
+
reason: `${getStageName(stage)} does not exist`,
|
|
38
|
+
suggestions: [`Create ${getStageName(stage)}`],
|
|
39
|
+
guide: getStageGuide(stage)
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Check if document has been edited
|
|
43
|
+
const fileName = getStageFileName(stage);
|
|
44
|
+
const filePath = join(path, fileName);
|
|
45
|
+
const edited = isDocumentEdited(filePath);
|
|
46
|
+
if (!edited) {
|
|
47
|
+
// Document exists but not edited
|
|
48
|
+
return {
|
|
49
|
+
canProceed: false,
|
|
50
|
+
needsConfirmation: false,
|
|
51
|
+
reason: `${getStageName(stage)} not edited yet (still contains template markers)`,
|
|
52
|
+
suggestions: [
|
|
53
|
+
`Please edit ${fileName} and remove all <template-*> markers`,
|
|
54
|
+
'Fill in actual content before using check operation'
|
|
55
|
+
],
|
|
56
|
+
guide: getStageGuide(stage)
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Document edited but not confirmed
|
|
60
|
+
return {
|
|
61
|
+
canProceed: false,
|
|
62
|
+
needsConfirmation: true,
|
|
63
|
+
reason: `${getStageName(stage)} edited but not confirmed yet`,
|
|
64
|
+
suggestions: ['Please use confirm operation to confirm this stage is complete'],
|
|
65
|
+
guide: getStageGuide(stage)
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function getStageStatus(stage, status, path) {
|
|
69
|
+
const stageData = status[stage];
|
|
70
|
+
const exists = stageData?.exists || false;
|
|
71
|
+
const confirmed = exists && stage !== 'completed' ? isStageConfirmed(path, stage) : false;
|
|
72
|
+
const skipped = exists && stage !== 'completed' ? isStageSkipped(path, stage) : false;
|
|
73
|
+
const globalConfig = openApiLoader.getGlobalConfig();
|
|
74
|
+
const statusTextConfig = isObject(globalConfig) && hasProperty(globalConfig, 'status_text') && isObject(globalConfig.status_text) ? globalConfig.status_text : {};
|
|
75
|
+
const statusText = {
|
|
76
|
+
not_created: typeof statusTextConfig.not_created === 'string' ? statusTextConfig.not_created : 'Not created',
|
|
77
|
+
not_confirmed: typeof statusTextConfig.not_confirmed === 'string' ? statusTextConfig.not_confirmed : 'Pending confirmation',
|
|
78
|
+
completed: typeof statusTextConfig.completed === 'string' ? statusTextConfig.completed : 'Completed',
|
|
79
|
+
skipped: typeof statusTextConfig.skipped === 'string' ? statusTextConfig.skipped : 'Skipped'
|
|
80
|
+
};
|
|
81
|
+
let displayStatus = statusText.not_created;
|
|
82
|
+
if (exists) {
|
|
83
|
+
if (skipped) {
|
|
84
|
+
displayStatus = statusText.skipped;
|
|
85
|
+
}
|
|
86
|
+
else if (confirmed) {
|
|
87
|
+
displayStatus = statusText.completed;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
displayStatus = statusText.not_confirmed;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
exists,
|
|
95
|
+
confirmed,
|
|
96
|
+
skipped,
|
|
97
|
+
displayStatus
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function getStageGuide(stage) {
|
|
101
|
+
const guideMap = {
|
|
102
|
+
requirements: 'requirements-guide',
|
|
103
|
+
design: 'design-guide',
|
|
104
|
+
tasks: 'tasks-guide',
|
|
105
|
+
completed: ''
|
|
106
|
+
};
|
|
107
|
+
const guideId = guideMap[stage];
|
|
108
|
+
if (!guideId)
|
|
109
|
+
return null;
|
|
110
|
+
// Get resource from OpenAPI - already in MCP format
|
|
111
|
+
const resource = openApiLoader.getSharedResource(guideId);
|
|
112
|
+
return resource || null;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=analyzeStage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzeStage.js","sourceRoot":"","sources":["../../../src/features/check/analyzeStage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAiC,gBAAgB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC5G,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAkC,MAAM,iCAAiC,CAAC;AACnH,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAiBhE,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,KAAoB,EACpB,MAAsB;IAEtB,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAC1B,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,iBAAiB,EAAE,KAAK;YACxB,MAAM,EAAE,sBAAsB;YAC9B,WAAW,EAAE,EAAE;SAChB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,KAA6B,CAAC,CAAC;IACxD,yCAAyC;IACzC,MAAM,gBAAgB,GAAG,CAAC,CAAgB,EAAoB,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC;IACnF,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAiC,CAAC,CAAC;IAC9G,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,KAAyB,CAAC,CAAC;IAElG,gDAAgD;IAChD,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,KAAK;YACxB,WAAW,EAAE,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,uCAAuC,CAAC;SAC7E,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACpC,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,iBAAiB,EAAE,KAAK;YACxB,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,iBAAiB;YAC/C,WAAW,EAAE,CAAC,UAAU,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;SAC5B,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,iCAAiC;QACjC,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,iBAAiB,EAAE,KAAK;YACxB,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,mDAAmD;YACjF,WAAW,EAAE;gBACX,eAAe,QAAQ,sCAAsC;gBAC7D,qDAAqD;aACtD;YACD,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;SAC5B,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,OAAO;QACL,UAAU,EAAE,KAAK;QACjB,iBAAiB,EAAE,IAAI;QACvB,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,+BAA+B;QAC7D,WAAW,EAAE,CAAC,gEAAgE,CAAC;QAC/E,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,MAAsB,EACtB,IAAY;IAEZ,MAAM,SAAS,GAAG,MAAM,CAAC,KAA6B,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,EAAE,MAAM,IAAI,KAAK,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAiC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACtH,MAAM,OAAO,GAAG,MAAM,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,KAAyB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAE1G,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;IACrD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,YAAY,EAAE,aAAa,CAAC,IAAI,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAClK,MAAM,UAAU,GAAG;QACjB,WAAW,EAAE,OAAO,gBAAgB,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa;QAC5G,aAAa,EAAE,OAAO,gBAAgB,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,sBAAsB;QAC3H,SAAS,EAAE,OAAO,gBAAgB,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;QACpG,OAAO,EAAE,OAAO,gBAAgB,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;KAC7F,CAAC;IAEF,IAAI,aAAa,GAAG,UAAU,CAAC,WAAW,CAAC;IAC3C,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,OAAO,EAAE,CAAC;YACZ,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC;QACrC,CAAC;aAAM,IAAI,SAAS,EAAE,CAAC;YACrB,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,SAAS;QACT,OAAO;QACP,aAAa;KACd,CAAC;AACJ,CAAC;AAGD,SAAS,aAAa,CAAC,KAAoB;IACzC,MAAM,QAAQ,GAAkC;QAC9C,YAAY,EAAE,oBAAoB;QAClC,MAAM,EAAE,cAAc;QACtB,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,EAAE;KACd,CAAC;IAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,oDAAoD;IACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1D,OAAO,QAAQ,IAAI,IAAI,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check workflow status
|
|
3
|
+
*/
|
|
4
|
+
import { WorkflowResult } from '../shared/mcpTypes.js';
|
|
5
|
+
export interface CheckOptions {
|
|
6
|
+
path: string;
|
|
7
|
+
onProgress?: (progress: number, total: number, message: string) => Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare function checkWorkflow(options: CheckOptions): Promise<WorkflowResult>;
|
|
10
|
+
//# sourceMappingURL=checkWorkflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkWorkflow.d.ts","sourceRoot":"","sources":["../../../src/features/check/checkWorkflow.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClF;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CA2FlF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check workflow status
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readFileSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { getWorkflowStatus, getCurrentStage } from '../shared/documentStatus.js';
|
|
7
|
+
import { calculateWorkflowProgress } from '../shared/progressCalculator.js';
|
|
8
|
+
import { analyzeStage } from './analyzeStage.js';
|
|
9
|
+
import { generateNextDocument } from './generateNextDocument.js';
|
|
10
|
+
import { responseBuilder } from '../shared/responseBuilder.js';
|
|
11
|
+
import { parseTasksFile, getFirstUncompletedTask, formatTaskForFullDisplay } from '../shared/taskParser.js';
|
|
12
|
+
export async function checkWorkflow(options) {
|
|
13
|
+
const { path, onProgress } = 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
|
+
await reportProgress(onProgress, 33, 100, 'Checking document status...');
|
|
24
|
+
const status = getWorkflowStatus(path);
|
|
25
|
+
// Check if all files do not exist
|
|
26
|
+
if (!status.requirements.exists && !status.design.exists && !status.tasks.exists) {
|
|
27
|
+
await reportProgress(onProgress, 100, 100, 'Check completed');
|
|
28
|
+
return {
|
|
29
|
+
displayText: responseBuilder.buildErrorResponse('invalidPath', {
|
|
30
|
+
path,
|
|
31
|
+
error: 'Project not initialized'
|
|
32
|
+
}),
|
|
33
|
+
data: {
|
|
34
|
+
success: false,
|
|
35
|
+
error: 'Project not initialized'
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const currentStage = getCurrentStage(status, path);
|
|
40
|
+
// const stageStatus = getStageStatus(currentStage, status, path); // 未使用
|
|
41
|
+
await reportProgress(onProgress, 66, 100, 'Analyzing document content...');
|
|
42
|
+
// Analyze current stage
|
|
43
|
+
const analysis = analyzeStage(path, currentStage, status);
|
|
44
|
+
// Check if need to generate next document
|
|
45
|
+
if (analysis.canProceed) {
|
|
46
|
+
await generateNextDocument(path, currentStage);
|
|
47
|
+
}
|
|
48
|
+
await reportProgress(onProgress, 100, 100, 'Check completed');
|
|
49
|
+
const progress = calculateWorkflowProgress(path, status);
|
|
50
|
+
// Determine status type
|
|
51
|
+
let statusType;
|
|
52
|
+
let reason;
|
|
53
|
+
if (currentStage === 'completed') {
|
|
54
|
+
statusType = 'completed';
|
|
55
|
+
}
|
|
56
|
+
else if (!status[currentStage].exists) {
|
|
57
|
+
statusType = 'not_edited';
|
|
58
|
+
reason = `${currentStage === 'requirements' ? 'Requirements' : currentStage === 'design' ? 'Design' : 'Tasks'} document does not exist`;
|
|
59
|
+
}
|
|
60
|
+
else if (analysis.canProceed) {
|
|
61
|
+
statusType = 'ready_to_confirm';
|
|
62
|
+
}
|
|
63
|
+
else if (analysis.needsConfirmation) {
|
|
64
|
+
statusType = 'ready_to_confirm';
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
statusType = 'not_edited';
|
|
68
|
+
reason = analysis.reason;
|
|
69
|
+
}
|
|
70
|
+
// If workflow is completed, get the first uncompleted task
|
|
71
|
+
let firstTask = null;
|
|
72
|
+
if (currentStage === 'completed') {
|
|
73
|
+
const tasks = parseTasksFile(path);
|
|
74
|
+
const task = getFirstUncompletedTask(tasks);
|
|
75
|
+
if (task) {
|
|
76
|
+
const tasksPath = join(path, 'tasks.md');
|
|
77
|
+
const content = readFileSync(tasksPath, 'utf-8');
|
|
78
|
+
firstTask = formatTaskForFullDisplay(task, content);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return responseBuilder.buildCheckResponse(currentStage, progress, {
|
|
82
|
+
type: statusType,
|
|
83
|
+
reason,
|
|
84
|
+
readyToConfirm: analysis.canProceed
|
|
85
|
+
}, analysis, path, firstTask);
|
|
86
|
+
}
|
|
87
|
+
async function reportProgress(onProgress, progress, total, message) {
|
|
88
|
+
if (onProgress) {
|
|
89
|
+
await onProgress(progress, total, message);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=checkWorkflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkWorkflow.js","sourceRoot":"","sources":["../../../src/features/check/checkWorkflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate next stage document
|
|
3
|
+
*/
|
|
4
|
+
import { WorkflowStage } from '../shared/documentStatus.js';
|
|
5
|
+
export interface NextDocumentResult {
|
|
6
|
+
generated: boolean;
|
|
7
|
+
alreadyExists?: boolean;
|
|
8
|
+
message: string;
|
|
9
|
+
fileName?: string;
|
|
10
|
+
filePath?: string;
|
|
11
|
+
guide?: unknown;
|
|
12
|
+
}
|
|
13
|
+
export declare function generateNextDocument(path: string, currentStage: WorkflowStage): Promise<NextDocumentResult>;
|
|
14
|
+
//# sourceMappingURL=generateNextDocument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateNextDocument.d.ts","sourceRoot":"","sources":["../../../src/features/check/generateNextDocument.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,aAAa,EAAkC,MAAM,6BAA6B,CAAC;AAI5F,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,aAAa,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CA6D7B"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate next stage document
|
|
3
|
+
*/
|
|
4
|
+
import { writeFileSync, existsSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { getNextStage, getStageFileName } from '../shared/documentStatus.js';
|
|
7
|
+
import { getDesignTemplate, getTasksTemplate } from '../shared/documentTemplates.js';
|
|
8
|
+
import { extractDocumentInfo } from '../shared/documentUtils.js';
|
|
9
|
+
export async function generateNextDocument(path, currentStage) {
|
|
10
|
+
const nextStage = getNextStage(currentStage);
|
|
11
|
+
if (nextStage === 'completed') {
|
|
12
|
+
return {
|
|
13
|
+
generated: false,
|
|
14
|
+
message: 'All documents completed'
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const fileName = getStageFileName(nextStage);
|
|
18
|
+
const filePath = join(path, fileName);
|
|
19
|
+
if (existsSync(filePath)) {
|
|
20
|
+
return {
|
|
21
|
+
generated: false,
|
|
22
|
+
alreadyExists: true,
|
|
23
|
+
message: `${fileName} already exists`,
|
|
24
|
+
fileName,
|
|
25
|
+
filePath
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// Extract feature information
|
|
29
|
+
const documentInfo = extractDocumentInfo(join(path, 'requirements.md'));
|
|
30
|
+
// Generate document content
|
|
31
|
+
let content;
|
|
32
|
+
switch (nextStage) {
|
|
33
|
+
case 'design':
|
|
34
|
+
content = getDesignTemplate(documentInfo.featureName);
|
|
35
|
+
// guideType = 'design'; // \u672a\u4f7f\u7528
|
|
36
|
+
break;
|
|
37
|
+
case 'tasks':
|
|
38
|
+
content = getTasksTemplate(documentInfo.featureName);
|
|
39
|
+
// guideType = 'implementation'; // \u672a\u4f7f\u7528
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
return {
|
|
43
|
+
generated: false,
|
|
44
|
+
message: `Unknown document type: ${nextStage}`
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
writeFileSync(filePath, content, 'utf-8');
|
|
49
|
+
return {
|
|
50
|
+
generated: true,
|
|
51
|
+
message: `Generated ${fileName}`,
|
|
52
|
+
fileName,
|
|
53
|
+
filePath,
|
|
54
|
+
guide: undefined // Guide resources are now handled via OpenAPI shared resources
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
return {
|
|
59
|
+
generated: false,
|
|
60
|
+
message: `Failed to generate document: ${error}`
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=generateNextDocument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateNextDocument.js","sourceRoot":"","sources":["../../../src/features/check/generateNextDocument.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAiB,YAAY,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAWjE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAY,EACZ,YAA2B;IAE3B,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAE7C,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,yBAAyB;SACnC,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEtC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,GAAG,QAAQ,iBAAiB;YACrC,QAAQ;YACR,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAExE,4BAA4B;IAC5B,IAAI,OAAe,CAAC;IAEpB,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,GAAG,iBAAiB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACtD,8CAA8C;YAC9C,MAAM;QACR,KAAK,OAAO;YACV,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACrD,sDAAsD;YACtD,MAAM;QACR;YACE,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,0BAA0B,SAAS,EAAE;aAC/C,CAAC;IACN,CAAC;IAED,IAAI,CAAC;QACH,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAE1C,OAAO;YACL,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,aAAa,QAAQ,EAAE;YAChC,QAAQ;YACR,QAAQ;YACR,KAAK,EAAE,SAAS,CAAC,+DAA+D;SACjF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,gCAAgC,KAAK,EAAE;SACjD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confirm stage completion
|
|
3
|
+
*/
|
|
4
|
+
import { WorkflowResult } from '../shared/mcpTypes.js';
|
|
5
|
+
export interface ConfirmOptions {
|
|
6
|
+
path: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function confirmStage(options: ConfirmOptions): Promise<WorkflowResult>;
|
|
9
|
+
//# sourceMappingURL=confirmStage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmStage.d.ts","sourceRoot":"","sources":["../../../src/features/confirm/confirmStage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKvD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAoGnF"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confirm stage completion
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readFileSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { getWorkflowStatus, getStageName, getNextStage, getCurrentStage, getStageFileName } from '../shared/documentStatus.js';
|
|
7
|
+
import { updateStageConfirmation, isStageSkipped } from '../shared/confirmationStatus.js';
|
|
8
|
+
import { generateNextDocument } from '../check/generateNextDocument.js';
|
|
9
|
+
import { responseBuilder } from '../shared/responseBuilder.js';
|
|
10
|
+
import { parseTasksFile, getFirstUncompletedTask, formatTaskForFullDisplay } from '../shared/taskParser.js';
|
|
11
|
+
import { isDocumentEdited } from '../shared/documentAnalyzer.js';
|
|
12
|
+
import { calculateWorkflowProgress } from '../shared/progressCalculator.js';
|
|
13
|
+
export async function confirmStage(options) {
|
|
14
|
+
const { path } = options;
|
|
15
|
+
if (!existsSync(path)) {
|
|
16
|
+
return {
|
|
17
|
+
displayText: responseBuilder.buildErrorResponse('invalidPath', { path }),
|
|
18
|
+
data: {
|
|
19
|
+
success: false,
|
|
20
|
+
error: 'Directory does not exist'
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const status = getWorkflowStatus(path);
|
|
25
|
+
const currentStage = getCurrentStage(status, path);
|
|
26
|
+
// Check if all stages are completed
|
|
27
|
+
if (currentStage === 'completed') {
|
|
28
|
+
return {
|
|
29
|
+
displayText: `✅ All stages completed!
|
|
30
|
+
|
|
31
|
+
Workflow completed, no need to confirm again.`,
|
|
32
|
+
data: {
|
|
33
|
+
success: false,
|
|
34
|
+
reason: 'All stages completed'
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const stageData = status[currentStage];
|
|
39
|
+
// Check if document exists
|
|
40
|
+
if (!stageData || !stageData.exists) {
|
|
41
|
+
return {
|
|
42
|
+
displayText: `⚠️ ${getStageName(currentStage)} does not exist
|
|
43
|
+
|
|
44
|
+
Please create ${getStageName(currentStage)} document before confirming.`,
|
|
45
|
+
data: {
|
|
46
|
+
success: false,
|
|
47
|
+
reason: `${getStageName(currentStage)} does not exist`
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Check if already skipped
|
|
52
|
+
if (isStageSkipped(path, currentStage)) {
|
|
53
|
+
return {
|
|
54
|
+
displayText: `⚠️ ${getStageName(currentStage)} already skipped
|
|
55
|
+
|
|
56
|
+
This stage has been skipped, no need to confirm.`,
|
|
57
|
+
data: {
|
|
58
|
+
success: false,
|
|
59
|
+
reason: `${getStageName(currentStage)} already skipped`
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Check if document has been edited
|
|
64
|
+
const fileName = getStageFileName(currentStage);
|
|
65
|
+
const filePath = join(path, fileName);
|
|
66
|
+
if (!isDocumentEdited(filePath)) {
|
|
67
|
+
return {
|
|
68
|
+
displayText: responseBuilder.buildErrorResponse('documentNotEdited', {
|
|
69
|
+
documentName: getStageName(currentStage)
|
|
70
|
+
}),
|
|
71
|
+
data: {
|
|
72
|
+
success: false,
|
|
73
|
+
error: 'Document not edited'
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// Update confirmation status
|
|
78
|
+
updateStageConfirmation(path, currentStage, true);
|
|
79
|
+
// Get next stage
|
|
80
|
+
const nextStage = getNextStage(currentStage);
|
|
81
|
+
// Generate document for next stage
|
|
82
|
+
if (nextStage !== 'completed') {
|
|
83
|
+
await generateNextDocument(path, currentStage);
|
|
84
|
+
}
|
|
85
|
+
// If tasks stage, get first task details
|
|
86
|
+
let firstTaskContent = null;
|
|
87
|
+
if (currentStage === 'tasks' && nextStage === 'completed') {
|
|
88
|
+
const tasks = parseTasksFile(path);
|
|
89
|
+
const firstTask = getFirstUncompletedTask(tasks);
|
|
90
|
+
if (firstTask) {
|
|
91
|
+
const tasksPath = join(path, 'tasks.md');
|
|
92
|
+
const content = readFileSync(tasksPath, 'utf-8');
|
|
93
|
+
firstTaskContent = formatTaskForFullDisplay(firstTask, content);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Calculate progress after confirmation
|
|
97
|
+
const updatedStatus = getWorkflowStatus(path);
|
|
98
|
+
const progress = calculateWorkflowProgress(path, updatedStatus);
|
|
99
|
+
return responseBuilder.buildConfirmResponse(currentStage, nextStage === 'completed' ? null : nextStage, path, firstTaskContent, progress);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=confirmStage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmStage.js","sourceRoot":"","sources":["../../../src/features/confirm/confirmStage.ts"],"names":[],"mappings":"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"}
|