@dennisrepa/elevate 1.2.0 โ†’ 1.3.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/en.md CHANGED
@@ -1,309 +1,414 @@
1
- # ๐Ÿชถ Elevate โ€” English Documentation
2
-
3
- > **Interactive Polyglot Terminal Dashboard (TUI) for safe, selective, and transparent dependency management across monorepos and multi-project repositories.**
4
- > *Developed and maintained by **Dennis Rรฉpa**.*
5
-
6
- ---
7
-
8
- ## ๐ŸŒŸ Overview
9
-
10
- **Elevate** is an interactive terminal dashboard (TUI) for safe, selective, and transparent dependency management across **polyglot monorepos** (Node/npm & Java/Maven) and single-package projects.
11
-
12
- * **Feather Identity (`๐Ÿชถ`) & Orange Brand (`#FF8800`):** Clean, modern, and readable in any terminal.
13
- * **Polyglot Architecture:** Seamlessly manages frontend workspaces (`package.json` with npm workspaces) and backend modules (`pom.xml` with Maven).
14
- * **Release Channels:** Filters out pre-releases (Alpha, Beta, RC, Milestone, Snapshot) by default, suggesting only battle-tested production releases.
15
- * **Animated Companion ("Pip" ๐Ÿฃ):** A delightful chicken mascot that reacts to actions and keeps you company in the terminal.
16
- * **Bilingual i18n:** Toggle on the fly between English and German with the **`[L]`** key.
17
-
18
- ---
19
-
20
- ## โœจ Features & Highlights
21
-
22
- 1. **๐ŸŒ Polyglot Monorepo Support (npm & Maven):**
23
- * **Node / npm:** Discovers root and workspace packages, calculates SemVer diffs, updates `package.json`, and runs `npm install`.
24
- * **Java / Maven:** Scans the project tree for all `pom.xml` files (Spring Boot services, libraries, etc.), queries Maven Central, and verifies source code with `mvn test-compile`.
25
- * **Runtime Switch:** Press **`[E]`** anytime to switch between frontend and backend modules.
26
-
27
- 2. **๐Ÿ” Pick a Specific Version (`[V]`):**
28
- * You aren't restricted to upgrading only to `latest`: pressing **`[V]`** opens an interactive modal to browse and select any published version for the focused package.
29
- * Fetches the entire version history directly from the npm or Maven registry.
30
- * Real-time search/filtering as you type (e.g. `3.2` or `25`), arrow key navigation, and instant selection via `Enter`.
31
- * Manually chosen versions are marked with a `[MANUAL]` badge in the dashboard.
32
-
33
- 3. **๐Ÿšฆ Release Channels (`stable` vs. `all`):**
34
- * **`channel: "stable"` (Default):** Prevents accidental upgrades to pre-releases (`-alpha`, `-beta`, `-rc`, `-m1`, `-snapshot`).
35
- * **`channel: "all"`:** Displays all versions and highlights pre-releases with prominent magenta badges (`[BETA]`, `[RC]`, `[ALPHA]`).
36
-
37
- 4. **๐Ÿ›ก๏ธ Monorepo Symlink & Internal Scope Protection:**
38
- * Protects internal packages (e.g. `@my-org/*`, `com.mycompany.*`) from being overwritten by public registries.
39
-
40
- 5. **๐Ÿฃ Animated Mascot ("Pip"):**
41
- * Positioned neatly in the bottom right corner of the dashboard.
42
- * State-reactive behavior:
43
- * *Idle:* Blinks gently or sips coffee in Java mode (`*sipping coffee* โ˜•`).
44
- * *Scanning:* Inspects dependencies with a magnifying glass (`( ห˜ำฉห˜ )๐Ÿ”`).
45
- * *Building:* Rolls up its sleeves (`(เธ‡ โ€ขำฉโ€ข )เธ‡`).
46
- * *Success:* Celebrates with confetti (`\( แต”ำฉแต” )/ ๐ŸŽ‰`).
47
-
48
- 6. **๐Ÿš€ Initial Splash Screen:**
49
- * A stylish intro screen with an animated progress bar (~3.2 seconds).
50
- * Can be skipped immediately at any time by pressing `[Space]` or `[Enter]`.
51
-
52
- ---
53
-
54
- ## ๐Ÿ—๏ธ Domain-Driven Clean Architecture
55
-
56
- Elevate follows **Domain-Driven Design (DDD)** and **Hexagonal Architecture (Ports & Adapters)**. The UI and hooks never depend directly on a package manager:
57
-
58
- ```text
59
- src/
60
- โ”œโ”€โ”€ domain/ # ๐Ÿง  DOMAIN CORE (Pure domain logic, zero I/O)
61
- โ”‚ โ”œโ”€โ”€ models.ts # Entities & Value Objects (ProjectModule, UpdateCandidate, etc.)
62
- โ”‚ โ”œโ”€โ”€ ports.ts # Domain Ports (ModuleDiscoveryPort, RegistryPort, etc.)
63
- โ”‚ โ”œโ”€โ”€ ecosystem-strategy.ts # Strategy Pattern: Platform-agnostic interface
64
- โ”‚ โ””โ”€โ”€ ecosystem-factory.ts # Factory Pattern: Resolves npm or Maven strategy
65
- โ”‚
66
- โ”œโ”€โ”€ adapters/ # ๐Ÿ”Œ ADAPTERS (Concrete port implementations)
67
- โ”‚ โ”œโ”€โ”€ npm/ # ๐Ÿ“ฆ Node / npm Adapters
68
- โ”‚ โ”‚ โ”œโ”€โ”€ npm-discovery.ts # Reads workspaces from root package.json
69
- โ”‚ โ”‚ โ”œโ”€โ”€ npm-registry.ts # npm registry queries & dist-tags
70
- โ”‚ โ”‚ โ”œโ”€โ”€ npm-scanner.ts # Parses dependencies & SemVer diffs
71
- โ”‚ โ”‚ โ”œโ”€โ”€ npm-updater.ts # Updates package.json & runs npm install
72
- โ”‚ โ”‚ โ”œโ”€โ”€ npm-verifier.ts # Workspace check & test verification
73
- โ”‚ โ”‚ โ””โ”€โ”€ npm-strategy.ts # NpmEcosystemStrategy
74
- โ”‚ โ”‚
75
- โ”‚ โ””โ”€โ”€ maven/ # โ˜• Java / Maven Adapters
76
- โ”‚ โ”œโ”€โ”€ maven-discovery.ts # Finds all pom.xml files in the repo tree
77
- โ”‚ โ”œโ”€โ”€ maven-registry.ts # Maven Central metadata & release filters
78
- โ”‚ โ”œโ”€โ”€ maven-scanner.ts # Parses dependencies, deduplication & properties
79
- โ”‚ โ”œโ”€โ”€ maven-updater.ts # Updates pom.xml & runs mvn dependency:resolve
80
- โ”‚ โ”œโ”€โ”€ maven-verifier.ts # mvn test-compile code verification
81
- โ”‚ โ””โ”€โ”€ maven-strategy.ts # MavenEcosystemStrategy
82
- โ”‚
83
- โ”œโ”€โ”€ hooks/ # ๐ŸŽฃ APPLICATION HOOKS (Consume only domain ports)
84
- โ”‚ โ”œโ”€โ”€ use-workspaces.ts # Module management via ModuleDiscoveryPort
85
- โ”‚ โ”œโ”€โ”€ use-packages.ts # Scanning & filtering via DependencyReaderPort
86
- โ”‚ โ””โ”€โ”€ use-updater.ts # Updating & verification via updater/verifier ports
87
- โ”‚
88
- โ”œโ”€โ”€ components/ # ๐ŸŽจ PRESENTATIONAL UI (Pure rendering with Ink)
89
- โ”‚ โ”œโ”€โ”€ header.tsx # Ecosystem [E], Channel [stable], Language [L], Author
90
- โ”‚ โ”œโ”€โ”€ workspace-bar.tsx # Active module with static protection notice
91
- โ”‚ โ”œโ”€โ”€ mascot.tsx # ๐Ÿฃ Animated companion ("Pip")
92
- โ”‚ โ”œโ”€โ”€ status-bar.tsx # Rock-solid status bar with counts & mascot
93
- โ”‚ โ”œโ”€โ”€ tab-bar.tsx # Ecosystem-specific tabs
94
- โ”‚ โ”œโ”€โ”€ package-list.tsx # Scrollable list with orange accents
95
- โ”‚ โ”œโ”€โ”€ package-row.tsx # Row with badges ([Patch], [Minor], [MAJOR], [BETA])
96
- โ”‚ โ”œโ”€โ”€ controls-bar.tsx # Keyboard shortcuts
97
- โ”‚ โ”œโ”€โ”€ workspace-modal.tsx # Modal selector for modules
98
- โ”‚ โ”œโ”€โ”€ version-modal.tsx # ๐Ÿ” Modal version search & picker
99
- โ”‚ โ”œโ”€โ”€ splash-screen.tsx # Initial startup screen
100
- โ”‚ โ”œโ”€โ”€ updating-view.tsx # Update progress display
101
- โ”‚ โ””โ”€โ”€ summary-view.tsx # Final report summary
102
- โ”‚
103
- โ”œโ”€โ”€ cli/ # ๐Ÿ’ป HEADLESS CLI SUBCOMMANDS (for CI/CD & Shell-Agents)
104
- โ”‚ โ”œโ”€โ”€ parser.ts # Zero-dependency CLI argument parser
105
- โ”‚ โ”œโ”€โ”€ command-modules.ts # `elevate modules`
106
- โ”‚ โ”œโ”€โ”€ command-scan.ts # `elevate scan`
107
- โ”‚ โ”œโ”€โ”€ command-versions.ts # `elevate versions`
108
- โ”‚ โ””โ”€โ”€ command-update.ts # `elevate update`
109
- โ”‚
110
- โ”œโ”€โ”€ mcp/ # ๐Ÿค– MODEL CONTEXT PROTOCOL (MCP Server)
111
- โ”‚ โ””โ”€โ”€ mcp-server.ts # Standard stdio MCP server exposing 5 tools
112
- โ”‚
113
- โ”œโ”€โ”€ i18n/ # ๐ŸŒ Localization dictionaries (de.ts / en.ts)
114
- โ”œโ”€โ”€ config.ts # โš™๏ธ Configuration loader
115
- โ”œโ”€โ”€ theme.ts # ๐ŸŽจ Color tokens & icons
116
- โ”œโ”€โ”€ app.tsx # ๐Ÿ“ฑ App Shell (Container)
117
- โ””โ”€โ”€ index.tsx # ๐Ÿ Universal entry point (TUI / CLI / MCP)
118
- ```
119
-
120
- ---
121
-
122
- ## ๐Ÿค– Agentic & CI/CD Support (Headless CLI & MCP)
123
-
124
- Elevate is built from the ground up for agentic execution by AI coding assistants (Claude Code, Antigravity, Cursor, Copilot CLI) and automated CI/CD runners.
125
-
126
- ### 1. Headless CLI Subcommands (`--json`)
127
-
128
- Any command line agent or pipeline can run Elevate without starting the interactive TUI:
129
-
130
- ```bash
131
- # Discover modules in monorepo
132
- node tools/updater/elevate/index.mjs modules --json
133
-
134
- # Scan dependencies across all modules (exit code 1 if updates found)
135
- node tools/updater/elevate/index.mjs scan --channel=stable --all-modules --json
136
-
137
- # Query complete version history for a package
138
- node tools/updater/elevate/index.mjs versions chalk --json
139
-
140
- # Apply updates with safety guardrails (simulation via --dry-run)
141
- node tools/updater/elevate/index.mjs update --module=apps/e2e-cockpit --packages=chalk@5.6.2 --dry-run --json
142
-
143
- # Apply major updates (explicit permission required)
144
- node tools/updater/elevate/index.mjs update --module=apps/e2e-cockpit --packages=pinia@4.0.3 --allow-major --json
145
- ```
146
-
147
- ### 2. Model Context Protocol (MCP) Server
148
-
149
- Elevate provides a native, stdio-based MCP Server:
150
- ```bash
151
- node tools/updater/elevate/index.mjs mcp
152
- ```
153
-
154
- Register it in your agent's MCP settings (e.g., `claude_desktop_config.json` or Antigravity MCP config):
155
- ```json
156
- {
157
- "mcpServers": {
158
- "elevate": {
159
- "command": "npx",
160
- "args": ["-y", "@dennisrepa/elevate", "mcp"]
161
- }
162
- }
163
- }
164
- ```
165
-
166
- #### Available MCP Tools for LLMs:
167
- | Tool | Purpose |
168
- | :--- | :--- |
169
- | `elevate_discover_modules` | Discovers all repository modules and workspaces for npm or Maven |
170
- | `elevate_scan` | Scans a module (or all modules) for available dependency updates |
171
- | `elevate_get_versions` | Fetches complete published version history from registry |
172
- | `elevate_apply_updates` | Applies targeted updates with verification & major guardrails |
173
- | `elevate_verify` | Runs module-specific build and test verification checks |
174
-
175
- ---
176
-
177
- ## โŒจ๏ธ Keyboard Shortcuts (Interactive TUI)
178
-
179
- | Key | Action |
180
- | :--- | :--- |
181
- | **`E`** | **Switch Ecosystem (๐Ÿ“ฆ Node/npm โ‡„ โ˜• Java/Maven)** |
182
- | **`W`** | Open module / workspace selector |
183
- | **`V`** | **Pick specific version (Interactive search & filter modal)** |
184
- | **`L`** | Toggle language (English โ‡„ German) |
185
- | **`โ†‘` / `โ†“`** *(or `k`/`j`)* | Navigate list items |
186
- | **`Space`** | Toggle selection of focused item |
187
- | **`A`** | Toggle all visible items in the active tab |
188
- | **`Tab`** *(or `1`, `2`, `3`)* | Switch between tabs |
189
- | **`U`** | Start update for all selected items |
190
- | **`R`** | Re-scan the active module |
191
- | **`Q`** | Quit Elevate |
192
-
193
- ---
194
-
195
- ## โš™๏ธ Configuration (`elevate.config.json`)
196
-
197
- You can place an optional `elevate.config.json` file in your repository root:
198
-
199
- ```json
200
- {
201
- "author": "Dennis Rรฉpa",
202
- "channel": "stable",
203
- "locale": "en",
204
- "excludeScopes": ["@my-org", "com.mycompany"],
205
- "postUpdateScript": "npm test",
206
- "postUpdateLabel": "Run test suite"
207
- }
208
- ```
209
-
210
- * **`author`:** Optional name displayed in the top-right header.
211
- * **`channel`:** `"stable"` (default, excludes betas/RCs) or `"all"` (includes pre-releases).
212
- * **`locale`:** `"en"` (English), `"de"` (German), or `"auto"` (system detection).
213
- * **`excludeScopes`:** List of internal package prefixes protected from external registry lookups.
214
- * **`postUpdateScript`:** Optional script executed after an npm update.
215
-
216
- ---
217
-
218
- ## ๐Ÿ“ฆ Installation & Setup
219
-
220
- Elevate offers multiple flexible options for any developer workflow or environment:
221
-
222
- ### 1. โšก Zero-Install Instant Run via `npx` (Recommended)
223
- Run Elevate immediately without cloning or installing anything:
224
- ```bash
225
- npx @dennisrepa/elevate
226
- ```
227
- > **For Autonomous AI Agents (Claude Code, Cursor, Antigravity):**
228
- > Register Elevate directly in your agent's MCP settings:
229
- > ```json
230
- > {
231
- > "mcpServers": {
232
- > "elevate": {
233
- > "command": "npx",
234
- > "args": ["-y", "@dennisrepa/elevate", "mcp"]
235
- > }
236
- > }
237
- > }
238
- > ```
239
-
240
- ---
241
-
242
- ### 2. ๐ŸชŸ Standalone Executable (Zero Node.js Required)
243
- For Java/Backend developers, system administrators, or CI environments without Node.js:
244
- 1. Download `elevate.exe` (Windows) or `elevate-linux` from the **[GitHub Releases](https://github.com/dennisrepa/elevate/releases)**.
245
- 2. Run directly in your terminal:
246
- ```powershell
247
- .\elevate.exe
248
- ```
249
- *(Or double-click `elevate.exe` in Windows Explorer).*
250
-
251
- ---
252
-
253
- ### 3. ๐ŸŒ Global System Installation
254
- Install Elevate globally to have the `elevate` command available in every terminal:
255
- ```bash
256
- npm install -g @dennisrepa/elevate
257
- ```
258
- Then launch anywhere:
259
- ```bash
260
- elevate
261
- ```
262
-
263
- ---
264
-
265
- ### 4. ๐Ÿข Monorepo & Project Integration
266
- Add Elevate as a devDependency to your project or monorepo:
267
- ```bash
268
- npm install -D @dennisrepa/elevate
269
- ```
270
- Add an `elevate` script to your root `package.json`:
271
- ```json
272
- {
273
- "scripts": {
274
- "elevate": "elevate"
275
- }
276
- }
277
- ```
278
- Now every team member can launch the dashboard using:
279
- ```bash
280
- npm run elevate
281
- ```
282
-
283
- ---
284
-
285
- ### 5. ๐Ÿ› ๏ธ Local Development & Contributing (Inside this Repo)
286
- If you are developing or customizing Elevate locally:
287
- ```bash
288
- cd tools/updater/elevate
289
- npm run build
290
- npm link
291
- ```
292
- Run directly from repo root:
293
- ```powershell
294
- .\elevate.exe
295
- # or
296
- node tools/updater/elevate/dist/cli.js
297
- ```
298
-
299
- ---
300
-
301
- ## โ˜• Support & Funding
302
-
303
- Elevate is free, open-source software maintained to make dependency updates safe, fast, and transparent across multi-language monorepos. If Elevate saves you or your team valuable development time, you can support its creator and future feature development:
304
-
305
- [![Support Dennis Rรฉpa on Ko-fi](https://img.shields.io/badge/Ko--fi-Support%20Dennis%20R%C3%A9pa-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/dennisrepa)
306
-
307
- * โ˜• **[Buy Dennis a coffee on Ko-fi](https://ko-fi.com/dennisrepa)**
308
- * ๐Ÿ’ป Or run: `npm fund @dennisrepa/elevate`
309
-
1
+ # ๐Ÿชถ Elevate โ€” English Documentation
2
+
3
+ > **Interactive Polyglot Terminal Dashboard (TUI) for safe, selective, and transparent dependency management across monorepos and multi-project repositories.**
4
+ > *Developed and maintained by **Dennis Rรฉpa**.*
5
+
6
+ ---
7
+
8
+ ## ๐ŸŒŸ Overview
9
+
10
+ **Elevate** is an interactive terminal dashboard (TUI) for safe, selective, and transparent dependency management across **polyglot monorepos** (Node/npm & Java/Maven) and single-package projects.
11
+
12
+ * **Feather Identity (`๐Ÿชถ`) & Orange Brand (`#FF8800`):** Clean, modern, and readable in any terminal.
13
+ * **Polyglot Architecture:** Seamlessly manages frontend workspaces (`package.json` with npm workspaces) and backend modules (`pom.xml` with Maven).
14
+ * **Release Channels:** Filters out pre-releases (Alpha, Beta, RC, Milestone, Snapshot) by default, suggesting only battle-tested production releases.
15
+ * **Animated Companion ("Pip" ๐Ÿฃ):** A delightful chicken mascot that reacts to actions and keeps you company in the terminal.
16
+ * **Bilingual i18n:** Toggle on the fly between English and German with the **`[L]`** key.
17
+
18
+ ---
19
+
20
+ ## โœจ Features & Highlights
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.
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
+ * **Runtime Switch:** Press **`[E]`** anytime to switch between frontend and backend modules.
26
+
27
+ 2. **๐Ÿ” Pick a Specific Version (`[V]`):**
28
+ * You aren't restricted to upgrading only to `latest`: pressing **`[V]`** opens an interactive modal to browse and select any published version for the focused package.
29
+ * Fetches the entire version history directly from the npm or Maven registry.
30
+ * Real-time search/filtering as you type (e.g. `3.2` or `25`), arrow key navigation, and instant selection via `Enter`.
31
+ * Manually chosen versions are marked with a `[MANUAL]` badge in the dashboard.
32
+
33
+ 3. **๐Ÿšฆ Release Channels (`stable` vs. `all`):**
34
+ * **`channel: "stable"` (Default):** Prevents accidental upgrades to pre-releases (`-alpha`, `-beta`, `-rc`, `-m1`, `-snapshot`).
35
+ * **`channel: "all"`:** Displays all versions and highlights pre-releases with prominent magenta badges (`[BETA]`, `[RC]`, `[ALPHA]`).
36
+
37
+ 4. **๐Ÿข Internal Dependencies (Workspace Modules & Private Registries):**
38
+ * Workspace modules that depend on each other are kept in line with their local versions (`[Align]`).
39
+ * Internal packages (`internalScopes`, e.g. `@my-org/*`, `com.mycompany.*`) are looked up only in private registries โ€” never on a public one.
40
+ * See [Internal Dependencies & Safety](#-internal-dependencies--safety) below.
41
+
42
+ 5. **๐Ÿฃ Animated Mascot ("Pip"):**
43
+ * Positioned neatly in the bottom right corner of the dashboard.
44
+ * State-reactive behavior:
45
+ * *Idle:* Blinks gently or sips coffee in Java mode (`*sipping coffee* โ˜•`).
46
+ * *Scanning:* Inspects dependencies with a magnifying glass (`( ห˜ำฉห˜ )๐Ÿ”`).
47
+ * *Building:* Rolls up its sleeves (`(เธ‡ โ€ขำฉโ€ข )เธ‡`).
48
+ * *Success:* Celebrates with confetti (`\( แต”ำฉแต” )/ ๐ŸŽ‰`).
49
+
50
+ 6. **๐Ÿš€ Initial Splash Screen:**
51
+ * A stylish intro screen with an animated progress bar (~3.2 seconds).
52
+ * Can be skipped immediately at any time by pressing `[Space]` or `[Enter]`.
53
+
54
+ ---
55
+
56
+ ## ๐Ÿข Internal Dependencies & Safety
57
+
58
+ Every dependency is classified by **origin** before any registry is contacted:
59
+
60
+ | Origin | Recognised by | Version source | Action |
61
+ | :--- | :--- | :--- | :--- |
62
+ | `workspace` | A module discovered in this repository | The module's **local** version | `align` |
63
+ | `private` | `internalScopes`, or an explicit `@scope:registry` mapping in `.npmrc` | The private registry configured for it | `update` |
64
+ | `public` | Everything else | The configured registry | `update` |
65
+
66
+ The registry URL alone is deliberately **not** used to decide the origin: in most companies every request โ€” public packages included โ€” goes through one Artifactory or Nexus proxy.
67
+
68
+ ### Aligning workspace modules
69
+
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
+ * **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
+ * 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
+ ### Private registries & dependency confusion
75
+
76
+ * Internal packages are never looked up on a public registry. If the registry for an internal npm package resolves to `registry.npmjs.org`, it is listed as *not offered* with the reason, instead of being queried โ€” asking a public registry about an internal name is exactly what a dependency-confusion attack exploits.
77
+ * npm lookups use your npm configuration (`npm config`), Maven lookups use Maven itself โ€” mirrors, private repositories and credentials apply without any Elevate-specific configuration, and Elevate never handles credentials.
78
+
79
+ ### Where Maven versions are written
80
+
81
+ Maven's effective POM tells which version applies, not where it is written. Elevate locates the declaring literal โ€” a dependency `<version>`, a `<dependencyManagement>` entry, a property (possibly in a parent POM) or an external `<parent>` โ€” and edits exactly that text, preserving formatting and comments. Before editing, the literal is cross-checked against the effective version; if they differ (active profiles, command-line properties) or the version comes from an external parent/BOM, the dependency is listed as *not offered* with the reason. Artifacts sharing one version property are marked, and conflicting targets for a shared property are rejected.
82
+
83
+ ### Rollback
84
+
85
+ Every update runs as one workflow: **snapshot โž” write & install โž” integrity check โž” verification**. If installation, the integrity check or verification fails, every touched file (manifests, lockfile, parent POMs) is restored and `node_modules` is reinstalled. `--keep-on-failure` (CLI) or `keepOnFailure` (MCP) keeps the changes of a failed *verification* for investigation. Verification also runs once *before* the update: if it already fails there, a failure afterwards is reported as pre-existing and the update is kept instead of rolled back. A crashing verifier counts as a failed verification.
86
+
87
+ ### Verification
88
+
89
+ * **npm:** `npm ls` at the repository root (missing, invalid or unmet dependencies across all workspaces), unless `postUpdateScript` is set.
90
+ * **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
+ ### Requirements for Maven
93
+
94
+ 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.
95
+
96
+ ### Repository root
97
+
98
+ Elevate works the same wherever in the repository it is started. The root is found as follows:
99
+
100
+ 1. The nearest directory (from the start directory upwards) with an `elevate.config.json` is the root.
101
+ 2. Otherwise npm proposes the nearest directory whose `package.json` declares `workspaces`, and Maven proposes the top of the connected POM chain (a `<parent>` found through `<relativePath>` and any aggregator that lists the project in `<modules>`). The outermost proposal wins.
102
+ 3. Without any marker the start directory is the root.
103
+
104
+ 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
+
106
+ ### Package manager guard (npm)
107
+
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.
109
+
110
+ ### Dependency sections (npm)
111
+
112
+ | Section | Scanned | Written |
113
+ | :--- | :---: | :---: |
114
+ | `dependencies`, `devDependencies`, `optionalDependencies` | yes | yes |
115
+ | `peerDependencies`, `overrides`, `bundleDependencies` | no | never |
116
+
117
+ A peer range tells consumers which versions a package works with; raising it because a newer version exists would be a breaking change nobody decided. A name declared in several scanned sections receives the new range in every one of them; for display, `optionalDependencies` take precedence over `dependencies` (as in npm), and a name that is also a development dependency is shown as one.
118
+
119
+ ### Reactor-scoped alignment (Maven)
120
+
121
+ A dependency on another module is aligned to that module's local version only when both modules are built by the same outermost aggregator (the same reactor). Outside a reactor Maven resolves the dependency from a repository like any other artifact, even if a project with the same coordinates lies somewhere in the checkout (a sample, a fixture, an old copy), so such a dependency is looked up and offered as an ordinary update โ€” `private` when it matches `internalScopes`, otherwise `public`. POM files below a project's `src` directory (test fixtures, `maven-invoker-plugin` projects, archetype templates) and below `node_modules`, `target`, `build`, `dist`, `out` or hidden directories are not modules, unless a `<modules>` section names them.
122
+
123
+ ### Maven plugin versions
124
+
125
+ Elevate runs two Maven plugins: `maven-help-plugin` (reads the effective POM, default `3.5.2`) and `versions-maven-plugin` (looks up newer versions, default `2.22.0`). If your repository manager does not offer these versions, set others with `mavenPlugins` in `elevate.config.json`. A value must start with a digit and contain only letters, digits, `.` and `-` (at most 64 characters); anything else is replaced by the default and reported as a warning. When Maven cannot download a plugin, Elevate says so, names the plugin and the setting that replaces its version, and appends Maven's own error lines.
126
+
127
+ ### Windows paths
128
+
129
+ On Windows `npm`, `mvn` and the Maven Wrapper are batch files that run through `cmd.exe`, which interprets `" % ! ^ & | < >` even inside quotes; Elevate refuses to put an argument containing one of them on a command line. The directory the repository lives in is handed to the process as its working directory and project files are named relative to it, so a path such as `C:\R&D\shop` works. Names *inside* the repository that end up on a command line (for example a module directory passed to `-pl`) must still avoid these characters; the error message names the argument and how to fix it.
130
+
131
+ ---
132
+
133
+ ## ๐Ÿ—๏ธ Domain-Driven Clean Architecture
134
+
135
+ Elevate follows **Domain-Driven Design (DDD)** and **Hexagonal Architecture (Ports & Adapters)**. The UI and hooks never depend directly on a package manager:
136
+
137
+ ```text
138
+ src/
139
+ โ”œโ”€โ”€ domain/ # ๐Ÿง  DOMAIN CORE (Pure domain logic, zero I/O)
140
+ โ”‚ โ”œโ”€โ”€ models.ts # Entities & Value Objects (ProjectModule, UpdateCandidate, DependencyOrigin, โ€ฆ)
141
+ โ”‚ โ”œโ”€โ”€ origin.ts # Origin classification (workspace / private / public)
142
+ โ”‚ โ”œโ”€โ”€ versions.ts # Pre-release detection & version helpers
143
+ โ”‚ โ”œโ”€โ”€ ports.ts # Domain Ports (ModuleDiscoveryPort, RegistryPort, etc.)
144
+ โ”‚ โ”œโ”€โ”€ ecosystem-strategy.ts # Strategy Pattern: Platform-agnostic interface
145
+ โ”‚ โ””โ”€โ”€ ecosystem-factory.ts # Factory Pattern: Resolves npm or Maven strategy
146
+ โ”‚
147
+ โ”œโ”€โ”€ adapters/ # ๐Ÿ”Œ ADAPTERS (Concrete port implementations)
148
+ โ”‚ โ”œโ”€โ”€ shared/ # ๐Ÿงฐ XML (position-aware), processes, snapshots, pooling
149
+ โ”‚ โ”‚
150
+ โ”‚ โ”œโ”€โ”€ npm/ # ๐Ÿ“ฆ Node / npm Adapters
151
+ โ”‚ โ”‚ โ”œโ”€โ”€ npm-config.ts # Effective npm config (registries per scope)
152
+ โ”‚ โ”‚ โ”œโ”€โ”€ npm-discovery.ts # Workspaces via @npmcli/map-workspaces
153
+ โ”‚ โ”‚ โ”œโ”€โ”€ npm-registry.ts # npm view queries & dist-tags
154
+ โ”‚ โ”‚ โ”œโ”€โ”€ npm-scanner.ts # Origins, alignment, SemVer diffs
155
+ โ”‚ โ”‚ โ”œโ”€โ”€ npm-lockfile.ts # Workspace link check in package-lock.json
156
+ โ”‚ โ”‚ โ”œโ”€โ”€ npm-package-manager.ts # Package manager detection & guard
157
+ โ”‚ โ”‚ โ”œโ”€โ”€ npm-updater.ts # Updates package.json & runs npm install
158
+ โ”‚ โ”‚ โ”œโ”€โ”€ npm-verifier.ts # npm ls / custom verification
159
+ โ”‚ โ”‚ โ””โ”€โ”€ npm-strategy.ts # NpmEcosystemStrategy
160
+ โ”‚ โ”‚
161
+ โ”‚ โ””โ”€โ”€ maven/ # โ˜• Java / Maven Adapters
162
+ โ”‚ โ”œโ”€โ”€ maven-command.ts # Maven Wrapper / mvn invocation
163
+ โ”‚ โ”œโ”€โ”€ maven-pom.ts # Raw POM model with editable element ranges
164
+ โ”‚ โ”œโ”€โ”€ maven-project.ts # All POMs of the repo, parent chains, reactors
165
+ โ”‚ โ”œโ”€โ”€ maven-discovery.ts # Modules incl. root POM, versions, aggregator
166
+ โ”‚ โ”œโ”€โ”€ maven-resolution.ts # Effective POM & versions-maven-plugin report
167
+ โ”‚ โ”œโ”€โ”€ maven-locator.ts # Finds where a version is declared
168
+ โ”‚ โ”œโ”€โ”€ maven-scanner.ts # Origins, alignment, update candidates
169
+ โ”‚ โ”œโ”€โ”€ maven-registry.ts # `elevate versions` via Maven (any Nexus/Artifactory)
170
+ โ”‚ โ”œโ”€โ”€ maven-updater.ts # Formatting-preserving POM edits
171
+ โ”‚ โ”œโ”€โ”€ maven-verifier.ts # mvn test-compile -pl โ€ฆ -amd
172
+ โ”‚ โ””โ”€โ”€ maven-strategy.ts # MavenEcosystemStrategy
173
+ โ”‚
174
+ โ”œโ”€โ”€ application/ # ๐Ÿงญ USE CASES shared by TUI, CLI and MCP
175
+ โ”‚ โ”œโ”€โ”€ scan.ts # Scan context, module lookup, JSON output
176
+ โ”‚ โ”œโ”€โ”€ update-selection.ts # Guardrails for requested updates
177
+ โ”‚ โ”œโ”€โ”€ update-workflow.ts # Snapshot โž” install โž” integrity โž” verify โž” rollback
178
+ โ”‚ โ””โ”€โ”€ version-lookup.ts # Version history without public lookups of internal names
179
+ โ”‚
180
+ โ”œโ”€โ”€ hooks/ # ๐ŸŽฃ APPLICATION HOOKS (Consume only domain ports)
181
+ โ”‚ โ”œโ”€โ”€ use-workspaces.ts # Module management via ModuleDiscoveryPort
182
+ โ”‚ โ”œโ”€โ”€ use-packages.ts # Scanning & filtering via DependencyReaderPort
183
+ โ”‚ โ””โ”€โ”€ use-updater.ts # Runs the shared update workflow
184
+ โ”‚
185
+ โ”œโ”€โ”€ components/ # ๐ŸŽจ PRESENTATIONAL UI (Pure rendering with Ink)
186
+ โ”‚ โ”œโ”€โ”€ header.tsx # Ecosystem [E], Channel [stable], Language [L], Author
187
+ โ”‚ โ”œโ”€โ”€ workspace-bar.tsx # Active module with static protection notice
188
+ โ”‚ โ”œโ”€โ”€ mascot.tsx # ๐Ÿฃ Animated companion ("Pip")
189
+ โ”‚ โ”œโ”€โ”€ status-bar.tsx # Rock-solid status bar with counts & mascot
190
+ โ”‚ โ”œโ”€โ”€ tab-bar.tsx # Ecosystem-specific tabs
191
+ โ”‚ โ”œโ”€โ”€ package-list.tsx # Scrollable list with orange accents
192
+ โ”‚ โ”œโ”€โ”€ package-row.tsx # Row with badges ([Patch], [Minor], [MAJOR], [BETA])
193
+ โ”‚ โ”œโ”€โ”€ controls-bar.tsx # Keyboard shortcuts
194
+ โ”‚ โ”œโ”€โ”€ workspace-modal.tsx # Modal selector for modules
195
+ โ”‚ โ”œโ”€โ”€ version-modal.tsx # ๐Ÿ” Modal version search & picker
196
+ โ”‚ โ”œโ”€โ”€ splash-screen.tsx # Initial startup screen
197
+ โ”‚ โ”œโ”€โ”€ updating-view.tsx # Update progress display
198
+ โ”‚ โ””โ”€โ”€ summary-view.tsx # Final report summary
199
+ โ”‚
200
+ โ”œโ”€โ”€ cli/ # ๐Ÿ’ป HEADLESS CLI SUBCOMMANDS (for CI/CD & Shell-Agents)
201
+ โ”‚ โ”œโ”€โ”€ parser.ts # Zero-dependency CLI argument parser
202
+ โ”‚ โ”œโ”€โ”€ command-modules.ts # `elevate modules`
203
+ โ”‚ โ”œโ”€โ”€ command-scan.ts # `elevate scan`
204
+ โ”‚ โ”œโ”€โ”€ command-versions.ts # `elevate versions`
205
+ โ”‚ โ””โ”€โ”€ command-update.ts # `elevate update`
206
+ โ”‚
207
+ โ”œโ”€โ”€ mcp/ # ๐Ÿค– MODEL CONTEXT PROTOCOL (MCP Server)
208
+ โ”‚ โ””โ”€โ”€ mcp-server.ts # Standard stdio MCP server exposing 5 tools
209
+ โ”‚
210
+ โ”œโ”€โ”€ i18n/ # ๐ŸŒ Localization dictionaries (de.ts / en.ts)
211
+ โ”œโ”€โ”€ config.ts # โš™๏ธ Configuration loader
212
+ โ”œโ”€โ”€ theme.ts # ๐ŸŽจ Color tokens & icons
213
+ โ”œโ”€โ”€ app.tsx # ๐Ÿ“ฑ App Shell (Container)
214
+ โ””โ”€โ”€ index.tsx # ๐Ÿ Universal entry point (TUI / CLI / MCP)
215
+ ```
216
+
217
+ ---
218
+
219
+ ## ๐Ÿค– Agentic & CI/CD Support (Headless CLI & MCP)
220
+
221
+ Elevate is built from the ground up for agentic execution by AI coding assistants (Claude Code, Antigravity, Cursor, Copilot CLI) and automated CI/CD runners.
222
+
223
+ ### 1. Headless CLI Subcommands (`--json`)
224
+
225
+ Any command line agent or pipeline can run Elevate without starting the interactive TUI:
226
+
227
+ ```bash
228
+ # Discover modules in monorepo
229
+ node tools/updater/elevate/index.mjs modules --json
230
+
231
+ # Scan dependencies across all modules
232
+ # (exit code 0 = up to date, 1 = updates available, 3 = a module could not be scanned)
233
+ node tools/updater/elevate/index.mjs scan --channel=stable --all-modules --json
234
+
235
+ # Query complete version history for a package
236
+ node tools/updater/elevate/index.mjs versions chalk --json
237
+
238
+ # Apply updates with safety guardrails (simulation via --dry-run)
239
+ node tools/updater/elevate/index.mjs update --module=apps/e2e-cockpit --packages=chalk@5.6.2 --dry-run --json
240
+
241
+ # Apply major updates (explicit permission required)
242
+ node tools/updater/elevate/index.mjs update --module=apps/e2e-cockpit --packages=pinia@4.0.3 --allow-major --json
243
+
244
+ # Keep the changes if verification fails (default: roll back)
245
+ node tools/updater/elevate/index.mjs update --module=apps/web --all --keep-on-failure
246
+ ```
247
+
248
+ `scan --json` lists, per module, the `updates` (with `action`, `origin` and โ€” for Maven โ€” `declaredIn`) and the `skipped` dependencies with their `reason`. `update` exits with `2` when the update failed and was rolled back.
249
+
250
+ ### 2. Model Context Protocol (MCP) Server
251
+
252
+ Elevate provides a native, stdio-based MCP Server:
253
+ ```bash
254
+ node tools/updater/elevate/index.mjs mcp
255
+ ```
256
+
257
+ Register it in your agent's MCP settings (e.g., `claude_desktop_config.json` or Antigravity MCP config):
258
+ ```json
259
+ {
260
+ "mcpServers": {
261
+ "elevate": {
262
+ "command": "npx",
263
+ "args": ["-y", "@dennisrepa/elevate", "mcp"]
264
+ }
265
+ }
266
+ }
267
+ ```
268
+
269
+ #### Available MCP Tools for LLMs:
270
+ | Tool | Purpose |
271
+ | :--- | :--- |
272
+ | `elevate_discover_modules` | Discovers all repository modules and workspaces for npm or Maven |
273
+ | `elevate_scan` | Scans a module (or all modules) for updates and internal dependencies to align; lists skipped dependencies with reasons |
274
+ | `elevate_get_versions` | Fetches complete published version history from registry (refuses public lookups of internal packages) |
275
+ | `elevate_apply_updates` | Applies targeted updates with verification, major guardrails and rollback (`keepOnFailure` optional) |
276
+ | `elevate_verify` | Runs module-specific build and test verification checks |
277
+
278
+ ---
279
+
280
+ ## โŒจ๏ธ Keyboard Shortcuts (Interactive TUI)
281
+
282
+ | Key | Action |
283
+ | :--- | :--- |
284
+ | **`E`** | **Switch Ecosystem (๐Ÿ“ฆ Node/npm โ‡„ โ˜• Java/Maven)** |
285
+ | **`W`** | Open module / workspace selector |
286
+ | **`V`** | **Pick specific version (Interactive search & filter modal)** |
287
+ | **`L`** | Toggle language (English โ‡„ German) |
288
+ | **`โ†‘` / `โ†“`** *(or `k`/`j`)* | Navigate list items |
289
+ | **`Space`** | Toggle selection of focused item |
290
+ | **`A`** | Toggle all visible items in the active tab |
291
+ | **`Tab`** *(or `1`, `2`, `3`)* | Switch between tabs |
292
+ | **`U`** | Start update for all selected items |
293
+ | **`R`** | Re-scan the active module |
294
+ | **`Q`** | Quit Elevate |
295
+
296
+ ---
297
+
298
+ ## โš™๏ธ Configuration (`elevate.config.json`)
299
+
300
+ You can place an optional `elevate.config.json` file in your repository root:
301
+
302
+ ```json
303
+ {
304
+ "author": "Dennis Rรฉpa",
305
+ "channel": "stable",
306
+ "locale": "en",
307
+ "internalScopes": ["@my-org", "com.mycompany"],
308
+ "mavenPlugins": { "help": "3.5.2", "versions": "2.22.0" },
309
+ "postUpdateScript": "npm test",
310
+ "postUpdateLabel": "Run test suite"
311
+ }
312
+ ```
313
+
314
+ * **`author`:** Optional name displayed in the top-right header.
315
+ * **`channel`:** `"stable"` (default, excludes betas/RCs) or `"all"` (includes pre-releases).
316
+ * **`locale`:** `"en"` (English), `"de"` (German), or `"auto"` (system detection).
317
+ * **`internalScopes`:** Internal npm scopes and Maven groupId prefixes. `@my-org` matches `@my-org/*`; `com.mycompany` matches `com.mycompany` and `com.mycompany.*` (not `com.mycompanyx`). Matching packages are looked up only in private registries. *Formerly `excludeScopes`, which is still read and reported as deprecated.*
318
+ * **`mavenPlugins`:** Optional versions of the Maven plugins Elevate runs: `help` (`maven-help-plugin`, default `3.5.2`) and `versions` (`versions-maven-plugin`, default `2.22.0`). Use it when your repository manager does not offer the defaults. Invalid values fall back to the default with a warning.
319
+ * **`postUpdateScript`:** Optional command that replaces the default verification (`npm ls` / `mvn test-compile`). Runs in the repository root (npm) or the module directory (Maven).
320
+
321
+ ---
322
+
323
+ ## ๐Ÿ“ฆ Installation & Setup
324
+
325
+ Elevate offers multiple flexible options for any developer workflow or environment:
326
+
327
+ ### 1. โšก Zero-Install Instant Run via `npx` (Recommended)
328
+ Run Elevate immediately without cloning or installing anything:
329
+ ```bash
330
+ npx @dennisrepa/elevate
331
+ ```
332
+ > **For Autonomous AI Agents (Claude Code, Cursor, Antigravity):**
333
+ > Register Elevate directly in your agent's MCP settings:
334
+ > ```json
335
+ > {
336
+ > "mcpServers": {
337
+ > "elevate": {
338
+ > "command": "npx",
339
+ > "args": ["-y", "@dennisrepa/elevate", "mcp"]
340
+ > }
341
+ > }
342
+ > }
343
+ > ```
344
+
345
+ ---
346
+
347
+ ### 2. ๐ŸชŸ Standalone Executable (Zero Node.js Required)
348
+ For Java/Backend developers, system administrators, or CI environments without Node.js:
349
+ 1. Download `elevate.exe` (Windows) or `elevate-linux` from the **[GitHub Releases](https://github.com/dennisrepa/elevate/releases)**.
350
+ 2. Run directly in your terminal:
351
+ ```powershell
352
+ .\elevate.exe
353
+ ```
354
+ *(Or double-click `elevate.exe` in Windows Explorer).*
355
+
356
+ ---
357
+
358
+ ### 3. ๐ŸŒ Global System Installation
359
+ Install Elevate globally to have the `elevate` command available in every terminal:
360
+ ```bash
361
+ npm install -g @dennisrepa/elevate
362
+ ```
363
+ Then launch anywhere:
364
+ ```bash
365
+ elevate
366
+ ```
367
+
368
+ ---
369
+
370
+ ### 4. ๐Ÿข Monorepo & Project Integration
371
+ Add Elevate as a devDependency to your project or monorepo:
372
+ ```bash
373
+ npm install -D @dennisrepa/elevate
374
+ ```
375
+ Add an `elevate` script to your root `package.json`:
376
+ ```json
377
+ {
378
+ "scripts": {
379
+ "elevate": "elevate"
380
+ }
381
+ }
382
+ ```
383
+ Now every team member can launch the dashboard using:
384
+ ```bash
385
+ npm run elevate
386
+ ```
387
+
388
+ ---
389
+
390
+ ### 5. ๐Ÿ› ๏ธ Local Development & Contributing (Inside this Repo)
391
+ If you are developing or customizing Elevate locally:
392
+ ```bash
393
+ cd tools/updater/elevate
394
+ npm run build
395
+ npm link
396
+ ```
397
+ Run directly from repo root:
398
+ ```powershell
399
+ .\elevate.exe
400
+ # or
401
+ node tools/updater/elevate/dist/cli.js
402
+ ```
403
+
404
+ ---
405
+
406
+ ## โ˜• Support & Funding
407
+
408
+ Elevate is free, open-source software maintained to make dependency updates safe, fast, and transparent across multi-language monorepos. If Elevate saves you or your team valuable development time, you can support its creator and future feature development:
409
+
410
+ [![Support Dennis Rรฉpa on Ko-fi](https://img.shields.io/badge/Ko--fi-Support%20Dennis%20R%C3%A9pa-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/dennisrepa)
411
+
412
+ * โ˜• **[Buy Dennis a coffee on Ko-fi](https://ko-fi.com/dennisrepa)**
413
+ * ๐Ÿ’ป Or run: `npm fund @dennisrepa/elevate`
414
+