@dennisrepa/elevate 1.3.0 → 1.5.0

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/docs/de.md CHANGED
@@ -19,8 +19,9 @@
19
19
 
20
20
  ## ✨ Features & Highlights
21
21
 
22
- 1. **🌐 Polyglot Monorepo Support (npm & Maven):**
22
+ 1. **🌐 Polyglot Monorepo Support (npm, pnpm & Maven):**
23
23
  * **Node / npm:** Löst Workspaces genau wie npm auf (inklusive Glob-Mustern wie `packages/**`), berechnet SemVer-Diffs, aktualisiert `package.json`, führt `npm install` aus und prüft das Lockfile.
24
+ * **Node / pnpm** (9 – 12): Dasselbe für pnpm-Repositories — Workspaces aus `pnpm-workspace.yaml`, das `workspace:`-Protokoll, `catalog:`-Einträge, `pnpm install` und eine Lockfile-Prüfung. Repositories mit Yarn oder Bun werden abgelehnt.
24
25
  * **Java / Maven:** Findet jede `pom.xml` (auch die Root-POM), lässt Maven die Effective POM berechnen, sucht neuere Versionen über die Repositories des Builds (Mirrors, Nexus/Artifactory, Zugangsdaten aus der `settings.xml`) und prüft die betroffenen Module mit `mvn test-compile`.
25
26
  * **Live-Wechsel:** Ein Tastendruck auf **`[E]`** schaltet im laufenden Betrieb zwischen Frontend- und Backend-Modulen um.
26
27
 
@@ -68,6 +69,7 @@ Die URL der Registry allein entscheidet bewusst **nicht** über die Herkunft: In
68
69
  ### Workspace-Module angleichen
69
70
 
70
71
  * **npm:** Schließt der Versionsbereich einer Abhängigkeit die lokale Version eines Workspace-Pakets nicht ein, verlinkt npm das Workspace **nicht**, sondern installiert ein gleichnamiges Paket aus der Registry. Elevate bietet an, den Bereich anzugleichen (z. B. `^1.0.0` ➔ `^2.0.0`). Nach `npm install` prüft es die `package-lock.json`: Jede angeglichene Abhängigkeit muss `"link": true` sein, sonst wird das Update zurückgenommen. Bereiche, die npm immer verlinkt (`*`, `file:`, `workspace:`), bleiben unberührt.
72
+ * **pnpm:** pnpm verlinkt ein Workspace-Paket nur, wenn die Abhängigkeit mit dem `workspace:`-Protokoll geschrieben ist; ein einfacher Bereich wie `^1.0.0` wird aus der Registry aufgelöst — auch wenn die lokale Version ihn erfüllt. Elevate gleicht deshalb `workspace:^1.2.0` ➔ `workspace:^2.0.0` an (Protokoll und Präfix bleiben; `workspace:*`, `workspace:^`, `workspace:~` und `workspace:../lib` brauchen nichts) und führt einen einfachen Bereich auf ein Modul als *nicht verlinkt* (`not-linked`) auf, ohne den Namen je in einer Registry nachzuschlagen oder den Bereich umzuschreiben. Nach `pnpm install` liest es den Abschnitt `importers` der `pnpm-lock.yaml` (`lockfileVersion` 9.x): Jede angeglichene Abhängigkeit muss eine `version` mit `link:` haben, sonst wird das Update zurückgenommen.
71
73
  * **Maven:** Hängt ein Modul mit abweichender Version von einem Modul *desselben Reactors* ab (z. B. `1.0.0`, während das Modul auf `1.1.0-SNAPSHOT` steht), bietet Elevate das Angleichen an. Verweise über `${project.version}` brauchen kein Angleichen.
72
74
  * Der Release Channel gilt beim Angleichen nicht: Ziel ist die lokale Version — auch `-SNAPSHOT` —, weil die Module eines Repositorys zusammen gebaut und getestet werden.
73
75
 
