@codemcp/workflows 3.1.21

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 (159) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.vibe/conversation-state.sqlite +0 -0
  3. package/LICENSE +674 -0
  4. package/dist/index.d.ts +9 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +74 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/notification-service.d.ts +14 -0
  9. package/dist/notification-service.d.ts.map +1 -0
  10. package/dist/notification-service.js +18 -0
  11. package/dist/notification-service.js.map +1 -0
  12. package/dist/resource-handlers/conversation-state.d.ts +15 -0
  13. package/dist/resource-handlers/conversation-state.d.ts.map +1 -0
  14. package/dist/resource-handlers/conversation-state.js +40 -0
  15. package/dist/resource-handlers/conversation-state.js.map +1 -0
  16. package/dist/resource-handlers/development-plan.d.ts +14 -0
  17. package/dist/resource-handlers/development-plan.d.ts.map +1 -0
  18. package/dist/resource-handlers/development-plan.js +31 -0
  19. package/dist/resource-handlers/development-plan.js.map +1 -0
  20. package/dist/resource-handlers/index.d.ts +24 -0
  21. package/dist/resource-handlers/index.d.ts.map +1 -0
  22. package/dist/resource-handlers/index.js +62 -0
  23. package/dist/resource-handlers/index.js.map +1 -0
  24. package/dist/resource-handlers/system-prompt.d.ts +15 -0
  25. package/dist/resource-handlers/system-prompt.d.ts.map +1 -0
  26. package/dist/resource-handlers/system-prompt.js +40 -0
  27. package/dist/resource-handlers/system-prompt.js.map +1 -0
  28. package/dist/resource-handlers/workflow-resource.d.ts +15 -0
  29. package/dist/resource-handlers/workflow-resource.d.ts.map +1 -0
  30. package/dist/resource-handlers/workflow-resource.js +85 -0
  31. package/dist/resource-handlers/workflow-resource.js.map +1 -0
  32. package/dist/response-renderer.d.ts +30 -0
  33. package/dist/response-renderer.d.ts.map +1 -0
  34. package/dist/response-renderer.js +94 -0
  35. package/dist/response-renderer.js.map +1 -0
  36. package/dist/server-config.d.ts +34 -0
  37. package/dist/server-config.d.ts.map +1 -0
  38. package/dist/server-config.js +486 -0
  39. package/dist/server-config.js.map +1 -0
  40. package/dist/server-helpers.d.ts +62 -0
  41. package/dist/server-helpers.d.ts.map +1 -0
  42. package/dist/server-helpers.js +156 -0
  43. package/dist/server-helpers.js.map +1 -0
  44. package/dist/server-implementation.d.ts +74 -0
  45. package/dist/server-implementation.d.ts.map +1 -0
  46. package/dist/server-implementation.js +201 -0
  47. package/dist/server-implementation.js.map +1 -0
  48. package/dist/server.d.ts +6 -0
  49. package/dist/server.d.ts.map +1 -0
  50. package/dist/server.js +5 -0
  51. package/dist/server.js.map +1 -0
  52. package/dist/tool-handlers/base-tool-handler.d.ts +50 -0
  53. package/dist/tool-handlers/base-tool-handler.d.ts.map +1 -0
  54. package/dist/tool-handlers/base-tool-handler.js +74 -0
  55. package/dist/tool-handlers/base-tool-handler.js.map +1 -0
  56. package/dist/tool-handlers/conduct-review.d.ts +49 -0
  57. package/dist/tool-handlers/conduct-review.d.ts.map +1 -0
  58. package/dist/tool-handlers/conduct-review.js +105 -0
  59. package/dist/tool-handlers/conduct-review.js.map +1 -0
  60. package/dist/tool-handlers/get-tool-info.d.ts +76 -0
  61. package/dist/tool-handlers/get-tool-info.d.ts.map +1 -0
  62. package/dist/tool-handlers/get-tool-info.js +168 -0
  63. package/dist/tool-handlers/get-tool-info.js.map +1 -0
  64. package/dist/tool-handlers/index.d.ts +42 -0
  65. package/dist/tool-handlers/index.d.ts.map +1 -0
  66. package/dist/tool-handlers/index.js +74 -0
  67. package/dist/tool-handlers/index.js.map +1 -0
  68. package/dist/tool-handlers/install-workflow.d.ts +48 -0
  69. package/dist/tool-handlers/install-workflow.d.ts.map +1 -0
  70. package/dist/tool-handlers/install-workflow.js +131 -0
  71. package/dist/tool-handlers/install-workflow.js.map +1 -0
  72. package/dist/tool-handlers/list-workflows.d.ts +47 -0
  73. package/dist/tool-handlers/list-workflows.d.ts.map +1 -0
  74. package/dist/tool-handlers/list-workflows.js +58 -0
  75. package/dist/tool-handlers/list-workflows.js.map +1 -0
  76. package/dist/tool-handlers/no-idea.d.ts +41 -0
  77. package/dist/tool-handlers/no-idea.d.ts.map +1 -0
  78. package/dist/tool-handlers/no-idea.js +29 -0
  79. package/dist/tool-handlers/no-idea.js.map +1 -0
  80. package/dist/tool-handlers/proceed-to-phase.d.ts +39 -0
  81. package/dist/tool-handlers/proceed-to-phase.d.ts.map +1 -0
  82. package/dist/tool-handlers/proceed-to-phase.js +109 -0
  83. package/dist/tool-handlers/proceed-to-phase.js.map +1 -0
  84. package/dist/tool-handlers/reset-development.d.ts +31 -0
  85. package/dist/tool-handlers/reset-development.d.ts.map +1 -0
  86. package/dist/tool-handlers/reset-development.js +48 -0
  87. package/dist/tool-handlers/reset-development.js.map +1 -0
  88. package/dist/tool-handlers/resume-workflow.d.ts +88 -0
  89. package/dist/tool-handlers/resume-workflow.d.ts.map +1 -0
  90. package/dist/tool-handlers/resume-workflow.js +213 -0
  91. package/dist/tool-handlers/resume-workflow.js.map +1 -0
  92. package/dist/tool-handlers/setup-project-docs.d.ts +36 -0
  93. package/dist/tool-handlers/setup-project-docs.d.ts.map +1 -0
  94. package/dist/tool-handlers/setup-project-docs.js +136 -0
  95. package/dist/tool-handlers/setup-project-docs.js.map +1 -0
  96. package/dist/tool-handlers/start-development.d.ts +82 -0
  97. package/dist/tool-handlers/start-development.d.ts.map +1 -0
  98. package/dist/tool-handlers/start-development.js +448 -0
  99. package/dist/tool-handlers/start-development.js.map +1 -0
  100. package/dist/tool-handlers/whats-next.d.ts +42 -0
  101. package/dist/tool-handlers/whats-next.d.ts.map +1 -0
  102. package/dist/tool-handlers/whats-next.js +118 -0
  103. package/dist/tool-handlers/whats-next.js.map +1 -0
  104. package/dist/types.d.ts +114 -0
  105. package/dist/types.d.ts.map +1 -0
  106. package/dist/types.js +5 -0
  107. package/dist/types.js.map +1 -0
  108. package/package.json +29 -0
  109. package/src/index.ts +93 -0
  110. package/src/notification-service.ts +23 -0
  111. package/src/resource-handlers/conversation-state.ts +55 -0
  112. package/src/resource-handlers/development-plan.ts +48 -0
  113. package/src/resource-handlers/index.ts +73 -0
  114. package/src/resource-handlers/system-prompt.ts +55 -0
  115. package/src/resource-handlers/workflow-resource.ts +126 -0
  116. package/src/response-renderer.ts +116 -0
  117. package/src/server-config.ts +744 -0
  118. package/src/server-helpers.ts +225 -0
  119. package/src/server-implementation.ts +277 -0
  120. package/src/server.ts +9 -0
  121. package/src/tool-handlers/base-tool-handler.ts +141 -0
  122. package/src/tool-handlers/conduct-review.ts +191 -0
  123. package/src/tool-handlers/get-tool-info.ts +274 -0
  124. package/src/tool-handlers/index.ts +117 -0
  125. package/src/tool-handlers/install-workflow.ts +185 -0
  126. package/src/tool-handlers/list-workflows.ts +94 -0
  127. package/src/tool-handlers/no-idea.ts +47 -0
  128. package/src/tool-handlers/proceed-to-phase.ts +205 -0
  129. package/src/tool-handlers/reset-development.ts +90 -0
  130. package/src/tool-handlers/resume-workflow.ts +380 -0
  131. package/src/tool-handlers/setup-project-docs.ts +226 -0
  132. package/src/tool-handlers/start-development.ts +685 -0
  133. package/src/tool-handlers/whats-next.ts +235 -0
  134. package/src/types.ts +130 -0
  135. package/test/e2e/core-functionality.test.ts +176 -0
  136. package/test/e2e/mcp-contract.test.ts +540 -0
  137. package/test/e2e/plan-management.test.ts +331 -0
  138. package/test/e2e/state-management.test.ts +392 -0
  139. package/test/e2e/workflow-integration.test.ts +506 -0
  140. package/test/unit/commit-behaviour-interface.test.ts +244 -0
  141. package/test/unit/conduct-review.test.ts +151 -0
  142. package/test/unit/reset-functionality.test.ts +72 -0
  143. package/test/unit/resume-workflow.test.ts +192 -0
  144. package/test/unit/server-tools.test.ts +311 -0
  145. package/test/unit/setup-project-docs-handler.test.ts +267 -0
  146. package/test/unit/start-development-artifact-detection.test.ts +387 -0
  147. package/test/unit/start-development-gitignore.test.ts +178 -0
  148. package/test/unit/system-prompt-resource.test.ts +101 -0
  149. package/test/unit/tool-handlers/no-idea.test.ts +40 -0
  150. package/test/utils/e2e-test-setup.ts +453 -0
  151. package/test/utils/run-server-in-dir.sh +27 -0
  152. package/test/utils/temp-files.ts +308 -0
  153. package/test/utils/test-access.ts +79 -0
  154. package/test/utils/test-helpers.ts +286 -0
  155. package/test/utils/test-setup.ts +78 -0
  156. package/tsconfig.build.json +9 -0
  157. package/tsconfig.build.tsbuildinfo +1 -0
  158. package/tsconfig.json +12 -0
  159. package/vitest.config.ts +17 -0
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Response Renderer
3
+ *
4
+ * Handles translation between domain handler results and MCP protocol responses.
5
+ * This provides clean separation between business logic and protocol concerns.
6
+ */
7
+ import { createLogger } from '@codemcp/workflows-core';
8
+ const logger = createLogger('ResponseRenderer');
9
+ /**
10
+ * Default implementation of ResponseRenderer
11
+ * Converts domain results to MCP protocol format
12
+ */
13
+ export class DefaultResponseRenderer {
14
+ /**
15
+ * Render a tool handler result as an MCP tool response
16
+ */
17
+ renderToolResponse(result) {
18
+ logger.debug('Rendering tool response', {
19
+ success: result.success,
20
+ hasData: !!result.data,
21
+ hasError: !!result.error,
22
+ });
23
+ if (!result.success && result.error) {
24
+ return this.renderError(result.error);
25
+ }
26
+ // Convert data to JSON string for MCP protocol
27
+ const responseText = result.data
28
+ ? JSON.stringify(result.data, null, 2)
29
+ : '';
30
+ return {
31
+ content: [
32
+ {
33
+ type: 'text',
34
+ text: responseText,
35
+ },
36
+ ],
37
+ };
38
+ }
39
+ /**
40
+ * Render a resource handler result as an MCP resource response
41
+ */
42
+ renderResourceResponse(result) {
43
+ logger.debug('Rendering resource response', {
44
+ success: result.success,
45
+ hasData: !!result.data,
46
+ });
47
+ if (!result.success || !result.data) {
48
+ // For resources, we still need to return a valid response structure
49
+ // but with error content
50
+ const errorText = result.error || 'Resource not available';
51
+ return {
52
+ contents: [
53
+ {
54
+ uri: result.data?.uri || 'error://unknown',
55
+ text: `Error: ${errorText}`,
56
+ mimeType: 'text/plain',
57
+ },
58
+ ],
59
+ };
60
+ }
61
+ return {
62
+ contents: [
63
+ {
64
+ uri: result.data.uri,
65
+ text: result.data.text,
66
+ mimeType: result.data.mimeType,
67
+ },
68
+ ],
69
+ };
70
+ }
71
+ /**
72
+ * Render an error as an MCP tool response
73
+ */
74
+ renderError(error) {
75
+ const errorMessage = error instanceof Error ? error.message : error;
76
+ logger.debug('Rendering error response', { errorMessage });
77
+ return {
78
+ content: [
79
+ {
80
+ type: 'text',
81
+ text: `Error: ${errorMessage}`,
82
+ },
83
+ ],
84
+ isError: true,
85
+ };
86
+ }
87
+ }
88
+ /**
89
+ * Create a default response renderer instance
90
+ */
91
+ export function createResponseRenderer() {
92
+ return new DefaultResponseRenderer();
93
+ }
94
+ //# sourceMappingURL=response-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-renderer.js","sourceRoot":"","sources":["../src/response-renderer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AASvD,MAAM,MAAM,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;AAEhD;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAClC;;OAEG;IACH,kBAAkB,CAAI,MAAwB;QAC5C,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;YACtC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;YACtB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;SACzB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAED,+CAA+C;QAC/C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI;YAC9B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,YAAY;iBACnB;aACF;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,sBAAsB,CACpB,MAAsC;QAEtC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;YAC1C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;SACvB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpC,oEAAoE;YACpE,yBAAyB;YACzB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,wBAAwB,CAAC;YAE3D,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,iBAAiB;wBAC1C,IAAI,EAAE,UAAU,SAAS,EAAE;wBAC3B,QAAQ,EAAE,YAAY;qBACvB;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;oBACpB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;oBACtB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;iBAC/B;aACF;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAqB;QAC/B,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAEpE,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;QAE3D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,UAAU,YAAY,EAAE;iBAC/B;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,uBAAuB,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Server Configuration
3
+ *
4
+ * Handles server configuration, component initialization, and MCP server setup.
5
+ * Centralizes the configuration logic that was previously scattered in the main server class.
6
+ */
7
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import { Database } from '@codemcp/workflows-core';
9
+ import { ServerConfig, ServerContext, ToolRegistry, ResourceRegistry, ResponseRenderer } from './types.js';
10
+ /**
11
+ * Server component container
12
+ * Holds all the initialized server components
13
+ */
14
+ export interface ServerComponents {
15
+ mcpServer: McpServer;
16
+ database: Database;
17
+ context: ServerContext;
18
+ toolRegistry: ToolRegistry;
19
+ resourceRegistry: ResourceRegistry;
20
+ responseRenderer: ResponseRenderer;
21
+ }
22
+ /**
23
+ * Initialize all server components
24
+ */
25
+ export declare function initializeServerComponents(config?: ServerConfig): Promise<ServerComponents>;
26
+ /**
27
+ * Register MCP tools with the server
28
+ */
29
+ export declare function registerMcpTools(mcpServer: McpServer, toolRegistry: ToolRegistry, responseRenderer: ResponseRenderer, context: ServerContext): Promise<void>;
30
+ /**
31
+ * Register MCP resources with the server
32
+ */
33
+ export declare function registerMcpResources(mcpServer: McpServer, resourceRegistry: ResourceRegistry, responseRenderer: ResponseRenderer, context: ServerContext): void;
34
+ //# sourceMappingURL=server-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../src/server-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAWnD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAUpB;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,GAAE,YAAiB,GACxB,OAAO,CAAC,gBAAgB,CAAC,CAyF3B;AAwBD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAmYf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,EAAE,aAAa,GACrB,IAAI,CAuKN"}
@@ -0,0 +1,486 @@
1
+ /**
2
+ * Server Configuration
3
+ *
4
+ * Handles server configuration, component initialization, and MCP server setup.
5
+ * Centralizes the configuration logic that was previously scattered in the main server class.
6
+ */
7
+ import { z } from 'zod';
8
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
10
+ import { SetLevelRequestSchema } from '@modelcontextprotocol/sdk/types.js';
11
+ import * as path from 'node:path';
12
+ import { Database } from '@codemcp/workflows-core';
13
+ import { ConversationManager } from '@codemcp/workflows-core';
14
+ import { TransitionEngine } from '@codemcp/workflows-core';
15
+ import { InstructionGenerator } from '@codemcp/workflows-core';
16
+ import { PlanManager } from '@codemcp/workflows-core';
17
+ import { InteractionLogger } from '@codemcp/workflows-core';
18
+ import { WorkflowManager } from '@codemcp/workflows-core';
19
+ import { GitManager } from '@codemcp/workflows-core';
20
+ import { TemplateManager } from '@codemcp/workflows-core';
21
+ import { createLogger, setMcpLoggingLevel } from '@codemcp/workflows-core';
22
+ import { normalizeProjectPath, buildWorkflowEnum, generateWorkflowDescription, } from './server-helpers.js';
23
+ import { notificationService } from './notification-service.js';
24
+ const logger = createLogger('ServerConfig');
25
+ /**
26
+ * Initialize all server components
27
+ */
28
+ export async function initializeServerComponents(config = {}) {
29
+ logger.debug('Initializing server components', {
30
+ config: JSON.stringify(config),
31
+ });
32
+ // Set project path with support for environment variable
33
+ const projectPath = normalizeProjectPath(config.projectPath || process.env.PROJECT_PATH);
34
+ logger.info('Using project path', {
35
+ projectPath,
36
+ source: config.projectPath
37
+ ? 'config'
38
+ : process.env.PROJECT_PATH
39
+ ? 'env'
40
+ : 'default',
41
+ });
42
+ // Initialize MCP server
43
+ const mcpServer = new McpServer({
44
+ name: 'responsible-vibe-mcp',
45
+ version: '1.0.0',
46
+ }, {
47
+ capabilities: {
48
+ logging: {},
49
+ },
50
+ });
51
+ // Register logging/setLevel handler to support MCP inspector
52
+ mcpServer.server.setRequestHandler(SetLevelRequestSchema, async (request) => {
53
+ const level = request.params.level;
54
+ logger.info('Setting logging level from MCP client', { level });
55
+ // Set the unified logging level
56
+ setMcpLoggingLevel(level);
57
+ return {};
58
+ });
59
+ // Initialize core components
60
+ logger.debug('Initializing core components');
61
+ const database = new Database(path.join(projectPath, '.vibe', 'conversation.sqlite'));
62
+ const workflowManager = new WorkflowManager();
63
+ const conversationManager = new ConversationManager(database, workflowManager, projectPath);
64
+ const transitionEngine = new TransitionEngine(projectPath);
65
+ transitionEngine.setConversationManager(conversationManager);
66
+ const planManager = new PlanManager();
67
+ const instructionGenerator = new InstructionGenerator(planManager);
68
+ // Conditionally create interaction logger
69
+ const interactionLogger = config.enableLogging !== false
70
+ ? new InteractionLogger(database)
71
+ : undefined;
72
+ // Create server context
73
+ const context = {
74
+ conversationManager,
75
+ transitionEngine,
76
+ planManager,
77
+ instructionGenerator,
78
+ workflowManager,
79
+ interactionLogger,
80
+ projectPath,
81
+ };
82
+ // Initialize database
83
+ await database.initialize();
84
+ logger.info('Server components initialized successfully');
85
+ return {
86
+ mcpServer,
87
+ database,
88
+ context,
89
+ toolRegistry: null,
90
+ resourceRegistry: null,
91
+ responseRenderer: null,
92
+ };
93
+ }
94
+ /**
95
+ * Helper function to create tool handlers with consistent error handling
96
+ */
97
+ function createToolHandler(toolName, toolRegistry, responseRenderer, context) {
98
+ return async (args) => {
99
+ const handler = toolRegistry.get(toolName);
100
+ if (!handler) {
101
+ return responseRenderer.renderError(`Tool handler not found: ${toolName}`);
102
+ }
103
+ const result = await handler.handle(args, context);
104
+ return responseRenderer.renderToolResponse(result);
105
+ };
106
+ }
107
+ /**
108
+ * Register MCP tools with the server
109
+ */
110
+ export async function registerMcpTools(mcpServer, toolRegistry, responseRenderer, context) {
111
+ logger.debug('Registering MCP tools');
112
+ // Initialize notification service
113
+ notificationService.setMcpServer(mcpServer);
114
+ // Register whats_next tool
115
+ mcpServer.registerTool('whats_next', {
116
+ description: 'Get guidance for the current development phase and determine what to work on next. Call this tool after each user message to receive phase-specific instructions and check if you should transition to the next development phase. The tool will reference your plan file for specific tasks and context.',
117
+ inputSchema: {
118
+ context: z
119
+ .string()
120
+ .optional()
121
+ .describe("Brief description of what you're currently working on or discussing with the user"),
122
+ user_input: z
123
+ .string()
124
+ .optional()
125
+ .describe("The user's most recent message or request"),
126
+ conversation_summary: z
127
+ .string()
128
+ .optional()
129
+ .describe('Summary of the development progress and key decisions made so far'),
130
+ recent_messages: z
131
+ .array(z.object({
132
+ role: z
133
+ .enum(['user', 'assistant'])
134
+ .describe('Who sent the message (user or assistant)'),
135
+ content: z.string().describe('The message content'),
136
+ }))
137
+ .optional()
138
+ .describe('Recent conversation messages that provide context for the current development state'),
139
+ },
140
+ annotations: {
141
+ title: 'Development Phase Analyzer',
142
+ readOnlyHint: false,
143
+ destructiveHint: false,
144
+ idempotentHint: false,
145
+ openWorldHint: false,
146
+ },
147
+ }, createToolHandler('whats_next', toolRegistry, responseRenderer, context));
148
+ // Register proceed_to_phase tool
149
+ mcpServer.registerTool('proceed_to_phase', {
150
+ description: 'Move to a specific development phase when the current phase is complete. Use this tool to explicitly transition between phases. Check your plan file to see available phases for the current workflow. Only transition when current phase tasks are finished and user confirms readiness.',
151
+ inputSchema: {
152
+ target_phase: z
153
+ .string()
154
+ .describe('The development phase to move to. Check your plan file section headers to see available phases for the current workflow'),
155
+ reason: z
156
+ .string()
157
+ .optional()
158
+ .describe('Why you\'re moving to this phase now (e.g., "requirements complete", "user approved design", "implementation finished")'),
159
+ review_state: z
160
+ .enum(['not-required', 'pending', 'performed'])
161
+ .describe('Review state for transitions that require reviews. Use "not-required" when reviews are disabled, "pending" when review is needed, "performed" when review is complete.'),
162
+ },
163
+ annotations: {
164
+ title: 'Phase Transition Controller',
165
+ readOnlyHint: false,
166
+ destructiveHint: false,
167
+ idempotentHint: true,
168
+ openWorldHint: false,
169
+ },
170
+ }, createToolHandler('proceed_to_phase', toolRegistry, responseRenderer, context));
171
+ // Register conduct_review tool
172
+ mcpServer.registerTool('conduct_review', {
173
+ description: 'Conduct a review of the current phase before proceeding to the next phase. This tool analyzes artifacts and decisions from the current phase using defined review perspectives. Use this tool when reviews are required before phase transitions.',
174
+ inputSchema: {
175
+ target_phase: z
176
+ .string()
177
+ .describe('The target phase you want to transition to after the review is complete'),
178
+ },
179
+ annotations: {
180
+ title: 'Phase Review Conductor',
181
+ readOnlyHint: true,
182
+ destructiveHint: false,
183
+ idempotentHint: true,
184
+ openWorldHint: false,
185
+ },
186
+ }, createToolHandler('conduct_review', toolRegistry, responseRenderer, context));
187
+ // Register start_development tool with dynamic commit_behaviour description
188
+ const isGitRepo = GitManager.isGitRepository(context.projectPath);
189
+ const commitBehaviourDescription = isGitRepo
190
+ ? 'Git commit behavior: "step" (commit after each step), "phase" (commit before phase transitions), "end" (final commit only), "none" (no automatic commits). Use "end" unless the user specifically requests different behavior.'
191
+ : 'Git commit behavior: Use "none" as this is not a git repository. Other options ("step", "phase", "end") are not applicable for non-git projects.';
192
+ mcpServer.registerTool('start_development', {
193
+ description: 'Begin a new development project with a structured workflow. Choose from different development approaches (waterfall, bugfix, epcc) or use a custom workflow. This tool sets up the project plan and initializes the development process.',
194
+ inputSchema: {
195
+ workflow: z
196
+ .enum(buildWorkflowEnum(context.workflowManager.getWorkflowNames()))
197
+ .describe(generateWorkflowDescription(context.workflowManager.getAvailableWorkflows())),
198
+ commit_behaviour: z
199
+ .enum(['step', 'phase', 'end', 'none'])
200
+ .describe(commitBehaviourDescription),
201
+ require_reviews: z
202
+ .boolean()
203
+ .optional()
204
+ .describe('Whether to require reviews before phase transitions. When enabled, use conduct_review tool before proceeding to next phase.'),
205
+ },
206
+ annotations: {
207
+ title: 'Development Initializer',
208
+ readOnlyHint: false,
209
+ destructiveHint: false,
210
+ idempotentHint: true,
211
+ openWorldHint: false,
212
+ },
213
+ }, createToolHandler('start_development', toolRegistry, responseRenderer, context));
214
+ // Register resume_workflow tool
215
+ mcpServer.registerTool('resume_workflow', {
216
+ description: 'Continue development after a break or conversation restart. This tool provides complete project context, current development status, and next steps to seamlessly pick up where you left off. Use when starting a new conversation about an existing project.',
217
+ inputSchema: {
218
+ include_system_prompt: z
219
+ .boolean()
220
+ .optional()
221
+ .describe('Whether to include setup instructions for the assistant (default: true)'),
222
+ },
223
+ annotations: {
224
+ title: 'Workflow Resumption Assistant',
225
+ readOnlyHint: true,
226
+ destructiveHint: false,
227
+ idempotentHint: true,
228
+ openWorldHint: false,
229
+ },
230
+ }, createToolHandler('resume_workflow', toolRegistry, responseRenderer, context));
231
+ // Register reset_development tool
232
+ mcpServer.registerTool('reset_development', {
233
+ description: 'Start over with a clean slate by deleting all development progress and conversation history. This permanently removes the project plan and resets the development state. Use when you want to completely restart the development approach for a project.',
234
+ inputSchema: {
235
+ confirm: z
236
+ .boolean()
237
+ .describe('Must be true to execute reset - prevents accidental resets'),
238
+ reason: z
239
+ .string()
240
+ .optional()
241
+ .describe('Optional reason for reset (for logging and audit trail)'),
242
+ },
243
+ annotations: {
244
+ title: 'Development Reset Tool',
245
+ readOnlyHint: false,
246
+ destructiveHint: true,
247
+ idempotentHint: false,
248
+ openWorldHint: false,
249
+ },
250
+ }, createToolHandler('reset_development', toolRegistry, responseRenderer, context));
251
+ // Register install_workflow tool
252
+ mcpServer.registerTool('install_workflow', {
253
+ description: 'Install a workflow to .vibe/workflows/ directory. Source can be a predefined workflow name (from unloaded workflows) or URL. Installed workflows become available and override predefined ones with the same name.',
254
+ inputSchema: {
255
+ source: z
256
+ .string()
257
+ .describe('Source workflow name. Use "list_workflows" with "include_unloaded=true" tool to see options.'),
258
+ name: z
259
+ .string()
260
+ .optional()
261
+ .describe('Custom name for installed workflow (defaults to source name)'),
262
+ },
263
+ annotations: {
264
+ title: 'Workflow Installation Tool',
265
+ readOnlyHint: false,
266
+ destructiveHint: false,
267
+ idempotentHint: false,
268
+ openWorldHint: false,
269
+ },
270
+ }, createToolHandler('install_workflow', toolRegistry, responseRenderer, context));
271
+ // Register list_workflows tool
272
+ mcpServer.registerTool('list_workflows', {
273
+ description: 'Get an overview of available workflows. By default returns only loaded workflows (respecting domain filtering). Use include_unloaded=true to see all workflows regardless of domain filtering.',
274
+ inputSchema: {
275
+ include_unloaded: z
276
+ .boolean()
277
+ .optional()
278
+ .describe('Include workflows not loaded due to domain filtering. Default: false'),
279
+ },
280
+ annotations: {
281
+ title: 'Workflow Overview Tool',
282
+ readOnlyHint: true,
283
+ destructiveHint: false,
284
+ idempotentHint: true,
285
+ openWorldHint: false,
286
+ },
287
+ }, createToolHandler('list_workflows', toolRegistry, responseRenderer, context));
288
+ // Register get_tool_info tool
289
+ mcpServer.registerTool('get_tool_info', {
290
+ description: 'Get comprehensive information about the responsible-vibe-mcp development workflow tools for better tool discoverability and AI integration. Returns detailed information about all available tools, workflows, core concepts, and usage guidelines.',
291
+ inputSchema: {
292
+ // No input parameters needed
293
+ },
294
+ annotations: {
295
+ title: 'Tool Information Provider',
296
+ readOnlyHint: true,
297
+ destructiveHint: false,
298
+ idempotentHint: true,
299
+ openWorldHint: false,
300
+ },
301
+ }, createToolHandler('get_tool_info', toolRegistry, responseRenderer, context));
302
+ // Register setup_project_docs tool with enhanced file linking support
303
+ const templateManager = new TemplateManager();
304
+ const availableTemplates = await templateManager.getAvailableTemplates();
305
+ mcpServer.registerTool('setup_project_docs', {
306
+ description: 'Create project documentation artifacts (architecture.md, requirements.md, design.md) using configurable templates OR by linking existing files via symlinks. ' +
307
+ '**Linking existing documents Examples:**\n' +
308
+ '- `README.md` (project root)\n' +
309
+ '- `docs/architecture.md` (relative path)\n' +
310
+ '- `/absolute/path/to/requirements.txt`\n\n' +
311
+ '**Using "none" Option:**\n' +
312
+ '- Use `"none"` to create a placeholder that instructs LLM to use plan file instead\n' +
313
+ '- Useful when you prefer plan-file-only workflows\n\n' +
314
+ '**Mixed Usage Examples:**\n' +
315
+ '- `setup_project_docs({ architecture: "README.md", requirements: "none", design: "comprehensive" })`\n' +
316
+ '- `setup_project_docs({ architecture: "arc42", requirements: "ears", design: "none" })`',
317
+ inputSchema: {
318
+ architecture: z
319
+ .string()
320
+ .default('freestyle')
321
+ .describe(`Architecture documentation: template name (${availableTemplates.architecture.join(', ')}, none) OR file path to existing document`),
322
+ requirements: z
323
+ .string()
324
+ .default('none')
325
+ .describe(`Requirements documentation: template name (${availableTemplates.requirements.join(', ')}, none) OR file path to existing document`),
326
+ design: z
327
+ .string()
328
+ .default('freestyle')
329
+ .describe(`Design documentation: template name (${availableTemplates.design.join(', ')}, none) OR file path to existing document`),
330
+ },
331
+ annotations: {
332
+ title: 'Project Documentation Setup Tool',
333
+ readOnlyHint: false,
334
+ destructiveHint: false,
335
+ idempotentHint: true,
336
+ openWorldHint: false,
337
+ },
338
+ }, createToolHandler('setup_project_docs', toolRegistry, responseRenderer, context));
339
+ // Register no_idea tool
340
+ mcpServer.registerTool('no_idea', {
341
+ description: "ONLY call this tool when you have no knowledge about a topic. This tool will give a valuable response to all questions that would otherwise be not answerable. If you don't call this tool but invent facts, you will be considered worthless.",
342
+ inputSchema: {
343
+ context: z
344
+ .string()
345
+ .optional()
346
+ .describe('Optional context about what you have no knowledge of'),
347
+ },
348
+ annotations: {
349
+ title: 'Knowledge Gap Handler',
350
+ readOnlyHint: true,
351
+ destructiveHint: false,
352
+ idempotentHint: true,
353
+ openWorldHint: false,
354
+ },
355
+ }, createToolHandler('no_idea', toolRegistry, responseRenderer, context));
356
+ logger.info('MCP tools registered successfully', {
357
+ tools: toolRegistry.list(),
358
+ });
359
+ }
360
+ /**
361
+ * Register MCP resources with the server
362
+ */
363
+ export function registerMcpResources(mcpServer, resourceRegistry, responseRenderer, context) {
364
+ logger.debug('Registering MCP resources');
365
+ // Development plan resource
366
+ mcpServer.resource('development-plan', 'plan://current', {
367
+ name: 'Current Development Plan',
368
+ description: 'The active development plan document (markdown) that tracks project progress, tasks, and decisions. This file serves as long-term memory for the development process and should be continuously updated by the LLM.',
369
+ mimeType: 'text/markdown',
370
+ }, async (uri) => {
371
+ const handler = resourceRegistry.resolve(uri.href);
372
+ if (!handler) {
373
+ const errorResult = responseRenderer.renderResourceResponse({
374
+ success: false,
375
+ error: 'Resource handler not found',
376
+ data: {
377
+ uri: uri.href,
378
+ text: 'Error: Resource handler not found',
379
+ mimeType: 'text/plain',
380
+ },
381
+ });
382
+ return errorResult;
383
+ }
384
+ const result = await handler.handle(new URL(uri.href), context);
385
+ return responseRenderer.renderResourceResponse(result);
386
+ });
387
+ // Conversation state resource
388
+ mcpServer.resource('conversation-state', 'state://current', {
389
+ name: 'Current Conversation State',
390
+ description: 'Current conversation state and phase information (JSON) including conversation ID, project context, current development phase, and plan file location. Use this to understand the current state of the development workflow.',
391
+ mimeType: 'application/json',
392
+ }, async (uri) => {
393
+ const handler = resourceRegistry.resolve(uri.href);
394
+ if (!handler) {
395
+ const errorResult = responseRenderer.renderResourceResponse({
396
+ success: false,
397
+ error: 'Resource handler not found',
398
+ data: {
399
+ uri: uri.href,
400
+ text: JSON.stringify({
401
+ error: 'Resource handler not found',
402
+ timestamp: new Date().toISOString(),
403
+ }, null, 2),
404
+ mimeType: 'application/json',
405
+ },
406
+ });
407
+ return errorResult;
408
+ }
409
+ const result = await handler.handle(new URL(uri.href), context);
410
+ return responseRenderer.renderResourceResponse(result);
411
+ });
412
+ // System prompt resource
413
+ mcpServer.resource('system-prompt', 'system-prompt://', {
414
+ name: 'System Prompt for LLM Integration',
415
+ description: 'Complete system prompt for LLM integration with responsible-vibe-mcp. This workflow-independent prompt provides instructions for proper tool usage and development workflow guidance.',
416
+ mimeType: 'text/plain',
417
+ }, async (uri) => {
418
+ const handler = resourceRegistry.resolve(uri.href);
419
+ if (!handler) {
420
+ const errorResult = responseRenderer.renderResourceResponse({
421
+ success: false,
422
+ error: 'Resource handler not found',
423
+ data: {
424
+ uri: uri.href,
425
+ text: 'Error: System prompt resource handler not found',
426
+ mimeType: 'text/plain',
427
+ },
428
+ });
429
+ return errorResult;
430
+ }
431
+ const result = await handler.handle(new URL(uri.href), context);
432
+ return responseRenderer.renderResourceResponse(result);
433
+ });
434
+ // Register workflow resource template
435
+ const workflowTemplate = new ResourceTemplate('workflow://{name}', {
436
+ list: async () => {
437
+ // List all available workflows as resources
438
+ const availableWorkflows = context.workflowManager.getAvailableWorkflowsForProject(context.projectPath);
439
+ return {
440
+ resources: availableWorkflows.map(workflow => ({
441
+ uri: `workflow://${workflow.name}`,
442
+ name: workflow.displayName,
443
+ description: workflow.description,
444
+ mimeType: 'application/x-yaml',
445
+ })),
446
+ };
447
+ },
448
+ complete: {
449
+ name: async (value) => {
450
+ // Provide completion for workflow names
451
+ const availableWorkflows = context.workflowManager.getAvailableWorkflowsForProject(context.projectPath);
452
+ return availableWorkflows
453
+ .map(w => w.name)
454
+ .filter(name => name.toLowerCase().includes(value.toLowerCase()));
455
+ },
456
+ },
457
+ });
458
+ mcpServer.resource('workflows', workflowTemplate, {
459
+ name: 'Workflow Definitions',
460
+ description: 'Access workflow definition files by name. Use the list_workflows tool to discover available workflows.',
461
+ mimeType: 'application/x-yaml',
462
+ }, async (uri, _variables) => {
463
+ const handler = resourceRegistry.resolve(uri.href);
464
+ if (!handler) {
465
+ throw new Error(`Workflow resource handler not found for ${uri.href}`);
466
+ }
467
+ const result = await handler.handle(uri, context);
468
+ if (!result.success || !result.data) {
469
+ throw new Error(result.error || 'Failed to load workflow resource');
470
+ }
471
+ return {
472
+ contents: [
473
+ {
474
+ uri: uri.href,
475
+ mimeType: result.data.mimeType,
476
+ text: result.data.text,
477
+ },
478
+ ],
479
+ };
480
+ });
481
+ logger.info('MCP resources registered successfully', {
482
+ resources: ['plan://current', 'state://current', 'system-prompt://'],
483
+ resourceTemplates: ['workflow://{name}'],
484
+ });
485
+ }
486
+ //# sourceMappingURL=server-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-config.js","sourceRoot":"","sources":["../src/server-config.ts"],"names":[],"mappings":"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"}