codeatlas-mcp-server 2.20.2

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 (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +338 -0
  3. package/dist/index.js +261 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/src/analyzer/parser.js +1072 -0
  6. package/dist/src/analyzer/parser.js.map +1 -0
  7. package/dist/src/analyzer/parser.test.js +73 -0
  8. package/dist/src/analyzer/parser.test.js.map +1 -0
  9. package/dist/src/analyzer/phpParser.js +147 -0
  10. package/dist/src/analyzer/phpParser.js.map +1 -0
  11. package/dist/src/analyzer/pythonParser.js +185 -0
  12. package/dist/src/analyzer/pythonParser.js.map +1 -0
  13. package/dist/src/analyzer/types.js +2 -0
  14. package/dist/src/analyzer/types.js.map +1 -0
  15. package/dist/src/context.js +3 -0
  16. package/dist/src/context.js.map +1 -0
  17. package/dist/src/memoryGenerator.js +293 -0
  18. package/dist/src/memoryGenerator.js.map +1 -0
  19. package/dist/src/oracleDatabase.js +298 -0
  20. package/dist/src/oracleDatabase.js.map +1 -0
  21. package/dist/src/presentation/httpServer.js +306 -0
  22. package/dist/src/presentation/httpServer.js.map +1 -0
  23. package/dist/src/presentation/mcpServer.js +1487 -0
  24. package/dist/src/presentation/mcpServer.js.map +1 -0
  25. package/dist/src/repositories.js +144 -0
  26. package/dist/src/repositories.js.map +1 -0
  27. package/dist/src/securityScanner.js +69 -0
  28. package/dist/src/securityScanner.js.map +1 -0
  29. package/dist/src/services/authService.js +24 -0
  30. package/dist/src/services/authService.js.map +1 -0
  31. package/dist/src/services/dreamingService.js +119 -0
  32. package/dist/src/services/dreamingService.js.map +1 -0
  33. package/dist/src/services/dreamingService.test.js +179 -0
  34. package/dist/src/services/dreamingService.test.js.map +1 -0
  35. package/dist/src/services/projectService.js +1068 -0
  36. package/dist/src/services/projectService.js.map +1 -0
  37. package/dist/src/services/projectService.test.js +217 -0
  38. package/dist/src/services/projectService.test.js.map +1 -0
  39. package/dist/src/services/watcherService.js +164 -0
  40. package/dist/src/services/watcherService.js.map +1 -0
  41. package/dist/src/services/watcherService.test.js +65 -0
  42. package/dist/src/services/watcherService.test.js.map +1 -0
  43. package/dist/src/types.js +2 -0
  44. package/dist/src/types.js.map +1 -0
  45. package/package.json +61 -0
@@ -0,0 +1,179 @@
1
+ import { describe, it, mock, before, beforeEach, afterEach } from "node:test";
2
+ import * as assert from "node:assert";
3
+ let requestMock;
4
+ let apiKeyMock;
5
+ function mockSuccessResponse(statusCode, body, capture) {
6
+ const bodyStr = typeof body === "string" ? body : JSON.stringify(body);
7
+ return (options, callback) => {
8
+ if (capture)
9
+ capture.options = options;
10
+ const mockRes = { statusCode, on(event, handler) { if (event === "data")
11
+ handler(bodyStr); if (event === "end")
12
+ handler(); } };
13
+ const mockReq = { _errorHandler: null, on(event, handler) { if (event === "error")
14
+ mockReq._errorHandler = handler; return mockReq; }, write(data) { if (capture)
15
+ capture.written = String(data); }, end() { callback(mockRes); } };
16
+ return mockReq;
17
+ };
18
+ }
19
+ function mockNetworkError(message) {
20
+ return (_options, _callback) => {
21
+ const mockReq = { _errorHandler: null, on(event, handler) { if (event === "error")
22
+ mockReq._errorHandler = handler; return mockReq; }, write() { }, end() { setImmediate(() => { if (mockReq._errorHandler)
23
+ mockReq._errorHandler(new Error(message)); }); } };
24
+ return mockReq;
25
+ };
26
+ }
27
+ describe("Dreaming Service - HTTPS Client", () => {
28
+ let dreamingService;
29
+ before(async () => {
30
+ mock.module("https", {
31
+ namedExports: {
32
+ request(options, callback) {
33
+ if (!requestMock)
34
+ throw new Error("requestMock is not set - did you forget to assign it in a test?");
35
+ return requestMock(options, callback);
36
+ },
37
+ },
38
+ });
39
+ mock.module("./projectService.js", {
40
+ namedExports: { getResolvedApiKey() { return apiKeyMock; } },
41
+ });
42
+ dreamingService = await import("./dreamingService.js");
43
+ });
44
+ beforeEach(() => {
45
+ apiKeyMock = "test-mock-key";
46
+ requestMock = null;
47
+ delete process.env.CODEATLAS_API_KEY;
48
+ });
49
+ afterEach(() => {
50
+ apiKeyMock = undefined;
51
+ requestMock = null;
52
+ });
53
+ // ----- saveDreamMemory -----
54
+ describe("saveDreamMemory()", () => {
55
+ it("returns success when API responds 200 with id", async () => {
56
+ requestMock = mockSuccessResponse(200, { id: "dream-42" });
57
+ const result = await dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" });
58
+ assert.deepStrictEqual(result, { success: true, id: "dream-42" });
59
+ });
60
+ it("uses dreamId when id is absent", async () => {
61
+ requestMock = mockSuccessResponse(200, { dreamId: "alt-99" });
62
+ const result = await dreamingService.saveDreamMemory({ memory_type: "KNOWLEDGE", content: "test" });
63
+ assert.deepStrictEqual(result, { success: true, id: "alt-99" });
64
+ });
65
+ it("falls back to unknown when no id in response", async () => {
66
+ requestMock = mockSuccessResponse(200, { ok: true });
67
+ const result = await dreamingService.saveDreamMemory({ memory_type: "PATTERN", content: "test" });
68
+ assert.deepStrictEqual(result, { success: true, id: "unknown" });
69
+ });
70
+ it("throws on 4xx", async () => {
71
+ requestMock = mockSuccessResponse(401, "Unauthorized");
72
+ await assert.rejects(() => dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" }), { message: /Failed to save dream memory: status 401/ });
73
+ });
74
+ it("throws on 5xx", async () => {
75
+ requestMock = mockSuccessResponse(500, "Error");
76
+ await assert.rejects(() => dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" }), { message: /Failed to save dream memory: status 500/ });
77
+ });
78
+ it("throws on network error", async () => {
79
+ requestMock = mockNetworkError("ECONNREFUSED");
80
+ await assert.rejects(() => dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" }), { message: /Network Error: ECONNREFUSED/ });
81
+ });
82
+ it("throws when CODEATLAS_API_KEY is not set", async () => {
83
+ apiKeyMock = undefined;
84
+ await assert.rejects(() => dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" }), { message: /CODEATLAS_API_KEY is not set/ });
85
+ });
86
+ it("sends body fields", async () => {
87
+ const capture = {};
88
+ requestMock = mockSuccessResponse(200, { id: "x" }, capture);
89
+ await dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test body", importance: 9, session_id: "s-1", project: "p" });
90
+ const parsed = JSON.parse(capture.written);
91
+ assert.strictEqual(parsed.memory_type, "MISTAKE");
92
+ assert.strictEqual(parsed.content, "test body");
93
+ assert.strictEqual(parsed.importance, 9);
94
+ assert.strictEqual(parsed.session_id, "s-1");
95
+ assert.strictEqual(parsed.project, "p");
96
+ });
97
+ it("sends apiKey in query param and x-api-key header", async () => {
98
+ process.env.CODEATLAS_API_KEY = "key-sentinel";
99
+ const capture = {};
100
+ requestMock = mockSuccessResponse(200, { id: "x" }, capture);
101
+ await dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" });
102
+ const opts = capture.options;
103
+ assert.ok(String(opts.path).includes("apiKey=key-sentinel"), `path should contain apiKey, got: ${opts.path}`);
104
+ assert.strictEqual(opts.headers["x-api-key"], "key-sentinel");
105
+ });
106
+ it("sends Chrome User-Agent", async () => {
107
+ const capture = {};
108
+ requestMock = mockSuccessResponse(200, { id: "x" }, capture);
109
+ await dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" });
110
+ assert.ok(String(capture.options.headers["User-Agent"]).includes("Chrome/125.0.0.0"));
111
+ });
112
+ });
113
+ // ----- queryDreamMemories -----
114
+ describe("queryDreamMemories()", () => {
115
+ it("returns memories array from API", async () => {
116
+ requestMock = mockSuccessResponse(200, { memories: [{ id: "m1", content: "a", memory_type: "MISTAKE", importance: 0.8, session_id: null, project: null, created_at: "2024-01-01T00:00:00Z", score: 0.95 }] });
117
+ const memories = await dreamingService.queryDreamMemories({ query: "test" });
118
+ assert.strictEqual(memories.length, 1);
119
+ assert.strictEqual(memories[0].id, "m1");
120
+ assert.strictEqual(memories[0].score, 0.95);
121
+ });
122
+ it("uses results when memories absent", async () => {
123
+ requestMock = mockSuccessResponse(200, { results: [{ id: "r1", content: "x", memory_type: "PATTERN", importance: 0.5, session_id: null, project: null, created_at: "", score: 0.7 }] });
124
+ const memories = await dreamingService.queryDreamMemories({ query: "x" });
125
+ assert.strictEqual(memories.length, 1);
126
+ assert.strictEqual(memories[0].id, "r1");
127
+ });
128
+ it("returns empty array for empty memories", async () => {
129
+ requestMock = mockSuccessResponse(200, { memories: [] });
130
+ const memories = await dreamingService.queryDreamMemories({ query: "x" });
131
+ assert.deepStrictEqual(memories, []);
132
+ });
133
+ it("throws on invalid JSON", async () => {
134
+ requestMock = mockSuccessResponse(200, "not-json");
135
+ await assert.rejects(() => dreamingService.queryDreamMemories({ query: "x" }), { message: /Failed to parse/ });
136
+ });
137
+ it("throws on non-2xx", async () => {
138
+ requestMock = mockSuccessResponse(403, "Forbidden");
139
+ await assert.rejects(() => dreamingService.queryDreamMemories({ query: "x" }), { message: /Failed to query dream memories: status 403/ });
140
+ });
141
+ it("throws on network error", async () => {
142
+ requestMock = mockNetworkError("ETIMEDOUT");
143
+ await assert.rejects(() => dreamingService.queryDreamMemories({ query: "x" }), { message: /Network Error: ETIMEDOUT/ });
144
+ });
145
+ it("throws when CODEATLAS_API_KEY is not set", async () => {
146
+ apiKeyMock = undefined;
147
+ await assert.rejects(() => dreamingService.queryDreamMemories({ query: "x" }), { message: /CODEATLAS_API_KEY is not set/ });
148
+ });
149
+ it("sends query params", async () => {
150
+ const capture = {};
151
+ requestMock = mockSuccessResponse(200, { memories: [] }, capture);
152
+ await dreamingService.queryDreamMemories({ query: "search", limit: 5, project: "my-app" });
153
+ const path = String(capture.options.path);
154
+ assert.ok(path.includes("query=search") && path.includes("limit=5") && path.includes("project=my-app"));
155
+ });
156
+ it("does NOT send limit when omitted", async () => {
157
+ const capture = {};
158
+ requestMock = mockSuccessResponse(200, { memories: [] }, capture);
159
+ await dreamingService.queryDreamMemories({ query: "search" });
160
+ assert.ok(!String(capture.options.path).includes("limit="));
161
+ });
162
+ it("includes apiKey in query params and x-api-key header for GET", async () => {
163
+ process.env.CODEATLAS_API_KEY = "test-key-query";
164
+ const capture = {};
165
+ requestMock = mockSuccessResponse(200, { memories: [] }, capture);
166
+ await dreamingService.queryDreamMemories({ query: "test" });
167
+ const path = String(capture.options.path);
168
+ assert.ok(path.includes("apiKey=test-key-query"), `Expected apiKey in query, got: ${path}`);
169
+ assert.strictEqual(capture.options.headers["x-api-key"], "test-key-query");
170
+ });
171
+ it("sends Chrome User-Agent for GET", async () => {
172
+ const capture = {};
173
+ requestMock = mockSuccessResponse(200, { memories: [] }, capture);
174
+ await dreamingService.queryDreamMemories({ query: "test" });
175
+ assert.ok(String(capture.options.headers["User-Agent"]).includes("Chrome/125.0.0.0"));
176
+ });
177
+ });
178
+ });
179
+ //# sourceMappingURL=dreamingService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dreamingService.test.js","sourceRoot":"","sources":["../../../src/services/dreamingService.test.ts"],"names":[],"mappings":"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"}