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
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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":"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"}
@@ -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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"}