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,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow execution entry point
|
|
3
|
+
*/
|
|
4
|
+
import { WorkflowResult } from './shared/mcpTypes.js';
|
|
5
|
+
export interface WorkflowArgs {
|
|
6
|
+
path: string;
|
|
7
|
+
action?: {
|
|
8
|
+
type: string;
|
|
9
|
+
featureName?: string;
|
|
10
|
+
introduction?: string;
|
|
11
|
+
taskNumber?: string | string[];
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export declare function executeWorkflow(args: WorkflowArgs, onProgress?: (progress: number, total: number, message: string) => Promise<void>): Promise<WorkflowResult>;
|
|
15
|
+
//# sourceMappingURL=executeWorkflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executeWorkflow.d.ts","sourceRoot":"","sources":["../../src/features/executeWorkflow.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAChC,CAAC;CACH;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAC/E,OAAO,CAAC,cAAc,CAAC,CA0DzB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow execution entry point
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync } from 'fs';
|
|
5
|
+
import { getWorkflowStatus, getCurrentStage } from './shared/documentStatus.js';
|
|
6
|
+
import { initWorkflow } from './init/initWorkflow.js';
|
|
7
|
+
import { checkWorkflow } from './check/checkWorkflow.js';
|
|
8
|
+
import { skipStage } from './skip/skipStage.js';
|
|
9
|
+
import { confirmStage } from './confirm/confirmStage.js';
|
|
10
|
+
import { completeTask } from './task/completeTask.js';
|
|
11
|
+
export async function executeWorkflow(args, onProgress) {
|
|
12
|
+
const { path, action } = args;
|
|
13
|
+
if (!action) {
|
|
14
|
+
return getStatus(path);
|
|
15
|
+
}
|
|
16
|
+
switch (action.type) {
|
|
17
|
+
case 'init':
|
|
18
|
+
if (!action.featureName || !action.introduction) {
|
|
19
|
+
return {
|
|
20
|
+
displayText: '❌ Initialization requires featureName and introduction parameters',
|
|
21
|
+
data: {
|
|
22
|
+
success: false,
|
|
23
|
+
error: 'Missing required parameters'
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return initWorkflow({
|
|
28
|
+
path,
|
|
29
|
+
featureName: action.featureName,
|
|
30
|
+
introduction: action.introduction,
|
|
31
|
+
onProgress
|
|
32
|
+
});
|
|
33
|
+
case 'check':
|
|
34
|
+
return checkWorkflow({ path, onProgress });
|
|
35
|
+
case 'skip':
|
|
36
|
+
return skipStage({ path });
|
|
37
|
+
case 'confirm':
|
|
38
|
+
return confirmStage({ path });
|
|
39
|
+
case 'complete_task':
|
|
40
|
+
if (!action.taskNumber) {
|
|
41
|
+
return {
|
|
42
|
+
displayText: '❌ Completing task requires taskNumber parameter',
|
|
43
|
+
data: {
|
|
44
|
+
success: false,
|
|
45
|
+
error: 'Missing required parameters'
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return completeTask({
|
|
50
|
+
path,
|
|
51
|
+
taskNumber: action.taskNumber
|
|
52
|
+
});
|
|
53
|
+
default:
|
|
54
|
+
return {
|
|
55
|
+
displayText: `❌ Unknown operation type: ${action.type}`,
|
|
56
|
+
data: {
|
|
57
|
+
success: false,
|
|
58
|
+
error: `Unknown operation type: ${action.type}`
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function getStatus(path) {
|
|
64
|
+
if (!existsSync(path)) {
|
|
65
|
+
return {
|
|
66
|
+
displayText: `📁 Directory does not exist
|
|
67
|
+
|
|
68
|
+
Please use init operation to initialize:
|
|
69
|
+
\`\`\`json
|
|
70
|
+
{
|
|
71
|
+
"action": {
|
|
72
|
+
"type": "init",
|
|
73
|
+
"featureName": "Feature name",
|
|
74
|
+
"introduction": "Feature description"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
\`\`\``,
|
|
78
|
+
data: {
|
|
79
|
+
message: 'Directory does not exist, initialization required'
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const status = getWorkflowStatus(path);
|
|
84
|
+
const stage = getCurrentStage(status, path);
|
|
85
|
+
return {
|
|
86
|
+
displayText: `📊 Current status
|
|
87
|
+
|
|
88
|
+
Available operations:
|
|
89
|
+
- check: Check current stage
|
|
90
|
+
- skip: Skip current stage`,
|
|
91
|
+
data: {
|
|
92
|
+
message: 'Please select an operation',
|
|
93
|
+
stage
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=executeWorkflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executeWorkflow.js","sourceRoot":"","sources":["../../src/features/executeWorkflow.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAatD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAkB,EAClB,UAAgF;IAEhF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE9B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM;YACT,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBAChD,OAAO;oBACL,WAAW,EAAE,mEAAmE;oBAChF,IAAI,EAAE;wBACJ,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,6BAA6B;qBACrC;iBACF,CAAC;YACJ,CAAC;YACD,OAAO,YAAY,CAAC;gBAClB,IAAI;gBACJ,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,UAAU;aACX,CAAC,CAAC;QAEL,KAAK,OAAO;YACV,OAAO,aAAa,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAE7C,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7B,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhC,KAAK,eAAe;YAClB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACvB,OAAO;oBACL,WAAW,EAAE,iDAAiD;oBAC9D,IAAI,EAAE;wBACJ,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,6BAA6B;qBACrC;iBACF,CAAC;YACJ,CAAC;YACD,OAAO,YAAY,CAAC;gBAClB,IAAI;gBACJ,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;QAEL;YACE,OAAO;gBACL,WAAW,EAAE,6BAA6B,MAAM,CAAC,IAAI,EAAE;gBACvD,IAAI,EAAE;oBACJ,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,2BAA2B,MAAM,CAAC,IAAI,EAAE;iBAChD;aACF,CAAC;IACN,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,WAAW,EAAE;;;;;;;;;;;OAWZ;YACD,IAAI,EAAE;gBACJ,OAAO,EAAE,mDAAmD;aAC7D;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE5C,OAAO;QACL,WAAW,EAAE;;;;2BAIU;QACvB,IAAI,EAAE;YACJ,OAAO,EAAE,4BAA4B;YACrC,KAAK;SACN;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create requirements document
|
|
3
|
+
*/
|
|
4
|
+
export interface CreateResult {
|
|
5
|
+
generated: boolean;
|
|
6
|
+
message: string;
|
|
7
|
+
filePath?: string;
|
|
8
|
+
fileName?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function createRequirementsDocument(path: string, featureName: string, introduction: string): CreateResult;
|
|
11
|
+
//# sourceMappingURL=createRequirementsDoc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createRequirementsDoc.d.ts","sourceRoot":"","sources":["../../../src/features/init/createRequirementsDoc.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,YAAY,CA8Bd"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create requirements document
|
|
3
|
+
*/
|
|
4
|
+
import { writeFileSync, existsSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { getRequirementsTemplate } from '../shared/documentTemplates.js';
|
|
7
|
+
export function createRequirementsDocument(path, featureName, introduction) {
|
|
8
|
+
const fileName = 'requirements.md';
|
|
9
|
+
const filePath = join(path, fileName);
|
|
10
|
+
if (existsSync(filePath)) {
|
|
11
|
+
return {
|
|
12
|
+
generated: false,
|
|
13
|
+
message: 'Requirements document already exists',
|
|
14
|
+
fileName,
|
|
15
|
+
filePath
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const content = getRequirementsTemplate(featureName, introduction);
|
|
20
|
+
writeFileSync(filePath, content, 'utf-8');
|
|
21
|
+
return {
|
|
22
|
+
generated: true,
|
|
23
|
+
message: 'Requirements document',
|
|
24
|
+
fileName,
|
|
25
|
+
filePath
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
return {
|
|
30
|
+
generated: false,
|
|
31
|
+
message: `Failed to create document: ${error}`,
|
|
32
|
+
fileName
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=createRequirementsDoc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createRequirementsDoc.js","sourceRoot":"","sources":["../../../src/features/init/createRequirementsDoc.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,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AASzE,MAAM,UAAU,0BAA0B,CACxC,IAAY,EACZ,WAAmB,EACnB,YAAoB;IAEpB,MAAM,QAAQ,GAAG,iBAAiB,CAAC;IACnC,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,OAAO,EAAE,sCAAsC;YAC/C,QAAQ;YACR,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,uBAAuB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACnE,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAE1C,OAAO;YACL,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,uBAAuB;YAChC,QAAQ;YACR,QAAQ;SACT,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,8BAA8B,KAAK,EAAE;YAC9C,QAAQ;SACT,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initialize workflow functionality
|
|
3
|
+
*/
|
|
4
|
+
import { WorkflowResult } from '../shared/mcpTypes.js';
|
|
5
|
+
export interface InitOptions {
|
|
6
|
+
path: string;
|
|
7
|
+
featureName: string;
|
|
8
|
+
introduction: string;
|
|
9
|
+
onProgress?: (progress: number, total: number, message: string) => Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare function initWorkflow(options: InitOptions): Promise<WorkflowResult>;
|
|
12
|
+
//# sourceMappingURL=initWorkflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initWorkflow.d.ts","sourceRoot":"","sources":["../../../src/features/init/initWorkflow.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClF;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAiGhF"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initialize workflow functionality
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { getWorkflowStatus, getCurrentStage } from '../shared/documentStatus.js';
|
|
7
|
+
import { calculateWorkflowProgress } from '../shared/progressCalculator.js';
|
|
8
|
+
import { createRequirementsDocument } from './createRequirementsDoc.js';
|
|
9
|
+
import { updateStageConfirmation } from '../shared/confirmationStatus.js';
|
|
10
|
+
import { responseBuilder } from '../shared/responseBuilder.js';
|
|
11
|
+
export async function initWorkflow(options) {
|
|
12
|
+
const { path, featureName, introduction, onProgress } = options;
|
|
13
|
+
try {
|
|
14
|
+
await reportProgress(onProgress, 0, 100, 'Starting initialization...');
|
|
15
|
+
// Create directory
|
|
16
|
+
if (!existsSync(path)) {
|
|
17
|
+
mkdirSync(path, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
await reportProgress(onProgress, 50, 100, 'Checking project status...');
|
|
20
|
+
// Comprehensively check if project already exists
|
|
21
|
+
const requirementsPath = join(path, 'requirements.md');
|
|
22
|
+
const designPath = join(path, 'design.md');
|
|
23
|
+
const tasksPath = join(path, 'tasks.md');
|
|
24
|
+
const confirmationsPath = join(path, '.workflow-confirmations.json');
|
|
25
|
+
// If any workflow-related files exist, consider the project already exists
|
|
26
|
+
const projectExists = existsSync(requirementsPath) ||
|
|
27
|
+
existsSync(designPath) ||
|
|
28
|
+
existsSync(tasksPath) ||
|
|
29
|
+
existsSync(confirmationsPath);
|
|
30
|
+
if (projectExists) {
|
|
31
|
+
await reportProgress(onProgress, 100, 100, 'Found existing project');
|
|
32
|
+
const status = getWorkflowStatus(path);
|
|
33
|
+
const currentStage = getCurrentStage(status, path);
|
|
34
|
+
const progress = calculateWorkflowProgress(path, status);
|
|
35
|
+
const enhancedStatus = {
|
|
36
|
+
...status,
|
|
37
|
+
design: { ...status.design, exists: existsSync(designPath) },
|
|
38
|
+
tasks: { ...status.tasks, exists: existsSync(tasksPath) }
|
|
39
|
+
};
|
|
40
|
+
// Build detailed existing reason
|
|
41
|
+
const existingFiles = [];
|
|
42
|
+
if (existsSync(requirementsPath))
|
|
43
|
+
existingFiles.push('Requirements document');
|
|
44
|
+
if (existsSync(designPath))
|
|
45
|
+
existingFiles.push('Design document');
|
|
46
|
+
if (existsSync(tasksPath))
|
|
47
|
+
existingFiles.push('Task list');
|
|
48
|
+
if (existsSync(confirmationsPath))
|
|
49
|
+
existingFiles.push('Workflow status');
|
|
50
|
+
// Use responseBuilder to build error response
|
|
51
|
+
return {
|
|
52
|
+
displayText: responseBuilder.buildErrorResponse('alreadyInitialized', {
|
|
53
|
+
path,
|
|
54
|
+
existingFiles: existingFiles.join(', ')
|
|
55
|
+
}),
|
|
56
|
+
data: {
|
|
57
|
+
success: false,
|
|
58
|
+
error: 'PROJECT_ALREADY_EXISTS',
|
|
59
|
+
existingFiles: existingFiles,
|
|
60
|
+
currentStage: currentStage,
|
|
61
|
+
progress: progress
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// Generate requirements document
|
|
66
|
+
const result = createRequirementsDocument(path, featureName, introduction);
|
|
67
|
+
if (!result.generated) {
|
|
68
|
+
return {
|
|
69
|
+
displayText: responseBuilder.buildErrorResponse('invalidPath', { path }),
|
|
70
|
+
data: {
|
|
71
|
+
success: false,
|
|
72
|
+
error: 'Failed to create requirements document',
|
|
73
|
+
details: result
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// Initialize status file, mark requirements stage as unconfirmed
|
|
78
|
+
updateStageConfirmation(path, 'requirements', false);
|
|
79
|
+
updateStageConfirmation(path, 'design', false);
|
|
80
|
+
updateStageConfirmation(path, 'tasks', false);
|
|
81
|
+
await reportProgress(onProgress, 100, 100, 'Initialization completed!');
|
|
82
|
+
// Use responseBuilder to build success response
|
|
83
|
+
return responseBuilder.buildInitResponse(path, featureName);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return {
|
|
87
|
+
displayText: responseBuilder.buildErrorResponse('invalidPath', {
|
|
88
|
+
path,
|
|
89
|
+
error: String(error)
|
|
90
|
+
}),
|
|
91
|
+
data: {
|
|
92
|
+
success: false,
|
|
93
|
+
error: `Initialization failed: ${error}`
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function reportProgress(onProgress, progress, total, message) {
|
|
99
|
+
if (onProgress) {
|
|
100
|
+
await onProgress(progress, total, message);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=initWorkflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initWorkflow.js","sourceRoot":"","sources":["../../../src/features/init/initWorkflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type FeatureState = 'Requirements Pending' | 'Requirements Confirmed' | 'Design Confirmed' | 'Tasks Pending' | 'Tasks Completed';
|
|
2
|
+
export interface WorkflowState {
|
|
3
|
+
requirements: {
|
|
4
|
+
exists: boolean;
|
|
5
|
+
edited: boolean;
|
|
6
|
+
};
|
|
7
|
+
design: {
|
|
8
|
+
exists: boolean;
|
|
9
|
+
edited: boolean;
|
|
10
|
+
};
|
|
11
|
+
tasks: {
|
|
12
|
+
exists: boolean;
|
|
13
|
+
edited: boolean;
|
|
14
|
+
};
|
|
15
|
+
featurePath: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class SpecManager {
|
|
18
|
+
private static LAST_USED_FILE;
|
|
19
|
+
/**
|
|
20
|
+
* Resolves the feature path using fuzzy logic and implicit context.
|
|
21
|
+
*/
|
|
22
|
+
static resolveFeaturePath(baseDir: string, featureName?: string): string;
|
|
23
|
+
private static setLastUsed;
|
|
24
|
+
/**
|
|
25
|
+
* Infers the workflow state dynamically.
|
|
26
|
+
*/
|
|
27
|
+
static getWorkflowState(featurePath: string): WorkflowState;
|
|
28
|
+
/**
|
|
29
|
+
* Returns a dense Markdown output (TOON) representing the current status.
|
|
30
|
+
*/
|
|
31
|
+
static getStatusSummary(baseDir: string, featureName?: string): string;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=SpecManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpecManager.d.ts","sourceRoot":"","sources":["../../../src/features/shared/SpecManager.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG,sBAAsB,GAAG,wBAAwB,GAAG,kBAAkB,GAAG,eAAe,GAAG,iBAAiB,CAAC;AAExI,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IACnD,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7C,KAAK,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAqB;IAElD;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM;IAmCxE,OAAO,CAAC,MAAM,CAAC,WAAW;IAI1B;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa;IAiB3D;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM;CAqCvE"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { isDocumentEdited } from './documentAnalyzer.js';
|
|
4
|
+
export class SpecManager {
|
|
5
|
+
static LAST_USED_FILE = '.spec_last_used';
|
|
6
|
+
/**
|
|
7
|
+
* Resolves the feature path using fuzzy logic and implicit context.
|
|
8
|
+
*/
|
|
9
|
+
static resolveFeaturePath(baseDir, featureName) {
|
|
10
|
+
if (featureName) {
|
|
11
|
+
// 1. Exact match in base
|
|
12
|
+
if (existsSync(join(baseDir, featureName))) {
|
|
13
|
+
this.setLastUsed(baseDir, featureName);
|
|
14
|
+
return join(baseDir, featureName);
|
|
15
|
+
}
|
|
16
|
+
// 2. Look in common subdirectories
|
|
17
|
+
const commonDirs = ['specs', 'docs'];
|
|
18
|
+
for (const dir of commonDirs) {
|
|
19
|
+
if (existsSync(join(baseDir, dir, featureName))) {
|
|
20
|
+
this.setLastUsed(baseDir, join(dir, featureName));
|
|
21
|
+
return join(baseDir, dir, featureName);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// 3. Fallback: create in baseDir
|
|
25
|
+
// If it doesn't exist anywhere, assume we are creating it in the current dir
|
|
26
|
+
this.setLastUsed(baseDir, featureName);
|
|
27
|
+
return join(baseDir, featureName);
|
|
28
|
+
}
|
|
29
|
+
// Implicit Context (no featureName provided)
|
|
30
|
+
const lastUsedPath = join(baseDir, this.LAST_USED_FILE);
|
|
31
|
+
if (existsSync(lastUsedPath)) {
|
|
32
|
+
const lastUsed = readFileSync(lastUsedPath, 'utf-8').trim();
|
|
33
|
+
const fullPath = join(baseDir, lastUsed);
|
|
34
|
+
if (existsSync(fullPath)) {
|
|
35
|
+
return fullPath;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
throw new Error('Could not determine project context. Please provide a feature name (e.g. {"feature": "auth"}).');
|
|
39
|
+
}
|
|
40
|
+
static setLastUsed(baseDir, featurePathRelative) {
|
|
41
|
+
writeFileSync(join(baseDir, this.LAST_USED_FILE), featurePathRelative, 'utf-8');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Infers the workflow state dynamically.
|
|
45
|
+
*/
|
|
46
|
+
static getWorkflowState(featurePath) {
|
|
47
|
+
const checkDoc = (fileName) => {
|
|
48
|
+
const filePath = join(featurePath, fileName);
|
|
49
|
+
return {
|
|
50
|
+
exists: existsSync(filePath),
|
|
51
|
+
edited: isDocumentEdited(filePath)
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
requirements: checkDoc('requirements.md'),
|
|
56
|
+
design: checkDoc('design.md'),
|
|
57
|
+
tasks: checkDoc('tasks.md'),
|
|
58
|
+
featurePath
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Returns a dense Markdown output (TOON) representing the current status.
|
|
63
|
+
*/
|
|
64
|
+
static getStatusSummary(baseDir, featureName) {
|
|
65
|
+
try {
|
|
66
|
+
const featurePath = this.resolveFeaturePath(baseDir, featureName);
|
|
67
|
+
const state = this.getWorkflowState(featurePath);
|
|
68
|
+
let reqStatus = state.requirements.exists ? (state.requirements.edited ? 'Approved' : 'Pending Edits') : 'Missing';
|
|
69
|
+
let desStatus = state.design.exists ? (state.design.edited ? 'Approved' : 'Pending Edits') : 'Missing';
|
|
70
|
+
let tskStatus = state.tasks.exists ? (state.tasks.edited ? 'Active' : 'Pending Edits') : 'Missing';
|
|
71
|
+
let nextSteps = '';
|
|
72
|
+
let phase = 'Specify';
|
|
73
|
+
if (!state.requirements.exists || !state.requirements.edited) {
|
|
74
|
+
phase = 'Requirements';
|
|
75
|
+
nextSteps = 'Run `sc_exec plan` to finalize specifications/requirements.';
|
|
76
|
+
}
|
|
77
|
+
else if (!state.design.exists || !state.design.edited) {
|
|
78
|
+
phase = 'Design';
|
|
79
|
+
nextSteps = 'Run `sc_exec plan` to create an implementation plan (design).';
|
|
80
|
+
}
|
|
81
|
+
else if (!state.tasks.exists || !state.tasks.edited) {
|
|
82
|
+
phase = 'Planning';
|
|
83
|
+
nextSteps = 'Run `sc_exec plan` to scaffold tasks.';
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
phase = 'Implementation';
|
|
87
|
+
nextSteps = 'Run `sc_exec todo list` or `sc_exec todo start <id>` to begin implementation.';
|
|
88
|
+
}
|
|
89
|
+
return `Project: spec-cli | Phase: ${phase}
|
|
90
|
+
Feature: ${featurePath.replace(baseDir, '').replace(/^[\/\\]/, '')}
|
|
91
|
+
Requirements: ${reqStatus}
|
|
92
|
+
Design: ${desStatus}
|
|
93
|
+
Tasks: ${tskStatus}
|
|
94
|
+
Next Step: ${nextSteps}`;
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
return `Project: spec-cli | Phase: Error
|
|
98
|
+
Error: ${e.message}
|
|
99
|
+
Next Step: Run \`sc_exec init --name "your-feature"\` to start a new feature.`;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=SpecManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpecManager.js","sourceRoot":"","sources":["../../../src/features/shared/SpecManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confirmation status management
|
|
3
|
+
*/
|
|
4
|
+
export interface ConfirmationStatus {
|
|
5
|
+
requirements: boolean;
|
|
6
|
+
design: boolean;
|
|
7
|
+
tasks: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface SkipStatus {
|
|
10
|
+
requirements: boolean;
|
|
11
|
+
design: boolean;
|
|
12
|
+
tasks: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface WorkflowConfirmations {
|
|
15
|
+
confirmed: ConfirmationStatus;
|
|
16
|
+
skipped: SkipStatus;
|
|
17
|
+
}
|
|
18
|
+
export declare function getWorkflowConfirmations(path: string): WorkflowConfirmations;
|
|
19
|
+
export declare function getConfirmationStatus(path: string): ConfirmationStatus;
|
|
20
|
+
export declare function updateStageConfirmation(path: string, stage: keyof ConfirmationStatus, confirmed: boolean): void;
|
|
21
|
+
export declare function updateStageSkipped(path: string, stage: keyof SkipStatus, skipped: boolean): void;
|
|
22
|
+
export declare function isStageConfirmed(path: string, stage: keyof ConfirmationStatus): boolean;
|
|
23
|
+
export declare function isStageSkipped(path: string, stage: keyof SkipStatus): boolean;
|
|
24
|
+
//# sourceMappingURL=confirmationStatus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmationStatus.d.ts","sourceRoot":"","sources":["../../../src/features/shared/confirmationStatus.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,OAAO,EAAE,UAAU,CAAC;CACrB;AAID,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAwC5E;AAGD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAGtE;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,kBAAkB,EAC/B,SAAS,EAAE,OAAO,GACjB,IAAI,CAMN;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,UAAU,EACvB,OAAO,EAAE,OAAO,GACf,IAAI,CAMN;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,kBAAkB,GAC9B,OAAO,CAGT;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,UAAU,GACtB,OAAO,CAGT"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confirmation status management
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
const CONFIRMATION_FILE = '.workflow-confirmations.json';
|
|
7
|
+
export function getWorkflowConfirmations(path) {
|
|
8
|
+
const filePath = join(path, CONFIRMATION_FILE);
|
|
9
|
+
const defaultStatus = {
|
|
10
|
+
confirmed: {
|
|
11
|
+
requirements: false,
|
|
12
|
+
design: false,
|
|
13
|
+
tasks: false
|
|
14
|
+
},
|
|
15
|
+
skipped: {
|
|
16
|
+
requirements: false,
|
|
17
|
+
design: false,
|
|
18
|
+
tasks: false
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
if (!existsSync(filePath)) {
|
|
22
|
+
return defaultStatus;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
26
|
+
const parsed = JSON.parse(content);
|
|
27
|
+
// Compatible with old format
|
|
28
|
+
if (!parsed.confirmed && !parsed.skipped) {
|
|
29
|
+
return {
|
|
30
|
+
confirmed: parsed,
|
|
31
|
+
skipped: {
|
|
32
|
+
requirements: false,
|
|
33
|
+
design: false,
|
|
34
|
+
tasks: false
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return parsed;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return defaultStatus;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Keep old function for compatibility with existing code
|
|
45
|
+
export function getConfirmationStatus(path) {
|
|
46
|
+
const confirmations = getWorkflowConfirmations(path);
|
|
47
|
+
return confirmations.confirmed;
|
|
48
|
+
}
|
|
49
|
+
export function updateStageConfirmation(path, stage, confirmed) {
|
|
50
|
+
const confirmations = getWorkflowConfirmations(path);
|
|
51
|
+
confirmations.confirmed[stage] = confirmed;
|
|
52
|
+
const filePath = join(path, CONFIRMATION_FILE);
|
|
53
|
+
writeFileSync(filePath, JSON.stringify(confirmations, null, 2));
|
|
54
|
+
}
|
|
55
|
+
export function updateStageSkipped(path, stage, skipped) {
|
|
56
|
+
const confirmations = getWorkflowConfirmations(path);
|
|
57
|
+
confirmations.skipped[stage] = skipped;
|
|
58
|
+
const filePath = join(path, CONFIRMATION_FILE);
|
|
59
|
+
writeFileSync(filePath, JSON.stringify(confirmations, null, 2));
|
|
60
|
+
}
|
|
61
|
+
export function isStageConfirmed(path, stage) {
|
|
62
|
+
const confirmations = getWorkflowConfirmations(path);
|
|
63
|
+
return confirmations.confirmed[stage];
|
|
64
|
+
}
|
|
65
|
+
export function isStageSkipped(path, stage) {
|
|
66
|
+
const confirmations = getWorkflowConfirmations(path);
|
|
67
|
+
return confirmations.skipped[stage];
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=confirmationStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmationStatus.js","sourceRoot":"","sources":["../../../src/features/shared/confirmationStatus.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAmB5B,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AAEzD,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAE/C,MAAM,aAAa,GAA0B;QAC3C,SAAS,EAAE;YACT,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,KAAK;SACb;QACD,OAAO,EAAE;YACP,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,KAAK;SACb;KACF,CAAC;IAEF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,6BAA6B;QAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzC,OAAO;gBACL,SAAS,EAAE,MAAM;gBACjB,OAAO,EAAE;oBACP,YAAY,EAAE,KAAK;oBACnB,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,KAAK;iBACb;aACF,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC;IACvB,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,aAAa,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO,aAAa,CAAC,SAAS,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,KAA+B,EAC/B,SAAkB;IAElB,MAAM,aAAa,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACrD,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAE3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC/C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,KAAuB,EACvB,OAAgB;IAEhB,MAAM,aAAa,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACrD,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;IAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC/C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,KAA+B;IAE/B,MAAM,aAAa,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,KAAuB;IAEvB,MAAM,aAAa,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document content analyzer
|
|
3
|
+
* Uses XML markers to detect if document has been edited
|
|
4
|
+
*/
|
|
5
|
+
export declare const TEMPLATE_MARKERS: {
|
|
6
|
+
REQUIREMENTS_START: string;
|
|
7
|
+
REQUIREMENTS_END: string;
|
|
8
|
+
DESIGN_START: string;
|
|
9
|
+
DESIGN_END: string;
|
|
10
|
+
TASKS_START: string;
|
|
11
|
+
TASKS_END: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Analyze if document has been edited
|
|
15
|
+
* Determined by checking if XML template markers exist
|
|
16
|
+
*/
|
|
17
|
+
export declare function isDocumentEdited(filePath: string): boolean;
|
|
18
|
+
//# sourceMappingURL=documentAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/features/shared/documentAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,eAAO,MAAM,gBAAgB;;;;;;;CAO5B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAkB1D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document content analyzer
|
|
3
|
+
* Uses XML markers to detect if document has been edited
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, existsSync } from 'fs';
|
|
6
|
+
// XML marker definitions - matching actual template placeholders
|
|
7
|
+
export const TEMPLATE_MARKERS = {
|
|
8
|
+
REQUIREMENTS_START: '<template-requirements>',
|
|
9
|
+
REQUIREMENTS_END: '</template-requirements>',
|
|
10
|
+
DESIGN_START: '<template-design>',
|
|
11
|
+
DESIGN_END: '</template-design>',
|
|
12
|
+
TASKS_START: '<template-tasks>',
|
|
13
|
+
TASKS_END: '</template-tasks>'
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Analyze if document has been edited
|
|
17
|
+
* Determined by checking if XML template markers exist
|
|
18
|
+
*/
|
|
19
|
+
export function isDocumentEdited(filePath) {
|
|
20
|
+
if (!existsSync(filePath)) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
25
|
+
// Check if contains any template markers
|
|
26
|
+
const hasTemplateMarkers = Object.values(TEMPLATE_MARKERS).some(marker => content.includes(marker));
|
|
27
|
+
// If no template markers, it means it has been edited
|
|
28
|
+
return !hasTemplateMarkers;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=documentAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentAnalyzer.js","sourceRoot":"","sources":["../../../src/features/shared/documentAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAE9C,iEAAiE;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,kBAAkB,EAAE,yBAAyB;IAC7C,gBAAgB,EAAE,0BAA0B;IAC5C,YAAY,EAAE,mBAAmB;IACjC,UAAU,EAAE,oBAAoB;IAChC,WAAW,EAAE,kBAAkB;IAC/B,SAAS,EAAE,mBAAmB;CAC/B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEhD,yCAAyC;QACzC,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACvE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CACzB,CAAC;QAEF,sDAAsD;QACtD,OAAO,CAAC,kBAAkB,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document status management related functions
|
|
3
|
+
*/
|
|
4
|
+
export interface DocumentStatus {
|
|
5
|
+
exists: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface WorkflowStatus {
|
|
8
|
+
requirements: DocumentStatus;
|
|
9
|
+
design: DocumentStatus;
|
|
10
|
+
tasks: DocumentStatus;
|
|
11
|
+
}
|
|
12
|
+
export type WorkflowStage = 'requirements' | 'design' | 'tasks' | 'completed';
|
|
13
|
+
export declare function getWorkflowStatus(path: string): WorkflowStatus;
|
|
14
|
+
export declare function getCurrentStage(status: WorkflowStatus, path?: string): WorkflowStage;
|
|
15
|
+
export declare function getNextStage(stage: WorkflowStage): WorkflowStage;
|
|
16
|
+
export declare function getStageName(stage: string): string;
|
|
17
|
+
export declare function getStageFileName(stage: string): string;
|
|
18
|
+
//# sourceMappingURL=documentStatus.d.ts.map
|