@nxuss/lemma 0.9.1 → 0.9.3

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 +74 -10
  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 +878 -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 +878 -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,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzeSecurity = analyzeSecurity;
4
+ const SECRET_PATTERNS = [
5
+ { ruleId: "sec-api-key", pattern: /(?:sk-|pk-|api[_-]?key|apikey)[\s"':=]+([A-Za-z0-9_\-]{20,})/gi, label: "API key", severity: "CRITICAL" },
6
+ { ruleId: "sec-password", pattern: /(?:password|passwd|pwd)[\s"':=]+([A-Za-z0-9!@#$%^&*()_+\-={}|;:',.<>?]{8,})/gi, label: "Password", severity: "CRITICAL" },
7
+ { ruleId: "sec-token", pattern: /(?:token|secret|auth)[\s"':=]+([A-Za-z0-9_\-\.]{16,})/gi, label: "Token/Secret", severity: "CRITICAL" },
8
+ { ruleId: "sec-private-key", pattern: /-----BEGIN\s+(RSA|EC|DSA|OPENSSH)\s+PRIVATE\s+KEY-----/, label: "Private key", severity: "CRITICAL" },
9
+ { ruleId: "sec-connection-string", pattern: /(?:mongodb|postgresql|mysql|redis):\/\/[^\s"']+/gi, label: "Connection string", severity: "CRITICAL" },
10
+ ];
11
+ const SQL_INJECTION_PATTERNS = [
12
+ { ruleId: "sec-sql-concat", pattern: /(?:SELECT|INSERT|UPDATE|DELETE)\s+.*?["'`]\s*\+\s*(?:req\.|params|body|query|input|userInput|variable)/is, label: "SQL concatenation" },
13
+ { ruleId: "sec-sql-template", pattern: /(?:query|execute|run)\s*\(\s*`[^`]*\$\{/gi, label: "SQL template injection" },
14
+ ];
15
+ const CI_PATTERNS = [
16
+ { ruleId: "sec-exec-user-input", pattern: /(?:exec|execSync|spawn|execFile)\s*\(\s*(?:`[^`]*\$\{|["'][^"']*["']\s*\+)/gi, label: "Command injection via exec/spawn", severity: "CRITICAL" },
17
+ { ruleId: "sec-eval", pattern: /\beval\s*\(\s*(?:req\.|params|body|query|input|userInput)/gi, label: "eval() with user input", severity: "CRITICAL" },
18
+ ];
19
+ const XSS_PATTERNS = [
20
+ { ruleId: "sec-inner-html", pattern: /\.innerHTML\s*=\s*(?:`[^`]*\$\{|["'][^"']*["']\s*\+)/gi, label: "innerHTML assignment", severity: "HIGH" },
21
+ { ruleId: "sec-dangerously-set", pattern: /dangerouslySetInnerHTML/gi, label: "dangerouslySetInnerHTML", severity: "MEDIUM" },
22
+ ];
23
+ const PT_PATTERNS = [
24
+ { ruleId: "sec-path-traversal", pattern: /(?:readFile|readFileSync|writeFile|writeFileSync|unlink|unlinkSync|existsSync)\s*\(\s*(?:`[^`]*\$\{|["'][^"']*["']\s*\+)/gi, label: "Path traversal risk", severity: "HIGH" },
25
+ ];
26
+ const PROTO_PATTERNS = [
27
+ { ruleId: "sec-proto-pollution", pattern: /\[["']__proto__["']\]|\.__proto__\s*=|Object\.assign\s*\(\s*\{\}/gi, label: "Prototype pollution", severity: "HIGH" },
28
+ ];
29
+ function analyzeSecurity(diffFiles) {
30
+ const findings = [];
31
+ let totalScore = 100;
32
+ for (const df of diffFiles) {
33
+ if (!df.content || df.status === "deleted")
34
+ continue;
35
+ const lines = df.content.split("\n");
36
+ const allPatterns = [
37
+ ...SECRET_PATTERNS,
38
+ ...CI_PATTERNS,
39
+ ...XSS_PATTERNS,
40
+ ...PT_PATTERNS,
41
+ ...PROTO_PATTERNS,
42
+ ];
43
+ for (const p of allPatterns) {
44
+ const matches = df.content.match(p.pattern);
45
+ if (matches) {
46
+ const lineNum = lines.findIndex(l => l.match(p.pattern)) + 1;
47
+ findings.push({
48
+ ruleId: p.ruleId,
49
+ severity: p.severity,
50
+ category: "security",
51
+ filePath: df.path,
52
+ line: lineNum > 0 ? lineNum : undefined,
53
+ message: `${p.label} detected`,
54
+ detail: `Security vulnerability: ${p.label} found in changed code.`,
55
+ suggestion: p.ruleId === "sec-api-key" ? `Remove hardcoded credentials. Use environment variables or a secrets manager.` :
56
+ p.ruleId === "sec-sql-concat" ? `Use parameterized queries or an ORM instead of string concatenation.` :
57
+ p.ruleId === "sec-exec-user-input" ? `Avoid executing user input. Use exec only with sanitized, hardcoded commands.` :
58
+ p.ruleId === "sec-inner-html" ? `Use textContent or safely sanitize HTML before assigning innerHTML.` :
59
+ `Review this code for security implications.`,
60
+ score: p.severity === "CRITICAL" ? -15 : -10,
61
+ });
62
+ }
63
+ }
64
+ for (const p of SQL_INJECTION_PATTERNS) {
65
+ const matches = df.content.match(p.pattern);
66
+ if (matches) {
67
+ const lineNum = lines.findIndex(l => l.match(p.pattern)) + 1;
68
+ findings.push({
69
+ ruleId: p.ruleId,
70
+ severity: "CRITICAL",
71
+ category: "security",
72
+ filePath: df.path,
73
+ line: lineNum > 0 ? lineNum : undefined,
74
+ message: `${p.label} detected`,
75
+ detail: `SQL injection vulnerability: building queries via string interpolation allows attackers to modify query logic.`,
76
+ suggestion: `Use parameterized queries (prepared statements) or an ORM. Never concatenate user input into SQL strings.`,
77
+ score: -15,
78
+ });
79
+ }
80
+ }
81
+ const routePattern = /router\.(get|post|put|delete|patch)\s*\(["'][^"']+["']\s*,/g;
82
+ const hasAuthMiddleware = /(?:auth|authenticate|authorize|authMiddleware|requireAuth)/.test(df.content);
83
+ const routeMatches = df.content.match(routePattern);
84
+ if (routeMatches && !hasAuthMiddleware) {
85
+ for (const rm of routeMatches) {
86
+ const isHealth = rm.includes("/health") || rm.includes("/webhook");
87
+ if (!isHealth) {
88
+ const lineNum = lines.findIndex(l => l.includes(rm.substring(0, 30))) + 1;
89
+ if (lineNum > 0) {
90
+ findings.push({
91
+ ruleId: "sec-no-auth",
92
+ severity: "HIGH",
93
+ category: "security",
94
+ filePath: df.path,
95
+ line: lineNum,
96
+ message: `New route may lack authentication middleware`,
97
+ detail: `Routes that handle user data or mutations should have auth middleware.`,
98
+ suggestion: `Add authentication middleware to this route handler.`,
99
+ score: -10,
100
+ });
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ const deduction = findings.reduce((sum, f) => sum + Math.abs(f.score), 0);
107
+ totalScore = Math.max(0, Math.min(100, totalScore - deduction));
108
+ return { findings, score: totalScore };
109
+ }
110
+ //# sourceMappingURL=SecurityScanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecurityScanner.js","sourceRoot":"","sources":["../../../../src/pr-review/analyzers/SecurityScanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Finding, DiffFile } from "../types";
2
+ export interface StaticAnalysisResult {
3
+ findings: Finding[];
4
+ score: number;
5
+ }
6
+ export declare function analyzeStatic(diffFiles: DiffFile[]): StaticAnalysisResult;
7
+ //# sourceMappingURL=StaticAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticAnalyzer.d.ts","sourceRoot":"","sources":["../../../../src/pr-review/analyzers/StaticAnalyzer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAqF7C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CA2IzE"}
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.analyzeStatic = analyzeStatic;
37
+ const ts = __importStar(require("typescript"));
38
+ function computeCyclomaticComplexity(node) {
39
+ let count = 1;
40
+ function walk(n) {
41
+ switch (n.kind) {
42
+ case ts.SyntaxKind.IfStatement:
43
+ case ts.SyntaxKind.WhileStatement:
44
+ case ts.SyntaxKind.ForStatement:
45
+ case ts.SyntaxKind.ForInStatement:
46
+ case ts.SyntaxKind.ForOfStatement:
47
+ case ts.SyntaxKind.CaseClause:
48
+ case ts.SyntaxKind.CatchClause:
49
+ case ts.SyntaxKind.ConditionalExpression:
50
+ count++;
51
+ break;
52
+ case ts.SyntaxKind.BinaryExpression: {
53
+ const bin = n;
54
+ if (bin.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken ||
55
+ bin.operatorToken.kind === ts.SyntaxKind.BarBarToken ||
56
+ bin.operatorToken.kind === ts.SyntaxKind.QuestionQuestionToken)
57
+ count++;
58
+ break;
59
+ }
60
+ }
61
+ ts.forEachChild(n, walk);
62
+ }
63
+ walk(node);
64
+ return count;
65
+ }
66
+ function computeMaxNesting(node, depth = 0) {
67
+ const nestingNodes = new Set([
68
+ ts.SyntaxKind.IfStatement, ts.SyntaxKind.WhileStatement,
69
+ ts.SyntaxKind.ForStatement, ts.SyntaxKind.ForInStatement,
70
+ ts.SyntaxKind.ForOfStatement, ts.SyntaxKind.SwitchStatement,
71
+ ts.SyntaxKind.TryStatement, ts.SyntaxKind.Block,
72
+ ]);
73
+ const isNesting = nestingNodes.has(node.kind);
74
+ const currentDepth = isNesting ? depth + 1 : depth;
75
+ let max = currentDepth;
76
+ ts.forEachChild(node, child => {
77
+ max = Math.max(max, computeMaxNesting(child, currentDepth));
78
+ });
79
+ return max;
80
+ }
81
+ const FOSSIL_PATTERNS = [
82
+ {
83
+ name: "var vs const/let",
84
+ fossilPattern: /\bvar\s+\w+/g,
85
+ modernPattern: /\b(const|let)\s+\w+/g,
86
+ fossilLabel: "var",
87
+ modernLabel: "const/let",
88
+ },
89
+ {
90
+ name: "require() vs ESM import",
91
+ fossilPattern: /\brequire\s*\(/g,
92
+ modernPattern: /^import\s+/gm,
93
+ fossilLabel: "require()",
94
+ modernLabel: "import",
95
+ },
96
+ {
97
+ name: "any vs typed generics",
98
+ fossilPattern: /:\s*any\b/g,
99
+ modernPattern: /<[A-Z]\w*>/g,
100
+ fossilLabel: ": any",
101
+ modernLabel: "generics",
102
+ },
103
+ {
104
+ name: "string concat vs template literals",
105
+ fossilPattern: /["']\s*\+\s*\w+\s*\+\s*["']/g,
106
+ modernPattern: /`[^`]*\$\{/g,
107
+ fossilLabel: "string concat",
108
+ modernLabel: "template literal",
109
+ },
110
+ ];
111
+ function analyzeStatic(diffFiles) {
112
+ const findings = [];
113
+ let totalScore = 100;
114
+ for (const df of diffFiles) {
115
+ if (!df.content || !df.path.match(/\.(ts|tsx|js|jsx)$/))
116
+ continue;
117
+ if (df.status === "deleted")
118
+ continue;
119
+ try {
120
+ const sourceFile = ts.createSourceFile(df.path, df.content, ts.ScriptTarget.Latest, true);
121
+ let functionCount = 0;
122
+ let totalCC = 0;
123
+ let maxNesting = 0;
124
+ let longFunctions = 0;
125
+ let anyCount = 0;
126
+ let typeAnnotations = 0;
127
+ function visit(node) {
128
+ const isFn = ts.isFunctionDeclaration(node) ||
129
+ ts.isMethodDeclaration(node) ||
130
+ ts.isArrowFunction(node) ||
131
+ ts.isFunctionExpression(node);
132
+ if (isFn) {
133
+ functionCount++;
134
+ const cc = computeCyclomaticComplexity(node);
135
+ const nesting = computeMaxNesting(node);
136
+ totalCC += cc;
137
+ maxNesting = Math.max(maxNesting, nesting);
138
+ const nameNode = node.name;
139
+ const fnName = nameNode ? nameNode.getText(sourceFile) : "<anonymous>";
140
+ const startLine = sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1;
141
+ const endLine = sourceFile.getLineAndCharacterOfPosition(node.getEnd()).line + 1;
142
+ const fnLines = endLine - startLine + 1;
143
+ if (fnLines > 50) {
144
+ longFunctions++;
145
+ findings.push({
146
+ ruleId: "static-fn-length",
147
+ severity: "MEDIUM",
148
+ category: "static",
149
+ filePath: df.path,
150
+ line: startLine,
151
+ message: `Function "${fnName}" is ${fnLines} lines long (max: 50)`,
152
+ detail: `Long functions are harder to test and maintain. Consider breaking it into smaller functions.`,
153
+ suggestion: `Extract logic into smaller helper functions (target < 30 lines each)`,
154
+ score: -5,
155
+ });
156
+ }
157
+ if (cc > 10) {
158
+ findings.push({
159
+ ruleId: "static-cyclomatic",
160
+ severity: "HIGH",
161
+ category: "static",
162
+ filePath: df.path,
163
+ line: startLine,
164
+ message: `Function "${fnName}" has cyclomatic complexity of ${cc} (max: 10)`,
165
+ detail: `High complexity makes code hard to test and prone to bugs.`,
166
+ suggestion: `Reduce conditional branches, extract switch cases into separate functions, use early returns.`,
167
+ score: -10,
168
+ });
169
+ }
170
+ if (nesting > 4) {
171
+ findings.push({
172
+ ruleId: "static-nesting",
173
+ severity: "MEDIUM",
174
+ category: "static",
175
+ filePath: df.path,
176
+ line: startLine,
177
+ message: `Function "${fnName}" has nesting depth of ${nesting} (max: 4)`,
178
+ detail: `Deep nesting reduces readability and increases cognitive load.`,
179
+ suggestion: `Use early returns, guard clauses, and extract nested blocks into separate functions.`,
180
+ score: -5,
181
+ });
182
+ }
183
+ }
184
+ ts.forEachChild(node, visit);
185
+ }
186
+ visit(sourceFile);
187
+ const srcText = df.content;
188
+ anyCount = (srcText.match(/:\s*any\b/g) || []).length;
189
+ typeAnnotations = (srcText.match(/:\s*\w+/g) || []).length;
190
+ if (typeAnnotations > 0) {
191
+ const anyRatio = anyCount / typeAnnotations;
192
+ if (anyRatio > 0.3) {
193
+ findings.push({
194
+ ruleId: "static-any-ratio",
195
+ severity: "MEDIUM",
196
+ category: "static",
197
+ filePath: df.path,
198
+ message: `High ": any" usage ratio (${Math.round(anyRatio * 100)}% of type annotations)`,
199
+ detail: `Excessive "any" defeats TypeScript's type checking.`,
200
+ suggestion: `Replace "any" with proper types or generics. Use "unknown" if the type is truly uncertain.`,
201
+ score: -5,
202
+ });
203
+ }
204
+ }
205
+ for (const fp of FOSSIL_PATTERNS) {
206
+ const fossilMatches = (srcText.match(fp.fossilPattern) || []).length;
207
+ if (fossilMatches > 0) {
208
+ findings.push({
209
+ ruleId: `static-fossil-${fp.name.replace(/\s+/g, "-")}`,
210
+ severity: "LOW",
211
+ category: "static",
212
+ filePath: df.path,
213
+ message: `Uses ${fp.fossilLabel} (${fossilMatches}x) — prefer ${fp.modernLabel}`,
214
+ detail: `This legacy pattern was found in new/modified code.`,
215
+ suggestion: `Replace ${fp.fossilLabel} with ${fp.modernLabel} for consistency with modern codebase standards.`,
216
+ score: -2,
217
+ });
218
+ }
219
+ }
220
+ }
221
+ catch {
222
+ findings.push({
223
+ ruleId: "static-parse-error",
224
+ severity: "LOW",
225
+ category: "static",
226
+ filePath: df.path,
227
+ message: `Could not parse file for static analysis`,
228
+ detail: `This may indicate syntax errors or unsupported syntax.`,
229
+ score: -2,
230
+ });
231
+ }
232
+ }
233
+ const deduction = findings.reduce((sum, f) => sum + Math.abs(f.score), 0);
234
+ totalScore = Math.max(0, Math.min(100, totalScore - deduction));
235
+ return { findings, score: totalScore };
236
+ }
237
+ //# sourceMappingURL=StaticAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticAnalyzer.js","sourceRoot":"","sources":["../../../../src/pr-review/analyzers/StaticAnalyzer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2FA,sCA2IC;AAtOD,+CAAiC;AAGjC,SAAS,2BAA2B,CAAC,IAAa;IAChD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,SAAS,IAAI,CAAC,CAAU;QACtB,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAC/B,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;YAClC,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;YAChC,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;YAClC,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;YAClC,KAAK,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAC9B,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAC/B,KAAK,EAAE,CAAC,UAAU,CAAC,qBAAqB;gBACtC,KAAK,EAAE,CAAC;gBACR,MAAM;YACR,KAAK,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBACpC,MAAM,GAAG,GAAG,CAAwB,CAAC;gBACrC,IACE,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;oBAChE,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;oBACpD,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,qBAAqB;oBAC9D,KAAK,EAAE,CAAC;gBACV,MAAM;YACR,CAAC;QACH,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa,EAAE,KAAK,GAAG,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;QAC3B,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC,UAAU,CAAC,cAAc;QACvD,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,cAAc;QACxD,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC,UAAU,CAAC,eAAe;QAC3D,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK;KAChD,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACnD,IAAI,GAAG,GAAG,YAAY,CAAC;IACvB,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;QAC5B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,eAAe,GAMhB;IACH;QACE,IAAI,EAAE,kBAAkB;QACxB,aAAa,EAAE,cAAc;QAC7B,aAAa,EAAE,sBAAsB;QACrC,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,WAAW;KACzB;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,aAAa,EAAE,iBAAiB;QAChC,aAAa,EAAE,cAAc;QAC7B,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE,QAAQ;KACtB;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,aAAa,EAAE,YAAY;QAC3B,aAAa,EAAE,aAAa;QAC5B,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,UAAU;KACxB;IACD;QACE,IAAI,EAAE,oCAAoC;QAC1C,aAAa,EAAE,8BAA8B;QAC7C,aAAa,EAAE,aAAa;QAC5B,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE,kBAAkB;KAChC;CACF,CAAC;AAOF,SAAgB,aAAa,CAAC,SAAqB;IACjD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,UAAU,GAAG,GAAG,CAAC;IAErB,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC;YAAE,SAAS;QAClE,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QAEtC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAE1F,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IAAI,eAAe,GAAG,CAAC,CAAC;YAExB,SAAS,KAAK,CAAC,IAAa;gBAC1B,MAAM,IAAI,GACR,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;oBAC9B,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;oBAC5B,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;oBACxB,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBAEhC,IAAI,IAAI,EAAE,CAAC;oBACT,aAAa,EAAE,CAAC;oBAChB,MAAM,EAAE,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;oBAC7C,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;oBACxC,OAAO,IAAI,EAAE,CAAC;oBACd,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBAE3C,MAAM,QAAQ,GAAI,IAAY,CAAC,IAAI,CAAC;oBACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;oBACvE,MAAM,SAAS,GAAG,UAAU,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;oBACrF,MAAM,OAAO,GAAG,UAAU,CAAC,6BAA6B,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;oBACjF,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC;oBAExC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;wBACjB,aAAa,EAAE,CAAC;wBAChB,QAAQ,CAAC,IAAI,CAAC;4BACZ,MAAM,EAAE,kBAAkB;4BAC1B,QAAQ,EAAE,QAAQ;4BAClB,QAAQ,EAAE,QAAQ;4BAClB,QAAQ,EAAE,EAAE,CAAC,IAAI;4BACjB,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,aAAa,MAAM,QAAQ,OAAO,uBAAuB;4BAClE,MAAM,EAAE,8FAA8F;4BACtG,UAAU,EAAE,sEAAsE;4BAClF,KAAK,EAAE,CAAC,CAAC;yBACV,CAAC,CAAC;oBACL,CAAC;oBAED,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;wBACZ,QAAQ,CAAC,IAAI,CAAC;4BACZ,MAAM,EAAE,mBAAmB;4BAC3B,QAAQ,EAAE,MAAM;4BAChB,QAAQ,EAAE,QAAQ;4BAClB,QAAQ,EAAE,EAAE,CAAC,IAAI;4BACjB,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,aAAa,MAAM,kCAAkC,EAAE,YAAY;4BAC5E,MAAM,EAAE,4DAA4D;4BACpE,UAAU,EAAE,+FAA+F;4BAC3G,KAAK,EAAE,CAAC,EAAE;yBACX,CAAC,CAAC;oBACL,CAAC;oBAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;wBAChB,QAAQ,CAAC,IAAI,CAAC;4BACZ,MAAM,EAAE,gBAAgB;4BACxB,QAAQ,EAAE,QAAQ;4BAClB,QAAQ,EAAE,QAAQ;4BAClB,QAAQ,EAAE,EAAE,CAAC,IAAI;4BACjB,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,aAAa,MAAM,0BAA0B,OAAO,WAAW;4BACxE,MAAM,EAAE,gEAAgE;4BACxE,UAAU,EAAE,sFAAsF;4BAClG,KAAK,EAAE,CAAC,CAAC;yBACV,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/B,CAAC;YAED,KAAK,CAAC,UAAU,CAAC,CAAC;YAElB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;YAC3B,QAAQ,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACtD,eAAe,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAE3D,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,QAAQ,GAAG,eAAe,CAAC;gBAC5C,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;oBACnB,QAAQ,CAAC,IAAI,CAAC;wBACZ,MAAM,EAAE,kBAAkB;wBAC1B,QAAQ,EAAE,QAAQ;wBAClB,QAAQ,EAAE,QAAQ;wBAClB,QAAQ,EAAE,EAAE,CAAC,IAAI;wBACjB,OAAO,EAAE,6BAA6B,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,wBAAwB;wBACxF,MAAM,EAAE,qDAAqD;wBAC7D,UAAU,EAAE,4FAA4F;wBACxG,KAAK,EAAE,CAAC,CAAC;qBACV,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;gBACjC,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACrE,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;oBACtB,QAAQ,CAAC,IAAI,CAAC;wBACZ,MAAM,EAAE,iBAAiB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;wBACvD,QAAQ,EAAE,KAAK;wBACf,QAAQ,EAAE,QAAQ;wBAClB,QAAQ,EAAE,EAAE,CAAC,IAAI;wBACjB,OAAO,EAAE,QAAQ,EAAE,CAAC,WAAW,KAAK,aAAa,eAAe,EAAE,CAAC,WAAW,EAAE;wBAChF,MAAM,EAAE,qDAAqD;wBAC7D,UAAU,EAAE,WAAW,EAAE,CAAC,WAAW,SAAS,EAAE,CAAC,WAAW,kDAAkD;wBAC9G,KAAK,EAAE,CAAC,CAAC;qBACV,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,oBAAoB;gBAC5B,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,EAAE,CAAC,IAAI;gBACjB,OAAO,EAAE,0CAA0C;gBACnD,MAAM,EAAE,wDAAwD;gBAChE,KAAK,EAAE,CAAC,CAAC;aACV,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC;IAEhE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { analyzeStatic } from "./StaticAnalyzer";
2
+ export type { StaticAnalysisResult } from "./StaticAnalyzer";
3
+ export { analyzeQuality } from "./QualityGrader";
4
+ export type { QualityAnalysisResult } from "./QualityGrader";
5
+ export { analyzeSecurity } from "./SecurityScanner";
6
+ export type { SecurityAnalysisResult } from "./SecurityScanner";
7
+ export { analyzeRegression } from "./RegressionDetector";
8
+ export type { RegressionAnalysisResult } from "./RegressionDetector";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pr-review/analyzers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzeRegression = exports.analyzeSecurity = exports.analyzeQuality = exports.analyzeStatic = void 0;
4
+ var StaticAnalyzer_1 = require("./StaticAnalyzer");
5
+ Object.defineProperty(exports, "analyzeStatic", { enumerable: true, get: function () { return StaticAnalyzer_1.analyzeStatic; } });
6
+ var QualityGrader_1 = require("./QualityGrader");
7
+ Object.defineProperty(exports, "analyzeQuality", { enumerable: true, get: function () { return QualityGrader_1.analyzeQuality; } });
8
+ var SecurityScanner_1 = require("./SecurityScanner");
9
+ Object.defineProperty(exports, "analyzeSecurity", { enumerable: true, get: function () { return SecurityScanner_1.analyzeSecurity; } });
10
+ var RegressionDetector_1 = require("./RegressionDetector");
11
+ Object.defineProperty(exports, "analyzeRegression", { enumerable: true, get: function () { return RegressionDetector_1.analyzeRegression; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/pr-review/analyzers/index.ts"],"names":[],"mappings":";;;AAAA,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAGtB,iDAAiD;AAAxC,+GAAA,cAAc,OAAA;AAGvB,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AAGxB,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA"}
@@ -0,0 +1,23 @@
1
+ import { Finding } from "../types";
2
+ interface BrainMemory {
3
+ prompt: string;
4
+ response: string;
5
+ similarity: number;
6
+ }
7
+ export declare class BrainBridge {
8
+ searchQuery(query: string, limit?: number): Promise<BrainMemory[]>;
9
+ findPriorBugs(files: string[]): Promise<Map<string, BrainMemory[]>>;
10
+ getContextualHints(files: string[], baseBranch: string): Promise<{
11
+ file: string;
12
+ hints: string[];
13
+ }[]>;
14
+ storeReview(reviewId: string, repo: string, prNumber: number, score: number, verdict: string, findings: Finding[], files: string[]): Promise<boolean>;
15
+ adjustWeightsFromHistory(files: string[], baseWeights: {
16
+ static: number;
17
+ security: number;
18
+ regression: number;
19
+ quality: number;
20
+ }): Promise<typeof baseWeights>;
21
+ }
22
+ export {};
23
+ //# sourceMappingURL=BrainBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrainBridge.d.ts","sourceRoot":"","sources":["../../../../src/pr-review/bridge/BrainBridge.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IAChB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAYrE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAWnE,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IAcrG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,OAAO,CAAC;IAyBb,wBAAwB,CAC5B,KAAK,EAAE,MAAM,EAAE,EACf,WAAW,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GACrF,OAAO,CAAC,OAAO,WAAW,CAAC;CAkC/B"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BrainBridge = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const utils_1 = require("../../mcp/utils");
9
+ class BrainBridge {
10
+ async searchQuery(query, limit = 3) {
11
+ try {
12
+ const port = (0, utils_1.getProxyPort)();
13
+ const res = await axios_1.default.get(`http://localhost:${port}/api/search?q=${encodeURIComponent(query)}&limit=${limit}`);
14
+ return (res.data.results || []).filter((r) => r.similarity >= 0.5);
15
+ }
16
+ catch {
17
+ return [];
18
+ }
19
+ }
20
+ async findPriorBugs(files) {
21
+ const results = new Map();
22
+ for (const file of files) {
23
+ const memories = await this.searchQuery(`bug ${file} error fix regression`, 2);
24
+ if (memories.length > 0) {
25
+ results.set(file, memories);
26
+ }
27
+ }
28
+ return results;
29
+ }
30
+ async getContextualHints(files, baseBranch) {
31
+ const hints = [];
32
+ for (const file of files) {
33
+ const memories = await this.searchQuery(`${file} ${baseBranch} architecture pattern`, 2);
34
+ if (memories.length > 0) {
35
+ hints.push({
36
+ file,
37
+ hints: memories.map(m => m.prompt.substring(0, 200)),
38
+ });
39
+ }
40
+ }
41
+ return hints;
42
+ }
43
+ async storeReview(reviewId, repo, prNumber, score, verdict, findings, files) {
44
+ try {
45
+ const port = (0, utils_1.getProxyPort)();
46
+ const query = `PR #${prNumber} — ${repo}: ${files.join(", ")}`;
47
+ const response = JSON.stringify({
48
+ reviewId,
49
+ score,
50
+ verdict,
51
+ findingCount: findings.length,
52
+ criticalCount: findings.filter(f => f.severity === "CRITICAL").length,
53
+ highCount: findings.filter(f => f.severity === "HIGH").length,
54
+ files,
55
+ summary: findings.map(f => `[${f.severity}] ${f.filePath}:${f.line || "?"} — ${f.message}`),
56
+ });
57
+ await axios_1.default.post(`http://localhost:${port}/api/memory/store`, {
58
+ query,
59
+ response,
60
+ provider: "pr-review",
61
+ });
62
+ return true;
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ async adjustWeightsFromHistory(files, baseWeights) {
69
+ const weights = { ...baseWeights };
70
+ const highRiskModules = [];
71
+ for (const file of files) {
72
+ const memories = await this.searchQuery(`high risk bug ${file}`, 2);
73
+ const hasBugs = memories.some(m => {
74
+ try {
75
+ const data = JSON.parse(typeof m.response === "string" ? m.response : "");
76
+ return data.criticalCount > 0 || data.highCount > 2;
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ });
82
+ if (hasBugs) {
83
+ highRiskModules.push(file);
84
+ }
85
+ }
86
+ if (highRiskModules.length > 0) {
87
+ weights.regression += 0.10;
88
+ weights.security += 0.05;
89
+ weights.static -= 0.05;
90
+ weights.quality -= 0.10;
91
+ const total = Object.values(weights).reduce((s, v) => s + v, 0);
92
+ for (const key of Object.keys(weights)) {
93
+ weights[key] = weights[key] / total;
94
+ }
95
+ }
96
+ return weights;
97
+ }
98
+ }
99
+ exports.BrainBridge = BrainBridge;
100
+ //# sourceMappingURL=BrainBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrainBridge.js","sourceRoot":"","sources":["../../../../src/pr-review/bridge/BrainBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { BrainBridge } from "./BrainBridge";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pr-review/bridge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BrainBridge = void 0;
4
+ var BrainBridge_1 = require("./BrainBridge");
5
+ Object.defineProperty(exports, "BrainBridge", { enumerable: true, get: function () { return BrainBridge_1.BrainBridge; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/pr-review/bridge/index.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAAnC,0GAAA,WAAW,OAAA"}
@@ -0,0 +1,5 @@
1
+ export { runAnalysis, parseDiff } from "./PRReviewEngine";
2
+ export type { AnalyzeResult } from "./types";
3
+ export { analyzeStatic, analyzeQuality, analyzeSecurity, analyzeRegression, } from "./analyzers";
4
+ export type { StaticAnalysisResult, QualityAnalysisResult, SecurityAnalysisResult, RegressionAnalysisResult, } from "./analyzers";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pr-review/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzeRegression = exports.analyzeSecurity = exports.analyzeQuality = exports.analyzeStatic = exports.parseDiff = exports.runAnalysis = void 0;
4
+ var PRReviewEngine_1 = require("./PRReviewEngine");
5
+ Object.defineProperty(exports, "runAnalysis", { enumerable: true, get: function () { return PRReviewEngine_1.runAnalysis; } });
6
+ Object.defineProperty(exports, "parseDiff", { enumerable: true, get: function () { return PRReviewEngine_1.parseDiff; } });
7
+ var analyzers_1 = require("./analyzers");
8
+ Object.defineProperty(exports, "analyzeStatic", { enumerable: true, get: function () { return analyzers_1.analyzeStatic; } });
9
+ Object.defineProperty(exports, "analyzeQuality", { enumerable: true, get: function () { return analyzers_1.analyzeQuality; } });
10
+ Object.defineProperty(exports, "analyzeSecurity", { enumerable: true, get: function () { return analyzers_1.analyzeSecurity; } });
11
+ Object.defineProperty(exports, "analyzeRegression", { enumerable: true, get: function () { return analyzers_1.analyzeRegression; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pr-review/index.ts"],"names":[],"mappings":";;;AAAA,mDAA0D;AAAjD,6GAAA,WAAW,OAAA;AAAE,2GAAA,SAAS,OAAA;AAE/B,yCAKqB;AAJnB,0GAAA,aAAa,OAAA;AACb,2GAAA,cAAc,OAAA;AACd,4GAAA,eAAe,OAAA;AACf,8GAAA,iBAAiB,OAAA"}
@@ -0,0 +1,25 @@
1
+ import type { GitPlatformAdapter } from "./adapters/GitPlatformAdapter";
2
+ import type { Platform, PRMetadata } from "./types";
3
+ export declare function getAdapter(platform: string, token: string): GitPlatformAdapter;
4
+ export declare function getTokenForPlatform(platform: string): string;
5
+ export interface PRReviewOptions {
6
+ autoApprove?: boolean;
7
+ threshold?: number;
8
+ context?: string;
9
+ }
10
+ export interface PRReviewOutput {
11
+ reviewId: string;
12
+ score: number;
13
+ verdict: string;
14
+ findingsCount: number;
15
+ approved: boolean;
16
+ summary: string;
17
+ }
18
+ export interface PRReviewMeta {
19
+ owner: string;
20
+ repo: string;
21
+ prNumber: number;
22
+ metadata: PRMetadata;
23
+ }
24
+ export declare function runPRReview(platform: Platform, repo: string, prNumber: number, options?: PRReviewOptions): Promise<PRReviewOutput>;
25
+ //# sourceMappingURL=reviewRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewRunner.d.ts","sourceRoot":"","sources":["../../../src/pr-review/reviewRunner.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIpD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAO9E;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgB5D;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,UAAU,CAAC;CACtB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAuFzB"}