@nxuss/lemma 0.9.1 → 0.9.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 (166) hide show
  1. package/README.md +17 -5
  2. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  3. package/dist/cjs/cli/lemma-proxy.js +52 -1
  4. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  5. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  6. package/dist/cjs/mcp/tools.js +259 -0
  7. package/dist/cjs/mcp/tools.js.map +1 -1
  8. package/dist/cjs/pr-review/PRReviewEngine.d.ts +4 -0
  9. package/dist/cjs/pr-review/PRReviewEngine.d.ts.map +1 -0
  10. package/dist/cjs/pr-review/PRReviewEngine.js +203 -0
  11. package/dist/cjs/pr-review/PRReviewEngine.js.map +1 -0
  12. package/dist/cjs/pr-review/ReviewStore.d.ts +9 -0
  13. package/dist/cjs/pr-review/ReviewStore.d.ts.map +1 -0
  14. package/dist/cjs/pr-review/ReviewStore.js +29 -0
  15. package/dist/cjs/pr-review/ReviewStore.js.map +1 -0
  16. package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.d.ts +18 -0
  17. package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.d.ts.map +1 -0
  18. package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.js +156 -0
  19. package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.js.map +1 -0
  20. package/dist/cjs/pr-review/adapters/GitHubAdapter.d.ts +18 -0
  21. package/dist/cjs/pr-review/adapters/GitHubAdapter.d.ts.map +1 -0
  22. package/dist/cjs/pr-review/adapters/GitHubAdapter.js +106 -0
  23. package/dist/cjs/pr-review/adapters/GitHubAdapter.js.map +1 -0
  24. package/dist/cjs/pr-review/adapters/GitLabAdapter.d.ts +19 -0
  25. package/dist/cjs/pr-review/adapters/GitLabAdapter.d.ts.map +1 -0
  26. package/dist/cjs/pr-review/adapters/GitLabAdapter.js +137 -0
  27. package/dist/cjs/pr-review/adapters/GitLabAdapter.js.map +1 -0
  28. package/dist/cjs/pr-review/adapters/GitPlatformAdapter.d.ts +14 -0
  29. package/dist/cjs/pr-review/adapters/GitPlatformAdapter.d.ts.map +1 -0
  30. package/dist/cjs/pr-review/adapters/GitPlatformAdapter.js +3 -0
  31. package/dist/cjs/pr-review/adapters/GitPlatformAdapter.js.map +1 -0
  32. package/dist/cjs/pr-review/adapters/index.d.ts +5 -0
  33. package/dist/cjs/pr-review/adapters/index.d.ts.map +1 -0
  34. package/dist/cjs/pr-review/adapters/index.js +10 -0
  35. package/dist/cjs/pr-review/adapters/index.js.map +1 -0
  36. package/dist/cjs/pr-review/analyzers/QualityGrader.d.ts +7 -0
  37. package/dist/cjs/pr-review/analyzers/QualityGrader.d.ts.map +1 -0
  38. package/dist/cjs/pr-review/analyzers/QualityGrader.js +154 -0
  39. package/dist/cjs/pr-review/analyzers/QualityGrader.js.map +1 -0
  40. package/dist/cjs/pr-review/analyzers/RegressionDetector.d.ts +7 -0
  41. package/dist/cjs/pr-review/analyzers/RegressionDetector.d.ts.map +1 -0
  42. package/dist/cjs/pr-review/analyzers/RegressionDetector.js +151 -0
  43. package/dist/cjs/pr-review/analyzers/RegressionDetector.js.map +1 -0
  44. package/dist/cjs/pr-review/analyzers/SecurityScanner.d.ts +7 -0
  45. package/dist/cjs/pr-review/analyzers/SecurityScanner.d.ts.map +1 -0
  46. package/dist/cjs/pr-review/analyzers/SecurityScanner.js +110 -0
  47. package/dist/cjs/pr-review/analyzers/SecurityScanner.js.map +1 -0
  48. package/dist/cjs/pr-review/analyzers/StaticAnalyzer.d.ts +7 -0
  49. package/dist/cjs/pr-review/analyzers/StaticAnalyzer.d.ts.map +1 -0
  50. package/dist/cjs/pr-review/analyzers/StaticAnalyzer.js +237 -0
  51. package/dist/cjs/pr-review/analyzers/StaticAnalyzer.js.map +1 -0
  52. package/dist/cjs/pr-review/analyzers/index.d.ts +9 -0
  53. package/dist/cjs/pr-review/analyzers/index.d.ts.map +1 -0
  54. package/dist/cjs/pr-review/analyzers/index.js +12 -0
  55. package/dist/cjs/pr-review/analyzers/index.js.map +1 -0
  56. package/dist/cjs/pr-review/bridge/BrainBridge.d.ts +23 -0
  57. package/dist/cjs/pr-review/bridge/BrainBridge.d.ts.map +1 -0
  58. package/dist/cjs/pr-review/bridge/BrainBridge.js +100 -0
  59. package/dist/cjs/pr-review/bridge/BrainBridge.js.map +1 -0
  60. package/dist/cjs/pr-review/bridge/index.d.ts +2 -0
  61. package/dist/cjs/pr-review/bridge/index.d.ts.map +1 -0
  62. package/dist/cjs/pr-review/bridge/index.js +6 -0
  63. package/dist/cjs/pr-review/bridge/index.js.map +1 -0
  64. package/dist/cjs/pr-review/index.d.ts +5 -0
  65. package/dist/cjs/pr-review/index.d.ts.map +1 -0
  66. package/dist/cjs/pr-review/index.js +12 -0
  67. package/dist/cjs/pr-review/index.js.map +1 -0
  68. package/dist/cjs/pr-review/reviewRunner.d.ts +25 -0
  69. package/dist/cjs/pr-review/reviewRunner.d.ts.map +1 -0
  70. package/dist/cjs/pr-review/reviewRunner.js +97 -0
  71. package/dist/cjs/pr-review/reviewRunner.js.map +1 -0
  72. package/dist/cjs/pr-review/types.d.ts +80 -0
  73. package/dist/cjs/pr-review/types.d.ts.map +1 -0
  74. package/dist/cjs/pr-review/types.js +3 -0
  75. package/dist/cjs/pr-review/types.js.map +1 -0
  76. package/dist/cjs/pr-review/webhook/WebhookServer.d.ts +3 -0
  77. package/dist/cjs/pr-review/webhook/WebhookServer.d.ts.map +1 -0
  78. package/dist/cjs/pr-review/webhook/WebhookServer.js +114 -0
  79. package/dist/cjs/pr-review/webhook/WebhookServer.js.map +1 -0
  80. package/dist/cjs/pr-review/webhook/index.d.ts +2 -0
  81. package/dist/cjs/pr-review/webhook/index.d.ts.map +1 -0
  82. package/dist/cjs/pr-review/webhook/index.js +6 -0
  83. package/dist/cjs/pr-review/webhook/index.js.map +1 -0
  84. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  85. package/dist/esm/cli/lemma-proxy.js +52 -1
  86. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  87. package/dist/esm/mcp/tools.d.ts.map +1 -1
  88. package/dist/esm/mcp/tools.js +259 -0
  89. package/dist/esm/mcp/tools.js.map +1 -1
  90. package/dist/esm/pr-review/PRReviewEngine.d.ts +4 -0
  91. package/dist/esm/pr-review/PRReviewEngine.d.ts.map +1 -0
  92. package/dist/esm/pr-review/PRReviewEngine.js +199 -0
  93. package/dist/esm/pr-review/PRReviewEngine.js.map +1 -0
  94. package/dist/esm/pr-review/ReviewStore.d.ts +9 -0
  95. package/dist/esm/pr-review/ReviewStore.d.ts.map +1 -0
  96. package/dist/esm/pr-review/ReviewStore.js +26 -0
  97. package/dist/esm/pr-review/ReviewStore.js.map +1 -0
  98. package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts +18 -0
  99. package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts.map +1 -0
  100. package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js +149 -0
  101. package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js.map +1 -0
  102. package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts +18 -0
  103. package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts.map +1 -0
  104. package/dist/esm/pr-review/adapters/GitHubAdapter.js +99 -0
  105. package/dist/esm/pr-review/adapters/GitHubAdapter.js.map +1 -0
  106. package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts +19 -0
  107. package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts.map +1 -0
  108. package/dist/esm/pr-review/adapters/GitLabAdapter.js +130 -0
  109. package/dist/esm/pr-review/adapters/GitLabAdapter.js.map +1 -0
  110. package/dist/esm/pr-review/adapters/GitPlatformAdapter.d.ts +14 -0
  111. package/dist/esm/pr-review/adapters/GitPlatformAdapter.d.ts.map +1 -0
  112. package/dist/esm/pr-review/adapters/GitPlatformAdapter.js +2 -0
  113. package/dist/esm/pr-review/adapters/GitPlatformAdapter.js.map +1 -0
  114. package/dist/esm/pr-review/adapters/index.d.ts +5 -0
  115. package/dist/esm/pr-review/adapters/index.d.ts.map +1 -0
  116. package/dist/esm/pr-review/adapters/index.js +4 -0
  117. package/dist/esm/pr-review/adapters/index.js.map +1 -0
  118. package/dist/esm/pr-review/analyzers/QualityGrader.d.ts +7 -0
  119. package/dist/esm/pr-review/analyzers/QualityGrader.d.ts.map +1 -0
  120. package/dist/esm/pr-review/analyzers/QualityGrader.js +151 -0
  121. package/dist/esm/pr-review/analyzers/QualityGrader.js.map +1 -0
  122. package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts +7 -0
  123. package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts.map +1 -0
  124. package/dist/esm/pr-review/analyzers/RegressionDetector.js +145 -0
  125. package/dist/esm/pr-review/analyzers/RegressionDetector.js.map +1 -0
  126. package/dist/esm/pr-review/analyzers/SecurityScanner.d.ts +7 -0
  127. package/dist/esm/pr-review/analyzers/SecurityScanner.d.ts.map +1 -0
  128. package/dist/esm/pr-review/analyzers/SecurityScanner.js +107 -0
  129. package/dist/esm/pr-review/analyzers/SecurityScanner.js.map +1 -0
  130. package/dist/esm/pr-review/analyzers/StaticAnalyzer.d.ts +7 -0
  131. package/dist/esm/pr-review/analyzers/StaticAnalyzer.d.ts.map +1 -0
  132. package/dist/esm/pr-review/analyzers/StaticAnalyzer.js +201 -0
  133. package/dist/esm/pr-review/analyzers/StaticAnalyzer.js.map +1 -0
  134. package/dist/esm/pr-review/analyzers/index.d.ts +9 -0
  135. package/dist/esm/pr-review/analyzers/index.d.ts.map +1 -0
  136. package/dist/esm/pr-review/analyzers/index.js +5 -0
  137. package/dist/esm/pr-review/analyzers/index.js.map +1 -0
  138. package/dist/esm/pr-review/bridge/BrainBridge.d.ts +23 -0
  139. package/dist/esm/pr-review/bridge/BrainBridge.d.ts.map +1 -0
  140. package/dist/esm/pr-review/bridge/BrainBridge.js +93 -0
  141. package/dist/esm/pr-review/bridge/BrainBridge.js.map +1 -0
  142. package/dist/esm/pr-review/bridge/index.d.ts +2 -0
  143. package/dist/esm/pr-review/bridge/index.d.ts.map +1 -0
  144. package/dist/esm/pr-review/bridge/index.js +2 -0
  145. package/dist/esm/pr-review/bridge/index.js.map +1 -0
  146. package/dist/esm/pr-review/index.d.ts +5 -0
  147. package/dist/esm/pr-review/index.d.ts.map +1 -0
  148. package/dist/esm/pr-review/index.js +3 -0
  149. package/dist/esm/pr-review/index.js.map +1 -0
  150. package/dist/esm/pr-review/reviewRunner.d.ts +25 -0
  151. package/dist/esm/pr-review/reviewRunner.d.ts.map +1 -0
  152. package/dist/esm/pr-review/reviewRunner.js +92 -0
  153. package/dist/esm/pr-review/reviewRunner.js.map +1 -0
  154. package/dist/esm/pr-review/types.d.ts +80 -0
  155. package/dist/esm/pr-review/types.d.ts.map +1 -0
  156. package/dist/esm/pr-review/types.js +2 -0
  157. package/dist/esm/pr-review/types.js.map +1 -0
  158. package/dist/esm/pr-review/webhook/WebhookServer.d.ts +3 -0
  159. package/dist/esm/pr-review/webhook/WebhookServer.d.ts.map +1 -0
  160. package/dist/esm/pr-review/webhook/WebhookServer.js +108 -0
  161. package/dist/esm/pr-review/webhook/WebhookServer.js.map +1 -0
  162. package/dist/esm/pr-review/webhook/index.d.ts +2 -0
  163. package/dist/esm/pr-review/webhook/index.d.ts.map +1 -0
  164. package/dist/esm/pr-review/webhook/index.js +2 -0
  165. package/dist/esm/pr-review/webhook/index.js.map +1 -0
  166. package/package.json +1 -1
