@codesherlock/codesherlock-alpha-mcp-server 0.0.1

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 (71) hide show
  1. package/.env +9 -0
  2. package/README.md +185 -0
  3. package/build/handlers/analyzeCommitHandler.d.ts +55 -0
  4. package/build/handlers/analyzeCommitHandler.d.ts.map +1 -0
  5. package/build/handlers/analyzeCommitHandler.js +345 -0
  6. package/build/handlers/analyzeCommitHandler.js.map +1 -0
  7. package/build/handlers/events.d.ts +7 -0
  8. package/build/handlers/events.d.ts.map +1 -0
  9. package/build/handlers/events.js +15 -0
  10. package/build/handlers/events.js.map +1 -0
  11. package/build/handlers/resources.d.ts +10 -0
  12. package/build/handlers/resources.d.ts.map +1 -0
  13. package/build/handlers/resources.js +14 -0
  14. package/build/handlers/resources.js.map +1 -0
  15. package/build/handlers/tools.d.ts +6 -0
  16. package/build/handlers/tools.d.ts.map +1 -0
  17. package/build/handlers/tools.js +24 -0
  18. package/build/handlers/tools.js.map +1 -0
  19. package/build/index.d.ts +3 -0
  20. package/build/index.d.ts.map +1 -0
  21. package/build/index.js +82 -0
  22. package/build/index.js.map +1 -0
  23. package/build/schemas/toolSchemas.d.ts +40 -0
  24. package/build/schemas/toolSchemas.d.ts.map +1 -0
  25. package/build/schemas/toolSchemas.js +42 -0
  26. package/build/schemas/toolSchemas.js.map +1 -0
  27. package/build/services/backendApiService.d.ts +81 -0
  28. package/build/services/backendApiService.d.ts.map +1 -0
  29. package/build/services/backendApiService.js +211 -0
  30. package/build/services/backendApiService.js.map +1 -0
  31. package/build/services/commitReviewService.d.ts +61 -0
  32. package/build/services/commitReviewService.d.ts.map +1 -0
  33. package/build/services/commitReviewService.js +306 -0
  34. package/build/services/commitReviewService.js.map +1 -0
  35. package/build/services/gitService.d.ts +120 -0
  36. package/build/services/gitService.d.ts.map +1 -0
  37. package/build/services/gitService.js +360 -0
  38. package/build/services/gitService.js.map +1 -0
  39. package/build/services/loggingService.d.ts +64 -0
  40. package/build/services/loggingService.d.ts.map +1 -0
  41. package/build/services/loggingService.js +185 -0
  42. package/build/services/loggingService.js.map +1 -0
  43. package/build/services/zipService.d.ts +9 -0
  44. package/build/services/zipService.d.ts.map +1 -0
  45. package/build/services/zipService.js +47 -0
  46. package/build/services/zipService.js.map +1 -0
  47. package/build/tests/backendApiService.test.d.ts +2 -0
  48. package/build/tests/backendApiService.test.d.ts.map +1 -0
  49. package/build/tests/backendApiService.test.js +109 -0
  50. package/build/tests/backendApiService.test.js.map +1 -0
  51. package/build/tests/commitReviewService.test.d.ts +2 -0
  52. package/build/tests/commitReviewService.test.d.ts.map +1 -0
  53. package/build/tests/commitReviewService.test.js +118 -0
  54. package/build/tests/commitReviewService.test.js.map +1 -0
  55. package/build/tests/loggingService.test.d.ts +2 -0
  56. package/build/tests/loggingService.test.d.ts.map +1 -0
  57. package/build/tests/loggingService.test.js +156 -0
  58. package/build/tests/loggingService.test.js.map +1 -0
  59. package/build/tests/setup.test.d.ts +2 -0
  60. package/build/tests/setup.test.d.ts.map +1 -0
  61. package/build/tests/setup.test.js +7 -0
  62. package/build/tests/setup.test.js.map +1 -0
  63. package/build/utils/analysisFormatter.d.ts +40 -0
  64. package/build/utils/analysisFormatter.d.ts.map +1 -0
  65. package/build/utils/analysisFormatter.js +97 -0
  66. package/build/utils/analysisFormatter.js.map +1 -0
  67. package/build/utils/errorExtractor.d.ts +36 -0
  68. package/build/utils/errorExtractor.d.ts.map +1 -0
  69. package/build/utils/errorExtractor.js +178 -0
  70. package/build/utils/errorExtractor.js.map +1 -0
  71. package/package.json +53 -0
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Analysis Formatter Utility
3
+ * Converts analysis JSON to markdown format
4
+ */
5
+ /**
6
+ * Converts a single issue dictionary into markdown format
7
+ */
8
+ export function jsonToMdIssue(issueItem, codeLanguage = "", characteristic = "") {
9
+ const language = codeLanguage.toLowerCase();
10
+ let issueMarkdown = "";
11
+ const { issue, start_line, end_line, issue_code_snippet, severity, solution, solution_code_snippet } = issueItem;
12
+ issueMarkdown += `**Issue:** ${issue}\n\n`;
13
+ if (characteristic) {
14
+ issueMarkdown += `**Quality Aspect:** ${characteristic}\n\n`;
15
+ }
16
+ issueMarkdown += `**Severity:** ${severity}\n\n`;
17
+ if (start_line && end_line) {
18
+ issueMarkdown += `**Lines:** ${start_line}-${end_line}\n\n`;
19
+ }
20
+ if (issue_code_snippet) {
21
+ issueMarkdown += `\`\`\`${language}\n${issue_code_snippet}\n\`\`\`\n\n`;
22
+ }
23
+ issueMarkdown += `**Solution:** ${solution}\n\n`;
24
+ if (solution_code_snippet) {
25
+ issueMarkdown += `\`\`\`${language}\n${solution_code_snippet}\n\`\`\`\n\n`;
26
+ }
27
+ return issueMarkdown;
28
+ }
29
+ /**
30
+ * Processes a list of analysis characteristics into markdown format
31
+ */
32
+ export function jsonToMdAnalysis(jsonList, codeLanguage = "") {
33
+ const language = codeLanguage.toLowerCase();
34
+ let analysisMarkdown = "";
35
+ for (const charEl of jsonList) {
36
+ if (charEl) {
37
+ let charMarkdown = "";
38
+ const { characteristic, description_of_characteristic, issue_items = [] } = charEl;
39
+ charMarkdown += `## ${characteristic}\n${description_of_characteristic}\n\n`;
40
+ // Separate issues by severity
41
+ const highIssues = [];
42
+ const lowIssues = [];
43
+ for (const issueItem of issue_items) {
44
+ const severity = issueItem.severity?.toLowerCase() || "";
45
+ if (severity === "critical" || severity === "high") {
46
+ highIssues.push(issueItem);
47
+ }
48
+ else if (severity === "medium" || severity === "low") {
49
+ lowIssues.push(issueItem);
50
+ }
51
+ }
52
+ // Add high/critical severity issues directly
53
+ if (highIssues.length > 0) {
54
+ for (const issue of highIssues) {
55
+ charMarkdown += jsonToMdIssue(issue, language, characteristic);
56
+ }
57
+ }
58
+ // Add medium/low severity issues inside a dropdown
59
+ if (lowIssues.length > 0) {
60
+ for (const issue of lowIssues) {
61
+ charMarkdown += jsonToMdIssue(issue, language, characteristic);
62
+ }
63
+ }
64
+ analysisMarkdown += charMarkdown;
65
+ }
66
+ }
67
+ return analysisMarkdown;
68
+ }
69
+ /**
70
+ * Formats a single file analysis result to markdown
71
+ */
72
+ export function formatFileAnalysisToMarkdown(analysis, language = "", fileName = "") {
73
+ let markdown = "";
74
+ if (fileName) {
75
+ markdown += `# Analysis for ${fileName}\n\n`;
76
+ }
77
+ if (Array.isArray(analysis)) {
78
+ markdown += jsonToMdAnalysis(analysis, language);
79
+ }
80
+ else {
81
+ markdown += "No analysis data available.\n";
82
+ }
83
+ return markdown;
84
+ }
85
+ /**
86
+ * Formats multiple file analysis results to markdown
87
+ */
88
+ export function formatMultipleFileAnalysisToMarkdown(analysisResults) {
89
+ let markdown = "# Code Analysis Results\n\n";
90
+ for (const result of analysisResults) {
91
+ markdown += `---\n\n`;
92
+ markdown += formatFileAnalysisToMarkdown(result.analysis, result.language || "", result.file_name);
93
+ markdown += "\n";
94
+ }
95
+ return markdown;
96
+ }
97
+ //# sourceMappingURL=analysisFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysisFormatter.js","sourceRoot":"","sources":["../../src/utils/analysisFormatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Error types for better categorization
3
+ */
4
+ export type ErrorType = "authentication_error" | "validation_error" | "not_found_error" | "git_error" | "websocket_error" | "api_error" | "internal_error" | "usage_limit_error" | "repository_error";
5
+ /**
6
+ * Error details extracted from error objects
7
+ */
8
+ export interface ErrorDetails {
9
+ statusCode?: number;
10
+ errorType: ErrorType;
11
+ userMessage: string;
12
+ technicalDetails: string;
13
+ retryable: boolean;
14
+ }
15
+ /**
16
+ * Helper function to extract error details from backend error messages
17
+ * Handles all edge cases from FastAPI backend including WebSocket errors, validation errors, etc.
18
+ *
19
+ * @param error - The error object or unknown error
20
+ * @param wsStatusCode - Optional WebSocket status code
21
+ * @param wsErrorMessage - Optional WebSocket error message
22
+ * @returns Extracted error details with user-friendly message and retry guidance
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * try {
27
+ * await someOperation();
28
+ * } catch (error) {
29
+ * const errorDetails = extractErrorDetails(error);
30
+ * console.log(errorDetails.userMessage); // User-friendly message
31
+ * console.log(errorDetails.retryable); // Whether to retry
32
+ * }
33
+ * ```
34
+ */
35
+ export declare function extractErrorDetails(error: Error | unknown, wsStatusCode?: number, wsErrorMessage?: string): ErrorDetails;
36
+ //# sourceMappingURL=errorExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorExtractor.d.ts","sourceRoot":"","sources":["../../src/utils/errorExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,SAAS,GACf,sBAAsB,GACtB,kBAAkB,GAClB,iBAAiB,GACjB,WAAW,GACX,iBAAiB,GACjB,WAAW,GACX,gBAAgB,GAChB,mBAAmB,GACnB,kBAAkB,CAAC;AAEzB;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,KAAK,GAAG,OAAO,EACtB,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,MAAM,GACxB,YAAY,CAgJd"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Helper function to extract error details from backend error messages
3
+ * Handles all edge cases from FastAPI backend including WebSocket errors, validation errors, etc.
4
+ *
5
+ * @param error - The error object or unknown error
6
+ * @param wsStatusCode - Optional WebSocket status code
7
+ * @param wsErrorMessage - Optional WebSocket error message
8
+ * @returns Extracted error details with user-friendly message and retry guidance
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * try {
13
+ * await someOperation();
14
+ * } catch (error) {
15
+ * const errorDetails = extractErrorDetails(error);
16
+ * console.log(errorDetails.userMessage); // User-friendly message
17
+ * console.log(errorDetails.retryable); // Whether to retry
18
+ * }
19
+ * ```
20
+ */
21
+ export function extractErrorDetails(error, wsStatusCode, wsErrorMessage) {
22
+ const errorMessage = error instanceof Error ? error.message : String(error);
23
+ const technicalDetails = errorMessage;
24
+ // Extract HTTP status code from error object or message
25
+ let statusCode = wsStatusCode;
26
+ let errorDetail = wsErrorMessage;
27
+ if (error && typeof error === "object") {
28
+ if ("statusCode" in error && !statusCode) {
29
+ statusCode = error.statusCode;
30
+ }
31
+ if ("errorDetail" in error && !errorDetail) {
32
+ errorDetail = error.errorDetail;
33
+ }
34
+ }
35
+ // Fallback: extract from error message (e.g., "HTTP error! status: 404")
36
+ if (!statusCode) {
37
+ const statusMatch = errorMessage.match(/status:\s*(\d+)/i);
38
+ statusCode = statusMatch ? parseInt(statusMatch[1], 10) : undefined;
39
+ }
40
+ // Use errorDetail if available, otherwise use errorMessage
41
+ const effectiveErrorMessage = errorDetail || errorMessage;
42
+ // Determine error type based on status code and message content
43
+ let errorType = "internal_error";
44
+ let userMessage = effectiveErrorMessage;
45
+ let retryable = false;
46
+ // Authentication errors (401)
47
+ if (statusCode === 401 || effectiveErrorMessage.includes("Authentication") || effectiveErrorMessage.includes("API key") || effectiveErrorMessage.includes("authentication required")) {
48
+ errorType = "authentication_error";
49
+ userMessage = "Authentication failed. Please check your API key configuration.";
50
+ retryable = false;
51
+ }
52
+ // Not found errors (404)
53
+ else if (statusCode === 404 || effectiveErrorMessage.includes("not found") || effectiveErrorMessage.includes("User not found") || effectiveErrorMessage.includes("WebSocket not active")) {
54
+ errorType = "not_found_error";
55
+ if (effectiveErrorMessage.includes("User not found")) {
56
+ userMessage = "User not found. Please verify your authentication.";
57
+ }
58
+ else if (effectiveErrorMessage.includes("WebSocket not active") || effectiveErrorMessage.includes("WebSocket not active for user")) {
59
+ userMessage = "WebSocket connection not active. The backend service may be unavailable. Please try again.";
60
+ }
61
+ else {
62
+ userMessage = "Resource not found.";
63
+ }
64
+ retryable = false;
65
+ }
66
+ // Validation errors (422) - covers all FastAPI validation scenarios
67
+ else if (statusCode === 422 || effectiveErrorMessage.includes("Invalid") || effectiveErrorMessage.includes("validation") || effectiveErrorMessage.includes("must contain") || effectiveErrorMessage.includes("must be")) {
68
+ errorType = "validation_error";
69
+ // Handle specific validation error messages from FastAPI backend
70
+ if (effectiveErrorMessage.includes("files.json") || effectiveErrorMessage.includes("Zip file must contain")) {
71
+ userMessage = "Invalid file format. The zip file must contain a valid 'files.json' file.";
72
+ }
73
+ else if (effectiveErrorMessage.includes("not valid UTF-8") || effectiveErrorMessage.includes("UTF-8")) {
74
+ userMessage = "Invalid file encoding. The files.json must be valid UTF-8 text.";
75
+ }
76
+ else if (effectiveErrorMessage.includes("Invalid JSON format") || effectiveErrorMessage.includes("JSONDecodeError")) {
77
+ userMessage = "Invalid JSON format in files.json. Please ensure the file contains valid JSON.";
78
+ }
79
+ else if (effectiveErrorMessage.includes("must be a list") || effectiveErrorMessage.includes("must be a dictionary")) {
80
+ userMessage = "Invalid file structure. The files.json must contain a list of file objects with 'filename', 'status', and 'new_content' fields.";
81
+ }
82
+ else if (effectiveErrorMessage.includes("No valid code files found") || effectiveErrorMessage.includes("No valid code files")) {
83
+ userMessage = "No valid code files found in the commit. Please ensure your changes include code files that can be analyzed.";
84
+ }
85
+ else if (effectiveErrorMessage.includes("No analysis results received") || effectiveErrorMessage.includes("no analysis results")) {
86
+ userMessage = "No analysis results were generated. This may occur if no valid code files were found in the commit, or if all file processing failed. Please ensure your commit contains code files that can be analyzed.";
87
+ }
88
+ else if (effectiveErrorMessage.includes("no valid results were generated") || effectiveErrorMessage.includes("All analysis results were invalid")) {
89
+ userMessage = "Analysis completed but no valid results were generated. This may occur if the files could not be analyzed or if the analysis pipeline encountered errors. Please try again or contact support.";
90
+ }
91
+ else if (effectiveErrorMessage.includes("Analysis timeout") || effectiveErrorMessage.includes("took too long")) {
92
+ userMessage = effectiveErrorMessage; // Timeout messages are already user-friendly
93
+ }
94
+ else if (effectiveErrorMessage.includes("Invalid factor") || effectiveErrorMessage.includes("valid factor")) {
95
+ userMessage = "Invalid analysis factor. Please use one of: power_analysis, owasp, or cwe.";
96
+ }
97
+ else if (effectiveErrorMessage.includes("GitHub App is not installed") || effectiveErrorMessage.includes("not installed in this repository")) {
98
+ userMessage = "CodeSherlock GitHub App is not installed in this repository. Commit review would be allowed once it is installed in this repository.";
99
+ }
100
+ else if (effectiveErrorMessage.includes("No Git repository information") || effectiveErrorMessage.includes("No Git repository information found")) {
101
+ userMessage = "No Git repository information found. To run commit review, please provide valid organization and repository names.";
102
+ }
103
+ else if (effectiveErrorMessage.includes("organization details") || effectiveErrorMessage.includes("retrieving your organization")) {
104
+ userMessage = "We ran into an issue while retrieving your organization details. Please try again later or contact support@codesherlock.ai.";
105
+ }
106
+ else if (effectiveErrorMessage.includes("usage details") || effectiveErrorMessage.includes("retrieving your usage")) {
107
+ userMessage = "We ran into an issue while retrieving your usage details. Please try again later or contact support@codesherlock.ai.";
108
+ }
109
+ else if (effectiveErrorMessage.includes("Missing keys") || effectiveErrorMessage.includes("required_keys")) {
110
+ userMessage = "Invalid file structure. Each file in files.json must have 'filename', 'status', and 'new_content' fields.";
111
+ }
112
+ else {
113
+ // Use the original error message if it's already user-friendly
114
+ userMessage = effectiveErrorMessage;
115
+ }
116
+ retryable = false;
117
+ }
118
+ // Git errors
119
+ else if (effectiveErrorMessage.includes("Git") || effectiveErrorMessage.includes("git") || effectiveErrorMessage.includes("repository") || effectiveErrorMessage.includes("commit")) {
120
+ errorType = "git_error";
121
+ userMessage = `Git operation failed: ${effectiveErrorMessage}`;
122
+ retryable = true;
123
+ }
124
+ // WebSocket errors
125
+ else if (effectiveErrorMessage.includes("WebSocket") || effectiveErrorMessage.includes("websocket") || effectiveErrorMessage.includes("Connection") || effectiveErrorMessage.includes("connection closed")) {
126
+ errorType = "websocket_error";
127
+ if (effectiveErrorMessage.includes("Connection closed unexpectedly")) {
128
+ userMessage = "WebSocket connection closed unexpectedly. Please try again.";
129
+ }
130
+ else {
131
+ userMessage = "WebSocket connection error. Please try again.";
132
+ }
133
+ retryable = true;
134
+ }
135
+ // Internal server errors (500)
136
+ else if (statusCode === 500 || effectiveErrorMessage.includes("Internal server error") || effectiveErrorMessage.includes("internal error") || effectiveErrorMessage.includes("Internal error") || effectiveErrorMessage.includes("An error occurred") || effectiveErrorMessage.includes("Failed to generate")) {
137
+ errorType = "internal_error";
138
+ if (effectiveErrorMessage.includes("Failed to generate commit review analysis") || effectiveErrorMessage.includes("commit review pipeline returned no result")) {
139
+ userMessage = "Failed to generate commit review analysis. The analysis pipeline encountered an error.";
140
+ }
141
+ else if (effectiveErrorMessage.includes("An internal error occurred before running") || effectiveErrorMessage.includes("error occurred during pre-checks")) {
142
+ userMessage = "An internal error occurred before running the analysis. Please try again later or contact support.";
143
+ }
144
+ else if (effectiveErrorMessage.includes("error occurred during commit review")) {
145
+ userMessage = "An error occurred during commit review analysis. Please try again later or contact support.";
146
+ }
147
+ else {
148
+ userMessage = "An internal server error occurred. Please try again later or contact support@codesherlock.ai.";
149
+ }
150
+ retryable = true;
151
+ }
152
+ // Usage limit errors
153
+ else if (effectiveErrorMessage.includes("usage") || effectiveErrorMessage.includes("token") || effectiveErrorMessage.includes("limit") || effectiveErrorMessage.includes("trial") || effectiveErrorMessage.includes("quota")) {
154
+ errorType = "usage_limit_error";
155
+ userMessage = effectiveErrorMessage; // These messages are usually already user-friendly
156
+ retryable = false;
157
+ }
158
+ // Other 4xx client errors
159
+ else if (statusCode && statusCode >= 400 && statusCode < 500) {
160
+ errorType = "api_error";
161
+ userMessage = effectiveErrorMessage || `Client error (${statusCode}). Please check your request and try again.`;
162
+ retryable = false;
163
+ }
164
+ // Other 5xx server errors
165
+ else if (statusCode && statusCode >= 500) {
166
+ errorType = "api_error";
167
+ userMessage = "Backend service error. Please try again later or contact support.";
168
+ retryable = true;
169
+ }
170
+ return {
171
+ statusCode,
172
+ errorType,
173
+ userMessage,
174
+ technicalDetails,
175
+ retryable,
176
+ };
177
+ }
178
+ //# sourceMappingURL=errorExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorExtractor.js","sourceRoot":"","sources":["../../src/utils/errorExtractor.ts"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,mBAAmB,CAC/B,KAAsB,EACtB,YAAqB,EACrB,cAAuB;IAEvB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5E,MAAM,gBAAgB,GAAG,YAAY,CAAC;IAEtC,wDAAwD;IACxD,IAAI,UAAU,GAAuB,YAAY,CAAC;IAClD,IAAI,WAAW,GAAuB,cAAc,CAAC;IAErD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,IAAI,YAAY,IAAI,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,UAAU,GAAI,KAAa,CAAC,UAAU,CAAC;QAC3C,CAAC;QACD,IAAI,aAAa,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YACzC,WAAW,GAAI,KAAa,CAAC,WAAW,CAAC;QAC7C,CAAC;IACL,CAAC;IAED,yEAAyE;IACzE,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC3D,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,CAAC;IAED,2DAA2D;IAC3D,MAAM,qBAAqB,GAAG,WAAW,IAAI,YAAY,CAAC;IAE1D,gEAAgE;IAChE,IAAI,SAAS,GAAc,gBAAgB,CAAC;IAC5C,IAAI,WAAW,GAAG,qBAAqB,CAAC;IACxC,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,8BAA8B;IAC9B,IAAI,UAAU,KAAK,GAAG,IAAI,qBAAqB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;QACnL,SAAS,GAAG,sBAAsB,CAAC;QACnC,WAAW,GAAG,iEAAiE,CAAC;QAChF,SAAS,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,yBAAyB;SACpB,IAAI,UAAU,KAAK,GAAG,IAAI,qBAAqB,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACvL,SAAS,GAAG,iBAAiB,CAAC;QAC9B,IAAI,qBAAqB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACnD,WAAW,GAAG,oDAAoD,CAAC;QACvE,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,CAAC;YACnI,WAAW,GAAG,4FAA4F,CAAC;QAC/G,CAAC;aAAM,CAAC;YACJ,WAAW,GAAG,qBAAqB,CAAC;QACxC,CAAC;QACD,SAAS,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,oEAAoE;SAC/D,IAAI,UAAU,KAAK,GAAG,IAAI,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACtN,SAAS,GAAG,kBAAkB,CAAC;QAE/B,iEAAiE;QACjE,IAAI,qBAAqB,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC1G,WAAW,GAAG,2EAA2E,CAAC;QAC9F,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtG,WAAW,GAAG,iEAAiE,CAAC;QACpF,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACpH,WAAW,GAAG,gFAAgF,CAAC;QACnG,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACpH,WAAW,GAAG,iIAAiI,CAAC;QACpJ,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,2BAA2B,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC9H,WAAW,GAAG,8GAA8G,CAAC;QACjI,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,8BAA8B,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACjI,WAAW,GAAG,2MAA2M,CAAC;QAC9N,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,iCAAiC,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC;YAClJ,WAAW,GAAG,gMAAgM,CAAC;QACnN,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC/G,WAAW,GAAG,qBAAqB,CAAC,CAAC,6CAA6C;QACtF,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5G,WAAW,GAAG,4EAA4E,CAAC;QAC/F,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,6BAA6B,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,CAAC;YAC7I,WAAW,GAAG,sIAAsI,CAAC;QACzJ,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,+BAA+B,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAE,CAAC;YAClJ,WAAW,GAAG,oHAAoH,CAAC;QACvI,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC;YAClI,WAAW,GAAG,6HAA6H,CAAC;QAChJ,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACpH,WAAW,GAAG,sHAAsH,CAAC;QACzI,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3G,WAAW,GAAG,2GAA2G,CAAC;QAC9H,CAAC;aAAM,CAAC;YACJ,+DAA+D;YAC/D,WAAW,GAAG,qBAAqB,CAAC;QACxC,CAAC;QACD,SAAS,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,aAAa;SACR,IAAI,qBAAqB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClL,SAAS,GAAG,WAAW,CAAC;QACxB,WAAW,GAAG,yBAAyB,qBAAqB,EAAE,CAAC;QAC/D,SAAS,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,mBAAmB;SACd,IAAI,qBAAqB,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACzM,SAAS,GAAG,iBAAiB,CAAC;QAC9B,IAAI,qBAAqB,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,CAAC;YACnE,WAAW,GAAG,6DAA6D,CAAC;QAChF,CAAC;aAAM,CAAC;YACJ,WAAW,GAAG,+CAA+C,CAAC;QAClE,CAAC;QACD,SAAS,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,+BAA+B;SAC1B,IAAI,UAAU,KAAK,GAAG,IAAI,qBAAqB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC5S,SAAS,GAAG,gBAAgB,CAAC;QAC7B,IAAI,qBAAqB,CAAC,QAAQ,CAAC,2CAA2C,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,2CAA2C,CAAC,EAAE,CAAC;YAC7J,WAAW,GAAG,wFAAwF,CAAC;QAC3G,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,2CAA2C,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,CAAC;YAC3J,WAAW,GAAG,oGAAoG,CAAC;QACvH,CAAC;aAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAE,CAAC;YAC/E,WAAW,GAAG,6FAA6F,CAAC;QAChH,CAAC;aAAM,CAAC;YACJ,WAAW,GAAG,+FAA+F,CAAC;QAClH,CAAC;QACD,SAAS,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,qBAAqB;SAChB,IAAI,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3N,SAAS,GAAG,mBAAmB,CAAC;QAChC,WAAW,GAAG,qBAAqB,CAAC,CAAC,mDAAmD;QACxF,SAAS,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,0BAA0B;SACrB,IAAI,UAAU,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QAC3D,SAAS,GAAG,WAAW,CAAC;QACxB,WAAW,GAAG,qBAAqB,IAAI,iBAAiB,UAAU,6CAA6C,CAAC;QAChH,SAAS,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,0BAA0B;SACrB,IAAI,UAAU,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;QACvC,SAAS,GAAG,WAAW,CAAC;QACxB,WAAW,GAAG,mEAAmE,CAAC;QAClF,SAAS,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,OAAO;QACH,UAAU;QACV,SAAS;QACT,WAAW;QACX,gBAAgB;QAChB,SAAS;KACZ,CAAC;AACN,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@codesherlock/codesherlock-alpha-mcp-server",
3
+ "version": "0.0.1",
4
+ "description": "A TypeScript-based Model Context Protocol (MCP) server",
5
+ "main": "build/index.js",
6
+ "bin": {
7
+ "codesherlock-mcp-server": "./build/index.js"
8
+ },
9
+ "files": [
10
+ "build",
11
+ "README.md",
12
+ ".env"
13
+ ],
14
+ "type": "module",
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsx src/index.ts",
18
+ "start": "node build/index.js",
19
+ "watch": "tsc --watch",
20
+ "prepublishOnly": "npm run build",
21
+ "prepare": "npm run build",
22
+ "test": "jest"
23
+ },
24
+ "keywords": [
25
+ "mcp",
26
+ "model-context-protocol",
27
+ "typescript",
28
+ "ai"
29
+ ],
30
+ "author": "",
31
+ "license": "MIT",
32
+ "dependencies": {
33
+ "@modelcontextprotocol/sdk": "^1.0.4",
34
+ "applicationinsights": "^3.12.1",
35
+ "archiver": "^7.0.1",
36
+ "dotenv": "^17.2.3",
37
+ "form-data": "^4.0.5",
38
+ "jszip": "^3.10.1",
39
+ "simple-git": "^3.30.0",
40
+ "ws": "^8.18.3",
41
+ "zod": "^3.24.1"
42
+ },
43
+ "devDependencies": {
44
+ "@types/archiver": "^7.0.0",
45
+ "@types/jest": "^30.0.0",
46
+ "@types/node": "^22.10.1",
47
+ "@types/ws": "^8.18.1",
48
+ "jest": "^30.2.0",
49
+ "ts-jest": "^29.4.5",
50
+ "tsx": "^4.19.2",
51
+ "typescript": "^5.7.2"
52
+ }
53
+ }