mcp-spec-cli 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +49 -0
  2. package/api/spec-workflow.openapi.yaml +1305 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +151 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/features/check/analyzeStage.d.ts +20 -0
  8. package/dist/features/check/analyzeStage.d.ts.map +1 -0
  9. package/dist/features/check/analyzeStage.js +114 -0
  10. package/dist/features/check/analyzeStage.js.map +1 -0
  11. package/dist/features/check/checkWorkflow.d.ts +10 -0
  12. package/dist/features/check/checkWorkflow.d.ts.map +1 -0
  13. package/dist/features/check/checkWorkflow.js +92 -0
  14. package/dist/features/check/checkWorkflow.js.map +1 -0
  15. package/dist/features/check/generateNextDocument.d.ts +14 -0
  16. package/dist/features/check/generateNextDocument.d.ts.map +1 -0
  17. package/dist/features/check/generateNextDocument.js +64 -0
  18. package/dist/features/check/generateNextDocument.js.map +1 -0
  19. package/dist/features/confirm/confirmStage.d.ts +9 -0
  20. package/dist/features/confirm/confirmStage.d.ts.map +1 -0
  21. package/dist/features/confirm/confirmStage.js +101 -0
  22. package/dist/features/confirm/confirmStage.js.map +1 -0
  23. package/dist/features/executeWorkflow.d.ts +15 -0
  24. package/dist/features/executeWorkflow.d.ts.map +1 -0
  25. package/dist/features/executeWorkflow.js +97 -0
  26. package/dist/features/executeWorkflow.js.map +1 -0
  27. package/dist/features/init/createRequirementsDoc.d.ts +11 -0
  28. package/dist/features/init/createRequirementsDoc.d.ts.map +1 -0
  29. package/dist/features/init/createRequirementsDoc.js +36 -0
  30. package/dist/features/init/createRequirementsDoc.js.map +1 -0
  31. package/dist/features/init/initWorkflow.d.ts +12 -0
  32. package/dist/features/init/initWorkflow.d.ts.map +1 -0
  33. package/dist/features/init/initWorkflow.js +103 -0
  34. package/dist/features/init/initWorkflow.js.map +1 -0
  35. package/dist/features/shared/SpecManager.d.ts +33 -0
  36. package/dist/features/shared/SpecManager.d.ts.map +1 -0
  37. package/dist/features/shared/SpecManager.js +103 -0
  38. package/dist/features/shared/SpecManager.js.map +1 -0
  39. package/dist/features/shared/confirmationStatus.d.ts +24 -0
  40. package/dist/features/shared/confirmationStatus.d.ts.map +1 -0
  41. package/dist/features/shared/confirmationStatus.js +69 -0
  42. package/dist/features/shared/confirmationStatus.js.map +1 -0
  43. package/dist/features/shared/documentAnalyzer.d.ts +18 -0
  44. package/dist/features/shared/documentAnalyzer.d.ts.map +1 -0
  45. package/dist/features/shared/documentAnalyzer.js +34 -0
  46. package/dist/features/shared/documentAnalyzer.js.map +1 -0
  47. package/dist/features/shared/documentStatus.d.ts +18 -0
  48. package/dist/features/shared/documentStatus.d.ts.map +1 -0
  49. package/dist/features/shared/documentStatus.js +66 -0
  50. package/dist/features/shared/documentStatus.js.map +1 -0
  51. package/dist/features/shared/documentTemplates.d.ts +8 -0
  52. package/dist/features/shared/documentTemplates.d.ts.map +1 -0
  53. package/dist/features/shared/documentTemplates.js +89 -0
  54. package/dist/features/shared/documentTemplates.js.map +1 -0
  55. package/dist/features/shared/documentUtils.d.ts +9 -0
  56. package/dist/features/shared/documentUtils.d.ts.map +1 -0
  57. package/dist/features/shared/documentUtils.js +38 -0
  58. package/dist/features/shared/documentUtils.js.map +1 -0
  59. package/dist/features/shared/mcpTypes.d.ts +83 -0
  60. package/dist/features/shared/mcpTypes.d.ts.map +1 -0
  61. package/dist/features/shared/mcpTypes.js +41 -0
  62. package/dist/features/shared/mcpTypes.js.map +1 -0
  63. package/dist/features/shared/openApiLoader.d.ts +88 -0
  64. package/dist/features/shared/openApiLoader.d.ts.map +1 -0
  65. package/dist/features/shared/openApiLoader.js +166 -0
  66. package/dist/features/shared/openApiLoader.js.map +1 -0
  67. package/dist/features/shared/openApiTypes.d.ts +101 -0
  68. package/dist/features/shared/openApiTypes.d.ts.map +1 -0
  69. package/dist/features/shared/openApiTypes.js +4 -0
  70. package/dist/features/shared/openApiTypes.js.map +1 -0
  71. package/dist/features/shared/progressCalculator.d.ts +22 -0
  72. package/dist/features/shared/progressCalculator.d.ts.map +1 -0
  73. package/dist/features/shared/progressCalculator.js +45 -0
  74. package/dist/features/shared/progressCalculator.js.map +1 -0
  75. package/dist/features/shared/responseBuilder.d.ts +13 -0
  76. package/dist/features/shared/responseBuilder.d.ts.map +1 -0
  77. package/dist/features/shared/responseBuilder.js +303 -0
  78. package/dist/features/shared/responseBuilder.js.map +1 -0
  79. package/dist/features/shared/taskGuidanceTemplate.d.ts +22 -0
  80. package/dist/features/shared/taskGuidanceTemplate.d.ts.map +1 -0
  81. package/dist/features/shared/taskGuidanceTemplate.js +145 -0
  82. package/dist/features/shared/taskGuidanceTemplate.js.map +1 -0
  83. package/dist/features/shared/taskParser.d.ts +17 -0
  84. package/dist/features/shared/taskParser.d.ts.map +1 -0
  85. package/dist/features/shared/taskParser.js +259 -0
  86. package/dist/features/shared/taskParser.js.map +1 -0
  87. package/dist/features/shared/typeGuards.d.ts +54 -0
  88. package/dist/features/shared/typeGuards.d.ts.map +1 -0
  89. package/dist/features/shared/typeGuards.js +96 -0
  90. package/dist/features/shared/typeGuards.js.map +1 -0
  91. package/dist/features/skip/skipStage.d.ts +9 -0
  92. package/dist/features/skip/skipStage.d.ts.map +1 -0
  93. package/dist/features/skip/skipStage.js +122 -0
  94. package/dist/features/skip/skipStage.js.map +1 -0
  95. package/dist/features/task/completeTask.d.ts +13 -0
  96. package/dist/features/task/completeTask.d.ts.map +1 -0
  97. package/dist/features/task/completeTask.js +362 -0
  98. package/dist/features/task/completeTask.js.map +1 -0
  99. package/dist/index.d.ts +7 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +51 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/logger.d.ts +6 -0
  104. package/dist/logger.d.ts.map +1 -0
  105. package/dist/logger.js +23 -0
  106. package/dist/logger.js.map +1 -0
  107. package/dist/tools/specTools.d.ts +3 -0
  108. package/dist/tools/specTools.d.ts.map +1 -0
  109. package/dist/tools/specTools.js +107 -0
  110. package/dist/tools/specTools.js.map +1 -0
  111. package/package.json +44 -0