@@ -89,6 +91,17 @@ Jedes Update läuft als ein Ablauf: **Snapshot ➔ Schreiben & Installieren ➔
89
91
  * **npm:** `npm ls` im Repository-Root (fehlende, ungültige oder unerfüllte Abhängigkeiten in allen Workspaces), sofern kein `postUpdateScript` gesetzt ist.
90
92
  * **Maven:** `mvn test-compile -pl <geänderte Module> -amd` im Reactor — die geänderten Module *und alle Module, die von ihnen abhängen*. Eine Änderung an der Aggregator-POM baut den ganzen Reactor.
91
93
 
94
+ ### Cargo (Rust)
95
+
96
+ Elevate startet `cargo` aus dem `PATH` (`cargo metadata --no-deps`, `cargo update`, `cargo check`); fehlt es, schlagen Cargo-Scans mit einer klaren Meldung fehl. Untersucht wird jede `Cargo.toml` außerhalb von `target`, `node_modules`, `vendor`, versteckten Ordnern und `src`; jeder Workspace wird einmal gelesen.
97
+
98
+ * **Wo Versionen geschrieben werden.** Elevate ändert nur den Versionstext der deklarierenden Stelle — in der `Cargo.toml` der Crate oder bei `workspace = true` in `[workspace.dependencies]` der Wurzel. Kommentare, Anführungszeichen und Zeilenenden bleiben. `cargo add` wird nicht verwendet, weil es `workspace = true` ersetzt.
99
+ * **Anforderungen.** Ein nacktes `1.2.3` bedeutet `^1.2.3`. Die neue Anforderung behält Operator und Anzahl der Komponenten: `"1"` → `"2"`, `"1.0.100"` → `"1.0.229"`. `0.x`-Updates, die die erste Komponente ungleich null ändern, gelten als *major*.
100
+ * **Registries.** Versionen kommen aus dem Sparse-Index, den deine Cargo-Konfiguration nennt (`.cargo/config.toml` in Elternverzeichnissen, `$CARGO_HOME`, `include`). Eine Crate aus einer alternativen Registry wird nur dort abgefragt. Eine Quellen-Ersetzung, die Elevate nicht lesen kann (Verzeichnis, lokale Registry, Git), stoppt die Abfrage. Registries mit Authentifizierung werden als fehlgeschlagene Abfrage gemeldet.
101
+ * **Proxy.** Registry-Abfragen nutzen Nodes `fetch`, das `HTTP_PROXY`/`HTTPS_PROXY` nur beachtet, wenn der Prozess mit `NODE_USE_ENV_PROXY=1` gestartet wird (mit Node 22.23 geprüft). Hinter einem Proxy: `NODE_USE_ENV_PROXY=1 elevate …`; eine fehlgeschlagene Abfrage weist darauf hin. Cargos eigene Einstellungen `http.proxy` und `http.cainfo` werden nicht gelesen; für eine private CA `NODE_EXTRA_CA_CERTS` verwenden.
102
+ * **Lockfile.** Nach der Änderung wird `Cargo.lock` mit `cargo update -p` aktualisiert und bei einer älteren Wunschversion mit `--precise` festgelegt. Ein Repository ohne `Cargo.lock` bekommt keine.
103
+ * **Verifikation.** `cargo check --all-targets` für die geänderten Crates und die davon abhängigen; ändert sich die Workspace-Wurzel, wird der ganze Workspace geprüft. Build-Skripte der neuen Versionen laufen dabei.
104
+
92
105
  ### Voraussetzungen für Maven
93
106
 
