@nxuss/lemma 1.1.1 → 1.2.1
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 +148 -9
- package/bin/init.js +135 -84
- package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/cjs/cli/lemma-proxy.js +2 -0
- package/dist/cjs/cli/lemma-proxy.js.map +1 -1
- package/dist/cjs/infra/analyzers/DriftDetector.d.ts +4 -0
- package/dist/cjs/infra/analyzers/DriftDetector.d.ts.map +1 -0
- package/dist/cjs/infra/analyzers/DriftDetector.js +88 -0
- package/dist/cjs/infra/analyzers/DriftDetector.js.map +1 -0
- package/dist/cjs/infra/analyzers/InfraAnalyzer.d.ts +3 -0
- package/dist/cjs/infra/analyzers/InfraAnalyzer.d.ts.map +1 -0
- package/dist/cjs/infra/analyzers/InfraAnalyzer.js +73 -0
- package/dist/cjs/infra/analyzers/InfraAnalyzer.js.map +1 -0
- package/dist/cjs/infra/analyzers/MonolithAnalyzer.d.ts +3 -0
- package/dist/cjs/infra/analyzers/MonolithAnalyzer.d.ts.map +1 -0
- package/dist/cjs/infra/analyzers/MonolithAnalyzer.js +180 -0
- package/dist/cjs/infra/analyzers/MonolithAnalyzer.js.map +1 -0
- package/dist/cjs/infra/analyzers/index.d.ts +4 -0
- package/dist/cjs/infra/analyzers/index.d.ts.map +1 -0
- package/dist/cjs/infra/analyzers/index.js +11 -0
- package/dist/cjs/infra/analyzers/index.js.map +1 -0
- package/dist/cjs/infra/cli.d.ts +2 -0
- package/dist/cjs/infra/cli.d.ts.map +1 -0
- package/dist/cjs/infra/cli.js +221 -0
- package/dist/cjs/infra/cli.js.map +1 -0
- package/dist/cjs/infra/config.d.ts +17 -0
- package/dist/cjs/infra/config.d.ts.map +1 -0
- package/dist/cjs/infra/config.js +111 -0
- package/dist/cjs/infra/config.js.map +1 -0
- package/dist/cjs/infra/index.d.ts +8 -0
- package/dist/cjs/infra/index.d.ts.map +1 -0
- package/dist/cjs/infra/index.js +28 -0
- package/dist/cjs/infra/index.js.map +1 -0
- package/dist/cjs/infra/mcp-tools.d.ts +16 -0
- package/dist/cjs/infra/mcp-tools.d.ts.map +1 -0
- package/dist/cjs/infra/mcp-tools.js +456 -0
- package/dist/cjs/infra/mcp-tools.js.map +1 -0
- package/dist/cjs/infra/providers/InfraProvider.d.ts +9 -0
- package/dist/cjs/infra/providers/InfraProvider.d.ts.map +1 -0
- package/dist/cjs/infra/providers/InfraProvider.js +3 -0
- package/dist/cjs/infra/providers/InfraProvider.js.map +1 -0
- package/dist/cjs/infra/providers/JenkinsProvider.d.ts +16 -0
- package/dist/cjs/infra/providers/JenkinsProvider.d.ts.map +1 -0
- package/dist/cjs/infra/providers/JenkinsProvider.js +188 -0
- package/dist/cjs/infra/providers/JenkinsProvider.js.map +1 -0
- package/dist/cjs/infra/providers/OKDProvider.d.ts +24 -0
- package/dist/cjs/infra/providers/OKDProvider.d.ts.map +1 -0
- package/dist/cjs/infra/providers/OKDProvider.js +292 -0
- package/dist/cjs/infra/providers/OKDProvider.js.map +1 -0
- package/dist/cjs/infra/providers/TerraformProvider.d.ts +17 -0
- package/dist/cjs/infra/providers/TerraformProvider.d.ts.map +1 -0
- package/dist/cjs/infra/providers/TerraformProvider.js +109 -0
- package/dist/cjs/infra/providers/TerraformProvider.js.map +1 -0
- package/dist/cjs/infra/providers/index.d.ts +9 -0
- package/dist/cjs/infra/providers/index.d.ts.map +1 -0
- package/dist/cjs/infra/providers/index.js +34 -0
- package/dist/cjs/infra/providers/index.js.map +1 -0
- package/dist/cjs/infra/templates/jenkins/index.d.ts +15 -0
- package/dist/cjs/infra/templates/jenkins/index.d.ts.map +1 -0
- package/dist/cjs/infra/templates/jenkins/index.js +124 -0
- package/dist/cjs/infra/templates/jenkins/index.js.map +1 -0
- package/dist/cjs/infra/templates/okd/index.d.ts +31 -0
- package/dist/cjs/infra/templates/okd/index.d.ts.map +1 -0
- package/dist/cjs/infra/templates/okd/index.js +149 -0
- package/dist/cjs/infra/templates/okd/index.js.map +1 -0
- package/dist/cjs/infra/types.d.ts +128 -0
- package/dist/cjs/infra/types.d.ts.map +1 -0
- package/dist/cjs/infra/types.js +4 -0
- package/dist/cjs/infra/types.js.map +1 -0
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js +9 -1
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/esm/cli/lemma-proxy.js +2 -0
- package/dist/esm/cli/lemma-proxy.js.map +1 -1
- package/dist/esm/infra/analyzers/DriftDetector.d.ts +4 -0
- package/dist/esm/infra/analyzers/DriftDetector.d.ts.map +1 -0
- package/dist/esm/infra/analyzers/DriftDetector.js +84 -0
- package/dist/esm/infra/analyzers/DriftDetector.js.map +1 -0
- package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts +3 -0
- package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts.map +1 -0
- package/dist/esm/infra/analyzers/InfraAnalyzer.js +70 -0
- package/dist/esm/infra/analyzers/InfraAnalyzer.js.map +1 -0
- package/dist/esm/infra/analyzers/MonolithAnalyzer.d.ts +3 -0
- package/dist/esm/infra/analyzers/MonolithAnalyzer.d.ts.map +1 -0
- package/dist/esm/infra/analyzers/MonolithAnalyzer.js +174 -0
- package/dist/esm/infra/analyzers/MonolithAnalyzer.js.map +1 -0
- package/dist/esm/infra/analyzers/index.d.ts +4 -0
- package/dist/esm/infra/analyzers/index.d.ts.map +1 -0
- package/dist/esm/infra/analyzers/index.js +4 -0
- package/dist/esm/infra/analyzers/index.js.map +1 -0
- package/dist/esm/infra/cli.d.ts +2 -0
- package/dist/esm/infra/cli.d.ts.map +1 -0
- package/dist/esm/infra/cli.js +218 -0
- package/dist/esm/infra/cli.js.map +1 -0
- package/dist/esm/infra/config.d.ts +17 -0
- package/dist/esm/infra/config.d.ts.map +1 -0
- package/dist/esm/infra/config.js +101 -0
- package/dist/esm/infra/config.js.map +1 -0
- package/dist/esm/infra/index.d.ts +8 -0
- package/dist/esm/infra/index.d.ts.map +1 -0
- package/dist/esm/infra/index.js +9 -0
- package/dist/esm/infra/index.js.map +1 -0
- package/dist/esm/infra/mcp-tools.d.ts +16 -0
- package/dist/esm/infra/mcp-tools.d.ts.map +1 -0
- package/dist/esm/infra/mcp-tools.js +451 -0
- package/dist/esm/infra/mcp-tools.js.map +1 -0
- package/dist/esm/infra/providers/InfraProvider.d.ts +9 -0
- package/dist/esm/infra/providers/InfraProvider.d.ts.map +1 -0
- package/dist/esm/infra/providers/InfraProvider.js +2 -0
- package/dist/esm/infra/providers/InfraProvider.js.map +1 -0
- package/dist/esm/infra/providers/JenkinsProvider.d.ts +16 -0
- package/dist/esm/infra/providers/JenkinsProvider.d.ts.map +1 -0
- package/dist/esm/infra/providers/JenkinsProvider.js +181 -0
- package/dist/esm/infra/providers/JenkinsProvider.js.map +1 -0
- package/dist/esm/infra/providers/OKDProvider.d.ts +24 -0
- package/dist/esm/infra/providers/OKDProvider.d.ts.map +1 -0
- package/dist/esm/infra/providers/OKDProvider.js +288 -0
- package/dist/esm/infra/providers/OKDProvider.js.map +1 -0
- package/dist/esm/infra/providers/TerraformProvider.d.ts +17 -0
- package/dist/esm/infra/providers/TerraformProvider.d.ts.map +1 -0
- package/dist/esm/infra/providers/TerraformProvider.js +105 -0
- package/dist/esm/infra/providers/TerraformProvider.js.map +1 -0
- package/dist/esm/infra/providers/index.d.ts +9 -0
- package/dist/esm/infra/providers/index.d.ts.map +1 -0
- package/dist/esm/infra/providers/index.js +27 -0
- package/dist/esm/infra/providers/index.js.map +1 -0
- package/dist/esm/infra/templates/jenkins/index.d.ts +15 -0
- package/dist/esm/infra/templates/jenkins/index.d.ts.map +1 -0
- package/dist/esm/infra/templates/jenkins/index.js +120 -0
- package/dist/esm/infra/templates/jenkins/index.js.map +1 -0
- package/dist/esm/infra/templates/okd/index.d.ts +31 -0
- package/dist/esm/infra/templates/okd/index.d.ts.map +1 -0
- package/dist/esm/infra/templates/okd/index.js +142 -0
- package/dist/esm/infra/templates/okd/index.js.map +1 -0
- package/dist/esm/infra/types.d.ts +128 -0
- package/dist/esm/infra/types.d.ts.map +1 -0
- package/dist/esm/infra/types.js +3 -0
- package/dist/esm/infra/types.js.map +1 -0
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js +9 -1
- package/dist/esm/mcp/tools.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
# 🧠 Lemma v1.
|
|
1
|
+
# 🧠 Lemma v1.2.0
|
|
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
|
-
[](https://github.com/Nxusbets/lemma)
|
|
9
9
|
|
|
10
10
|
```text
|
|
11
11
|
__
|
|
@@ -15,15 +15,93 @@
|
|
|
15
15
|
/_____/\___/_/ /_/ /_/_/ /_/ /_/\__,_/
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
> **The Intelligent local-first AI Gateway — Privacy, Performance,
|
|
18
|
+
> **The Intelligent local-first AI Gateway — Privacy, Performance, Static Code Intelligence, and Infrastructure Command Center for the Agentic Era.**
|
|
19
19
|
|
|
20
|
-
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 **
|
|
20
|
+
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**, **22 Infrastructure Management Tools**, and a suite of **84 MCP tools** — including zero-token static code intelligence that runs entirely on your machine with no LLM calls required.
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
24
24
|
## 📋 Changelog
|
|
25
25
|
|
|
26
|
-
### v1.
|
|
26
|
+
### v1.2.0 — Infrastructure Command Center *(NEW)*
|
|
27
|
+
|
|
28
|
+
**22 new tools, all FREE**, for managing Jenkins, OKD/OpenShift, and Terraform deployments:
|
|
29
|
+
|
|
30
|
+
#### 🆓 Infrastructure Tools Added in v1.2.0
|
|
31
|
+
|
|
32
|
+
| Tool | Category | Description |
|
|
33
|
+
| :--- | :--- | :--- |
|
|
34
|
+
| `infra_discover` | Discovery | Auto-detect Jenkins, OKD, and Terraform in the environment |
|
|
35
|
+
| `infra_connect` | Discovery | Connect to an infrastructure provider with credentials |
|
|
36
|
+
| `infra_status` | Monitoring | Consolidated status of all connected providers |
|
|
37
|
+
| `infra_health_check` | Monitoring | Detailed health check with latency and version info |
|
|
38
|
+
| `infra_diagnose` | Troubleshooting | Analyze issues and suggest fixes (caches solutions in TheBrain) |
|
|
39
|
+
| `infra_analyze_monolith` | Migration | Analyze monolith codebase for microservice migration |
|
|
40
|
+
| `infra_suggest_split` | Migration | Suggest microservice split points based on coupling analysis |
|
|
41
|
+
| `jenkins_generate_pipeline` | CI/CD | Generate Jenkinsfile (standard or multibranch) |
|
|
42
|
+
| `jenkins_trigger_build` | CI/CD | Trigger Jenkins build (semi-automated) |
|
|
43
|
+
| `jenkins_build_status` | Monitoring | Get Jenkins build status, duration, and URL |
|
|
44
|
+
| `jenkins_logs` | Troubleshooting | Get last 80 lines of Jenkins build console output |
|
|
45
|
+
| `okd_generate_manifests` | Deploy | Generate OKD manifests (DC, BC, IS, Route, Service) |
|
|
46
|
+
| `okd_apply` | Deploy | Apply OKD manifests (semi-automated with dry-run) |
|
|
47
|
+
| `okd_status` | Monitoring | Compact pod/build/route status summary |
|
|
48
|
+
| `okd_logs` | Troubleshooting | Get pod logs filtered by severity |
|
|
49
|
+
| `okd_events` | Troubleshooting | Recent cluster events for debugging |
|
|
50
|
+
| `okd_describe` | Troubleshooting | Describe any OKD resource |
|
|
51
|
+
| `okd_route_url` | Deploy | Get external URL for an OKD route |
|
|
52
|
+
| `terraform_plan` | IaC | Run terraform plan (returns only changes) |
|
|
53
|
+
| `terraform_apply` | IaC | Run terraform apply (semi-automated) |
|
|
54
|
+
| `terraform_state_list` | Monitoring | List resources in Terraform state |
|
|
55
|
+
| `terraform_drift` | Troubleshooting | Detect configuration drift |
|
|
56
|
+
|
|
57
|
+
#### CLI Commands
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
lemma infra discover # Auto-detect providers
|
|
61
|
+
lemma infra connect <provider> # Connect with credentials
|
|
62
|
+
lemma infra status # Dashboard of all providers
|
|
63
|
+
lemma infra health # Detailed health check
|
|
64
|
+
lemma infra deploy jenkins --project <name> # Deploy via Jenkins
|
|
65
|
+
lemma infra deploy okd --project <ns> # Deploy via OKD
|
|
66
|
+
lemma infra logs <provider> <target> # Get logs
|
|
67
|
+
lemma infra diagnose # General diagnosis
|
|
68
|
+
lemma infra terraform plan # Terraform plan
|
|
69
|
+
lemma infra terraform apply # Terraform apply
|
|
70
|
+
lemma infra analyze monolith # Analyze monolith for migration
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
#### Configuration
|
|
74
|
+
|
|
75
|
+
Add to `lemma.config.json`:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"infra": {
|
|
80
|
+
"jenkins": {
|
|
81
|
+
"url": "https://jenkins.example.com",
|
|
82
|
+
"credentialsId": "github-creds"
|
|
83
|
+
},
|
|
84
|
+
"okd": {
|
|
85
|
+
"server": "https://api.okd.example.com:6443",
|
|
86
|
+
"project": "my-namespace",
|
|
87
|
+
"route": { "tls": true, "hostname": "app.example.com" }
|
|
88
|
+
},
|
|
89
|
+
"terraform": {
|
|
90
|
+
"backend": "s3",
|
|
91
|
+
"bucket": "my-terraform-state",
|
|
92
|
+
"region": "us-east-1"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Or use environment variables: `JENKINS_URL`, `JENKINS_USERNAME`, `JENKINS_API_TOKEN`, `OKD_SERVER`, `OKD_TOKEN`, `OKD_PROJECT`, `TF_BACKEND`, `TF_BUCKET`, `TF_REGION`.
|
|
99
|
+
|
|
100
|
+
**Optimized for token savings**: Infrastructure tools use TheBrain caching, compressed responses, lazy loading, and semantic dedup to minimize context usage.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
### v1.1.0 — Token Avalanche
|
|
27
105
|
|
|
28
106
|
**11 new tools, all FREE**, focused on maximizing token savings without requiring Pro:
|
|
29
107
|
|
|
@@ -54,7 +132,7 @@ Lemma is a high-performance orchestration layer that sits between your developme
|
|
|
54
132
|
|
|
55
133
|
## 💎 Free vs Pro
|
|
56
134
|
|
|
57
|
-
### 🆓 Free (
|
|
135
|
+
### 🆓 Free (33 Tools)
|
|
58
136
|
|
|
59
137
|
These tools work **without a Pro license**. Activate them with just `lemma init`:
|
|
60
138
|
|
|
@@ -71,6 +149,28 @@ These tools work **without a Pro license**. Activate them with just `lemma init`
|
|
|
71
149
|
| `conversation_checkpoint` | Session state save/load |
|
|
72
150
|
| `test_autofix_interceptor` | Test failure → Brain auto-fix |
|
|
73
151
|
| `prompt_pattern_cache` | Reusable prompt templates |
|
|
152
|
+
| `infra_discover` | Auto-detect Jenkins, OKD, Terraform |
|
|
153
|
+
| `infra_connect` | Connect to infrastructure providers |
|
|
154
|
+
| `infra_status` | Consolidated infrastructure status |
|
|
155
|
+
| `infra_health_check` | Detailed provider health check |
|
|
156
|
+
| `infra_diagnose` | Analyze and fix infrastructure issues |
|
|
157
|
+
| `infra_analyze_monolith` | Analyze monolith for microservice migration |
|
|
158
|
+
| `infra_suggest_split` | Suggest microservice split points |
|
|
159
|
+
| `jenkins_generate_pipeline` | Generate Jenkinsfile |
|
|
160
|
+
| `jenkins_trigger_build` | Trigger Jenkins builds |
|
|
161
|
+
| `jenkins_build_status` | Jenkins build status |
|
|
162
|
+
| `jenkins_logs` | Jenkins build logs |
|
|
163
|
+
| `okd_generate_manifests` | Generate OKD manifests |
|
|
164
|
+
| `okd_apply` | Apply OKD manifests |
|
|
165
|
+
| `okd_status` | OKD pod/build/route status |
|
|
166
|
+
| `okd_logs` | OKD pod logs |
|
|
167
|
+
| `okd_events` | OKD cluster events |
|
|
168
|
+
| `okd_describe` | Describe OKD resources |
|
|
169
|
+
| `okd_route_url` | Get OKD route URL |
|
|
170
|
+
| `terraform_plan` | Terraform plan |
|
|
171
|
+
| `terraform_apply` | Terraform apply |
|
|
172
|
+
| `terraform_state_list` | List Terraform state resources |
|
|
173
|
+
| `terraform_drift` | Detect Terraform drift |
|
|
74
174
|
|
|
75
175
|
### 💎 Pro (51 Tools)
|
|
76
176
|
|
|
@@ -90,12 +190,29 @@ All remaining tools require a Pro license. Activate with `lemma activate <key>`
|
|
|
90
190
|
| **Session** | test_oracle, schema_extract, changelog_auto, env_snapshot, migration_tracer |
|
|
91
191
|
| **Automation** | AutoPilot, Auto-Heal, Silent Patch Watcher |
|
|
92
192
|
|
|
93
|
-
> **The MCP server is Pro.** All 51 Pro tools — The Brain, PreCrime, AST Hologram, `depgraph`, `refactor`, and every optimization tool — require a Pro license. The
|
|
193
|
+
> **The MCP server is Pro.** All 51 Pro tools — The Brain, PreCrime, AST Hologram, `depgraph`, `refactor`, and every optimization tool — require a Pro license. The 33 Free tools listed above (including all 22 Infrastructure tools) are accessible without activation.
|
|
94
194
|
|
|
95
195
|
---
|
|
96
196
|
|
|
97
197
|
## ⚡ What's in the Pro MCP
|
|
98
198
|
|
|
199
|
+
### 🏗️ Infrastructure Command Center *(NEW in v1.2.0)*
|
|
200
|
+
**Lemma is now your single pane of glass for Jenkins, OKD/OpenShift, and Terraform.** All 22 infrastructure tools are FREE and integrate with TheBrain for intelligent caching of deploy patterns and troubleshooting solutions.
|
|
201
|
+
|
|
202
|
+
- **Jenkins**: Generate Jenkinsfiles, trigger builds, check status, get logs — all via MCP
|
|
203
|
+
- **OKD/OpenShift**: Generate DeploymentConfig, BuildConfig, ImageStream, Route manifests. Apply with dry-run. Monitor pods, builds, events
|
|
204
|
+
- **Terraform**: Plan, apply, list state resources, detect configuration drift
|
|
205
|
+
- **Monolith Analysis**: Analyze your codebase for microservice migration — identifies modules, coupling, and suggests split points
|
|
206
|
+
- **Token-Optimized**: TheBrain caches successful deploys and troubleshooting patterns. Compressed responses. Lazy provider loading
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# Quick start
|
|
210
|
+
lemma infra connect jenkins -u https://jenkins.example.com
|
|
211
|
+
lemma infra connect okd -u https://api.okd.example.com:6443 -t $OKD_TOKEN
|
|
212
|
+
lemma infra status
|
|
213
|
+
lemma infra deploy okd -n my-app -i my-image:latest
|
|
214
|
+
```
|
|
215
|
+
|
|
99
216
|
### 🧠 Shared Semantic Memory — The Brain (Zero-Dependency)
|
|
100
217
|
Lemma maintains a persistent semantic cache index (`TheBrainV2`) using Okapi BM25 + Jaccard re-ranking and Bloom Filters that runs entirely on your local machine with NO external ML dependencies (no ChromaDB, no Ollama required). Every solution, bug fix, and architecture decision you work through gets stored and semantically indexed globally across all your projects. Future sessions can retrieve this knowledge in milliseconds (<10ms) — saving you thousands of tokens.
|
|
101
218
|
|
|
@@ -112,7 +229,7 @@ Builds a full import/export dependency graph of your codebase using the TypeScri
|
|
|
112
229
|
Mathematical chaos score (0-100) per file using the TS Compiler API. Measures cyclomatic complexity, nesting depth, `any` ratio, and average function size. Tells you exactly where refactor debt is accumulating.
|
|
113
230
|
|
|
114
231
|
### 🗺️ AST Hologram — Zero Tokens
|
|
115
|
-
Scans the
|
|
232
|
+
Scans the workspace and returns a dense JSON index of exported symbols with file paths and line numbers. Lemma now routes this through an internal language adapter layer: TypeScript keeps full compiler-backed behavior, `.NET` uses a native adapter path, and unsupported languages return an explicit fallback index instead of pretending semantic parity.
|
|
116
233
|
|
|
117
234
|
### 📡 `depgraph` — Real-Time Dependency Graph
|
|
118
235
|
**Architecture-aware blast radius analysis.** Builds a real-time, bidirectional dependency graph for any file in the workspace using the TypeScript Compiler API — zero LLM calls, zero tokens. Shows exactly what a file imports, what imports it (reverse dependencies), and what symbols it exports.
|
|
@@ -156,6 +273,28 @@ lemma refactor --operation move \
|
|
|
156
273
|
|
|
157
274
|
Supports `--dryRun` (unified diff preview), `--tscCheck` (post-refactor type verification), and `--backup` (`.bak` files).
|
|
158
275
|
|
|
276
|
+
## 🌐 Multi-Language Semantic Runtime
|
|
277
|
+
|
|
278
|
+
Lemma now separates universal MCP tools from language-specific semantic tooling.
|
|
279
|
+
|
|
280
|
+
| Capability Tier | Meaning |
|
|
281
|
+
| :--- | :--- |
|
|
282
|
+
| `full` | Native semantic adapter with language-aware guarantees. |
|
|
283
|
+
| `partial` | Some language awareness exists, but not full semantic parity. |
|
|
284
|
+
| `fallback` | Safe read-only or heuristic response. No semantic safety claim. |
|
|
285
|
+
| `unsupported` | Mutation is refused until a real adapter exists. |
|
|
286
|
+
|
|
287
|
+
### Current semantic support
|
|
288
|
+
|
|
289
|
+
| Tool | TypeScript / JavaScript | .NET | Python / Go / Java (today) |
|
|
290
|
+
| :--- | :--- | :--- | :--- |
|
|
291
|
+
| `get_ast_hologram` | `full` | `full` | `fallback` |
|
|
292
|
+
| `validate_patch_sandbox` | `full` via `tsc` | `full` via `dotnet build` when CLI is available | `fallback` |
|
|
293
|
+
| `depgraph` | `full` | `full` | `fallback` |
|
|
294
|
+
| `refactor` | `full` | `unsupported` | `unsupported` |
|
|
295
|
+
|
|
296
|
+
Universal tools such as file reads, workspace search, memory, onboarding, prompt compression, and privacy scrubbing remain language-agnostic. Semantic tools keep the same MCP names, but are now routed through adapter and runtime registries internally.
|
|
297
|
+
|
|
159
298
|
### 🚦 Complexity Router
|
|
160
299
|
Intelligently evaluates each prompt and routes it to the most cost-effective model. Reserves premium models for complex reasoning, uses smaller models for simple tasks. Slashes your AI bill without sacrificing quality.
|
|
161
300
|
|
package/bin/init.js
CHANGED
|
@@ -71,6 +71,65 @@ function configureCursor() {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
+
function configureCursorMcp() {
|
|
75
|
+
const globalCursorDir = path.join(os.homedir(), '.cursor');
|
|
76
|
+
const globalMcpFile = path.join(globalCursorDir, 'mcp.json');
|
|
77
|
+
const projectCursorDir = path.join(process.cwd(), '.cursor');
|
|
78
|
+
const projectMcpFile = path.join(projectCursorDir, 'mcp.json');
|
|
79
|
+
const lemmaServerConfig = { command: 'npx', args: ['-y', '@nxuss/lemma', 'mcp'] };
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
ensureDir(globalCursorDir);
|
|
83
|
+
let globalConfig = {};
|
|
84
|
+
if (fs.existsSync(globalMcpFile)) {
|
|
85
|
+
globalConfig = JSON.parse(fs.readFileSync(globalMcpFile, 'utf8'));
|
|
86
|
+
}
|
|
87
|
+
if (!globalConfig.mcpServers) globalConfig.mcpServers = {};
|
|
88
|
+
globalConfig.mcpServers.lemma = lemmaServerConfig;
|
|
89
|
+
fs.writeFileSync(globalMcpFile, JSON.stringify(globalConfig, null, 2), 'utf8');
|
|
90
|
+
|
|
91
|
+
ensureDir(projectCursorDir);
|
|
92
|
+
let projectConfig = {};
|
|
93
|
+
if (fs.existsSync(projectMcpFile)) {
|
|
94
|
+
projectConfig = JSON.parse(fs.readFileSync(projectMcpFile, 'utf8'));
|
|
95
|
+
}
|
|
96
|
+
if (!projectConfig.mcpServers) projectConfig.mcpServers = {};
|
|
97
|
+
projectConfig.mcpServers.lemma = lemmaServerConfig;
|
|
98
|
+
fs.writeFileSync(projectMcpFile, JSON.stringify(projectConfig, null, 2), 'utf8');
|
|
99
|
+
return true;
|
|
100
|
+
} catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function configureCodexCliMcp() {
|
|
106
|
+
const codexDir = path.join(os.homedir(), '.codex');
|
|
107
|
+
const codexConfigFile = path.join(codexDir, 'config.toml');
|
|
108
|
+
const lemmaEntry = [
|
|
109
|
+
'',
|
|
110
|
+
'[mcp_servers.lemma]',
|
|
111
|
+
'command = "npx"',
|
|
112
|
+
'args = ["-y", "@nxuss/lemma", "mcp"]',
|
|
113
|
+
'enabled = true',
|
|
114
|
+
''
|
|
115
|
+
].join('\n');
|
|
116
|
+
|
|
117
|
+
try {
|
|
118
|
+
ensureDir(codexDir);
|
|
119
|
+
let config = '';
|
|
120
|
+
if (fs.existsSync(codexConfigFile)) {
|
|
121
|
+
config = fs.readFileSync(codexConfigFile, 'utf8');
|
|
122
|
+
}
|
|
123
|
+
if (config.includes('[mcp_servers.lemma]')) {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
fs.writeFileSync(codexConfigFile, `${config.replace(/\s*$/, '')}${lemmaEntry}`, 'utf8');
|
|
127
|
+
return true;
|
|
128
|
+
} catch {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
74
133
|
function configureOpenCodeMcp() {
|
|
75
134
|
const configDir = path.join(os.homedir(), '.opencode');
|
|
76
135
|
const configFile = path.join(configDir, 'mcp.json');
|
|
@@ -117,64 +176,66 @@ function configureClaudeDesktop() {
|
|
|
117
176
|
}
|
|
118
177
|
|
|
119
178
|
// ─── Lemma MCP tool names (server prefix: "lemma") ────────────────────────────
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
'
|
|
123
|
-
'
|
|
124
|
-
'
|
|
125
|
-
'
|
|
126
|
-
'
|
|
127
|
-
'
|
|
128
|
-
'
|
|
129
|
-
|
|
130
|
-
'
|
|
131
|
-
'
|
|
132
|
-
'
|
|
133
|
-
'
|
|
134
|
-
'
|
|
135
|
-
|
|
136
|
-
'mcp__lemma__get_project_onboarding',
|
|
137
|
-
'mcp__lemma__get_telepathic_hints',
|
|
138
|
-
'mcp__lemma__get_ast_hologram',
|
|
139
|
-
'mcp__lemma__get_symbol_surgical_context',
|
|
140
|
-
'mcp__lemma__compress_context',
|
|
141
|
-
'mcp__lemma__collapse_context',
|
|
142
|
-
// Token optimization
|
|
143
|
-
'mcp__lemma__squeeze_prompt',
|
|
144
|
-
'mcp__lemma__turbosqueeze',
|
|
145
|
-
'mcp__lemma__wormhole_squeeze',
|
|
146
|
-
'mcp__lemma__token_budget',
|
|
147
|
-
'mcp__lemma__prune_conversation_history',
|
|
148
|
-
'mcp__lemma__summarize_long_text',
|
|
149
|
-
// Code quality & patching
|
|
150
|
-
'mcp__lemma__validate_patch_sandbox',
|
|
151
|
-
'mcp__lemma__surgical_ast_insert',
|
|
152
|
-
'mcp__lemma__diff_only',
|
|
153
|
-
'mcp__lemma__local_semantic_autofix',
|
|
154
|
-
'mcp__lemma__auto_heal',
|
|
155
|
-
// Analysis
|
|
156
|
-
'mcp__lemma__get_routing_advice',
|
|
157
|
-
'mcp__lemma__query_hybrid_consensus',
|
|
158
|
-
'mcp__lemma__batch_tool_calls',
|
|
159
|
-
'mcp__lemma__scrub_privacy',
|
|
160
|
-
'mcp__lemma__entropy_score',
|
|
161
|
-
'mcp__lemma__coupling_radar',
|
|
162
|
-
'mcp__lemma__pattern_fossil',
|
|
163
|
-
'mcp__lemma__git_heatmap_risk',
|
|
164
|
-
'mcp__lemma__precrime_static',
|
|
165
|
-
'mcp__lemma__semantic_dedup_guard',
|
|
166
|
-
'mcp__lemma__dead_export_necromancer',
|
|
167
|
-
'mcp__lemma__depgraph',
|
|
168
|
-
'mcp__lemma__refactor',
|
|
169
|
-
// PR Review
|
|
170
|
-
'mcp__lemma__review_diff',
|
|
171
|
-
'mcp__lemma__review_pr',
|
|
172
|
-
'mcp__lemma__pr_status',
|
|
173
|
-
'mcp__lemma__generate_pr_workflow',
|
|
174
|
-
// Reporting
|
|
175
|
-
'mcp__lemma__generate_executive_roi_report',
|
|
179
|
+
const FALLBACK_LEMMA_TOOL_NAMES = [
|
|
180
|
+
'read_workspace_file', 'write_workspace_file', 'create_workspace_file', 'list_workspace_dir',
|
|
181
|
+
'search_workspace', 'apply_workspace_patch', 'run_workspace_command',
|
|
182
|
+
'search_memory', 'store_memory', 'smarter_cache',
|
|
183
|
+
'get_project_onboarding', 'get_telepathic_hints', 'get_ast_hologram',
|
|
184
|
+
'get_symbol_surgical_context', 'compress_context',
|
|
185
|
+
'squeeze_prompt', 'turbosqueeze', 'wormhole_squeeze',
|
|
186
|
+
'token_budget', 'prune_conversation_history', 'summarize_long_text',
|
|
187
|
+
'validate_patch_sandbox', 'surgical_ast_insert', 'diff_only',
|
|
188
|
+
'local_semantic_autofix', 'auto_heal', 'get_routing_advice',
|
|
189
|
+
'query_hybrid_consensus', 'batch_tool_calls', 'scrub_privacy',
|
|
190
|
+
'entropy_score', 'coupling_radar', 'pattern_fossil',
|
|
191
|
+
'git_heatmap_risk', 'precrime_static', 'semantic_dedup_guard',
|
|
192
|
+
'dead_export_necromancer', 'depgraph', 'refactor',
|
|
193
|
+
'review_diff', 'review_pr', 'pr_status',
|
|
194
|
+
'generate_pr_workflow', 'generate_executive_roi_report',
|
|
176
195
|
];
|
|
177
196
|
|
|
197
|
+
function extractToolNamesFromSource(source, containerName) {
|
|
198
|
+
const blockRegex = new RegExp(`const ${containerName}(?:\\s*:\\s*[^=]+)?\\s*=\\s*\\{([\\s\\S]*?)\\n\\};`);
|
|
199
|
+
const match = source.match(blockRegex);
|
|
200
|
+
if (!match) return [];
|
|
201
|
+
const names = [];
|
|
202
|
+
const seen = new Set();
|
|
203
|
+
const keyRegex = /\n\s*([a-zA-Z0-9_]+):\s*(?:handle[A-Za-z0-9_]+|async\s*\()/g;
|
|
204
|
+
for (const hit of match[1].matchAll(keyRegex)) {
|
|
205
|
+
const name = hit[1];
|
|
206
|
+
if (seen.has(name)) continue;
|
|
207
|
+
seen.add(name);
|
|
208
|
+
names.push(name);
|
|
209
|
+
}
|
|
210
|
+
return names;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function loadLemmaToolNames() {
|
|
214
|
+
const seen = new Set();
|
|
215
|
+
const collected = [];
|
|
216
|
+
const candidates = [
|
|
217
|
+
['toolHandlers', path.join(__dirname, '..', 'src', 'mcp', 'tools.ts')],
|
|
218
|
+
['toolHandlers', path.join(__dirname, '..', 'dist', 'cjs', 'mcp', 'tools.js')],
|
|
219
|
+
['handlers', path.join(__dirname, '..', 'src', 'infra', 'mcp-tools.ts')],
|
|
220
|
+
['handlers', path.join(__dirname, '..', 'dist', 'cjs', 'infra', 'mcp-tools.js')],
|
|
221
|
+
];
|
|
222
|
+
for (const [containerName, filePath] of candidates) {
|
|
223
|
+
if (!fs.existsSync(filePath)) continue;
|
|
224
|
+
try {
|
|
225
|
+
const source = fs.readFileSync(filePath, 'utf8');
|
|
226
|
+
for (const name of extractToolNamesFromSource(source, containerName)) {
|
|
227
|
+
if (seen.has(name)) continue;
|
|
228
|
+
seen.add(name);
|
|
229
|
+
collected.push(name);
|
|
230
|
+
}
|
|
231
|
+
} catch {}
|
|
232
|
+
}
|
|
233
|
+
return collected.length > 0 ? collected : FALLBACK_LEMMA_TOOL_NAMES;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const LEMMA_TOOL_NAMES = loadLemmaToolNames();
|
|
237
|
+
const LEMMA_MCP_TOOLS = LEMMA_TOOL_NAMES.map((name) => `mcp__lemma__${name}`);
|
|
238
|
+
|
|
178
239
|
const CLAUDE_MD_CONTENT = `# Lemma MCP — Reglas de Comportamiento Obligatorio
|
|
179
240
|
|
|
180
241
|
> ⚠️ ESTAS REGLAS SON ABSOLUTAS. Síguilas sin excepción.
|
|
@@ -255,10 +316,11 @@ function configureClaudeCode() {
|
|
|
255
316
|
);
|
|
256
317
|
settings.enableAllProjectMcpServers = true;
|
|
257
318
|
|
|
258
|
-
//
|
|
259
|
-
const
|
|
260
|
-
|
|
261
|
-
|
|
319
|
+
// Rebuild Lemma tool permissions from the current catalog while preserving non-Lemma tools.
|
|
320
|
+
const preservedTools = (settings.allowedTools || []).filter(
|
|
321
|
+
(tool) => !tool.startsWith('mcp__lemma__')
|
|
322
|
+
);
|
|
323
|
+
settings.allowedTools = [...preservedTools, ...LEMMA_MCP_TOOLS];
|
|
262
324
|
|
|
263
325
|
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
|
|
264
326
|
|
|
@@ -276,25 +338,6 @@ function configureClaudeCode() {
|
|
|
276
338
|
return true;
|
|
277
339
|
}
|
|
278
340
|
|
|
279
|
-
// ─── Short tool names (for non-Claude tools that don't use mcp__ prefix) ───────
|
|
280
|
-
const LEMMA_TOOL_NAMES = [
|
|
281
|
-
'read_workspace_file', 'write_workspace_file', 'create_workspace_file', 'list_workspace_dir',
|
|
282
|
-
'search_workspace', 'apply_workspace_patch', 'run_workspace_command',
|
|
283
|
-
'search_memory', 'store_memory', 'smarter_cache',
|
|
284
|
-
'get_project_onboarding', 'get_telepathic_hints', 'get_ast_hologram',
|
|
285
|
-
'get_symbol_surgical_context', 'compress_context',
|
|
286
|
-
'squeeze_prompt', 'turbosqueeze', 'wormhole_squeeze',
|
|
287
|
-
'token_budget', 'prune_conversation_history', 'summarize_long_text',
|
|
288
|
-
'validate_patch_sandbox', 'surgical_ast_insert', 'diff_only',
|
|
289
|
-
'local_semantic_autofix', 'auto_heal', 'get_routing_advice',
|
|
290
|
-
'query_hybrid_consensus', 'batch_tool_calls', 'scrub_privacy',
|
|
291
|
-
'entropy_score', 'coupling_radar', 'pattern_fossil',
|
|
292
|
-
'git_heatmap_risk', 'precrime_static', 'semantic_dedup_guard',
|
|
293
|
-
'dead_export_necromancer', 'depgraph', 'refactor',
|
|
294
|
-
'review_diff', 'review_pr', 'pr_status',
|
|
295
|
-
'generate_pr_workflow', 'generate_executive_roi_report',
|
|
296
|
-
];
|
|
297
|
-
|
|
298
341
|
const LEMMA_RULES_CONTENT = `# Lemma MCP — Autonomous Behaviors
|
|
299
342
|
|
|
300
343
|
> ⚠️ MANDATORY RULES — Follow without exception.
|
|
@@ -612,15 +655,23 @@ async function main() {
|
|
|
612
655
|
const hasCursor = detectTool('Cursor', () => fs.existsSync(path.join(os.homedir(), '.cursor')));
|
|
613
656
|
if (hasCursor) {
|
|
614
657
|
const configured = configureCursor();
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
658
|
+
const mcpConfigured = configureCursorMcp();
|
|
659
|
+
if (configured && mcpConfigured) ok('Cursor configured (API base + MCP registration)');
|
|
660
|
+
else warn('Cursor detected but config could not be fully auto-updated');
|
|
661
|
+
} else {
|
|
662
|
+
const projectCursorConfigured = configureCursorMcp();
|
|
663
|
+
if (projectCursorConfigured) ok('Project Cursor MCP configured');
|
|
664
|
+
else skip('Cursor not detected');
|
|
665
|
+
}
|
|
618
666
|
|
|
619
667
|
const hasCodex = detectTool('Codex CLI', () => {
|
|
620
668
|
try { execSync('which codex', { stdio: 'ignore' }); return true; } catch { return false; }
|
|
621
669
|
});
|
|
622
|
-
if (hasCodex)
|
|
623
|
-
|
|
670
|
+
if (hasCodex) {
|
|
671
|
+
const codexConfigured = configureCodexCliMcp();
|
|
672
|
+
if (codexConfigured) ok('Codex CLI configured (MCP + OPENAI_BASE_URL env)');
|
|
673
|
+
else warn('Codex CLI detected but MCP config could not be auto-updated');
|
|
674
|
+
} else skip('Codex CLI not detected');
|
|
624
675
|
|
|
625
676
|
const hasWindsurf = detectTool('Windsurf', () => fs.existsSync(path.join(os.homedir(), '.windsurfrules')));
|
|
626
677
|
if (hasWindsurf) ok('Windsurf detected — env auto-configured');
|
|
@@ -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":";AA4cA,wBAAgB,+BAA+B,CAAC,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA4DvF;AAijED,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"}
|
|
@@ -44,6 +44,7 @@ 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
46
|
const reviewRunner_1 = require("../pr-review/reviewRunner");
|
|
47
|
+
const cli_1 = require("../infra/cli");
|
|
47
48
|
const ContextSqueezer_1 = require("../utils/ContextSqueezer");
|
|
48
49
|
const AgentMultiplexer_1 = require("../proxy/AgentMultiplexer");
|
|
49
50
|
const SseRelay_1 = require("../proxy/SseRelay");
|
|
@@ -2784,6 +2785,7 @@ commander_1.program.command('pr-review')
|
|
|
2784
2785
|
process.exit(1);
|
|
2785
2786
|
}
|
|
2786
2787
|
});
|
|
2788
|
+
(0, cli_1.registerInfraCommands)();
|
|
2787
2789
|
if (process.argv[1] && (process.argv[1].includes('lemma') || process.argv[1].endsWith('.cjs') || process.argv[1].endsWith('.js'))) {
|
|
2788
2790
|
// Bare `lemma` with no args → show welcome screen
|
|
2789
2791
|
if (process.argv.length <= 2) {
|