@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.
- package/README.md +17 -5
- package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/cjs/cli/lemma-proxy.js +52 -1
- package/dist/cjs/cli/lemma-proxy.js.map +1 -1
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js +259 -0
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/pr-review/PRReviewEngine.d.ts +4 -0
- package/dist/cjs/pr-review/PRReviewEngine.d.ts.map +1 -0
- package/dist/cjs/pr-review/PRReviewEngine.js +203 -0
- package/dist/cjs/pr-review/PRReviewEngine.js.map +1 -0
- package/dist/cjs/pr-review/ReviewStore.d.ts +9 -0
- package/dist/cjs/pr-review/ReviewStore.d.ts.map +1 -0
- package/dist/cjs/pr-review/ReviewStore.js +29 -0
- package/dist/cjs/pr-review/ReviewStore.js.map +1 -0
- package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.d.ts +18 -0
- package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.d.ts.map +1 -0
- package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.js +156 -0
- package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.js.map +1 -0
- package/dist/cjs/pr-review/adapters/GitHubAdapter.d.ts +18 -0
- package/dist/cjs/pr-review/adapters/GitHubAdapter.d.ts.map +1 -0
- package/dist/cjs/pr-review/adapters/GitHubAdapter.js +106 -0
- package/dist/cjs/pr-review/adapters/GitHubAdapter.js.map +1 -0
- package/dist/cjs/pr-review/adapters/GitLabAdapter.d.ts +19 -0
- package/dist/cjs/pr-review/adapters/GitLabAdapter.d.ts.map +1 -0
- package/dist/cjs/pr-review/adapters/GitLabAdapter.js +137 -0
- package/dist/cjs/pr-review/adapters/GitLabAdapter.js.map +1 -0
- package/dist/cjs/pr-review/adapters/GitPlatformAdapter.d.ts +14 -0
- package/dist/cjs/pr-review/adapters/GitPlatformAdapter.d.ts.map +1 -0
- package/dist/cjs/pr-review/adapters/GitPlatformAdapter.js +3 -0
- package/dist/cjs/pr-review/adapters/GitPlatformAdapter.js.map +1 -0
- package/dist/cjs/pr-review/adapters/index.d.ts +5 -0
- package/dist/cjs/pr-review/adapters/index.d.ts.map +1 -0
- package/dist/cjs/pr-review/adapters/index.js +10 -0
- package/dist/cjs/pr-review/adapters/index.js.map +1 -0
- package/dist/cjs/pr-review/analyzers/QualityGrader.d.ts +7 -0
- package/dist/cjs/pr-review/analyzers/QualityGrader.d.ts.map +1 -0
- package/dist/cjs/pr-review/analyzers/QualityGrader.js +154 -0
- package/dist/cjs/pr-review/analyzers/QualityGrader.js.map +1 -0
- package/dist/cjs/pr-review/analyzers/RegressionDetector.d.ts +7 -0
- package/dist/cjs/pr-review/analyzers/RegressionDetector.d.ts.map +1 -0
- package/dist/cjs/pr-review/analyzers/RegressionDetector.js +151 -0
- package/dist/cjs/pr-review/analyzers/RegressionDetector.js.map +1 -0
- package/dist/cjs/pr-review/analyzers/SecurityScanner.d.ts +7 -0
- package/dist/cjs/pr-review/analyzers/SecurityScanner.d.ts.map +1 -0
- package/dist/cjs/pr-review/analyzers/SecurityScanner.js +110 -0
- package/dist/cjs/pr-review/analyzers/SecurityScanner.js.map +1 -0
- package/dist/cjs/pr-review/analyzers/StaticAnalyzer.d.ts +7 -0
- package/dist/cjs/pr-review/analyzers/StaticAnalyzer.d.ts.map +1 -0
- package/dist/cjs/pr-review/analyzers/StaticAnalyzer.js +237 -0
- package/dist/cjs/pr-review/analyzers/StaticAnalyzer.js.map +1 -0
- package/dist/cjs/pr-review/analyzers/index.d.ts +9 -0
- package/dist/cjs/pr-review/analyzers/index.d.ts.map +1 -0
- package/dist/cjs/pr-review/analyzers/index.js +12 -0
- package/dist/cjs/pr-review/analyzers/index.js.map +1 -0
- package/dist/cjs/pr-review/bridge/BrainBridge.d.ts +23 -0
- package/dist/cjs/pr-review/bridge/BrainBridge.d.ts.map +1 -0
- package/dist/cjs/pr-review/bridge/BrainBridge.js +100 -0
- package/dist/cjs/pr-review/bridge/BrainBridge.js.map +1 -0
- package/dist/cjs/pr-review/bridge/index.d.ts +2 -0
- package/dist/cjs/pr-review/bridge/index.d.ts.map +1 -0
- package/dist/cjs/pr-review/bridge/index.js +6 -0
- package/dist/cjs/pr-review/bridge/index.js.map +1 -0
- package/dist/cjs/pr-review/index.d.ts +5 -0
- package/dist/cjs/pr-review/index.d.ts.map +1 -0
- package/dist/cjs/pr-review/index.js +12 -0
- package/dist/cjs/pr-review/index.js.map +1 -0
- package/dist/cjs/pr-review/reviewRunner.d.ts +25 -0
- package/dist/cjs/pr-review/reviewRunner.d.ts.map +1 -0
- package/dist/cjs/pr-review/reviewRunner.js +97 -0
- package/dist/cjs/pr-review/reviewRunner.js.map +1 -0
- package/dist/cjs/pr-review/types.d.ts +80 -0
- package/dist/cjs/pr-review/types.d.ts.map +1 -0
- package/dist/cjs/pr-review/types.js +3 -0
- package/dist/cjs/pr-review/types.js.map +1 -0
- package/dist/cjs/pr-review/webhook/WebhookServer.d.ts +3 -0
- package/dist/cjs/pr-review/webhook/WebhookServer.d.ts.map +1 -0
- package/dist/cjs/pr-review/webhook/WebhookServer.js +114 -0
- package/dist/cjs/pr-review/webhook/WebhookServer.js.map +1 -0
- package/dist/cjs/pr-review/webhook/index.d.ts +2 -0
- package/dist/cjs/pr-review/webhook/index.d.ts.map +1 -0
- package/dist/cjs/pr-review/webhook/index.js +6 -0
- package/dist/cjs/pr-review/webhook/index.js.map +1 -0
- package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/esm/cli/lemma-proxy.js +52 -1
- package/dist/esm/cli/lemma-proxy.js.map +1 -1
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js +259 -0
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/pr-review/PRReviewEngine.d.ts +4 -0
- package/dist/esm/pr-review/PRReviewEngine.d.ts.map +1 -0
- package/dist/esm/pr-review/PRReviewEngine.js +199 -0
- package/dist/esm/pr-review/PRReviewEngine.js.map +1 -0
- package/dist/esm/pr-review/ReviewStore.d.ts +9 -0
- package/dist/esm/pr-review/ReviewStore.d.ts.map +1 -0
- package/dist/esm/pr-review/ReviewStore.js +26 -0
- package/dist/esm/pr-review/ReviewStore.js.map +1 -0
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts +18 -0
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts.map +1 -0
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js +149 -0
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js.map +1 -0
- package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts +18 -0
- package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts.map +1 -0
- package/dist/esm/pr-review/adapters/GitHubAdapter.js +99 -0
- package/dist/esm/pr-review/adapters/GitHubAdapter.js.map +1 -0
- package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts +19 -0
- package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts.map +1 -0
- package/dist/esm/pr-review/adapters/GitLabAdapter.js +130 -0
- package/dist/esm/pr-review/adapters/GitLabAdapter.js.map +1 -0
- package/dist/esm/pr-review/adapters/GitPlatformAdapter.d.ts +14 -0
- package/dist/esm/pr-review/adapters/GitPlatformAdapter.d.ts.map +1 -0
- package/dist/esm/pr-review/adapters/GitPlatformAdapter.js +2 -0
- package/dist/esm/pr-review/adapters/GitPlatformAdapter.js.map +1 -0
- package/dist/esm/pr-review/adapters/index.d.ts +5 -0
- package/dist/esm/pr-review/adapters/index.d.ts.map +1 -0
- package/dist/esm/pr-review/adapters/index.js +4 -0
- package/dist/esm/pr-review/adapters/index.js.map +1 -0
- package/dist/esm/pr-review/analyzers/QualityGrader.d.ts +7 -0
- package/dist/esm/pr-review/analyzers/QualityGrader.d.ts.map +1 -0
- package/dist/esm/pr-review/analyzers/QualityGrader.js +151 -0
- package/dist/esm/pr-review/analyzers/QualityGrader.js.map +1 -0
- package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts +7 -0
- package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts.map +1 -0
- package/dist/esm/pr-review/analyzers/RegressionDetector.js +145 -0
- package/dist/esm/pr-review/analyzers/RegressionDetector.js.map +1 -0
- package/dist/esm/pr-review/analyzers/SecurityScanner.d.ts +7 -0
- package/dist/esm/pr-review/analyzers/SecurityScanner.d.ts.map +1 -0
- package/dist/esm/pr-review/analyzers/SecurityScanner.js +107 -0
- package/dist/esm/pr-review/analyzers/SecurityScanner.js.map +1 -0
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.d.ts +7 -0
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.d.ts.map +1 -0
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.js +201 -0
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.js.map +1 -0
- package/dist/esm/pr-review/analyzers/index.d.ts +9 -0
- package/dist/esm/pr-review/analyzers/index.d.ts.map +1 -0
- package/dist/esm/pr-review/analyzers/index.js +5 -0
- package/dist/esm/pr-review/analyzers/index.js.map +1 -0
- package/dist/esm/pr-review/bridge/BrainBridge.d.ts +23 -0
- package/dist/esm/pr-review/bridge/BrainBridge.d.ts.map +1 -0
- package/dist/esm/pr-review/bridge/BrainBridge.js +93 -0
- package/dist/esm/pr-review/bridge/BrainBridge.js.map +1 -0
- package/dist/esm/pr-review/bridge/index.d.ts +2 -0
- package/dist/esm/pr-review/bridge/index.d.ts.map +1 -0
- package/dist/esm/pr-review/bridge/index.js +2 -0
- package/dist/esm/pr-review/bridge/index.js.map +1 -0
- package/dist/esm/pr-review/index.d.ts +5 -0
- package/dist/esm/pr-review/index.d.ts.map +1 -0
- package/dist/esm/pr-review/index.js +3 -0
- package/dist/esm/pr-review/index.js.map +1 -0
- package/dist/esm/pr-review/reviewRunner.d.ts +25 -0
- package/dist/esm/pr-review/reviewRunner.d.ts.map +1 -0
- package/dist/esm/pr-review/reviewRunner.js +92 -0
- package/dist/esm/pr-review/reviewRunner.js.map +1 -0
- package/dist/esm/pr-review/types.d.ts +80 -0
- package/dist/esm/pr-review/types.d.ts.map +1 -0
- package/dist/esm/pr-review/types.js +2 -0
- package/dist/esm/pr-review/types.js.map +1 -0
- package/dist/esm/pr-review/webhook/WebhookServer.d.ts +3 -0
- package/dist/esm/pr-review/webhook/WebhookServer.d.ts.map +1 -0
- package/dist/esm/pr-review/webhook/WebhookServer.js +108 -0
- package/dist/esm/pr-review/webhook/WebhookServer.js.map +1 -0
- package/dist/esm/pr-review/webhook/index.d.ts +2 -0
- package/dist/esm/pr-review/webhook/index.d.ts.map +1 -0
- package/dist/esm/pr-review/webhook/index.js +2 -0
- package/dist/esm/pr-review/webhook/index.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# š§ Lemma v0.9.
|
|
1
|
+
# š§ Lemma v0.9.2
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@nxuss/lemma)
|
|
4
4
|
[](https://github.com/Nxusbets/lemma/blob/main/LICENSE)
|
|
5
|
-
[](https://github.com/Nxusbets/lemma)
|
|
6
6
|
[](https://github.com/Nxusbets/lemma)
|
|
7
7
|
[](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 **
|
|
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.
|
|
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":";
|
|
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) {
|