@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
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # 🧠 Lemma v0.9.1
1
+ # 🧠 Lemma v0.9.2
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/@nxuss/lemma.svg?color=orange&style=flat-square)](https://www.npmjs.com/package/@nxuss/lemma)
4
4
  [![License](https://img.shields.io/npm/l/@nxuss/lemma.svg?color=blue&style=flat-square)](https://github.com/Nxusbets/lemma/blob/main/LICENSE)
5
- [![MCP Tools](https://img.shields.io/badge/MCP%20tools-32-ff69b4?style=flat-square)](https://github.com/Nxusbets/lemma)
5
+ [![MCP Tools](https://img.shields.io/badge/MCP%20tools-36-ff69b4?style=flat-square)](https://github.com/Nxusbets/lemma)
6
6
  [![Security](https://img.shields.io/badge/privacy-firewall%20active-blueviolet?style=flat-square)](https://github.com/Nxusbets/lemma)
7
7
  [![Caching](https://img.shields.io/badge/semantic%20memory-enabled-success?style=flat-square)](https://github.com/Nxusbets/lemma)
8
8
 
@@ -16,7 +16,7 @@
16
16
 
17
17
  > **The Intelligent local-first AI Gateway — Privacy, Performance, and Static Code Intelligence for the Agentic Era.**
18
18
 
19
- Lemma is a high-performance orchestration layer that sits between your development environment and LLM providers. It transforms the way you build with AI by providing **Shared Semantic Memory**, **Autonomous Cost Optimization**, **Privacy Guardrails**, and a suite of **32 MCP tools** — including zero-token static code intelligence that runs entirely on your machine with no LLM calls required.
19
+ Lemma is a high-performance orchestration layer that sits between your development environment and LLM providers. It transforms the way you build with AI by providing **Shared Semantic Memory**, **Autonomous Cost Optimization**, **Privacy Guardrails**, and a suite of **36 MCP tools** — including zero-token static code intelligence that runs entirely on your machine with no LLM calls required.
20
20
 
21
21
  ---
22
22
 
@@ -95,7 +95,7 @@ lemma start
95
95
 
96
96
  | Command | Action |
97
97
  | :--- | :--- |
98
- | `lemma init` | Bootstraps config and auto-configures MCP for Claude Desktop, Cursor, Windsurf, Kiro, VS Code. |
98
+ | `lemma init` | Bootstraps config and auto-configures MCP for OpenCode, Claude Desktop, Cursor, Windsurf, Kiro, VS Code. |
99
99
  | `lemma start` | Launches proxy, cache engine, and dashboard at `http://localhost:8081`. |
100
100
  | `lemma stop` | Gracefully shuts down the background proxy. |
101
101
  | `lemma status` | Health of all modules and active connections. |
@@ -123,6 +123,9 @@ lemma start
123
123
 
124
124
  Add Lemma to any MCP-compatible IDE in seconds:
125
125
 
126
+ ### OpenCode (Terminal AI)
127
+ Just run `lemma init`. Lemma automatically registers its MCP server in your `~/.opencode.json` and injects its autonomous rules so OpenCode works with zero configuration.
128
+
126
129
  ### Cursor / Windsurf / Kiro / Antigravity
127
130
  1. Go to **Settings → MCP**
128
131
  2. Add new server: **Command** = `lemma mcp`
@@ -143,7 +146,7 @@ Once connected, your IDE gains access to all **32 MCP tools** and Lemma auto-inj
143
146
 
144
147
  ---
145
148
 
146
- ## šŸ› ļø MCP Tools Reference (v0.9.0 — 32 Tools)
149
+ ## šŸ› ļø MCP Tools Reference (v0.9.2 — 36 Tools)
147
150
 
148
151
  ### šŸ—‚ļø Workspace Tools
149
152
 
@@ -204,6 +207,15 @@ Once connected, your IDE gains access to all **32 MCP tools** and Lemma auto-inj
204
207
  | `semantic_dedup_guard` | **Brain dedup firewall.** Before calling `store_memory`, pass content through here. If similarity ≄ 92% → rejects as duplicate. If 75–91% → warns and shows the similar entry. Keeps The Brain lean and dense. |
205
208
  | `dead_export_necromancer` | **Dead code auditor.** Maps every `export` in the workspace against every `import`. Symbols exported but never imported anywhere = zombie code inflating your context. Reports dead exports by file with estimated token waste. |
206
209
 
210
+ ### šŸ” PR Review Agent Tools (NEW in v0.9.2)
211
+
212
+ | Tool | Description |
213
+ | :--- | :--- |
214
+ | `review_diff` | Analyze a raw diff for bugs, security issues, and best practices before committing. |
215
+ | `review_pr` | Full PR review against a Git platform (GitHub, Azure DevOps, GitLab). Runs all 4 analyzers (Static, Security, Regression, Quality) and stores results in The Brain. |
216
+ | `pr_status` | Query the last review status and report for a given PR number and platform. |
217
+ | `generate_pr_workflow` | Generate a CI/CD workflow YAML (GitHub Actions or Azure Pipelines) that runs `lemma pr-review` as a step. |
218
+
207
219
  ### ⚔ TurboMode Auto-Injection
208
220
 
209
221
  When connected via `lemma mcp`, Lemma auto-injects 7 rules into the agent's system prompt on handshake:
@@ -1 +1 @@
1
- {"version":3,"file":"lemma-proxy.d.ts","sourceRoot":"","sources":["../../../src/cli/lemma-proxy.ts"],"names":[],"mappings":";AAsbA,wBAAgB,+BAA+B,CAAC,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA4DvF;AAmgED,wBAAsB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6KhL"}
1
+ {"version":3,"file":"lemma-proxy.d.ts","sourceRoot":"","sources":["../../../src/cli/lemma-proxy.ts"],"names":[],"mappings":";AA2cA,wBAAgB,+BAA+B,CAAC,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA4DvF;AAugED,wBAAsB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6KhL"}
@@ -43,6 +43,7 @@ function ask(query) {
43
43
  const ComplexityRouter_1 = __importDefault(require("../proxy/ComplexityRouter"));
44
44
  const SemanticScrubber_1 = __importDefault(require("../security/SemanticScrubber"));
45
45
  const CloudSyncClient_1 = __importDefault(require("../cloud/CloudSyncClient"));
46
+ const reviewRunner_1 = require("../pr-review/reviewRunner");
46
47
  const ContextSqueezer_1 = require("../utils/ContextSqueezer");
47
48
  const AgentMultiplexer_1 = require("../proxy/AgentMultiplexer");
48
49
  const SseRelay_1 = require("../proxy/SseRelay");
@@ -373,6 +374,26 @@ enabled = true
373
374
  }
374
375
  }
375
376
  catch { }
377
+ // Register lemma MCP server in OpenCode user config (~/.opencode.json)
378
+ const openCodeMcpFile = path_1.default.join(os_1.default.homedir(), '.opencode.json');
379
+ try {
380
+ let openCodeConfig = {};
381
+ if (fs_1.default.existsSync(openCodeMcpFile)) {
382
+ openCodeConfig = JSON.parse(fs_1.default.readFileSync(openCodeMcpFile, 'utf8'));
383
+ }
384
+ if (!openCodeConfig.mcp)
385
+ openCodeConfig.mcp = {};
386
+ if (!openCodeConfig.mcp.lemma) {
387
+ openCodeConfig.mcp.lemma = {
388
+ command: "npx",
389
+ args: ["-y", "@nxuss/lemma", "mcp"],
390
+ enabled: true
391
+ };
392
+ fs_1.default.writeFileSync(openCodeMcpFile, JSON.stringify(openCodeConfig, null, 2));
393
+ console.log('āœ… [OpenCode] Registered lemma MCP server in ~/.opencode.json');
394
+ }
395
+ }
396
+ catch { }
376
397
  console.log(`āœ… Auto-configured Lemma for [${project}]`);
377
398
  }
378
399
  const EVENT_LOG = [];
@@ -423,6 +444,7 @@ function injectIdeRules(projectName) {
423
444
  { name: 'Cursor (v2)', path: path_1.default.join(process.cwd(), '.cursor/rules/lemma.mdc') },
424
445
  { name: 'Windsurf', path: path_1.default.join(process.cwd(), '.windsurfrules') },
425
446
  { name: 'Cline', path: path_1.default.join(process.cwd(), '.clinerules') },
447
+ { name: 'OpenCode', path: path_1.default.join(process.cwd(), '.opencode.md') },
426
448
  ];
427
449
  for (const target of rulesTargets) {
428
450
  try {
@@ -1514,6 +1536,9 @@ class LemmaServer {
1514
1536
  });
1515
1537
  this.app.get('/dashboard/*', (req, res) => res.sendFile(path_1.default.join(this.dashboardPath, 'index.html')));
1516
1538
  }
1539
+ // Mount PR Review webhook endpoints
1540
+ const { createWebhookRouter } = require('../pr-review/webhook/WebhookServer');
1541
+ this.app.use('/api/webhook', createWebhookRouter());
1517
1542
  }
1518
1543
  startWorkspaceTimeWatcher() {
1519
1544
  const cwd = process.cwd();
@@ -2338,7 +2363,7 @@ commander_1.program.command('init')
2338
2363
  console.log('\n🧠 \x1b[35mAuto-configuring MCP for AI IDEs...\x1b[0m');
2339
2364
  }
2340
2365
  else {
2341
- const ans = await ask('\n🧠 Configure MCP servers for your IDEs (Claude, Cursor, Windsurf, VS Code, Kiro, Codex)? (Y/n): ');
2366
+ const ans = await ask('\n🧠 Configure MCP servers for your IDEs (Claude, Cursor, Windsurf, VS Code, OpenCode, Kiro, Codex)? (Y/n): ');
2342
2367
  if (ans.toLowerCase() === 'n' || ans.toLowerCase() === 'no') {
2343
2368
  opts.configure = false;
2344
2369
  console.log('ā­ļø Skipping IDE auto-configuration');
@@ -2614,6 +2639,32 @@ commander_1.program.command('clipboard')
2614
2639
  process.exit(1);
2615
2640
  }
2616
2641
  });
2642
+ commander_1.program.command('pr-review')
2643
+ .description('Run PR review via CLI (reads env vars for CI/CD: LEMMA_PLATFORM, LEMMA_REPO, LEMMA_PR_NUMBER)')
2644
+ .option('-p, --platform <platform>', 'Git platform (github, azure, gitlab)')
2645
+ .option('-r, --repo <repo>', 'Repository (owner/repo)')
2646
+ .option('-n, --pr-number <number>', 'PR number')
2647
+ .option('-t, --threshold <number>', 'Score threshold for auto-approve', '90')
2648
+ .option('--no-auto-approve', 'Skip auto-approve even if score meets threshold')
2649
+ .action(async (opts) => {
2650
+ const platform = opts.platform || process.env.LEMMA_PLATFORM || '';
2651
+ const repo = opts.repo || process.env.LEMMA_REPO || '';
2652
+ const prNumber = opts.prNumber || process.env.LEMMA_PR_NUMBER || '';
2653
+ const threshold = parseInt(opts.threshold, 10);
2654
+ const autoApprove = opts.autoApprove !== false;
2655
+ if (!platform || !repo || !prNumber) {
2656
+ console.error('Error: platform, repo, and pr-number are required.\nSet via args or LEMMA_PLATFORM, LEMMA_REPO, LEMMA_PR_NUMBER env vars.');
2657
+ process.exit(1);
2658
+ }
2659
+ try {
2660
+ const result = await (0, reviewRunner_1.runPRReview)(platform, repo, parseInt(prNumber, 10), { threshold, autoApprove });
2661
+ console.log(JSON.stringify(result, null, 2));
2662
+ }
2663
+ catch (err) {
2664
+ console.error(`PR review failed: ${err.message}`);
2665
+ process.exit(1);
2666
+ }
2667
+ });
2617
2668
  if (process.argv[1] && (process.argv[1].includes('lemma') || process.argv[1].endsWith('.cjs') || process.argv[1].endsWith('.js'))) {
2618
2669
  // Bare `lemma` with no args → show welcome screen
2619
2670
  if (process.argv.length <= 2) {