@@ -0,0 +1,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":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAY,aAAa,EAAE,MAAM,IAAI,CAAC;AACvE,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAWzD,MAAM,OAAO,WAAW;IACd,MAAM,CAAC,cAAc,GAAG,iBAAiB,CAAC;IAElD;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAe,EAAE,WAAoB;QAC7D,IAAI,WAAW,EAAE,CAAC;YAChB,yBAAyB;YACzB,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACpC,CAAC;YACD,mCAAmC;YACnC,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACrC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;oBAChD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;oBAClD,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YAED,iCAAiC;YACjC,6EAA6E;YAC7E,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACpC,CAAC;QAED,6CAA6C;QAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACxD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACzC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,gGAAgG,CAAC,CAAC;IACpH,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,OAAe,EAAE,mBAA2B;QACrE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,WAAmB;QACzC,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,EAAE;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC7C,OAAO;gBACL,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC;gBAC5B,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC;aACnC,CAAC;QACJ,CAAC,CAAC;QAEF,OAAO;YACL,YAAY,EAAE,QAAQ,CAAC,iBAAiB,CAAC;YACzC,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC;YAC7B,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC;YAC3B,WAAW;SACZ,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAe,EAAE,WAAoB;QAC3D,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAEjD,IAAI,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACnH,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACvG,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAEnG,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,KAAK,GAAG,SAAS,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC5D,KAAK,GAAG,cAAc,CAAC;gBACvB,SAAS,GAAG,6DAA6D,CAAC;YAC7E,CAAC;iBAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACvD,KAAK,GAAG,QAAQ,CAAC;gBACjB,SAAS,GAAG,+DAA+D,CAAC;YAC/E,CAAC;iBAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACrD,KAAK,GAAG,UAAU,CAAC;gBACnB,SAAS,GAAG,uCAAuC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACL,KAAK,GAAG,gBAAgB,CAAC;gBACzB,SAAS,GAAG,+EAA+E,CAAC;YAC/F,CAAC;YAED,OAAO,8BAA8B,KAAK;WACrC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;gBAClD,SAAS;UACf,SAAS;SACV,SAAS;aACL,SAAS,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO;SACJ,CAAC,CAAC,OAAO;8EAC4D,CAAC;QAC3E,CAAC;IACH,CAAC"}
@@ -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