sdd-mcp-server 1.0.0

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 (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +256 -0
  3. package/dist/__tests__/setup.d.ts +44 -0
  4. package/dist/__tests__/setup.js +178 -0
  5. package/dist/__tests__/setup.js.map +1 -0
  6. package/dist/__tests__/test-helpers/mock-factories.d.ts +26 -0
  7. package/dist/__tests__/test-helpers/mock-factories.js +466 -0
  8. package/dist/__tests__/test-helpers/mock-factories.js.map +1 -0
  9. package/dist/adapters/cli/SDDToolAdapter.d.ts +26 -0
  10. package/dist/adapters/cli/SDDToolAdapter.js +273 -0
  11. package/dist/adapters/cli/SDDToolAdapter.js.map +1 -0
  12. package/dist/application/services/CodebaseAnalysisService.d.ts +38 -0
  13. package/dist/application/services/CodebaseAnalysisService.js +737 -0
  14. package/dist/application/services/CodebaseAnalysisService.js.map +1 -0
  15. package/dist/application/services/LocalizationService.d.ts +184 -0
  16. package/dist/application/services/LocalizationService.js +536 -0
  17. package/dist/application/services/LocalizationService.js.map +1 -0
  18. package/dist/application/services/ProjectContextService.d.ts +61 -0
  19. package/dist/application/services/ProjectContextService.js +550 -0
  20. package/dist/application/services/ProjectContextService.js.map +1 -0
  21. package/dist/application/services/ProjectInitializationService.d.ts +57 -0
  22. package/dist/application/services/ProjectInitializationService.js +485 -0
  23. package/dist/application/services/ProjectInitializationService.js.map +1 -0
  24. package/dist/application/services/ProjectService.d.ts +19 -0
  25. package/dist/application/services/ProjectService.js +159 -0
  26. package/dist/application/services/ProjectService.js.map +1 -0
  27. package/dist/application/services/QualityGateService.d.ts +62 -0
  28. package/dist/application/services/QualityGateService.js +428 -0
  29. package/dist/application/services/QualityGateService.js.map +1 -0
  30. package/dist/application/services/QualityService.d.ts +43 -0
  31. package/dist/application/services/QualityService.js +245 -0
  32. package/dist/application/services/QualityService.js.map +1 -0
  33. package/dist/application/services/SteeringDocumentService.d.ts +62 -0
  34. package/dist/application/services/SteeringDocumentService.js +694 -0
  35. package/dist/application/services/SteeringDocumentService.js.map +1 -0
  36. package/dist/application/services/TemplateService.d.ts +47 -0
  37. package/dist/application/services/TemplateService.js +438 -0
  38. package/dist/application/services/TemplateService.js.map +1 -0
  39. package/dist/application/services/WorkflowEngineService.d.ts +56 -0
  40. package/dist/application/services/WorkflowEngineService.js +348 -0
  41. package/dist/application/services/WorkflowEngineService.js.map +1 -0
  42. package/dist/application/services/WorkflowService.d.ts +22 -0
  43. package/dist/application/services/WorkflowService.js +147 -0
  44. package/dist/application/services/WorkflowService.js.map +1 -0
  45. package/dist/application/services/WorkflowValidationService.d.ts +51 -0
  46. package/dist/application/services/WorkflowValidationService.js +665 -0
  47. package/dist/application/services/WorkflowValidationService.js.map +1 -0
  48. package/dist/domain/context/ProjectContext.d.ts +350 -0
  49. package/dist/domain/context/ProjectContext.js +138 -0
  50. package/dist/domain/context/ProjectContext.js.map +1 -0
  51. package/dist/domain/i18n/index.d.ts +286 -0
  52. package/dist/domain/i18n/index.js +97 -0
  53. package/dist/domain/i18n/index.js.map +1 -0
  54. package/dist/domain/plugins/index.d.ts +498 -0
  55. package/dist/domain/plugins/index.js +157 -0
  56. package/dist/domain/plugins/index.js.map +1 -0
  57. package/dist/domain/ports.d.ts +54 -0
  58. package/dist/domain/ports.js +3 -0
  59. package/dist/domain/ports.js.map +1 -0
  60. package/dist/domain/quality/index.d.ts +361 -0
  61. package/dist/domain/quality/index.js +113 -0
  62. package/dist/domain/quality/index.js.map +1 -0
  63. package/dist/domain/services/DomainService.d.ts +18 -0
  64. package/dist/domain/services/DomainService.js +71 -0
  65. package/dist/domain/services/DomainService.js.map +1 -0
  66. package/dist/domain/templates/index.d.ts +158 -0
  67. package/dist/domain/templates/index.js +22 -0
  68. package/dist/domain/templates/index.js.map +1 -0
  69. package/dist/domain/types.d.ts +115 -0
  70. package/dist/domain/types.js +37 -0
  71. package/dist/domain/types.js.map +1 -0
  72. package/dist/domain/workflow/WorkflowStateMachine.d.ts +62 -0
  73. package/dist/domain/workflow/WorkflowStateMachine.js +286 -0
  74. package/dist/domain/workflow/WorkflowStateMachine.js.map +1 -0
  75. package/dist/index.d.ts +19 -0
  76. package/dist/index.js +97 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/infrastructure/adapters/AjvValidationAdapter.d.ts +7 -0
  79. package/dist/infrastructure/adapters/AjvValidationAdapter.js +37 -0
  80. package/dist/infrastructure/adapters/AjvValidationAdapter.js.map +1 -0
  81. package/dist/infrastructure/adapters/ConsoleLoggerAdapter.d.ts +8 -0
  82. package/dist/infrastructure/adapters/ConsoleLoggerAdapter.js +41 -0
  83. package/dist/infrastructure/adapters/ConsoleLoggerAdapter.js.map +1 -0
  84. package/dist/infrastructure/adapters/FileBasedTaskTracker.d.ts +9 -0
  85. package/dist/infrastructure/adapters/FileBasedTaskTracker.js +41 -0
  86. package/dist/infrastructure/adapters/FileBasedTaskTracker.js.map +1 -0
  87. package/dist/infrastructure/adapters/HandlebarsTemplateEngine.d.ts +8 -0
  88. package/dist/infrastructure/adapters/HandlebarsTemplateEngine.js +38 -0
  89. package/dist/infrastructure/adapters/HandlebarsTemplateEngine.js.map +1 -0
  90. package/dist/infrastructure/adapters/JsonConfigurationAdapter.d.ts +7 -0
  91. package/dist/infrastructure/adapters/JsonConfigurationAdapter.js +24 -0
  92. package/dist/infrastructure/adapters/JsonConfigurationAdapter.js.map +1 -0
  93. package/dist/infrastructure/adapters/LinusQualityAnalyzer.d.ts +9 -0
  94. package/dist/infrastructure/adapters/LinusQualityAnalyzer.js +75 -0
  95. package/dist/infrastructure/adapters/LinusQualityAnalyzer.js.map +1 -0
  96. package/dist/infrastructure/adapters/NodeFileSystemAdapter.d.ts +12 -0
  97. package/dist/infrastructure/adapters/NodeFileSystemAdapter.js +39 -0
  98. package/dist/infrastructure/adapters/NodeFileSystemAdapter.js.map +1 -0
  99. package/dist/infrastructure/di/container.d.ts +3 -0
  100. package/dist/infrastructure/di/container.js +98 -0
  101. package/dist/infrastructure/di/container.js.map +1 -0
  102. package/dist/infrastructure/di/types.d.ts +39 -0
  103. package/dist/infrastructure/di/types.js +45 -0
  104. package/dist/infrastructure/di/types.js.map +1 -0
  105. package/dist/infrastructure/i18n/I18nextService.d.ts +27 -0
  106. package/dist/infrastructure/i18n/I18nextService.js +357 -0
  107. package/dist/infrastructure/i18n/I18nextService.js.map +1 -0
  108. package/dist/infrastructure/mcp/CapabilityNegotiator.d.ts +21 -0
  109. package/dist/infrastructure/mcp/CapabilityNegotiator.js +75 -0
  110. package/dist/infrastructure/mcp/CapabilityNegotiator.js.map +1 -0
  111. package/dist/infrastructure/mcp/ErrorHandler.d.ts +29 -0
  112. package/dist/infrastructure/mcp/ErrorHandler.js +101 -0
  113. package/dist/infrastructure/mcp/ErrorHandler.js.map +1 -0
  114. package/dist/infrastructure/mcp/MCPServer.d.ts +25 -0
  115. package/dist/infrastructure/mcp/MCPServer.js +246 -0
  116. package/dist/infrastructure/mcp/MCPServer.js.map +1 -0
  117. package/dist/infrastructure/mcp/PromptManager.d.ts +18 -0
  118. package/dist/infrastructure/mcp/PromptManager.js +373 -0
  119. package/dist/infrastructure/mcp/PromptManager.js.map +1 -0
  120. package/dist/infrastructure/mcp/ResourceManager.d.ts +15 -0
  121. package/dist/infrastructure/mcp/ResourceManager.js +229 -0
  122. package/dist/infrastructure/mcp/ResourceManager.js.map +1 -0
  123. package/dist/infrastructure/mcp/SessionManager.d.ts +64 -0
  124. package/dist/infrastructure/mcp/SessionManager.js +221 -0
  125. package/dist/infrastructure/mcp/SessionManager.js.map +1 -0
  126. package/dist/infrastructure/mcp/ToolRegistry.d.ts +48 -0
  127. package/dist/infrastructure/mcp/ToolRegistry.js +235 -0
  128. package/dist/infrastructure/mcp/ToolRegistry.js.map +1 -0
  129. package/dist/infrastructure/platform/PlatformAdapter.d.ts +46 -0
  130. package/dist/infrastructure/platform/PlatformAdapter.js +355 -0
  131. package/dist/infrastructure/platform/PlatformAdapter.js.map +1 -0
  132. package/dist/infrastructure/plugins/HookSystem.d.ts +40 -0
  133. package/dist/infrastructure/plugins/HookSystem.js +415 -0
  134. package/dist/infrastructure/plugins/HookSystem.js.map +1 -0
  135. package/dist/infrastructure/plugins/PluginManager.d.ts +51 -0
  136. package/dist/infrastructure/plugins/PluginManager.js +650 -0
  137. package/dist/infrastructure/plugins/PluginManager.js.map +1 -0
  138. package/dist/infrastructure/plugins/PluginSteeringRegistry.d.ts +63 -0
  139. package/dist/infrastructure/plugins/PluginSteeringRegistry.js +439 -0
  140. package/dist/infrastructure/plugins/PluginSteeringRegistry.js.map +1 -0
  141. package/dist/infrastructure/plugins/PluginToolRegistry.d.ts +54 -0
  142. package/dist/infrastructure/plugins/PluginToolRegistry.js +490 -0
  143. package/dist/infrastructure/plugins/PluginToolRegistry.js.map +1 -0
  144. package/dist/infrastructure/quality/ASTAnalyzer.d.ts +65 -0
  145. package/dist/infrastructure/quality/ASTAnalyzer.js +439 -0
  146. package/dist/infrastructure/quality/ASTAnalyzer.js.map +1 -0
  147. package/dist/infrastructure/quality/LinusCodeReviewer.d.ts +52 -0
  148. package/dist/infrastructure/quality/LinusCodeReviewer.js +551 -0
  149. package/dist/infrastructure/quality/LinusCodeReviewer.js.map +1 -0
  150. package/dist/infrastructure/repositories/InMemoryProjectRepository.d.ts +10 -0
  151. package/dist/infrastructure/repositories/InMemoryProjectRepository.js +35 -0
  152. package/dist/infrastructure/repositories/InMemoryProjectRepository.js.map +1 -0
  153. package/dist/infrastructure/schemas/project.schema.d.ts +192 -0
  154. package/dist/infrastructure/schemas/project.schema.js +114 -0
  155. package/dist/infrastructure/schemas/project.schema.js.map +1 -0
  156. package/dist/infrastructure/templates/FileGenerator.d.ts +15 -0
  157. package/dist/infrastructure/templates/FileGenerator.js +385 -0
  158. package/dist/infrastructure/templates/FileGenerator.js.map +1 -0
  159. package/dist/infrastructure/templates/HandlebarsRenderer.d.ts +16 -0
  160. package/dist/infrastructure/templates/HandlebarsRenderer.js +252 -0
  161. package/dist/infrastructure/templates/HandlebarsRenderer.js.map +1 -0
  162. package/dist/infrastructure/templates/TemplateManager.d.ts +36 -0
  163. package/dist/infrastructure/templates/TemplateManager.js +777 -0
  164. package/dist/infrastructure/templates/TemplateManager.js.map +1 -0
  165. package/package.json +89 -0
@@ -0,0 +1,158 @@
1
+ export interface TemplateData {
2
+ readonly [key: string]: unknown;
3
+ }
4
+ export interface TemplateContext {
5
+ readonly project: {
6
+ readonly name: string;
7
+ readonly description?: string;
8
+ readonly id: string;
9
+ readonly basePath: string;
10
+ };
11
+ readonly timestamp: Date;
12
+ readonly user: {
13
+ readonly name?: string;
14
+ readonly email?: string;
15
+ };
16
+ readonly metadata: Record<string, unknown>;
17
+ }
18
+ export interface TemplateRendererPort {
19
+ compile(template: string, name?: string): Promise<CompiledTemplate>;
20
+ render(templateName: string, data: TemplateData, context: TemplateContext): Promise<string>;
21
+ renderString(template: string, data: TemplateData, context: TemplateContext): Promise<string>;
22
+ registerHelper(name: string, helper: (...args: unknown[]) => unknown): void;
23
+ registerPartial(name: string, template: string): Promise<void>;
24
+ clearCache(): void;
25
+ }
26
+ export interface CompiledTemplate {
27
+ readonly name: string;
28
+ readonly template: string;
29
+ readonly compiledAt: Date;
30
+ render(data: TemplateData, context: TemplateContext): string;
31
+ }
32
+ export interface Template {
33
+ readonly id: string;
34
+ readonly name: string;
35
+ readonly category: TemplateCategory;
36
+ readonly description: string;
37
+ readonly template: string;
38
+ readonly variables: TemplateVariable[];
39
+ readonly version: string;
40
+ readonly author?: string;
41
+ readonly tags: string[];
42
+ readonly createdAt: Date;
43
+ readonly updatedAt: Date;
44
+ }
45
+ export interface TemplateVariable {
46
+ readonly name: string;
47
+ readonly type: TemplateVariableType;
48
+ readonly description: string;
49
+ readonly required: boolean;
50
+ readonly defaultValue?: unknown;
51
+ readonly validation?: TemplateValidation;
52
+ }
53
+ export interface TemplateValidation {
54
+ readonly pattern?: string;
55
+ readonly minLength?: number;
56
+ readonly maxLength?: number;
57
+ readonly minimum?: number;
58
+ readonly maximum?: number;
59
+ readonly enum?: unknown[];
60
+ }
61
+ export declare enum TemplateCategory {
62
+ SPECIFICATION = "specification",
63
+ REQUIREMENTS = "requirements",
64
+ DESIGN = "design",
65
+ TASKS = "tasks",
66
+ STEERING = "steering",
67
+ CONFIG = "config",
68
+ DOCUMENTATION = "documentation",
69
+ CODE = "code"
70
+ }
71
+ export declare enum TemplateVariableType {
72
+ STRING = "string",
73
+ NUMBER = "number",
74
+ BOOLEAN = "boolean",
75
+ ARRAY = "array",
76
+ OBJECT = "object",
77
+ DATE = "date"
78
+ }
79
+ export interface TemplateManagerPort {
80
+ getTemplate(id: string): Promise<Template | null>;
81
+ getTemplatesByCategory(category: TemplateCategory): Promise<Template[]>;
82
+ searchTemplates(query: string, tags?: string[]): Promise<Template[]>;
83
+ createTemplate(template: Omit<Template, 'id' | 'createdAt' | 'updatedAt'>): Promise<Template>;
84
+ updateTemplate(id: string, updates: Partial<Template>): Promise<Template>;
85
+ deleteTemplate(id: string): Promise<void>;
86
+ validateTemplate(template: string, variables: TemplateVariable[]): Promise<TemplateValidationResult>;
87
+ getAllTemplates(): Promise<Template[]>;
88
+ }
89
+ export interface TemplateValidationResult {
90
+ readonly isValid: boolean;
91
+ readonly errors: TemplateValidationError[];
92
+ readonly warnings: TemplateValidationWarning[];
93
+ }
94
+ export interface TemplateValidationError {
95
+ readonly message: string;
96
+ readonly line?: number;
97
+ readonly column?: number;
98
+ readonly variable?: string;
99
+ }
100
+ export interface TemplateValidationWarning {
101
+ readonly message: string;
102
+ readonly line?: number;
103
+ readonly column?: number;
104
+ readonly suggestion?: string;
105
+ }
106
+ export interface FileGeneratorPort {
107
+ generateFile(filePath: string, template: string, data: TemplateData, context: TemplateContext, options?: FileGenerationOptions): Promise<FileGenerationResult>;
108
+ generateDirectory(dirPath: string, structure: DirectoryStructure, context: TemplateContext, options?: FileGenerationOptions): Promise<DirectoryGenerationResult>;
109
+ validatePath(path: string): Promise<PathValidationResult>;
110
+ backupFile(filePath: string): Promise<string>;
111
+ restoreBackup(backupPath: string, originalPath: string): Promise<void>;
112
+ cleanupBackups(olderThan: Date): Promise<string[]>;
113
+ }
114
+ export interface FileGenerationOptions {
115
+ readonly backup: boolean;
116
+ readonly overwrite: boolean;
117
+ readonly createDirectories: boolean;
118
+ readonly permissions?: string;
119
+ readonly atomic: boolean;
120
+ }
121
+ export interface FileGenerationResult {
122
+ readonly filePath: string;
123
+ readonly success: boolean;
124
+ readonly backupPath?: string;
125
+ readonly bytesWritten: number;
126
+ readonly error?: string;
127
+ readonly warnings: string[];
128
+ }
129
+ export interface DirectoryStructure {
130
+ readonly files: DirectoryFile[];
131
+ readonly subdirectories: Record<string, DirectoryStructure>;
132
+ }
133
+ export interface DirectoryFile {
134
+ readonly name: string;
135
+ readonly template: string;
136
+ readonly data: TemplateData;
137
+ }
138
+ export interface DirectoryGenerationResult {
139
+ readonly dirPath: string;
140
+ readonly success: boolean;
141
+ readonly filesGenerated: FileGenerationResult[];
142
+ readonly directoriesCreated: string[];
143
+ readonly errors: string[];
144
+ readonly warnings: string[];
145
+ }
146
+ export interface PathValidationResult {
147
+ readonly isValid: boolean;
148
+ readonly exists: boolean;
149
+ readonly isFile: boolean;
150
+ readonly isDirectory: boolean;
151
+ readonly permissions: PathPermissions;
152
+ readonly errors: string[];
153
+ }
154
+ export interface PathPermissions {
155
+ readonly read: boolean;
156
+ readonly write: boolean;
157
+ readonly execute: boolean;
158
+ }
@@ -0,0 +1,22 @@
1
+ // Template engine interfaces and types
2
+ export var TemplateCategory;
3
+ (function (TemplateCategory) {
4
+ TemplateCategory["SPECIFICATION"] = "specification";
5
+ TemplateCategory["REQUIREMENTS"] = "requirements";
6
+ TemplateCategory["DESIGN"] = "design";
7
+ TemplateCategory["TASKS"] = "tasks";
8
+ TemplateCategory["STEERING"] = "steering";
9
+ TemplateCategory["CONFIG"] = "config";
10
+ TemplateCategory["DOCUMENTATION"] = "documentation";
11
+ TemplateCategory["CODE"] = "code";
12
+ })(TemplateCategory || (TemplateCategory = {}));
13
+ export var TemplateVariableType;
14
+ (function (TemplateVariableType) {
15
+ TemplateVariableType["STRING"] = "string";
16
+ TemplateVariableType["NUMBER"] = "number";
17
+ TemplateVariableType["BOOLEAN"] = "boolean";
18
+ TemplateVariableType["ARRAY"] = "array";
19
+ TemplateVariableType["OBJECT"] = "object";
20
+ TemplateVariableType["DATE"] = "date";
21
+ })(TemplateVariableType || (TemplateVariableType = {}));
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/templates/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAqEvC,MAAM,CAAN,IAAY,gBASX;AATD,WAAY,gBAAgB;IAC1B,mDAA+B,CAAA;IAC/B,iDAA6B,CAAA;IAC7B,qCAAiB,CAAA;IACjB,mCAAe,CAAA;IACf,yCAAqB,CAAA;IACrB,qCAAiB,CAAA;IACjB,mDAA+B,CAAA;IAC/B,iCAAa,CAAA;AACf,CAAC,EATW,gBAAgB,KAAhB,gBAAgB,QAS3B;AAED,MAAM,CAAN,IAAY,oBAOX;AAPD,WAAY,oBAAoB;IAC9B,yCAAiB,CAAA;IACjB,yCAAiB,CAAA;IACjB,2CAAmB,CAAA;IACnB,uCAAe,CAAA;IACf,yCAAiB,CAAA;IACjB,qCAAa,CAAA;AACf,CAAC,EAPW,oBAAoB,KAApB,oBAAoB,QAO/B"}
@@ -0,0 +1,115 @@
1
+ export interface Project {
2
+ readonly id: string;
3
+ readonly name: string;
4
+ readonly path: string;
5
+ readonly phase: WorkflowPhase;
6
+ readonly metadata: ProjectMetadata;
7
+ }
8
+ export interface ProjectMetadata {
9
+ readonly createdAt: Date;
10
+ readonly updatedAt: Date;
11
+ readonly language: string;
12
+ readonly approvals: PhaseApprovals;
13
+ }
14
+ export interface PhaseApprovals {
15
+ readonly requirements: ApprovalStatus;
16
+ readonly design: ApprovalStatus;
17
+ readonly tasks: ApprovalStatus;
18
+ }
19
+ export interface ApprovalStatus {
20
+ readonly generated: boolean;
21
+ readonly approved: boolean;
22
+ }
23
+ export declare enum WorkflowPhase {
24
+ INIT = "init",
25
+ REQUIREMENTS = "requirements-generated",
26
+ DESIGN = "design-generated",
27
+ TASKS = "tasks-generated",
28
+ IMPLEMENTATION = "implementation-ready"
29
+ }
30
+ export declare enum WorkflowState {
31
+ PENDING = "pending",
32
+ IN_PROGRESS = "in-progress",
33
+ COMPLETED = "completed",
34
+ ERROR = "error"
35
+ }
36
+ export interface Requirement {
37
+ readonly id: string;
38
+ readonly title: string;
39
+ readonly objective: string;
40
+ readonly acceptanceCriteria: string[];
41
+ }
42
+ export interface Design {
43
+ readonly architecture: string;
44
+ readonly components: Component[];
45
+ readonly interfaces: Interface[];
46
+ readonly dataModels: DataModel[];
47
+ }
48
+ export interface Component {
49
+ readonly name: string;
50
+ readonly purpose: string;
51
+ readonly dependencies: string[];
52
+ }
53
+ export interface Interface {
54
+ readonly name: string;
55
+ readonly methods: Method[];
56
+ }
57
+ export interface Method {
58
+ readonly name: string;
59
+ readonly parameters: Parameter[];
60
+ readonly returnType: string;
61
+ }
62
+ export interface Parameter {
63
+ readonly name: string;
64
+ readonly type: string;
65
+ readonly required: boolean;
66
+ }
67
+ export interface DataModel {
68
+ readonly name: string;
69
+ readonly properties: Property[];
70
+ }
71
+ export interface Property {
72
+ readonly name: string;
73
+ readonly type: string;
74
+ readonly required: boolean;
75
+ }
76
+ export interface Task {
77
+ readonly id: string;
78
+ readonly title: string;
79
+ readonly description: string;
80
+ readonly requirements: string[];
81
+ readonly completed: boolean;
82
+ }
83
+ export interface QualityReport {
84
+ readonly score: TasteScore;
85
+ readonly issues: QualityIssue[];
86
+ readonly recommendations: string[];
87
+ }
88
+ export declare enum TasteScore {
89
+ GOOD = "good",
90
+ PASSABLE = "passable",
91
+ GARBAGE = "garbage"
92
+ }
93
+ export interface QualityIssue {
94
+ readonly type: IssueType;
95
+ readonly message: string;
96
+ readonly severity: IssueSeverity;
97
+ readonly location?: CodeLocation;
98
+ }
99
+ export declare enum IssueType {
100
+ COMPLEXITY = "complexity",
101
+ SPECIAL_CASE = "special-case",
102
+ DATA_STRUCTURE = "data-structure",
103
+ BREAKING_CHANGE = "breaking-change",
104
+ PRACTICALITY = "practicality"
105
+ }
106
+ export declare enum IssueSeverity {
107
+ ERROR = "error",
108
+ WARNING = "warning",
109
+ INFO = "info"
110
+ }
111
+ export interface CodeLocation {
112
+ readonly file: string;
113
+ readonly line: number;
114
+ readonly column: number;
115
+ }
@@ -0,0 +1,37 @@
1
+ // Core domain types for SDD workflow
2
+ export var WorkflowPhase;
3
+ (function (WorkflowPhase) {
4
+ WorkflowPhase["INIT"] = "init";
5
+ WorkflowPhase["REQUIREMENTS"] = "requirements-generated";
6
+ WorkflowPhase["DESIGN"] = "design-generated";
7
+ WorkflowPhase["TASKS"] = "tasks-generated";
8
+ WorkflowPhase["IMPLEMENTATION"] = "implementation-ready";
9
+ })(WorkflowPhase || (WorkflowPhase = {}));
10
+ export var WorkflowState;
11
+ (function (WorkflowState) {
12
+ WorkflowState["PENDING"] = "pending";
13
+ WorkflowState["IN_PROGRESS"] = "in-progress";
14
+ WorkflowState["COMPLETED"] = "completed";
15
+ WorkflowState["ERROR"] = "error";
16
+ })(WorkflowState || (WorkflowState = {}));
17
+ export var TasteScore;
18
+ (function (TasteScore) {
19
+ TasteScore["GOOD"] = "good";
20
+ TasteScore["PASSABLE"] = "passable";
21
+ TasteScore["GARBAGE"] = "garbage";
22
+ })(TasteScore || (TasteScore = {}));
23
+ export var IssueType;
24
+ (function (IssueType) {
25
+ IssueType["COMPLEXITY"] = "complexity";
26
+ IssueType["SPECIAL_CASE"] = "special-case";
27
+ IssueType["DATA_STRUCTURE"] = "data-structure";
28
+ IssueType["BREAKING_CHANGE"] = "breaking-change";
29
+ IssueType["PRACTICALITY"] = "practicality";
30
+ })(IssueType || (IssueType = {}));
31
+ export var IssueSeverity;
32
+ (function (IssueSeverity) {
33
+ IssueSeverity["ERROR"] = "error";
34
+ IssueSeverity["WARNING"] = "warning";
35
+ IssueSeverity["INFO"] = "info";
36
+ })(IssueSeverity || (IssueSeverity = {}));
37
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/domain/types.ts"],"names":[],"mappings":"AAAA,qCAAqC;AA4BrC,MAAM,CAAN,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,wDAAuC,CAAA;IACvC,4CAA2B,CAAA;IAC3B,0CAAyB,CAAA;IACzB,wDAAuC,CAAA;AACzC,CAAC,EANW,aAAa,KAAb,aAAa,QAMxB;AAED,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,4CAA2B,CAAA;IAC3B,wCAAuB,CAAA;IACvB,gCAAe,CAAA;AACjB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAgED,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,mCAAqB,CAAA;IACrB,iCAAmB,CAAA;AACrB,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AASD,MAAM,CAAN,IAAY,SAMX;AAND,WAAY,SAAS;IACnB,sCAAyB,CAAA;IACzB,0CAA6B,CAAA;IAC7B,8CAAiC,CAAA;IACjC,gDAAmC,CAAA;IACnC,0CAA6B,CAAA;AAC/B,CAAC,EANW,SAAS,KAAT,SAAS,QAMpB;AAED,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,gCAAe,CAAA;IACf,oCAAmB,CAAA;IACnB,8BAAa,CAAA;AACf,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB"}
@@ -0,0 +1,62 @@
1
+ import { WorkflowPhase, Project, PhaseApprovals } from '../types.js';
2
+ export interface StateTransition {
3
+ from: WorkflowPhase;
4
+ to: WorkflowPhase;
5
+ condition: TransitionCondition;
6
+ action?: TransitionAction;
7
+ }
8
+ export interface TransitionCondition {
9
+ check: (project: Project) => boolean;
10
+ errorMessage: string;
11
+ requiredApprovals?: (keyof PhaseApprovals)[];
12
+ }
13
+ export interface TransitionAction {
14
+ execute: (project: Project) => Promise<Project>;
15
+ rollback?: (project: Project) => Promise<Project>;
16
+ }
17
+ export interface WorkflowAuditEntry {
18
+ id: string;
19
+ projectId: string;
20
+ timestamp: Date;
21
+ fromPhase: WorkflowPhase;
22
+ toPhase: WorkflowPhase;
23
+ triggeredBy: string;
24
+ success: boolean;
25
+ errorMessage?: string;
26
+ metadata?: Record<string, unknown>;
27
+ }
28
+ export declare class WorkflowStateMachine {
29
+ private readonly transitions;
30
+ private readonly auditLog;
31
+ constructor();
32
+ private initializeTransitions;
33
+ canTransition(project: Project, toPhase: WorkflowPhase): {
34
+ allowed: boolean;
35
+ reason?: string;
36
+ requiredApprovals?: string[];
37
+ };
38
+ executeTransition(project: Project, toPhase: WorkflowPhase, triggeredBy: string): Promise<{
39
+ success: boolean;
40
+ updatedProject?: Project;
41
+ error?: string;
42
+ auditEntry: WorkflowAuditEntry;
43
+ }>;
44
+ getValidTransitions(fromPhase: WorkflowPhase): WorkflowPhase[];
45
+ getNextPhase(currentPhase: WorkflowPhase): WorkflowPhase | null;
46
+ getPreviousPhase(currentPhase: WorkflowPhase): WorkflowPhase | null;
47
+ getAuditTrail(projectId: string): WorkflowAuditEntry[];
48
+ getPhaseProgress(project: Project): {
49
+ currentPhase: WorkflowPhase;
50
+ phaseIndex: number;
51
+ totalPhases: number;
52
+ progressPercentage: number;
53
+ nextPhase?: WorkflowPhase;
54
+ canProgress: boolean;
55
+ blockers?: string[];
56
+ };
57
+ validateWorkflowIntegrity(project: Project): {
58
+ isValid: boolean;
59
+ violations: string[];
60
+ recommendations: string[];
61
+ };
62
+ }
@@ -0,0 +1,286 @@
1
+ // Domain model for SDD workflow state transitions
2
+ import { WorkflowPhase } from '../types.js';
3
+ export class WorkflowStateMachine {
4
+ transitions;
5
+ auditLog = [];
6
+ constructor() {
7
+ this.transitions = new Map();
8
+ this.initializeTransitions();
9
+ }
10
+ initializeTransitions() {
11
+ const transitions = [
12
+ // INIT -> REQUIREMENTS
13
+ {
14
+ from: WorkflowPhase.INIT,
15
+ to: WorkflowPhase.REQUIREMENTS,
16
+ condition: {
17
+ check: () => true, // Always allow init -> requirements
18
+ errorMessage: 'Cannot transition from INIT to REQUIREMENTS'
19
+ }
20
+ },
21
+ // REQUIREMENTS -> DESIGN
22
+ {
23
+ from: WorkflowPhase.REQUIREMENTS,
24
+ to: WorkflowPhase.DESIGN,
25
+ condition: {
26
+ check: (project) => project.metadata.approvals.requirements.generated &&
27
+ project.metadata.approvals.requirements.approved,
28
+ errorMessage: 'Requirements must be generated and approved before design phase',
29
+ requiredApprovals: ['requirements']
30
+ }
31
+ },
32
+ // DESIGN -> TASKS
33
+ {
34
+ from: WorkflowPhase.DESIGN,
35
+ to: WorkflowPhase.TASKS,
36
+ condition: {
37
+ check: (project) => project.metadata.approvals.design.generated &&
38
+ project.metadata.approvals.design.approved,
39
+ errorMessage: 'Design must be generated and approved before tasks phase',
40
+ requiredApprovals: ['design']
41
+ }
42
+ },
43
+ // TASKS -> IMPLEMENTATION
44
+ {
45
+ from: WorkflowPhase.TASKS,
46
+ to: WorkflowPhase.IMPLEMENTATION,
47
+ condition: {
48
+ check: (project) => project.metadata.approvals.tasks.generated &&
49
+ project.metadata.approvals.tasks.approved,
50
+ errorMessage: 'Tasks must be generated and approved before implementation phase',
51
+ requiredApprovals: ['tasks']
52
+ }
53
+ },
54
+ // Rollback transitions (always allowed for workflow corrections)
55
+ {
56
+ from: WorkflowPhase.REQUIREMENTS,
57
+ to: WorkflowPhase.INIT,
58
+ condition: {
59
+ check: () => true,
60
+ errorMessage: 'Cannot rollback from REQUIREMENTS to INIT'
61
+ }
62
+ },
63
+ {
64
+ from: WorkflowPhase.DESIGN,
65
+ to: WorkflowPhase.REQUIREMENTS,
66
+ condition: {
67
+ check: () => true,
68
+ errorMessage: 'Cannot rollback from DESIGN to REQUIREMENTS'
69
+ }
70
+ },
71
+ {
72
+ from: WorkflowPhase.TASKS,
73
+ to: WorkflowPhase.DESIGN,
74
+ condition: {
75
+ check: () => true,
76
+ errorMessage: 'Cannot rollback from TASKS to DESIGN'
77
+ }
78
+ },
79
+ {
80
+ from: WorkflowPhase.IMPLEMENTATION,
81
+ to: WorkflowPhase.TASKS,
82
+ condition: {
83
+ check: () => true,
84
+ errorMessage: 'Cannot rollback from IMPLEMENTATION to TASKS'
85
+ }
86
+ }
87
+ ];
88
+ // Group transitions by source phase
89
+ for (const transition of transitions) {
90
+ const key = transition.from;
91
+ if (!this.transitions.has(key)) {
92
+ this.transitions.set(key, []);
93
+ }
94
+ this.transitions.get(key).push(transition);
95
+ }
96
+ }
97
+ canTransition(project, toPhase) {
98
+ const fromPhase = project.phase;
99
+ const transitions = this.transitions.get(fromPhase) || [];
100
+ const validTransition = transitions.find(t => t.to === toPhase);
101
+ if (!validTransition) {
102
+ return {
103
+ allowed: false,
104
+ reason: `No valid transition from ${fromPhase} to ${toPhase}`
105
+ };
106
+ }
107
+ const conditionMet = validTransition.condition.check(project);
108
+ if (!conditionMet) {
109
+ return {
110
+ allowed: false,
111
+ reason: validTransition.condition.errorMessage,
112
+ requiredApprovals: validTransition.condition.requiredApprovals
113
+ };
114
+ }
115
+ return { allowed: true };
116
+ }
117
+ async executeTransition(project, toPhase, triggeredBy) {
118
+ const auditEntry = {
119
+ id: `audit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
120
+ projectId: project.id,
121
+ timestamp: new Date(),
122
+ fromPhase: project.phase,
123
+ toPhase,
124
+ triggeredBy,
125
+ success: false
126
+ };
127
+ try {
128
+ const validation = this.canTransition(project, toPhase);
129
+ if (!validation.allowed) {
130
+ auditEntry.errorMessage = validation.reason;
131
+ this.auditLog.push(auditEntry);
132
+ return {
133
+ success: false,
134
+ error: validation.reason,
135
+ auditEntry
136
+ };
137
+ }
138
+ const transitions = this.transitions.get(project.phase) || [];
139
+ const transition = transitions.find(t => t.to === toPhase);
140
+ let updatedProject = { ...project, phase: toPhase };
141
+ // Execute transition action if defined
142
+ if (transition?.action) {
143
+ updatedProject = await transition.action.execute(updatedProject);
144
+ }
145
+ // Update metadata
146
+ updatedProject.metadata = {
147
+ ...updatedProject.metadata,
148
+ updatedAt: new Date()
149
+ };
150
+ auditEntry.success = true;
151
+ auditEntry.metadata = {
152
+ previousPhase: project.phase,
153
+ newPhase: toPhase
154
+ };
155
+ this.auditLog.push(auditEntry);
156
+ return {
157
+ success: true,
158
+ updatedProject,
159
+ auditEntry
160
+ };
161
+ }
162
+ catch (error) {
163
+ auditEntry.errorMessage = error.message;
164
+ this.auditLog.push(auditEntry);
165
+ return {
166
+ success: false,
167
+ error: error.message,
168
+ auditEntry
169
+ };
170
+ }
171
+ }
172
+ getValidTransitions(fromPhase) {
173
+ const transitions = this.transitions.get(fromPhase) || [];
174
+ return transitions.map(t => t.to);
175
+ }
176
+ getNextPhase(currentPhase) {
177
+ const phaseOrder = [
178
+ WorkflowPhase.INIT,
179
+ WorkflowPhase.REQUIREMENTS,
180
+ WorkflowPhase.DESIGN,
181
+ WorkflowPhase.TASKS,
182
+ WorkflowPhase.IMPLEMENTATION
183
+ ];
184
+ const currentIndex = phaseOrder.indexOf(currentPhase);
185
+ if (currentIndex >= 0 && currentIndex < phaseOrder.length - 1) {
186
+ return phaseOrder[currentIndex + 1];
187
+ }
188
+ return null; // Already at final phase
189
+ }
190
+ getPreviousPhase(currentPhase) {
191
+ const phaseOrder = [
192
+ WorkflowPhase.INIT,
193
+ WorkflowPhase.REQUIREMENTS,
194
+ WorkflowPhase.DESIGN,
195
+ WorkflowPhase.TASKS,
196
+ WorkflowPhase.IMPLEMENTATION
197
+ ];
198
+ const currentIndex = phaseOrder.indexOf(currentPhase);
199
+ if (currentIndex > 0) {
200
+ return phaseOrder[currentIndex - 1];
201
+ }
202
+ return null; // Already at initial phase
203
+ }
204
+ getAuditTrail(projectId) {
205
+ return this.auditLog.filter(entry => entry.projectId === projectId);
206
+ }
207
+ getPhaseProgress(project) {
208
+ const phaseOrder = [
209
+ WorkflowPhase.INIT,
210
+ WorkflowPhase.REQUIREMENTS,
211
+ WorkflowPhase.DESIGN,
212
+ WorkflowPhase.TASKS,
213
+ WorkflowPhase.IMPLEMENTATION
214
+ ];
215
+ const currentIndex = phaseOrder.indexOf(project.phase);
216
+ const nextPhase = this.getNextPhase(project.phase);
217
+ let canProgress = false;
218
+ let blockers = [];
219
+ if (nextPhase) {
220
+ const validation = this.canTransition(project, nextPhase);
221
+ canProgress = validation.allowed;
222
+ if (!canProgress && validation.reason) {
223
+ blockers.push(validation.reason);
224
+ }
225
+ }
226
+ return {
227
+ currentPhase: project.phase,
228
+ phaseIndex: currentIndex,
229
+ totalPhases: phaseOrder.length,
230
+ progressPercentage: Math.round(((currentIndex + 1) / phaseOrder.length) * 100),
231
+ nextPhase: nextPhase || undefined,
232
+ canProgress,
233
+ blockers: blockers.length > 0 ? blockers : undefined
234
+ };
235
+ }
236
+ validateWorkflowIntegrity(project) {
237
+ const violations = [];
238
+ const recommendations = [];
239
+ const { approvals } = project.metadata;
240
+ // Check phase consistency with approvals
241
+ switch (project.phase) {
242
+ case WorkflowPhase.REQUIREMENTS:
243
+ if (!approvals.requirements.generated) {
244
+ violations.push('Requirements phase active but requirements not generated');
245
+ }
246
+ break;
247
+ case WorkflowPhase.DESIGN:
248
+ if (!approvals.requirements.approved) {
249
+ violations.push('Design phase active but requirements not approved');
250
+ }
251
+ if (!approvals.design.generated) {
252
+ violations.push('Design phase active but design not generated');
253
+ }
254
+ break;
255
+ case WorkflowPhase.TASKS:
256
+ if (!approvals.design.approved) {
257
+ violations.push('Tasks phase active but design not approved');
258
+ }
259
+ if (!approvals.tasks.generated) {
260
+ violations.push('Tasks phase active but tasks not generated');
261
+ }
262
+ break;
263
+ case WorkflowPhase.IMPLEMENTATION:
264
+ if (!approvals.tasks.approved) {
265
+ violations.push('Implementation phase active but tasks not approved');
266
+ }
267
+ break;
268
+ }
269
+ // Generate recommendations
270
+ if (approvals.requirements.generated && !approvals.requirements.approved) {
271
+ recommendations.push('Requirements are ready for review and approval');
272
+ }
273
+ if (approvals.design.generated && !approvals.design.approved) {
274
+ recommendations.push('Design is ready for review and approval');
275
+ }
276
+ if (approvals.tasks.generated && !approvals.tasks.approved) {
277
+ recommendations.push('Tasks are ready for review and approval');
278
+ }
279
+ return {
280
+ isValid: violations.length === 0,
281
+ violations,
282
+ recommendations
283
+ };
284
+ }
285
+ }
286
+ //# sourceMappingURL=WorkflowStateMachine.js.map