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,498 @@
1
+ export interface Plugin {
2
+ readonly id: string;
3
+ readonly name: string;
4
+ readonly version: string;
5
+ readonly description: string;
6
+ readonly author: string;
7
+ readonly homepage?: string;
8
+ readonly repository?: string;
9
+ readonly license: string;
10
+ readonly keywords: string[];
11
+ readonly dependencies: PluginDependency[];
12
+ readonly peerDependencies: PluginDependency[];
13
+ readonly engines: EngineRequirement[];
14
+ readonly capabilities: PluginCapability[];
15
+ readonly hooks: HookDeclaration[];
16
+ readonly tools: ToolDeclaration[];
17
+ readonly steeringDocuments: SteeringDocumentDeclaration[];
18
+ readonly configuration: PluginConfiguration;
19
+ readonly metadata: PluginMetadata;
20
+ }
21
+ export interface PluginDependency {
22
+ readonly name: string;
23
+ readonly version: string;
24
+ readonly optional: boolean;
25
+ readonly reason: string;
26
+ }
27
+ export interface EngineRequirement {
28
+ readonly name: string;
29
+ readonly version: string;
30
+ }
31
+ export interface PluginCapability {
32
+ readonly type: CapabilityType;
33
+ readonly name: string;
34
+ readonly description: string;
35
+ readonly required: boolean;
36
+ readonly configuration: Record<string, unknown>;
37
+ }
38
+ export interface HookDeclaration {
39
+ readonly name: string;
40
+ readonly type: HookType;
41
+ readonly phase: HookPhase;
42
+ readonly priority: number;
43
+ readonly description: string;
44
+ readonly parameters: HookParameter[];
45
+ readonly returnType?: string;
46
+ }
47
+ export interface ToolDeclaration {
48
+ readonly name: string;
49
+ readonly description: string;
50
+ readonly category: ToolCategory;
51
+ readonly inputSchema: Record<string, unknown>;
52
+ readonly outputSchema: Record<string, unknown>;
53
+ readonly examples: ToolExample[];
54
+ readonly permissions: ToolPermission[];
55
+ }
56
+ export interface SteeringDocumentDeclaration {
57
+ readonly name: string;
58
+ readonly type: SteeringDocumentType;
59
+ readonly mode: SteeringMode;
60
+ readonly priority: number;
61
+ readonly patterns: string[];
62
+ readonly template: string;
63
+ readonly variables: SteeringVariable[];
64
+ }
65
+ export interface PluginConfiguration {
66
+ readonly schema: Record<string, unknown>;
67
+ readonly defaults: Record<string, unknown>;
68
+ readonly required: string[];
69
+ readonly validation: ConfigurationValidation[];
70
+ }
71
+ export interface PluginMetadata {
72
+ readonly createdAt: Date;
73
+ readonly updatedAt: Date;
74
+ readonly installedAt?: Date;
75
+ readonly lastUsed?: Date;
76
+ readonly usageCount: number;
77
+ readonly ratings: PluginRating[];
78
+ readonly tags: string[];
79
+ readonly category: PluginCategory;
80
+ readonly maturity: PluginMaturity;
81
+ readonly supportedLanguages: string[];
82
+ }
83
+ export interface HookParameter {
84
+ readonly name: string;
85
+ readonly type: string;
86
+ readonly required: boolean;
87
+ readonly description: string;
88
+ readonly defaultValue?: unknown;
89
+ }
90
+ export interface ToolExample {
91
+ readonly name: string;
92
+ readonly description: string;
93
+ readonly input: Record<string, unknown>;
94
+ readonly expectedOutput: Record<string, unknown>;
95
+ }
96
+ export interface ToolPermission {
97
+ readonly type: PermissionType;
98
+ readonly resource: string;
99
+ readonly actions: string[];
100
+ readonly conditions?: Record<string, unknown>;
101
+ }
102
+ export interface SteeringVariable {
103
+ readonly name: string;
104
+ readonly type: string;
105
+ readonly description: string;
106
+ readonly required: boolean;
107
+ readonly defaultValue?: unknown;
108
+ }
109
+ export interface ConfigurationValidation {
110
+ readonly field: string;
111
+ readonly type: ValidationType;
112
+ readonly rules: ValidationRule[];
113
+ readonly message: string;
114
+ }
115
+ export interface ValidationRule {
116
+ readonly type: string;
117
+ readonly value: unknown;
118
+ readonly message: string;
119
+ }
120
+ export interface PluginRating {
121
+ readonly userId: string;
122
+ readonly rating: number;
123
+ readonly comment?: string;
124
+ readonly createdAt: Date;
125
+ }
126
+ export interface PluginManager {
127
+ discover(directory?: string): Promise<PluginDescriptor[]>;
128
+ install(pluginPath: string): Promise<PluginInstance>;
129
+ uninstall(pluginId: string): Promise<void>;
130
+ enable(pluginId: string): Promise<void>;
131
+ disable(pluginId: string): Promise<void>;
132
+ load(pluginId: string): Promise<PluginInstance>;
133
+ unload(pluginId: string): Promise<void>;
134
+ getPlugin(pluginId: string): Promise<PluginInstance | null>;
135
+ getAllPlugins(): Promise<PluginInstance[]>;
136
+ getEnabledPlugins(): Promise<PluginInstance[]>;
137
+ validatePlugin(plugin: Plugin): Promise<PluginValidationResult>;
138
+ resolveDependencies(plugin: Plugin): Promise<PluginDependency[]>;
139
+ }
140
+ export interface PluginDescriptor {
141
+ readonly path: string;
142
+ readonly manifest: Plugin;
143
+ readonly valid: boolean;
144
+ readonly errors: string[];
145
+ readonly warnings: string[];
146
+ }
147
+ export interface PluginInstance {
148
+ readonly plugin: Plugin;
149
+ readonly instance: PluginImplementation;
150
+ readonly state: PluginState;
151
+ readonly loadedAt: Date;
152
+ readonly lastError?: Error;
153
+ readonly configuration: Record<string, unknown>;
154
+ readonly hooks: HookRegistration[];
155
+ readonly tools: ToolRegistration[];
156
+ }
157
+ export interface PluginImplementation {
158
+ initialize(context: PluginContext): Promise<void>;
159
+ activate(): Promise<void>;
160
+ deactivate(): Promise<void>;
161
+ dispose(): Promise<void>;
162
+ getConfiguration(): Record<string, unknown>;
163
+ setConfiguration(config: Record<string, unknown>): Promise<void>;
164
+ executeHook(hookName: string, ...args: unknown[]): Promise<unknown>;
165
+ executeTool(toolName: string, input: Record<string, unknown>): Promise<Record<string, unknown>>;
166
+ }
167
+ export interface PluginContext {
168
+ readonly pluginId: string;
169
+ readonly workingDirectory: string;
170
+ readonly configurationDirectory: string;
171
+ readonly dataDirectory: string;
172
+ readonly logger: PluginLogger;
173
+ readonly services: PluginServices;
174
+ readonly events: PluginEventEmitter;
175
+ }
176
+ export interface PluginServices {
177
+ readonly fileSystem: PluginFileSystem;
178
+ readonly http: PluginHttpClient;
179
+ readonly crypto: PluginCrypto;
180
+ readonly utils: PluginUtils;
181
+ }
182
+ export interface PluginLogger {
183
+ debug(message: string, data?: Record<string, unknown>): void;
184
+ info(message: string, data?: Record<string, unknown>): void;
185
+ warn(message: string, data?: Record<string, unknown>): void;
186
+ error(message: string, error?: Error, data?: Record<string, unknown>): void;
187
+ }
188
+ export interface PluginEventEmitter {
189
+ on(event: string, listener: (...args: unknown[]) => void): void;
190
+ off(event: string, listener: (...args: unknown[]) => void): void;
191
+ emit(event: string, ...args: unknown[]): void;
192
+ }
193
+ export interface PluginFileSystem {
194
+ readFile(path: string): Promise<string>;
195
+ writeFile(path: string, content: string): Promise<void>;
196
+ exists(path: string): Promise<boolean>;
197
+ mkdir(path: string): Promise<void>;
198
+ readdir(path: string): Promise<string[]>;
199
+ stat(path: string): Promise<{
200
+ size: number;
201
+ mtime: Date;
202
+ isFile(): boolean;
203
+ isDirectory(): boolean;
204
+ }>;
205
+ }
206
+ export interface PluginHttpClient {
207
+ get(url: string, options?: RequestOptions): Promise<HttpResponse>;
208
+ post(url: string, data?: unknown, options?: RequestOptions): Promise<HttpResponse>;
209
+ put(url: string, data?: unknown, options?: RequestOptions): Promise<HttpResponse>;
210
+ delete(url: string, options?: RequestOptions): Promise<HttpResponse>;
211
+ }
212
+ export interface RequestOptions {
213
+ readonly headers?: Record<string, string>;
214
+ readonly timeout?: number;
215
+ readonly retry?: number;
216
+ }
217
+ export interface HttpResponse {
218
+ readonly status: number;
219
+ readonly statusText: string;
220
+ readonly headers: Record<string, string>;
221
+ readonly data: unknown;
222
+ }
223
+ export interface PluginCrypto {
224
+ hash(data: string, algorithm?: string): string;
225
+ encrypt(data: string, key: string): string;
226
+ decrypt(data: string, key: string): string;
227
+ generateId(): string;
228
+ generateSecret(length?: number): string;
229
+ }
230
+ export interface PluginUtils {
231
+ validateSchema(data: unknown, schema: Record<string, unknown>): ValidationResult;
232
+ formatDate(date: Date, format?: string): string;
233
+ parseTemplate(template: string, data: Record<string, unknown>): string;
234
+ debounce<T extends (...args: unknown[]) => unknown>(fn: T, delay: number): T;
235
+ throttle<T extends (...args: unknown[]) => unknown>(fn: T, interval: number): T;
236
+ }
237
+ export interface ValidationResult {
238
+ readonly valid: boolean;
239
+ readonly errors: ValidationError[];
240
+ readonly warnings: ValidationWarning[];
241
+ }
242
+ export interface ValidationError {
243
+ readonly path: string;
244
+ readonly message: string;
245
+ readonly value?: unknown;
246
+ }
247
+ export interface ValidationWarning {
248
+ readonly path: string;
249
+ readonly message: string;
250
+ readonly suggestion?: string;
251
+ }
252
+ export interface HookSystem {
253
+ register(pluginId: string, hook: HookRegistration): Promise<void>;
254
+ unregister(pluginId: string, hookName: string): Promise<void>;
255
+ execute(hookName: string, context: HookExecutionContext): Promise<HookResult>;
256
+ getHooks(hookName: string): Promise<HookRegistration[]>;
257
+ getAllHooks(): Promise<Record<string, HookRegistration[]>>;
258
+ }
259
+ export interface HookRegistration {
260
+ readonly pluginId: string;
261
+ readonly name: string;
262
+ readonly type: HookType;
263
+ readonly phase: HookPhase;
264
+ readonly priority: number;
265
+ readonly handler: HookHandler;
266
+ readonly conditions?: HookCondition[];
267
+ }
268
+ export interface HookExecutionContext {
269
+ readonly hookName: string;
270
+ readonly phase: HookPhase;
271
+ readonly data: Record<string, unknown>;
272
+ readonly metadata: Record<string, unknown>;
273
+ readonly cancellationToken?: CancellationToken;
274
+ }
275
+ export interface HookResult {
276
+ readonly success: boolean;
277
+ readonly data?: Record<string, unknown>;
278
+ readonly error?: Error;
279
+ readonly metadata?: Record<string, unknown>;
280
+ readonly stopPropagation?: boolean;
281
+ }
282
+ export interface HookHandler {
283
+ (context: HookExecutionContext): Promise<HookResult>;
284
+ }
285
+ export interface HookCondition {
286
+ readonly type: string;
287
+ readonly value: unknown;
288
+ readonly operator: ConditionOperator;
289
+ }
290
+ export interface CancellationToken {
291
+ readonly isCancelled: boolean;
292
+ cancel(): void;
293
+ onCancelled(callback: () => void): void;
294
+ }
295
+ export interface ToolRegistry {
296
+ register(pluginId: string, tool: ToolRegistration): Promise<void>;
297
+ unregister(pluginId: string, toolName: string): Promise<void>;
298
+ execute(toolName: string, input: Record<string, unknown>, context: ToolExecutionContext): Promise<ToolResult>;
299
+ getTool(toolName: string): Promise<ToolRegistration | null>;
300
+ getAllTools(): Promise<Record<string, ToolRegistration>>;
301
+ getToolsByCategory(category: ToolCategory): Promise<ToolRegistration[]>;
302
+ }
303
+ export interface ToolRegistration {
304
+ readonly pluginId: string;
305
+ readonly name: string;
306
+ readonly description: string;
307
+ readonly category: ToolCategory;
308
+ readonly handler: ToolHandler;
309
+ readonly inputSchema: Record<string, unknown>;
310
+ readonly outputSchema: Record<string, unknown>;
311
+ readonly permissions: ToolPermission[];
312
+ }
313
+ export interface ToolExecutionContext {
314
+ readonly toolName: string;
315
+ readonly pluginId: string;
316
+ readonly user?: string;
317
+ readonly session?: string;
318
+ readonly metadata: Record<string, unknown>;
319
+ }
320
+ export interface ToolResult {
321
+ readonly success: boolean;
322
+ readonly data?: Record<string, unknown>;
323
+ readonly error?: Error;
324
+ readonly metadata?: Record<string, unknown>;
325
+ }
326
+ export interface ToolHandler {
327
+ (input: Record<string, unknown>, context: ToolExecutionContext): Promise<ToolResult>;
328
+ }
329
+ export interface PluginValidationResult {
330
+ readonly valid: boolean;
331
+ readonly errors: PluginValidationError[];
332
+ readonly warnings: PluginValidationWarning[];
333
+ readonly securityIssues: SecurityIssue[];
334
+ readonly compatibilityIssues: CompatibilityIssue[];
335
+ }
336
+ export interface PluginValidationError {
337
+ readonly type: string;
338
+ readonly message: string;
339
+ readonly field?: string;
340
+ readonly severity: ValidationSeverity;
341
+ }
342
+ export interface PluginValidationWarning {
343
+ readonly type: string;
344
+ readonly message: string;
345
+ readonly suggestion: string;
346
+ }
347
+ export interface SecurityIssue {
348
+ readonly type: SecurityIssueType;
349
+ readonly severity: SecuritySeverity;
350
+ readonly message: string;
351
+ readonly recommendation: string;
352
+ readonly cve?: string;
353
+ }
354
+ export interface CompatibilityIssue {
355
+ readonly type: string;
356
+ readonly message: string;
357
+ readonly affectedVersions: string[];
358
+ readonly workaround?: string;
359
+ }
360
+ export declare enum CapabilityType {
361
+ HOOK = "hook",
362
+ TOOL = "tool",
363
+ STEERING = "steering",
364
+ TEMPLATE = "template",
365
+ QUALITY = "quality",
366
+ I18N = "i18n",
367
+ STORAGE = "storage",
368
+ NETWORK = "network"
369
+ }
370
+ export declare enum HookType {
371
+ FILTER = "filter",
372
+ ACTION = "action",
373
+ VALIDATOR = "validator",
374
+ TRANSFORMER = "transformer",
375
+ OBSERVER = "observer"
376
+ }
377
+ export declare enum HookPhase {
378
+ PRE_INIT = "pre-init",
379
+ POST_INIT = "post-init",
380
+ PRE_REQUIREMENTS = "pre-requirements",
381
+ POST_REQUIREMENTS = "post-requirements",
382
+ PRE_DESIGN = "pre-design",
383
+ POST_DESIGN = "post-design",
384
+ PRE_TASKS = "pre-tasks",
385
+ POST_TASKS = "post-tasks",
386
+ PRE_IMPLEMENTATION = "pre-implementation",
387
+ POST_IMPLEMENTATION = "post-implementation",
388
+ PRE_QUALITY_CHECK = "pre-quality-check",
389
+ POST_QUALITY_CHECK = "post-quality-check",
390
+ PRE_TEMPLATE_RENDER = "pre-template-render",
391
+ POST_TEMPLATE_RENDER = "post-template-render",
392
+ ERROR = "error",
393
+ SHUTDOWN = "shutdown"
394
+ }
395
+ export declare enum ToolCategory {
396
+ SDD = "sdd",
397
+ QUALITY = "quality",
398
+ TEMPLATE = "template",
399
+ FILE_SYSTEM = "file-system",
400
+ NETWORK = "network",
401
+ DATA = "data",
402
+ UTILITY = "utility",
403
+ INTEGRATION = "integration"
404
+ }
405
+ export declare enum PermissionType {
406
+ FILE_READ = "file:read",
407
+ FILE_WRITE = "file:write",
408
+ FILE_EXECUTE = "file:execute",
409
+ NETWORK_REQUEST = "network:request",
410
+ SYSTEM_INFO = "system:info",
411
+ ENVIRONMENT = "environment",
412
+ STORAGE = "storage"
413
+ }
414
+ export declare enum SteeringDocumentType {
415
+ PRODUCT = "product",
416
+ TECHNICAL = "technical",
417
+ STRUCTURE = "structure",
418
+ QUALITY = "quality",
419
+ PROCESS = "process",
420
+ CUSTOM = "custom"
421
+ }
422
+ export declare enum SteeringMode {
423
+ ALWAYS = "always",
424
+ CONDITIONAL = "conditional",
425
+ MANUAL = "manual"
426
+ }
427
+ export declare enum ValidationType {
428
+ REQUIRED = "required",
429
+ TYPE = "type",
430
+ RANGE = "range",
431
+ PATTERN = "pattern",
432
+ ENUM = "enum",
433
+ CUSTOM = "custom"
434
+ }
435
+ export declare enum PluginCategory {
436
+ SDD = "sdd",
437
+ QUALITY = "quality",
438
+ TEMPLATE = "template",
439
+ I18N = "i18n",
440
+ INTEGRATION = "integration",
441
+ UTILITY = "utility",
442
+ WORKFLOW = "workflow",
443
+ REPORTING = "reporting"
444
+ }
445
+ export declare enum PluginMaturity {
446
+ EXPERIMENTAL = "experimental",
447
+ ALPHA = "alpha",
448
+ BETA = "beta",
449
+ STABLE = "stable",
450
+ MATURE = "mature",
451
+ DEPRECATED = "deprecated"
452
+ }
453
+ export declare enum PluginState {
454
+ DISCOVERED = "discovered",
455
+ INSTALLING = "installing",
456
+ INSTALLED = "installed",
457
+ LOADING = "loading",
458
+ LOADED = "loaded",
459
+ ACTIVE = "active",
460
+ INACTIVE = "inactive",
461
+ ERROR = "error",
462
+ UNINSTALLING = "uninstalling"
463
+ }
464
+ export declare enum ValidationSeverity {
465
+ LOW = "low",
466
+ MEDIUM = "medium",
467
+ HIGH = "high",
468
+ CRITICAL = "critical"
469
+ }
470
+ export declare enum SecurityIssueType {
471
+ CODE_INJECTION = "code-injection",
472
+ PATH_TRAVERSAL = "path-traversal",
473
+ UNSAFE_DEPENDENCY = "unsafe-dependency",
474
+ PRIVILEGE_ESCALATION = "privilege-escalation",
475
+ DATA_EXPOSURE = "data-exposure",
476
+ MALICIOUS_CODE = "malicious-code"
477
+ }
478
+ export declare enum SecuritySeverity {
479
+ INFO = "info",
480
+ LOW = "low",
481
+ MEDIUM = "medium",
482
+ HIGH = "high",
483
+ CRITICAL = "critical"
484
+ }
485
+ export declare enum ConditionOperator {
486
+ EQUALS = "eq",
487
+ NOT_EQUALS = "ne",
488
+ GREATER_THAN = "gt",
489
+ GREATER_THAN_OR_EQUAL = "gte",
490
+ LESS_THAN = "lt",
491
+ LESS_THAN_OR_EQUAL = "lte",
492
+ CONTAINS = "contains",
493
+ STARTS_WITH = "startsWith",
494
+ ENDS_WITH = "endsWith",
495
+ MATCHES = "matches",
496
+ IN = "in",
497
+ NOT_IN = "notIn"
498
+ }
@@ -0,0 +1,157 @@
1
+ // Domain models and interfaces for plugin system and extensibility
2
+ // Enums and types
3
+ export var CapabilityType;
4
+ (function (CapabilityType) {
5
+ CapabilityType["HOOK"] = "hook";
6
+ CapabilityType["TOOL"] = "tool";
7
+ CapabilityType["STEERING"] = "steering";
8
+ CapabilityType["TEMPLATE"] = "template";
9
+ CapabilityType["QUALITY"] = "quality";
10
+ CapabilityType["I18N"] = "i18n";
11
+ CapabilityType["STORAGE"] = "storage";
12
+ CapabilityType["NETWORK"] = "network";
13
+ })(CapabilityType || (CapabilityType = {}));
14
+ export var HookType;
15
+ (function (HookType) {
16
+ HookType["FILTER"] = "filter";
17
+ HookType["ACTION"] = "action";
18
+ HookType["VALIDATOR"] = "validator";
19
+ HookType["TRANSFORMER"] = "transformer";
20
+ HookType["OBSERVER"] = "observer";
21
+ })(HookType || (HookType = {}));
22
+ export var HookPhase;
23
+ (function (HookPhase) {
24
+ HookPhase["PRE_INIT"] = "pre-init";
25
+ HookPhase["POST_INIT"] = "post-init";
26
+ HookPhase["PRE_REQUIREMENTS"] = "pre-requirements";
27
+ HookPhase["POST_REQUIREMENTS"] = "post-requirements";
28
+ HookPhase["PRE_DESIGN"] = "pre-design";
29
+ HookPhase["POST_DESIGN"] = "post-design";
30
+ HookPhase["PRE_TASKS"] = "pre-tasks";
31
+ HookPhase["POST_TASKS"] = "post-tasks";
32
+ HookPhase["PRE_IMPLEMENTATION"] = "pre-implementation";
33
+ HookPhase["POST_IMPLEMENTATION"] = "post-implementation";
34
+ HookPhase["PRE_QUALITY_CHECK"] = "pre-quality-check";
35
+ HookPhase["POST_QUALITY_CHECK"] = "post-quality-check";
36
+ HookPhase["PRE_TEMPLATE_RENDER"] = "pre-template-render";
37
+ HookPhase["POST_TEMPLATE_RENDER"] = "post-template-render";
38
+ HookPhase["ERROR"] = "error";
39
+ HookPhase["SHUTDOWN"] = "shutdown";
40
+ })(HookPhase || (HookPhase = {}));
41
+ export var ToolCategory;
42
+ (function (ToolCategory) {
43
+ ToolCategory["SDD"] = "sdd";
44
+ ToolCategory["QUALITY"] = "quality";
45
+ ToolCategory["TEMPLATE"] = "template";
46
+ ToolCategory["FILE_SYSTEM"] = "file-system";
47
+ ToolCategory["NETWORK"] = "network";
48
+ ToolCategory["DATA"] = "data";
49
+ ToolCategory["UTILITY"] = "utility";
50
+ ToolCategory["INTEGRATION"] = "integration";
51
+ })(ToolCategory || (ToolCategory = {}));
52
+ export var PermissionType;
53
+ (function (PermissionType) {
54
+ PermissionType["FILE_READ"] = "file:read";
55
+ PermissionType["FILE_WRITE"] = "file:write";
56
+ PermissionType["FILE_EXECUTE"] = "file:execute";
57
+ PermissionType["NETWORK_REQUEST"] = "network:request";
58
+ PermissionType["SYSTEM_INFO"] = "system:info";
59
+ PermissionType["ENVIRONMENT"] = "environment";
60
+ PermissionType["STORAGE"] = "storage";
61
+ })(PermissionType || (PermissionType = {}));
62
+ export var SteeringDocumentType;
63
+ (function (SteeringDocumentType) {
64
+ SteeringDocumentType["PRODUCT"] = "product";
65
+ SteeringDocumentType["TECHNICAL"] = "technical";
66
+ SteeringDocumentType["STRUCTURE"] = "structure";
67
+ SteeringDocumentType["QUALITY"] = "quality";
68
+ SteeringDocumentType["PROCESS"] = "process";
69
+ SteeringDocumentType["CUSTOM"] = "custom";
70
+ })(SteeringDocumentType || (SteeringDocumentType = {}));
71
+ export var SteeringMode;
72
+ (function (SteeringMode) {
73
+ SteeringMode["ALWAYS"] = "always";
74
+ SteeringMode["CONDITIONAL"] = "conditional";
75
+ SteeringMode["MANUAL"] = "manual";
76
+ })(SteeringMode || (SteeringMode = {}));
77
+ export var ValidationType;
78
+ (function (ValidationType) {
79
+ ValidationType["REQUIRED"] = "required";
80
+ ValidationType["TYPE"] = "type";
81
+ ValidationType["RANGE"] = "range";
82
+ ValidationType["PATTERN"] = "pattern";
83
+ ValidationType["ENUM"] = "enum";
84
+ ValidationType["CUSTOM"] = "custom";
85
+ })(ValidationType || (ValidationType = {}));
86
+ export var PluginCategory;
87
+ (function (PluginCategory) {
88
+ PluginCategory["SDD"] = "sdd";
89
+ PluginCategory["QUALITY"] = "quality";
90
+ PluginCategory["TEMPLATE"] = "template";
91
+ PluginCategory["I18N"] = "i18n";
92
+ PluginCategory["INTEGRATION"] = "integration";
93
+ PluginCategory["UTILITY"] = "utility";
94
+ PluginCategory["WORKFLOW"] = "workflow";
95
+ PluginCategory["REPORTING"] = "reporting";
96
+ })(PluginCategory || (PluginCategory = {}));
97
+ export var PluginMaturity;
98
+ (function (PluginMaturity) {
99
+ PluginMaturity["EXPERIMENTAL"] = "experimental";
100
+ PluginMaturity["ALPHA"] = "alpha";
101
+ PluginMaturity["BETA"] = "beta";
102
+ PluginMaturity["STABLE"] = "stable";
103
+ PluginMaturity["MATURE"] = "mature";
104
+ PluginMaturity["DEPRECATED"] = "deprecated";
105
+ })(PluginMaturity || (PluginMaturity = {}));
106
+ export var PluginState;
107
+ (function (PluginState) {
108
+ PluginState["DISCOVERED"] = "discovered";
109
+ PluginState["INSTALLING"] = "installing";
110
+ PluginState["INSTALLED"] = "installed";
111
+ PluginState["LOADING"] = "loading";
112
+ PluginState["LOADED"] = "loaded";
113
+ PluginState["ACTIVE"] = "active";
114
+ PluginState["INACTIVE"] = "inactive";
115
+ PluginState["ERROR"] = "error";
116
+ PluginState["UNINSTALLING"] = "uninstalling";
117
+ })(PluginState || (PluginState = {}));
118
+ export var ValidationSeverity;
119
+ (function (ValidationSeverity) {
120
+ ValidationSeverity["LOW"] = "low";
121
+ ValidationSeverity["MEDIUM"] = "medium";
122
+ ValidationSeverity["HIGH"] = "high";
123
+ ValidationSeverity["CRITICAL"] = "critical";
124
+ })(ValidationSeverity || (ValidationSeverity = {}));
125
+ export var SecurityIssueType;
126
+ (function (SecurityIssueType) {
127
+ SecurityIssueType["CODE_INJECTION"] = "code-injection";
128
+ SecurityIssueType["PATH_TRAVERSAL"] = "path-traversal";
129
+ SecurityIssueType["UNSAFE_DEPENDENCY"] = "unsafe-dependency";
130
+ SecurityIssueType["PRIVILEGE_ESCALATION"] = "privilege-escalation";
131
+ SecurityIssueType["DATA_EXPOSURE"] = "data-exposure";
132
+ SecurityIssueType["MALICIOUS_CODE"] = "malicious-code";
133
+ })(SecurityIssueType || (SecurityIssueType = {}));
134
+ export var SecuritySeverity;
135
+ (function (SecuritySeverity) {
136
+ SecuritySeverity["INFO"] = "info";
137
+ SecuritySeverity["LOW"] = "low";
138
+ SecuritySeverity["MEDIUM"] = "medium";
139
+ SecuritySeverity["HIGH"] = "high";
140
+ SecuritySeverity["CRITICAL"] = "critical";
141
+ })(SecuritySeverity || (SecuritySeverity = {}));
142
+ export var ConditionOperator;
143
+ (function (ConditionOperator) {
144
+ ConditionOperator["EQUALS"] = "eq";
145
+ ConditionOperator["NOT_EQUALS"] = "ne";
146
+ ConditionOperator["GREATER_THAN"] = "gt";
147
+ ConditionOperator["GREATER_THAN_OR_EQUAL"] = "gte";
148
+ ConditionOperator["LESS_THAN"] = "lt";
149
+ ConditionOperator["LESS_THAN_OR_EQUAL"] = "lte";
150
+ ConditionOperator["CONTAINS"] = "contains";
151
+ ConditionOperator["STARTS_WITH"] = "startsWith";
152
+ ConditionOperator["ENDS_WITH"] = "endsWith";
153
+ ConditionOperator["MATCHES"] = "matches";
154
+ ConditionOperator["IN"] = "in";
155
+ ConditionOperator["NOT_IN"] = "notIn";
156
+ })(ConditionOperator || (ConditionOperator = {}));
157
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/plugins/index.ts"],"names":[],"mappings":"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"}