@@ -0,0 +1,130 @@
1
+ import axios from "axios";
2
+ import { parseDiff } from "../PRReviewEngine";
3
+ export class GitLabAdapter {
4
+ constructor(token, baseUrl) {
5
+ this.token = token;
6
+ this.baseUrl = baseUrl || "https://gitlab.com/api/v4";
7
+ }
8
+ async validateCredentials() {
9
+ try {
10
+ const res = await axios.get(`${this.baseUrl}/user`, {
11
+ headers: { "PRIVATE-TOKEN": this.token },
12
+ });
13
+ return res.status === 200;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ getProjectId(owner, repo) {
20
+ return encodeURIComponent(`${owner}/${repo}`);
21
+ }
22
+ async getPRDiff(owner, repo, prNumber) {
23
+ const projectId = this.getProjectId(owner, repo);
24
+ const res = await axios.get(`${this.baseUrl}/projects/${projectId}/merge_requests/${prNumber}/changes`, {
25
+ headers: { "PRIVATE-TOKEN": this.token },
26
+ });
27
+ const diffs = res.data?.changes || [];
28
+ const diffContent = diffs.map((c) => `diff --git a/${c.old_path} b/${c.new_path}\n${c.diff}`).join("\n");
29
+ return parseDiff(diffContent);
30
+ }
31
+ async getPRMetadata(owner, repo, prNumber) {
32
+ const projectId = this.getProjectId(owner, repo);
33
+ const res = await axios.get(`${this.baseUrl}/projects/${projectId}/merge_requests/${prNumber}`, {
34
+ headers: { "PRIVATE-TOKEN": this.token },
35
+ });
36
+ const mr = res.data;
37
+ return {
38
+ owner,
39
+ repo,
40
+ prNumber,
41
+ title: mr.title,
42
+ description: mr.description,
43
+ baseBranch: mr.target_branch,
44
+ headBranch: mr.source_branch,
45
+ headSha: mr.diff_refs?.head_sha || "",
46
+ author: mr.author?.username || "unknown",
47
+ createdAt: mr.created_at,
48
+ updatedAt: mr.updated_at,
49
+ };
50
+ }
51
+ async getChangedFiles(owner, repo, prNumber) {
52
+ const projectId = this.getProjectId(owner, repo);
53
+ const res = await axios.get(`${this.baseUrl}/projects/${projectId}/merge_requests/${prNumber}/changes`, {
54
+ headers: { "PRIVATE-TOKEN": this.token },
55
+ });
56
+ return (res.data?.changes || []).map((c) => c.new_path);
57
+ }
58
+ async getBaseBranch(owner, repo, prNumber) {
59
+ const meta = await this.getPRMetadata(owner, repo, prNumber);
60
+ return meta.baseBranch;
61
+ }
62
+ async postComment(owner, repo, prNumber, body) {
63
+ const projectId = this.getProjectId(owner, repo);
64
+ await axios.post(`${this.baseUrl}/projects/${projectId}/merge_requests/${prNumber}/notes`, { body }, { headers: { "PRIVATE-TOKEN": this.token } });
65
+ }
66
+ async postReviewComment(owner, repo, prNumber, body, commitId, path, line) {
67
+ const projectId = this.getProjectId(owner, repo);
68
+ const positionData = {
69
+ body,
70
+ position: {
71
+ position_type: "text",
72
+ base_sha: commitId,
73
+ start_sha: commitId,
74
+ head_sha: commitId,
75
+ new_path: path,
76
+ new_line: line,
77
+ },
78
+ };
79
+ await axios.post(`${this.baseUrl}/projects/${projectId}/merge_requests/${prNumber}/discussions`, positionData, { headers: { "PRIVATE-TOKEN": this.token } });
80
+ }
81
+ async submitReview(owner, repo, prNumber, event, body) {
82
+ const projectId = this.getProjectId(owner, repo);
83
+ const approvalAction = event === "APPROVE" ? "approve" : "unapprove";
84
+ if (event === "APPROVE") {
85
+ await axios.post(`${this.baseUrl}/projects/${projectId}/merge_requests/${prNumber}/approve`, {}, { headers: { "PRIVATE-TOKEN": this.token } });
86
+ }
87
+ if (body) {
88
+ await this.postComment(owner, repo, prNumber, body);
89
+ }
90
+ }
91
+ async setStatus(owner, repo, sha, state, description) {
92
+ const projectId = this.getProjectId(owner, repo);
93
+ const statusMap = {
94
+ pending: "pending",
95
+ success: "success",
96
+ failure: "failed",
97
+ error: "failed",
98
+ };
99
+ try {
100
+ await axios.post(`${this.baseUrl}/projects/${projectId}/statuses/${sha}`, {
101
+ state: statusMap[state],
102
+ description,
103
+ name: "Lemma PR Review",
104
+ }, { headers: { "PRIVATE-TOKEN": this.token } });
105
+ }
106
+ catch {
107
+ // GitLab status API may be read-only depending on permissions
108
+ }
109
+ }
110
+ generateWorkflowYaml(config) {
111
+ return [
112
+ `# GitLab CI - Lemma PR Review`,
113
+ `# Add this to your .gitlab-ci.yml`,
114
+ `lemma-pr-review:`,
115
+ ` stage: test`,
116
+ ` only:`,
117
+ ` - merge_requests`,
118
+ ` script:`,
119
+ ` - npm install -g @nxuss/lemma`,
120
+ ` - lemma pr-review`,
121
+ ` variables:`,
122
+ ` LEMMA_LICENSE_KEY: ${"$"}{LEMMA_LICENSE_KEY}`,
123
+ ` LEMMA_PLATFORM: gitlab`,
124
+ ` LEMMA_REPO: ${"$"}{CI_PROJECT_PATH}`,
125
+ ` LEMMA_PR_NUMBER: ${"$"}{CI_MERGE_REQUEST_IID}`,
126
+ ` GITLAB_TOKEN: ${"$"}{GITLAB_TOKEN}`,
127
+ ].join("\n");
128
+ }
129
+ }
130
+ //# sourceMappingURL=GitLabAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitLabAdapter.js","sourceRoot":"","sources":["../../../../src/pr-review/adapters/GitLabAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { DiffFile, PRMetadata, ReviewEvent, StatusState, WorkflowConfig } from "../types";
2
+ export interface GitPlatformAdapter {
3
+ validateCredentials(): Promise<boolean>;
4
+ getPRDiff(owner: string, repo: string, prNumber: number): Promise<DiffFile[]>;
5
+ getPRMetadata(owner: string, repo: string, prNumber: number): Promise<PRMetadata>;
6
+ getChangedFiles(owner: string, repo: string, prNumber: number): Promise<string[]>;
7
+ getBaseBranch(owner: string, repo: string, prNumber: number): Promise<string>;
8
+ postComment(owner: string, repo: string, prNumber: number, body: string): Promise<void>;
9
+ postReviewComment(owner: string, repo: string, prNumber: number, body: string, commitId: string, path: string, line: number): Promise<void>;
10
+ submitReview(owner: string, repo: string, prNumber: number, event: ReviewEvent, body: string): Promise<void>;
11
+ setStatus(owner: string, repo: string, sha: string, state: StatusState, description: string): Promise<void>;
12
+ generateWorkflowYaml(config: WorkflowConfig): string;
13
+ }
14
+ //# sourceMappingURL=GitPlatformAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitPlatformAdapter.d.ts","sourceRoot":"","sources":["../../../../src/pr-review/adapters/GitPlatformAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1F,MAAM,WAAW,kBAAkB;IACjC,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9E,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAClF,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9E,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5I,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7G,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5G,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC;CACtD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=GitPlatformAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitPlatformAdapter.js","sourceRoot":"","sources":["../../../../src/pr-review/adapters/GitPlatformAdapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export { GitPlatformAdapter } from "./GitPlatformAdapter";
2
+ export { GitHubAdapter } from "./GitHubAdapter";
3
+ export { AzureDevOpsAdapter } from "./AzureDevOpsAdapter";
4
+ export { GitLabAdapter } from "./GitLabAdapter";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pr-review/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { GitHubAdapter } from "./GitHubAdapter";
2
+ export { AzureDevOpsAdapter } from "./AzureDevOpsAdapter";
3
+ export { GitLabAdapter } from "./GitLabAdapter";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/pr-review/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Finding, DiffFile } from "../types";
2
+ export interface QualityAnalysisResult {
3
+ findings: Finding[];
4
+ score: number;
5
+ }
6
+ export declare function analyzeQuality(diffFiles: DiffFile[], workspaceRoot: string): QualityAnalysisResult;
7
+ //# sourceMappingURL=QualityGrader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QualityGrader.d.ts","sourceRoot":"","sources":["../../../../src/pr-review/analyzers/QualityGrader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AA4B7C,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,qBAAqB,CAiJlG"}
@@ -0,0 +1,151 @@
1
+ function findTestFiles(diffFiles, workspaceRoot) {
2
+ const testPatterns = [/\.test\.(ts|tsx|js|jsx)$/, /\.spec\.(ts|tsx|js|jsx)$/, /__tests__\//];
3
+ const testFiles = diffFiles
4
+ .filter(df => testPatterns.some(p => p.test(df.path)))
5
+ .map(df => df.path);
6
+ const sourceFiles = diffFiles
7
+ .filter(df => df.path.match(/\.(ts|tsx)$/) && !testPatterns.some(p => p.test(df.path)) && df.status !== "deleted")
8
+ .map(df => df.path);
9
+ const hasTestCoverage = sourceFiles.every(src => {
10
+ const baseName = src.replace(/\.(ts|tsx)$/, "");
11
+ return testFiles.some(tf => tf.includes(baseName));
12
+ });
13
+ if (!hasTestCoverage && sourceFiles.length > 0) {
14
+ const uncovered = sourceFiles.filter(src => {
15
+ const baseName = src.replace(/\.(ts|tsx)$/, "");
16
+ return !testFiles.some(tf => tf.includes(baseName));
17
+ });
18
+ return uncovered;
19
+ }
20
+ return [];
21
+ }
22
+ export function analyzeQuality(diffFiles, workspaceRoot) {
23
+ const findings = [];
24
+ let totalScore = 100;
25
+ const hasTests = diffFiles.some(df => /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(df.path) || /__tests__\//.test(df.path));
26
+ const modifiedSourceFiles = diffFiles.filter(df => df.path.match(/\.(ts|tsx)$/) && df.status !== "deleted");
27
+ if (!hasTests && modifiedSourceFiles.length > 0) {
28
+ const uncovered = findTestFiles(diffFiles, workspaceRoot);
29
+ for (const file of uncovered) {
30
+ findings.push({
31
+ ruleId: "quality-no-tests",
32
+ severity: "HIGH",
33
+ category: "quality",
34
+ filePath: file,
35
+ message: `No test file found for modified source file`,
36
+ detail: `Changes to source files should be accompanied by corresponding tests.`,
37
+ suggestion: `Create a test file at ${file.replace(/\.(ts|tsx)$/, ".test.ts")}`,
38
+ score: -10,
39
+ });
40
+ }
41
+ }
42
+ for (const df of diffFiles) {
43
+ if (!df.content)
44
+ continue;
45
+ if (df.status === "deleted")
46
+ continue;
47
+ const lines = df.content.split("\n");
48
+ for (let i = 0; i < lines.length; i++) {
49
+ const line = lines[i];
50
+ const lineNum = i + 1;
51
+ const debugMatch = line.match(/^\s*console\.(log|debug|info)\(/);
52
+ if (debugMatch) {
53
+ findings.push({
54
+ ruleId: "quality-console-log",
55
+ severity: "MEDIUM",
56
+ category: "quality",
57
+ filePath: df.path,
58
+ line: lineNum,
59
+ message: `console.${debugMatch[1]}() left in code`,
60
+ detail: `Debugging statements should be removed before committing.`,
61
+ suggestion: `Remove this console statement or replace with a proper logger if needed for production.`,
62
+ score: -5,
63
+ });
64
+ }
65
+ if (line.includes("debugger;") || line.match(/^\s*debugger\s*;?$/)) {
66
+ findings.push({
67
+ ruleId: "quality-debugger",
68
+ severity: "HIGH",
69
+ category: "quality",
70
+ filePath: df.path,
71
+ line: lineNum,
72
+ message: `"debugger" statement found in code`,
73
+ detail: `Debugger statements will halt execution in development tools.`,
74
+ suggestion: `Remove the debugger statement before committing.`,
75
+ score: -10,
76
+ });
77
+ }
78
+ const magicNumberMatch = line.match(/(?<!\w)(\d{4,})(?!\w)/);
79
+ if (magicNumberMatch && !line.trim().startsWith("//") && !line.trim().startsWith("*")) {
80
+ const isLikelyMagic = !line.includes("const ") && !line.includes("let ") && !line.includes("import ") && !line.match(/\.\d{4}/);
81
+ if (isLikelyMagic && !df.path.match(/\.(json|css|scss|less|config\.(ts|js))$/)) {
82
+ findings.push({
83
+ ruleId: "quality-magic-number",
84
+ severity: "LOW",
85
+ category: "quality",
86
+ filePath: df.path,
87
+ line: lineNum,
88
+ message: `Magic number ${magicNumberMatch[1]} found`,
89
+ detail: `Hardcoded numbers reduce code readability and maintainability.`,
90
+ suggestion: `Extract "${magicNumberMatch[1]}" into a named constant.`,
91
+ score: -2,
92
+ });
93
+ }
94
+ }
95
+ const commentedCodeMatch = line.match(/^\s*\/\/\s*(function|class|const|let|var|if|for|while|return)\s/);
96
+ if (commentedCodeMatch) {
97
+ findings.push({
98
+ ruleId: "quality-commented-code",
99
+ severity: "LOW",
100
+ category: "quality",
101
+ filePath: df.path,
102
+ line: lineNum,
103
+ message: `Commented-out code detected`,
104
+ detail: `Commented code creates noise and can become outdated.`,
105
+ suggestion: `Remove dead code instead of commenting it out. Use version control for history.`,
106
+ score: -2,
107
+ });
108
+ }
109
+ }
110
+ if (df.path.match(/\.(ts|tsx)$/)) {
111
+ const pascalCaseType = /^[A-Z][a-z]\w+/;
112
+ const linesForNaming = df.content.split("\n");
113
+ for (let i = 0; i < linesForNaming.length; i++) {
114
+ const line = linesForNaming[i];
115
+ const lineNum = i + 1;
116
+ const interfaceMatch = line.match(/^interface\s+(\w+)/);
117
+ if (interfaceMatch && !pascalCaseType.test(interfaceMatch[1])) {
118
+ findings.push({
119
+ ruleId: "quality-naming-interface",
120
+ severity: "LOW",
121
+ category: "quality",
122
+ filePath: df.path,
123
+ line: lineNum,
124
+ message: `Interface "${interfaceMatch[1]}" should use PascalCase`,
125
+ detail: `TypeScript convention: interfaces use PascalCase.`,
126
+ suggestion: `Rename "${interfaceMatch[1]}" to "${interfaceMatch[1].charAt(0).toUpperCase() + interfaceMatch[1].slice(1)}"`,
127
+ score: -2,
128
+ });
129
+ }
130
+ const typeAliasMatch = line.match(/^type\s+(\w+)/);
131
+ if (typeAliasMatch && !pascalCaseType.test(typeAliasMatch[1])) {
132
+ findings.push({
133
+ ruleId: "quality-naming-type",
134
+ severity: "LOW",
135
+ category: "quality",
136
+ filePath: df.path,
137
+ line: lineNum,
138
+ message: `Type alias "${typeAliasMatch[1]}" should use PascalCase`,
139
+ detail: `TypeScript convention: type aliases use PascalCase.`,
140
+ suggestion: `Rename "${typeAliasMatch[1]}" to "${typeAliasMatch[1].charAt(0).toUpperCase() + typeAliasMatch[1].slice(1)}"`,
141
+ score: -2,
142
+ });
143
+ }
144
+ }
145
+ }
146
+ }
147
+ const deduction = findings.reduce((sum, f) => sum + Math.abs(f.score), 0);
148
+ totalScore = Math.max(0, Math.min(100, totalScore - deduction));
149
+ return { findings, score: totalScore };
150
+ }
151
+ //# sourceMappingURL=QualityGrader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QualityGrader.js","sourceRoot":"","sources":["../../../../src/pr-review/analyzers/QualityGrader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Finding, DiffFile } from "../types";
2
+ export interface RegressionAnalysisResult {
3
+ findings: Finding[];
4
+ score: number;
5
+ }
6
+ export declare function analyzeRegression(diffFiles: DiffFile[], workspaceRoot: string, baseBranch?: string): RegressionAnalysisResult;
7
+ //# sourceMappingURL=RegressionDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegressionDetector.d.ts","sourceRoot":"","sources":["../../../../src/pr-review/analyzers/RegressionDetector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,QAAQ,EAAE,EACrB,aAAa,EAAE,MAAM,EACrB,UAAU,GAAE,MAAe,GAC1B,wBAAwB,CAoJ1B"}
@@ -0,0 +1,145 @@
1
+ import { execSync } from "child_process";
2
+ import path from "path";
3
+ export function analyzeRegression(diffFiles, workspaceRoot, baseBranch = "main") {
4
+ const findings = [];
5
+ let totalScore = 100;
6
+ const addedOrModified = diffFiles.filter(df => df.status === "added" || df.status === "modified");
7
+ if (addedOrModified.length === 0) {
8
+ return { findings, score: totalScore };
9
+ }
10
+ const allFiles = new Set(addedOrModified.map(df => df.path));
11
+ try {
12
+ const since = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().split("T")[0];
13
+ let gitLog = "";
14
+ try {
15
+ gitLog = execSync(`git log --since="${since}" --name-only --pretty=format:"COMMIT:%H" --diff-filter=M`, { cwd: workspaceRoot, encoding: "utf8", timeout: 10000 });
16
+ }
17
+ catch {
18
+ return { findings, score: totalScore };
19
+ }
20
+ const fileChurn = new Map();
21
+ const coChangeMap = new Map();
22
+ let currentGroup = [];
23
+ for (const line of gitLog.split("\n")) {
24
+ const trimmed = line.trim();
25
+ if (trimmed.startsWith("COMMIT:")) {
26
+ currentGroup = [];
27
+ }
28
+ else if (trimmed && !trimmed.startsWith("COMMIT:")) {
29
+ currentGroup.push(trimmed);
30
+ fileChurn.set(trimmed, (fileChurn.get(trimmed) || 0) + 1);
31
+ }
32
+ }
33
+ for (const filePath of allFiles) {
34
+ const churn = fileChurn.get(filePath) || 0;
35
+ if (churn >= 10) {
36
+ findings.push({
37
+ ruleId: "reg-high-churn",
38
+ severity: "HIGH",
39
+ category: "regression",
40
+ filePath,
41
+ message: `High churn rate (${churn}x in 30 days) — statistically risky file`,
42
+ detail: `Files that change frequently have higher probability of introducing regressions.`,
43
+ suggestion: `Consider refactoring this file into smaller, more stable modules. Investigate why it changes so often.`,
44
+ score: -10,
45
+ });
46
+ }
47
+ else if (churn >= 5) {
48
+ findings.push({
49
+ ruleId: "reg-moderate-churn",
50
+ severity: "MEDIUM",
51
+ category: "regression",
52
+ filePath,
53
+ message: `Moderate churn rate (${churn}x in 30 days)`,
54
+ detail: `This file has been modified multiple times recently.`,
55
+ suggestion: `Review changes carefully for regressions. Consider if this file needs stabilization.`,
56
+ score: -5,
57
+ });
58
+ }
59
+ }
60
+ const addedExports = new Map();
61
+ const deletedExports = new Map();
62
+ for (const df of addedOrModified) {
63
+ if (!df.patch || !df.path.match(/\.(ts|tsx)$/))
64
+ continue;
65
+ const patchLines = df.patch.split("\n");
66
+ const addedDeclarations = [];
67
+ const removedDeclarations = [];
68
+ for (const pl of patchLines) {
69
+ const exportMatch = pl.match(/^\+.*\bexport\s+(?:function|class|interface|type|const|enum|default)\s+(\w+)/);
70
+ if (exportMatch)
71
+ addedDeclarations.push(exportMatch[1]);
72
+ const removedMatch = pl.match(/^-.*\bexport\s+(?:function|class|interface|type|const|enum|default)\s+(\w+)/);
73
+ if (removedMatch)
74
+ removedDeclarations.push(removedMatch[1]);
75
+ }
76
+ if (addedDeclarations.length > 0)
77
+ addedExports.set(df.path, addedDeclarations);
78
+ if (removedDeclarations.length > 0)
79
+ deletedExports.set(df.path, removedDeclarations);
80
+ }
81
+ if (deletedExports.size > 0) {
82
+ const importsToCheck = new Map();
83
+ function walkDir(dir, rel) {
84
+ try {
85
+ const entries = require("fs").readdirSync(dir, { withFileTypes: true });
86
+ for (const e of entries) {
87
+ if (["node_modules", ".git", "dist", "chroma_data", ".lemma"].includes(e.name))
88
+ continue;
89
+ const abs = path.join(dir, e.name);
90
+ const relPath = rel ? path.join(rel, e.name) : e.name;
91
+ if (e.isDirectory())
92
+ walkDir(abs, relPath);
93
+ else if (e.name.match(/\.(ts|tsx)$/) && !e.name.endsWith(".d.ts")) {
94
+ try {
95
+ const content = require("fs").readFileSync(abs, "utf8");
96
+ const importMatches = content.matchAll(/import\s+(?:\{[^}]*\}|\*\s+as\s+\w+|\w+)\s+from\s+["']([^"']+)["']/g);
97
+ for (const im of importMatches) {
98
+ if (!importsToCheck.has(im[1]))
99
+ importsToCheck.set(im[1], []);
100
+ importsToCheck.get(im[1]).push(relPath);
101
+ }
102
+ }
103
+ catch { }
104
+ }
105
+ }
106
+ }
107
+ catch { }
108
+ }
109
+ walkDir(workspaceRoot, "");
110
+ for (const [filePath, removed] of deletedExports) {
111
+ const relativePath = path.relative(workspaceRoot, filePath).replace(/\\/g, "/");
112
+ const moduleName = relativePath.replace(/\.(ts|tsx)$/, "");
113
+ const consumers = importsToCheck.get(moduleName) || importsToCheck.get("./" + moduleName) || [];
114
+ const removedNames = removed.filter(name => consumers.some(consumerPath => {
115
+ try {
116
+ const consumerContent = require("fs").readFileSync(path.join(workspaceRoot, consumerPath), "utf8");
117
+ return consumerContent.includes(name);
118
+ }
119
+ catch {
120
+ return false;
121
+ }
122
+ }));
123
+ if (removedNames.length > 0) {
124
+ findings.push({
125
+ ruleId: "reg-breaking-change",
126
+ severity: "CRITICAL",
127
+ category: "regression",
128
+ filePath: relativePath,
129
+ message: `Breaking change: removed export(s) "${removedNames.join(", ")}" used by other modules`,
130
+ detail: `Removing these exports will break consumers. Files affected: ${consumers.join(", ")}`,
131
+ suggestion: `Add deprecation warnings before removal, or update all consumers in the same PR.`,
132
+ score: -15,
133
+ });
134
+ }
135
+ }
136
+ }
137
+ }
138
+ catch {
139
+ return { findings, score: totalScore };
140
+ }
141
+ const deduction = findings.reduce((sum, f) => sum + Math.abs(f.score), 0);
142
+ totalScore = Math.max(0, Math.min(100, totalScore - deduction));
143
+ return { findings, score: totalScore };
144
+ }
145
+ //# sourceMappingURL=RegressionDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegressionDetector.js","sourceRoot":"","sources":["../../../../src/pr-review/analyzers/RegressionDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Finding, DiffFile } from "../types";
2
+ export interface SecurityAnalysisResult {
3
+ findings: Finding[];
4
+ score: number;
5
+ }
6
+ export declare function analyzeSecurity(diffFiles: DiffFile[]): SecurityAnalysisResult;
7
+ //# sourceMappingURL=SecurityScanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecurityScanner.d.ts","sourceRoot":"","sources":["../../../../src/pr-review/analyzers/SecurityScanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAiC7C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,sBAAsB,CAwF7E"}