94
107
  Elevate verwendet den Maven Wrapper des Projekts (`mvnw` / `mvnw.cmd`), sonst `mvn` aus dem `PATH`. Fehlt beides, bricht der Maven-Scan mit einer klaren Meldung ab, statt zu raten. Die Plugin-Versionen sind für reproduzierbare Ergebnisse festgelegt (`maven-help-plugin` 3.5.2, `versions-maven-plugin` 2.22.0) und lassen sich je Repository mit `mavenPlugins` in der `elevate.config.json` ersetzen (siehe [Maven-Plugin-Versionen](#maven-plugin-versionen)). Scans schreiben temporäre Dateien nur nach `target/.elevate-*` und entfernen sie danach.
@@ -103,9 +116,31 @@ Elevate verhält sich gleich, egal wo im Repository es gestartet wird. Der Root
103
116
 
104
117
  Die Suche verlässt nie den Checkout der Versionsverwaltung: Sie endet im nächsten Verzeichnis, das einen `.git`-Eintrag enthält. Eine verirrte `package.json` oder `pom.xml` oberhalb des Repositorys wird daher nie für dessen Root gehalten. Manifeste, die sich nicht lesen lassen, werden übersprungen.
105
118
 
106
- ### Paketmanager-Schutz (npm)
119
+ ### Paketmanager-Schutz (Yarn und Bun)
120
+
121
+ Elevate unterstützt für Node.js npm und pnpm. In einem Repository, das Yarn oder Bun verwaltet, verweigert es Scan und Änderungen, weil jedes der beiden Werkzeuge ein zweites Lockfile und ein `node_modules`-Layout anlegen würde, das das Projekt nicht nutzt. Der Paketmanager wird vom Repository-Root aus erkannt, in dieser Reihenfolge: Feld `packageManager` der `package.json` (`npm@`, `pnpm@`, `yarn@`, `bun@`), dann `package-lock.json` / `npm-shrinkwrap.json`, `pnpm-lock.yaml` / `pnpm-workspace.yaml`, `yarn.lock` / `.yarnrc.yml`, `bun.lock` / `bun.lockb`; ohne Treffer gilt das Repository als npm. Startet Elevate innerhalb eines Workspace-Pakets, wird in den übergeordneten Verzeichnissen bis zum Checkout (nächstes Verzeichnis mit `.git`) weitergesucht. Die Ablehnung nennt den Paketmanager und die entscheidende Datei. Maven-Module im selben Repository, lesende Versionsabfragen (`elevate versions`) und ein eigenes `postUpdateScript` sind nicht betroffen.
122
+
123
+ ### pnpm-Workspaces und Catalogs
124
+
125
+ * **Workspace-Datei.** In einem pnpm-Repository bestimmt die Liste `packages` der `pnpm-workspace.yaml` (nicht das Feld `workspaces` der `package.json`) die Module; Muster mit `*`, `**` und `!` funktionieren wie bei npm, der Root ist immer ein Modul, `node_modules` enthält nie Module. Eine `pnpm-workspace.yaml` markiert auch den Repository-Root, selbst ohne `packages`. Eine Datei, die kein gültiges YAML ist, gilt als nicht vorhanden.
126
+ * **Catalogs.** Eine Abhängigkeit mit `catalog:` / `catalog:default` / `catalog:<name>` wird mit dem Bereich aus dem Catalog angeboten; der neue Bereich wird in genau diesen Eintrag der `pnpm-workspace.yaml` geschrieben (Kommentare, Anführungszeichen, Schreibweise und Zeilenenden bleiben; die `package.json` des Moduls wird nicht umgeschrieben). Eine nicht auflösbare Referenz erscheint als `catalog-unresolved`. Die JSON-Ausgabe nennt den Ort: `"declaredIn": {"file": "pnpm-workspace.yaml", "kind": "catalog", "catalog": "default"}`.
127
+ * **Overrides** (`pnpm.overrides`, `overrides` in der `pnpm-workspace.yaml`, `resolutions`) und `peerDependencies` werden nie geändert.
128
+
129
+ ### Befehle, die Elevate für pnpm ausführt
130
+
131
+ Alle im Repository-Root mit dem `pnpm` aus dem `PATH` (Version über `packageManager`/Corepack). Zuerst läuft `pnpm --version`; scheitert es, bricht die Operation mit einer Erklärung ab, bevor etwas verändert wird.
132
+
133
+ | Zweck | Befehl | Timeout |
134
+ | :--- | :--- | :--- |
135
+ | pnpm benutzbar? | `pnpm --version` | 15 s |
136
+ | Installation nach dem Schreiben der Bereiche | `pnpm install --no-frozen-lockfile` | 10 min |
137
+ | Wiederherstellung nach Rollback | `pnpm install --frozen-lockfile` | 10 min |
138
+ | Standard-Verifikation (Lockfile-Konsistenz, ersetzt `npm ls`) | `pnpm install --frozen-lockfile --lockfile-only` | 10 min |
139
+ | Schwachstellen-Zusammenfassung | `pnpm audit --json` | 60 s |
140
+ | Versionen eines Pakets | `pnpm view <name> <field> --json` | 15 s |
141
+ | Registry-Konfiguration | `pnpm config list --json` | 15 s |
107
142
 
108
- Elevates Node.js-Unterstützung steuert npm. In einem Repository, das pnpm, Yarn oder Bun verwaltet, weigert sich Elevate, die npm-Module zu scannen oder zu ändern, denn `npm install` würde ein zweites Lockfile und ein `node_modules`-Layout anlegen, das das Projekt nicht verwendet. Der Paketmanager wird am Repository-Root in dieser Reihenfolge erkannt: Feld `packageManager` der `package.json` (`npm@`, `pnpm@`, `yarn@`, `bun@`), dann `package-lock.json` / `npm-shrinkwrap.json`, `pnpm-lock.yaml` / `pnpm-workspace.yaml`, `yarn.lock` / `.yarnrc.yml`, `bun.lock` / `bun.lockb`; ohne eines davon gilt das Repository als npm. Startet Elevate in einem Workspace-Paket, läuft die Suche in den übergeordneten Verzeichnissen weiter bis zum Checkout (nächstes Verzeichnis mit `.git`-Eintrag); ohne Checkout wird nur das Verzeichnis selbst geprüft. Die Ablehnung nennt den Paketmanager und die Datei, die entschieden hat. Maven-Module im selben Repository, lesende Versionsabfragen (`elevate versions`) und ein eigenes `postUpdateScript` bleiben unberührt.
143
+ `--no-frozen-lockfile` wird ausdrücklich übergeben, weil `pnpm install` bei gesetztem `CI` implizit eingefroren ist und am gerade geänderten Manifest scheitern würde. `pnpm ls` taugt nicht zur Verifikation: Es endet auch bei fehlenden Abhängigkeiten mit 0. Die Schwachstellen-Zusammenfassung stammt aus `pnpm audit --json`; ein Audit ohne Ergebnis ist eine Warnung, nie ein Grund für ein Rollback. pnpm-Einstellungen wie `minimumReleaseAge` oder die Freigabe von Build-Skripten liest Elevate nicht; lehnt pnpm deshalb ab, wird mit pnpms eigener Meldung zurückgenommen.
109
144
 
110
145
  ### Abhängigkeitsbereiche (npm)
111
146
 
@@ -153,6 +188,11 @@ src/
153
188
  │ │ ├── npm-registry.ts # npm-view-Abfragen & Dist-Tags
154
189
  │ │ ├── npm-scanner.ts # Herkunft, Angleichen, SemVer-Diffs
155
190
  │ │ ├── npm-lockfile.ts # Prüfung der Workspace-Verlinkung im Lockfile
191
+ │ │ ├── npm-commands.ts # Befehle je Paketmanager (npm / pnpm)
192
+ │ │ ├── npm-protocols.ts # Bereichs-Protokolle workspace: / catalog:
193
+ │ │ ├── pnpm-workspace.ts # pnpm-workspace.yaml: Pakete, Catalogs, Änderung an Ort und Stelle
194
+ │ │ ├── pnpm-lockfile.ts # Verlinkungsprüfung in der pnpm-lock.yaml
195
+ │ │ ├── pnpm-audit.ts # Zusammenfassung von pnpm audit --json
156
196
  │ │ ├── npm-updater.ts # Aktualisiert package.json & npm install
157
197
  │ │ ├── npm-verifier.ts # npm ls / eigene Verifikation
158
198
  │ │ └── npm-strategy.ts # NpmEcosystemStrategy
package/docs/en.md CHANGED
@@ -19,8 +19,8 @@
19
19
 
20
20
  ## ✨ Features & Highlights
21
21
 
22
- 1. **🌐 Polyglot Monorepo Support (npm & Maven):**
23
- * **Node / npm:** Resolves workspaces exactly like npm (glob patterns such as `packages/**` included), calculates SemVer diffs, updates `package.json` (`dependencies`, `devDependencies`, `optionalDependencies`), runs `npm install` and checks the lockfile. Repositories managed by pnpm, Yarn or Bun are refused.
22
+ 1. **🌐 Polyglot Monorepo Support (npm, pnpm & Maven):**
23
+ * **Node / npm:** Resolves workspaces exactly like npm (glob patterns such as `packages/**` included), calculates SemVer diffs, updates `package.json` (`dependencies`, `devDependencies`, `optionalDependencies`), runs `npm install` and checks the lockfile. **Node / pnpm** (9 – 12) works the same way for pnpm repositories: workspaces from `pnpm-workspace.yaml`, the `workspace:` protocol, `catalog:` entries, `pnpm install` and a lockfile check. Repositories managed by Yarn or Bun are refused.
24
24
  * **Java / Maven:** Finds every `pom.xml` (including the root POM), lets Maven compute the effective POM, looks up newer versions through the build's own repositories (mirrors, Nexus/Artifactory, credentials from `settings.xml`) and verifies the affected modules with `mvn test-compile`.
25
25
  * **Runtime Switch:** Press **`[E]`** anytime to switch between frontend and backend modules.
26
26
 
@@ -68,6 +68,7 @@ The registry URL alone is deliberately **not** used to decide the origin: in mos
68
68
  ### Aligning workspace modules
69
69
 
70
70
  * **npm:** If a dependency's range does not include the local version of a workspace package, npm does **not** link the workspace — it installs a package with the same name from the registry. Elevate offers to align the range (e.g. `^1.0.0` ➔ `^2.0.0`). After `npm install` it checks `package-lock.json`: every aligned dependency must be `"link": true`, otherwise the update is rolled back. Ranges that npm always links (`*`, `file:`, `workspace:`) are left alone.
71
+ * **pnpm:** pnpm links a workspace package only when the dependency is written with the `workspace:` protocol; a plain range such as `^1.0.0` is resolved from the registry, even if the local version satisfies it. Elevate therefore aligns `workspace:^1.2.0` ➔ `workspace:^2.0.0` (the protocol and the prefix are kept; `workspace:*`, `workspace:^`, `workspace:~` and `workspace:../lib` need nothing) and lists a plain range on a module as *not linked* without ever looking the name up in a registry or rewriting it. After `pnpm install` it reads the `importers` section of `pnpm-lock.yaml` (`lockfileVersion` 9.x): every aligned dependency must have a `version` starting with `link:`, otherwise the update is rolled back.
71
72
  * **Maven:** If a module depends on a module of the *same reactor* with a different version (e.g. `1.0.0` while the module is at `1.1.0-SNAPSHOT`), Elevate offers to align it. `${project.version}` references need no alignment.
72
73
  * The release channel does not apply to alignment: the local version — including `-SNAPSHOT` — is the target, because modules of one repository are built and tested together.
73
74
 
@@ -89,6 +90,17 @@ Every update runs as one workflow: **snapshot ➔ write & install ➔ integrity
89
90
  * **npm:** `npm ls` at the repository root (missing, invalid or unmet dependencies across all workspaces), unless `postUpdateScript` is set.
90
91
  * **Maven:** `mvn test-compile -pl <changed modules> -amd` in the reactor — the changed modules *and every module depending on them*. A change to the aggregator POM rebuilds the whole reactor.
91
92
 
93
+ ### Cargo (Rust)
94
+
95
+ Elevate runs `cargo` from the `PATH` (`cargo metadata --no-deps`, `cargo update`, `cargo check`); without it Cargo scans fail with a clear message. Every `Cargo.toml` outside `target`, `node_modules`, `vendor`, hidden folders and `src` is examined, and each workspace is read once.
96
+
97
+ * **Where versions are written.** Elevate edits only the version text of the declaring literal — in the crate's own `Cargo.toml`, or in `[workspace.dependencies]` of the root for `workspace = true`. Comments, quotes and line endings stay. `cargo add` is not used because it replaces `workspace = true`.
98
+ * **Requirements.** A bare `1.2.3` means `^1.2.3`. The new requirement keeps the operator and the number of components: `"1"` → `"2"`, `"1.0.100"` → `"1.0.229"`. `0.x` updates that change the first non-zero component count as *major*.
99
+ * **Registries.** Versions are read from the sparse index named by your Cargo configuration (`.cargo/config.toml` in parent directories, `$CARGO_HOME`, `include`). A crate from an alternative registry is looked up only there. A source replacement Elevate cannot read (directory, local registry, git) stops the lookup. Registries that require authentication are reported as failed lookups.
100
+ * **Proxy.** Registry lookups use Node's `fetch`, which ignores `HTTP_PROXY`/`HTTPS_PROXY` unless the process is started with `NODE_USE_ENV_PROXY=1` (checked with Node 22.23). Behind a proxy run `NODE_USE_ENV_PROXY=1 elevate …`; a failed lookup says so. Cargo's own `http.proxy` and `http.cainfo` settings are not read; use `NODE_EXTRA_CA_CERTS` for a private CA.
101
+ * **Lock file.** After the edit `Cargo.lock` is refreshed with `cargo update -p`, and pinned with `--precise` when you picked an older version. A repository without `Cargo.lock` gets none.
102
+ * **Verification.** `cargo check --all-targets` for the changed crates and the crates depending on them; a changed workspace root checks the whole workspace. Build scripts of the new versions run during the check.
103
+
92
104
  ### Requirements for Maven
93
105
 
94
106
  Elevate uses the project's Maven Wrapper (`mvnw` / `mvnw.cmd`) when present, otherwise `mvn` on the `PATH`. Without either, Maven scans fail with a clear message instead of guessing. Plugin versions are pinned for reproducible results (`maven-help-plugin` 3.5.2, `versions-maven-plugin` 2.22.0) and can be replaced per repository with `mavenPlugins` in `elevate.config.json` (see [Maven plugin versions](#maven-plugin-versions)). Scans write temporary files only to `target/.elevate-*` and remove them afterwards.
@@ -103,9 +115,31 @@ Elevate works the same wherever in the repository it is started. The root is fou
103
115
 
104
116
  The search never leaves the version-control checkout: it stops at the nearest directory that contains a `.git` entry, so a stray `package.json` or `pom.xml` somewhere above the repository is never mistaken for its root. Manifests that cannot be parsed are skipped.
105
117
 
106
- ### Package manager guard (npm)
118
+ ### Package manager guard (Yarn and Bun)
119
+
120
+ Elevate's Node.js support drives npm and pnpm. In a repository managed by Yarn or Bun it refuses to scan or change the modules, because either tool would create a second lockfile and a `node_modules` layout the project does not use. The package manager is recognised from the repository root, in this order: the `packageManager` field of `package.json` (`npm@`, `pnpm@`, `yarn@`, `bun@`), then `package-lock.json` / `npm-shrinkwrap.json`, `pnpm-lock.yaml` / `pnpm-workspace.yaml`, `yarn.lock` / `.yarnrc.yml`, `bun.lock` / `bun.lockb`; without any of them the repository is treated as npm. If Elevate is started inside a workspace package, the search continues in the parent directories up to the checkout (the nearest directory with a `.git` entry); without a checkout only the directory itself is examined. The refusal names the manager and the file that decided. Maven modules in the same repository, read-only version queries (`elevate versions`) and a custom `postUpdateScript` are not affected.
121
+
122
+ ### pnpm workspaces and catalogs
123
+
124
+ * **Workspace file.** In a pnpm repository the `packages` list of `pnpm-workspace.yaml` (not the `workspaces` field of `package.json`) defines the modules; `*`, `**` and `!` patterns work as for npm, the root is always a module and `node_modules` never contains modules. A `pnpm-workspace.yaml` also marks the repository root, even without a `packages` list. A file that is not valid YAML counts as absent.
125
+ * **Catalogs.** A `catalog:` / `catalog:default` / `catalog:<name>` dependency is offered with the range from the catalog and the new range is written to that entry of `pnpm-workspace.yaml` (comments, quotes, notation and line endings stay; the module's `package.json` is not rewritten). A reference that cannot be resolved is listed as `catalog-unresolved`. The JSON output says where the version is declared: `"declaredIn": {"file": "pnpm-workspace.yaml", "kind": "catalog", "catalog": "default"}`.
126
+ * **Overrides** (`pnpm.overrides`, `overrides` in `pnpm-workspace.yaml`, `resolutions`) and `peerDependencies` are never changed.
127
+
128
+ ### Commands Elevate runs for pnpm
129
+
130
+ All in the repository root; Elevate uses the `pnpm` on the `PATH` (the `packageManager` field and Corepack decide the version). `pnpm --version` runs first and, if it fails, the operation stops with an explanation before anything is touched.
131
+
132
+ | Purpose | Command | Timeout |
133
+ | :--- | :--- | :--- |
134
+ | Is pnpm usable? | `pnpm --version` | 15 s |
135
+ | Install after writing the ranges | `pnpm install --no-frozen-lockfile` | 10 min |
136
+ | Restore after a rollback | `pnpm install --frozen-lockfile` | 10 min |
137
+ | Default verification (lockfile consistency, replaces `npm ls`) | `pnpm install --frozen-lockfile --lockfile-only` | 10 min |
138
+ | Vulnerability summary | `pnpm audit --json` | 60 s |
139
+ | Versions of a package | `pnpm view <name> <field> --json` | 15 s |
140
+ | Registry configuration | `pnpm config list --json` | 15 s |
107
141
 
108
- Elevate's Node.js support drives npm. In a repository managed by pnpm, Yarn or Bun it refuses to scan or change the npm modules, because `npm install` would create a second lockfile and a `node_modules` layout the project does not use. The package manager is recognised from the repository root, in this order: the `packageManager` field of `package.json` (`npm@`, `pnpm@`, `yarn@`, `bun@`), then `package-lock.json` / `npm-shrinkwrap.json`, `pnpm-lock.yaml` / `pnpm-workspace.yaml`, `yarn.lock` / `.yarnrc.yml`, `bun.lock` / `bun.lockb`; without any of them the repository is treated as npm. If Elevate is started inside a workspace package, the search continues in the parent directories up to the checkout (the nearest directory with a `.git` entry); without a checkout only the directory itself is examined. The refusal names the manager and the file that decided. Maven modules in the same repository, read-only version queries (`elevate versions`) and a custom `postUpdateScript` are not affected.
142
+ `--no-frozen-lockfile` is passed explicitly because with `CI` set `pnpm install` is implicitly frozen and would fail on the manifest Elevate just changed. `pnpm ls` is not used for verification: it exits with 0 for missing dependencies. The vulnerability summary comes from `pnpm audit --json` (`pnpm install` prints none); an audit without a result is a warning, never a reason to roll back. Elevate does not read pnpm settings such as `minimumReleaseAge` or build-script approval; if pnpm refuses because of them, the update is rolled back with pnpm's own message.
109
143
 
110
144
  ### Dependency sections (npm)
111
145
 
@@ -153,7 +187,12 @@ src/
153
187
  │ │ ├── npm-registry.ts # npm view queries & dist-tags
154
188
  │ │ ├── npm-scanner.ts # Origins, alignment, SemVer diffs
155
189
  │ │ ├── npm-lockfile.ts # Workspace link check in package-lock.json
156
- │ │ ├── npm-package-manager.ts # Package manager detection & guard
190
+ │ │ ├── npm-package-manager.ts # Package manager detection, guard & pnpm check
191
+ │ │ ├── npm-commands.ts # Commands per package manager (npm / pnpm)
192
+ │ │ ├── npm-protocols.ts # workspace: / catalog: range protocols
193
+ │ │ ├── pnpm-workspace.ts # pnpm-workspace.yaml: packages, catalogs, in-place edit
194
+ │ │ ├── pnpm-lockfile.ts # Workspace link check in pnpm-lock.yaml
195
+ │ │ ├── pnpm-audit.ts # pnpm audit --json summary
157
196
  │ │ ├── npm-updater.ts # Updates package.json & runs npm install
158
197
  │ │ ├── npm-verifier.ts # npm ls / custom verification
159
198
  │ │ └── npm-strategy.ts # NpmEcosystemStrategy
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dennisrepa/elevate",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "description": "🪶 Elevate — Interactive Polyglot Terminal Dashboard & Agentic MCP Server for safe dependency updates across monorepos.",
5
5
  "type": "module",
6
6
  "main": "./dist/cli.js",
@@ -14,8 +14,7 @@
14
14
  "docs/de.md"
15
15
  ],
16
16
  "publishConfig": {
17
- "access": "public",
18
- "registry": "https://registry.npmjs.org/"
17
+ "access": "public"
19
18
  },
20
19
  "keywords": [
21
20
  "cli",
@@ -24,7 +23,10 @@
24
23
  "updater",
25
24
  "monorepo",
26
25
  "npm",
26
+ "pnpm",
27
27
  "maven",
28
+ "cargo",
29
+ "rust",
28
30
  "mcp",
29
31
  "agentic"
30
32
  ],
@@ -46,9 +48,7 @@
46
48
  "prepublishOnly": "npm run build",
47
49
  "typecheck": "tsc --noEmit -p . && tsc -p tsconfig.test.json",
48
50
  "test": "vitest run",
49
- "test:integration": "vitest run --config vitest.integration.config.ts",
50
- "preversion": "node scripts/changelog.mjs check",
51
- "version": "node scripts/changelog.mjs release && git add CHANGELOG.md"
51
+ "test:integration": "vitest run --config vitest.integration.config.ts"
52
52
  },
53
53
  "author": {
54
54
  "name": "Dennis Répa",
@@ -65,20 +65,27 @@
65
65
  "dependencies": {
66
66
  "@modelcontextprotocol/sdk": "^1.30.1",
67
67
  "@npmcli/map-workspaces": "^6.0.0",
68
- "ink": "^6.3.0",
68
+ "ink": "^8.0.0",
69
69
  "picocolors": "^1.1.1",
70
70
  "react": "^19.0.0",
71
71
  "saxes": "^6.0.0",
72
72
  "semver": "^7.6.3",
73
- "tsx": "^4.19.3"
73
+ "toml-eslint-parser": "^1.0.3",
74
+ "tsx": "^4.19.3",
75
+ "yaml": "^2.9.1"
74
76
  },
75
77
  "devDependencies": {
76
78
  "@types/node": "^26.6.2",
77
79
  "@types/react": "^19.3.0",
78
80
  "@types/semver": "^7.8.0",
79
81
  "ink-testing-library": "^4.0.0",
80
- "tsup": "^8.5.1",
82
+ "tsup": "^9.0.0",
81
83
  "typescript": "^7.0.2",
82
84
  "vitest": "^5.0.3"
85
+ },
86
+ "overrides": {
87
+ "glob": "^14.0.2",
88
+ "minimatch": "^11.0.1",
89
+ "esbuild": "^0.28.2"
83
90
  }
84
91
  }